ZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX2RhdGFhdmFpbC5oIGIvcHVibGljL2ZwZGZfZGF0YWF2YWlsLmgKaW5kZXggYjMwMzU2MC4uM2FiMDJmZSAxMDA2NDQKLS0tIGEvcHVibGljL2ZwZGZfZGF0YWF2YWlsLmgKKysrIGIvcHVibGljL2ZwZGZfZGF0YWF2YWlsLmgKQEAgLTEyLDEwICsxMiw5IEBACiAjaW5jbHVkZSAiZnBkZnZpZXcuaCIKIAogLyoqIFRoZSByZXN1bHQgb2YgdGhlIHByb2Nlc3Mgd2hpY2ggY2hlY2sgbGluZWFyaXplZCBQREYuICovCi0jZGVmaW5lIEZTREtfSVNfTElORUFSSVpFRCAgICAgICAgICAxCi0jZGVmaW5lIEZTREtfTk9UX0xJTkVBUklaRUQgICAgICAgICAwCi0jZGVmaW5lIEZTREtfVU5LTk9XX0xJTkVBUklaRUQgICAgICAtMQotCisjZGVmaW5lIEZTREtfSVNfTElORUFSSVpFRCAxCisjZGVmaW5lIEZTREtfTk9UX0xJTkVBUklaRUQgMAorI2RlZmluZSBGU0RLX1VOS05PV19MSU5FQVJJWkVEIC0xCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CkBAIC0yNiwyOCArMjUsMjkgQEAKICAqICAgICAgICAgIEludGVyZmFjZSBmb3IgY2hlY2tpbmcgd2hldGhlciB0aGUgc2VjdGlvbiBvZiB0aGUgZmlsZSBpcyBhdmFpbGFibGUuCiAgKi8KIHR5cGVkZWYgc3RydWN0IF9GWF9GSUxFQVZBSUwgewotICAgIC8qKgotICAgICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDEuCi0gICAgICovCi0gICAgaW50IHZlcnNpb247CisgIC8qKgorICAgKiBWZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAxLgorICAgKi8KKyAgaW50IHZlcnNpb247CiAKLSAgICAvKioKLSAgICAgKiBNZXRob2Q6IElzRGF0YUF2YWlsCi0gICAgICogICAgICBSZXBvcnQgd2hldGhlciB0aGUgc3BlY2lmaWVkIGRhdGEgc2VjdGlvbiBpcyBhdmFpbGFibGUuIEEgc2VjdGlvbiBpcyBhdmFpbGFibGUgb25seSBpZiBhbGwgYnl0ZXMgaW4gdGhlIHNlY3Rpb24gaXMgYXZhaWxhYmxlLgotICAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICAqICAgICAgMQotICAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICAqICAgICAgWWVzCi0gICAgICogUGFyYW1ldGVyczoKLSAgICAgKiAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAgKiAgICAgIG9mZnNldCAgICAgIC0gICBUaGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHNlY3Rpb24gaW4gdGhlIGZpbGUuCi0gICAgICogICAgICBzaXplICAgICAgICAtICAgVGhlIHNpemUgb2YgdGhlIGRhdGEgc2VjdGlvbgotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgIHRydWUgbWVhbnMgdGhlIHNwZWNpZmllZCBkYXRhIHNlY3Rpb24gaXMgYXZhaWxhYmxlLgotICAgICAqIENvbW1lbnRzOgotICAgICAqICAgICAgQ2FsbGVkIGJ5IEZveGl0IFNESyB0byBjaGVjayB3aGV0aGVyIHRoZSBkYXRhIHNlY3Rpb24gaXMgcmVhZHkuCi0gICAgICovCi0gICAgRlBERl9CT09MICgqSXNEYXRhQXZhaWwpKHN0cnVjdCBfRlhfRklMRUFWQUlMKiBwVGhpcywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpOworICAvKioKKyAgICogTWV0aG9kOiBJc0RhdGFBdmFpbAorICAgKiAgICAgIFJlcG9ydCB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZGF0YSBzZWN0aW9uIGlzIGF2YWlsYWJsZS4gQSBzZWN0aW9uIGlzCisgICAqIGF2YWlsYWJsZSBvbmx5IGlmIGFsbCBieXRlcyBpbiB0aGUgc2VjdGlvbiBpcyBhdmFpbGFibGUuCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgIDEKKyAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICAqICAgICAgWWVzCisgICAqIFBhcmFtZXRlcnM6CisgICAqICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAgKiAgICAgIG9mZnNldCAgICAgIC0gICBUaGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHNlY3Rpb24gaW4gdGhlIGZpbGUuCisgICAqICAgICAgc2l6ZSAgICAgICAgLSAgIFRoZSBzaXplIG9mIHRoZSBkYXRhIHNlY3Rpb24KKyAgICogUmV0dXJuIFZhbHVlOgorICAgKiAgICAgIHRydWUgbWVhbnMgdGhlIHNwZWNpZmllZCBkYXRhIHNlY3Rpb24gaXMgYXZhaWxhYmxlLgorICAgKiBDb21tZW50czoKKyAgICogICAgICBDYWxsZWQgYnkgRm94aXQgU0RLIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGRhdGEgc2VjdGlvbiBpcyByZWFkeS4KKyAgICovCisgIEZQREZfQk9PTCAoKklzRGF0YUF2YWlsKShzdHJ1Y3QgX0ZYX0ZJTEVBVkFJTCogcFRoaXMsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKIH0gRlhfRklMRUFWQUlMOwogCiB0eXBlZGVmIHZvaWQqIEZQREZfQVZBSUw7CkBAIC01NywyMyArNTcsMjkgQEAKICogICAgICAgICAgIENyZWF0ZSBhIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlci4KICoKICogUGFyYW1ldGVyczoKLSogICAgICAgICAgIGZpbGVfYXZhaWwgIC0gICBQb2ludGVyIHRvIGZpbGUgYXZhaWxhYmlsaXR5IGludGVyZmFjZSB0byBjaGVjayBhdmFpbGFiaWxpdHkgb2YgZmlsZSBkYXRhLgotKiAgICAgICAgICAgZmlsZSAgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBmaWxlIGFjY2VzcyBpbnRlcmZhY2UgZm9yIHJlYWRpbmcgZGF0YSBmcm9tIGZpbGUuCisqICAgICAgICAgICBmaWxlX2F2YWlsICAtICAgUG9pbnRlciB0byBmaWxlIGF2YWlsYWJpbGl0eSBpbnRlcmZhY2UgdG8gY2hlY2sKKyogYXZhaWxhYmlsaXR5IG9mIGZpbGUgZGF0YS4KKyogICAgICAgICAgIGZpbGUgICAgICAgIC0gICBQb2ludGVyIHRvIGEgZmlsZSBhY2Nlc3MgaW50ZXJmYWNlIGZvciByZWFkaW5nIGRhdGEKKyogZnJvbSBmaWxlLgogKiBSZXR1cm4gdmFsdWU6CiAqICAgICAgICAgICBBIGhhbmRsZSB0byB0aGUgZG9jdW1lbnQgYXZhaWxhYmlsaXR5IHByb3ZpZGVyLiBOVUxMIGZvciBlcnJvci4KICogQ29tbWVudHM6Ci0qICAgICAgICAgICBBcHBsaWNhdGlvbiBtdXN0IGNhbGwgRlBERkF2YWlsX0Rlc3Ryb3kgd2hlbiBkb25lIHdpdGggdGhlIGF2YWlsYWJpbGl0eSBwcm92aWRlci4KKyogICAgICAgICAgIEFwcGxpY2F0aW9uIG11c3QgY2FsbCBGUERGQXZhaWxfRGVzdHJveSB3aGVuIGRvbmUgd2l0aCB0aGUKKyogYXZhaWxhYmlsaXR5IHByb3ZpZGVyLgogKiBOb3RlczoKLSogICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIGxvYWQgYSBkb2N1bWVudCB3aGljaCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMgbm93LgorKiAgICAgICAgICAgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdG8gbG9hZCBhIGRvY3VtZW50IHdoaWNoIGNvbnNpc3RzIG9mCisqIGR5bmFtaWMgWEZBIGZpZWxkcyBub3cuCiAqLwotRExMRVhQT1JUIEZQREZfQVZBSUwgU1REQ0FMTCBGUERGQXZhaWxfQ3JlYXRlKEZYX0ZJTEVBVkFJTCogZmlsZV9hdmFpbCwgRlBERl9GSUxFQUNDRVNTKiBmaWxlKTsKK0RMTEVYUE9SVCBGUERGX0FWQUlMIFNURENBTEwgRlBERkF2YWlsX0NyZWF0ZShGWF9GSUxFQVZBSUwqIGZpbGVfYXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GSUxFQUNDRVNTKiBmaWxlKTsKIAogLyoqCiAqIEZ1bmN0aW9uOiBGUERGQXZhaWxfRGVzdHJveQogKiAgICAgICAgICAgRGVzdHJveSBhIGRvY3VtZW50IGF2YWlsaWJpdHkgcHJvdmlkZXIuCiAqCiAqIFBhcmFtZXRlcnM6Ci0qICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieSBGUERGQXZhaWxfQ3JlYXRlCisqICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieQorKiBGUERGQXZhaWxfQ3JlYXRlCiAqIFJldHVybiBWYWx1ZToKICogICAgICAgICAgIE5vbmUuCiAqLwpAQCAtODEsNjMgKzg3LDc5IEBACiAKIC8qKgogICogSW50ZXJmYWNlOiBGWF9ET1dOTE9BREhJTlRTCi0gKiAgICAgICAgICBEb3dubG9hZCBoaW50cyBpbnRlcmZhY2UuIFVzZWQgdG8gcmVjZWl2ZSBoaW50cyBmb3IgZnVydGhlciBkb3dubG9hZGluZy4KKyAqICAgICAgICAgIERvd25sb2FkIGhpbnRzIGludGVyZmFjZS4gVXNlZCB0byByZWNlaXZlIGhpbnRzIGZvciBmdXJ0aGVyCisgKiBkb3dubG9hZGluZy4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgX0ZYX0RPV05MT0FESElOVFMgewotICAgIC8qKgotICAgICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDEuCi0gICAgICovCi0gICAgaW50IHZlcnNpb247CisgIC8qKgorICAgKiBWZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAxLgorICAgKi8KKyAgaW50IHZlcnNpb247CiAKLSAgICAvKioKLSAgICAgKiBNZXRob2Q6IEFkZFNlZ21lbnQKLSAgICAgKiAgICAgIEFkZCBhIHNlY3Rpb24gdG8gYmUgZG93bmxvYWRlZC4KLSAgICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAgKiAgICAgIDEKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAgKiAgICAgIFllcwotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgICogICAgICBvZmZzZXQgICAgICAtICAgVGhlIG9mZnNldCBvZiB0aGUgaGludCByZXBvcnRlZCB0byBiZSBkb3dubG9hZGVkLgotICAgICAqICAgICAgc2l6ZSAgICAgICAgLSAgIFRoZSBzaXplIG9mIHRoZSBoaW50IHJlcG9ydGVkIHRvIGJlIGRvd25sb2FkZWQuCi0gICAgICogUmV0dXJuIFZhbHVlOgotICAgICAqICAgICAgTm9uZS4KLSAgICAgKiBDb21tZW50czoKLSAgICAgKiAgICAgIENhbGxlZCBieSBGb3hpdCBTREsgdG8gcmVwb3J0IHNvbWUgZG93bmxvYWRpbmcgaGludHMgZm9yIGRvd25sb2FkIG1hbmFnZXIuCi0gICAgICogICAgICBUaGUgcG9zaXRpb24gYW5kIHNpemUgb2Ygc2VjdGlvbiBtYXkgYmUgbm90IGFjY3VyYXRlLCBwYXJ0IG9mIHRoZSBzZWN0aW9uIG1pZ2h0IGJlIGFscmVhZHkgYXZhaWxhYmxlLgotICAgICAqICAgICAgVGhlIGRvd25sb2FkIG1hbmFnZXIgbXVzdCBkZWFsIHdpdGggdGhhdCB0byBtYXhpbWl6ZSBkb3dubG9hZCBlZmZpY2llbmN5LgotICAgICAqLwotICAgIHZvaWQgKCpBZGRTZWdtZW50KShzdHJ1Y3QgX0ZYX0RPV05MT0FESElOVFMqIHBUaGlzLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgIC8qKgorICAgKiBNZXRob2Q6IEFkZFNlZ21lbnQKKyAgICogICAgICBBZGQgYSBzZWN0aW9uIHRvIGJlIGRvd25sb2FkZWQuCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgIDEKKyAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICAqICAgICAgWWVzCisgICAqIFBhcmFtZXRlcnM6CisgICAqICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAgKiAgICAgIG9mZnNldCAgICAgIC0gICBUaGUgb2Zmc2V0IG9mIHRoZSBoaW50IHJlcG9ydGVkIHRvIGJlIGRvd25sb2FkZWQuCisgICAqICAgICAgc2l6ZSAgICAgICAgLSAgIFRoZSBzaXplIG9mIHRoZSBoaW50IHJlcG9ydGVkIHRvIGJlIGRvd25sb2FkZWQuCisgICAqIFJldHVybiBWYWx1ZToKKyAgICogICAgICBOb25lLgorICAgKiBDb21tZW50czoKKyAgICogICAgICBDYWxsZWQgYnkgRm94aXQgU0RLIHRvIHJlcG9ydCBzb21lIGRvd25sb2FkaW5nIGhpbnRzIGZvciBkb3dubG9hZAorICAgKiBtYW5hZ2VyLgorICAgKiAgICAgIFRoZSBwb3NpdGlvbiBhbmQgc2l6ZSBvZiBzZWN0aW9uIG1heSBiZSBub3QgYWNjdXJhdGUsIHBhcnQgb2YgdGhlCisgICAqIHNlY3Rpb24gbWlnaHQgYmUgYWxyZWFkeSBhdmFpbGFibGUuCisgICAqICAgICAgVGhlIGRvd25sb2FkIG1hbmFnZXIgbXVzdCBkZWFsIHdpdGggdGhhdCB0byBtYXhpbWl6ZSBkb3dubG9hZAorICAgKiBlZmZpY2llbmN5LgorICAgKi8KKyAgdm9pZCAoKkFkZFNlZ21lbnQpKHN0cnVjdCBfRlhfRE9XTkxPQURISU5UUyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpOwogfSBGWF9ET1dOTE9BREhJTlRTOwogCiAvKioKICogRnVuY3Rpb246IEZQREZBdmFpbF9Jc0RvY0F2YWlsCi0qICAgICAgICAgICBDaGVjayB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyByZWFkeSBmb3IgbG9hZGluZywgaWYgbm90LCBnZXQgZG93bmxvYWQgaGludHMuCisqICAgICAgICAgICBDaGVjayB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyByZWFkeSBmb3IgbG9hZGluZywgaWYgbm90LCBnZXQKKyogZG93bmxvYWQgaGludHMuCiAqCiAqIFBhcmFtZXRlcnM6Ci0qICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieSBGUERGQXZhaWxfQ3JlYXRlCi0qICAgICAgICAgICBoaW50cyAgICAgICAtICAgUG9pbnRlciB0byBhIGRvd25sb2FkIGhpbnRzIGludGVyZmFjZSwgcmVjZWl2aW5nIGdlbmVyYXRlZCBoaW50cworKiAgICAgICAgICAgYXZhaWwgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudCBhdmFpbGFiaWxpdHkgcHJvdmlkZXIgcmV0dXJuZWQgYnkKKyogRlBERkF2YWlsX0NyZWF0ZQorKiAgICAgICAgICAgaGludHMgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3dubG9hZCBoaW50cyBpbnRlcmZhY2UsIHJlY2VpdmluZworKiBnZW5lcmF0ZWQgaGludHMKICogUmV0dXJuIHZhbHVlOgogKiAgICAgICAgICAgTm9uLXplcm8gZm9yIHBhZ2UgaXMgZnVsbHkgYXZhaWxhYmxlLCAwIGZvciBwYWdlIG5vdCB5ZXQgYXZhaWxhYmxlLgogKiBDb21tZW50czoKLSogICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW5ldmVyIG5ldyBkYXRhIGFycml2ZWQsIGFuZCBwcm9jZXNzIGFsbCB0aGUKLSogICAgICAgICAgIGdlbmVyYXRlZCBkb3dubG9hZCBoaW50cyBpZiBhbnksIHVudGlsIHRoZSBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIHZhbHVlLiBUaGVuIHRoZQotKiAgICAgICAgICAgYXBwbGljYXRpb24gY2FuIGNhbGwgRlBERkF2YWlsX0dldERvY3VtZW50KCkgdG8gZ2V0IGEgZG9jdW1lbnQgaGFuZGxlLgorKiAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbmV2ZXIgbmV3IGRhdGEgYXJyaXZlZCwKKyogYW5kIHByb2Nlc3MgYWxsIHRoZQorKiAgICAgICAgICAgZ2VuZXJhdGVkIGRvd25sb2FkIGhpbnRzIGlmIGFueSwgdW50aWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8KKyogdmFsdWUuIFRoZW4gdGhlCisqICAgICAgICAgICBhcHBsaWNhdGlvbiBjYW4gY2FsbCBGUERGQXZhaWxfR2V0RG9jdW1lbnQoKSB0byBnZXQgYSBkb2N1bWVudAorKiBoYW5kbGUuCiAqLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc0RvY0F2YWlsKEZQREZfQVZBSUwgYXZhaWwsIEZYX0RPV05MT0FESElOVFMqIGhpbnRzKTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQXZhaWxfSXNEb2NBdmFpbChGUERGX0FWQUlMIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RPV05MT0FESElOVFMqIGhpbnRzKTsKIAogLyoqCiAqIEZ1bmN0aW9uOiBGUERGQXZhaWxfR2V0RG9jdW1lbnQKICogICAgICAgICAgIEdldCBkb2N1bWVudCBmcm9tIHRoZSBhdmFpbGFiaWxpdHkgcHJvdmlkZXIuCiAqCiAqIFBhcmFtZXRlcnM6Ci0qICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieSBGUERGQXZhaWxfQ3JlYXRlCisqICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieQorKiBGUERGQXZhaWxfQ3JlYXRlCiAqICAgICBwYXNzd29yZCAgLSAgIE9wdGlvbmFsIHBhc3N3b3JkIGZvciBkZWNyeXB0aW5nIHRoZSBQREYgZmlsZS4KICogUmV0dXJuIHZhbHVlOgogKiAgICAgICAgICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4KICogQ29tbWVudHM6Ci0qICAgICAgICAgICBBZnRlciBGUERGQXZhaWxfSXNEb2NBdmFpbCgpIHJldHVybnMgVFJVRSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gdG8KLSogICAgICAgICAgIGdldCB0aGUgZG9jdW1lbnQgaGFuZGxlLiBUbyBjbG9zZSB0aGUgZG9jdW1lbnQsIHVzZSBGUERGX0Nsb3NlRG9jdW1lbnQgZnVuY3Rpb24uCisqICAgICAgICAgICBBZnRlciBGUERGQXZhaWxfSXNEb2NBdmFpbCgpIHJldHVybnMgVFJVRSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZAorKiBjYWxsIHRoaXMgZnVuY3Rpb24gdG8KKyogICAgICAgICAgIGdldCB0aGUgZG9jdW1lbnQgaGFuZGxlLiBUbyBjbG9zZSB0aGUgZG9jdW1lbnQsIHVzZQorKiBGUERGX0Nsb3NlRG9jdW1lbnQgZnVuY3Rpb24uCiAqLwogRExMRVhQT1JUIEZQREZfRE9DVU1FTlQgU1REQ0FMTCBGUERGQXZhaWxfR2V0RG9jdW1lbnQoRlBERl9BVkFJTCBhdmFpbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBwYXNzd29yZCk7CkBAIC0xNTEsNyArMTczLDggQEAKICogUmV0dXJuIFZhbHVlOgogKiAgICAgICAgICAgWmVyby1iYXNlZCBpbmRleCBmb3IgdGhlIGZpcnN0IGF2YWlsYWJsZSBwYWdlLgogKiBDb21tZW50czoKLSogICAgICAgICAgIEZvciBtb3N0IGxpbmVhcml6ZWQgUERGcywgdGhlIGZpcnN0IGF2YWlsYWJsZSBwYWdlIHdvdWxkIGJlIGp1c3QgdGhlIGZpcnN0IHBhZ2UsIGhvd2V2ZXIsCisqICAgICAgICAgICBGb3IgbW9zdCBsaW5lYXJpemVkIFBERnMsIHRoZSBmaXJzdCBhdmFpbGFibGUgcGFnZSB3b3VsZCBiZSBqdXN0IHRoZQorKiBmaXJzdCBwYWdlLCBob3dldmVyLAogKiAgICAgICAgICAgc29tZSBQREZzIG1pZ2h0IG1ha2Ugb3RoZXIgcGFnZSB0byBiZSB0aGUgZmlyc3QgYXZhaWxhYmxlIHBhZ2UuCiAqICAgICAgICAgICBGb3Igbm9uLWxpbmVhcml6ZWQgUERGLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIHJldHVybiB6ZXJvLgogKi8KQEAgLTE1OSw1NyArMTgyLDc4IEBACiAKIC8qKgogKiBGdW5jdGlvbjogRlBERkF2YWlsX0lzUGFnZUF2YWlsCi0qICAgICAgICAgICBDaGVjayB3aGV0aGVyIGEgcGFnZSBpcyByZWFkeSBmb3IgbG9hZGluZywgaWYgbm90LCBnZXQgZG93bmxvYWQgaGludHMuCisqICAgICAgICAgICBDaGVjayB3aGV0aGVyIGEgcGFnZSBpcyByZWFkeSBmb3IgbG9hZGluZywgaWYgbm90LCBnZXQgZG93bmxvYWQKKyogaGludHMuCiAqCiAqIFBhcmFtZXRlcnM6Ci0qICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieSBGUERGQXZhaWxfQ3JlYXRlCisqICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieQorKiBGUERGQXZhaWxfQ3JlYXRlCiAqICAgICAgICAgICBwYWdlX2luZGV4ICAtICAgSW5kZXggbnVtYmVyIG9mIHRoZSBwYWdlLiAwIGZvciB0aGUgZmlyc3QgcGFnZS4KLSogICAgICAgICAgIGhpbnRzICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG93bmxvYWQgaGludHMgaW50ZXJmYWNlLCByZWNlaXZpbmcgZ2VuZXJhdGVkIGhpbnRzCisqICAgICAgICAgICBoaW50cyAgICAgICAtICAgUG9pbnRlciB0byBhIGRvd25sb2FkIGhpbnRzIGludGVyZmFjZSwgcmVjZWl2aW5nCisqIGdlbmVyYXRlZCBoaW50cwogKiBSZXR1cm4gdmFsdWU6CiAqICAgICAgICAgICBOb24temVybyBmb3IgcGFnZSBpcyBmdWxseSBhdmFpbGFibGUsIDAgZm9yIHBhZ2Ugbm90IHlldCBhdmFpbGFibGUuCiAqIENvbW1lbnRzOgotKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYWxsIGJlIGNhbGxlZCBvbmx5IGFmdGVyIEZQREZBdmFpbF9HZXREb2N1bWVudCBpZiBjYWxsZWQuCi0qICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuZXZlciBuZXcgZGF0YSBhcnJpdmVkLCBhbmQgcHJvY2VzcyBhbGwgdGhlCi0qICAgICAgICAgICBnZW5lcmF0ZWQgZG93bmxvYWQgaGludHMgaWYgYW55LCB1bnRpbCB0aGUgZnVuY3Rpb24gcmV0dXJucyBub24temVybyB2YWx1ZS4gVGhlbiB0aGUKKyogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FsbCBiZSBjYWxsZWQgb25seSBhZnRlciBGUERGQXZhaWxfR2V0RG9jdW1lbnQgaWYKKyogY2FsbGVkLgorKiAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbmV2ZXIgbmV3IGRhdGEgYXJyaXZlZCwKKyogYW5kIHByb2Nlc3MgYWxsIHRoZQorKiAgICAgICAgICAgZ2VuZXJhdGVkIGRvd25sb2FkIGhpbnRzIGlmIGFueSwgdW50aWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8KKyogdmFsdWUuIFRoZW4gdGhlCiAqICAgICAgICAgICBhcHBsaWNhdGlvbiBjYW4gcGVyZm9ybSBwYWdlIGxvYWRpbmcuCiAqLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc1BhZ2VBdmFpbChGUERGX0FWQUlMIGF2YWlsLCBpbnQgcGFnZV9pbmRleCwgRlhfRE9XTkxPQURISU5UUyogaGludHMpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc1BhZ2VBdmFpbChGUERGX0FWQUlMIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRE9XTkxPQURISU5UUyogaGludHMpOwogCiAvKioKICogRnVuY3Rpb246IEZQREZBdmFpbF9JU0Zvcm1BdmFpbAotKiAgICAgICAgICAgQ2hlY2sgd2hldGhlciBGb3JtIGRhdGEgaXMgcmVhZHkgZm9yIGluaXQsIGlmIG5vdCwgZ2V0IGRvd25sb2FkIGhpbnRzLgorKiAgICAgICAgICAgQ2hlY2sgd2hldGhlciBGb3JtIGRhdGEgaXMgcmVhZHkgZm9yIGluaXQsIGlmIG5vdCwgZ2V0IGRvd25sb2FkCisqIGhpbnRzLgogKgogKiBQYXJhbWV0ZXJzOgotKiAgICAgICAgICAgYXZhaWwgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudCBhdmFpbGFiaWxpdHkgcHJvdmlkZXIgcmV0dXJuZWQgYnkgRlBERkF2YWlsX0NyZWF0ZQotKiAgICAgICAgICAgaGludHMgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3dubG9hZCBoaW50cyBpbnRlcmZhY2UsIHJlY2VpdmluZyBnZW5lcmF0ZWQgaGludHMKKyogICAgICAgICAgIGF2YWlsICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQgYXZhaWxhYmlsaXR5IHByb3ZpZGVyIHJldHVybmVkIGJ5CisqIEZQREZBdmFpbF9DcmVhdGUKKyogICAgICAgICAgIGhpbnRzICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG93bmxvYWQgaGludHMgaW50ZXJmYWNlLCByZWNlaXZpbmcKKyogZ2VuZXJhdGVkIGhpbnRzCiAqIFJldHVybiB2YWx1ZToKLSogICAgICAgICAgIE5vbi16ZXJvIGZvciBGb3JtIGRhdGEgaXMgZnVsbHkgYXZhaWxhYmxlLCAwIGZvciBGb3JtIGRhdGEgbm90IHlldCBhdmFpbGFibGUuCi0qICAgICAgICAgICBEZXRhaWxzOiAtMSAtIGVycm9yLCB0aGUgaW5wdXQgcGFyYW1ldGVyIG5vdCBjb3JyZWN0LCBzdWNoIGFzIGhpbnRzIGlzIG51bGwuCisqICAgICAgICAgICBOb24temVybyBmb3IgRm9ybSBkYXRhIGlzIGZ1bGx5IGF2YWlsYWJsZSwgMCBmb3IgRm9ybSBkYXRhIG5vdCB5ZXQKKyogYXZhaWxhYmxlLgorKiAgICAgICAgICAgRGV0YWlsczogLTEgLSBlcnJvciwgdGhlIGlucHV0IHBhcmFtZXRlciBub3QgY29ycmVjdCwgc3VjaCBhcyBoaW50cworKiBpcyBudWxsLgogKiAgICAgICAgICAgICAgICAgICAgMCAgLSBkYXRhIG5vdCBhdmFpbGFibGUKICogICAgICAgICAgICAgICAgICAgIDEgIC0gZGF0YSBhdmFpbGFibGUKICogICAgICAgICAgICAgICAgICAgIDIgIC0gbm8gZm9ybSBkYXRhLgogKiBDb21tZW50czoKLSogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FsbCBiZSBjYWxsZWQgb25seSBhZnRlciBGUERGQXZhaWxfR2V0RG9jdW1lbnQgaWYgY2FsbGVkLgotKiAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbmV2ZXIgbmV3IGRhdGEgYXJyaXZlZCwgYW5kIHByb2Nlc3MgYWxsIHRoZQotKiAgICAgICAgICAgZ2VuZXJhdGVkIGRvd25sb2FkIGhpbnRzIGlmIGFueSwgdW50aWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gdmFsdWUuIFRoZW4gdGhlCi0qICAgICAgICAgICBhcHBsaWNhdGlvbiBjYW4gcGVyZm9ybSBwYWdlIGxvYWRpbmcuIFJlY29tbWVuZCB0byBjYWxsIEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQKKyogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FsbCBiZSBjYWxsZWQgb25seSBhZnRlciBGUERGQXZhaWxfR2V0RG9jdW1lbnQgaWYKKyogY2FsbGVkLgorKiAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbmV2ZXIgbmV3IGRhdGEgYXJyaXZlZCwKKyogYW5kIHByb2Nlc3MgYWxsIHRoZQorKiAgICAgICAgICAgZ2VuZXJhdGVkIGRvd25sb2FkIGhpbnRzIGlmIGFueSwgdW50aWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8KKyogdmFsdWUuIFRoZW4gdGhlCisqICAgICAgICAgICBhcHBsaWNhdGlvbiBjYW4gcGVyZm9ybSBwYWdlIGxvYWRpbmcuIFJlY29tbWVuZCB0byBjYWxsCisqIEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQKICogICAgICAgICAgIGFmdGVyIHRoZSBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIHZhbHVlLgogKi8KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQXZhaWxfSXNGb3JtQXZhaWwoRlBERl9BVkFJTCBhdmFpbCwgRlhfRE9XTkxPQURISU5UUyogaGludHMpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc0Zvcm1BdmFpbChGUERGX0FWQUlMIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ET1dOTE9BREhJTlRTKiBoaW50cyk7CiAKIC8qKgogKiBGdW5jdGlvbjogRlBERkF2YWlsX0lzTGluZWFyaXplZAogKiAgICAgICAgICAgVG8gY2hlY2sgd2hldGhlciBhIGRvY3VtZW50IGlzIExpbmVhcml6ZWQgUERGIGZpbGUuCiAqCiAqIFBhcmFtZXRlcnM6Ci0qICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieSBGUERGQXZhaWxfQ3JlYXRlCisqICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieQorKiBGUERGQXZhaWxfQ3JlYXRlCiAqIFJldHVybiB2YWx1ZToKICogICAgICAgICAgIHJldHVybiBUUlVFIG1lYW5zIHRoZSBkb2N1bWVudCBpcyBsaW5lYXJpemVkIFBERiBlbHNlIG5vdC4KICogICAgICAgICAgIEZTREtfSVNfTElORUFSSVpFRCBpcyBhIGxpbmVhcml6ZSBmaWxlLgogKiAgICAgICAgICAgRlNES19OT1RfTElORUFSSVpFRCBpcyBub3QgYSBsaW5lYXJpemUgZmlsZS4KLSogICAgICAgICAgIEZTREtfVU5LTk9XX0xJTkVBUklaRUQgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZSBmaWxlIGlzIGEgbGluZWFyaXplIGZpbGUuCisqICAgICAgICAgICBGU0RLX1VOS05PV19MSU5FQVJJWkVEIGRvbid0IGtub3cgd2hldGhlciB0aGUgZmlsZSBpcyBhIGxpbmVhcml6ZQorKiBmaWxlLgogKiBDb21tZW50czoKLSogICAgICAgICAgIEl0IHJldHVybiBUUlVFL0ZBTFNFIGFzIHNvb24gYXMgd2UgaGF2ZSBmaXJzdCAxSyBkYXRhLiAgSWYgdGhlIGZpbGUncyBzaXplIGxlc3MgdGhhbgorKiAgICAgICAgICAgSXQgcmV0dXJuIFRSVUUvRkFMU0UgYXMgc29vbiBhcyB3ZSBoYXZlIGZpcnN0IDFLIGRhdGEuICBJZiB0aGUKKyogZmlsZSdzIHNpemUgbGVzcyB0aGFuCiAqICAgICAgICAgICAxSyx3ZSBkb24ndCBrbm93biB3aGV0aGVyIHRoZSBQREYgaXMgYSBsaW5lYXJpemVkIGZpbGUuCiAqCiAqLwpkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZfZG9jLmggYi9wdWJsaWMvZnBkZl9kb2MuaAppbmRleCAwZmUxYWFlLi45ZTNmMGFmIDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl9kb2MuaAorKysgYi9wdWJsaWMvZnBkZl9kb2MuaApAQCAtMTUsMjQgKzE1LDMyIEBACiAjZW5kaWYKIAogLy8gRnVuY3Rpb246IEZQREZCb29rbWFya19HZXRGaXJzdENoaWxkCi0vLyAgICAgICAgICBHZXQgdGhlIGZpcnN0IGNoaWxkIG9mIGEgYm9va21hcmsgaXRlbSwgb3IgdGhlIGZpcnN0IHRvcCBsZXZlbCBib29rbWFyayBpdGVtLgorLy8gICAgICAgICAgR2V0IHRoZSBmaXJzdCBjaGlsZCBvZiBhIGJvb2ttYXJrIGl0ZW0sIG9yIHRoZSBmaXJzdCB0b3AgbGV2ZWwKKy8vICAgICAgICAgIGJvb2ttYXJrIGl0ZW0uCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IG9yIEZQREZfTG9hZE1lbURvY3VtZW50LgotLy8gICAgICAgICAgYm9va21hcmsgICAgLSAgIEhhbmRsZSB0byB0aGUgY3VycmVudCBib29rbWFyay4gQ2FuIGJlIE5VTEwgaWYgeW91IHdhbnQgdG8gZ2V0IHRoZSBmaXJzdCB0b3AgbGV2ZWwgaXRlbS4KKy8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LiBSZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERl9Mb2FkRG9jdW1lbnQgb3IgRlBERl9Mb2FkTWVtRG9jdW1lbnQuCisvLyAgICAgICAgICBib29rbWFyayAgICAtICAgSGFuZGxlIHRvIHRoZSBjdXJyZW50IGJvb2ttYXJrLiBDYW4gYmUgTlVMTCBpZiB5b3UKKy8vICAgICAgICAgIHdhbnQgdG8gZ2V0IHRoZSBmaXJzdCB0b3AgbGV2ZWwgaXRlbS4KIC8vIFJldHVybiB2YWx1ZToKLS8vICAgICAgICAgIEhhbmRsZSB0byB0aGUgZmlyc3QgY2hpbGQgb3IgdG9wIGxldmVsIGJvb2ttYXJrIGl0ZW0uIE5VTEwgaWYgbm8gY2hpbGQgb3IgdG9wIGxldmVsIGJvb2ttYXJrIGZvdW5kLgorLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBmaXJzdCBjaGlsZCBvciB0b3AgbGV2ZWwgYm9va21hcmsgaXRlbS4gTlVMTCBpZiBubworLy8gICAgICAgICAgY2hpbGQgb3IgdG9wIGxldmVsIGJvb2ttYXJrIGZvdW5kLgogLy8KLURMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwgRlBERkJvb2ttYXJrX0dldEZpcnN0Q2hpbGQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9CT09LTUFSSyBib29rbWFyayk7CitETExFWFBPUlQgRlBERl9CT09LTUFSSyBTVERDQUxMCitGUERGQm9va21hcmtfR2V0Rmlyc3RDaGlsZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0JPT0tNQVJLIGJvb2ttYXJrKTsKIAogLy8gRnVuY3Rpb246IEZQREZCb29rbWFya19HZXROZXh0U2libGluZwogLy8gICAgICAgICAgR2V0IG5leHQgYm9va21hcmsgaXRlbSBhdCB0aGUgc2FtZSBsZXZlbC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgb3IgRlBERl9Mb2FkTWVtRG9jdW1lbnQuCisvLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4gUmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZfTG9hZERvY3VtZW50IG9yIEZQREZfTG9hZE1lbURvY3VtZW50LgogLy8gICAgICAgICAgYm9va21hcmsgICAgLSAgIEhhbmRsZSB0byB0aGUgY3VycmVudCBib29rbWFyay4gQ2Fubm90IGJlIE5VTEwuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIG5leHQgYm9va21hcmsgaXRlbSBhdCB0aGUgc2FtZSBsZXZlbC4gTlVMTCBpZiB0aGlzIGlzIHRoZSBsYXN0IGJvb2ttYXJrIGF0IHRoaXMgbGV2ZWwuCisvLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIG5leHQgYm9va21hcmsgaXRlbSBhdCB0aGUgc2FtZSBsZXZlbC4gTlVMTCBpZiB0aGlzIGlzCisvLyAgICAgICAgICB0aGUgbGFzdCBib29rbWFyayBhdCB0aGlzIGxldmVsLgogLy8KLURMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwgRlBERkJvb2ttYXJrX0dldE5leHRTaWJsaW5nKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQk9PS01BUksgYm9va21hcmspOworRExMRVhQT1JUIEZQREZfQk9PS01BUksgU1REQ0FMTAorRlBERkJvb2ttYXJrX0dldE5leHRTaWJsaW5nKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQk9PS01BUksgYm9va21hcmspOwogCiAvLyBGdW5jdGlvbjogRlBERkJvb2ttYXJrX0dldFRpdGxlCiAvLyAgICAgICAgICBHZXQgdGl0bGUgb2YgYSBib29rbWFyay4KQEAgLTQzLDI3ICs1MSwzOCBAQAogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTnVtYmVyIG9mIGJ5dGVzIHRoZSB0aXRsZSBjb25zdW1lcywgaW5jbHVkaW5nIHRyYWlsaW5nIHplcm9zLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBSZWdhcmRsZXNzIG9mIHRoZSBwbGF0Zm9ybSwgdGhlIHRpdGxlIGlzIGFsd2F5cyBpbiBVVEYtMTZMRSBlbmNvZGluZy4gVGhhdCBtZWFucyB0aGUgYnVmZmVyCi0vLyAgICAgICAgICBjYW4gYmUgdHJlYXRlZCBhcyBhbiBhcnJheSBvZiBXT1JEIChvbiBJbnRlbCBhbmQgY29tcGF0aWJsZSBDUFVzKSwgZWFjaCBXT1JEIHJlcHJlc2VudGluZyB0aGUgVW5pY29kZSBvZgotLy8gICAgICAgICAgYSBjaGFyYWN0ZXIoc29tZSBzcGVjaWFsIFVuaWNvZGUgbWF5IHRha2UgMiBXT1JEcykuVGhlIHN0cmluZyBpcyBmb2xsb3dlZCBieSB0d28gYnl0ZXMgb2YgemVybworLy8gICAgICAgICAgUmVnYXJkbGVzcyBvZiB0aGUgcGxhdGZvcm0sIHRoZSB0aXRsZSBpcyBhbHdheXMgaW4gVVRGLTE2TEUKKy8vICAgICAgICAgIGVuY29kaW5nLiBUaGF0IG1lYW5zIHRoZSBidWZmZXIKKy8vICAgICAgICAgIGNhbiBiZSB0cmVhdGVkIGFzIGFuIGFycmF5IG9mIFdPUkQgKG9uIEludGVsIGFuZCBjb21wYXRpYmxlIENQVXMpLAorLy8gICAgICAgICAgZWFjaCBXT1JEIHJlcHJlc2VudGluZyB0aGUgVW5pY29kZSBvZgorLy8gICAgICAgICAgYSBjaGFyYWN0ZXIoc29tZSBzcGVjaWFsIFVuaWNvZGUgbWF5IHRha2UgMiBXT1JEcykuVGhlIHN0cmluZyBpcworLy8gICAgICAgICAgZm9sbG93ZWQgYnkgdHdvIGJ5dGVzIG9mIHplcm8KIC8vICAgICAgICAgIGluZGljYXRpbmcgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgogLy8KLS8vICAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgYWx3YXlzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgYnVmZmVyLCBldmVuIGlmIG5vIGJ1ZmZlciBpcyBzcGVjaWZpZWQKLS8vICAgICAgICAgIG9yIHRoZSBidWZmZXIgc2l6ZSBpcyBsZXNzIHRoZW4gcmVxdWlyZWQuIEluIHRoZXNlIGNhc2VzLCB0aGUgYnVmZmVyIHdpbGwgbm90IGJlIG1vZGlmaWVkLgorLy8gICAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBhbHdheXMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yCisvLyAgICAgICAgICB0aGUgYnVmZmVyLCBldmVuIGlmIG5vIGJ1ZmZlciBpcyBzcGVjaWZpZWQKKy8vICAgICAgICAgIG9yIHRoZSBidWZmZXIgc2l6ZSBpcyBsZXNzIHRoZW4gcmVxdWlyZWQuIEluIHRoZXNlIGNhc2VzLCB0aGUgYnVmZmVyCisvLyAgICAgICAgICB3aWxsIG5vdCBiZSBtb2RpZmllZC4KIC8vCi1ETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZCb29rbWFya19HZXRUaXRsZShGUERGX0JPT0tNQVJLIGJvb2ttYXJrLCB2b2lkKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmbGVuKTsKK0RMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkJvb2ttYXJrX0dldFRpdGxlKEZQREZfQk9PS01BUksgYm9va21hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1Zmxlbik7CiAKIC8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfRmluZAogLy8gICAgICAgICAgRmluZCBhIGJvb2ttYXJrIGluIHRoZSBkb2N1bWVudCwgdXNpbmcgdGhlIGJvb2ttYXJrIHRpdGxlLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBvciBGUERGX0xvYWRNZW1Eb2N1bWVudC4KLS8vICAgICAgICAgIHRpdGxlICAgICAgIC0gICBUaGUgVVRGLTE2TEUgZW5jb2RlZCBVbmljb2RlIHN0cmluZyBmb3IgdGhlIGJvb2ttYXJrIHRpdGxlIHRvIGJlIHNlYXJjaGVkLiBDYW4ndCBiZSBOVUxMLgorLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuIFJldHVybmVkIGJ5CisvLyAgICAgICAgICBGUERGX0xvYWREb2N1bWVudCBvciBGUERGX0xvYWRNZW1Eb2N1bWVudC4KKy8vICAgICAgICAgIHRpdGxlICAgICAgIC0gICBUaGUgVVRGLTE2TEUgZW5jb2RlZCBVbmljb2RlIHN0cmluZyBmb3IgdGhlIGJvb2ttYXJrCisvLyAgICAgICAgICB0aXRsZSB0byBiZSBzZWFyY2hlZC4gQ2FuJ3QgYmUgTlVMTC4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIEhhbmRsZSB0byB0aGUgZm91bmQgYm9va21hcmsgaXRlbS4gTlVMTCBpZiB0aGUgdGl0bGUgY2FuJ3QgYmUgZm91bmQuCiAvLyBDb21tZW50czoKLS8vICAgICAgICAgIEl0IGFsd2F5cyByZXR1cm5zIHRoZSBmaXJzdCBmb3VuZCBib29rbWFyayBpZiBtb3JlIHRoYW4gb25lIGJvb2ttYXJrcyBoYXZlIHRoZSBzYW1lIHRpdGxlLgorLy8gICAgICAgICAgSXQgYWx3YXlzIHJldHVybnMgdGhlIGZpcnN0IGZvdW5kIGJvb2ttYXJrIGlmIG1vcmUgdGhhbiBvbmUKKy8vICAgICAgICAgIGJvb2ttYXJrcyBoYXZlIHRoZSBzYW1lIHRpdGxlLgogLy8KLURMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwgRlBERkJvb2ttYXJrX0ZpbmQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9XSURFU1RSSU5HIHRpdGxlKTsKK0RMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwgRlBERkJvb2ttYXJrX0ZpbmQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHRpdGxlKTsKIAogLy8gRnVuY3Rpb246IEZQREZCb29rbWFya19HZXREZXN0CiAvLyAgICAgICAgICBHZXQgdGhlIGRlc3RpbmF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIGJvb2ttYXJrIGl0ZW0uCkBAIC03MSwyNiArOTAsMzAgQEAKIC8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LgogLy8gICAgICAgICAgYm9va21hcmsgICAgLSAgIEhhbmRsZSB0byB0aGUgYm9va21hcmsuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGRhdGEuIE5VTEwgaWYgbm8gZGVzdGluYXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYm9va21hcmsuCisvLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGRhdGEuIE5VTEwgaWYgbm8gZGVzdGluYXRpb24gaXMgYXNzb2NpYXRlZAorLy8gICAgICAgICAgd2l0aCB0aGlzIGJvb2ttYXJrLgogLy8KLURMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGQm9va21hcmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0JPT0tNQVJLIGJvb2ttYXJrKTsKK0RMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGQm9va21hcmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PS01BUksgYm9va21hcmspOwogCiAvLyBGdW5jdGlvbjogRlBERkJvb2ttYXJrX0dldEFjdGlvbgogLy8gICAgICAgICAgR2V0IHRoZSBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIGEgYm9va21hcmsgaXRlbS4KIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBib29rbWFyayAgICAtICAgSGFuZGxlIHRvIHRoZSBib29rbWFyay4KIC8vIFJldHVybiB2YWx1ZToKLS8vICAgICAgICAgIEhhbmRsZSB0byB0aGUgYWN0aW9uIGRhdGEuIE5VTEwgaWYgbm8gYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJvb2ttYXJrLiBJbiB0aGlzIGNhc2UsIHRoZQorLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBhY3Rpb24gZGF0YS4gTlVMTCBpZiBubyBhY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKy8vICAgICAgICAgIGJvb2ttYXJrLiBJbiB0aGlzIGNhc2UsIHRoZQogLy8gICAgICAgICAgYXBwbGljYXRpb24gc2hvdWxkIHRyeSBGUERGQm9va21hcmtfR2V0RGVzdC4KIC8vCiBETExFWFBPUlQgRlBERl9BQ1RJT04gU1REQ0FMTCBGUERGQm9va21hcmtfR2V0QWN0aW9uKEZQREZfQk9PS01BUksgYm9va21hcmspOwogCi0jZGVmaW5lIFBERkFDVElPTl9VTlNVUFBPUlRFRCAgICAgICAwICAgICAgIC8vIFVuc3VwcG9ydGVkIGFjdGlvbiB0eXBlLgotI2RlZmluZSBQREZBQ1RJT05fR09UTyAgICAgICAgICAgICAgMSAgICAgICAvLyBHbyB0byBhIGRlc3RpbmF0aW9uIHdpdGhpbiBjdXJyZW50IGRvY3VtZW50LgotI2RlZmluZSBQREZBQ1RJT05fUkVNT1RFR09UTyAgICAgICAgMiAgICAgICAvLyBHbyB0byBhIGRlc3RpbmF0aW9uIHdpdGhpbiBhbm90aGVyIGRvY3VtZW50LgotI2RlZmluZSBQREZBQ1RJT05fVVJJICAgICAgICAgICAgICAgMyAgICAgICAvLyBVbml2ZXJzYWwgUmVzb3VyY2UgSWRlbnRpZmllciwgaW5jbHVkaW5nIHdlYiBwYWdlcyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXIgSW50ZXJuZXQgYmFzZWQgcmVzb3VyY2VzLgotI2RlZmluZSBQREZBQ1RJT05fTEFVTkNIICAgICAgICAgICAgNCAgICAgICAvLyBMYXVuY2ggYW4gYXBwbGljYXRpb24gb3Igb3BlbiBhIGZpbGUuCisjZGVmaW5lIFBERkFDVElPTl9VTlNVUFBPUlRFRCAwICAvLyBVbnN1cHBvcnRlZCBhY3Rpb24gdHlwZS4KKyNkZWZpbmUgUERGQUNUSU9OX0dPVE8gMSAgICAgICAgIC8vIEdvIHRvIGEgZGVzdGluYXRpb24gd2l0aGluIGN1cnJlbnQgZG9jdW1lbnQuCisjZGVmaW5lIFBERkFDVElPTl9SRU1PVEVHT1RPIDIgICAvLyBHbyB0byBhIGRlc3RpbmF0aW9uIHdpdGhpbiBhbm90aGVyIGRvY3VtZW50LgorI2RlZmluZSBQREZBQ1RJT05fVVJJIFwKKyAgMyAgLy8gVW5pdmVyc2FsIFJlc291cmNlIElkZW50aWZpZXIsIGluY2x1ZGluZyB3ZWIgcGFnZXMgYW5kCisgICAgIC8vIG90aGVyIEludGVybmV0IGJhc2VkIHJlc291cmNlcy4KKyNkZWZpbmUgUERGQUNUSU9OX0xBVU5DSCA0ICAvLyBMYXVuY2ggYW4gYXBwbGljYXRpb24gb3Igb3BlbiBhIGZpbGUuCiAKIC8vIEZ1bmN0aW9uOiBGUERGQWN0aW9uX0dldFR5cGUKIC8vICAgICAgICAgIEdldCB0eXBlIG9mIGFuIGFjdGlvbi4KQEAgLTEwNSwxNSArMTI4LDE5IEBACiAvLyAgICAgICAgICBHZXQgZGVzdGluYXRpb24gb2YgYW4gYWN0aW9uLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LgotLy8gICAgICAgICAgYWN0aW9uICAgICAgLSAgIEhhbmRsZSB0byB0aGUgYWN0aW9uLiBJdCBtdXN0IGJlIGEgR09UTyBvciBSRU1PVEVHT1RPIGFjdGlvbi4KKy8vICAgICAgICAgIGFjdGlvbiAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGFjdGlvbi4gSXQgbXVzdCBiZSBhIEdPVE8gb3IKKy8vICAgICAgICAgIFJFTU9URUdPVE8gYWN0aW9uLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBkZXN0aW5hdGlvbiBkYXRhLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBJbiBjYXNlIG9mIHJlbW90ZSBnb3RvIGFjdGlvbiwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBmaXJzdCB1c2UgRlBERkFjdGlvbl9HZXRGaWxlUGF0aCB0bwotLy8gICAgICAgICAgZ2V0IGZpbGUgcGF0aCwgdGhlbiBsb2FkIHRoYXQgcGFydGljdWxhciBkb2N1bWVudCwgYW5kIHVzZSBpdHMgZG9jdW1lbnQgaGFuZGxlIHRvIGNhbGwgdGhpcworLy8gICAgICAgICAgSW4gY2FzZSBvZiByZW1vdGUgZ290byBhY3Rpb24sIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZmlyc3QgdXNlCisvLyAgICAgICAgICBGUERGQWN0aW9uX0dldEZpbGVQYXRoIHRvCisvLyAgICAgICAgICBnZXQgZmlsZSBwYXRoLCB0aGVuIGxvYWQgdGhhdCBwYXJ0aWN1bGFyIGRvY3VtZW50LCBhbmQgdXNlIGl0cworLy8gICAgICAgICAgZG9jdW1lbnQgaGFuZGxlIHRvIGNhbGwgdGhpcwogLy8gICAgICAgICAgZnVuY3Rpb24uCiAvLwotRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZBY3Rpb25fR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0FDVElPTiBhY3Rpb24pOworRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZBY3Rpb25fR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0FDVElPTiBhY3Rpb24pOwogCiAvLyBGdW5jdGlvbjogRlBERkFjdGlvbl9HZXRVUklQYXRoCiAvLyAgICAgICAgICBHZXQgVVJJIHBhdGggb2YgYSBVUkkgYWN0aW9uLgpAQCAtMTI3LDEyICsxNTQsMTYgQEAKIC8vIENvbW1lbnRzOgogLy8gICAgICAgICAgVGhlIFVSSSBwYXRoIGlzIGFsd2F5cyBlbmNvZGVkIGluIDctYml0IEFTQ0lJLgogLy8KLS8vICAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgYWx3YXlzIGluZGljYXRlZCBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBidWZmZXIsIGV2ZW4gd2hlbiB0aGVyZSBpcwotLy8gICAgICAgICAgbm8gYnVmZmVyIHNwZWNpZmllZCwgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIHdpbGwgbm90CisvLyAgICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGFsd2F5cyBpbmRpY2F0ZWQgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUKKy8vICAgICAgICAgIGJ1ZmZlciwgZXZlbiB3aGVuIHRoZXJlIGlzCisvLyAgICAgICAgICBubyBidWZmZXIgc3BlY2lmaWVkLCBvciB0aGUgYnVmZmVyIHNpemUgaXMgbGVzcyB0aGVuIHJlcXVpcmVkLiBJbgorLy8gICAgICAgICAgdGhpcyBjYXNlLCB0aGUgYnVmZmVyIHdpbGwgbm90CiAvLyAgICAgICAgICBiZSBtb2RpZmllZC4KIC8vCi1ETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZBY3Rpb25fR2V0VVJJUGF0aChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0FDVElPTiBhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmbGVuKTsKK0RMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkFjdGlvbl9HZXRVUklQYXRoKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0FDVElPTiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1Zmxlbik7CiAKIC8vIEZ1bmN0aW9uOiBGUERGRGVzdF9HZXRQYWdlSW5kZXgKIC8vICAgICAgICAgIEdldCBwYWdlIGluZGV4IG9mIGEgZGVzdGluYXRpb24uCkBAIC0xNDIsNjcgKzE3Myw4NiBAQAogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVGhlIHBhZ2UgaW5kZXguIFN0YXJ0aW5nIGZyb20gMCBmb3IgdGhlIGZpcnN0IHBhZ2UuCiAvLwotRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGRGVzdF9HZXRQYWdlSW5kZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9ERVNUIGRlc3QpOworRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGRGVzdF9HZXRQYWdlSW5kZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfREVTVCBkZXN0KTsKIAogLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldExpbmtBdFBvaW50CiAvLyAgICAgICAgICBGaW5kIGEgbGluayBhdCBzcGVjaWZpZWQgcG9pbnQgb24gYSBkb2N1bWVudCBwYWdlLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50IHBhZ2UuCi0vLyAgICAgICAgICB4ICAgICAgICAgICAtICAgVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQsIHNwZWNpZmllZCBpbiBwYWdlIGNvb3JkaW5hdGUgc3lzdGVtLgotLy8gICAgICAgICAgeSAgICAgICAgICAgLSAgIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LCBzcGVjaWZpZWQgaW4gcGFnZSBjb29yZGluYXRlIHN5c3RlbS4KKy8vICAgICAgICAgIHggICAgICAgICAgIC0gICBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCwgc3BlY2lmaWVkIGluIHBhZ2UKKy8vICAgICAgICAgIGNvb3JkaW5hdGUgc3lzdGVtLgorLy8gICAgICAgICAgeSAgICAgICAgICAgLSAgIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LCBzcGVjaWZpZWQgaW4gcGFnZQorLy8gICAgICAgICAgY29vcmRpbmF0ZSBzeXN0ZW0uCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGxpbmsuIE5VTEwgaWYgbm8gbGluayBmb3VuZCBhdCB0aGF0IHBvaW50LgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBUaGUgcG9pbnQgY29vcmRpbmF0ZXMgYXJlIHNwZWNpZmllZCBpbiBwYWdlIGNvb3JkaW5hdGUgc3lzdGVtLiBZb3UgY2FuIGNvbnZlcnQgY29vcmRpbmF0ZXMKKy8vICAgICAgICAgIFRoZSBwb2ludCBjb29yZGluYXRlcyBhcmUgc3BlY2lmaWVkIGluIHBhZ2UgY29vcmRpbmF0ZSBzeXN0ZW0uIFlvdQorLy8gICAgICAgICAgY2FuIGNvbnZlcnQgY29vcmRpbmF0ZXMKIC8vICAgICAgICAgIGZyb20gc2NyZWVuIHN5c3RlbSB0byBwYWdlIHN5c3RlbSB1c2luZyBGUERGX0RldmljZVRvUGFnZSBmdW5jdGlvbnMuCiAvLyBOb3RlczoKLS8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mCisvLyAgICAgICAgICBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwotRExMRVhQT1JUIEZQREZfTElOSyBTVERDQUxMIEZQREZMaW5rX0dldExpbmtBdFBvaW50KEZQREZfUEFHRSBwYWdlLCBkb3VibGUgeCwgZG91YmxlIHkpOworRExMRVhQT1JUIEZQREZfTElOSyBTVERDQUxMIEZQREZMaW5rX0dldExpbmtBdFBvaW50KEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB5KTsKIAogLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldERlc3QKIC8vICAgICAgICAgIEdldCBkZXN0aW5hdGlvbiBpbmZvIG9mIGEgbGluay4KIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4KLS8vICAgICAgICAgIGxpbmsgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGxpbmsuIFJldHVybmVkIGJ5IEZQREZMaW5rX0dldExpbmtBdFBvaW50LgorLy8gICAgICAgICAgbGluayAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgbGluay4gUmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZMaW5rX0dldExpbmtBdFBvaW50LgogLy8gUmV0dXJuIHZhbHVlOgotLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBkZXN0aW5hdGlvbi4gTlVMTCBpZiB0aGVyZSBpcyBubyBkZXN0aW5hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmssIGluIHRoaXMgY2FzZQorLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBkZXN0aW5hdGlvbi4gTlVMTCBpZiB0aGVyZSBpcyBubyBkZXN0aW5hdGlvbgorLy8gICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBpbiB0aGlzIGNhc2UKIC8vICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgdHJ5IEZQREZMaW5rX0dldEFjdGlvbi4KIC8vCi1ETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkxpbmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0xJTksgbGluayk7CitETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkxpbmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9MSU5LIGxpbmspOwogCiAvLyBGdW5jdGlvbjogRlBERkxpbmtfR2V0QWN0aW9uCiAvLyAgICAgICAgICBHZXQgYWN0aW9uIGluZm8gb2YgYSBsaW5rLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIGxpbmsgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGxpbmsuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGFjdGlvbi4gTlVMTCBpZiB0aGVyZSBpcyBubyBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLgorLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBhY3Rpb24uIE5VTEwgaWYgdGhlcmUgaXMgbm8gYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUKKy8vICAgICAgICAgIGxpbmsuCiAvLwogRExMRVhQT1JUIEZQREZfQUNUSU9OIFNURENBTEwgRlBERkxpbmtfR2V0QWN0aW9uKEZQREZfTElOSyBsaW5rKTsKIAogLy8gRnVuY3Rpb246IEZQREZMaW5rX0VudW1lcmF0ZQotLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiB3b3VsZCBlbnVtZXJhdGUgYWxsIHRoZSBsaW5rIGFubm90YXRpb25zIGluIGEgc2luZ2xlIFBERiBwYWdlLgorLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiB3b3VsZCBlbnVtZXJhdGUgYWxsIHRoZSBsaW5rIGFubm90YXRpb25zIGluIGEgc2luZ2xlCisvLyAgICAgICAgICBQREYgcGFnZS4KIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBwYWdlW2luXSAgICAgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuCi0vLyAgICAgICAgICBzdGFydFBvc1tpbixvdXRdICAgIC0gICBUaGUgc3RhcnQgcG9zaXRpb24gdG8gZW51bWVyYXRlIHRoZSBsaW5rIGFubm90YXRpb25zLCB3aGljaCBzaG91bGQgYmUgc3BlY2lmaWVkIHRvIHN0YXJ0IGZyb20KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAgIDAgZm9yIHRoZSBmaXJzdCBjYWxsLCBhbmQgd291bGQgcmVjZWl2ZSB0aGUgbmV4dCBwb3NpdGlvbiBmb3IgZW51bWVyYXRpbmcgdG8gc3RhcnQgZnJvbS4KKy8vICAgICAgICAgIHN0YXJ0UG9zW2luLG91dF0gICAgLSAgIFRoZSBzdGFydCBwb3NpdGlvbiB0byBlbnVtZXJhdGUgdGhlIGxpbmsKKy8vICAgICAgICAgIGFubm90YXRpb25zLCB3aGljaCBzaG91bGQgYmUgc3BlY2lmaWVkIHRvIHN0YXJ0IGZyb20KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAgIDAgZm9yIHRoZSBmaXJzdCBjYWxsLCBhbmQgd291bGQgcmVjZWl2ZSB0aGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBwb3NpdGlvbiBmb3IgZW51bWVyYXRpbmcgdG8gc3RhcnQgZnJvbS4KIC8vICAgICAgICAgIGxpbmtBbm5vdFtvdXRdICAgICAgLSAgIFJlY2VpdmUgdGhlIGxpbmsgaGFuZGxlLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVFJVRSBpZiBzdWNjY2VlZCwgZWxzZSBGYWxzZTsKIC8vIE5vdGVzOgotLy8gICAgICAgICAgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgorLy8gICAgICAgICAgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YKKy8vICAgICAgICAgIGR5bmFtaWMgWEZBIGZpZWxkcy4KIC8vCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfRW51bWVyYXRlKEZQREZfUEFHRSBwYWdlLCBpbnQqIHN0YXJ0UG9zLCBGUERGX0xJTksqIGxpbmtBbm5vdCk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfRW51bWVyYXRlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0YXJ0UG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0xJTksqIGxpbmtBbm5vdCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXRBbm5vdFJlY3QKLS8vICAgICAgICAgIEdldCB0aGUgYW5ub3RhdGlvbiByZWN0YW5nbGUuIChTcGVjaWZpZWQgYnkgdGhlIKGwUmVjdKGxIGVudHJ5IG9mIGFubm90YXRpb24gZGljdGlvbmFyeSkuCisvLyAgICAgICAgICBHZXQgdGhlIGFubm90YXRpb24gcmVjdGFuZ2xlLiAoU3BlY2lmaWVkIGJ5IHRoZSChsFJlY3ShsSBlbnRyeSBvZgorLy8gICAgICAgICAgYW5ub3RhdGlvbiBkaWN0aW9uYXJ5KS4KIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBsaW5rQW5ub3RbaW5dICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGxpbmsgYW5ub3RhdGlvbi4KIC8vICAgICAgICAgIHJlY3Rbb3V0XSAgICAgICAgICAgLSAgIFRoZSBhbm5vdGF0aW9uIHJlY3QuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUUlVFIGlmIHN1Y2NjZWVkLCBlbHNlIEZhbHNlOwogLy8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19HZXRBbm5vdFJlY3QoRlBERl9MSU5LIGxpbmtBbm5vdCwgRlNfUkVDVEYqIHJlY3QpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldEFubm90UmVjdChGUERGX0xJTksgbGlua0Fubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19SRUNURiogcmVjdCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGTGlua19Db3VudFF1YWRQb2ludHMKIC8vICAgICAgICAgIEdldCB0aGUgY291bnQgb2YgcXVhZHJpbGF0ZXJhbCBwb2ludHMgdG8gdGhlIGxpbmsgYW5ub3RhdGlvbi4KQEAgLTIxNiwyMSArMjY2LDIxIEBACiAvKiBfRlNfREVGX1NUUlVDVFVSRV9RVUFEUE9JTlRTRl8gKi8KICNpZm5kZWYgX0ZTX0RFRl9TVFJVQ1RVUkVfUVVBRFBPSU5UU0ZfCiAjZGVmaW5lIF9GU19ERUZfU1RSVUNUVVJFX1FVQURQT0lOVFNGXwotdHlwZWRlZiBzdHJ1Y3QgX0ZTX1FVQURQT0lOVFNGCi17Ci0gICAgRlNfRkxPQVQgIHgxOwotICAgIEZTX0ZMT0FUICB5MTsKLSAgICBGU19GTE9BVCAgeDI7Ci0gICAgRlNfRkxPQVQgIHkyOwotICAgIEZTX0ZMT0FUICB4MzsKLSAgICBGU19GTE9BVCAgeTM7Ci0gICAgRlNfRkxPQVQgIHg0OwotICAgIEZTX0ZMT0FUICB5NDsKK3R5cGVkZWYgc3RydWN0IF9GU19RVUFEUE9JTlRTRiB7CisgIEZTX0ZMT0FUIHgxOworICBGU19GTE9BVCB5MTsKKyAgRlNfRkxPQVQgeDI7CisgIEZTX0ZMT0FUIHkyOworICBGU19GTE9BVCB4MzsKKyAgRlNfRkxPQVQgeTM7CisgIEZTX0ZMT0FUIHg0OworICBGU19GTE9BVCB5NDsKIH0gRlNfUVVBRFBPSU5UU0Y7CiAjZW5kaWYgLyogX0ZTX0RFRl9TVFJVQ1RVUkVfUVVBRFBPSU5UU0ZfICovCiAKIC8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXRRdWFkUG9pbnRzCi0vLyAgICAgICAgICBHZXQgdGhlIHF1YWRyaWxhdGVyYWwgcG9pbnRzIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZSBsaW5rIGFubm90YXRpb24uCisvLyAgICAgICAgICBHZXQgdGhlIHF1YWRyaWxhdGVyYWwgcG9pbnRzIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZSBsaW5rCisvLyAgICAgICAgICBhbm5vdGF0aW9uLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIGxpbmtBbm5vdFtpbl0gICAgICAgLSAgIEhhbmRsZSB0byB0aGUgbGluayBhbm5vdGF0aW9uLgogLy8gICAgICAgICAgcXVhZEluZGV4W2luXSAgICAgICAtICAgVGhlIHNwZWNpZmllZCBxdWFkIHBvaW50cyBpbmRleC4KQEAgLTIzOCwzMyArMjg4LDQ2IEBACiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUcnVlIGlmIHN1Y2NlZWQsIGVsc2UgRmFsc2UuCiAvLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldFF1YWRQb2ludHMoRlBERl9MSU5LIGxpbmtBbm5vdCwgaW50IHF1YWRJbmRleCwgRlNfUVVBRFBPSU5UU0YqIHF1YWRQb2ludHMpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldFF1YWRQb2ludHMoRlBERl9MSU5LIGxpbmtBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFkSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19RVUFEUE9JTlRTRiogcXVhZFBvaW50cyk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0dldE1ldGFUZXh0Ci0vLyAgICAgICAgICBHZXQgYSB0ZXh0IGZyb20gbWV0YSBkYXRhIG9mIHRoZSBkb2N1bWVudC4gUmVzdWx0IGlzIGVuY29kZWQgaW4gVVRGLTE2TEUuCisvLyAgICAgICAgICBHZXQgYSB0ZXh0IGZyb20gbWV0YSBkYXRhIG9mIHRoZSBkb2N1bWVudC4gUmVzdWx0IGlzIGVuY29kZWQgaW4KKy8vICAgICAgICAgIFVURi0xNkxFLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIGRvYyAgICAgICAgIC0gICBIYW5kbGUgdG8gYSBkb2N1bWVudAotLy8gICAgICAgICAgdGFnICAgICAgICAgLSAgIFRoZSB0YWcgZm9yIHRoZSBtZXRhIGRhdGEuIEN1cnJlbnRseSwgSXQgY2FuIGJlICJUaXRsZSIsICJBdXRob3IiLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICJTdWJqZWN0IiwgIktleXdvcmRzIiwgIkNyZWF0b3IiLCAiUHJvZHVjZXIiLCAiQ3JlYXRpb25EYXRlIiwgb3IgIk1vZERhdGUiLgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGVzZSB0YWdzIGFuZCB0aGVpciByZXNwZWN0aXZlIHZhbHVlcywKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICBwbGVhc2UgcmVmZXIgdG8gUERGIFJlZmVyZW5jZSAxLjYsIHNlY3Rpb24gMTAuMi4xLCAiRG9jdW1lbnQgSW5mb3JtYXRpb24gRGljdGlvbmFyeSIuCisvLyAgICAgICAgICB0YWcgICAgICAgICAtICAgVGhlIHRhZyBmb3IgdGhlIG1ldGEgZGF0YS4gQ3VycmVudGx5LCBJdCBjYW4gYmUKKy8vICAgICAgICAgICJUaXRsZSIsICJBdXRob3IiLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICJTdWJqZWN0IiwgIktleXdvcmRzIiwgIkNyZWF0b3IiLCAiUHJvZHVjZXIiLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGlvbkRhdGUiLCBvciAiTW9kRGF0ZSIuCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIHRoZXNlIHRhZ3MgYW5kIHRoZWlyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZSB2YWx1ZXMsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgcGxlYXNlIHJlZmVyIHRvIFBERiBSZWZlcmVuY2UgMS42LCBzZWN0aW9uIDEwLjIuMSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9jdW1lbnQgSW5mb3JtYXRpb24gRGljdGlvbmFyeSIuCiAvLyAgICAgICAgICBidWZmZXIgICAgICAtICAgQSBidWZmZXIgZm9yIG91dHB1dCB0aGUgdGl0bGUuIENhbiBiZSBOVUxMLgogLy8gICAgICAgICAgYnVmbGVuICAgICAgLSAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLiBDYW4gYmUgMC4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE51bWJlciBvZiBieXRlcyB0aGUgdGl0bGUgY29uc3VtZXMsIGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvcy4KIC8vIENvbW1lbnRzOgotLy8gICAgICAgICAgTm8gbWF0dGVyIG9uIHdoYXQgcGxhdGZvcm0sIHRoZSB0aXRsZSBpcyBhbHdheXMgb3V0cHV0IGluIFVURi0xNkxFIGVuY29kaW5nLCB3aGljaCBtZWFucyB0aGUgYnVmZmVyCi0vLyAgICAgICAgICBjYW4gYmUgcmVnYXJkZWQgYXMgYW4gYXJyYXkgb2YgV09SRCAob24gSW50ZWwgYW5kIGNvbXBhdGlibGUgQ1BVcyksIGVhY2ggV09SRCByZXByZXNlbnQgdGhlIFVuaWNvZGUgb2YKLS8vICAgICAgICAgIGEgY2hhcmFjdGVyIChzb21lIHNwZWNpYWwgVW5pY29kZSBtYXkgdGFrZSAyIFdPUkRzKS4gVGhlIHN0cmluZyBpcyBmb2xsb3dlZCBieSB0d28gYnl0ZXMgb2YgemVybworLy8gICAgICAgICAgTm8gbWF0dGVyIG9uIHdoYXQgcGxhdGZvcm0sIHRoZSB0aXRsZSBpcyBhbHdheXMgb3V0cHV0IGluIFVURi0xNkxFCisvLyAgICAgICAgICBlbmNvZGluZywgd2hpY2ggbWVhbnMgdGhlIGJ1ZmZlcgorLy8gICAgICAgICAgY2FuIGJlIHJlZ2FyZGVkIGFzIGFuIGFycmF5IG9mIFdPUkQgKG9uIEludGVsIGFuZCBjb21wYXRpYmxlIENQVXMpLAorLy8gICAgICAgICAgZWFjaCBXT1JEIHJlcHJlc2VudCB0aGUgVW5pY29kZSBvZgorLy8gICAgICAgICAgYSBjaGFyYWN0ZXIgKHNvbWUgc3BlY2lhbCBVbmljb2RlIG1heSB0YWtlIDIgV09SRHMpLiBUaGUgc3RyaW5nIGlzCisvLyAgICAgICAgICBmb2xsb3dlZCBieSB0d28gYnl0ZXMgb2YgemVybwogLy8gICAgICAgICAgaW5kaWNhdGluZyBlbmQgb2YgdGhlIHN0cmluZy4KIC8vCi0vLyAgICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGFsd2F5cyBpbmRpY2F0ZWQgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgYnVmZmVyLCBldmVuIHdoZW4gdGhlcmUgaXMKLS8vICAgICAgICAgIG5vIGJ1ZmZlciBzcGVjaWZpZWQsIG9yIHRoZSBidWZmZXIgc2l6ZSBpcyBsZXNzIHRoZW4gcmVxdWlyZWQuIEluIHRoaXMgY2FzZSwgdGhlIGJ1ZmZlciB3aWxsIG5vdAorLy8gICAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBhbHdheXMgaW5kaWNhdGVkIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlCisvLyAgICAgICAgICBidWZmZXIsIGV2ZW4gd2hlbiB0aGVyZSBpcworLy8gICAgICAgICAgbm8gYnVmZmVyIHNwZWNpZmllZCwgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4KKy8vICAgICAgICAgIHRoaXMgY2FzZSwgdGhlIGJ1ZmZlciB3aWxsIG5vdAogLy8gICAgICAgICAgYmUgbW9kaWZpZWQuCiAvLwotRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGX0dldE1ldGFUZXh0KEZQREZfRE9DVU1FTlQgZG9jLCBGUERGX0JZVEVTVFJJTkcgdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBidWZsZW4pOwotCitETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZfR2V0TWV0YVRleHQoRlBERl9ET0NVTUVOVCBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX2VkaXQuaCBiL3B1YmxpYy9mcGRmX2VkaXQuaAppbmRleCA3MDMyZDYwLi4yNTNmNjY4IDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl9lZGl0LmgKKysrIGIvcHVibGljL2ZwZGZfZWRpdC5oCkBAIC0xMSwxNCArMTEsMTggQEAKIAogI2luY2x1ZGUgImZwZGZ2aWV3LmgiCiAKLS8vIERlZmluZSBhbGwgdHlwZXMgdXNlZCBpbiB0aGUgU0RLLiBOb3RlIHRoZXkgY2FuIGJlIHNpbXBseSByZWdhcmRlZCBhcyBvcGFxdWUgcG9pbnRlcnMKKy8vIERlZmluZSBhbGwgdHlwZXMgdXNlZCBpbiB0aGUgU0RLLiBOb3RlIHRoZXkgY2FuIGJlIHNpbXBseSByZWdhcmRlZCBhcyBvcGFxdWUKKy8vIHBvaW50ZXJzCiAvLyBvciBsb25nIGludGVnZXIgbnVtYmVycy4KIAotI2RlZmluZSBGUERGX0FSR0IoYSxyLGcsYikgICAgICAoKCgodWludDMyX3QpKCgodWludDhfdCkoYil8KChGWF9XT1JEKSgodWludDhfdCkoZykpPDw4KSl8KCgoRlhfRFdPUkQpKHVpbnQ4X3QpKHIpKTw8MTYpKSkpIHwgKCgoRlhfRFdPUkQpKHVpbnQ4X3QpKGEpKTw8MjQpKQotI2RlZmluZSBGUERGX0dldEJWYWx1ZShhcmdiKSAgICAoKHVpbnQ4X3QpKGFyZ2IpKQotI2RlZmluZSBGUERGX0dldEdWYWx1ZShhcmdiKSAgICAoKHVpbnQ4X3QpKCgodWludDE2X3QpKGFyZ2IpKSA+PiA4KSkKLSNkZWZpbmUgRlBERl9HZXRSVmFsdWUoYXJnYikgICAgKCh1aW50OF90KSgoYXJnYik+PjE2KSkKLSNkZWZpbmUgRlBERl9HZXRBVmFsdWUoYXJnYikgICAgKCh1aW50OF90KSgoYXJnYik+PjI0KSkKKyNkZWZpbmUgRlBERl9BUkdCKGEsIHIsIGcsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKHVpbnQzMl90KSgoKHVpbnQ4X3QpKGIpIHwgKChGWF9XT1JEKSgodWludDhfdCkoZykpIDw8IDgpKSB8IFwKKyAgICAgICAgICAgICAgICAoKChGWF9EV09SRCkodWludDhfdCkocikpIDw8IDE2KSkpKSB8ICAgICAgICAgICAgIFwKKyAgICgoKEZYX0RXT1JEKSh1aW50OF90KShhKSkgPDwgMjQpKQorI2RlZmluZSBGUERGX0dldEJWYWx1ZShhcmdiKSAoKHVpbnQ4X3QpKGFyZ2IpKQorI2RlZmluZSBGUERGX0dldEdWYWx1ZShhcmdiKSAoKHVpbnQ4X3QpKCgodWludDE2X3QpKGFyZ2IpKSA+PiA4KSkKKyNkZWZpbmUgRlBERl9HZXRSVmFsdWUoYXJnYikgKCh1aW50OF90KSgoYXJnYikgPj4gMTYpKQorI2RlZmluZSBGUERGX0dldEFWYWx1ZShhcmdiKSAoKHVpbnQ4X3QpKChhcmdiKSA+PiAyNCkpCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CkBAIC00OCw3ICs1Miw4IEBACiAvLyBGdW5jdGlvbjogRlBERlBhZ2VfTmV3CiAvLyAgICAgICAgICBDb25zdHJ1Y3QgYW4gZW1wdHkgcGFnZS4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBhbmQgRlBERl9DcmVhdGVOZXdEb2N1bWVudC4KKy8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50CisvLyAgICAgICAgICBhbmQgRlBERl9DcmVhdGVOZXdEb2N1bWVudC4KIC8vICAgICAgICAgIHBhZ2VfaW5kZXggIC0gICBUaGUgaW5kZXggb2YgYSBwYWdlLgogLy8gICAgICAgICAgd2lkdGggICAgICAgLSAgIFRoZSBwYWdlIHdpZHRoLgogLy8gICAgICAgICAgaGVpZ2h0ICAgICAgLSAgIFRoZSBwYWdlIGhlaWdodC4KQEAgLTU3LDEwOCArNjIsMTM1IEBACiAvLyBDb21tZW50czoKIC8vICAgICAgICAgIExvYWRlZCBwYWdlIGNhbiBiZSBkZWxldGVkIGJ5IEZQREZQYWdlX0RlbGV0ZS4KIC8vIE5vdGVzOgotLy8gICAgICAgICAgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdG8gY3JlYXRlIGEgbmV3IHBhZ2UgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisvLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byBjcmVhdGUgYSBuZXcgcGFnZSBmb3IgdGhlIGRvY3VtZW50CisvLyAgICAgICAgICBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwotRExMRVhQT1JUIEZQREZfUEFHRSBTVERDQUxMIEZQREZQYWdlX05ldyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQgcGFnZV9pbmRleCwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0KTsKK0RMTEVYUE9SVCBGUERGX1BBR0UgU1REQ0FMTCBGUERGUGFnZV9OZXcoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGhlaWdodCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9EZWxldGUKIC8vICAgICAgICAgIERlbGV0ZSBhIFBERiBwYWdlLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGFuZCBGUERGX0NyZWF0ZU5ld0RvY3VtZW50LgorLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQKKy8vICAgICAgICAgIGFuZCBGUERGX0NyZWF0ZU5ld0RvY3VtZW50LgogLy8gICAgICAgICAgcGFnZV9pbmRleCAgLSAgIFRoZSBpbmRleCBvZiBhIHBhZ2UuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8gTm90ZXM6Ci0vLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byBkZWxldGUgcGFnZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIGRlbGV0ZSBwYWdlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMKKy8vICAgICAgICAgIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KIC8vCiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX0RlbGV0ZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQgcGFnZV9pbmRleCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9HZXRSb3RhdGlvbgotLy8gICAgICAgICAgR2V0IHRoZSBwYWdlIHJvdGF0aW9uLiBPbmUgb2YgZm9sbG93aW5nIHZhbHVlcyB3aWxsIGJlIHJldHVybmVkOiAwKDApLCAxKDkwKSwgMigxODApLCAzKDI3MCkuCisvLyAgICAgICAgICBHZXQgdGhlIHBhZ2Ugcm90YXRpb24uIE9uZSBvZiBmb2xsb3dpbmcgdmFsdWVzIHdpbGwgYmUgcmV0dXJuZWQ6CisvLyAgICAgICAgICAwKDApLCAxKDkwKSwgMigxODApLCAzKDI3MCkuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvciBGUERGX0xvYWRQYWdlLgorLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvcgorLy8gICAgICAgICAgRlBERl9Mb2FkUGFnZS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBQREYgcGFnZSByb3RhdGlvbi4KIC8vIENvbW1lbnQ6CiAvLyAgICAgICAgICBUaGUgUERGIHBhZ2Ugcm90YXRpb24gaXMgcm90YXRlZCBjbG9ja3dpc2UuCiAvLyBOb3RlczoKLS8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIGdldCB0aGUgcGFnZSByb3RhdGUgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisvLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byBnZXQgdGhlIHBhZ2Ugcm90YXRlIGZvciB0aGUgZG9jdW1lbnQKKy8vICAgICAgICAgIGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KIC8vCiBETExFWFBPUlQgaW50IFNURENBTEwgRlBERlBhZ2VfR2V0Um90YXRpb24oRlBERl9QQUdFIHBhZ2UpOwogCiAvLyBGdW5jdGlvbjogRlBERlBhZ2VfU2V0Um90YXRpb24KLS8vICAgICAgICAgIFNldCBwYWdlIHJvdGF0aW9uLiBPbmUgb2YgZm9sbG93aW5nIHZhbHVlcyB3aWxsIGJlIHNldDogMCgwKSwgMSg5MCksIDIoMTgwKSwgMygyNzApLgorLy8gICAgICAgICAgU2V0IHBhZ2Ugcm90YXRpb24uIE9uZSBvZiBmb2xsb3dpbmcgdmFsdWVzIHdpbGwgYmUgc2V0OiAwKDApLCAxKDkwKSwKKy8vICAgICAgICAgIDIoMTgwKSwgMygyNzApLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlLiBSZXR1cm5lZCBieSBGUERGUGFnZV9OZXcgb3IgRlBERl9Mb2FkUGFnZS4KKy8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlLiBSZXR1cm5lZCBieSBGUERGUGFnZV9OZXcgb3IKKy8vICAgICAgICAgIEZQREZfTG9hZFBhZ2UuCiAvLyAgICAgICAgICByb3RhdGUgICAgICAtICAgVGhlIHZhbHVlIG9mIHRoZSBQREYgcGFnZSByb3RhdGlvbi4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLyBDb21tZW50OgogLy8gICAgICAgICAgVGhlIFBERiBwYWdlIHJvdGF0aW9uIGlzIHJvdGF0ZWQgY2xvY2t3aXNlLgogLy8gTm90ZXM6Ci0vLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byBzZXQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgorLy8gICAgICAgICAgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdG8gc2V0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50CisvLyAgICAgICAgICBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9TZXRSb3RhdGlvbihGUERGX1BBR0UgcGFnZSwgaW50IHJvdGF0ZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9JbnNlcnRPYmplY3QKLS8vICAgICAgICAgIEluc2VydCBhbiBvYmplY3QgdG8gdGhlIHBhZ2UuIFRoZSBwYWdlIG9iamVjdCBpcyBhdXRvbWF0aWNhbGx5IGZyZWVkLgorLy8gICAgICAgICAgSW5zZXJ0IGFuIG9iamVjdCB0byB0aGUgcGFnZS4gVGhlIHBhZ2Ugb2JqZWN0IGlzIGF1dG9tYXRpY2FsbHkKKy8vICAgICAgICAgIGZyZWVkLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlLiBSZXR1cm5lZCBieSBGUERGUGFnZV9OZXcgb3IgRlBERl9Mb2FkUGFnZS4KLS8vICAgICAgICAgIHBhZ2Vfb2JqICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlIG9iamVjdC4gUmV0dXJuZWQgYnkgRlBERlBhZ2VPYmpfTmV3VGV4dE9iaixGUERGUGFnZU9ial9OZXdUZXh0T2JqRXggYW5kCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIGEgcGFnZS4gUmV0dXJuZWQgYnkgRlBERlBhZ2VfTmV3IG9yCisvLyAgICAgICAgICBGUERGX0xvYWRQYWdlLgorLy8gICAgICAgICAgcGFnZV9vYmogICAgLSAgIEhhbmRsZSB0byBhIHBhZ2Ugb2JqZWN0LiBSZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERlBhZ2VPYmpfTmV3VGV4dE9iaixGUERGUGFnZU9ial9OZXdUZXh0T2JqRXggYW5kCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERlBhZ2VPYmpfTmV3UGF0aE9iai4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLyBOb3RlczoKLS8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mCisvLyAgICAgICAgICBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9JbnNlcnRPYmplY3QoRlBERl9QQUdFIHBhZ2UsIEZQREZfUEFHRU9CSkVDVCBwYWdlX29iaik7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX0luc2VydE9iamVjdChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRU9CSkVDVCBwYWdlX29iaik7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9Db3VudE9iamVjdAogLy8gICAgICAgICAgR2V0IG51bWJlciBvZiBwYWdlIG9iamVjdHMgaW5zaWRlIHRoZSBwYWdlLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlLiBSZXR1cm5lZCBieSBGUERGUGFnZV9OZXcgb3IgRlBERl9Mb2FkUGFnZS4KKy8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlLiBSZXR1cm5lZCBieSBGUERGUGFnZV9OZXcgb3IKKy8vICAgICAgICAgIEZQREZfTG9hZFBhZ2UuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUaGUgbnVtYmVyIG9mIHRoZSBwYWdlIG9iamVjdC4KIC8vIE5vdGVzOgotLy8gICAgICAgICAgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgorLy8gICAgICAgICAgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YKKy8vICAgICAgICAgIGR5bmFtaWMgWEZBIGZpZWxkcy4KIC8vCiBETExFWFBPUlQgaW50IFNURENBTEwgRlBERlBhZ2VfQ291bnRPYmplY3QoRlBERl9QQUdFIHBhZ2UpOwogCiAvLyBGdW5jdGlvbjogRlBERlBhZ2VfR2V0T2JqZWN0CiAvLyAgICAgICAgICBHZXQgcGFnZSBvYmplY3QgYnkgaW5kZXguCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvciBGUERGX0xvYWRQYWdlLgorLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvcgorLy8gICAgICAgICAgRlBERl9Mb2FkUGFnZS4KIC8vICAgICAgICAgIGluZGV4ICAgICAgIC0gICBUaGUgaW5kZXggb2YgYSBwYWdlIG9iamVjdC4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBoYW5kbGUgb2YgdGhlIHBhZ2Ugb2JqZWN0LiBOdWxsIGZvciBmYWlsZWQuCiAvLyBOb3RlczoKLS8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mCisvLyAgICAgICAgICBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwogRExMRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBTVERDQUxMIEZQREZQYWdlX0dldE9iamVjdChGUERGX1BBR0UgcGFnZSwgaW50IGluZGV4KTsKIAogLy8gRnVuY3Rpb246IEZQREZQYWdlX0hhc1RyYW5zcGFyZW5jeQotLy8gICAgICAgICAgQ2hlY2sgdGhhdCB3aGV0aGVyIHRoZSBjb250ZW50IG9mIHNwZWNpZmllZCBQREYgcGFnZSBjb250YWlucyB0cmFuc3BhcmVuY3kuCisvLyAgICAgICAgICBDaGVjayB0aGF0IHdoZXRoZXIgdGhlIGNvbnRlbnQgb2Ygc3BlY2lmaWVkIFBERiBwYWdlIGNvbnRhaW5zCisvLyAgICAgICAgICB0cmFuc3BhcmVuY3kuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvciBGUERGX0xvYWRQYWdlLgorLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvcgorLy8gICAgICAgICAgRlBERl9Mb2FkUGFnZS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRSVUUgbWVhbnMgdGhhdCB0aGUgUERGIHBhZ2UgZG9lcyBjb250YWlucyB0cmFuc3BhcmVuY3kuCiAvLyAgICAgICAgICBPdGhlcndpc2UsIHJldHVybnMgRkFMU0UuCiAvLyBOb3RlczoKLS8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mCisvLyAgICAgICAgICBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0hhc1RyYW5zcGFyZW5jeShGUERGX1BBR0UgcGFnZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQKIC8vICAgICAgICAgIEdlbmVyYXRlIFBERiBQYWdlIGNvbnRlbnQuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvciBGUERGX0xvYWRQYWdlLgorLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvcgorLy8gICAgICAgICAgRlBERl9Mb2FkUGFnZS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgogLy8gQ29tbWVudDoKLS8vICAgICAgICAgIEJlZm9yZSB5b3Ugc2F2ZSB0aGUgcGFnZSB0byBhIGZpbGUsIG9yIHJlbG9hZCB0aGUgcGFnZSwgeW91IG11c3QgY2FsbCB0aGUgRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50IGZ1bmN0aW9uLgorLy8gICAgICAgICAgQmVmb3JlIHlvdSBzYXZlIHRoZSBwYWdlIHRvIGEgZmlsZSwgb3IgcmVsb2FkIHRoZSBwYWdlLCB5b3UgbXVzdAorLy8gICAgICAgICAgY2FsbCB0aGUgRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50IGZ1bmN0aW9uLgogLy8gICAgICAgICAgT3IgdGhlIGNoYW5nZWQgaW5mb3JtYXRpb24gd2lsbCBiZSBsb3N0LgogLy8gTm90ZXM6Ci0vLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisvLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZgorLy8gICAgICAgICAgZHluYW1pYyBYRkEgZmllbGRzLgogLy8KIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQoRlBERl9QQUdFIHBhZ2UpOwogCkBAIC0xNjksMTggKzIwMSwyMSBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiAvLyBGdW5jdGlvbjogRlBERlBhZ2VPYmpfSGFzVHJhbnNwYXJlbmN5Ci0vLyAgICAgICAgICBDaGVjayB0aGF0IHdoZXRoZXIgdGhlIHNwZWNpZmllZCBQREYgcGFnZSBvYmplY3QgY29udGFpbnMgdHJhbnNwYXJlbmN5LgorLy8gICAgICAgICAgQ2hlY2sgdGhhdCB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUERGIHBhZ2Ugb2JqZWN0IGNvbnRhaW5zCisvLyAgICAgICAgICB0cmFuc3BhcmVuY3kuCiAvLyBQYXJhbWV0ZXJzOgogLy8gICAgICAgICAgcGFnZU9iamVjdCAgLSAgIEhhbmRsZSB0byBhIHBhZ2Ugb2JqZWN0LgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVFJVRSBtZWFucyB0aGF0IHRoZSBQREYgcGFnZSBvYmplY3QgZG9lcyBjb250YWlucyB0cmFuc3BhcmVuY3kuCiAvLyAgICAgICAgICBPdGhlcndpc2UsIHJldHVybnMgRkFMU0UuCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VPYmpfSGFzVHJhbnNwYXJlbmN5KEZQREZfUEFHRU9CSkVDVCBwYWdlT2JqZWN0KTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTAorRlBERlBhZ2VPYmpfSGFzVHJhbnNwYXJlbmN5KEZQREZfUEFHRU9CSkVDVCBwYWdlT2JqZWN0KTsKIAogLy8gRnVuY3Rpb246IEZQREZQYWdlT2JqX1RyYW5zZm9ybQogLy8gICAgICAgICAgVHJhbnNmb3JtIChzY2FsZSwgcm90YXRlLCBzaGVhciwgbW92ZSkgcGFnZSBvYmplY3QuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgcGFnZV9vYmplY3QgLSAgIEhhbmRsZSB0byBhIHBhZ2Ugb2JqZWN0LiBSZXR1cm5lZCBieSBGUERGUGFnZU9ial9OZXdJbWFnZU9iai4KKy8vICAgICAgICAgIHBhZ2Vfb2JqZWN0IC0gICBIYW5kbGUgdG8gYSBwYWdlIG9iamVjdC4gUmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZQYWdlT2JqX05ld0ltYWdlT2JqLgogLy8gICAgICAgICAgYSAgICAgICAgICAgLSAgIFRoZSBjb2VmZmljaWVudCAiYSIgb2YgdGhlIG1hdHJpeC4KIC8vICAgICAgICAgIGIgICAgICAgICAgIC0gICBUaGUgY29lZmZpY2llbnQgImIiIG9mIHRoZSBtYXRyaXguCiAvLyAgICAgICAgICBjICAgICAgICAgICAtICAgVGhlIGNvZWZmaWNpZW50ICJjIiBvZiB0aGUgbWF0cml4LgpAQCAtMTkwLDcgKzIyNSwxMiBAQAogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VPYmpfVHJhbnNmb3JtKEZQREZfUEFHRU9CSkVDVCBwYWdlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBjLCBkb3VibGUgZCwgZG91YmxlIGUsIGRvdWJsZSBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZik7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9UcmFuc2Zvcm1Bbm5vdHMKIC8vICAgICAgICAgIFRyYW5zZm9ybSAoc2NhbGUsIHJvdGF0ZSwgc2hlYXIsIG1vdmUpIGFsbCBhbm5vdHMgaW4gYSBwYWdlLgpAQCAtMjA1LDE2ICsyNDUsMjIgQEAKIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLyBOb3RlczoKLS8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mCisvLyAgICAgICAgICBkeW5hbWljIFhGQSBmaWVsZHMuCiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX1RyYW5zZm9ybUFubm90cyhGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIGMsIGRvdWJsZSBkLCBkb3VibGUgZSwgZG91YmxlIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmKTsKIAogLy8gVGhlIHBhZ2Ugb2JqZWN0IGNvbnN0YW50cy4KLSNkZWZpbmUgRlBERl9QQUdFT0JKX1RFWFQgICAgICAgMQotI2RlZmluZSBGUERGX1BBR0VPQkpfUEFUSCAgICAgICAyCi0jZGVmaW5lIEZQREZfUEFHRU9CSl9JTUFHRSAgICAgIDMKLSNkZWZpbmUgRlBERl9QQUdFT0JKX1NIQURJTkcgICAgNAotI2RlZmluZSBGUERGX1BBR0VPQkpfRk9STSAgICAgICA1CisjZGVmaW5lIEZQREZfUEFHRU9CSl9URVhUIDEKKyNkZWZpbmUgRlBERl9QQUdFT0JKX1BBVEggMgorI2RlZmluZSBGUERGX1BBR0VPQkpfSU1BR0UgMworI2RlZmluZSBGUERGX1BBR0VPQkpfU0hBRElORyA0CisjZGVmaW5lIEZQREZfUEFHRU9CSl9GT1JNIDUKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8KQEAgLTIyNSwzMyArMjcxLDQ1IEBACiAvLyBGdW5jdGlvbjogRlBERlBhZ2VPYmpfTmV3SW1nZU9iagogLy8gICAgICAgICAgQ3JlYXRlIGEgbmV3IEltYWdlIE9iamVjdC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgb3IgRlBERl9DcmVhdGVOZXdEb2N1bWVudCBmdW5jdGlvbi4KKy8vICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERl9Mb2FkRG9jdW1lbnQgb3IgRlBERl9DcmVhdGVOZXdEb2N1bWVudCBmdW5jdGlvbi4KIC8vIFJldHVybiBWYWx1ZToKIC8vICAgICAgICAgIEhhbmRsZSBvZiBpbWFnZSBvYmplY3QuCi1ETExFWFBPUlQgRlBERl9QQUdFT0JKRUNUIFNURENBTEwgRlBERlBhZ2VPYmpfTmV3SW1nZU9iaihGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKLQorRExMRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBTVERDQUxMCitGUERGUGFnZU9ial9OZXdJbWdlT2JqKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOwogCiAvLyBGdW5jdGlvbjogRlBERkltYWdlT2JqX0xvYWRKcGVnRmlsZQotLy8gICAgICAgICAgTG9hZCBJbWFnZSBmcm9tIGEgSlBFRyBpbWFnZSBmaWxlIGFuZCB0aGVuIHNldCBpdCB0byBhbiBpbWFnZSBvYmplY3QuCisvLyAgICAgICAgICBMb2FkIEltYWdlIGZyb20gYSBKUEVHIGltYWdlIGZpbGUgYW5kIHRoZW4gc2V0IGl0IHRvIGFuIGltYWdlCisvLyAgICAgICAgICBvYmplY3QuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgcGFnZXMgICAgICAgICAgIC0gICBQb2ludGVycyB0byB0aGUgc3RhcnQgb2YgYWxsIGxvYWRlZCBwYWdlcywgY291bGQgYmUgTlVMTC4KKy8vICAgICAgICAgIHBhZ2VzICAgICAgICAgICAtICAgUG9pbnRlcnMgdG8gdGhlIHN0YXJ0IG9mIGFsbCBsb2FkZWQgcGFnZXMsIGNvdWxkCisvLyAgICAgICAgICBiZSBOVUxMLgogLy8gICAgICAgICAgbkNvdW50ICAgICAgICAgIC0gICBOdW1iZXIgb2YgcGFnZXMsIGNvdWxkIGJlIDAuCi0vLyAgICAgICAgICBpbWFnZV9vYmplY3QgICAgLSAgIEhhbmRsZSBvZiBpbWFnZSBvYmplY3QgcmV0dXJuZWQgYnkgRlBERlBhZ2VPYmpfTmV3SW1nZU9iai4KLS8vICAgICAgICAgIGZpbGVBY2Nlc3MgICAgICAtICAgVGhlIGN1c3RvbSBmaWxlIGFjY2VzcyBoYW5kbGVyLCB3aGljaCBzcGVjaWZpZXMgdGhlIEpQRUcgaW1hZ2UgZmlsZS4KKy8vICAgICAgICAgIGltYWdlX29iamVjdCAgICAtICAgSGFuZGxlIG9mIGltYWdlIG9iamVjdCByZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERlBhZ2VPYmpfTmV3SW1nZU9iai4KKy8vICAgICAgICAgIGZpbGVBY2Nlc3MgICAgICAtICAgVGhlIGN1c3RvbSBmaWxlIGFjY2VzcyBoYW5kbGVyLCB3aGljaCBzcGVjaWZpZXMKKy8vICAgICAgICAgIHRoZSBKUEVHIGltYWdlIGZpbGUuCiAvLyAgUmV0dXJuIFZhbHVlOgogLy8gICAgICAgICAgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuCiAvLyAgTm90ZToKLS8vICAgICAgICAgIFRoZSBpbWFnZSBvYmplY3QgbWlnaHQgYWxyZWFkeSBoYXMgYW4gYXNzb2NpYXRlZCBpbWFnZSwgd2hpY2ggaXMgc2hhcmVkIGFuZCBjYWNoZWQgYnkgdGhlIGxvYWRlZCBwYWdlcywgSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIGNsZWFyIHRoZSBjYWNoZSBvZiBpbWFnZSBmb3IgYWxsIHRoZSBsb2FkZWQgcGFnZXMuCisvLyAgICAgICAgICBUaGUgaW1hZ2Ugb2JqZWN0IG1pZ2h0IGFscmVhZHkgaGFzIGFuIGFzc29jaWF0ZWQgaW1hZ2UsIHdoaWNoIGlzCisvLyAgICAgICAgICBzaGFyZWQgYW5kIGNhY2hlZCBieSB0aGUgbG9hZGVkIHBhZ2VzLCBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8KKy8vICAgICAgICAgIGNsZWFyIHRoZSBjYWNoZSBvZiBpbWFnZSBmb3IgYWxsIHRoZSBsb2FkZWQgcGFnZXMuCiAvLyAgICAgICAgICBQYXNzIHBhZ2VzIGFuZCBjb3VudCB0byB0aGlzIEFQSSB0byBjbGVhciB0aGUgaW1hZ2UgY2FjaGUuCi0vLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisvLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZgorLy8gICAgICAgICAgZHluYW1pYyBYRkEgZmllbGRzLgogLy8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGSW1hZ2VPYmpfTG9hZEpwZWdGaWxlKEZQREZfUEFHRSogcGFnZXMsIGludCBuQ291bnQsRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwgRlBERl9GSUxFQUNDRVNTKiBmaWxlQWNjZXNzKTsKLQorRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGUERGSW1hZ2VPYmpfTG9hZEpwZWdGaWxlKEZQREZfUEFHRSogcGFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRklMRUFDQ0VTUyogZmlsZUFjY2Vzcyk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGSW1hZ2VPYmpfU2V0TWF0cml4CiAvLyAgICAgICAgICBTZXQgdGhlIG1hdHJpeCBvZiBhbiBpbWFnZSBvYmplY3QuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgaW1hZ2Vfb2JqZWN0ICAgIC0gICBIYW5kbGUgb2YgaW1hZ2Ugb2JqZWN0IHJldHVybmVkIGJ5IEZQREZQYWdlT2JqX05ld0ltZ2VPYmouCisvLyAgICAgICAgICBpbWFnZV9vYmplY3QgICAgLSAgIEhhbmRsZSBvZiBpbWFnZSBvYmplY3QgcmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZQYWdlT2JqX05ld0ltZ2VPYmouCiAvLyAgICAgICAgICBhICAgICAgICAgICAgICAgLSAgIFRoZSBjb2VmZmljaWVudCAiYSIgb2YgdGhlIG1hdHJpeC4KIC8vICAgICAgICAgIGIgICAgICAgICAgICAgICAtICAgVGhlIGNvZWZmaWNpZW50ICJiIiBvZiB0aGUgbWF0cml4LgogLy8gICAgICAgICAgYyAgICAgICAgICAgICAgIC0gICBUaGUgY29lZmZpY2llbnQgImMiIG9mIHRoZSBtYXRyaXguCkBAIC0yNjEsMjEgKzMxOSwzMiBAQAogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkltYWdlT2JqX1NldE1hdHJpeChGUERGX1BBR0VPQkpFQ1QgaW1hZ2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgYywgZG91YmxlIGQsIGRvdWJsZSBlLCBkb3VibGUgZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGYpOwogCiAvLyBGdW5jdGlvbjogRlBERkltYWdlT2JqX1NldEJpdG1hcAogLy8gICAgICAgICAgU2V0IHRoZSBiaXRtYXAgdG8gYW4gaW1hZ2Ugb2JqZWN0LgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIHBhZ2VzICAgICAgICAgICAtICAgUG9pbnRlcidzIHRvIHRoZSBzdGFydCBvZiBhbGwgbG9hZGVkIHBhZ2VzLgogLy8gICAgICAgICAgbkNvdW50ICAgICAgICAgIC0gICBOdW1iZXIgb2YgcGFnZXMuCi0vLyAgICAgICAgICBpbWFnZV9vYmplY3QgICAgLSAgIEhhbmRsZSBvZiBpbWFnZSBvYmplY3QgcmV0dXJuZWQgYnkgRlBERlBhZ2VPYmpfTmV3SW1nZU9iai4KLS8vICAgICAgICAgIGJpdG1hcCAgICAgICAgICAtICAgVGhlIGhhbmRsZSBvZiB0aGUgYml0bWFwIHdoaWNoIHlvdSB3YW50IHRvIHNldCBpdCB0byB0aGUgaW1hZ2Ugb2JqZWN0LgorLy8gICAgICAgICAgaW1hZ2Vfb2JqZWN0ICAgIC0gICBIYW5kbGUgb2YgaW1hZ2Ugb2JqZWN0IHJldHVybmVkIGJ5CisvLyAgICAgICAgICBGUERGUGFnZU9ial9OZXdJbWdlT2JqLgorLy8gICAgICAgICAgYml0bWFwICAgICAgICAgIC0gICBUaGUgaGFuZGxlIG9mIHRoZSBiaXRtYXAgd2hpY2ggeW91IHdhbnQgdG8gc2V0CisvLyAgICAgICAgICBpdCB0byB0aGUgaW1hZ2Ugb2JqZWN0LgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuCiAvLyBOb3RlczsKLS8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mCisvLyAgICAgICAgICBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZJbWFnZU9ial9TZXRCaXRtYXAoRlBERl9QQUdFKiBwYWdlcyxpbnQgbkNvdW50LEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsIEZQREZfQklUTUFQIGJpdG1hcCk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkltYWdlT2JqX1NldEJpdG1hcChGUERGX1BBR0UqIHBhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JJVE1BUCBiaXRtYXApOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX2V4dC5oIGIvcHVibGljL2ZwZGZfZXh0LmgKaW5kZXggODAxNmQyZS4uYzgwZGNiYiAxMDA2NDQKLS0tIGEvcHVibGljL2ZwZGZfZXh0LmgKKysrIGIvcHVibGljL2ZwZGZfZXh0LmgKQEAgLTEzLDQ1ICsxMyw0NCBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotLy9mbGFncyBmb3IgdHlwZSBvZiB1bnN1cHBvcnQgb2JqZWN0LgotI2RlZmluZSBGUERGX1VOU1BfRE9DX1hGQUZPUk0gICAgICAgICAgICAgICAxCi0jZGVmaW5lIEZQREZfVU5TUF9ET0NfUE9SVEFCTEVDT0xMRUNUSU9OICAgIDIKLSNkZWZpbmUgRlBERl9VTlNQX0RPQ19BVFRBQ0hNRU5UICAgICAgICAgICAgMwotI2RlZmluZSBGUERGX1VOU1BfRE9DX1NFQ1VSSVRZICAgICAgICAgICAgICA0Ci0jZGVmaW5lIEZQREZfVU5TUF9ET0NfU0hBUkVEUkVWSUVXICAgICAgICAgIDUKLSNkZWZpbmUgRlBERl9VTlNQX0RPQ19TSEFSRURGT1JNX0FDUk9CQVQgICAgNgorLy8gZmxhZ3MgZm9yIHR5cGUgb2YgdW5zdXBwb3J0IG9iamVjdC4KKyNkZWZpbmUgRlBERl9VTlNQX0RPQ19YRkFGT1JNIDEKKyNkZWZpbmUgRlBERl9VTlNQX0RPQ19QT1JUQUJMRUNPTExFQ1RJT04gMgorI2RlZmluZSBGUERGX1VOU1BfRE9DX0FUVEFDSE1FTlQgMworI2RlZmluZSBGUERGX1VOU1BfRE9DX1NFQ1VSSVRZIDQKKyNkZWZpbmUgRlBERl9VTlNQX0RPQ19TSEFSRURSRVZJRVcgNQorI2RlZmluZSBGUERGX1VOU1BfRE9DX1NIQVJFREZPUk1fQUNST0JBVCA2CiAjZGVmaW5lIEZQREZfVU5TUF9ET0NfU0hBUkVERk9STV9GSUxFU1lTVEVNIDcKLSNkZWZpbmUgRlBERl9VTlNQX0RPQ19TSEFSRURGT1JNX0VNQUlMICAgICAgOAotI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfM0RBTk5PVCAgICAgICAgICAgICAxMQotI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfTU9WSUUgICAgICAgICAgICAgICAxMgotI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfU09VTkQgICAgICAgICAgICAgICAxMwotI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfU0NSRUVOX01FRElBICAgICAgICAxNAotI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfU0NSRUVOX1JJQ0hNRURJQSAgICAxNQotI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfQVRUQUNITUVOVCAgICAgICAgICAxNgotI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfU0lHICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBGUERGX1VOU1BfRE9DX1NIQVJFREZPUk1fRU1BSUwgOAorI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfM0RBTk5PVCAxMQorI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfTU9WSUUgMTIKKyNkZWZpbmUgRlBERl9VTlNQX0FOTk9UX1NPVU5EIDEzCisjZGVmaW5lIEZQREZfVU5TUF9BTk5PVF9TQ1JFRU5fTUVESUEgMTQKKyNkZWZpbmUgRlBERl9VTlNQX0FOTk9UX1NDUkVFTl9SSUNITUVESUEgMTUKKyNkZWZpbmUgRlBERl9VTlNQX0FOTk9UX0FUVEFDSE1FTlQgMTYKKyNkZWZpbmUgRlBERl9VTlNQX0FOTk9UX1NJRyAxNwogCi10eXBlZGVmIHN0cnVjdCBfVU5TVVBQT1JUX0lORk8KLXsKLSAgICAvKioKLSAgICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDEuCi0gICAgKiovCi0gICAgaW50IHZlcnNpb247Cit0eXBlZGVmIHN0cnVjdCBfVU5TVVBQT1JUX0lORk8geworICAvKioKKyAgKiBWZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAxLgorICAqKi8KKyAgaW50IHZlcnNpb247CiAKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRlNES19VblN1cHBvcnRfSGFuZGxlcgotICAgICogICAgICAgICAgICBVblN1cHBvcnQgT2JqZWN0IHByb2Nlc3MgaGFuZGxpbmcgZnVuY3Rpb24uCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICBZZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBuVHlwZSAgICAgICAtICAgVGhlIHR5cGUgb2YgdW5zdXBwb3J0T2JqZWN0Ci0gICAgKiAgIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIE5vbmUuCi0gICAgKiAqLworICAvKioKKyAgKiBNZXRob2Q6IEZTREtfVW5TdXBwb3J0X0hhbmRsZXIKKyAgKiAgICAgICAgICAgIFVuU3VwcG9ydCBPYmplY3QgcHJvY2VzcyBoYW5kbGluZyBmdW5jdGlvbi4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICBZZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBuVHlwZSAgICAgICAtICAgVGhlIHR5cGUgb2YgdW5zdXBwb3J0T2JqZWN0CisgICogICBSZXR1cm4gdmFsdWU6CisgICogICAgICAgTm9uZS4KKyAgKiAqLwogCi0gICAgdm9pZCgqRlNES19VblN1cHBvcnRfSGFuZGxlcikoc3RydWN0IF9VTlNVUFBPUlRfSU5GTyogcFRoaXMsIGludCBuVHlwZSk7CisgIHZvaWQgKCpGU0RLX1VuU3VwcG9ydF9IYW5kbGVyKShzdHJ1Y3QgX1VOU1VQUE9SVF9JTkZPKiBwVGhpcywgaW50IG5UeXBlKTsKIH0gVU5TVVBQT1JUX0lORk87CiAKIC8qKgpAQCAtNjMsMzcgKzYyLDQwIEBACiAgKiAgICAgICAgICBUUlVFIG1lYW5zIHN1Y2Nlc3NmdWwuIEZBTFNFIG1lYW5zIGZhaWxzLgogICoqLwogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlNES19TZXRVblNwT2JqUHJvY2Vzc0hhbmRsZXIoVU5TVVBQT1JUX0lORk8qIHVuc3BfaW5mbyk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwKK0ZTREtfU2V0VW5TcE9ialByb2Nlc3NIYW5kbGVyKFVOU1VQUE9SVF9JTkZPKiB1bnNwX2luZm8pOwogCi0vL2ZsYWdzIGZvciBwYWdlIG1vZGUuCisvLyBmbGFncyBmb3IgcGFnZSBtb2RlLgogCi0vL1Vua25vd24gdmFsdWUKLSNkZWZpbmUgUEFHRU1PREVfVU5LTk9XTiAgICAgICAgLTEKKy8vIFVua25vd24gdmFsdWUKKyNkZWZpbmUgUEFHRU1PREVfVU5LTk9XTiAtMQogCi0vL05laXRoZXIgZG9jdW1lbnQgb3V0bGluZSBub3IgdGh1bWJuYWlsIGltYWdlcyB2aXNpYmxlCi0jZGVmaW5lIFBBR0VNT0RFX1VTRU5PTkUgICAgICAgIDAKKy8vIE5laXRoZXIgZG9jdW1lbnQgb3V0bGluZSBub3IgdGh1bWJuYWlsIGltYWdlcyB2aXNpYmxlCisjZGVmaW5lIFBBR0VNT0RFX1VTRU5PTkUgMAogCi0vL0RvY3VtZW50IG91dGxpbmUgdmlzaWJsZQotI2RlZmluZSBQQUdFTU9ERV9VU0VPVVRMSU5FUyAgICAxCisvLyBEb2N1bWVudCBvdXRsaW5lIHZpc2libGUKKyNkZWZpbmUgUEFHRU1PREVfVVNFT1VUTElORVMgMQogCi0vL1RodW1ibmlhbCBpbWFnZXMgdmlzaWJsZQotI2RlZmluZSBQQUdFTU9ERV9VU0VUSFVNQlMgICAgICAyCisvLyBUaHVtYm5pYWwgaW1hZ2VzIHZpc2libGUKKyNkZWZpbmUgUEFHRU1PREVfVVNFVEhVTUJTIDIKIAotLy9GdWxsLXNjcmVlbiBtb2RlLCB3aXRoIG5vIG1lbnUgYmFyLCB3aW5kb3cgY29udHJvbHMsIG9yIGFueSBvdGhlciB3aW5kb3cgdmlzaWJsZQotI2RlZmluZSBQQUdFTU9ERV9GVUxMU0NSRUVOICAgICAzCisvLyBGdWxsLXNjcmVlbiBtb2RlLCB3aXRoIG5vIG1lbnUgYmFyLCB3aW5kb3cgY29udHJvbHMsIG9yIGFueSBvdGhlciB3aW5kb3cKKy8vIHZpc2libGUKKyNkZWZpbmUgUEFHRU1PREVfRlVMTFNDUkVFTiAzCiAKLS8vT3B0aW9uYWwgY29udGVudCBncm91cCBwYW5lbCB2aXNpYmxlCi0jZGVmaW5lIFBBR0VNT0RFX1VTRU9DICAgICAgICAgIDQKKy8vIE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgcGFuZWwgdmlzaWJsZQorI2RlZmluZSBQQUdFTU9ERV9VU0VPQyA0CiAKLS8vQXR0YWNobWVudHMgcGFuZWwgdmlzaWJsZQorLy8gQXR0YWNobWVudHMgcGFuZWwgdmlzaWJsZQogI2RlZmluZSBQQUdFTU9ERV9VU0VBVFRBQ0hNRU5UUyA1CiAKLQogLyoqCiAgKiBGdW5jdGlvbjogRlBERkRvY19HZXRQYWdlTW9kZQotICogICAgICAgICAgIEdldCB0aGUgZG9jdW1lbnQncyBQYWdlTW9kZShIb3cgdGhlIGRvY3VtZW50IHNob3VsZCBiZSBkaXNwbGF5ZWQgd2hlbiBvcGVuZWQpCisgKiAgICAgICAgICAgR2V0IHRoZSBkb2N1bWVudCdzIFBhZ2VNb2RlKEhvdyB0aGUgZG9jdW1lbnQgc2hvdWxkIGJlIGRpc3BsYXllZAorICp3aGVuIG9wZW5lZCkKICAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICBkb2MgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICogICAgICAgICAgZG9jICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudAorICpmdW5jdGlvbi4KICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIFRoZSBmbGFncyBmb3IgcGFnZSBtb2RlLgogICoqLwpkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZfZmxhdHRlbi5oIGIvcHVibGljL2ZwZGZfZmxhdHRlbi5oCmluZGV4IDNhZTNjZDUuLjU0OTY4NDYgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX2ZsYXR0ZW4uaAorKysgYi9wdWJsaWMvZnBkZl9mbGF0dGVuLmgKQEAgLTEwLDI4ICsxMCwzMyBAQAogI2luY2x1ZGUgImZwZGZ2aWV3LmgiCiAKIC8vIFJlc3VsdCBjb2Rlcy4KLSNkZWZpbmUgRkxBVFRFTl9GQUlMICAgICAgICAgICAgMCAgIC8vIEZsYXR0ZW4gb3BlcmF0aW9uIGZhaWxlZC4KLSNkZWZpbmUgRkxBVFRFTl9TVUNDRVNTICAgICAgICAgMSAgIC8vIEZsYXR0ZW4gb3BlcmF0aW9uIHN1Y2NlZWQuCi0jZGVmaW5lIEZMQVRURU5fTk9USElOR1RPRE8gICAgIDIgICAvLyBUaGVyZSBpcyBub3RoaW5nIHRvIGJlIGZsYXR0ZW5lZC4KKyNkZWZpbmUgRkxBVFRFTl9GQUlMIDAgICAgICAgICAvLyBGbGF0dGVuIG9wZXJhdGlvbiBmYWlsZWQuCisjZGVmaW5lIEZMQVRURU5fU1VDQ0VTUyAxICAgICAgLy8gRmxhdHRlbiBvcGVyYXRpb24gc3VjY2VlZC4KKyNkZWZpbmUgRkxBVFRFTl9OT1RISU5HVE9ETyAyICAvLyBUaGVyZSBpcyBub3RoaW5nIHRvIGJlIGZsYXR0ZW5lZC4KIAogLy8gRmxhZ3MuCi0jZGVmaW5lIEZMQVRfTk9STUFMRElTUExBWSAgICAgMAotI2RlZmluZSBGTEFUX1BSSU5UICAgICAgICAgICAgIDEKKyNkZWZpbmUgRkxBVF9OT1JNQUxESVNQTEFZIDAKKyNkZWZpbmUgRkxBVF9QUklOVCAxCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAogLy8gRnVuY3Rpb246IEZQREZQYWdlX0ZsYXR0ZW4KLS8vICAgICAgICAgIE1ha2UgYW5ub3RhdGlvbnMgYW5kIGZvcm0gZmllbGRzIGJlY29tZSBwYXJ0IG9mIHRoZSBwYWdlIGNvbnRlbnRzIGl0c2VsZi4KKy8vICAgICAgICAgIE1ha2UgYW5ub3RhdGlvbnMgYW5kIGZvcm0gZmllbGRzIGJlY29tZSBwYXJ0IG9mIHRoZSBwYWdlIGNvbnRlbnRzCisvLyAgICAgICAgICBpdHNlbGYuCiAvLyBQYXJhbWV0ZXJzOgogLy8gICAgICAgICAgcGFnZSAgLSBIYW5kbGUgdG8gdGhlIHBhZ2UsIGFzIHJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UoKS4KLS8vICAgICAgICAgIG5GbGFnIC0gSW50ZW5kZWQgdXNlIG9mIHRoZSBmbGF0dGVuZWQgcmVzdWx0OiAwIGZvciBub3JtYWwgZGlzcGxheSwgMSBmb3IgcHJpbnRpbmcuCisvLyAgICAgICAgICBuRmxhZyAtIEludGVuZGVkIHVzZSBvZiB0aGUgZmxhdHRlbmVkIHJlc3VsdDogMCBmb3Igbm9ybWFsIGRpc3BsYXksCisvLyAgICAgICAgICAxIGZvciBwcmludGluZy4KIC8vIFJldHVybiB2YWx1ZToKLS8vICAgICAgICAgIEVpdGhlciBGTEFUVEVOX0ZBSUwsIEZMQVRURU5fU1VDQ0VTUywgb3IgRkxBVFRFTl9OT1RISU5HVE9ETyAoc2VlIGFib3ZlKS4KKy8vICAgICAgICAgIEVpdGhlciBGTEFUVEVOX0ZBSUwsIEZMQVRURU5fU1VDQ0VTUywgb3IgRkxBVFRFTl9OT1RISU5HVE9ETyAoc2VlCisvLyAgICAgICAgICBhYm92ZSkuCiAvLyBDb21tZW50czoKLS8vICAgICAgICAgIEN1cnJlbnRseSwgYWxsIGZhaWx1cmVzIHJldHVybiBGTEFUVEVOX0ZBSUwsIHdpdGggbm8gaW5kaWNhdGlvbiBmb3IgdGhlIHJlYXNvbgotLy8gICAgICAgICAgZm9yIHRoZSBmYWlsdXJlLiBUaGUgbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgZmxhdHRlbmluZyBhbnkgZHluYW1pYyBYRkEgZmllbGRzLgorLy8gICAgICAgICAgQ3VycmVudGx5LCBhbGwgZmFpbHVyZXMgcmV0dXJuIEZMQVRURU5fRkFJTCwgd2l0aCBubyBpbmRpY2F0aW9uIGZvcgorLy8gICAgICAgICAgdGhlIHJlYXNvbgorLy8gICAgICAgICAgZm9yIHRoZSBmYWlsdXJlLiBUaGUgbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgZmxhdHRlbmluZyBhbnkgZHluYW1pYworLy8gICAgICAgICAgWEZBIGZpZWxkcy4KIERMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9GbGF0dGVuKEZQREZfUEFHRSBwYWdlLCBpbnQgbkZsYWcpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX2Zvcm1maWxsLmggYi9wdWJsaWMvZnBkZl9mb3JtZmlsbC5oCmluZGV4IGZkYTBhODcuLjBiNDJjYWMgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX2Zvcm1maWxsLmgKKysrIGIvcHVibGljL2ZwZGZfZm9ybWZpbGwuaApAQCAtMTEsMjgyICsxMSwzNDggQEAKIAogdHlwZWRlZiB2b2lkKiBGUERGX0ZPUk1IQU5ETEU7CiAKLSNkZWZpbmUgRE9DVFlQRV9QREYgICAgICAgICAgMCAvL05vcm1hbCBwZGYgRG9jdW1lbnQKLSNkZWZpbmUgRE9DVFlQRV9EWU5JTUlDX1hGQSAgMSAvL0R5bmltaWMgeGZhIERvY3VtZW50IFR5cGUKLSNkZWZpbmUgRE9DVFlQRV9TVEFUSUNfWEZBICAgMiAvL1N0YXRpYyB4ZmEgRG9jdW1lbnQgVHlwZQorI2RlZmluZSBET0NUWVBFX1BERiAwICAvLyBOb3JtYWwgcGRmIERvY3VtZW50CisjZGVmaW5lIERPQ1RZUEVfRFlOSU1JQ19YRkEgMSAgLy8gRHluaW1pYyB4ZmEgRG9jdW1lbnQgVHlwZQorI2RlZmluZSBET0NUWVBFX1NUQVRJQ19YRkEgMiAgLy8gU3RhdGljIHhmYSBEb2N1bWVudCBUeXBlCiAKIC8vIEV4cG9ydGVkIEZ1bmN0aW9ucwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi10eXBlZGVmIHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtCi17Ci0gICAgLyoqCi0gICAgKiBWZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAyLgotICAgICoqLwotICAgIGludCB2ZXJzaW9uOwordHlwZWRlZiBzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSB7CisgIC8qKgorICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDIuCisgICoqLworICBpbnQgdmVyc2lvbjsKIAotICAgIC8qIFZlcnNpb24gMS4gKi8KKyAgLyogVmVyc2lvbiAxLiAqLwogCi0gICAgLyoqCi0gICAgKiBNZXRob2Q6IGFwcF9hbGVydAotICAgICogICAgICAgICAgIHBvcCB1cCBhIGRpYWxvZyB0byBzaG93IHdhcm5pbmcgb3IgaGludC4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAqICAgICAgICAgICBNc2cgICAgICAgICAtICAgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQuCi0gICAgKiAgICAgICAgICAgVGl0bGUgICAgICAgLSAgIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nLgotICAgICogICAgICAgICAgIFR5cGUgICAgICAgIC0gICBUaGUgc3R5cGUgb2YgYnV0dG9uIGdyb3VwLgotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAwLU9LKGRlZmF1bHQpOwotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAxLU9LLENhbmNlbDsKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMi1ZZXMsTk87Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMtWWVzLCBOTywgQ2FuY2VsLgotICAgICogICAgICAgICAgIG5JY29uICAgICAgIC0gICBUaGUgSWNvbiB0eXBlLgotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAwLUVycm9yKGRlZmF1bHQpOwotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAxLVdhcm5pbmc7Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDItUXVlc3Rpb247Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMtU3RhdHVzLgotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA0LUFzdGVyaXNrCisgIC8qKgorICAqIE1ldGhvZDogYXBwX2FsZXJ0CisgICogICAgICAgICAgIHBvcCB1cCBhIGRpYWxvZyB0byBzaG93IHdhcm5pbmcgb3IgaGludC4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKKyAgKiAgICAgICAgICAgTXNnICAgICAgICAgLSAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLgorICAqICAgICAgICAgICBUaXRsZSAgICAgICAtICAgVGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cuCisgICogICAgICAgICAgIFR5cGUgICAgICAgIC0gICBUaGUgc3R5cGUgb2YgYnV0dG9uIGdyb3VwLgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMC1PSyhkZWZhdWx0KTsKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEtT0ssQ2FuY2VsOworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMi1ZZXMsTk87CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAzLVllcywgTk8sIENhbmNlbC4KKyAgKiAgICAgICAgICAgbkljb24gICAgICAgLSAgIFRoZSBJY29uIHR5cGUuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAwLUVycm9yKGRlZmF1bHQpOworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMS1XYXJuaW5nOworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMi1RdWVzdGlvbjsKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMtU3RhdHVzLgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgNC1Bc3RlcmlzawogCi0gICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgKiAgICAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBjb3VsZCBiZSB0aGUgZm9sb3dpbmcgdHlwZToKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMS1PSzsKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMi1DYW5jZWw7Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMtTk87Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDQtWWVzOwotICAgICovCi0gICAgaW50ICgqYXBwX2FsZXJ0KShzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSogcFRoaXMsIEZQREZfV0lERVNUUklORyBNc2csIEZQREZfV0lERVNUUklORyBUaXRsZSwgaW50IFR5cGUsIGludCBJY29uKTsKKyAgKiBSZXR1cm4gVmFsdWU6CisgICogICAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgY291bGQgYmUgdGhlIGZvbG93aW5nIHR5cGU6CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAxLU9LOworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMi1DYW5jZWw7CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAzLU5POworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgNC1ZZXM7CisgICovCisgIGludCAoKmFwcF9hbGVydCkoc3RydWN0IF9JUERGX0pzUGxhdGZvcm0qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBNc2csCisgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIFRpdGxlLAorICAgICAgICAgICAgICAgICAgIGludCBUeXBlLAorICAgICAgICAgICAgICAgICAgIGludCBJY29uKTsKIAotICAgIC8qKgotICAgICogTWV0aG9kOiBhcHBfYmVlcAotICAgICogICAgICAgICAgIENhdXNlcyB0aGUgc3lzdGVtIHRvIHBsYXkgYSBzb3VuZC4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAqICAgICAgICAgICBuVHlwZSAgICAgICAtICAgVGhlIHNvdW5kIHR5cGUuCi0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBFcnJvcgotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gV2FybmluZwotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0gUXVlc3Rpb24KLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAtIFN0YXR1cwotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICA0IC0gRGVmYXVsdCAoZGVmYXVsdCB2YWx1ZSkKLSAgICAqIFJldHVybiBWYWx1ZToKLSAgICAqICAgICAgICAgICBOb25lCi0gICAgKi8KLSAgICB2b2lkICgqYXBwX2JlZXApKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywgIGludCBuVHlwZSk7CisgIC8qKgorICAqIE1ldGhvZDogYXBwX2JlZXAKKyAgKiAgICAgICAgICAgQ2F1c2VzIHRoZSBzeXN0ZW0gdG8gcGxheSBhIHNvdW5kLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgorICAqICAgICAgICAgICBuVHlwZSAgICAgICAtICAgVGhlIHNvdW5kIHR5cGUuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gRXJyb3IKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBXYXJuaW5nCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0gUXVlc3Rpb24KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgLSBTdGF0dXMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgLSBEZWZhdWx0IChkZWZhdWx0IHZhbHVlKQorICAqIFJldHVybiBWYWx1ZToKKyAgKiAgICAgICAgICAgTm9uZQorICAqLworICB2b2lkICgqYXBwX2JlZXApKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywgaW50IG5UeXBlKTsKIAotICAgIC8qKgotICAgICogTWV0aG9kOiBhcHBfcmVzcG9uc2UKLSAgICAqICAgICAgICAgICBEaXNwbGF5cyBhIGRpYWxvZyBib3ggY29udGFpbmluZyBhIHF1ZXN0aW9uIGFuZCBhbiBlbnRyeSBmaWVsZCBmb3IgdGhlIHVzZXIgdG8gcmVwbHkgdG8gdGhlIHF1ZXN0aW9uLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgotICAgICogICAgICAgICAgIFF1ZXN0aW9uICAgIC0gICBUaGUgcXVlc3Rpb24gdG8gYmUgcG9zZWQgdG8gdGhlIHVzZXIuCi0gICAgKiAgICAgICAgICAgVGl0bGUgICAgICAgLSAgIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIGJveC4KLSAgICAqICAgICAgICAgICBEZWZhdWx0ICAgICAtICAgQSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYW5zd2VyIHRvIHRoZSBxdWVzdGlvbi4gSWYgbm90IHNwZWNpZmllZCwgbm8gZGVmYXVsdCB2YWx1ZSBpcyBwcmVzZW50ZWQuCi0gICAgKiAgICAgICAgICAgY0xhYmVsICAgICAgLSAgIEEgc2hvcnQgc3RyaW5nIHRvIGFwcGVhciBpbiBmcm9udCBvZiBhbmQgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgZWRpdCB0ZXh0IGZpZWxkLgotICAgICogICAgICAgICAgIGJQYXNzd29yZCAgIC0gICBJZiB0cnVlLCBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlcidzIHJlc3BvbnNlIHNob3VsZCBzaG93IGFzIGFzdGVyaXNrcyAoKikgb3IgYnVsbGV0cyAoPykgdG8gbWFzayB0aGUgcmVzcG9uc2UsIHdoaWNoIG1pZ2h0IGJlIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0gICAgKiAgICAgICAgICAgcmVzcG9uc2UgICAgLSAgIEEgc3RyaW5nIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgU0RLLCB0byByZWNlaXZlIHRoZSB1c2VyJ3MgcmVzcG9uc2UuCi0gICAgKiAgICAgICAgICAgbGVuZ3RoICAgICAgLSAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLiBDdXJyZW50bHksIEl0J3MgYWx3YXlzIGJlIDIwNDguCi0gICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgKiAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdGhlIGNvbXBsZXRlIHVzZXIgaW5wdXQgd291bGQgYWN0dWFsbHkgcmVxdWlyZSwgbm90IGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvcywgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhlIGxlbmd0aAotICAgICogICAgICAgcGFyYW1ldGVyIG9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgcmVzcG9uc2UgYnVmZmVyLgotICAgICogQ29tbWVudHM6Ci0gICAgKiAgICAgICBObyBtYXR0ZXIgb24gd2hhdCBwbGF0Zm9ybSwgdGhlIHJlc3BvbnNlIGJ1ZmZlciBzaG91bGQgYmUgYWx3YXlzIHdyaXR0ZW4gdXNpbmcgVVRGLTE2TEUgZW5jb2RpbmcuIElmIGEgcmVzcG9uc2UgYnVmZmVyIGlzCi0gICAgKiAgICAgICBwcmVzZW50IGFuZCB0aGUgc2l6ZSBvZiB0aGUgdXNlciBpbnB1dCBleGNlZWRzIHRoZSBjYXBhY2l0eSBvZiB0aGUgYnVmZmVyIGFzIHNwZWNpZmllZCBieSB0aGUgbGVuZ3RoIHBhcmFtZXRlciwgb25seSB0aGUKLSAgICAqICAgICAgIGZpcnN0ICJsZW5ndGgiIGJ5dGVzIG9mIHRoZSB1c2VyIGlucHV0IGFyZSB0byBiZSB3cml0dGVuIHRvIHRoZSBidWZmZXIuCi0gICAgKi8KLSAgICBpbnQgKCphcHBfcmVzcG9uc2UpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywgRlBERl9XSURFU1RSSU5HIFF1ZXN0aW9uLCBGUERGX1dJREVTVFJJTkcgVGl0bGUsIEZQREZfV0lERVNUUklORyBEZWZhdWx0LCBGUERGX1dJREVTVFJJTkcgY0xhYmVsLCBGUERGX0JPT0wgYlBhc3N3b3JkLCB2b2lkKiByZXNwb25zZSwgaW50IGxlbmd0aCk7CisgIC8qKgorICAqIE1ldGhvZDogYXBwX3Jlc3BvbnNlCisgICogICAgICAgICAgIERpc3BsYXlzIGEgZGlhbG9nIGJveCBjb250YWluaW5nIGEgcXVlc3Rpb24gYW5kIGFuIGVudHJ5IGZpZWxkIGZvcgorICAqIHRoZSB1c2VyIHRvIHJlcGx5IHRvIHRoZSBxdWVzdGlvbi4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKKyAgKiAgICAgICAgICAgUXVlc3Rpb24gICAgLSAgIFRoZSBxdWVzdGlvbiB0byBiZSBwb3NlZCB0byB0aGUgdXNlci4KKyAgKiAgICAgICAgICAgVGl0bGUgICAgICAgLSAgIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIGJveC4KKyAgKiAgICAgICAgICAgRGVmYXVsdCAgICAgLSAgIEEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGFuc3dlciB0byB0aGUgcXVlc3Rpb24uIElmCisgICogbm90IHNwZWNpZmllZCwgbm8gZGVmYXVsdCB2YWx1ZSBpcyBwcmVzZW50ZWQuCisgICogICAgICAgICAgIGNMYWJlbCAgICAgIC0gICBBIHNob3J0IHN0cmluZyB0byBhcHBlYXIgaW4gZnJvbnQgb2YgYW5kIG9uIHRoZQorICAqIHNhbWUgbGluZSBhcyB0aGUgZWRpdCB0ZXh0IGZpZWxkLgorICAqICAgICAgICAgICBiUGFzc3dvcmQgICAtICAgSWYgdHJ1ZSwgaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIncyByZXNwb25zZSBzaG91bGQKKyAgKiBzaG93IGFzIGFzdGVyaXNrcyAoKikgb3IgYnVsbGV0cyAoPykgdG8gbWFzayB0aGUgcmVzcG9uc2UsIHdoaWNoIG1pZ2h0IGJlCisgICogc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiBUaGUgZGVmYXVsdCBpcyBmYWxzZS4KKyAgKiAgICAgICAgICAgcmVzcG9uc2UgICAgLSAgIEEgc3RyaW5nIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgU0RLLCB0byByZWNlaXZlIHRoZQorICAqIHVzZXIncyByZXNwb25zZS4KKyAgKiAgICAgICAgICAgbGVuZ3RoICAgICAgLSAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLgorICAqIEN1cnJlbnRseSwgSXQncyBhbHdheXMgYmUgMjA0OC4KKyAgKiBSZXR1cm4gVmFsdWU6CisgICogICAgICAgTnVtYmVyIG9mIGJ5dGVzIHRoZSBjb21wbGV0ZSB1c2VyIGlucHV0IHdvdWxkIGFjdHVhbGx5IHJlcXVpcmUsIG5vdAorICAqIGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvcywgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhlIGxlbmd0aAorICAqICAgICAgIHBhcmFtZXRlciBvciB0aGUgcHJlc2VuY2Ugb2YgdGhlIHJlc3BvbnNlIGJ1ZmZlci4KKyAgKiBDb21tZW50czoKKyAgKiAgICAgICBObyBtYXR0ZXIgb24gd2hhdCBwbGF0Zm9ybSwgdGhlIHJlc3BvbnNlIGJ1ZmZlciBzaG91bGQgYmUgYWx3YXlzCisgICogd3JpdHRlbiB1c2luZyBVVEYtMTZMRSBlbmNvZGluZy4gSWYgYSByZXNwb25zZSBidWZmZXIgaXMKKyAgKiAgICAgICBwcmVzZW50IGFuZCB0aGUgc2l6ZSBvZiB0aGUgdXNlciBpbnB1dCBleGNlZWRzIHRoZSBjYXBhY2l0eSBvZiB0aGUKKyAgKiBidWZmZXIgYXMgc3BlY2lmaWVkIGJ5IHRoZSBsZW5ndGggcGFyYW1ldGVyLCBvbmx5IHRoZQorICAqICAgICAgIGZpcnN0ICJsZW5ndGgiIGJ5dGVzIG9mIHRoZSB1c2VyIGlucHV0IGFyZSB0byBiZSB3cml0dGVuIHRvIHRoZQorICAqIGJ1ZmZlci4KKyAgKi8KKyAgaW50ICgqYXBwX3Jlc3BvbnNlKShzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIFF1ZXN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBUaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgY0xhYmVsLAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiUGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCk7CiAKLSAgICAvKgotICAgICogTWV0aG9kOiBEb2NfZ2V0RmlsZVBhdGgKLSAgICAqICAgICAgICAgICBHZXQgdGhlIGZpbGUgcGF0aCBvZiB0aGUgY3VycmVudCBkb2N1bWVudC4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAqICAgICAgICAgICBmaWxlUGF0aCAgICAtICAgVGhlIHN0cmluZyBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgZmlsZSBwYXRoLiBDYW4gYmUgTlVMTC4KLSAgICAqICAgICAgICAgICBsZW5ndGggICAgICAtICAgVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBudW1iZXIgb2YgYnl0ZXMuIENhbiBiZSAwLgotICAgICogUmV0dXJuIFZhbHVlOgotICAgICogICAgICAgTnVtYmVyIG9mIGJ5dGVzIHRoZSBmaWxlUGF0aCBjb25zdW1lcywgaW5jbHVkaW5nIHRyYWlsaW5nIHplcm9zLgotICAgICogQ29tbWVudHM6Ci0gICAgKiAgICAgICBUaGUgZmlsZVBhdGggc2hvdWxkIGJlIGFsd2F5cyBpbnB1dCBpbiBsb2NhbCBlbmNvZGluZy4KLSAgICAqCi0gICAgKiAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGFsd2F5cyBpbmRpY2F0ZWQgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgYnVmZmVyLCBldmVuIHdoZW4gdGhlcmUgaXMKLSAgICAqICAgICAgIG5vIGJ1ZmZlciBzcGVjaWZpZWQsIG9yIHRoZSBidWZmZXIgc2l6ZSBpcyBsZXNzIHRoZW4gcmVxdWlyZWQuIEluIHRoaXMgY2FzZSwgdGhlIGJ1ZmZlciB3aWxsIG5vdAotICAgICogICAgICAgYmUgbW9kaWZpZWQuCi0gICAgKi8KLSAgICBpbnQgKCpEb2NfZ2V0RmlsZVBhdGgpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywgdm9pZCogZmlsZVBhdGgsIGludCBsZW5ndGgpOworICAvKgorICAqIE1ldGhvZDogRG9jX2dldEZpbGVQYXRoCisgICogICAgICAgICAgIEdldCB0aGUgZmlsZSBwYXRoIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgorICAqICAgICAgICAgICBmaWxlUGF0aCAgICAtICAgVGhlIHN0cmluZyBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgZmlsZSBwYXRoLiBDYW4gYmUKKyAgKiBOVUxMLgorICAqICAgICAgICAgICBsZW5ndGggICAgICAtICAgVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBudW1iZXIgb2YgYnl0ZXMuIENhbiBiZQorICAqIDAuCisgICogUmV0dXJuIFZhbHVlOgorICAqICAgICAgIE51bWJlciBvZiBieXRlcyB0aGUgZmlsZVBhdGggY29uc3VtZXMsIGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvcy4KKyAgKiBDb21tZW50czoKKyAgKiAgICAgICBUaGUgZmlsZVBhdGggc2hvdWxkIGJlIGFsd2F5cyBpbnB1dCBpbiBsb2NhbCBlbmNvZGluZy4KKyAgKgorICAqICAgICAgIFRoZSByZXR1cm4gdmFsdWUgYWx3YXlzIGluZGljYXRlZCBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZQorICAqIGJ1ZmZlciwgZXZlbiB3aGVuIHRoZXJlIGlzCisgICogICAgICAgbm8gYnVmZmVyIHNwZWNpZmllZCwgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4gdGhpcworICAqIGNhc2UsIHRoZSBidWZmZXIgd2lsbCBub3QKKyAgKiAgICAgICBiZSBtb2RpZmllZC4KKyAgKi8KKyAgaW50ICgqRG9jX2dldEZpbGVQYXRoKShzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCk7CiAKKyAgLyoKKyAgKiBNZXRob2Q6IERvY19tYWlsCisgICogICAgICAgICAgIE1haWxzIHRoZSBkYXRhIGJ1ZmZlciBhcyBhbiBhdHRhY2htZW50IHRvIGFsbCByZWNpcGllbnRzLCB3aXRoIG9yCisgICogd2l0aG91dCB1c2VyIGludGVyYWN0aW9uLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgorICAqICAgICAgICAgICBtYWlsRGF0YSAgICAtICAgUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgdG8gYmUgc2VudC5DYW4gYmUgTlVMTC4KKyAgKiAgICAgICAgICAgbGVuZ3RoICAgICAgLSAgIFRoZSBzaXplLGluIGJ5dGVzLCBvZiB0aGUgYnVmZmVyIHBvaW50ZWQgYnkKKyAgKiBtYWlsRGF0YSBwYXJhbWV0ZXIuQ2FuIGJlIDAuCisgICogICAgICAgICAgIGJVSSAgICAgICAgIC0gICBJZiB0cnVlLCB0aGUgcmVzdCBvZiB0aGUgcGFyYW1ldGVycyBhcmUgdXNlZCBpbiBhCisgICogY29tcG9zZS1uZXctbWVzc2FnZSB3aW5kb3cgdGhhdCBpcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuIElmIGZhbHNlLCB0aGUgY1RvCisgICogcGFyYW1ldGVyIGlzIHJlcXVpcmVkIGFuZCBhbGwgb3RoZXJzIGFyZSBvcHRpb25hbC4KKyAgKiAgICAgICAgICAgVG8gICAgICAgICAgLSAgIEEgc2VtaWNvbG9uLWRlbGltaXRlZCBsaXN0IG9mIHJlY2lwaWVudHMgZm9yIHRoZQorICAqIG1lc3NhZ2UuCisgICogICAgICAgICAgIFN1YmplY3QgICAgIC0gICBUaGUgc3ViamVjdCBvZiB0aGUgbWVzc2FnZS4gVGhlIGxlbmd0aCBsaW1pdCBpcyA2NAorICAqIEtCLgorICAqICAgICAgICAgICBDQyAgICAgICAgICAtICAgQSBzZW1pY29sb24tZGVsaW1pdGVkIGxpc3Qgb2YgQ0MgcmVjaXBpZW50cyBmb3IKKyAgKiB0aGUgbWVzc2FnZS4KKyAgKiAgICAgICAgICAgQkNDICAgICAgICAgLSAgIEEgc2VtaWNvbG9uLWRlbGltaXRlZCBsaXN0IG9mIEJDQyByZWNpcGllbnRzIGZvcgorICAqIHRoZSBtZXNzYWdlLgorICAqICAgICAgICAgICBNc2cgICAgICAgICAtICAgVGhlIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UuIFRoZSBsZW5ndGggbGltaXQgaXMgNjQKKyAgKiBLQi4KKyAgKiBSZXR1cm4gVmFsdWU6CisgICogICAgICAgICAgIE5vbmUuCisgICogQ29tbWVudHM6CisgICogICAgICAgICAgIElmIHRoZSBwYXJhbWV0ZXIgbWFpbERhdGEgaXMgTlVMTCBvciBsZW5ndGggaXMgMCwgdGhlIGN1cnJlbnQKKyAgKiBkb2N1bWVudCB3aWxsIGJlIG1haWxlZCBhcyBhbiBhdHRhY2htZW50IHRvIGFsbCByZWNpcGllbnRzLgorICAqLworICB2b2lkICgqRG9jX21haWwpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICB2b2lkKiBtYWlsRGF0YSwKKyAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiVUksCisgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIFRvLAorICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBTdWJqZWN0LAorICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBDQywKKyAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgQkNDLAorICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBNc2cpOwogCi0gICAgLyoKLSAgICAqIE1ldGhvZDogRG9jX21haWwKLSAgICAqICAgICAgICAgICBNYWlscyB0aGUgZGF0YSBidWZmZXIgYXMgYW4gYXR0YWNobWVudCB0byBhbGwgcmVjaXBpZW50cywgd2l0aCBvciB3aXRob3V0IHVzZXIgaW50ZXJhY3Rpb24uCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgKiAgICAgICAgICAgbWFpbERhdGEgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyIHRvIGJlIHNlbnQuQ2FuIGJlIE5VTEwuCi0gICAgKiAgICAgICAgICAgbGVuZ3RoICAgICAgLSAgIFRoZSBzaXplLGluIGJ5dGVzLCBvZiB0aGUgYnVmZmVyIHBvaW50ZWQgYnkgbWFpbERhdGEgcGFyYW1ldGVyLkNhbiBiZSAwLgotICAgICogICAgICAgICAgIGJVSSAgICAgICAgIC0gICBJZiB0cnVlLCB0aGUgcmVzdCBvZiB0aGUgcGFyYW1ldGVycyBhcmUgdXNlZCBpbiBhIGNvbXBvc2UtbmV3LW1lc3NhZ2Ugd2luZG93IHRoYXQgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyLiBJZiBmYWxzZSwgdGhlIGNUbyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgYW5kIGFsbCBvdGhlcnMgYXJlIG9wdGlvbmFsLgotICAgICogICAgICAgICAgIFRvICAgICAgICAgIC0gICBBIHNlbWljb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiByZWNpcGllbnRzIGZvciB0aGUgbWVzc2FnZS4KLSAgICAqICAgICAgICAgICBTdWJqZWN0ICAgICAtICAgVGhlIHN1YmplY3Qgb2YgdGhlIG1lc3NhZ2UuIFRoZSBsZW5ndGggbGltaXQgaXMgNjQgS0IuCi0gICAgKiAgICAgICAgICAgQ0MgICAgICAgICAgLSAgIEEgc2VtaWNvbG9uLWRlbGltaXRlZCBsaXN0IG9mIENDIHJlY2lwaWVudHMgZm9yIHRoZSBtZXNzYWdlLgotICAgICogICAgICAgICAgIEJDQyAgICAgICAgIC0gICBBIHNlbWljb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiBCQ0MgcmVjaXBpZW50cyBmb3IgdGhlIG1lc3NhZ2UuCi0gICAgKiAgICAgICAgICAgTXNnICAgICAgICAgLSAgIFRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlLiBUaGUgbGVuZ3RoIGxpbWl0IGlzIDY0IEtCLgotICAgICogUmV0dXJuIFZhbHVlOgotICAgICogICAgICAgICAgIE5vbmUuCi0gICAgKiBDb21tZW50czoKLSAgICAqICAgICAgICAgICBJZiB0aGUgcGFyYW1ldGVyIG1haWxEYXRhIGlzIE5VTEwgb3IgbGVuZ3RoIGlzIDAsIHRoZSBjdXJyZW50IGRvY3VtZW50IHdpbGwgYmUgbWFpbGVkIGFzIGFuIGF0dGFjaG1lbnQgdG8gYWxsIHJlY2lwaWVudHMuCi0gICAgKi8KLSAgICB2b2lkICgqRG9jX21haWwpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcyx2b2lkKiBtYWlsRGF0YSwgaW50IGxlbmd0aCxGUERGX0JPT0wgYlVJLCBGUERGX1dJREVTVFJJTkcgVG8sIEZQREZfV0lERVNUUklORyBTdWJqZWN0LCBGUERGX1dJREVTVFJJTkcgQ0MsIEZQREZfV0lERVNUUklORyBCQ0MsIEZQREZfV0lERVNUUklORyBNc2cpOworICAvKgorICAqIE1ldGhvZDogRG9jX3ByaW50CisgICogICAgICAgICAgIFByaW50cyBhbGwgb3IgYSBzcGVjaWZpYyBudW1iZXIgb2YgcGFnZXMgb2YgdGhlIGRvY3VtZW50LgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICAgICAgYlVJICAgICAgICAgLSAgIElmIHRydWUsIHdpbGwgY2F1c2UgYSBVSSB0byBiZSBwcmVzZW50ZWQgdG8gdGhlCisgICogdXNlciB0byBvYnRhaW4gcHJpbnRpbmcgaW5mb3JtYXRpb24gYW5kIGNvbmZpcm0gdGhlIGFjdGlvbi4KKyAgKiAgICAgICAgICAgblN0YXJ0ICAgICAgLSAgIEEgMC1iYXNlZCBpbmRleCB0aGF0IGRlZmluZXMgdGhlIHN0YXJ0IG9mIGFuCisgICogaW5jbHVzaXZlIHJhbmdlIG9mIHBhZ2VzLgorICAqICAgICAgICAgICBuRW5kICAgICAgICAtICAgQSAwLWJhc2VkIGluZGV4IHRoYXQgZGVmaW5lcyB0aGUgZW5kIG9mIGFuCisgICogaW5jbHVzaXZlIHBhZ2UgcmFuZ2UuCisgICogICAgICAgICAgIGJTaWxlbnQgICAgIC0gICBJZiB0cnVlLCBzdXBwcmVzc2VzIHRoZSBjYW5jZWwgZGlhbG9nIGJveCB3aGlsZQorICAqIHRoZSBkb2N1bWVudCBpcyBwcmludGluZy4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCisgICogICAgICAgICAgIGJTaHJpbmtUb0ZpdCAgICAtICAgSWYgdHJ1ZSwgdGhlIHBhZ2UgaXMgc2hydW5rIChpZiBuZWNlc3NhcnkpIHRvCisgICogZml0IHdpdGhpbiB0aGUgaW1hZ2VhYmxlIGFyZWEgb2YgdGhlIHByaW50ZWQgcGFnZS4KKyAgKiAgICAgICAgICAgYlByaW50QXNJbWFnZSAgIC0gICBJZiB0cnVlLCBwcmludCBwYWdlcyBhcyBhbiBpbWFnZS4KKyAgKiAgICAgICAgICAgYlJldmVyc2UgICAgLSAgIElmIHRydWUsIHByaW50IGZyb20gbkVuZCB0byBuU3RhcnQuCisgICogICAgICAgICAgIGJBbm5vdGF0aW9ucyAgICAtICAgSWYgdHJ1ZSAodGhlIGRlZmF1bHQpLCBhbm5vdGF0aW9ucyBhcmUKKyAgKiBwcmludGVkLgorICAqLworICB2b2lkICgqRG9jX3ByaW50KShzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiVUksCisgICAgICAgICAgICAgICAgICAgIGludCBuU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGludCBuRW5kLAorICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgYlNpbGVudCwKKyAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJTaHJpbmtUb0ZpdCwKKyAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJQcmludEFzSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiUmV2ZXJzZSwKKyAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJBbm5vdGF0aW9ucyk7CiAKKyAgLyoKKyAgKiBNZXRob2Q6IERvY19zdWJtaXRGb3JtCisgICogICAgICAgICAgIFNlbmQgdGhlIGZvcm0gZGF0YSB0byBhIHNwZWNpZmllZCBVUkwuCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisgICogICAgICAgICAgIGZvcm1EYXRhICAgIC0gICBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciB0byBiZSBzZW50LgorICAqICAgICAgICAgICBsZW5ndGggICAgICAtICAgVGhlIHNpemUsaW4gYnl0ZXMsIG9mIHRoZSBidWZmZXIgcG9pbnRlZCBieQorICAqIGZvcm1EYXRhIHBhcmFtZXRlci4KKyAgKiAgICAgICAgICAgVVJMICAgICAgICAgLSAgIFRoZSBVUkwgdG8gc2VuZCB0by4KKyAgKiBSZXR1cm4gVmFsdWU6CisgICogICAgICAgICAgIE5vbmUuCisgICoKKyAgKi8KKyAgdm9pZCAoKkRvY19zdWJtaXRGb3JtKShzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZm9ybURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgVVJMKTsKIAotICAgIC8qCi0gICAgKiBNZXRob2Q6IERvY19wcmludAotICAgICogICAgICAgICAgIFByaW50cyBhbGwgb3IgYSBzcGVjaWZpYyBudW1iZXIgb2YgcGFnZXMgb2YgdGhlIGRvY3VtZW50LgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgICAgICBiVUkgICAgICAgICAtICAgSWYgdHJ1ZSwgd2lsbCBjYXVzZSBhIFVJIHRvIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlciB0byBvYnRhaW4gcHJpbnRpbmcgaW5mb3JtYXRpb24gYW5kIGNvbmZpcm0gdGhlIGFjdGlvbi4KLSAgICAqICAgICAgICAgICBuU3RhcnQgICAgICAtICAgQSAwLWJhc2VkIGluZGV4IHRoYXQgZGVmaW5lcyB0aGUgc3RhcnQgb2YgYW4gaW5jbHVzaXZlIHJhbmdlIG9mIHBhZ2VzLgotICAgICogICAgICAgICAgIG5FbmQgICAgICAgIC0gICBBIDAtYmFzZWQgaW5kZXggdGhhdCBkZWZpbmVzIHRoZSBlbmQgb2YgYW4gaW5jbHVzaXZlIHBhZ2UgcmFuZ2UuCi0gICAgKiAgICAgICAgICAgYlNpbGVudCAgICAgLSAgIElmIHRydWUsIHN1cHByZXNzZXMgdGhlIGNhbmNlbCBkaWFsb2cgYm94IHdoaWxlIHRoZSBkb2N1bWVudCBpcyBwcmludGluZy4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0gICAgKiAgICAgICAgICAgYlNocmlua1RvRml0ICAgIC0gICBJZiB0cnVlLCB0aGUgcGFnZSBpcyBzaHJ1bmsgKGlmIG5lY2Vzc2FyeSkgdG8gZml0IHdpdGhpbiB0aGUgaW1hZ2VhYmxlIGFyZWEgb2YgdGhlIHByaW50ZWQgcGFnZS4KLSAgICAqICAgICAgICAgICBiUHJpbnRBc0ltYWdlICAgLSAgIElmIHRydWUsIHByaW50IHBhZ2VzIGFzIGFuIGltYWdlLgotICAgICogICAgICAgICAgIGJSZXZlcnNlICAgIC0gICBJZiB0cnVlLCBwcmludCBmcm9tIG5FbmQgdG8gblN0YXJ0LgotICAgICogICAgICAgICAgIGJBbm5vdGF0aW9ucyAgICAtICAgSWYgdHJ1ZSAodGhlIGRlZmF1bHQpLCBhbm5vdGF0aW9ucyBhcmUgcHJpbnRlZC4KLSAgICAqLwotICAgIHZvaWQgKCpEb2NfcHJpbnQpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywgRlBERl9CT09MIGJVSSwgaW50IG5TdGFydCwgaW50IG5FbmQsIEZQREZfQk9PTCBiU2lsZW50ICxGUERGX0JPT0wgYlNocmlua1RvRml0LEZQREZfQk9PTCBiUHJpbnRBc0ltYWdlICxGUERGX0JPT0wgYlJldmVyc2UgLEZQREZfQk9PTCBiQW5ub3RhdGlvbnMpOworICAvKgorICAqIE1ldGhvZDogRG9jX2dvdG9QYWdlCisgICogICAgICAgICAgIEp1bXAgdG8gYSBzcGVjaWZpZWQgcGFnZS4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKKyAgKiAgICAgICAgICAgblBhZ2VOdW0gICAgLSAgIFRoZSBzcGVjaWZpZWQgcGFnZSBudW1iZXIsIHplcm8gZm9yIHRoZSBmaXJzdAorICAqIHBhZ2UuCisgICogUmV0dXJuIFZhbHVlOgorICAqICAgICAgICAgICBOb25lLgorICAqCisgICovCisgIHZvaWQgKCpEb2NfZ290b1BhZ2UpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywgaW50IG5QYWdlTnVtKTsKKyAgLyoKKyAgKiBNZXRob2Q6IEZpZWxkX2Jyb3dzZQorICAqICAgICAgICAgICBTaG93IGEgZmlsZSBzZWxlY3Rpb24gZGlhbG9nLCBhbmQgcmV0dXJuIHRoZSBzZWxlY3RlZCBmaWxlIHBhdGguCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgICAgICBmaWxlUGF0aCAgICAtICAgUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgZmlsZQorICAqIHBhdGguQ2FuIGJlIE5VTEwuCisgICogICAgICAgICAgIGxlbmd0aCAgICAgIC0gICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4gQ2FuIGJlCisgICogMC4KKyAgKiBSZXR1cm4gVmFsdWU6CisgICogICAgICAgTnVtYmVyIG9mIGJ5dGVzIHRoZSBmaWxlUGF0aCBjb25zdW1lcywgaW5jbHVkaW5nIHRyYWlsaW5nIHplcm9zLgorICAqIENvbW1lbnRzOgorICAqICAgICAgIFRoZSBmaWxlUGF0aCBzaG91bGUgYmUgYWx3YXlzIGlucHV0IGluIGxvY2FsIGVuY29kaW5nLgorICAqLworICBpbnQgKCpGaWVsZF9icm93c2UpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBmaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKTsKIAotICAgIC8qCi0gICAgKiBNZXRob2Q6IERvY19zdWJtaXRGb3JtCi0gICAgKiAgICAgICAgICAgU2VuZCB0aGUgZm9ybSBkYXRhIHRvIGEgc3BlY2lmaWVkIFVSTC4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAqICAgICAgICAgICBmb3JtRGF0YSAgICAtICAgUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgdG8gYmUgc2VudC4KLSAgICAqICAgICAgICAgICBsZW5ndGggICAgICAtICAgVGhlIHNpemUsaW4gYnl0ZXMsIG9mIHRoZSBidWZmZXIgcG9pbnRlZCBieSBmb3JtRGF0YSBwYXJhbWV0ZXIuCi0gICAgKiAgICAgICAgICAgVVJMICAgICAgICAgLSAgIFRoZSBVUkwgdG8gc2VuZCB0by4KLSAgICAqIFJldHVybiBWYWx1ZToKLSAgICAqICAgICAgICAgICBOb25lLgotICAgICoKLSAgICAqLwotICAgIHZvaWQgKCpEb2Nfc3VibWl0Rm9ybSkoc3RydWN0IF9JUERGX0pzUGxhdGZvcm0qIHBUaGlzLHZvaWQqIGZvcm1EYXRhLCBpbnQgbGVuZ3RoLCBGUERGX1dJREVTVFJJTkcgVVJMKTsKKyAgLyoqCisgICogICBwb2ludGVyIHRvIEZQREZfRk9STUZJTExJTkZPIGludGVyZmFjZS4KKyAgKiovCisgIHZvaWQqIG1fcEZvcm1maWxsaW5mbzsKIAotICAgIC8qCi0gICAgKiBNZXRob2Q6IERvY19nb3RvUGFnZQotICAgICogICAgICAgICAgIEp1bXAgdG8gYSBzcGVjaWZpZWQgcGFnZS4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAqICAgICAgICAgICBuUGFnZU51bSAgICAtICAgVGhlIHNwZWNpZmllZCBwYWdlIG51bWJlciwgemVybyBmb3IgdGhlIGZpcnN0IHBhZ2UuCi0gICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgKiAgICAgICAgICAgTm9uZS4KLSAgICAqCi0gICAgKi8KLSAgICB2b2lkICgqRG9jX2dvdG9QYWdlKShzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSogcFRoaXMsIGludCBuUGFnZU51bSk7Ci0gICAgLyoKLSAgICAqIE1ldGhvZDogRmllbGRfYnJvd3NlCi0gICAgKiAgICAgICAgICAgU2hvdyBhIGZpbGUgc2VsZWN0aW9uIGRpYWxvZywgYW5kIHJldHVybiB0aGUgc2VsZWN0ZWQgZmlsZSBwYXRoLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgICAgICBmaWxlUGF0aCAgICAtICAgUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgZmlsZSBwYXRoLkNhbiBiZSBOVUxMLgotICAgICogICAgICAgICAgIGxlbmd0aCAgICAgIC0gICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4gQ2FuIGJlIDAuCi0gICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgKiAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdGhlIGZpbGVQYXRoIGNvbnN1bWVzLCBpbmNsdWRpbmcgdHJhaWxpbmcgemVyb3MuCi0gICAgKiBDb21tZW50czoKLSAgICAqICAgICAgIFRoZSBmaWxlUGF0aCBzaG91bGUgYmUgYWx3YXlzIGlucHV0IGluIGxvY2FsIGVuY29kaW5nLgotICAgICovCi0gICAgaW50ICAoKkZpZWxkX2Jyb3dzZSkoc3RydWN0IF9JUERGX0pzUGxhdGZvcm0qIHBUaGlzLCB2b2lkKiBmaWxlUGF0aCwgaW50IGxlbmd0aCk7CisgIC8qIFZlcnNpb24gMi4gKi8KIAotICAgIC8qKgotICAgICogICBwb2ludGVyIHRvIEZQREZfRk9STUZJTExJTkZPIGludGVyZmFjZS4KLSAgICAqKi8KLSAgICB2b2lkKiAgIG1fcEZvcm1maWxsaW5mbzsKKyAgLyoqCisgICogICBwb2ludGVyIHRvIHRoZSB2ODo6SXNvbGF0ZSB0byB1c2UsIG9yIE5VTEwgdG8gZm9yY2UgUERGaXVtIHRvIGNyZWF0ZSBvbmUuCisgICoqLworICB2b2lkKiBtX2lzb2xhdGU7CiAKLSAgICAvKiBWZXJzaW9uIDIuICovCi0KLSAgICAvKioKLSAgICAqICAgcG9pbnRlciB0byB0aGUgdjg6Oklzb2xhdGUgdG8gdXNlLCBvciBOVUxMIHRvIGZvcmNlIFBERml1bSB0byBjcmVhdGUgb25lLgotICAgICoqLwotICAgIHZvaWQqICAgbV9pc29sYXRlOwotCi0gICAgLyoqCi0gICAgICogICBUaGUgZW1iZWRkZXIgZGF0YSBzbG90IHRvIHVzZSBpbiB0aGUgdjg6Oklzb2xhdGUgdG8gc3RvcmUgUERGaXVtJ3MKLSAgICAgKiAgIHBlci1pc29sYXRlIGRhdGEuIFRoZSB2YWx1ZSBuZWVkcyB0byBiZSBiZXR3ZWVuIDAgYW5kCi0gICAgICogICB2ODo6SW50ZXJuYWxzOjprTnVtSXNvbGF0ZURhdGFMb3RzIChleGNsdXNpdmUpLgotICAgICAqLwotICAgIHVuc2lnbmVkIGludCBtX3Y4RW1iZWRkZXJTbG90OworICAvKioKKyAgICogICBUaGUgZW1iZWRkZXIgZGF0YSBzbG90IHRvIHVzZSBpbiB0aGUgdjg6Oklzb2xhdGUgdG8gc3RvcmUgUERGaXVtJ3MKKyAgICogICBwZXItaXNvbGF0ZSBkYXRhLiBUaGUgdmFsdWUgbmVlZHMgdG8gYmUgYmV0d2VlbiAwIGFuZAorICAgKiAgIHY4OjpJbnRlcm5hbHM6OmtOdW1Jc29sYXRlRGF0YUxvdHMgKGV4Y2x1c2l2ZSkuCisgICAqLworICB1bnNpZ25lZCBpbnQgbV92OEVtYmVkZGVyU2xvdDsKIH0gSVBERl9KU1BMQVRGT1JNOwogCiAvLyBGbGFncyBmb3IgQ3Vyc29yIHR5cGUKLSNkZWZpbmUgRlhDVF9BUlJPVyAgMAotI2RlZmluZSBGWENUX05FU1cgICAxCi0jZGVmaW5lIEZYQ1RfTldTRSAgIDIKLSNkZWZpbmUgRlhDVF9WQkVBTSAgMwotI2RlZmluZSBGWENUX0hCRUFNICA0Ci0jZGVmaW5lIEZYQ1RfSEFORCAgIDUKKyNkZWZpbmUgRlhDVF9BUlJPVyAwCisjZGVmaW5lIEZYQ1RfTkVTVyAxCisjZGVmaW5lIEZYQ1RfTldTRSAyCisjZGVmaW5lIEZYQ1RfVkJFQU0gMworI2RlZmluZSBGWENUX0hCRUFNIDQKKyNkZWZpbmUgRlhDVF9IQU5EIDUKIAogLyoqCi0gKiBEZWNsYXJlcyBvZiBhIHBvaW50ZXIgdHlwZSB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBGRklfU2V0VGltZXIgbWV0aG9kLgorICogRGVjbGFyZXMgb2YgYSBwb2ludGVyIHR5cGUgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgRkZJX1NldFRpbWVyCisgKm1ldGhvZC4KICAqIFBhcmFtZXRlcnM6CiAgKiAgICAgICAgICBpZEV2ZW50ICAgICAtICAgSWRlbnRpZmllciBvZiB0aGUgdGltZXIuCiAgKiBSZXR1cm4gdmFsdWU6CiAgKiAgICAgICAgICBOb25lLgogICoqLwotdHlwZWRlZiB2b2lkICAgICgqVGltZXJDYWxsYmFjaykoaW50IGlkRXZlbnQpOwordHlwZWRlZiB2b2lkICgqVGltZXJDYWxsYmFjaykoaW50IGlkRXZlbnQpOwogCiAvKioKICAqIERlY2xhcmVzIG9mIGEgc3RydWN0IHR5cGUgdG8gdGhlIGxvY2FsIHN5c3RlbSB0aW1lLgogKiovCi10eXBlZGVmIHN0cnVjdCBfRlBERl9TWVNURU1USU1FCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgd1llYXI7ICAgICAgICAgICAvKiB5ZWFycyBzaW5jZSAxOTAwICovCi0gICAgdW5zaWduZWQgc2hvcnQgd01vbnRoOyAgICAgICAgICAvKiBtb250aHMgc2luY2UgSmFudWFyeSAtIFswLDExXSAqLwotICAgIHVuc2lnbmVkIHNob3J0IHdEYXlPZldlZWs7ICAgICAgLyogZGF5cyBzaW5jZSBTdW5kYXkgLSBbMCw2XSAqLwotICAgIHVuc2lnbmVkIHNob3J0IHdEYXk7ICAgICAgICAgICAgLyogZGF5IG9mIHRoZSBtb250aCAtIFsxLDMxXSAqLwotICAgIHVuc2lnbmVkIHNob3J0IHdIb3VyOyAgICAgICAgICAgLyogaG91cnMgc2luY2UgbWlkbmlnaHQgLSBbMCwyM10gKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB3TWludXRlOyAgICAgICAgIC8qIG1pbnV0ZXMgYWZ0ZXIgdGhlIGhvdXIgLSBbMCw1OV0gKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB3U2Vjb25kOyAgICAgICAgIC8qIHNlY29uZHMgYWZ0ZXIgdGhlIG1pbnV0ZSAtIFswLDU5XSAqLwotICAgIHVuc2lnbmVkIHNob3J0IHdNaWxsaXNlY29uZHM7ICAgLyogbWlsbGlzZWNvbmRzIGFmdGVyIHRoZSBzZWNvbmQgLSBbMCw5OTldICovCi19RlBERl9TWVNURU1USU1FOwordHlwZWRlZiBzdHJ1Y3QgX0ZQREZfU1lTVEVNVElNRSB7CisgIHVuc2lnbmVkIHNob3J0IHdZZWFyOyAgICAgICAgIC8qIHllYXJzIHNpbmNlIDE5MDAgKi8KKyAgdW5zaWduZWQgc2hvcnQgd01vbnRoOyAgICAgICAgLyogbW9udGhzIHNpbmNlIEphbnVhcnkgLSBbMCwxMV0gKi8KKyAgdW5zaWduZWQgc2hvcnQgd0RheU9mV2VlazsgICAgLyogZGF5cyBzaW5jZSBTdW5kYXkgLSBbMCw2XSAqLworICB1bnNpZ25lZCBzaG9ydCB3RGF5OyAgICAgICAgICAvKiBkYXkgb2YgdGhlIG1vbnRoIC0gWzEsMzFdICovCisgIHVuc2lnbmVkIHNob3J0IHdIb3VyOyAgICAgICAgIC8qIGhvdXJzIHNpbmNlIG1pZG5pZ2h0IC0gWzAsMjNdICovCisgIHVuc2lnbmVkIHNob3J0IHdNaW51dGU7ICAgICAgIC8qIG1pbnV0ZXMgYWZ0ZXIgdGhlIGhvdXIgLSBbMCw1OV0gKi8KKyAgdW5zaWduZWQgc2hvcnQgd1NlY29uZDsgICAgICAgLyogc2Vjb25kcyBhZnRlciB0aGUgbWludXRlIC0gWzAsNTldICovCisgIHVuc2lnbmVkIHNob3J0IHdNaWxsaXNlY29uZHM7IC8qIG1pbGxpc2Vjb25kcyBhZnRlciB0aGUgc2Vjb25kIC0gWzAsOTk5XSAqLworfSBGUERGX1NZU1RFTVRJTUU7CiAKLS8vWEZBCisvLyBYRkEKIC8qKgogICogQG5hbWUgUGFnZXZpZXcgIGV2ZW50IGZsYWdzCiAgKi8KIC8qQHsqLwogLyoqIEBicmllZiBBZnRlciBhIG5ldyBwYWdldmlldyBpcyBhZGRlZC4gKi8KLSNkZWZpbmUgIEZYRkFfUEFHRVZJRVdFVkVOVF9QT1NUQURERUQgICAgICAgMQorI2RlZmluZSBGWEZBX1BBR0VWSUVXRVZFTlRfUE9TVEFEREVEIDEKIC8qKiBAYnJpZWYgQWZ0ZXIgYSBwYWdldmlldyBpcyByZW1vdmVkLiAqLwotI2RlZmluZSAgRlhGQV9QQUdFVklFV0VWRU5UX1BPU1RSRU1PVkVEICAgICAzCisjZGVmaW5lIEZYRkFfUEFHRVZJRVdFVkVOVF9QT1NUUkVNT1ZFRCAzCiAvKkB9Ki8KIAogLy8gbWVudQpAQCAtMjk0LDEyICszNjAsMTIgQEAKICAqIEBuYW1lIE1hY3JvIERlZmluaXRpb25zIGZvciBSaWdodCBDb250ZXh0IE1lbnUgRmVhdHVyZXMgT2YgWEZBIEZpZWxkcwogICovCiAvKkB7Ki8KLSNkZWZpbmUgIEZYRkFfTUVNVV9DT1BZICAgICAgICAgMQotI2RlZmluZSAgRlhGQV9NRU1VX0NVVCAgICAgICAgICAyCi0jZGVmaW5lICBGWEZBX01FTVVfU0VMRUNUQUxMICAgIDQKLSNkZWZpbmUgIEZYRkFfTUVNVV9VTkRPICAgICAgICAgOAotI2RlZmluZSAgRlhGQV9NRU1VX1JFRE8gICAgICAgICAxNgotI2RlZmluZSAgRlhGQV9NRU1VX1BBU1RFICAgICAgICAzMgorI2RlZmluZSBGWEZBX01FTVVfQ09QWSAxCisjZGVmaW5lIEZYRkFfTUVNVV9DVVQgMgorI2RlZmluZSBGWEZBX01FTVVfU0VMRUNUQUxMIDQKKyNkZWZpbmUgRlhGQV9NRU1VX1VORE8gOAorI2RlZmluZSBGWEZBX01FTVVfUkVETyAxNgorI2RlZmluZSBGWEZBX01FTVVfUEFTVEUgMzIKIC8qQH0qLwogCiAvLyBmaWxlIHR5cGUKQEAgLTMwNywyODMgKzM3MywzMzYgQEAKICAqIEBuYW1lIE1hY3JvIERlZmluaXRpb25zIGZvciBGaWxlIFR5cGUuCiAgKi8KIC8qQHsqLwotI2RlZmluZSBGWEZBX1NBVkVBU19YTUwgICAgIDEKLSNkZWZpbmUgRlhGQV9TQVZFQVNfWERQICAgICAyCisjZGVmaW5lIEZYRkFfU0FWRUFTX1hNTCAxCisjZGVmaW5lIEZYRkFfU0FWRUFTX1hEUCAyCiAvKkB9Ki8KIAotdHlwZWRlZiBzdHJ1Y3QgIF9GUERGX0ZPUk1GSUxMSU5GTwotewotICAgIC8qKgotICAgICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDIgKHdpdGggWEZBIG1vZHVsZSkuCi0gICAgICoqLwotICAgIGludCB2ZXJzaW9uOwordHlwZWRlZiBzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPIHsKKyAgLyoqCisgICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDIgKHdpdGggWEZBIG1vZHVsZSkuCisgICAqKi8KKyAgaW50IHZlcnNpb247CiAKLSAgICAgICAgLyoqCi0gICAgICogTWV0aG9kOiBSZWxlYXNlCi0gICAgICogICAgICAgICAgR2l2ZSBpbXBsZW1lbnRhdGlvbiBhIGNoYW5jZSB0byByZWxlYXNlIGFueSBkYXRhIGFmdGVyIHRoZSBpbnRlcmZhY2UgaXMgbm8gbG9uZ2VyIHVzZWQKLSAgICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAgKiAgICAgICAgICAxCi0gICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgICogICAgICAgICAgTm8KLSAgICAgKiBDb21tZW50czoKLSAgICAgKiAgICAgICAgICBDYWxsZWQgYnkgRm94aXQgU0RLIGR1cmluZyB0aGUgZmluYWwgY2xlYW51cCBwcm9jZXNzLgotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgICogUmV0dXJuIFZhbHVlOgotICAgICAqICAgICAgICAgIE5vbmUKLSAgICAgKi8KKyAgLyoqCisqTWV0aG9kOiBSZWxlYXNlCisqICAgICAgICAgR2l2ZSBpbXBsZW1lbnRhdGlvbiBhIGNoYW5jZSB0byByZWxlYXNlIGFueSBkYXRhIGFmdGVyIHRoZSBpbnRlcmZhY2UKKyogaXMgbm8gbG9uZ2VyIHVzZWQKKypJbnRlcmZhY2UgVmVyc2lvbjoKKyogICAgICAgICAxCisqSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisqICAgICAgICAgTm8KKypDb21tZW50czoKKyogICAgICAgICBDYWxsZWQgYnkgRm94aXQgU0RLIGR1cmluZyB0aGUgZmluYWwgY2xlYW51cCBwcm9jZXNzLgorKlBhcmFtZXRlcnM6CisqICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisqUmV0dXJuIFZhbHVlOgorKiAgICAgICAgIE5vbmUKKyovCiAKLSAgICB2b2lkICgqUmVsZWFzZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMpOworICB2b2lkICgqUmVsZWFzZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMpOwogCi0gICAgLyoqCi0gICAgICogTWV0aG9kOiBGRklfSW52YWxpZGF0ZQotICAgICAqICAgICAgICAgIEludmFsaWRhdGUgdGhlIGNsaWVudCBhcmVhIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZS4KLSAgICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAgKiAgICAgICAgICAxCi0gICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgICAgICogICAgICAgICAgIHllcwotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0gICAgICogICAgICAgICAgbGVmdCAgICAgICAgLSAgIExlZnQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCi0gICAgICogICAgICAgICAgdG9wICAgICAgICAgLSAgIFRvcCAgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCi0gICAgICogICAgICAgICAgcmlnaHQgICAgICAgLSAgIFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZSAgY29vcmRpbmF0ZS4KLSAgICAgKiAgICAgICAgICBib3R0b20gICAgICAtICAgQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgICAgICBOb25lLgotICAgICAqCi0gICAgICpjb21tZW50czoKLSAgICAgKiAgICAgICAgICBBbGwgcG9zaXRpb25zIGFyZSBtZWFzdXJlZCBpbiBQREYgInVzZXIgc3BhY2UiLgotICAgICAqICAgICAgICAgIEltcGxlbWVudGF0aW9uIHNob3VsZCBjYWxsIEZQREZfUmVuZGVyUGFnZUJpdG1hcCgpIGZ1bmN0aW9uIGZvciByZXBhaW50aW5nIGEgc3BlY2lmaWVkIHBhZ2UgYXJlYS4KLSAgICAqLwotICAgIHZvaWQgKCpGRklfSW52YWxpZGF0ZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsRlBERl9QQUdFIHBhZ2UsIGRvdWJsZSBsZWZ0LCBkb3VibGUgdG9wLCBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20pOworICAvKioKKyAgICogTWV0aG9kOiBGRklfSW52YWxpZGF0ZQorICAgKiAgICAgICAgICBJbnZhbGlkYXRlIHRoZSBjbGllbnQgYXJlYSB3aXRoaW4gdGhlIHNwZWNpZmllZCByZWN0YW5nbGUuCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgICAgICAxCisgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAgICAgKiAgICAgICAgICAgeWVzCisgICAqIFBhcmFtZXRlcnM6CisgICAqICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICAgKmZ1bmN0aW9uLgorICAgKiAgICAgICAgICBsZWZ0ICAgICAgICAtICAgTGVmdCBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UKKyAgICpjb29yZGluYXRlLgorICAgKiAgICAgICAgICB0b3AgICAgICAgICAtICAgVG9wICBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UKKyAgICpjb29yZGluYXRlLgorICAgKiAgICAgICAgICByaWdodCAgICAgICAtICAgUmlnaHQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlCisgICAqY29vcmRpbmF0ZS4KKyAgICogICAgICAgICAgYm90dG9tICAgICAgLSAgIEJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UKKyAgICpjb29yZGluYXRlLgorICAgKiBSZXR1cm4gVmFsdWU6CisgICAqICAgICAgICAgIE5vbmUuCisgICAqCisgICAqY29tbWVudHM6CisgICAqICAgICAgICAgIEFsbCBwb3NpdGlvbnMgYXJlIG1lYXN1cmVkIGluIFBERiAidXNlciBzcGFjZSIuCisgICAqICAgICAgICAgIEltcGxlbWVudGF0aW9uIHNob3VsZCBjYWxsIEZQREZfUmVuZGVyUGFnZUJpdG1hcCgpIGZ1bmN0aW9uIGZvcgorICAgKnJlcGFpbnRpbmcgYSBzcGVjaWZpZWQgcGFnZSBhcmVhLgorICAqLworICB2b2lkICgqRkZJX0ludmFsaWRhdGUpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBib3R0b20pOwogCi0gICAgLyoqCi0gICAgICogTWV0aG9kOiBGRklfT3V0cHV0U2VsZWN0ZWRSZWN0Ci0gICAgICogICAgICAgICAgV2hlbiB1c2VyIGlzIHRha2luZyB0aGUgbW91c2UgdG8gc2VsZWN0IHRleHRzIG9uIGEgZm9ybSBmaWVsZCwgdGhpcyBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGtlZXAKLSAgICAgKiAgICAgICAgICByZXR1cm5pbmcgdGhlIHNlbGVjdGVkIGFyZWFzIHRvIHRoZSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKgotICAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICAqICAgICAgICAgIDEKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAgKiAgICAgICAgICBObwotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0gICAgICogICAgICAgICAgbGVmdCAgICAgICAgLSAgIExlZnQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCi0gICAgICogICAgICAgICAgdG9wICAgICAgICAgLSAgIFRvcCAgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCi0gICAgICogICAgICAgICAgcmlnaHQgICAgICAgLSAgIFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZSAgY29vcmRpbmF0ZS4KLSAgICAgKiAgICAgICAgICBib3R0b20gICAgICAtICAgQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgICAgICBOb25lLgotICAgICAqCi0gICAgICogY29tbWVudHM6Ci0gICAgICogICAgICAgICAgVGhpcyBDQUxMQkFDSyBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIGltcGxlbWVudGluZyBzcGVjaWFsIHRleHQgc2VsZWN0aW9uIGVmZmVjdC4gSW1wbGVtZW50YXRpb24gc2hvdWxkCi0gICAgICogICAgICAgICAgZmlyc3QgcmVjb3JkcyB0aGUgcmV0dXJuZWQgcmVjdGFuZ2xlcywgdGhlbiBkcmF3IHRoZW0gb25lIGJ5IG9uZSBhdCB0aGUgcGFpbnRpbmcgcGVyaW9kLCBsYXN0LHJlbW92ZSBhbGwKLSAgICAgKiAgICAgICAgICB0aGUgcmVjb3JkZWQgcmVjdGFuZ2xlcyB3aGVuIGZpbmlzaCBwYWludGluZy4KLSAgICAqLwotICAgIHZvaWQgKCpGRklfT3V0cHV0U2VsZWN0ZWRSZWN0KShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcyxGUERGX1BBR0UgcGFnZSwgZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsIGRvdWJsZSByaWdodCwgZG91YmxlIGJvdHRvbSk7CisgIC8qKgorICAgKiBNZXRob2Q6IEZGSV9PdXRwdXRTZWxlY3RlZFJlY3QKKyAgICogICAgICAgICAgV2hlbiB1c2VyIGlzIHRha2luZyB0aGUgbW91c2UgdG8gc2VsZWN0IHRleHRzIG9uIGEgZm9ybSBmaWVsZCwKKyAgICogdGhpcyBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGtlZXAKKyAgICogICAgICAgICAgcmV0dXJuaW5nIHRoZSBzZWxlY3RlZCBhcmVhcyB0byB0aGUgaW1wbGVtZW50YXRpb24uCisgICAqCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgICAgICAxCisgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAgKiAgICAgICAgICBObworICAgKiBQYXJhbWV0ZXJzOgorICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKyAgICogZnVuY3Rpb24uCisgICAqICAgICAgICAgIGxlZnQgICAgICAgIC0gICBMZWZ0IHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZQorICAgKiBjb29yZGluYXRlLgorICAgKiAgICAgICAgICB0b3AgICAgICAgICAtICAgVG9wICBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UKKyAgICogY29vcmRpbmF0ZS4KKyAgICogICAgICAgICAgcmlnaHQgICAgICAgLSAgIFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZQorICAgKiBjb29yZGluYXRlLgorICAgKiAgICAgICAgICBib3R0b20gICAgICAtICAgQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZQorICAgKiBjb29yZGluYXRlLgorICAgKiBSZXR1cm4gVmFsdWU6CisgICAqICAgICAgICAgIE5vbmUuCisgICAqCisgICAqIGNvbW1lbnRzOgorICAgKiAgICAgICAgICBUaGlzIENBTExCQUNLIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIHNwZWNpYWwgdGV4dAorICAgKiBzZWxlY3Rpb24gZWZmZWN0LiBJbXBsZW1lbnRhdGlvbiBzaG91bGQKKyAgICogICAgICAgICAgZmlyc3QgcmVjb3JkcyB0aGUgcmV0dXJuZWQgcmVjdGFuZ2xlcywgdGhlbiBkcmF3IHRoZW0gb25lIGJ5IG9uZQorICAgKiBhdCB0aGUgcGFpbnRpbmcgcGVyaW9kLCBsYXN0LHJlbW92ZSBhbGwKKyAgICogICAgICAgICAgdGhlIHJlY29yZGVkIHJlY3RhbmdsZXMgd2hlbiBmaW5pc2ggcGFpbnRpbmcuCisgICovCisgIHZvaWQgKCpGRklfT3V0cHV0U2VsZWN0ZWRSZWN0KShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJvdHRvbSk7CiAKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX1NldEN1cnNvcgotICAgICogICAgICAgICAgIFNldCB0aGUgQ3Vyc29yIHNoYXBlLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICAgICAgbkN1cnNvclR5cGUgLSAgIEN1cnNvciB0eXBlLiBzZWUgRmxhZ3MgZm9yIEN1cnNvciB0eXBlIGZvciB0aGUgZGV0YWlscy4KLSAgICAqICAgUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgTm9uZS4KLSAgICAqICovCi0gICAgdm9pZCAoKkZGSV9TZXRDdXJzb3IpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBpbnQgbkN1cnNvclR5cGUpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9TZXRDdXJzb3IKKyAgKiAgICAgICAgICAgU2V0IHRoZSBDdXJzb3Igc2hhcGUuCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgbkN1cnNvclR5cGUgLSAgIEN1cnNvciB0eXBlLiBzZWUgRmxhZ3MgZm9yIEN1cnNvciB0eXBlIGZvciB0aGUKKyAgKiBkZXRhaWxzLgorICAqICAgUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICogKi8KKyAgdm9pZCAoKkZGSV9TZXRDdXJzb3IpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBpbnQgbkN1cnNvclR5cGUpOwogCi0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZGSV9TZXRUaW1lcgotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIGluc3RhbGxzIGEgc3lzdGVtIHRpbWVyLiBBIHRpbWUtb3V0IHZhbHVlIGlzIHNwZWNpZmllZCwKLSAgICAqICAgICAgICAgICBhbmQgZXZlcnkgdGltZSBhIHRpbWUtb3V0IG9jY3VycywgdGhlIHN5c3RlbSBwYXNzZXMgYSBtZXNzYWdlIHRvCi0gICAgKiAgICAgICAgICAgdGhlIFRpbWVyUHJvYyBjYWxsYmFjayBmdW5jdGlvbi4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIHVFbGFwc2UgICAgIC0gICBTcGVjaWZpZXMgdGhlIHRpbWUtb3V0IHZhbHVlLCBpbiBtaWxsaXNlY29uZHMuCi0gICAgKiAgICAgICBscFRpbWVyRnVuYyAtICAgQSBwb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbi1UaW1lckNhbGxiYWNrLgotICAgICogICBSZXR1cm4gdmFsdWU6Ci0gICAgKiAgICAgICBUaGUgdGltZXIgaWRlbnRpZmllciBvZiB0aGUgbmV3IHRpbWVyIGlmIHRoZSBmdW5jdGlvbiBpcyBzdWNjZXNzZnVsLgotICAgICogICAgICAgQW4gYXBwbGljYXRpb24gcGFzc2VzIHRoaXMgdmFsdWUgdG8gdGhlIEZGSV9LaWxsVGltZXIgbWV0aG9kIHRvIGtpbGwKLSAgICAqICAgICAgIHRoZSB0aW1lci4gTm9uemVybyBpZiBpdCBpcyBzdWNjZXNzZnVsOyBvdGhlcndpc2UsIGl0IGlzIHplcm8uCi0gICAgKiAqLwotICAgIGludCAgKCpGRklfU2V0VGltZXIpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBpbnQgdUVsYXBzZSwgVGltZXJDYWxsYmFjayBscFRpbWVyRnVuYyk7CisgIC8qKgorICAqIE1ldGhvZDogRkZJX1NldFRpbWVyCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIGluc3RhbGxzIGEgc3lzdGVtIHRpbWVyLiBBIHRpbWUtb3V0IHZhbHVlIGlzCisgICogc3BlY2lmaWVkLAorICAqICAgICAgICAgICBhbmQgZXZlcnkgdGltZSBhIHRpbWUtb3V0IG9jY3VycywgdGhlIHN5c3RlbSBwYXNzZXMgYSBtZXNzYWdlIHRvCisgICogICAgICAgICAgIHRoZSBUaW1lclByb2MgY2FsbGJhY2sgZnVuY3Rpb24uCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgdUVsYXBzZSAgICAgLSAgIFNwZWNpZmllcyB0aGUgdGltZS1vdXQgdmFsdWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgKiAgICAgICBscFRpbWVyRnVuYyAtICAgQSBwb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbi1UaW1lckNhbGxiYWNrLgorICAqICAgUmV0dXJuIHZhbHVlOgorICAqICAgICAgIFRoZSB0aW1lciBpZGVudGlmaWVyIG9mIHRoZSBuZXcgdGltZXIgaWYgdGhlIGZ1bmN0aW9uIGlzIHN1Y2Nlc3NmdWwuCisgICogICAgICAgQW4gYXBwbGljYXRpb24gcGFzc2VzIHRoaXMgdmFsdWUgdG8gdGhlIEZGSV9LaWxsVGltZXIgbWV0aG9kIHRvIGtpbGwKKyAgKiAgICAgICB0aGUgdGltZXIuIE5vbnplcm8gaWYgaXQgaXMgc3VjY2Vzc2Z1bDsgb3RoZXJ3aXNlLCBpdCBpcyB6ZXJvLgorICAqICovCisgIGludCAoKkZGSV9TZXRUaW1lcikoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHVFbGFwc2UsCisgICAgICAgICAgICAgICAgICAgICAgVGltZXJDYWxsYmFjayBscFRpbWVyRnVuYyk7CiAKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX0tpbGxUaW1lcgotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIGtpbGxzIHRoZSB0aW1lciBldmVudCBpZGVudGlmaWVkIGJ5IG5JREV2ZW50LCBzZXQgYnkgYW4gZWFybGllciBjYWxsIHRvIEZGSV9TZXRUaW1lci4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIG5UaW1lcklEICAgIC0gICBUaGUgdGltZXIgSUQgcmV0dXJuIGJ5IEZGSV9TZXRUaW1lciBmdW5jdGlvbi4KLSAgICAqICAgUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgTm9uZS4KLSAgICAqICovCi0gICAgdm9pZCAoKkZGSV9LaWxsVGltZXIpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBpbnQgblRpbWVySUQpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9LaWxsVGltZXIKKyAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qga2lsbHMgdGhlIHRpbWVyIGV2ZW50IGlkZW50aWZpZWQgYnkgbklERXZlbnQsIHNldCBieQorICAqIGFuIGVhcmxpZXIgY2FsbCB0byBGRklfU2V0VGltZXIuCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgblRpbWVySUQgICAgLSAgIFRoZSB0aW1lciBJRCByZXR1cm4gYnkgRkZJX1NldFRpbWVyIGZ1bmN0aW9uLgorICAqICAgUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICogKi8KKyAgdm9pZCAoKkZGSV9LaWxsVGltZXIpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBpbnQgblRpbWVySUQpOwogCisgIC8qKgorICAqIE1ldGhvZDogRkZJX0dldExvY2FsVGltZQorICAqICAgICAgICAgICBUaGlzIG1ldGhvZCByZWNlaXZlcyB0aGUgY3VycmVudCBsb2NhbCB0aW1lIG9uIHRoZSBzeXN0ZW0uCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICBSZXR1cm4gdmFsdWU6CisgICogICAgICAgTm9uZS4KKyAgKiAqLworICBGUERGX1NZU1RFTVRJTUUgKCpGRklfR2V0TG9jYWxUaW1lKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcyk7CiAKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX0dldExvY2FsVGltZQotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHJlY2VpdmVzIHRoZSBjdXJyZW50IGxvY2FsIHRpbWUgb24gdGhlIHN5c3RlbS4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgTm9uZS4KLSAgICAqICovCi0gICAgRlBERl9TWVNURU1USU1FICgqRkZJX0dldExvY2FsVGltZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9PbkNoYW5nZQorICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgdG8gbm90aWZ5IGltcGxlbWVudGF0aW9uIHdoZW4gdGhlCisgICogdmFsdWUgb2YgYW55IEZvcm1GaWVsZCBvbiB0aGUgZG9jdW1lbnQgaGFkIGJlZW4gY2hhbmdlZC4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICBubworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICogKi8KKyAgdm9pZCAoKkZGSV9PbkNoYW5nZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMpOwogCi0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZGSV9PbkNoYW5nZQotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCB0byBub3RpZnkgaW1wbGVtZW50YXRpb24gd2hlbiB0aGUgdmFsdWUgb2YgYW55IEZvcm1GaWVsZCBvbiB0aGUgZG9jdW1lbnQgaGFkIGJlZW4gY2hhbmdlZC4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIG5vCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICBSZXR1cm4gdmFsdWU6Ci0gICAgKiAgICAgICBOb25lLgotICAgICogKi8KLSAgICB2b2lkICgqRkZJX09uQ2hhbmdlKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcyk7CisgIC8qKgorICAqIE1ldGhvZDogRkZJX0dldFBhZ2UKKyAgKiAgICAgICAgICAgVGhpcyBtZXRob2QgcmVjZWl2ZXMgdGhlIHBhZ2UgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpZWQKKyAgKiBwYWdlIGluZGV4LgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50CisgICogZnVuY3Rpb24uCisgICogICAgICAgblBhZ2VJbmRleCAgLSAgIEluZGV4IG51bWJlciBvZiB0aGUgcGFnZS4gMCBmb3IgdGhlIGZpcnN0IHBhZ2UuCisgICogUmV0dXJuIHZhbHVlOgorICAqICAgICAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZSBmdW5jdGlvbi4KKyAgKiBDb21tZW50czoKKyAgKiAgICAgICBJbiBzb21lIGNhc2VzLCB0aGUgZG9jdW1lbnQtbGV2ZWwgSmF2YVNjcmlwdCBhY3Rpb24gbWF5IHJlZmVyIHRvIGEKKyAgKiBwYWdlIHdoaWNoIGhhZG4ndCBiZWVuIGxvYWRlZCB5ZXQuCisgICogICAgICAgVG8gc3VjY2Vzc2Z1bGx5IHJ1biB0aGUgamF2YXNjcmlwdCBhY3Rpb24sIGltcGxlbWVudGF0aW9uIG5lZWQgdG8gbG9hZAorICAqIHRoZSBwYWdlIGZvciBTREsuCisgICogKi8KKyAgRlBERl9QQUdFICAgKCpGRklfR2V0UGFnZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBuUGFnZUluZGV4KTsKIAotICAgIC8qKgotICAgICogTWV0aG9kOiBGRklfR2V0UGFnZQotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHJlY2VpdmVzIHRoZSBwYWdlIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWVkIHBhZ2UgaW5kZXguCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KLSAgICAqICAgICAgIG5QYWdlSW5kZXggIC0gICBJbmRleCBudW1iZXIgb2YgdGhlIHBhZ2UuIDAgZm9yIHRoZSBmaXJzdCBwYWdlLgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotICAgICogQ29tbWVudHM6Ci0gICAgKiAgICAgICBJbiBzb21lIGNhc2VzLCB0aGUgZG9jdW1lbnQtbGV2ZWwgSmF2YVNjcmlwdCBhY3Rpb24gbWF5IHJlZmVyIHRvIGEgcGFnZSB3aGljaCBoYWRuJ3QgYmVlbiBsb2FkZWQgeWV0LgotICAgICogICAgICAgVG8gc3VjY2Vzc2Z1bGx5IHJ1biB0aGUgamF2YXNjcmlwdCBhY3Rpb24sIGltcGxlbWVudGF0aW9uIG5lZWQgdG8gbG9hZCB0aGUgcGFnZSBmb3IgU0RLLgotICAgICogKi8KLSAgICBGUERGX1BBR0UgICAoKkZGSV9HZXRQYWdlKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IG5QYWdlSW5kZXgpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9HZXRDdXJyZW50UGFnZQorICAqICAgICAgIFRoaXMgbWV0aG9kIHJlY2VpdmVzIHRoZSBjdXJyZW50IHBhZ2UgcG9pbnRlci4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudAorICAqIGZ1bmN0aW9uLgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisgICogKi8KKyAgRlBERl9QQUdFICAgKCpGRklfR2V0Q3VycmVudFBhZ2UpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAotICAgIC8qKgotICAgICogTWV0aG9kOiBGRklfR2V0Q3VycmVudFBhZ2UKLSAgICAqICAgICAgIFRoaXMgbWV0aG9kIHJlY2VpdmVzIHRoZSBjdXJyZW50IHBhZ2UgcG9pbnRlci4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotICAgICogKi8KLSAgICBGUERGX1BBR0UgICAoKkZGSV9HZXRDdXJyZW50UGFnZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9HZXRSb3RhdGlvbgorICAqICAgICAgICAgICBUaGlzIG1ldGhvZCByZWNlaXZlcyBjdXJyZW50bHkgcm90YXRpb24gb2YgdGhlIHBhZ2Ugdmlldy4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisgICogUmV0dXJuIHZhbHVlOgorICAqICAgICAgIFRoZSBwYWdlIHJvdGF0aW9uLiBTaG91bGQgYmUgMCgwIGRlZ3JlZSksMSg5MCBkZWdyZWUpLDIoMTgwCisgICogZGVncmVlKSwzKDI3MCBkZWdyZWUpLCBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24uCisgICogKi8KKyAgaW50ICgqRkZJX0dldFJvdGF0aW9uKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9QQUdFIHBhZ2UpOwogCi0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZGSV9HZXRSb3RhdGlvbgotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHJlY2VpdmVzIGN1cnJlbnRseSByb3RhdGlvbiBvZiB0aGUgcGFnZSB2aWV3LgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgVGhlIHBhZ2Ugcm90YXRpb24uIFNob3VsZCBiZSAwKDAgZGVncmVlKSwxKDkwIGRlZ3JlZSksMigxODAgZGVncmVlKSwzKDI3MCBkZWdyZWUpLCBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24uCi0gICAgKiAqLwotICAgIGludCAgICAgKCpGRklfR2V0Um90YXRpb24pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1BBR0UgcGFnZSk7CisgIC8qKgorICAqIE1ldGhvZDogRkZJX0V4ZWN1dGVOYW1lZEFjdGlvbgorICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGV4ZWN1dGUgYW4gbmFtZWQgYWN0aW9uLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBuYW1lZEFjdGlvbiAgICAgLSAgIEEgYnl0ZSBzdHJpbmcgd2hpY2ggaW5kaWNhdGVzIHRoZSBuYW1lZCBhY3Rpb24sCisgICogdGVybWluYXRlZCBieSAwLgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBOb25lLgorICAqIENvbW1lbnRzOgorICAqICAgICAgIFNlZSB0aGUgbmFtZWQgYWN0aW9ucyBkZXNjcmlwdGlvbiBvZiA8PFBERiBSZWZlcmVuY2UsIHZlcnNpb24gMS43Pj4KKyAgKiBmb3IgbW9yZSBkZXRhaWxzLgorICAqICovCisgIHZvaWQgKCpGRklfRXhlY3V0ZU5hbWVkQWN0aW9uKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBuYW1lZEFjdGlvbik7CisgIC8qKgorICAqIEBicmllZiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgdGV4dCBmaWVsZCBpcyBnZXR0aW5nIG9yIGxvc2luZyBhCisgICogZm9jdXMuCisgICoKKyAgKiBAcGFyYW1baW5dIHBUaGlzICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogQHBhcmFtW2luXSB2YWx1ZSAgICAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGZvcm0gZmllbGQsIGluIFVURi0xNkxFCisgICogZm9ybWF0LgorICAqIEBwYXJhbVtpbl0gdmFsdWVMZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdmFsdWUsIG51bWJlciBvZiBjaGFyYWN0ZXJzCisgICogKG5vdCBieXRlcykuCisgICogQHBhcmFtW2luXSBpc19mb2N1cyAgIFRydWUgaWYgdGhlIGZvcm0gZmllbGQgaXMgZ2V0dGluZyBhIGZvY3VzLCBGYWxzZSBmb3IKKyAgKiBsb3NpbmcgYSBmb2N1cy4KKyAgKgorICAqIEByZXR1cm4gTm9uZS4KKyAgKgorICAqIEBub3RlIEN1cnJlbnRseSxvbmx5IHN1cHBvcnQgdGV4dCBmaWVsZCBhbmQgY29tYm9ib3ggZmllbGQuCisgICogKi8KKyAgdm9pZCAoKkZGSV9TZXRUZXh0RmllbGRGb2N1cykoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCB2YWx1ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGlzX2ZvY3VzKTsKIAotICAgIC8qKgotICAgICogTWV0aG9kOiBGRklfRXhlY3V0ZU5hbWVkQWN0aW9uCi0gICAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBleGVjdXRlIGFuIG5hbWVkIGFjdGlvbi4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBuYW1lZEFjdGlvbiAgICAgLSAgIEEgYnl0ZSBzdHJpbmcgd2hpY2ggaW5kaWNhdGVzIHRoZSBuYW1lZCBhY3Rpb24sIHRlcm1pbmF0ZWQgYnkgMC4KLSAgICAqIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIE5vbmUuCi0gICAgKiBDb21tZW50czoKLSAgICAqICAgICAgIFNlZSB0aGUgbmFtZWQgYWN0aW9ucyBkZXNjcmlwdGlvbiBvZiA8PFBERiBSZWZlcmVuY2UsIHZlcnNpb24gMS43Pj4gZm9yIG1vcmUgZGV0YWlscy4KLSAgICAqICovCi0gICAgdm9pZCAgICAoKkZGSV9FeGVjdXRlTmFtZWRBY3Rpb24pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX0JZVEVTVFJJTkcgbmFtZWRBY3Rpb24pOwotICAgIC8qKgotICAgICogQGJyaWVmIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSB0ZXh0IGZpZWxkIGlzIGdldHRpbmcgb3IgbG9zaW5nIGEgZm9jdXMuCi0gICAgKgotICAgICogQHBhcmFtW2luXSBwVGhpcyAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogQHBhcmFtW2luXSB2YWx1ZSAgICAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGZvcm0gZmllbGQsIGluIFVURi0xNkxFIGZvcm1hdC4KLSAgICAqIEBwYXJhbVtpbl0gdmFsdWVMZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdmFsdWUsIG51bWJlciBvZiBjaGFyYWN0ZXJzIChub3QgYnl0ZXMpLgotICAgICogQHBhcmFtW2luXSBpc19mb2N1cyAgIFRydWUgaWYgdGhlIGZvcm0gZmllbGQgaXMgZ2V0dGluZyBhIGZvY3VzLCBGYWxzZSBmb3IgbG9zaW5nIGEgZm9jdXMuCi0gICAgKgotICAgICogQHJldHVybiBOb25lLgotICAgICoKLSAgICAqIEBub3RlIEN1cnJlbnRseSxvbmx5IHN1cHBvcnQgdGV4dCBmaWVsZCBhbmQgY29tYm9ib3ggZmllbGQuCi0gICAgKiAqLwotICAgIHZvaWQgICAgKCpGRklfU2V0VGV4dEZpZWxkRm9jdXMpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1dJREVTVFJJTkcgdmFsdWUsIEZQREZfRFdPUkQgdmFsdWVMZW4sIEZQREZfQk9PTCBpc19mb2N1cyk7CisgIC8qKgorICAqIE1ldGhvZDogRkZJX0RvVVJJQWN0aW9uCisgICogICAgICAgICAgIFRoaXMgYWN0aW9uIHJlc29sdmVzIHRvIGEgdW5pZm9ybSByZXNvdXJjZSBpZGVudGlmaWVyLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIE5vCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIGJzVVJJICAgICAgICAgICAtICAgQSBieXRlIHN0cmluZyB3aGljaCBpbmRpY2F0ZXMgdGhlIHVuaWZvcm0gcmVzb3VyY2UKKyAgKiBpZGVudGlmaWVyLCB0ZXJtaW5hdGVkIGJ5IDAuCisgICogUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICogQ29tbWVudHM6CisgICogICAgICAgU2VlIHRoZSBVUkkgYWN0aW9ucyBkZXNjcmlwdGlvbiBvZiA8PFBERiBSZWZlcmVuY2UsIHZlcnNpb24gMS43Pj4gZm9yCisgICogbW9yZSBkZXRhaWxzLgorICAqICovCisgIHZvaWQgKCpGRklfRG9VUklBY3Rpb24pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgYnNVUkkpOwogCi0KLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX0RvVVJJQWN0aW9uCi0gICAgKiAgICAgICAgICAgVGhpcyBhY3Rpb24gcmVzb2x2ZXMgdG8gYSB1bmlmb3JtIHJlc291cmNlIGlkZW50aWZpZXIuCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICBObwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBic1VSSSAgICAgICAgICAgLSAgIEEgYnl0ZSBzdHJpbmcgd2hpY2ggaW5kaWNhdGVzIHRoZSB1bmlmb3JtIHJlc291cmNlIGlkZW50aWZpZXIsIHRlcm1pbmF0ZWQgYnkgMC4KLSAgICAqIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIE5vbmUuCi0gICAgKiBDb21tZW50czoKLSAgICAqICAgICAgIFNlZSB0aGUgVVJJIGFjdGlvbnMgZGVzY3JpcHRpb24gb2YgPDxQREYgUmVmZXJlbmNlLCB2ZXJzaW9uIDEuNz4+IGZvciBtb3JlIGRldGFpbHMuCi0gICAgKiAqLwotICAgIHZvaWQgICAgKCpGRklfRG9VUklBY3Rpb24pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX0JZVEVTVFJJTkcgYnNVUkkpOwotCi0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZGSV9Eb0dvVG9BY3Rpb24KLSAgICAqICAgICAgICAgICBUaGlzIGFjdGlvbiBjaGFuZ2VzIHRoZSB2aWV3IHRvIGEgc3BlY2lmaWVkIGRlc3RpbmF0aW9uLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgTm8KLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICAgICAgblBhZ2VJbmRleCAgICAgIC0gICBUaGUgaW5kZXggb2YgdGhlIFBERiBwYWdlLgotICAgICogICAgICAgem9vbU1vZGUgICAgICAgIC0gICBUaGUgem9vbSBtb2RlIGZvciB2aWV3aW5nIHBhZ2UuU2VlIE1hY3JvcyAiUERGWk9PTV9YWFgiIGRlZmluZWQgaW4gImZwZGZkb2MuaCIuCi0gICAgKiAgICAgICBmUG9zQXJyYXkgICAgICAgLSAgIFRoZSBmbG9hdCBhcnJheSB3aGljaCBjYXJyaWVzIHRoZSBwb3NpdGlvbiBpbmZvLgotICAgICogICAgICAgc2l6ZW9mQXJyYXkgICAgIC0gICBUaGUgc2l6ZSBvZiBmbG9hdCBhcnJheS4KLSAgICAqIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIE5vbmUuCi0gICAgKiBDb21tZW50czoKLSAgICAqICAgICAgIFNlZSB0aGUgRGVzdGluYXRpb25zIGRlc2NyaXB0aW9uIG9mIDw8UERGIFJlZmVyZW5jZSwgdmVyc2lvbiAxLjc+PiBpbiA4LjIuMSBmb3IgbW9yZSBkZXRhaWxzLgotICAgICoqLwotICAgIHZvaWQgICAgKCpGRklfRG9Hb1RvQWN0aW9uKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgaW50IG5QYWdlSW5kZXgsIGludCB6b29tTW9kZSwgZmxvYXQqIGZQb3NBcnJheSwgaW50IHNpemVvZkFycmF5KTsKKyAgLyoqCisgICogTWV0aG9kOiBGRklfRG9Hb1RvQWN0aW9uCisgICogICAgICAgICAgIFRoaXMgYWN0aW9uIGNoYW5nZXMgdGhlIHZpZXcgdG8gYSBzcGVjaWZpZWQgZGVzdGluYXRpb24uCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgTm8KKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgblBhZ2VJbmRleCAgICAgIC0gICBUaGUgaW5kZXggb2YgdGhlIFBERiBwYWdlLgorICAqICAgICAgIHpvb21Nb2RlICAgICAgICAtICAgVGhlIHpvb20gbW9kZSBmb3Igdmlld2luZyBwYWdlLlNlZSBNYWNyb3MKKyAgKiJQREZaT09NX1hYWCIgZGVmaW5lZCBpbiAiZnBkZmRvYy5oIi4KKyAgKiAgICAgICBmUG9zQXJyYXkgICAgICAgLSAgIFRoZSBmbG9hdCBhcnJheSB3aGljaCBjYXJyaWVzIHRoZSBwb3NpdGlvbiBpbmZvLgorICAqICAgICAgIHNpemVvZkFycmF5ICAgICAtICAgVGhlIHNpemUgb2YgZmxvYXQgYXJyYXkuCisgICogUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICogQ29tbWVudHM6CisgICogICAgICAgU2VlIHRoZSBEZXN0aW5hdGlvbnMgZGVzY3JpcHRpb24gb2YgPDxQREYgUmVmZXJlbmNlLCB2ZXJzaW9uIDEuNz4+IGluCisgICo4LjIuMSBmb3IgbW9yZSBkZXRhaWxzLgorICAqKi8KKyAgdm9pZCAoKkZGSV9Eb0dvVG9BY3Rpb24pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5QYWdlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgem9vbU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZlBvc0FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVvZkFycmF5KTsKIAogICAvKioKICAgKiAgIHBvaW50ZXIgdG8gSVBERl9KU1BMQVRGT1JNIGludGVyZmFjZQogICAqKi8KLSAgSVBERl9KU1BMQVRGT1JNKiAgbV9wSnNQbGF0Zm9ybTsKKyAgSVBERl9KU1BMQVRGT1JNKiBtX3BKc1BsYXRmb3JtOwogCiAgIC8qKgogICAgICogTWV0aG9kOiBGRklfRGlzcGxheUNhcmV0CkBAIC01OTQsMjQ5ICs3MTMsMzE4IEBACiAgICAgKiAgICAgICAgICAgeWVzCiAgICAgKiBQYXJhbWV0ZXJzOgogICAgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIHBhZ2UgICAgICAgICAgICAtICAgSGFuZGxlIHRvIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0gICAgKiAgICAgICBsZWZ0ICAgICAgICAgICAgLSAgIExlZnQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCi0gICAgKiAgICAgICB0b3AgICAgICAgICAgICAgLSAgIFRvcCBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UgY29vcmRpbmF0ZS4KLSAgICAqICAgICAgIHJpZ2h0ICAgICAgICAgICAtICAgUmlnaHQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCi0gICAgKiAgICAgICBib3R0b20gICAgICAgICAgLSAgIEJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UgY29vcmRpbmF0ZS4KKyAgICAqICAgICAgIHBhZ2UgICAgICAgICAgICAtICAgSGFuZGxlIHRvIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKyAgICAqZnVuY3Rpb24uCisgICAgKiAgICAgICBsZWZ0ICAgICAgICAgICAgLSAgIExlZnQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlCisgICAgKmNvb3JkaW5hdGUuCisgICAgKiAgICAgICB0b3AgICAgICAgICAgICAgLSAgIFRvcCBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UKKyAgICAqY29vcmRpbmF0ZS4KKyAgICAqICAgICAgIHJpZ2h0ICAgICAgICAgICAtICAgUmlnaHQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlCisgICAgKmNvb3JkaW5hdGUuCisgICAgKiAgICAgICBib3R0b20gICAgICAgICAgLSAgIEJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UKKyAgICAqY29vcmRpbmF0ZS4KICAgICAqIFJldHVybiB2YWx1ZToKICAgICAqICAgICAgIE5vbmUuCiAgICAgKiovCi0gICAgdm9pZCAgICAoKkZGSV9EaXNwbGF5Q2FyZXQpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1BBR0UgcGFnZSwgRlBERl9CT09MIGJWaXNpYmxlLCBkb3VibGUgbGVmdCwgZG91YmxlIHRvcCwgZG91YmxlIHJpZ2h0LCBkb3VibGUgYm90dG9tKTsKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX0dldEN1cnJlbnRQYWdlSW5kZXgKLSAgICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGdldCB0aGUgY3VycmVudCBwYWdlIGluZGV4LgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KLSAgICAqIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIFRoZSBpbmRleCBvZiBjdXJyZW50IHBhZ2UuCi0gICAgKiovCi0gICAgaW50ICAgICAoKkZGSV9HZXRDdXJyZW50UGFnZUluZGV4KShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7Ci0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZGSV9TZXRDdXJyZW50UGFnZQotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZSBjdXJyZW50IHBhZ2UuCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgotICAgICogICAgICAgaUN1clBhZ2UgICAgICAgIC0gICBUaGUgaW5kZXggb2YgdGhlIFBERiBwYWdlLgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgTm9uZS4KLSAgICAqKi8KLSAgICB2b2lkICAgICgqRkZJX1NldEN1cnJlbnRQYWdlKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IGlDdXJQYWdlKTsKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX0dvdG9VUkwKLSAgICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGxpbmsgdG8gdGhlIHNwZWNpZmllZCBVUkwuCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICBubwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCi0gICAgKiAgICAgICB3c1VSTCAgICAgICAgICAgLSAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIFVSTCwgaW4gVVRGLTE2TEUgZm9ybWF0LgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgTm9uZS4KLSAgICAqKi8KLSAgICB2b2lkICAgICgqRkZJX0dvdG9VUkwpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREVTVFJJTkcgd3NVUkwpOwotICAgIC8qKgotICAgICogTWV0aG9kOiBGRklfR2V0UGFnZVZpZXdSZWN0Ci0gICAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBnZXQgdGhlIGN1cnJlbnQgcGFnZSB2aWV3IHJlY3RhbmdsZS4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBwYWdlICAgICAgICAgICAgLSAgIEhhbmRsZSB0byBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotICAgICogICAgICAgbGVmdCAgICAgICAgICAgIC0gICBUaGUgcG9pbnRlciB0byByZWNlaXZlIGxlZnQgcG9zaXRpb24gb2YgdGhlIHBhZ2UgdmlldyBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCi0gICAgKiAgICAgICB0b3AgICAgICAgICAgICAgLSAgIFRoZSBwb2ludGVyIHRvIHJlY2VpdmUgdG9wIHBvc2l0aW9uIG9mIHRoZSBwYWdlIHZpZXcgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgotICAgICogICAgICAgcmlnaHQgICAgICAgICAgIC0gICBUaGUgcG9pbnRlciB0byByZWNlaXZlIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgotICAgICogICAgICAgYm90dG9tICAgICAgICAgIC0gICBUaGUgcG9pbnRlciB0byByZWNlaXZlIGJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UgY29vcmRpbmF0ZS4KLSAgICAqIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIE5vbmUuCi0gICAgKiovCi0gICAgdm9pZCAgICAoKkZGSV9HZXRQYWdlVmlld1JlY3QpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1BBR0UgcGFnZSwgZG91YmxlKiBsZWZ0LCBkb3VibGUqIHRvcCwgZG91YmxlKiByaWdodCwgZG91YmxlKiBib3R0b20pOwotICAgIC8qKgotICAgICogTWV0aG9kOiBGRklfUG9wdXBNZW51Ci0gICAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCB0cmFjayB0aGUgcmlnaHQgY29udGV4dCBtZW51IGZvciBYRkEgZmllbGRzLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIHBhZ2UgICAgICAgICAgICAtICAgSGFuZGxlIHRvIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0gICAgKiAgICAgICBoV2lkZ2V0ICAgICAgICAgLSAgIEhhbmRsZSB0byBYRkEgZmllbGRzLgotICAgICogICAgICAgbWVudUZsYWcgICAgICAgIC0gICBUaGUgbWVudSBmbGFncy4gUGxlYXNlIHJlZmVyIHRvIG1hY3JvIGRlZmluaXRpb24gb2YgRlhGQV9NRU1VX1hYWCBhbmQgdGhpcyBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlc2UgbWFjcm9zLgotICAgICogICAgICAgeCAgICAgICAgICAgICAgIC0gICBYIHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgotICAgICogICAgICAgeSAgICAgICAgICAgICAgIC0gICBZIHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlLgotICAgICoqLwotICAgIEZQREZfQk9PTCAoKkZGSV9Qb3B1cE1lbnUpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1BBR0UgcGFnZSwgRlBERl9XSURHRVQgaFdpZGdldCwgaW50IG1lbnVGbGFnLCBmbG9hdCB4LCBmbG9hdCB5KTsKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX09wZW5GaWxlCi0gICAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBvcGVuIHRoZSBzcGVjaWZpZWQgZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbW9kZS4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uCi0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIGZpbGVGbGFnICAgICAgICAtICAgVGhlIGZpbGUgZmxhZy5QbGVhc2UgcmVmZXIgdG8gbWFjcm8gZGVmaW5pdGlvbiBvZiBGWEZBX1NBVkVBU19YWFggYW5kIHRoaXMgY2FuIGJlIG9uZSBvZiB0aGVzZSBtYWNyb3MuCi0gICAgKiAgICAgICB3c1VSTCAgICAgICAgICAgLSAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGZpbGUgVVJMLCBpbiBVVEYtMTZMRSBmb3JtYXQuCi0gICAgKiAgICAgICBtb2RlICAgICAgICAgICAgLSAgIFRoZSBtb2RlIGZvciBvcGVuIGZpbGUuCi0gICAgKiBSZXR1cm4gdmFsdWU6Ci0gICAgKiAgICAgICBUaGUgaGFuZGxlIHRvIEZQREZfRklMRUhBTkRMRVIuCi0gICAgKiovCi0gICAgRlBERl9GSUxFSEFORExFUiogKCpGRklfT3BlbkZpbGUpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBpbnQgZmlsZUZsYWcsIEZQREZfV0lERVNUUklORyB3c1VSTCwgY29uc3QgY2hhciogbW9kZSk7Ci0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZGSV9FbWFpbFRvCi0gICAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBlbWFpbCB0aGUgc3BlY2lmaWVkIGZpbGUgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQgY29udGFjdGVyLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIHBGaWxlSGFuZGxlciAgICAtICAgSGFuZGxlIHRvIHRoZSBGUERGX0ZJTEVIQU5ETEVSLgotICAgICogICAgICAgcFRvICAgICAgICAgICAgIC0gICBBIHNlbWljb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiByZWNpcGllbnRzIGZvciB0aGUgbWVzc2FnZSxpbiBVVEYtMTZMRSBmb3JtYXQuCi0gICAgKiAgICAgICBwU3ViamVjdCAgICAgICAgLSAgIFRoZSBzdWJqZWN0IG9mIHRoZSBtZXNzYWdlLGluIFVURi0xNkxFIGZvcm1hdC4KLSAgICAqICAgICAgIHBDQyAgICAgICAgICAgICAtICAgQSBzZW1pY29sb24tZGVsaW1pdGVkIGxpc3Qgb2YgQ0MgcmVjaXBpZW50cyBmb3IgdGhlIG1lc3NhZ2UsaW4gVVRGLTE2TEUgZm9ybWF0LgotICAgICogICAgICAgcEJjYyAgICAgICAgICAgIC0gICBBIHNlbWljb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiBCQ0MgcmVjaXBpZW50cyBmb3IgdGhlIG1lc3NhZ2UsaW4gVVRGLTE2TEUgZm9ybWF0LgotICAgICogICAgICAgcE1zZyAgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciB0byBiZSBzZW50LkNhbiBiZSBOVUxMLGluIFVURi0xNkxFIGZvcm1hdC4KLSAgICAqIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIE5vbmUuCi0gICAgKiovCi0gICAgdm9pZCAgICAoKkZGSV9FbWFpbFRvKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9GSUxFSEFORExFUiogZmlsZUhhbmRsZXIsIEZQREZfV0lERVNUUklORyBwVG8sIEZQREZfV0lERVNUUklORyBwU3ViamVjdCwgRlBERl9XSURFU1RSSU5HIHBDQywgRlBERl9XSURFU1RSSU5HIHBCY2MsIEZQREZfV0lERVNUUklORyBwTXNnKTsKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX1VwbG9hZFRvCi0gICAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBnZXQgdXBsb2FkIHRoZSBzcGVjaWZpZWQgZmlsZSBzdHJlYW0gdG8gdGhlIHNwZWNpZmllZCBVUkwuCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICAgICAgcEZpbGVIYW5kbGVyICAgIC0gICBIYW5kbGUgdG8gdGhlIEZQREZfRklMRUhBTkRMRVIuCi0gICAgKiAgICAgICBmaWxlRmxhZyAgICAgICAgLSAgIFRoZSBmaWxlIGZsYWcuUGxlYXNlIHJlZmVyIHRvIG1hY3JvIGRlZmluaXRpb24gb2YgRlhGQV9TQVZFQVNfWFhYIGFuZCB0aGlzIGNhbiBiZSBvbmUgb2YgdGhlc2UgbWFjcm9zLgotICAgICogICAgICAgdXBsb2FkVG8gICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBVUkwgcGF0aCwgaW4gVVRGLTE2TEUgZm9ybWF0LgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgTm9uZS4KLSAgICAqKi8KLSAgICB2b2lkICAgICgqRkZJX1VwbG9hZFRvKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9GSUxFSEFORExFUiogZmlsZUhhbmRsZXIsIGludCBmaWxlRmxhZywgRlBERl9XSURFU1RSSU5HIHVwbG9hZFRvKTsKKyAgdm9pZCAoKkZGSV9EaXNwbGF5Q2FyZXQpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgYlZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYm90dG9tKTsKKyAgLyoqCisgICogTWV0aG9kOiBGRklfR2V0Q3VycmVudFBhZ2VJbmRleAorICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGdldCB0aGUgY3VycmVudCBwYWdlIGluZGV4LgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQKKyAgKmZ1bmN0aW9uLgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBUaGUgaW5kZXggb2YgY3VycmVudCBwYWdlLgorICAqKi8KKyAgaW50ICgqRkZJX0dldEN1cnJlbnRQYWdlSW5kZXgpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CisgIC8qKgorICAqIE1ldGhvZDogRkZJX1NldEN1cnJlbnRQYWdlCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZSBjdXJyZW50IHBhZ2UuCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudAorICAqZnVuY3Rpb24uCisgICogICAgICAgaUN1clBhZ2UgICAgICAgIC0gICBUaGUgaW5kZXggb2YgdGhlIFBERiBwYWdlLgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBOb25lLgorICAqKi8KKyAgdm9pZCAoKkZGSV9TZXRDdXJyZW50UGFnZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpQ3VyUGFnZSk7CisgIC8qKgorICAqIE1ldGhvZDogRkZJX0dvdG9VUkwKKyAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBsaW5rIHRvIHRoZSBzcGVjaWZpZWQgVVJMLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIG5vCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudAorICAqZnVuY3Rpb24uCisgICogICAgICAgd3NVUkwgICAgICAgICAgIC0gICBUaGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBVUkwsIGluIFVURi0xNkxFIGZvcm1hdC4KKyAgKiBSZXR1cm4gdmFsdWU6CisgICogICAgICAgTm9uZS4KKyAgKiovCisgIHZvaWQgKCpGRklfR290b1VSTCkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgd3NVUkwpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9HZXRQYWdlVmlld1JlY3QKKyAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBnZXQgdGhlIGN1cnJlbnQgcGFnZSB2aWV3IHJlY3RhbmdsZS4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgcGFnZSAgICAgICAgICAgIC0gICBIYW5kbGUgdG8gcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICAqZnVuY3Rpb24uCisgICogICAgICAgbGVmdCAgICAgICAgICAgIC0gICBUaGUgcG9pbnRlciB0byByZWNlaXZlIGxlZnQgcG9zaXRpb24gb2YgdGhlIHBhZ2UKKyAgKnZpZXcgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgorICAqICAgICAgIHRvcCAgICAgICAgICAgICAtICAgVGhlIHBvaW50ZXIgdG8gcmVjZWl2ZSB0b3AgcG9zaXRpb24gb2YgdGhlIHBhZ2UKKyAgKnZpZXcgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgorICAqICAgICAgIHJpZ2h0ICAgICAgICAgICAtICAgVGhlIHBvaW50ZXIgdG8gcmVjZWl2ZSByaWdodCBwb3NpdGlvbiBvZiB0aGUKKyAgKmNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCisgICogICAgICAgYm90dG9tICAgICAgICAgIC0gICBUaGUgcG9pbnRlciB0byByZWNlaXZlIGJvdHRvbSBwb3NpdGlvbiBvZiB0aGUKKyAgKmNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCisgICogUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICoqLworICB2b2lkICgqRkZJX0dldFBhZ2VWaWV3UmVjdCkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYm90dG9tKTsKKyAgLyoqCisgICogTWV0aG9kOiBGRklfUG9wdXBNZW51CisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgdHJhY2sgdGhlIHJpZ2h0IGNvbnRleHQgbWVudSBmb3IgWEZBIGZpZWxkcy4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgcGFnZSAgICAgICAgICAgIC0gICBIYW5kbGUgdG8gcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICAqZnVuY3Rpb24uCisgICogICAgICAgaFdpZGdldCAgICAgICAgIC0gICBIYW5kbGUgdG8gWEZBIGZpZWxkcy4KKyAgKiAgICAgICBtZW51RmxhZyAgICAgICAgLSAgIFRoZSBtZW51IGZsYWdzLiBQbGVhc2UgcmVmZXIgdG8gbWFjcm8gZGVmaW5pdGlvbgorICAqb2YgRlhGQV9NRU1VX1hYWCBhbmQgdGhpcyBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlc2UgbWFjcm9zLgorICAqICAgICAgIHggICAgICAgICAgICAgICAtICAgWCBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UKKyAgKmNvb3JkaW5hdGUuCisgICogICAgICAgeSAgICAgICAgICAgICAgIC0gICBZIHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZQorICAqY29vcmRpbmF0ZS4KKyAgKiBSZXR1cm4gdmFsdWU6CisgICogICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlLgorICAqKi8KKyAgRlBERl9CT09MICgqRkZJX1BvcHVwTWVudSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfUEFHRSBwYWdlLCBGUERGX1dJREdFVCBoV2lkZ2V0LCBpbnQgbWVudUZsYWcsIGZsb2F0IHgsIGZsb2F0IHkpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9PcGVuRmlsZQorICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIG9wZW4gdGhlIHNwZWNpZmllZCBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBtb2RlLgorICAqIEludGVyZmFjZSBWZXJzaW9uCisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIGZpbGVGbGFnICAgICAgICAtICAgVGhlIGZpbGUgZmxhZy5QbGVhc2UgcmVmZXIgdG8gbWFjcm8gZGVmaW5pdGlvbiBvZgorICAqRlhGQV9TQVZFQVNfWFhYIGFuZCB0aGlzIGNhbiBiZSBvbmUgb2YgdGhlc2UgbWFjcm9zLgorICAqICAgICAgIHdzVVJMICAgICAgICAgICAtICAgVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZmlsZSBVUkwsIGluIFVURi0xNkxFCisgICpmb3JtYXQuCisgICogICAgICAgbW9kZSAgICAgICAgICAgIC0gICBUaGUgbW9kZSBmb3Igb3BlbiBmaWxlLgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBUaGUgaGFuZGxlIHRvIEZQREZfRklMRUhBTkRMRVIuCisgICoqLworICBGUERGX0ZJTEVIQU5ETEVSKiAoKkZGSV9PcGVuRmlsZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgd3NVUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtb2RlKTsKKyAgLyoqCisgICogTWV0aG9kOiBGRklfRW1haWxUbworICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGVtYWlsIHRoZSBzcGVjaWZpZWQgZmlsZSBzdHJlYW0gdG8gdGhlIHNwZWNpZmllZAorICAqY29udGFjdGVyLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBwRmlsZUhhbmRsZXIgICAgLSAgIEhhbmRsZSB0byB0aGUgRlBERl9GSUxFSEFORExFUi4KKyAgKiAgICAgICBwVG8gICAgICAgICAgICAgLSAgIEEgc2VtaWNvbG9uLWRlbGltaXRlZCBsaXN0IG9mIHJlY2lwaWVudHMgZm9yIHRoZQorICAqbWVzc2FnZSxpbiBVVEYtMTZMRSBmb3JtYXQuCisgICogICAgICAgcFN1YmplY3QgICAgICAgIC0gICBUaGUgc3ViamVjdCBvZiB0aGUgbWVzc2FnZSxpbiBVVEYtMTZMRSBmb3JtYXQuCisgICogICAgICAgcENDICAgICAgICAgICAgIC0gICBBIHNlbWljb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiBDQyByZWNpcGllbnRzIGZvcgorICAqdGhlIG1lc3NhZ2UsaW4gVVRGLTE2TEUgZm9ybWF0LgorICAqICAgICAgIHBCY2MgICAgICAgICAgICAtICAgQSBzZW1pY29sb24tZGVsaW1pdGVkIGxpc3Qgb2YgQkNDIHJlY2lwaWVudHMgZm9yCisgICp0aGUgbWVzc2FnZSxpbiBVVEYtMTZMRSBmb3JtYXQuCisgICogICAgICAgcE1zZyAgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciB0byBiZSBzZW50LkNhbiBiZQorICAqTlVMTCxpbiBVVEYtMTZMRSBmb3JtYXQuCisgICogUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICoqLworICB2b2lkICgqRkZJX0VtYWlsVG8pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfRklMRUhBTkRMRVIqIGZpbGVIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBwVG8sCisgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHBTdWJqZWN0LAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBwQ0MsCisgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHBCY2MsCisgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHBNc2cpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9VcGxvYWRUbworICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGdldCB1cGxvYWQgdGhlIHNwZWNpZmllZCBmaWxlIHN0cmVhbSB0byB0aGUKKyAgKnNwZWNpZmllZCBVUkwuCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIHBGaWxlSGFuZGxlciAgICAtICAgSGFuZGxlIHRvIHRoZSBGUERGX0ZJTEVIQU5ETEVSLgorICAqICAgICAgIGZpbGVGbGFnICAgICAgICAtICAgVGhlIGZpbGUgZmxhZy5QbGVhc2UgcmVmZXIgdG8gbWFjcm8gZGVmaW5pdGlvbiBvZgorICAqRlhGQV9TQVZFQVNfWFhYIGFuZCB0aGlzIGNhbiBiZSBvbmUgb2YgdGhlc2UgbWFjcm9zLgorICAqICAgICAgIHVwbG9hZFRvICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgVVJMIHBhdGgsIGluIFVURi0xNkxFIGZvcm1hdC4KKyAgKiBSZXR1cm4gdmFsdWU6CisgICogICAgICAgTm9uZS4KKyAgKiovCisgIHZvaWQgKCpGRklfVXBsb2FkVG8pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZJTEVIQU5ETEVSKiBmaWxlSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdXBsb2FkVG8pOwogCi0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZGSV9HZXRQbGF0Zm9ybQotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZ2V0IHRoZSBjdXJyZW50IHBsYXRmb3JtLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIHBsYXRmb3JtICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgcGxhdGZvcm0uQ2FuIGJlIE5VTEwsaW4gVVRGLTE2TEUgZm9ybWF0LgotICAgICogICAgICAgbGVuZ3RoICAgICAgICAgIC0gICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4gQ2FuIGJlIDAuCi0gICAgKiBSZXR1cm4gdmFsdWU6Ci0gICAgKiAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4KLSAgICAqKi8KLSAgICBpbnQgICAgICgqRkZJX0dldFBsYXRmb3JtKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgdm9pZCogcGxhdGZvcm0sIGludCBsZW5ndGgpOwotICAgIC8qKgotICAgICogTWV0aG9kOiBGRklfR2V0TGFuZ3VhZ2UKLSAgICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGdldCB0aGUgY3VycmVudCBsYW5ndWFnZS4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBsYW5ndWFnZSAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuQ2FuIGJlIE5VTEwuCi0gICAgKiAgICAgICBsZW5ndGggICAgICAgICAgLSAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLiBDYW4gYmUgMC4KLSAgICAqIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLgotICAgICoqLwotICAgIGludCAgICAgKCpGRklfR2V0TGFuZ3VhZ2UpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCB2b2lkKiBsYW5ndWFnZSwgaW50IGxlbmd0aCk7Ci0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZGSV9Eb3dubG9hZEZyb21VUkwKLSAgICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGRvd25sb2FkIHRoZSBzcGVjaWZpZWQgZmlsZSBmcm9tIHRoZSBVUkwuCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICAgICAgVVJMICAgICAgICAgICAgIC0gICBUaGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBmaWxlIFVSTCwgaW4gVVRGLTE2TEUgZm9ybWF0LgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgVGhlIGhhbmRsZSB0byBGUERGX0ZJTEVIQU5ETEVSLgotICAgICoqLwotICAgIEZQREZfTFBGSUxFSEFORExFUiAgKCpGRklfRG93bmxvYWRGcm9tVVJMKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9XSURFU1RSSU5HIFVSTCk7Ci0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZGSV9Qb3N0UmVxdWVzdFVSTAotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgcG9zdCB0aGUgcmVxdWVzdCB0byB0aGUgc2VydmVyIFVSTC4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICB3c1VSTCAgICAgICAgICAgLSAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHNlcnZlciBVUkwsIGluIFVURi0xNkxFIGZvcm1hdC4KLSAgICAqICAgICAgIHdzRGF0YSAgICAgICAgICAtICAgVGhlIHBvc3QgZGF0YSxpbiBVVEYtMTZMRSBmb3JtYXQuCi0gICAgKiAgICAgICB3c0NvbnRlbnRUeXBlICAgLSAgIFRoZSBjb250ZW50IHR5cGUgb2YgdGhlIHJlcXVlc3QgZGF0YSxpbiBVVEYtMTZMRSBmb3JtYXQuCi0gICAgKiAgICAgICB3c0VuY29kZSAgICAgICAgLSAgIFRoZSBlbmNvZGUgdHlwZSxpbiBVVEYtMTZMRSBmb3JtYXQuCi0gICAgKiAgICAgICB3c0hlYWRlciAgICAgICAgLSAgIFRoZSByZXF1ZXN0IGhlYWRlcixpbiBVVEYtMTZMRSBmb3JtYXQuCi0gICAgKiAgICAgICByZXNwb25zZSAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIEZQREZfQlNUUiB0byByZWNlaXZlIHRoZSByZXNwb25zZSBkYXRhIGZyb20gc2VydmVyLCxpbiBVVEYtMTZMRSBmb3JtYXQuCi0gICAgKiBSZXR1cm4gdmFsdWU6Ci0gICAgKiAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzLCBvdGhlcndpc2UgRkFMU0UuCi0gICAgKiovCi0gICAgRlBERl9CT09MICAgKCpGRklfUG9zdFJlcXVlc3RVUkwpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1dJREVTVFJJTkcgd3NVUkwsIEZQREZfV0lERVNUUklORyB3c0RhdGEsIEZQREZfV0lERVNUUklORyB3c0NvbnRlbnRUeXBlLCBGUERGX1dJREVTVFJJTkcgd3NFbmNvZGUsIEZQREZfV0lERVNUUklORyB3c0hlYWRlciwgRlBERl9CU1RSKiByZXNwb25lKTsKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX1B1dFJlcXVlc3RVUkwKLSAgICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIHB1dCB0aGUgcmVxdWVzdCB0byB0aGUgc2VydmVyIFVSTC4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICB3c1VSTCAgICAgICAgICAgLSAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHNlcnZlciBVUkwsIGluIFVURi0xNkxFIGZvcm1hdC4KLSAgICAqICAgICAgIHdzRGF0YSAgICAgICAgICAtICAgVGhlIHB1dCBkYXRhLCBpbiBVVEYtMTZMRSBmb3JtYXQuCi0gICAgKiAgICAgICB3c0VuY29kZSAgICAgICAgLSAgIFRoZSBlbmNvZGUgdHlwZSwgaW4gVVRSLTE2TEUgZm9ybWF0LgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzcywgb3RoZXJ3aXNlIEZBTFNFLgotICAgICoqLwotICAgIEZQREZfQk9PTCAgICgqRkZJX1B1dFJlcXVlc3RVUkwpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1dJREVTVFJJTkcgd3NVUkwsIEZQREZfV0lERVNUUklORyB3c0RhdGEsIEZQREZfV0lERVNUUklORyB3c0VuY29kZSk7CisgIC8qKgorICAqIE1ldGhvZDogRkZJX0dldFBsYXRmb3JtCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZ2V0IHRoZSBjdXJyZW50IHBsYXRmb3JtLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBwbGF0Zm9ybSAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlCisgICpwbGF0Zm9ybS5DYW4gYmUgTlVMTCxpbiBVVEYtMTZMRSBmb3JtYXQuCisgICogICAgICAgbGVuZ3RoICAgICAgICAgIC0gICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4gQ2FuIGJlCisgICowLgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4KKyAgKiovCisgIGludCAoKkZGSV9HZXRQbGF0Zm9ybSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGxhdGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCk7CisgIC8qKgorICAqIE1ldGhvZDogRkZJX0dldExhbmd1YWdlCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZ2V0IHRoZSBjdXJyZW50IGxhbmd1YWdlLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBsYW5ndWFnZSAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGN1cnJlbnQKKyAgKmxhbmd1YWdlLkNhbiBiZSBOVUxMLgorICAqICAgICAgIGxlbmd0aCAgICAgICAgICAtICAgVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBudW1iZXIgb2YgYnl0ZXMuIENhbiBiZQorICAqMC4KKyAgKiBSZXR1cm4gdmFsdWU6CisgICogICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBudW1iZXIgb2YgYnl0ZXMuCisgICoqLworICBpbnQgKCpGRklfR2V0TGFuZ3VhZ2UpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGxhbmd1YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9Eb3dubG9hZEZyb21VUkwKKyAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBkb3dubG9hZCB0aGUgc3BlY2lmaWVkIGZpbGUgZnJvbSB0aGUgVVJMLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBVUkwgICAgICAgICAgICAgLSAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGZpbGUgVVJMLCBpbiBVVEYtMTZMRQorICAqZm9ybWF0LgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBUaGUgaGFuZGxlIHRvIEZQREZfRklMRUhBTkRMRVIuCisgICoqLworICBGUERGX0xQRklMRUhBTkRMRVIgICgqRkZJX0Rvd25sb2FkRnJvbVVSTCkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfV0lERVNUUklORyBVUkwpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9Qb3N0UmVxdWVzdFVSTAorICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIHBvc3QgdGhlIHJlcXVlc3QgdG8gdGhlIHNlcnZlciBVUkwuCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIHdzVVJMICAgICAgICAgICAtICAgVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgc2VydmVyIFVSTCwgaW4gVVRGLTE2TEUKKyAgKmZvcm1hdC4KKyAgKiAgICAgICB3c0RhdGEgICAgICAgICAgLSAgIFRoZSBwb3N0IGRhdGEsaW4gVVRGLTE2TEUgZm9ybWF0LgorICAqICAgICAgIHdzQ29udGVudFR5cGUgICAtICAgVGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgcmVxdWVzdCBkYXRhLGluIFVURi0xNkxFCisgICpmb3JtYXQuCisgICogICAgICAgd3NFbmNvZGUgICAgICAgIC0gICBUaGUgZW5jb2RlIHR5cGUsaW4gVVRGLTE2TEUgZm9ybWF0LgorICAqICAgICAgIHdzSGVhZGVyICAgICAgICAtICAgVGhlIHJlcXVlc3QgaGVhZGVyLGluIFVURi0xNkxFIGZvcm1hdC4KKyAgKiAgICAgICByZXNwb25zZSAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIEZQREZfQlNUUiB0byByZWNlaXZlIHRoZSByZXNwb25zZQorICAqZGF0YSBmcm9tIHNlcnZlciwsaW4gVVRGLTE2TEUgZm9ybWF0LgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzLCBvdGhlcndpc2UgRkFMU0UuCisgICoqLworICBGUERGX0JPT0wgICAoKkZGSV9Qb3N0UmVxdWVzdFVSTCkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfV0lERVNUUklORyB3c1VSTCwgRlBERl9XSURFU1RSSU5HIHdzRGF0YSwgRlBERl9XSURFU1RSSU5HIHdzQ29udGVudFR5cGUsIEZQREZfV0lERVNUUklORyB3c0VuY29kZSwgRlBERl9XSURFU1RSSU5HIHdzSGVhZGVyLCBGUERGX0JTVFIqIHJlc3BvbmUpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9QdXRSZXF1ZXN0VVJMCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgcHV0IHRoZSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgVVJMLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICB3c1VSTCAgICAgICAgICAgLSAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHNlcnZlciBVUkwsIGluIFVURi0xNkxFCisgICpmb3JtYXQuCisgICogICAgICAgd3NEYXRhICAgICAgICAgIC0gICBUaGUgcHV0IGRhdGEsIGluIFVURi0xNkxFIGZvcm1hdC4KKyAgKiAgICAgICB3c0VuY29kZSAgICAgICAgLSAgIFRoZSBlbmNvZGUgdHlwZSwgaW4gVVRSLTE2TEUgZm9ybWF0LgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzLCBvdGhlcndpc2UgRkFMU0UuCisgICoqLworICBGUERGX0JPT0wgICAoKkZGSV9QdXRSZXF1ZXN0VVJMKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9XSURFU1RSSU5HIHdzVVJMLCBGUERGX1dJREVTVFJJTkcgd3NEYXRhLCBGUERGX1dJREVTVFJJTkcgd3NFbmNvZGUpOwogCiB9IEZQREZfRk9STUZJTExJTkZPOwogCi0KLQogLyoqCiAgKiBGdW5jdGlvbjogRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudAogICogICAgICAgICAgSW5pdCBmb3JtIGZpbGwgZW52aXJvbm1lbnQuCiAgKiBDb21tZW50czoKICAqICAgICAgICAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYW55IGZvcm0gZmlsbCBvcGVyYXRpb24uCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5CisgKkZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgogICogICAgICAgICAgcEZvcm1GaWxsSW5mbyAgIC0gICBQb2ludGVyIHRvIGEgRlBERl9GT1JNRklMTElORk8gc3RydWN0dXJlLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgUmV0dXJuIGhhbmRsZXIgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIE5VTEwgbWVhbnMgZmFpbHMuCiAgKiovCi1ETExFWFBPUlQgRlBERl9GT1JNSEFORExFIFNURENBTEwgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0ZPUk1GSUxMSU5GTyogZm9ybUluZm8pOworRExMRVhQT1JUIEZQREZfRk9STUhBTkRMRSBTVERDQUxMCitGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUZJTExJTkZPKiBmb3JtSW5mbyk7CiAKIC8qKgogICogRnVuY3Rpb246IEZQREZET0NfRXhpdEZvcm1GaWxsRW52aXJvbm1lbnQKICAqICAgICAgICAgIEV4aXQgZm9ybSBmaWxsIGVudmlyb25tZW50LgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTlVMTC4KICAqKi8KQEAgLTg0NCwyNTAgKzEwMzIsMzU1IEBACiAKIC8qKgogICogRnVuY3Rpb246IEZPUk1fT25BZnRlckxvYWRQYWdlCi0gKiAgICAgICAgICBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBmb3IgaW1wbGVtZW50aW5nIGFsbCB0aGUgZm9ybSByZWxhdGVkIGZ1bmN0aW9ucy4gU2hvdWxkIGJlIGludm9rZWQgYWZ0ZXIgdXNlcgotICogICAgICAgICAgc3VjY2Vzc2Z1bGx5IGxvYWRlZCBhIFBERiBwYWdlLCBhbmQgbWV0aG9kIEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQgaGFkIGJlZW4gaW52b2tlZC4KKyAqICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIGZvciBpbXBsZW1lbnRpbmcgYWxsIHRoZSBmb3JtIHJlbGF0ZWQKKyAqZnVuY3Rpb25zLiBTaG91bGQgYmUgaW52b2tlZCBhZnRlciB1c2VyCisgKiAgICAgICAgICBzdWNjZXNzZnVsbHkgbG9hZGVkIGEgUERGIHBhZ2UsIGFuZCBtZXRob2QKKyAqRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudCBoYWQgYmVlbiBpbnZva2VkLgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTk9ORS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9PbkFmdGVyTG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UsIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9PbkFmdGVyTG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRk9STV9PbkJlZm9yZUNsb3NlUGFnZQotICogICAgICAgICAgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIGltcGxlbWVudGluZyBhbGwgdGhlIGZvcm0gcmVsYXRlZCBmdW5jdGlvbnMuIFNob3VsZCBiZSBpbnZva2VkIGJlZm9yZSB1c2VyCisgKiAgICAgICAgICBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBmb3IgaW1wbGVtZW50aW5nIGFsbCB0aGUgZm9ybSByZWxhdGVkCisgKmZ1bmN0aW9ucy4gU2hvdWxkIGJlIGludm9rZWQgYmVmb3JlIHVzZXIKICAqICAgICAgICAgIGNsb3NlIHRoZSBQREYgcGFnZS4KICAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KKyAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKyAqZnVuY3Rpb24uCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTk9ORS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9PbkJlZm9yZUNsb3NlUGFnZShGUERGX1BBR0UgcGFnZSwgRlBERl9GT1JNSEFORExFIGhIYW5kbGUpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGT1JNX09uQmVmb3JlQ2xvc2VQYWdlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKTsKIAogLyoqCiAqIEZ1bmN0aW9uOiBGT1JNX0RvRG9jdW1lbnRKU0FjdGlvbgotKiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIHBlcmZvcm1pbmcgRG9jdW1lbnQtbGV2ZWwgSmF2YVNjcmlwdCBhY3Rpb24uIEl0IHNob3VsZCBiZSBpbnZva2VkIGFmdGVyIHRoZSBQREYgZG9jdW1lbnQKKyogICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIGZvciBwZXJmb3JtaW5nIERvY3VtZW50LWxldmVsIEphdmFTY3JpcHQKKyphY3Rpb24uIEl0IHNob3VsZCBiZSBpbnZva2VkIGFmdGVyIHRoZSBQREYgZG9jdW1lbnQKICogICAgICAgICAgIGhhZCBiZWVuIGxvYWRlZC4KICogUGFyYW1ldGVyczoKLSogICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisqICAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorKkZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCiAqIFJldHVybiBWYWx1ZToKICogICAgICAgICAgIE5PTkUKICogQ29tbWVudHM6Ci0qICAgICAgICAgICBJZiB0aGVyZSBpcyBEb2N1bWVudC1sZXZlbCBKYXZhU2NyaXB0IGFjdGlvbiBlbWJlZGRlZCBpbiB0aGUgZG9jdW1lbnQsIHRoaXMgbWV0aG9kIHdpbGwgZXhlY3V0ZSB0aGUgamF2YXNjcmlwdCBhY3Rpb247CisqICAgICAgICAgICBJZiB0aGVyZSBpcyBEb2N1bWVudC1sZXZlbCBKYXZhU2NyaXB0IGFjdGlvbiBlbWJlZGRlZCBpbiB0aGUKKypkb2N1bWVudCwgdGhpcyBtZXRob2Qgd2lsbCBleGVjdXRlIHRoZSBqYXZhc2NyaXB0IGFjdGlvbjsKICogICAgICAgICAgIG90aGVyd2lzZSwgdGhlIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcuCiAqKi8KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9Eb0RvY3VtZW50SlNBY3Rpb24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUpOwogCi0KIC8qKgogKiBGdW5jdGlvbjogRk9STV9Eb0RvY3VtZW50T3BlbkFjdGlvbgotKiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIHBlcmZvcm1pbmcgb3Blbi1hY3Rpb24gd2hlbiB0aGUgZG9jdW1lbnQgaXMgb3BlbmVkLgorKiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIHBlcmZvcm1pbmcgb3Blbi1hY3Rpb24gd2hlbiB0aGUgZG9jdW1lbnQKKyppcyBvcGVuZWQuCiAqIFBhcmFtZXRlcnM6Ci0qICAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieSBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorKiAgICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKypGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgogKiBSZXR1cm4gVmFsdWU6CiAqICAgICAgICAgICBOT05FCiAqIENvbW1lbnRzOgotKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIG9wZW4tYWN0aW9ucyBlbWJlZGRlZCBpbiB0aGUgZG9jdW1lbnQuCisqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gb3Blbi1hY3Rpb25zIGVtYmVkZGVkIGluCisqdGhlIGRvY3VtZW50LgogKiovCiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fRG9Eb2N1bWVudE9wZW5BY3Rpb24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUpOwogCi0KIC8vIGFkZGl0aW9uYWwgYWN0aW9ucyB0eXBlIG9mIGRvY3VtZW50LgotI2RlZmluZSBGUERGRE9DX0FBQ1RJT05fV0MgICAgICAweDEwICAgICAgICAvL1dDLCBiZWZvcmUgY2xvc2luZyBkb2N1bWVudCwgSmF2YVNjcmlwdCBhY3Rpb24uCi0jZGVmaW5lIEZQREZET0NfQUFDVElPTl9XUyAgICAgIDB4MTEgICAgICAgIC8vV1MsIGJlZm9yZSBzYXZpbmcgZG9jdW1lbnQsIEphdmFTY3JpcHQgYWN0aW9uLgotI2RlZmluZSBGUERGRE9DX0FBQ1RJT05fRFMgICAgICAweDEyICAgICAgICAvL0RTLCBhZnRlciBzYXZpbmcgZG9jdW1lbnQsIEphdmFTY3JpcHQgYWN0aW9uLgotI2RlZmluZSBGUERGRE9DX0FBQ1RJT05fV1AgICAgICAweDEzICAgICAgICAvL1dQLCBiZWZvcmUgcHJpbnRpbmcgZG9jdW1lbnQsIEphdmFTY3JpcHQgYWN0aW9uLgotI2RlZmluZSBGUERGRE9DX0FBQ1RJT05fRFAgICAgICAweDE0ICAgICAgICAvL0RQLCBhZnRlciBwcmludGluZyBkb2N1bWVudCwgSmF2YVNjcmlwdCBhY3Rpb24uCisjZGVmaW5lIEZQREZET0NfQUFDVElPTl9XQyBcCisgIDB4MTAgIC8vIFdDLCBiZWZvcmUgY2xvc2luZyBkb2N1bWVudCwgSmF2YVNjcmlwdCBhY3Rpb24uCisjZGVmaW5lIEZQREZET0NfQUFDVElPTl9XUyBcCisgIDB4MTEgIC8vIFdTLCBiZWZvcmUgc2F2aW5nIGRvY3VtZW50LCBKYXZhU2NyaXB0IGFjdGlvbi4KKyNkZWZpbmUgRlBERkRPQ19BQUNUSU9OX0RTIDB4MTIgIC8vIERTLCBhZnRlciBzYXZpbmcgZG9jdW1lbnQsIEphdmFTY3JpcHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdGlvbi4KKyNkZWZpbmUgRlBERkRPQ19BQUNUSU9OX1dQIFwKKyAgMHgxMyAgLy8gV1AsIGJlZm9yZSBwcmludGluZyBkb2N1bWVudCwgSmF2YVNjcmlwdCBhY3Rpb24uCisjZGVmaW5lIEZQREZET0NfQUFDVElPTl9EUCBcCisgIDB4MTQgIC8vIERQLCBhZnRlciBwcmludGluZyBkb2N1bWVudCwgSmF2YVNjcmlwdCBhY3Rpb24uCiAvKioKICogRnVuY3Rpb246IEZPUk1fRG9Eb2N1bWVudEFBY3Rpb24KLSogICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIGZvciBwZXJmb3JtaW5nIHRoZSBkb2N1bWVudCdzIGFkZGl0aW9uYWwtYWN0aW9uLgorKiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIHBlcmZvcm1pbmcgdGhlIGRvY3VtZW50J3MKKyphZGRpdGlvbmFsLWFjdGlvbi4KICogUGFyYW1ldGVyczoKLSogICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCi0qICAgICAgICAgICBhYVR5cGUgICAgICAtICAgVGhlIHR5cGUgb2YgdGhlIGFkZGl0aW9uYWwtYWN0aW9ucyB3aGljaCBkZWZpbmVkIGFib3ZlLgorKiAgICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKypGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorKiAgICAgICAgICAgYWFUeXBlICAgICAgLSAgIFRoZSB0eXBlIG9mIHRoZSBhZGRpdGlvbmFsLWFjdGlvbnMgd2hpY2ggZGVmaW5lZAorKmFib3ZlLgogKiBSZXR1cm4gVmFsdWU6CiAqICAgICAgICAgICBOT05FCiAqIENvbW1lbnRzOgotKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIGRvY3VtZW50IGFkZGl0aW9uYWwtYWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhYVR5cGUuCisqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gZG9jdW1lbnQKKyphZGRpdGlvbmFsLWFjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYWFUeXBlLgogKiovCiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9Eb0RvY3VtZW50QUFjdGlvbihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwgaW50IGFhVHlwZSk7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fRG9Eb2N1bWVudEFBY3Rpb24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFhVHlwZSk7CiAKIC8vIEFkZGl0aW9uYWwtYWN0aW9uIHR5cGVzIG9mIHBhZ2Ugb2JqZWN0Ci0jZGVmaW5lIEZQREZQQUdFX0FBQ1RJT05fT1BFTiAgICAgICAwICAgICAgIC8vIC9PIC0tIEFuIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgcGFnZSBpcyBvcGVuZWQKLSNkZWZpbmUgRlBERlBBR0VfQUFDVElPTl9DTE9TRSAgICAgIDEgICAgICAgLy8gL0MgLS0gQW4gYWN0aW9uIHRvIGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBwYWdlIGlzIGNsb3NlZAorI2RlZmluZSBGUERGUEFHRV9BQUNUSU9OX09QRU4gXAorICAwICAvLyAvTyAtLSBBbiBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIHdoZW4gdGhlIHBhZ2UgaXMgb3BlbmVkCisjZGVmaW5lIEZQREZQQUdFX0FBQ1RJT05fQ0xPU0UgXAorICAxICAvLyAvQyAtLSBBbiBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIHdoZW4gdGhlIHBhZ2UgaXMgY2xvc2VkCiAKIC8qKgogKiBGdW5jdGlvbjogRk9STV9Eb1BhZ2VBQWN0aW9uCi0qICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBmb3IgcGVyZm9ybWluZyB0aGUgcGFnZSBvYmplY3QncyBhZGRpdGlvbmFsLWFjdGlvbiB3aGVuIG9wZW5lZCBvciBjbG9zZWQuCisqICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBmb3IgcGVyZm9ybWluZyB0aGUgcGFnZSBvYmplY3QncworKmFkZGl0aW9uYWwtYWN0aW9uIHdoZW4gb3BlbmVkIG9yIGNsb3NlZC4KICogUGFyYW1ldGVyczoKLSogICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0qICAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieSBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgotKiAgICAgICAgICAgYWFUeXBlICAgICAgLSAgIFRoZSB0eXBlIG9mIHRoZSBwYWdlIG9iamVjdCdzIGFkZGl0aW9uYWwtYWN0aW9ucyB3aGljaCBkZWZpbmVkIGFib3ZlLgorKiAgICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorKmZ1bmN0aW9uLgorKiAgICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKypGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorKiAgICAgICAgICAgYWFUeXBlICAgICAgLSAgIFRoZSB0eXBlIG9mIHRoZSBwYWdlIG9iamVjdCdzIGFkZGl0aW9uYWwtYWN0aW9ucworKndoaWNoIGRlZmluZWQgYWJvdmUuCiAqIFJldHVybiBWYWx1ZToKICogICAgICAgICAgIE5PTkUKICogQ29tbWVudHM6Ci0qICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcgaWYgbm8gYWRkaXRpb25hbC1hY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFhVHlwZSBleGlzdHMuCisqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcgaWYgbm8gYWRkaXRpb25hbC1hY3Rpb24gY29ycmVzcG9uZGluZyB0bworKnRoZSBzcGVjaWZpZWQgYWFUeXBlIGV4aXN0cy4KICoqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGT1JNX0RvUGFnZUFBY3Rpb24oRlBERl9QQUdFIHBhZ2UsIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLCBpbnQgYWFUeXBlKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9Eb1BhZ2VBQWN0aW9uKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWFUeXBlKTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRk9STV9Pbk1vdXNlTW92ZQogICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIHdoZW4gdGhlIG1vdXNlIGN1cnNvciBtb3Zlcy4KICAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieSBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgotICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZSBmdW5jdGlvbi4KKyAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5CisgKkZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisgKiAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisgKmZ1bmN0aW9uLgogICogICAgICAgICAgbW9kaWZpZXIgICAgICAgIC0gICBJbmRpY2F0ZXMgd2hldGhlciB2YXJpb3VzIHZpcnR1YWwga2V5cyBhcmUgZG93bi4KLSAqICAgICAgICAgIHBhZ2VfeCAgICAgIC0gICBTcGVjaWZpZXMgdGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgY3Vyc29yIGluIFBERiB1c2VyIHNwYWNlLgotICogICAgICAgICAgcGFnZV95ICAgICAgLSAgIFNwZWNpZmllcyB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSBjdXJzb3IgaW4gUERGIHVzZXIgc3BhY2UuCisgKiAgICAgICAgICBwYWdlX3ggICAgICAtICAgU3BlY2lmaWVzIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGN1cnNvciBpbiBQREYgdXNlcgorICpzcGFjZS4KKyAqICAgICAgICAgIHBhZ2VfeSAgICAgIC0gICBTcGVjaWZpZXMgdGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgY3Vyc29yIGluIFBERiB1c2VyCisgKnNwYWNlLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlLgogICoqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25Nb3VzZU1vdmUoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsRlBERl9QQUdFIHBhZ2UsIGludCBtb2RpZmllciwgZG91YmxlIHBhZ2VfeCwgZG91YmxlIHBhZ2VfeSk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9Pbk1vdXNlTW92ZShGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpOwogCiAvKioKICAqIEZ1bmN0aW9uOiBGT1JNX09uTEJ1dHRvbkRvd24KLSAqICAgICAgICAgIFlvdSBjYW4gY2FsbCB0aGlzIG1lbWJlciBmdW5jdGlvbiB3aGVuIHRoZSB1c2VyIHByZXNzZXMgdGhlIGxlZnQgbW91c2UgYnV0dG9uLgorICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgbGVmdAorICptb3VzZSBidXR0b24uCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KLSAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICpmdW5jdGlvbi4KICAqICAgICAgICAgIG1vZGlmaWVyICAgICAgICAtICAgSW5kaWNhdGVzIHdoZXRoZXIgdmFyaW91cyB2aXJ0dWFsIGtleXMgYXJlIGRvd24uCi0gKiAgICAgICAgICBwYWdlX3ggICAgICAtICAgU3BlY2lmaWVzIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGN1cnNvciBpbiBQREYgdXNlciBzcGFjZS4KLSAqICAgICAgICAgIHBhZ2VfeSAgICAgIC0gICBTcGVjaWZpZXMgdGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgY3Vyc29yIGluIFBERiB1c2VyIHNwYWNlLgorICogICAgICAgICAgcGFnZV94ICAgICAgLSAgIFNwZWNpZmllcyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBjdXJzb3IgaW4gUERGIHVzZXIKKyAqc3BhY2UuCisgKiAgICAgICAgICBwYWdlX3kgICAgICAtICAgU3BlY2lmaWVzIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGN1cnNvciBpbiBQREYgdXNlcgorICpzcGFjZS4KICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIFRSVUUgaW5kaWNhdGVzIHN1Y2Nlc3M7IG90aGVyd2lzZSBmYWxzZS4KICAqKi8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uTEJ1dHRvbkRvd24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsRlBERl9QQUdFIHBhZ2UsIGludCBtb2RpZmllciwgZG91YmxlIHBhZ2VfeCwgZG91YmxlIHBhZ2VfeSk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbkxCdXR0b25Eb3duKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV95KTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRk9STV9PbkxCdXR0b25VcAotICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIHdoZW4gdGhlIHVzZXIgcmVsZWFzZXMgdGhlIGxlZnQgbW91c2UgYnV0dG9uLgorICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIHdoZW4gdGhlIHVzZXIgcmVsZWFzZXMgdGhlIGxlZnQKKyAqbW91c2UgYnV0dG9uLgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCi0gKiAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgorICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKyAqRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KKyAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKyAqZnVuY3Rpb24uCiAgKiAgICAgICAgICBtb2RpZmllciAgICAtICAgSW5kaWNhdGVzIHdoZXRoZXIgdmFyaW91cyB2aXJ0dWFsIGtleXMgYXJlIGRvd24uCiAgKiAgICAgICAgICBwYWdlX3ggICAgICAtICAgU3BlY2lmaWVzIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGN1cnNvciBpbiBkZXZpY2UuCiAgKiAgICAgICAgICBwYWdlX3kgICAgICAtICAgU3BlY2lmaWVzIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGN1cnNvciBpbiBkZXZpY2UuCiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzOyBvdGhlcndpc2UgZmFsc2UuCiAgKiovCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbkxCdXR0b25VcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSxGUERGX1BBR0UgcGFnZSwgaW50IG1vZGlmaWVyLCBkb3VibGUgcGFnZV94LCBkb3VibGUgcGFnZV95KTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uTEJ1dHRvblVwKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSk7CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uUkJ1dHRvbkRvd24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIEZQREZfUEFHRSBwYWdlLCBpbnQgbW9kaWZpZXIsIGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3kpOwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25SQnV0dG9uVXAoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIEZQREZfUEFHRSBwYWdlLCBpbnQgbW9kaWZpZXIsIGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3kpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25SQnV0dG9uRG93bihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PblJCdXR0b25VcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpOwogCiAvKioKICAqIEZ1bmN0aW9uOiBGT1JNX09uS2V5RG93bgogICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIHdoZW4gYSBub25zeXN0ZW0ga2V5IGlzIHByZXNzZWQuCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KLSAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICpmdW5jdGlvbi4KICAqICAgICAgICAgIG5LZXlDb2RlICAgIC0gICBJbmRpY2F0ZXMgd2hldGhlciB2YXJpb3VzIHZpcnR1YWwga2V5cyBhcmUgZG93bi4KLSAqICAgICAgICAgIG1vZGlmaWVyICAgIC0gICBDb250YWlucyB0aGUgc2NhbiBjb2RlLCBrZXktdHJhbnNpdGlvbiBjb2RlLCBwcmV2aW91cyBrZXkgc3RhdGUsIGFuZCBjb250ZXh0IGNvZGUuCisgKiAgICAgICAgICBtb2RpZmllciAgICAtICAgQ29udGFpbnMgdGhlIHNjYW4gY29kZSwga2V5LXRyYW5zaXRpb24gY29kZSwKKyAqcHJldmlvdXMga2V5IHN0YXRlLCBhbmQgY29udGV4dCBjb2RlLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlLgogICoqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25LZXlEb3duKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLEZQREZfUEFHRSBwYWdlLCBpbnQgbktleUNvZGUsIGludCBtb2RpZmllcik7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbktleURvd24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5LZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllcik7CiAKIC8qKgogICogRnVuY3Rpb246IEZPUk1fT25LZXlVcAogICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIHdoZW4gYSBub25zeXN0ZW0ga2V5IGlzIHJlbGVhc2VkLgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCi0gKiAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgorICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKyAqRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KKyAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKyAqZnVuY3Rpb24uCiAgKiAgICAgICAgICBuS2V5Q29kZSAgICAtICAgVGhlIHZpcnR1YWwta2V5IGNvZGUgb2YgdGhlIGdpdmVuIGtleS4KLSAqICAgICAgICAgIG1vZGlmaWVyICAgIC0gICBDb250YWlucyB0aGUgc2NhbiBjb2RlLCBrZXktdHJhbnNpdGlvbiBjb2RlLCBwcmV2aW91cyBrZXkgc3RhdGUsIGFuZCBjb250ZXh0IGNvZGUuCisgKiAgICAgICAgICBtb2RpZmllciAgICAtICAgQ29udGFpbnMgdGhlIHNjYW4gY29kZSwga2V5LXRyYW5zaXRpb24gY29kZSwKKyAqcHJldmlvdXMga2V5IHN0YXRlLCBhbmQgY29udGV4dCBjb2RlLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlLgogICoqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25LZXlVcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSxGUERGX1BBR0UgcGFnZSwgaW50IG5LZXlDb2RlLCBpbnQgbW9kaWZpZXIpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25LZXlVcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyKTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRk9STV9PbkNoYXIKLSAqICAgICAgICAgIFlvdSBjYW4gY2FsbCB0aGlzIG1lbWJlciBmdW5jdGlvbiB3aGVuIGEga2V5c3Ryb2tlIHRyYW5zbGF0ZXMgdG8gYSBub25zeXN0ZW0gY2hhcmFjdGVyLgorICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIHdoZW4gYSBrZXlzdHJva2UgdHJhbnNsYXRlcyB0byBhCisgKm5vbnN5c3RlbSBjaGFyYWN0ZXIuCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KLSAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICpmdW5jdGlvbi4KICAqICAgICAgICAgIG5DaGFyICAgICAgIC0gICBUaGUgY2hhcmFjdGVyIGNvZGUgdmFsdWUgb2YgdGhlIGtleS4KLSAqICAgICAgICAgIG1vZGlmaWVyICAgIC0gICBDb250YWlucyB0aGUgc2NhbiBjb2RlLCBrZXktdHJhbnNpdGlvbiBjb2RlLCBwcmV2aW91cyBrZXkgc3RhdGUsIGFuZCBjb250ZXh0IGNvZGUuCisgKiAgICAgICAgICBtb2RpZmllciAgICAtICAgQ29udGFpbnMgdGhlIHNjYW4gY29kZSwga2V5LXRyYW5zaXRpb24gY29kZSwKKyAqcHJldmlvdXMga2V5IHN0YXRlLCBhbmQgY29udGV4dCBjb2RlLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlLgogICoqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25DaGFyKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLEZQREZfUEFHRSBwYWdlLCBpbnQgbkNoYXIsIGludCBtb2RpZmllcik7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbkNoYXIoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5DaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllcik7CiAKIC8qKgogICogRnVuY3Rpb246IEZPUk1fRm9yY2VUb0tpbGxGb2N1cy4KLSAqICAgICAgICAgIFlvdSBjYW4gY2FsbCB0aGlzIG1lbWJlciBmdW5jdGlvbiB0byBmb3JjZSB0byBraWxsIHRoZSBmb2N1cyBvZiB0aGUgZm9ybSBmaWVsZCB3aGljaCBnb3QgZm9jdXMuCi0gKiAgICAgICAgICBJdCB3b3VsZCBraWxsIHRoZSBmb2N1cyBvbiB0aGUgZm9ybSBmaWVsZCwgc2F2ZSB0aGUgdmFsdWUgb2YgZm9ybSBmaWVsZCBpZiBpdCdzIGNoYW5nZWQgYnkgdXNlci4KKyAqICAgICAgICAgIFlvdSBjYW4gY2FsbCB0aGlzIG1lbWJlciBmdW5jdGlvbiB0byBmb3JjZSB0byBraWxsIHRoZSBmb2N1cyBvZiB0aGUKKyAqZm9ybSBmaWVsZCB3aGljaCBnb3QgZm9jdXMuCisgKiAgICAgICAgICBJdCB3b3VsZCBraWxsIHRoZSBmb2N1cyBvbiB0aGUgZm9ybSBmaWVsZCwgc2F2ZSB0aGUgdmFsdWUgb2YgZm9ybQorICpmaWVsZCBpZiBpdCdzIGNoYW5nZWQgYnkgdXNlci4KICAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieSBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKyAqRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIFRSVUUgaW5kaWNhdGVzIHN1Y2Nlc3M7IG90aGVyd2lzZSBmYWxzZS4KICAqKi8KIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX0ZvcmNlVG9LaWxsRm9jdXMoRlBERl9GT1JNSEFORExFIGhIYW5kbGUpOwogCiAvLyBGaWVsZCBUeXBlcwotI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9VTktOT1dOICAgICAgMCAgICAgICAvLyBVbmtub3duLgotI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9QVVNIQlVUVE9OICAgMSAgICAgICAvLyBwdXNoIGJ1dHRvbiB0eXBlLgotI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9DSEVDS0JPWCAgICAgMiAgICAgICAvLyBjaGVjayBib3ggdHlwZS4KLSNkZWZpbmUgRlBERl9GT1JNRklFTERfUkFESU9CVVRUT04gIDMgICAgICAgLy8gcmFkaW8gYnV0dG9uIHR5cGUuCi0jZGVmaW5lIEZQREZfRk9STUZJRUxEX0NPTUJPQk9YICAgICA0ICAgICAgIC8vIGNvbWJvIGJveCB0eXBlLgotI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9MSVNUQk9YICAgICAgNSAgICAgICAvLyBsaXN0IGJveCB0eXBlLgotI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9URVhURklFTEQgICAgNiAgICAgICAvLyB0ZXh0IGZpZWxkIHR5cGUuCi0jZGVmaW5lIEZQREZfRk9STUZJRUxEX1hGQSAgICAgICAgICA3ICAgICAgIC8vIHRleHQgZmllbGQgdHlwZS4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfVU5LTk9XTiAwICAgICAgLy8gVW5rbm93bi4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfUFVTSEJVVFRPTiAxICAgLy8gcHVzaCBidXR0b24gdHlwZS4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfQ0hFQ0tCT1ggMiAgICAgLy8gY2hlY2sgYm94IHR5cGUuCisjZGVmaW5lIEZQREZfRk9STUZJRUxEX1JBRElPQlVUVE9OIDMgIC8vIHJhZGlvIGJ1dHRvbiB0eXBlLgorI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9DT01CT0JPWCA0ICAgICAvLyBjb21ibyBib3ggdHlwZS4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfTElTVEJPWCA1ICAgICAgLy8gbGlzdCBib3ggdHlwZS4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfVEVYVEZJRUxEIDYgICAgLy8gdGV4dCBmaWVsZCB0eXBlLgorI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9YRkEgNyAgICAgICAgICAvLyB0ZXh0IGZpZWxkIHR5cGUuCiAKIC8qKgogICogRnVuY3Rpb246IEZQRFBhZ2VfSGFzRm9ybUZpZWxkQXRQb2ludAogICogICAgICAgICAgQ2hlY2sgdGhlIGZvcm0gZmlsZWQgcG9zaXRpb24gYnkgcG9pbnQuCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KLSAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICpmdW5jdGlvbi4KICAqICAgICAgICAgIHBhZ2VfeCAgICAgIC0gICBYIHBvc2l0aW9uIGluIFBERiAidXNlciBzcGFjZSIuCiAgKiAgICAgICAgICBwYWdlX3kgICAgICAtICAgWSBwb3NpdGlvbiBpbiBQREYgInVzZXIgc3BhY2UiLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBmb3JtZmlsZWQ7IC0xIGluZGljYXRlcyBubyBmaWVsZHMuCiAgKiovCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBEUGFnZV9IYXNGb3JtRmllbGRBdFBvaW50KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLEZQREZfUEFHRSBwYWdlLGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3kpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQRFBhZ2VfSGFzRm9ybUZpZWxkQXRQb2ludChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpOwogCiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodENvbG9yCi0gKiAgICAgICAgICBTZXQgdGhlIGhpZ2hsaWdodCBjb2xvciBvZiBzcGVjaWZpZWQgb3IgYWxsIHRoZSBmb3JtIGZpZWxkcyBpbiB0aGUgZG9jdW1lbnQuCisgKiAgICAgICAgICBTZXQgdGhlIGhpZ2hsaWdodCBjb2xvciBvZiBzcGVjaWZpZWQgb3IgYWxsIHRoZSBmb3JtIGZpZWxkcyBpbiB0aGUKKyAqZG9jdW1lbnQuCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KLSAqICAgICAgICAgIGRvYyAgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KLSAqICAgICAgICAgIGZpZWxkVHlwZSAgIC0gICBBIDMyLWJpdCBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgYSBmb3JtIGZpZWxkKGRlZmluZWQgYWJvdmUpLgotICogICAgICAgICAgY29sb3IgICAgICAgLSAgIFRoZSBoaWdobGlnaHQgY29sb3Igb2YgdGhlIGZvcm0gZmllbGQuQ29uc3RydWN0ZWQgYnkgMHh4eHJyZ2diYi4KKyAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5CisgKkZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisgKiAgICAgICAgICBkb2MgICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4gUmV0dXJuZWQgYnkKKyAqRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisgKiAgICAgICAgICBmaWVsZFR5cGUgICAtICAgQSAzMi1iaXQgaW50ZWdlciBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGEgZm9ybQorICpmaWVsZChkZWZpbmVkIGFib3ZlKS4KKyAqICAgICAgICAgIGNvbG9yICAgICAgIC0gICBUaGUgaGlnaGxpZ2h0IGNvbG9yIG9mIHRoZSBmb3JtIGZpZWxkLkNvbnN0cnVjdGVkIGJ5CisgKjB4eHhycmdnYmIuCiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBOT05FLgogICogQ29tbWVudHM6Ci0gKiAgICAgICAgICBXaGVuIHRoZSBwYXJhbWV0ZXIgZmllbGRUeXBlIGlzIHNldCB0byB6ZXJvLCB0aGUgaGlnaGxpZ2h0IGNvbG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgdGhlIGZvcm0gZmllbGRzIGluIHRoZQorICogICAgICAgICAgV2hlbiB0aGUgcGFyYW1ldGVyIGZpZWxkVHlwZSBpcyBzZXQgdG8gemVybywgdGhlIGhpZ2hsaWdodCBjb2xvcgorICp3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBmb3JtIGZpZWxkcyBpbiB0aGUKICAqICAgICAgICAgIGRvY3VtZW50LgotICogICAgICAgICAgUGxlYXNlIHJlZnJlc2ggdGhlIGNsaWVudCB3aW5kb3cgdG8gc2hvdyB0aGUgaGlnaGxpZ2h0IGltbWVkaWF0ZWx5IGlmIG5lY2Vzc2FyeS4KKyAqICAgICAgICAgIFBsZWFzZSByZWZyZXNoIHRoZSBjbGllbnQgd2luZG93IHRvIHNob3cgdGhlIGhpZ2hsaWdodCBpbW1lZGlhdGVseQorICppZiBuZWNlc3NhcnkuCiAgKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0Q29sb3IoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIGludCBmaWVsZFR5cGUsIHVuc2lnbmVkIGxvbmcgY29sb3IpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodENvbG9yKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb2xvcik7CiAKIC8qKgogICogRnVuY3Rpb246IEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0QWxwaGEKLSAqICAgICAgICAgIFNldCB0aGUgdHJhbnNwYXJlbmN5IG9mIHRoZSBmb3JtIGZpZWxkIGhpZ2hsaWdodCBjb2xvciBpbiB0aGUgZG9jdW1lbnQuCisgKiAgICAgICAgICBTZXQgdGhlIHRyYW5zcGFyZW5jeSBvZiB0aGUgZm9ybSBmaWVsZCBoaWdobGlnaHQgY29sb3IgaW4gdGhlCisgKmRvY3VtZW50LgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCi0gKiAgICAgICAgICBkb2MgICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCi0gKiAgICAgICAgICBhbHBoYSAgICAgICAtICAgVGhlIHRyYW5zcGFyZW5jeSBvZiB0aGUgZm9ybSBmaWVsZCBoaWdobGlnaHQgY29sb3IuIGJldHdlZW4gMC0yNTUuCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorICogICAgICAgICAgZG9jICAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuIFJldHVybmVkIGJ5CisgKkZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICogICAgICAgICAgYWxwaGEgICAgICAgLSAgIFRoZSB0cmFuc3BhcmVuY3kgb2YgdGhlIGZvcm0gZmllbGQgaGlnaGxpZ2h0IGNvbG9yLgorICpiZXR3ZWVuIDAtMjU1LgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTk9ORS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9TZXRGb3JtRmllbGRIaWdobGlnaHRBbHBoYShGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwgdW5zaWduZWQgY2hhciBhbHBoYSk7Ci0KK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9TZXRGb3JtRmllbGRIaWdobGlnaHRBbHBoYShGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGFscGhhKTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRlBERl9SZW1vdmVGb3JtRmllbGRIaWdobGlnaHQKICAqICAgICAgICAgIFJlbW92ZSB0aGUgZm9ybSBmaWVsZCBoaWdobGlnaHQgY29sb3IgaW4gdGhlIGRvY3VtZW50LgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTk9ORS4KICAqIENvbW1lbnRzOgotICogICAgICAgICAgUGxlYXNlIHJlZnJlc2ggdGhlIGNsaWVudCB3aW5kb3cgdG8gcmVtb3ZlIHRoZSBoaWdobGlnaHQgaW1tZWRpYXRlbHkgaWYgbmVjZXNzYXJ5LgorICogICAgICAgICAgUGxlYXNlIHJlZnJlc2ggdGhlIGNsaWVudCB3aW5kb3cgdG8gcmVtb3ZlIHRoZSBoaWdobGlnaHQgaW1tZWRpYXRlbHkKKyAqaWYgbmVjZXNzYXJ5LgogICoqLwogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1JlbW92ZUZvcm1GaWVsZEhpZ2hsaWdodChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSk7CiAKQEAgLTEwOTUsNDIgKzEzODgsNjkgQEAKICogRnVuY3Rpb246IEZQREZfRkZMRHJhdwogKiAgICAgICAgICAgUmVuZGVyIEZvcm1GZWlsZHMgb24gYSBwYWdlIHRvIGEgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcC4KICogUGFyYW1ldGVyczoKLSogICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCi0qICAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBkZXZpY2UgaW5kZXBlbmRlbnQgYml0bWFwIChhcyB0aGUgb3V0cHV0IGJ1ZmZlcikuCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGhhbmRsZSBjYW4gYmUgY3JlYXRlZCBieSBGUERGQml0bWFwX0NyZWF0ZSBmdW5jdGlvbi4KLSogICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0qICAgICAgICAgICBzdGFydF94ICAgICAtICAgTGVmdCBwaXhlbCBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheSBhcmVhIGluIHRoZSBkZXZpY2UgY29vcmRpbmF0ZS4KLSogICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgZGV2aWNlIGNvb3JkaW5hdGUuCisqICAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorKkZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisqICAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBkZXZpY2UgaW5kZXBlbmRlbnQgYml0bWFwIChhcyB0aGUKKypvdXRwdXQgYnVmZmVyKS4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgaGFuZGxlIGNhbiBiZSBjcmVhdGVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlCisqZnVuY3Rpb24uCisqICAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisqZnVuY3Rpb24uCisqICAgICAgICAgICBzdGFydF94ICAgICAtICAgTGVmdCBwaXhlbCBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheSBhcmVhIGluIHRoZQorKmRldmljZSBjb29yZGluYXRlLgorKiAgICAgICAgICAgc3RhcnRfeSAgICAgLSAgIFRvcCBwaXhlbCBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheSBhcmVhIGluIHRoZSBkZXZpY2UKKypjb29yZGluYXRlLgogKiAgICAgICAgICAgc2l6ZV94ICAgICAgLSAgIEhvcml6b250YWwgc2l6ZSAoaW4gcGl4ZWxzKSBmb3IgZGlzcGxheWluZyB0aGUgcGFnZS4KICogICAgICAgICAgIHNpemVfeSAgICAgIC0gICBWZXJ0aWNhbCBzaXplIChpbiBwaXhlbHMpIGZvciBkaXNwbGF5aW5nIHRoZSBwYWdlLgotKiAgICAgICAgICAgcm90YXRlICAgICAgLSAgIFBhZ2Ugb3JpZW50YXRpb246IDAgKG5vcm1hbCksIDEgKHJvdGF0ZWQgOTAgZGVncmVlcyBjbG9ja3dpc2UpLAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKSwgMyAocm90YXRlZCA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlKS4KLSogICAgICAgICAgIGZsYWdzICAgICAgIC0gICAwIGZvciBub3JtYWwgZGlzcGxheSwgb3IgY29tYmluYXRpb24gb2YgZmxhZ3MgZGVmaW5lZCBhYm92ZS4KKyogICAgICAgICAgIHJvdGF0ZSAgICAgIC0gICBQYWdlIG9yaWVudGF0aW9uOiAwIChub3JtYWwpLCAxIChyb3RhdGVkIDkwIGRlZ3JlZXMKKypjbG9ja3dpc2UpLAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKSwgMyAocm90YXRlZCA5MCBkZWdyZWVzCisqY291bnRlci1jbG9ja3dpc2UpLgorKiAgICAgICAgICAgZmxhZ3MgICAgICAgLSAgIDAgZm9yIG5vcm1hbCBkaXNwbGF5LCBvciBjb21iaW5hdGlvbiBvZiBmbGFncworKmRlZmluZWQgYWJvdmUuCiAqIFJldHVybiBWYWx1ZToKICogICAgICAgICAgIE5vbmUuCiAqIENvbW1lbnRzOgotKiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG8gb25seSByZW5kZXIgYW5ub3RhdGlvbnMgYW5kIEZvcm1GaWVsZHMgb24gdGhlIHBhZ2UuCi0qICAgICAgICAgICBXaXRob3V0IEZQREZfQU5OT1Qgc3BlY2lmaWVkIGZvciBmbGFncywgUmVuZGVyaW5nIGZ1bmN0aW9ucyBzdWNoIGFzIEZQREZfUmVuZGVyUGFnZUJpdG1hcCBvciBGUERGX1JlbmRlclBhZ2VCaXRtYXBfU3RhcnQgd2lsbCBvbmx5IHJlbmRlciBwYWdlIGNvbnRlbnRzKHdpdGhvdXQgYW5ub3RhdGlvbnMpIHRvIGEgYml0bWFwLgotKiAgICAgICAgICAgSW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoZSBGb3JtRmlsbCBmdW5jdGlvbnMsSW1wbGVtZW50YXRpb24gc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucyBmaW5pc2ggcmVuZGVyaW5nIHRoZSBwYWdlIGNvbnRlbnRzLgorKiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG8gb25seSByZW5kZXIgYW5ub3RhdGlvbnMgYW5kIEZvcm1GaWVsZHMgb24KKyp0aGUgcGFnZS4KKyogICAgICAgICAgIFdpdGhvdXQgRlBERl9BTk5PVCBzcGVjaWZpZWQgZm9yIGZsYWdzLCBSZW5kZXJpbmcgZnVuY3Rpb25zIHN1Y2ggYXMKKypGUERGX1JlbmRlclBhZ2VCaXRtYXAgb3IgRlBERl9SZW5kZXJQYWdlQml0bWFwX1N0YXJ0IHdpbGwgb25seSByZW5kZXIgcGFnZQorKmNvbnRlbnRzKHdpdGhvdXQgYW5ub3RhdGlvbnMpIHRvIGEgYml0bWFwLgorKiAgICAgICAgICAgSW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoZSBGb3JtRmlsbCBmdW5jdGlvbnMsSW1wbGVtZW50YXRpb24gc2hvdWxkCisqY2FsbCB0aGlzIG1ldGhvZCBhZnRlciByZW5kZXJpbmcgZnVuY3Rpb25zIGZpbmlzaCByZW5kZXJpbmcgdGhlIHBhZ2UgY29udGVudHMuCiAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9GRkxEcmF3KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLEZQREZfQklUTUFQIGJpdG1hcCwgRlBERl9QQUdFIHBhZ2UsIGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsIGludCBzaXplX3ksIGludCByb3RhdGUsIGludCBmbGFncyk7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfRkZMRHJhdyhGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQklUTUFQIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX0hhc1hGQUZpZWxkCi0gKiAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBkZXNpZ25lZCB0byBjaGVjayB3aGV0aGVyIGEgcGRmIGRvY3VtZW50IGhhcyBYRkEgZmllbGRzLgorICogICAgICAgICAgICAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG8gY2hlY2sgd2hldGhlciBhIHBkZiBkb2N1bWVudAorICpoYXMgWEZBIGZpZWxkcy4KICAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudCAgICAgICAgICAgICAgICAtICAgICAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICAgICBkb2NUeXBlICAgICAgICAgICAgICAgICAtICAgICAgIERvY3VtZW50IHR5cGUgZGVmaW5lZCBhcyBET0NUWVBFX3h4eC4KKyAqICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50ICAgICAgICAgICAgICAgIC0gICAgICAgSGFuZGxlIHRvIGRvY3VtZW50LgorICpSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgIGRvY1R5cGUgICAgICAgICAgICAgICAgIC0gICAgICAgRG9jdW1lbnQgdHlwZSBkZWZpbmVkIGFzCisgKkRPQ1RZUEVfeHh4LgogICogUmV0dXJuIFZhbHVlOgotICogICAgICAgICAgICAgICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgdGhhdCB0aGUgaW5wdXQgZG9jdW1lbnQgaGFzIFhGQSBmaWVsZHMsIG90aGVyd2lzZSBGQUxTRS4KKyAqICAgICAgICAgICAgICAgICAgICAgIFRSVUUgaW5kaWNhdGVzIHRoYXQgdGhlIGlucHV0IGRvY3VtZW50IGhhcyBYRkEgZmllbGRzLAorICpvdGhlcndpc2UgRkFMU0UuCiAgKiovCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9IYXNYRkFGaWVsZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQqIGRvY1R5cGUpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfSGFzWEZBRmllbGQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZG9jVHlwZSk7CiAKIC8qKgogICogRnVuY3Rpb246IEZQREZfTG9hZFhGQQotICogICAgICAgICAgSWYgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIFhGQSBmaWVsZHMsIHRoZXJlIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHRvIGxvYWQgWEZBIGZpZWxkcy4KKyAqICAgICAgICAgIElmIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBYRkEgZmllbGRzLCB0aGVyZSBzaG91bGQgY2FsbCB0aGlzCisgKm1ldGhvZCB0byBsb2FkIFhGQSBmaWVsZHMuCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5CisgKkZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2VzcyxvdGhlcndpc2UgRkFMU0UuCiAgKiovCkBAIC0xMTM4LDk2ICsxNDU4LDEzOCBAQAogCiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX1dpZGdldF9VbmRvCi0gKiAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGltcGxlbWVudCB0aGUgdW5kbyBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkIHhmYSBmaWVsZC4KKyAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSB1bmRvIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhCisgKmZpZWxkLgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieQorICpGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KICAqICAgICAgICAgIGhXaWRnZXQgICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSB4ZmEgZmllbGQuCiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBOb25lLgogICoqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9VbmRvKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9VbmRvKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCk7CiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX1dpZGdldF9SZWRvCi0gKiAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGltcGxlbWVudCB0aGUgcmVkbyBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkIHhmYSBmaWVsZC4KKyAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSByZWRvIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhCisgKmZpZWxkLgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieQorICpGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KICAqICAgICAgICAgIGhXaWRnZXQgICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSB4ZmEgZmllbGQuCiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBOb25lLgogICoqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9SZWRvKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9SZWRvKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCk7CiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX1dpZGdldF9TZWxlY3RBbGwKLSAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBzZWxlY3QgYWxsIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhIGZpZWxkLgorICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBpbXBsZW1lbnQgdGhlIHNlbGVjdCBhbGwgZmVhdHVyZSBmb3IgdGhlIHNwZWNpZmllZAorICp4ZmEgZmllbGQuCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5CisgKkZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgogICogICAgICAgICAgaFdpZGdldCAgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHhmYSBmaWVsZC4KICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIE5vbmUuCiAgKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X1NlbGVjdEFsbChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREdFVCBoV2lkZ2V0KTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfU2VsZWN0QWxsKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREdFVCBoV2lkZ2V0KTsKIC8qKgogICogRnVuY3Rpb246IEZQREZfV2lkZ2V0X0NvcHkKLSAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBjb3B5IGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhIGZpZWxkLgorICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBpbXBsZW1lbnQgdGhlIGNvcHkgZmVhdHVyZSBmb3IgdGhlIHNwZWNpZmllZCB4ZmEKKyAqZmllbGQuCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5CisgKkZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgogICogICAgICAgICAgaFdpZGdldCAgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHhmYSBmaWVsZC4KLSAqICAgICAgICAgIHdzVGV4dCAgICAgICAgICAtICAgUG9pbnRlciB0byBkYXRhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBjb3BpZWQgZGF0YSwgaW4gVVRGLTE2TEUgZm9ybWF0LgorICogICAgICAgICAgd3NUZXh0ICAgICAgICAgIC0gICBQb2ludGVyIHRvIGRhdGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGNvcGllZAorICpkYXRhLCBpbiBVVEYtMTZMRSBmb3JtYXQuCiAgKiAgICAgICAgICBzaXplICAgICAgICAgICAgLSAgIFRoZSBkYXRhIGJ1ZmZlciBzaXplLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTm9uZS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfQ29weShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREdFVCBoV2lkZ2V0LCBGUERGX1dJREVTVFJJTkcgd3NUZXh0LCBGUERGX0RXT1JEKiBzaXplKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfQ29weShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHdzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEKiBzaXplKTsKIC8qKgogICogRnVuY3Rpb246IEZQREZfV2lkZ2V0X0N1dAotICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBpbXBsZW1lbnQgdGhlIGN1dCBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkIHhmYSBmaWVsZC4KKyAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBjdXQgZmVhdHVyZSBmb3IgdGhlIHNwZWNpZmllZCB4ZmEKKyAqZmllbGQuCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5CisgKkZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgogICogICAgICAgICAgaFdpZGdldCAgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHhmYSBmaWVsZC4KLSAqICAgICAgICAgIHdzVGV4dCAgICAgICAgICAtICAgUG9pbnRlciB0byBkYXRhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBjdXQgZGF0YSxpbiBVVEYtMTZMRSBmb3JtYXQuCisgKiAgICAgICAgICB3c1RleHQgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgY3V0CisgKmRhdGEsaW4gVVRGLTE2TEUgZm9ybWF0LgogICogICAgICAgICAgc2l6ZSAgICAgICAgICAgIC0gICBUaGUgZGF0YSBidWZmZXIgc2l6ZSxub3QgdGhlIGJ5dGUgbnVtYmVyLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTm9uZS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfQ3V0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQsIEZQREZfV0lERVNUUklORyB3c1RleHQsIEZQREZfRFdPUkQqIHNpemUpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9DdXQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgd3NUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCogc2l6ZSk7CiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX1dpZGdldF9QYXN0ZQotICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBpbXBsZW1lbnQgdGhlIHBhc3RlIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhIGZpZWxkLgorICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBpbXBsZW1lbnQgdGhlIHBhc3RlIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhCisgKmZpZWxkLgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieQorICpGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KICAqICAgICAgICAgIGhXaWRnZXQgICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSB4ZmEgZmllbGQuCiAgKiAgICAgICAgICB3c1RleHQgICAgICAgICAgLSAgIFRoZSBwYXN0ZSB0ZXh0IGJ1ZmZlciwgaW4gVVRGLTE2TEUgZm9ybWF0LgogICogICAgICAgICAgc2l6ZSAgICAgICAgICAgIC0gICBUaGUgZGF0YSBidWZmZXIgc2l6ZSxub3QgdGhlIGJ5dGUgbnVtYmVyLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTm9uZS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfUGFzdGUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9XSURHRVQgaFdpZGdldCwgRlBERl9XSURFU1RSSU5HIHdzVGV4dCwgRlBERl9EV09SRCBzaXplKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfUGFzdGUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHdzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBzaXplKTsKIC8qKgogICogRnVuY3Rpb246IEZQREZfV2lkZ2V0X1JlcGxhY2VTcGVsbENoZWNrV29yZAotICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBpbXBsZW1lbnQgdGhlIHNwZWxsIGNoZWNrIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhIGZpZWxkLgorICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBpbXBsZW1lbnQgdGhlIHNwZWxsIGNoZWNrIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQKKyAqeGZhIGZpZWxkLgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieQorICpGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KICAqICAgICAgICAgIGhXaWRnZXQgICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSB4ZmEgZmllbGQuCiAgKiAgICAgICAgICB4ICAgICAgICAgICAgICAgLSAgIFRoZSB4IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcG9pbnQuCiAgKiAgICAgICAgICB5ICAgICAgICAgICAgICAgLSAgIFRoZSB5IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcG9pbnQuCi0gKiAgICAgICAgICBic1RleHQgICAgICAgICAgLSAgIFRoZSB0ZXh0IGJ1ZmZlciBuZWVkZWQgdG8gYmUgc3BlY2sgY2hlY2ssIGluIFVURi0xNkxFIGZvcm1hdC4KKyAqICAgICAgICAgIGJzVGV4dCAgICAgICAgICAtICAgVGhlIHRleHQgYnVmZmVyIG5lZWRlZCB0byBiZSBzcGVjayBjaGVjaywgaW4KKyAqVVRGLTE2TEUgZm9ybWF0LgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTm9uZS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfUmVwbGFjZVNwZWxsQ2hlY2tXb3JkKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lER0VUIGhXaWRnZXQsIGZsb2F0IHgsIGZsb2F0IHksIEZQREZfQllURVNUUklORyBic1RleHQpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTAorRlBERl9XaWRnZXRfUmVwbGFjZVNwZWxsQ2hlY2tXb3JkKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIGJzVGV4dCk7CiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX1dpZGdldF9HZXRTcGVsbENoZWNrV29yZHMKLSAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBzcGVsbCBjaGVjayBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkIHhmYSBmaWVsZC4KKyAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBzcGVsbCBjaGVjayBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkCisgKnhmYSBmaWVsZC4KICAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisgKiAgICAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkKKyAqRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCiAgKiAgICAgICAgICBoV2lkZ2V0ICAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgeGZhIGZpZWxkLgogICogICAgICAgICAgeCAgICAgICAgICAgICAgIC0gICBUaGUgeCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBvaW50LgogICogICAgICAgICAgeSAgICAgICAgICAgICAgIC0gICBUaGUgeSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBvaW50LgotICogICAgICAgICAgc3RyaW5nSGFuZGxlICAgIC0gICBQb2ludGVyIHRvIEZQREZfU1RSSU5HSEFORExFIHRvIHJlY2VpdmUgdGhlIHNwZWNrIGNoZWNrIHRleHQgYnVmZmVyLCBpbiBVVEYtMTZMRSBmb3JtYXQuCisgKiAgICAgICAgICBzdHJpbmdIYW5kbGUgICAgLSAgIFBvaW50ZXIgdG8gRlBERl9TVFJJTkdIQU5ETEUgdG8gcmVjZWl2ZSB0aGUKKyAqc3BlY2sgY2hlY2sgdGV4dCBidWZmZXIsIGluIFVURi0xNkxFIGZvcm1hdC4KICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIE5vbmUuCiAgKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X0dldFNwZWxsQ2hlY2tXb3JkcyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREdFVCBoV2lkZ2V0LCBmbG9hdCB4LCBmbG9hdCB5LCBGUERGX1NUUklOR0hBTkRMRSogc3RyaW5nSGFuZGxlKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwKK0ZQREZfV2lkZ2V0X0dldFNwZWxsQ2hlY2tXb3JkcyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfU1RSSU5HSEFORExFKiBzdHJpbmdIYW5kbGUpOwogLyoqCiAgKiBGdW5jdGlvbjogRlBERl9TdHJpbmdIYW5kbGVDb3VudHMKICAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZ2V0IHRoZSBjb3VudCBvZiB0aGUgdGV4dCBidWZmZXIuCkBAIC0xMjQzLDEyICsxNjA1LDE3IEBACiAgKiBQYXJhbWV0ZXJzOgogICogICAgICAgICAgc3RyaW5nSGFuZGxlICAgIC0gICBQb2ludGVyIHRvIEZQREZfU1RSSU5HSEFORExFLgogICogICAgICAgICAgaW5kZXggICAgICAgICAgIC0gICBUaGUgc3BlY2lmaWVkIGluZGV4IG9mIHRleHQgYnVmZmVyLgotICogICAgICAgICAgYnNUZXh0ICAgICAgICAgIC0gICBQb2ludGVyIHRvIGRhdGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIHRleHQgYnVmZmVyLCBpbiBVVEYtMTZMRSBmb3JtYXQuCisgKiAgICAgICAgICBic1RleHQgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgdGV4dAorICpidWZmZXIsIGluIFVURi0xNkxFIGZvcm1hdC4KICAqICAgICAgICAgIHNpemUgICAgICAgICAgICAtICAgVGhlIGJ5dGUgc2l6ZSBvZiBkYXRhIGJ1ZmZlci4KICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIFRSVUUgaW5kaWNhdGVzIHN1Y2Nlc3MsIG90aGVyd2lzZSBGQUxTRS4KICAqKi8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1N0cmluZ0hhbmRsZUdldFN0cmluZ0J5SW5kZXgoRlBERl9TVFJJTkdIQU5ETEUgc3RyaW5nSGFuZGxlLCBpbnQgaW5kZXgsIEZQREZfQllURVNUUklORyBic1RleHQsIEZQREZfRFdPUkQqIHNpemUpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGUERGX1N0cmluZ0hhbmRsZUdldFN0cmluZ0J5SW5kZXgoRlBERl9TVFJJTkdIQU5ETEUgc3RyaW5nSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgYnNUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQqIHNpemUpOwogLyoqCiAgKiBGdW5jdGlvbjogRlBERl9TdHJpbmdIYW5kbGVSZWxlYXNlCiAgKiAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIHJlbGVhc2UgdGhlIEZQREZfU1RSSU5HSEFORExFLgpAQCAtMTI2MywxMiArMTYzMCwxNiBAQAogICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBhZGQgdGhlIHNwZWNpZmllZCB0ZXh0IGJ1ZmZlci4KICAqIFBhcmFtZXRlcnM6CiAgKiAgICAgICAgICBzdHJpbmdIYW5kbGUgICAgLSAgIFBvaW50ZXIgdG8gRlBERl9TVFJJTkdIQU5ETEUuCi0gKiAgICAgICAgICBic1RleHQgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgb2YgdGhlIHRleHQgYnVmZmVyLCBpbiBVVEYtMTZMRSBmb3JtYXQuCisgKiAgICAgICAgICBic1RleHQgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgb2YgdGhlIHRleHQgYnVmZmVyLCBpbgorICpVVEYtMTZMRSBmb3JtYXQuCiAgKiAgICAgICAgICBzaXplICAgICAgICAgICAgLSAgIFRoZSBieXRlIHNpemUgb2YgZGF0YSBidWZmZXIuCiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzLCBvdGhlcndpc2UgRkFMU0UuCiAgKiovCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9TdHJpbmdIYW5kbGVBZGRTdHJpbmcoRlBERl9TVFJJTkdIQU5ETEUgc3RyaW5nSGFuZGxlLCBGUERGX0JZVEVTVFJJTkcgYnNUZXh0LCBGUERGX0RXT1JEIHNpemUpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGUERGX1N0cmluZ0hhbmRsZUFkZFN0cmluZyhGUERGX1NUUklOR0hBTkRMRSBzdHJpbmdIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgYnNUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBzaXplKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZl9md2xldmVudC5oIGIvcHVibGljL2ZwZGZfZndsZXZlbnQuaAppbmRleCBmYTRmMTQ0Li4yMmMwMWU0IDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl9md2xldmVudC5oCisrKyBiL3B1YmxpYy9mcGRmX2Z3bGV2ZW50LmgKQEAgLTEzLDkwICsxMyw4NCBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotdHlwZWRlZiBpbnQgICAgICAgICBGUERGX0lOVDMyOwordHlwZWRlZiBpbnQgRlBERl9JTlQzMjsKIHR5cGVkZWYgdW5zaWduZWQgaW50IEZQREZfVUlOVDMyOwotdHlwZWRlZiBmbG9hdCAgICAgICBGUERGX0ZMT0FUOwotLy9ldmVudCB0eXBlCi10eXBlZGVmIGVudW0KLXsKLSAgICBGV0xfRVZFTlRUWVBFX01vdXNlID0gMCAsCi0gICAgRldMX0VWRU5UVFlQRV9Nb3VzZVdoZWVsLAotICAgIEZXTF9FVkVOVFRZUEVfS2V5ICAgICAgICwKK3R5cGVkZWYgZmxvYXQgRlBERl9GTE9BVDsKKy8vIGV2ZW50IHR5cGUKK3R5cGVkZWYgZW51bSB7CisgIEZXTF9FVkVOVFRZUEVfTW91c2UgPSAwLAorICBGV0xfRVZFTlRUWVBFX01vdXNlV2hlZWwsCisgIEZXTF9FVkVOVFRZUEVfS2V5LAogfSBGV0xfRVZFTlRUWVBFOwogCi0vL2tleSBmbGFnCi10eXBlZGVmIGVudW0KLXsKLSAgICBGV0xfRVZFTlRGTEFHX1NoaWZ0S2V5ICAgICAgICAgID0gMSA8PCAwLAotICAgIEZXTF9FVkVOVEZMQUdfQ29udHJvbEtleSAgICAgICAgPSAxIDw8IDEsCi0gICAgRldMX0VWRU5URkxBR19BbHRLZXkgICAgICAgICAgICA9IDEgPDwgMiwKLSAgICBGV0xfRVZFTlRGTEFHX01ldGFLZXkgICAgICAgICAgID0gMSA8PCAzLAotICAgIEZXTF9FVkVOVEZMQUdfS2V5UGFkICAgICAgICAgICAgPSAxIDw8IDQsCi0gICAgRldMX0VWRU5URkxBR19BdXRvUmVwZWF0ICAgICAgICA9IDEgPDwgNSwKLSAgICBGV0xfRVZFTlRGTEFHX0xlZnRCdXR0b25Eb3duICAgID0gMSA8PCA2LAotICAgIEZXTF9FVkVOVEZMQUdfTWlkZGxlQnV0dG9uRG93biAgPSAxIDw8IDcsCi0gICAgRldMX0VWRU5URkxBR19SaWdodEJ1dHRvbkRvd24gICA9IDEgPDwgOCwKKy8vIGtleSBmbGFnCit0eXBlZGVmIGVudW0geworICBGV0xfRVZFTlRGTEFHX1NoaWZ0S2V5ID0gMSA8PCAwLAorICBGV0xfRVZFTlRGTEFHX0NvbnRyb2xLZXkgPSAxIDw8IDEsCisgIEZXTF9FVkVOVEZMQUdfQWx0S2V5ID0gMSA8PCAyLAorICBGV0xfRVZFTlRGTEFHX01ldGFLZXkgPSAxIDw8IDMsCisgIEZXTF9FVkVOVEZMQUdfS2V5UGFkID0gMSA8PCA0LAorICBGV0xfRVZFTlRGTEFHX0F1dG9SZXBlYXQgPSAxIDw8IDUsCisgIEZXTF9FVkVOVEZMQUdfTGVmdEJ1dHRvbkRvd24gPSAxIDw8IDYsCisgIEZXTF9FVkVOVEZMQUdfTWlkZGxlQnV0dG9uRG93biA9IDEgPDwgNywKKyAgRldMX0VWRU5URkxBR19SaWdodEJ1dHRvbkRvd24gPSAxIDw8IDgsCiB9IEZXTF9FVkVOVEZMQUc7CiAKIC8vIE1vdXNlIG1lc3NhZ2UgY29tbWFuZAotdHlwZWRlZiBlbnVtCi17Ci0gICAgRldMX0VWRU5UTU9VU0VDTURfTEJ1dHRvbkRvd24gPSAxLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX0xCdXR0b25VcCwKLSAgICBGV0xfRVZFTlRNT1VTRUNNRF9MQnV0dG9uRGJsQ2xrLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX1JCdXR0b25Eb3duLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX1JCdXR0b25VcCwKLSAgICBGV0xfRVZFTlRNT1VTRUNNRF9SQnV0dG9uRGJsQ2xrLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX01CdXR0b25Eb3duLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX01CdXR0b25VcCwKLSAgICBGV0xfRVZFTlRNT1VTRUNNRF9NQnV0dG9uRGJsQ2xrLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX01vdXNlTW92ZSwKLSAgICBGV0xfRVZFTlRNT1VTRUNNRF9Nb3VzZUVudGVyLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX01vdXNlSG92ZXIsCi0gICAgRldMX0VWRU5UTU9VU0VDTURfTW91c2VMZWF2ZSwKK3R5cGVkZWYgZW51bSB7CisgIEZXTF9FVkVOVE1PVVNFQ01EX0xCdXR0b25Eb3duID0gMSwKKyAgRldMX0VWRU5UTU9VU0VDTURfTEJ1dHRvblVwLAorICBGV0xfRVZFTlRNT1VTRUNNRF9MQnV0dG9uRGJsQ2xrLAorICBGV0xfRVZFTlRNT1VTRUNNRF9SQnV0dG9uRG93biwKKyAgRldMX0VWRU5UTU9VU0VDTURfUkJ1dHRvblVwLAorICBGV0xfRVZFTlRNT1VTRUNNRF9SQnV0dG9uRGJsQ2xrLAorICBGV0xfRVZFTlRNT1VTRUNNRF9NQnV0dG9uRG93biwKKyAgRldMX0VWRU5UTU9VU0VDTURfTUJ1dHRvblVwLAorICBGV0xfRVZFTlRNT1VTRUNNRF9NQnV0dG9uRGJsQ2xrLAorICBGV0xfRVZFTlRNT1VTRUNNRF9Nb3VzZU1vdmUsCisgIEZXTF9FVkVOVE1PVVNFQ01EX01vdXNlRW50ZXIsCisgIEZXTF9FVkVOVE1PVVNFQ01EX01vdXNlSG92ZXIsCisgIEZXTF9FVkVOVE1PVVNFQ01EX01vdXNlTGVhdmUsCiB9IEZXTF9FVkVOVF9NT1VTRUNNRDsKIAotLy9tb3VzZSBldmVudAotc3RydWN0IEZXTF9FVkVOVF9NT1VTRQotewotICAgIEZQREZfVUlOVDMyIGNvbW1hbmQ7Ci0gICAgRlBERl9EV09SRCBmbGFnOwotICAgIEZQREZfRkxPQVQgeDsKLSAgICBGUERGX0ZMT0FUIHk7CisvLyBtb3VzZSBldmVudAorc3RydWN0IEZXTF9FVkVOVF9NT1VTRSB7CisgIEZQREZfVUlOVDMyIGNvbW1hbmQ7CisgIEZQREZfRFdPUkQgZmxhZzsKKyAgRlBERl9GTE9BVCB4OworICBGUERGX0ZMT0FUIHk7CiB9OwogCi0vL21vdXNlIHdoZWVsCi1zdHJ1Y3QgRldMX0VWRU5UX01PVVNFV0hFRUwKLXsKLSAgICBGUERGX0RXT1JEIGZsYWc7Ci0gICAgRlBERl9GTE9BVCB4OwotICAgIEZQREZfRkxPQVQgeTsKLSAgICBGUERGX0ZMT0FUIGRlbHRhWDsKLSAgICBGUERGX0ZMT0FUIGRlbHRhWTsKKy8vIG1vdXNlIHdoZWVsCitzdHJ1Y3QgRldMX0VWRU5UX01PVVNFV0hFRUwgeworICBGUERGX0RXT1JEIGZsYWc7CisgIEZQREZfRkxPQVQgeDsKKyAgRlBERl9GTE9BVCB5OworICBGUERGX0ZMT0FUIGRlbHRhWDsKKyAgRlBERl9GTE9BVCBkZWx0YVk7CiB9OwogCi0vL3ZpcnR1YWwga2V5Y29kZQotdHlwZWRlZiBlbnVtCi17Ci0gIEZXTF9WS0VZX0JhY2sgICAgID0gMHgwOCwKLSAgRldMX1ZLRVlfVGFiICAgICAgPSAweDA5LAotICBGV0xfVktFWV9DbGVhciAgICA9IDB4MEMsCi0gIEZXTF9WS0VZX1JldHVybiAgID0gMHgwRCwKLSAgRldMX1ZLRVlfU2hpZnQgICAgPSAweDEwLAotICBGV0xfVktFWV9Db250cm9sICA9IDB4MTEsCi0gIEZXTF9WS0VZX01lbnUgICAgID0gMHgxMiwKLSAgRldMX1ZLRVlfUGF1c2UgICAgPSAweDEzLAotICBGV0xfVktFWV9DYXBpdGFsICA9IDB4MTQsCi0gIEZXTF9WS0VZX0thbmEgICAgID0gMHgxNSwKLSAgRldMX1ZLRVlfSGFuZ3VsICAgPSAweDE1LAotICBGV0xfVktFWV9KdW5qYSAgICA9IDB4MTcsCi0gIEZXTF9WS0VZX0ZpbmFsICAgID0gMHgxOCwKLSAgRldMX1ZLRVlfSGFuamEgICAgPSAweDE5LAotICBGV0xfVktFWV9LYW5qaSAgICA9IDB4MTksCi0gIEZXTF9WS0VZX0VzY2FwZSAgID0gMHgxQiwKLSAgRldMX1ZLRVlfQ29udmVydCAgPSAweDFDLAorLy8gdmlydHVhbCBrZXljb2RlCit0eXBlZGVmIGVudW0geworICBGV0xfVktFWV9CYWNrID0gMHgwOCwKKyAgRldMX1ZLRVlfVGFiID0gMHgwOSwKKyAgRldMX1ZLRVlfQ2xlYXIgPSAweDBDLAorICBGV0xfVktFWV9SZXR1cm4gPSAweDBELAorICBGV0xfVktFWV9TaGlmdCA9IDB4MTAsCisgIEZXTF9WS0VZX0NvbnRyb2wgPSAweDExLAorICBGV0xfVktFWV9NZW51ID0gMHgxMiwKKyAgRldMX1ZLRVlfUGF1c2UgPSAweDEzLAorICBGV0xfVktFWV9DYXBpdGFsID0gMHgxNCwKKyAgRldMX1ZLRVlfS2FuYSA9IDB4MTUsCisgIEZXTF9WS0VZX0hhbmd1bCA9IDB4MTUsCisgIEZXTF9WS0VZX0p1bmphID0gMHgxNywKKyAgRldMX1ZLRVlfRmluYWwgPSAweDE4LAorICBGV0xfVktFWV9IYW5qYSA9IDB4MTksCisgIEZXTF9WS0VZX0thbmppID0gMHgxOSwKKyAgRldMX1ZLRVlfRXNjYXBlID0gMHgxQiwKKyAgRldMX1ZLRVlfQ29udmVydCA9IDB4MUMsCiAgIEZXTF9WS0VZX05vbkNvbnZlcnQgPSAweDFELAotICBGV0xfVktFWV9BY2NlcHQgICAgPSAweDFFLAorICBGV0xfVktFWV9BY2NlcHQgPSAweDFFLAogICBGV0xfVktFWV9Nb2RlQ2hhbmdlID0gMHgxRiwKICAgRldMX1ZLRVlfU3BhY2UgPSAweDIwLAogICBGV0xfVktFWV9QcmlvciA9IDB4MjEsCkBAIC0yNDgsNDEgKzI0MiwzNiBAQAogICBGV0xfVktFWV9Vbmtub3duID0gMCwKIH0gRldMX1ZLRVlDT0RFOwogCi0vL2tleSBldmVudCBjb21tYW5kCi10eXBlZGVmIGVudW0KLXsKLSAgICBGV0xfRVZFTlRLRVlDTURfS2V5RG93biA9IDEsCi0gICAgRldMX0VWRU5US0VZQ01EX0tleVVwLAotICAgIEZXTF9FVkVOVEtFWUNNRF9DaGFyLAorLy8ga2V5IGV2ZW50IGNvbW1hbmQKK3R5cGVkZWYgZW51bSB7CisgIEZXTF9FVkVOVEtFWUNNRF9LZXlEb3duID0gMSwKKyAgRldMX0VWRU5US0VZQ01EX0tleVVwLAorICBGV0xfRVZFTlRLRVlDTURfQ2hhciwKIH0gRldMX0VWRU5US0VZQ01EOwogCi0vL2tleSBldmVudAotc3RydWN0IEZXTF9FVkVOVF9LRVkKLXsKLSAgICBGUERGX1VJTlQzMiBjb21tYW5kOwotICAgIEZQREZfRFdPUkQgZmxhZzsKLSAgICB1bmlvbgotICAgIHsKLSAgICAgICAgLy9WaXJ0dWFsIGtleSBjb2RlLgotICAgICAgICBGUERGX1VJTlQzMiB2a2NvZGU7Ci0gICAgICAgIC8vQ2hhcmFjdGVyIGNvZGUuCi0gICAgICAgIEZQREZfRFdPUkQgY2hhcmNvZGU7Ci0gICAgfWNvZGU7CisvLyBrZXkgZXZlbnQKK3N0cnVjdCBGV0xfRVZFTlRfS0VZIHsKKyAgRlBERl9VSU5UMzIgY29tbWFuZDsKKyAgRlBERl9EV09SRCBmbGFnOworICB1bmlvbiB7CisgICAgLy8gVmlydHVhbCBrZXkgY29kZS4KKyAgICBGUERGX1VJTlQzMiB2a2NvZGU7CisgICAgLy8gQ2hhcmFjdGVyIGNvZGUuCisgICAgRlBERl9EV09SRCBjaGFyY29kZTsKKyAgfSBjb2RlOwogfTsKIAotLy9ldmVudCB0eXBlCi1zdHJ1Y3QgRldMX0VWRU5UCi17Ci0gICAgLy9zdHJ1Y3R1cmUgc2l6ZS4KLSAgICBGUERGX1VJTlQzMiBzaXplOwotICAgIC8vRldMX0VWRU5UVFlQRS4KLSAgICBGUERGX1VJTlQzMiB0eXBlOwotICAgIHVuaW9uCi0gICAgewotICAgICAgICBzdHJ1Y3QgRldMX0VWRU5UX01PVVNFIG1vdXNlOwotICAgICAgICBzdHJ1Y3QgRldMX0VWRU5UX01PVVNFV0hFRUwgd2hlZWw7Ci0gICAgICAgIHN0cnVjdCBGV0xfRVZFTlRfS0VZIGtleTsKLSAgICB9czsKKy8vIGV2ZW50IHR5cGUKK3N0cnVjdCBGV0xfRVZFTlQgeworICAvLyBzdHJ1Y3R1cmUgc2l6ZS4KKyAgRlBERl9VSU5UMzIgc2l6ZTsKKyAgLy8gRldMX0VWRU5UVFlQRS4KKyAgRlBERl9VSU5UMzIgdHlwZTsKKyAgdW5pb24geworICAgIHN0cnVjdCBGV0xfRVZFTlRfTU9VU0UgbW91c2U7CisgICAgc3RydWN0IEZXTF9FVkVOVF9NT1VTRVdIRUVMIHdoZWVsOworICAgIHN0cnVjdCBGV0xfRVZFTlRfS0VZIGtleTsKKyAgfSBzOwogfTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZl9wcG8uaCBiL3B1YmxpYy9mcGRmX3Bwby5oCmluZGV4IDEwMjFmYWUuLjk2NDU1NDUgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX3Bwby5oCisrKyBiL3B1YmxpYy9mcGRmX3Bwby5oCkBAIC0xOSwyNCArMTksMzAgQEAKIC8vICAgICAgICAgIGRlc3RfZG9jICAgIC0gICBUaGUgZGVzdGluYXRpb24gZG9jdW1lbnQgd2hpY2ggYWRkIHRoZSBwYWdlcy4KIC8vICAgICAgICAgIHNyY19kb2MgICAgIC0gICBBIGRvY3VtZW50IHRvIGJlIGltcG9ydGVkLgogLy8gICAgICAgICAgcGFnZXJhbmdlICAgLSAgIEEgcGFnZSByYW5nZSBzdHJpbmcsIFN1Y2ggYXMgIjEsMyw1LTciLgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgcGFyYW1ldGVyIGlzIE5VTEwsIGl0IHdvdWxkIGltcG9ydCBhbGwgcGFnZXMgaW4gc3JjX2RvYy4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIHBhcmFtZXRlciBpcyBOVUxMLCBpdCB3b3VsZCBpbXBvcnQgYWxsIHBhZ2VzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc3JjX2RvYy4KIC8vICAgICAgICAgIGluZGV4ICAgICAgIC0gICBUaGUgcGFnZSBpbmRleCB3YW50ZWQgdG8gaW5zZXJ0IGZyb20uCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUUlVFIGZvciBzdWNjZWVkLCBGQUxTRSBmb3IgRmFpbGVkLgogLy8gTm90ZXM6Ci0vLyAgICAgICAgICBUaGUgbWV0aG9kIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2Qgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YKKy8vICAgICAgICAgIGR5bmFtaWMgWEZBIGZpZWxkcy4KIC8vCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9JbXBvcnRQYWdlcyhGUERGX0RPQ1VNRU5UIGRlc3RfZG9jLEZQREZfRE9DVU1FTlQgc3JjX2RvYywgRlBERl9CWVRFU1RSSU5HIHBhZ2VyYW5nZSwgaW50IGluZGV4KTsKLQorRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfSW1wb3J0UGFnZXMoRlBERl9ET0NVTUVOVCBkZXN0X2RvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRE9DVU1FTlQgc3JjX2RvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBwYWdlcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOwogCiAvLyBGdW5jdGlvbjogRlBERl9Db3B5Vmlld2VyUHJlZmVyZW5jZXMKIC8vICAgICAgICAgIENvcHkgdGhlIHZpZXdlciBwcmVmZXJlbmNlcyBmcm9tIG9uZSBQREYgZG9jdW1lbnQgdG8gYW5vdGhlci4jZW5kaWYKIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBkZXN0X2RvYyAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IHRvIHdyaXRlIHRoZSB2aWV3ZXIgcHJlZmVyZW5jZXMgdG8uCisvLyAgICAgICAgICBkZXN0X2RvYyAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IHRvIHdyaXRlIHRoZSB2aWV3ZXIgcHJlZmVyZW5jZXMKKy8vICAgICAgICAgIHRvLgogLy8gICAgICAgICAgc3JjX2RvYyAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudCB3aXRoIHRoZSB2aWV3ZXIgcHJlZmVyZW5jZXMuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUUlVFIGZvciBzdWNjZXNzLCBGQUxTRSBmb3IgZmFpbHVyZS4KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0NvcHlWaWV3ZXJQcmVmZXJlbmNlcyhGUERGX0RPQ1VNRU5UIGRlc3RfZG9jLCBGUERGX0RPQ1VNRU5UIHNyY19kb2MpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfQ29weVZpZXdlclByZWZlcmVuY2VzKEZQREZfRE9DVU1FTlQgZGVzdF9kb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9ET0NVTUVOVCBzcmNfZG9jKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZl9wcm9ncmVzc2l2ZS5oIGIvcHVibGljL2ZwZGZfcHJvZ3Jlc3NpdmUuaAppbmRleCBkMWJiYzQwLi4xMTUwMzQ5IDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl9wcm9ncmVzc2l2ZS5oCisrKyBiL3B1YmxpYy9mcGRmX3Byb2dyZXNzaXZlLmgKQEAgLTksODkgKzksMTE0IEBACiAKICNpbmNsdWRlICJmcGRmdmlldy5oIgogCi0vL0ZsYWdzIGZvciBwcm9ncmVzc2l2ZSBwcm9jZXNzIHN0YXR1cy4KLSNkZWZpbmUgRlBERl9SRU5ERVJfUkVBREVSICAgICAgICAgIDAKLSNkZWZpbmUgRlBERl9SRU5ERVJfVE9CRUNPVU5USU5VRUQgIDEKLSNkZWZpbmUgRlBERl9SRU5ERVJfRE9ORSAgICAgICAgICAgIDIKLSNkZWZpbmUgRlBERl9SRU5ERVJfRkFJTEVEICAgICAgICAgIDMKLQorLy8gRmxhZ3MgZm9yIHByb2dyZXNzaXZlIHByb2Nlc3Mgc3RhdHVzLgorI2RlZmluZSBGUERGX1JFTkRFUl9SRUFERVIgMAorI2RlZmluZSBGUERGX1JFTkRFUl9UT0JFQ09VTlRJTlVFRCAxCisjZGVmaW5lIEZQREZfUkVOREVSX0RPTkUgMgorI2RlZmluZSBGUERGX1JFTkRFUl9GQUlMRUQgMwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKKy8vIElGUERGX1JFTkRFUklORk8gaW50ZXJmYWNlLgordHlwZWRlZiBzdHJ1Y3QgX0lGU0RLX1BBVVNFIHsKKyAgLyoqCisgICogVmVyc2lvbiBudW1iZXIgb2YgdGhlIGludGVyZmFjZS4gQ3VycmVudGx5IG11c3QgYmUgMS4KKyAgKiovCisgIGludCB2ZXJzaW9uOwogCi0vL0lGUERGX1JFTkRFUklORk8gaW50ZXJmYWNlLgotdHlwZWRlZiBzdHJ1Y3QgX0lGU0RLX1BBVVNFCi17Ci0gICAgLyoqCi0gICAgKiBWZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAxLgotICAgICoqLwotICAgIGludCB2ZXJzaW9uOworICAvKgorICAqIE1ldGhvZDogTmVlZFRvUGF1c2VOb3cKKyAgKiAgICAgICAgICAgQ2hlY2sgaWYgd2UgbmVlZCB0byBwYXVzZSBhIHByb2dyZXNzaXZlIHByb2Nlc3Mgbm93LgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgorICAqIFJldHVybiBWYWx1ZToKKyAgKiAgICAgICAgICAgIE5vbi16ZXJvIGZvciBwYXVzZSBub3csIDAgZm9yIGNvbnRpbnVlLgorICAqCisgICovCisgIEZQREZfQk9PTCAoKk5lZWRUb1BhdXNlTm93KShzdHJ1Y3QgX0lGU0RLX1BBVVNFKiBwVGhpcyk7CiAKLSAgICAvKgotICAgICogTWV0aG9kOiBOZWVkVG9QYXVzZU5vdwotICAgICogICAgICAgICAgIENoZWNrIGlmIHdlIG5lZWQgdG8gcGF1c2UgYSBwcm9ncmVzc2l2ZSBwcm9jZXNzIG5vdy4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIHllcwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAqIFJldHVybiBWYWx1ZToKLSAgICAqICAgICAgICAgICAgTm9uLXplcm8gZm9yIHBhdXNlIG5vdywgMCBmb3IgY29udGludWUuCi0gICAgKgotICAgICovCi0gICAgRlBERl9CT09MICgqTmVlZFRvUGF1c2VOb3cpIChzdHJ1Y3QgX0lGU0RLX1BBVVNFKiBwVGhpcyk7Ci0KLSAgICAvL0EgdXNlciBkZWZpbmVkIGRhdGEgcG9pbnRlciwgdXNlZCBieSB1c2VyJ3MgYXBwbGljYXRpb24uIENhbiBiZSBOVUxMLgotICAgIHZvaWQqICAgICAgIHVzZXI7CisgIC8vIEEgdXNlciBkZWZpbmVkIGRhdGEgcG9pbnRlciwgdXNlZCBieSB1c2VyJ3MgYXBwbGljYXRpb24uIENhbiBiZSBOVUxMLgorICB2b2lkKiB1c2VyOwogfSBJRlNES19QQVVTRTsKIAogLy8gRnVuY3Rpb246IEZQREZfUmVuZGVyUGFnZUJpdG1hcF9TdGFydAotLy8gICAgICAgICAgU3RhcnQgdG8gcmVuZGVyIHBhZ2UgY29udGVudHMgdG8gYSBkZXZpY2UgaW5kZXBlbmRlbnQgYml0bWFwIHByb2dyZXNzaXZlbHkuCisvLyAgICAgICAgICBTdGFydCB0byByZW5kZXIgcGFnZSBjb250ZW50cyB0byBhIGRldmljZSBpbmRlcGVuZGVudCBiaXRtYXAKKy8vICAgICAgICAgIHByb2dyZXNzaXZlbHkuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcCAoYXMgdGhlIG91dHB1dCBidWZmZXIpLgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBoYW5kbGUgY2FuIGJlIGNyZWF0ZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24uCi0vLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotLy8gICAgICAgICAgc3RhcnRfeCAgICAgLSAgIExlZnQgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgYml0bWFwIGNvb3JkaW5hdGUuCi0vLyAgICAgICAgICBzdGFydF95ICAgICAtICAgVG9wIHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlIGJpdG1hcCBjb29yZGluYXRlLgorLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcCAoYXMgdGhlCisvLyAgICAgICAgICBvdXRwdXQgYnVmZmVyKS4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgaGFuZGxlIGNhbiBiZSBjcmVhdGVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisvLyAgICAgICAgICBmdW5jdGlvbi4KKy8vICAgICAgICAgIHN0YXJ0X3ggICAgIC0gICBMZWZ0IHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlCisvLyAgICAgICAgICBiaXRtYXAgY29vcmRpbmF0ZS4KKy8vICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgYml0bWFwCisvLyAgICAgICAgICBjb29yZGluYXRlLgogLy8gICAgICAgICAgc2l6ZV94ICAgICAgLSAgIEhvcml6b250YWwgc2l6ZSAoaW4gcGl4ZWxzKSBmb3IgZGlzcGxheWluZyB0aGUgcGFnZS4KIC8vICAgICAgICAgIHNpemVfeSAgICAgIC0gICBWZXJ0aWNhbCBzaXplIChpbiBwaXhlbHMpIGZvciBkaXNwbGF5aW5nIHRoZSBwYWdlLgotLy8gICAgICAgICAgcm90YXRlICAgICAgLSAgIFBhZ2Ugb3JpZW50YXRpb246IDAgKG5vcm1hbCksIDEgKHJvdGF0ZWQgOTAgZGVncmVlcyBjbG9ja3dpc2UpLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKSwgMyAocm90YXRlZCA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlKS4KLS8vICAgICAgICAgIGZsYWdzICAgICAgIC0gICAwIGZvciBub3JtYWwgZGlzcGxheSwgb3IgY29tYmluYXRpb24gb2YgZmxhZ3MgZGVmaW5lZCBhYm92ZS4KLS8vICAgICAgICAgIHBhdXNlICAgICAgIC0gICBUaGUgSUZTREtfUEFVU0UgaW50ZXJmYWNlLkEgY2FsbGJhY2sgbWVjaGFuaXNtIGFsbG93aW5nIHRoZSBwYWdlIHJlbmRlcmluZyBwcm9jZXNzCisvLyAgICAgICAgICByb3RhdGUgICAgICAtICAgUGFnZSBvcmllbnRhdGlvbjogMCAobm9ybWFsKSwgMSAocm90YXRlZCA5MCBkZWdyZWVzCisvLyAgICAgICAgICBjbG9ja3dpc2UpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKSwgMyAocm90YXRlZCA5MCBkZWdyZWVzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXItY2xvY2t3aXNlKS4KKy8vICAgICAgICAgIGZsYWdzICAgICAgIC0gICAwIGZvciBub3JtYWwgZGlzcGxheSwgb3IgY29tYmluYXRpb24gb2YgZmxhZ3MKKy8vICAgICAgICAgIGRlZmluZWQgYWJvdmUuCisvLyAgICAgICAgICBwYXVzZSAgICAgICAtICAgVGhlIElGU0RLX1BBVVNFIGludGVyZmFjZS5BIGNhbGxiYWNrIG1lY2hhbmlzbQorLy8gICAgICAgICAgYWxsb3dpbmcgdGhlIHBhZ2UgcmVuZGVyaW5nIHByb2Nlc3MKIC8vIFJldHVybiB2YWx1ZToKLS8vICAgICAgICAgIFJlbmRlcmluZyBTdGF0dXMuIFNlZSBmbGFncyBmb3IgcHJvZ3Jlc3NpdmUgcHJvY2VzcyBzdGF0dXMgZm9yIHRoZSBkZXRhaWxzLgorLy8gICAgICAgICAgUmVuZGVyaW5nIFN0YXR1cy4gU2VlIGZsYWdzIGZvciBwcm9ncmVzc2l2ZSBwcm9jZXNzIHN0YXR1cyBmb3IgdGhlCisvLyAgICAgICAgICBkZXRhaWxzLgogLy8gTm90ZXM6Ci0vLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbm5vdCBub3Qgc3VwcG9ydCB0byByZW5kZXIgcGFnZSB3aGljaCB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgorLy8gICAgICAgICAgVGhlIG1ldGhvZCBjYW5ub3Qgbm90IHN1cHBvcnQgdG8gcmVuZGVyIHBhZ2Ugd2hpY2ggdGhlIGRvY3VtZW50CisvLyAgICAgICAgICBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZUJpdG1hcF9TdGFydChGUERGX0JJVE1BUCBiaXRtYXAsIEZQREZfUEFHRSBwYWdlLCBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LCBpbnQgcm90YXRlLCBpbnQgZmxhZ3MsSUZTREtfUEFVU0UgKiBwYXVzZSk7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9SZW5kZXJQYWdlQml0bWFwX1N0YXJ0KEZQREZfQklUTUFQIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlNES19QQVVTRSogcGF1c2UpOwogCiAvLyBGdW5jdGlvbjogRlBERl9SZW5kZXJQYWdlX0NvbnRpbnVlCiAvLyAgICAgICAgICBDb250aW51ZSByZW5kZXJpbmcgYSBQREYgcGFnZS4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotLy8gICAgICAgICAgcGF1c2UgICAgICAgLSAgIFRoZSBJRlNES19QQVVTRSBpbnRlcmZhY2UuQSBjYWxsYmFjayBtZWNoYW5pc20gYWxsb3dpbmcgdGhlIHBhZ2UgcmVuZGVyaW5nIHByb2Nlc3MKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwYXVzZWQgYmVmb3JlIGl0J3MgZmluaXNoZWQuIFRoaXMgY2FuIGJlIE5VTEwgaWYgeW91IGRvbid0IHdhbnQgdG8gcGF1c2UuCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisvLyAgICAgICAgICBmdW5jdGlvbi4KKy8vICAgICAgICAgIHBhdXNlICAgICAgIC0gICBUaGUgSUZTREtfUEFVU0UgaW50ZXJmYWNlLkEgY2FsbGJhY2sgbWVjaGFuaXNtCisvLyAgICAgICAgICBhbGxvd2luZyB0aGUgcGFnZSByZW5kZXJpbmcgcHJvY2VzcworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHBhdXNlZCBiZWZvcmUgaXQncyBmaW5pc2hlZC4gVGhpcyBjYW4gYmUgTlVMTAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHlvdSBkb24ndCB3YW50IHRvIHBhdXNlLgogLy8gUmV0dXJuIHZhbHVlOgotLy8gICAgICAgICAgVGhlIHJlbmRlcmluZyBzdGF0dXMuIFNlZSBmbGFncyBmb3IgcHJvZ3Jlc3NpdmUgcHJvY2VzcyBzdGF0dXMgZm9yIHRoZSBkZXRhaWxzLgorLy8gICAgICAgICAgVGhlIHJlbmRlcmluZyBzdGF0dXMuIFNlZSBmbGFncyBmb3IgcHJvZ3Jlc3NpdmUgcHJvY2VzcyBzdGF0dXMgZm9yCisvLyAgICAgICAgICB0aGUgZGV0YWlscy4KIC8vIE5vdGVzOgotLy8gICAgICAgICAgVGhlIG1ldGhvZCBjYW5ub3Qgbm90IHN1cHBvcnQgdG8gcmVuZGVyIHBhZ2Ugd2hpY2ggdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2Fubm90IG5vdCBzdXBwb3J0IHRvIHJlbmRlciBwYWdlIHdoaWNoIHRoZSBkb2N1bWVudAorLy8gICAgICAgICAgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgogLy8KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX1JlbmRlclBhZ2VfQ29udGludWUoRlBERl9QQUdFIHBhZ2UsSUZTREtfUEFVU0UgKiBwYXVzZSk7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9SZW5kZXJQYWdlX0NvbnRpbnVlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlNES19QQVVTRSogcGF1c2UpOwogCiAvLyBGdW5jdGlvbjogRlBERl9SZW5kZXJQYWdlX0Nsb3NlCi0vLyAgICAgICAgICBSZWxlYXNlIHRoZSByZXNvdXJjZSBhbGxvY2F0ZSBkdXJpbmcgcGFnZSByZW5kZXJpbmcuIE5lZWQgdG8gYmUgY2FsbGVkIGFmdGVyIGZpbmlzaGluZyByZW5kZXJpbmcgb3IKKy8vICAgICAgICAgIFJlbGVhc2UgdGhlIHJlc291cmNlIGFsbG9jYXRlIGR1cmluZyBwYWdlIHJlbmRlcmluZy4gTmVlZCB0byBiZQorLy8gICAgICAgICAgY2FsbGVkIGFmdGVyIGZpbmlzaGluZyByZW5kZXJpbmcgb3IKIC8vICAgICAgICAgIGNhbmNlbCB0aGUgcmVuZGVyaW5nLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisvLyAgICAgICAgICBmdW5jdGlvbi4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5VTEwKIC8vIE5vdGVzOgotLy8gICAgICAgICAgVGhlIG1ldGhvZCBjYW5ub3Qgbm90IHN1cHBvcnQgdG8gcmVuZGVyIHBhZ2Ugd2hpY2ggdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2Fubm90IG5vdCBzdXBwb3J0IHRvIHJlbmRlciBwYWdlIHdoaWNoIHRoZSBkb2N1bWVudAorLy8gICAgICAgICAgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgogLy8KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9SZW5kZXJQYWdlX0Nsb3NlKEZQREZfUEFHRSBwYWdlKTsKIApkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZfc2F2ZS5oIGIvcHVibGljL2ZwZGZfc2F2ZS5oCmluZGV4IGFhMzI2MDMuLjRlZWEwNTQgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX3NhdmUuaAorKysgYi9wdWJsaWMvZnBkZl9zYXZlLmgKQEAgLTEzLDY2ICsxMyw3MiBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotCiAvLyBTdHJ1Y3R1cmUgZm9yIGN1c3RvbSBmaWxlIHdyaXRlCiB0eXBlZGVmIHN0cnVjdCBGUERGX0ZJTEVXUklURV8geworICAvLworICAvLyBWZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAxLgorICAvLworICBpbnQgdmVyc2lvbjsKIAotICAgIC8vCi0gICAgLy9WZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAxLgotICAgIC8vCi0gICAgaW50IHZlcnNpb247Ci0KLSAgICAvLwotICAgIC8vIE1ldGhvZDogV3JpdGVCbG9jawotICAgIC8vICAgICAgICAgIE91dHB1dCBhIGJsb2NrIG9mIGRhdGEgaW4geW91ciBjdXN0b20gd2F5LgotICAgIC8vIEludGVyZmFjZSBWZXJzaW9uOgotICAgIC8vICAgICAgICAgIDEKLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAvLyAgICAgICAgICBZZXMKLSAgICAvLyBDb21tZW50czoKLSAgICAvLyAgICAgICAgICBDYWxsZWQgYnkgZnVuY3Rpb24gRlBERl9TYXZlRG9jdW1lbnQKLSAgICAvLyBQYXJhbWV0ZXJzOgotICAgIC8vICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgLy8gICAgICAgICAgcERhdGEgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBidWZmZXIgdG8gb3V0cHV0Ci0gICAgLy8gICAgICAgICAgc2l6ZSAgICAgICAgLSAgIFRoZSBzaXplIG9mIHRoZSBidWZmZXIuCi0gICAgLy8gUmV0dXJuIHZhbHVlOgotICAgIC8vICAgICAgICAgIFNob3VsZCBiZSBub24temVybyBpZiBzdWNjZXNzZnVsLCB6ZXJvIGZvciBlcnJvci4KLSAgICAvLwotICAgIGludCAgICAgKCpXcml0ZUJsb2NrKShzdHJ1Y3QgRlBERl9GSUxFV1JJVEVfKiBwVGhpcywgY29uc3Qgdm9pZCogcERhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisgIC8vCisgIC8vIE1ldGhvZDogV3JpdGVCbG9jaworICAvLyAgICAgICAgICBPdXRwdXQgYSBibG9jayBvZiBkYXRhIGluIHlvdXIgY3VzdG9tIHdheS4KKyAgLy8gSW50ZXJmYWNlIFZlcnNpb246CisgIC8vICAgICAgICAgIDEKKyAgLy8gSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgIC8vICAgICAgICAgIFllcworICAvLyBDb21tZW50czoKKyAgLy8gICAgICAgICAgQ2FsbGVkIGJ5IGZ1bmN0aW9uIEZQREZfU2F2ZURvY3VtZW50CisgIC8vIFBhcmFtZXRlcnM6CisgIC8vICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgaXRzZWxmCisgIC8vICAgICAgICAgIHBEYXRhICAgICAgIC0gICBQb2ludGVyIHRvIGEgYnVmZmVyIHRvIG91dHB1dAorICAvLyAgICAgICAgICBzaXplICAgICAgICAtICAgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAgLy8gUmV0dXJuIHZhbHVlOgorICAvLyAgICAgICAgICBTaG91bGQgYmUgbm9uLXplcm8gaWYgc3VjY2Vzc2Z1bCwgemVybyBmb3IgZXJyb3IuCisgIC8vCisgIGludCAoKldyaXRlQmxvY2spKHN0cnVjdCBGUERGX0ZJTEVXUklURV8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKTsKIAogfSBGUERGX0ZJTEVXUklURTsKIAogLyoqIEBicmllZiBJbmNyZW1lbnRhbC4gKi8KLSNkZWZpbmUgRlBERl9JTkNSRU1FTlRBTCAgICAgICAgMQorI2RlZmluZSBGUERGX0lOQ1JFTUVOVEFMIDEKIC8qKiBAYnJpZWYgTm8gSW5jcmVtZW50YWwuICovCi0jZGVmaW5lIEZQREZfTk9fSU5DUkVNRU5UQUwgICAgIDIKKyNkZWZpbmUgRlBERl9OT19JTkNSRU1FTlRBTCAyCiAvKiogQGJyaWVmIFJlbW92ZSBzZWN1cml0eS4gKi8KLSNkZWZpbmUgRlBERl9SRU1PVkVfU0VDVVJJVFkgICAgMworI2RlZmluZSBGUERGX1JFTU9WRV9TRUNVUklUWSAzCiAKIC8vIEZ1bmN0aW9uOiBGUERGX1NhdmVBc0NvcHkKIC8vICAgICAgICAgIFNhdmVzIHRoZSBjb3B5IG9mIHNwZWNpZmllZCBkb2N1bWVudCBpbiBjdXN0b20gd2F5LgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBhbmQgRlBERl9DcmVhdGVOZXdEb2N1bWVudC4KKy8vICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERl9Mb2FkRG9jdW1lbnQgYW5kIEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQuCiAvLyAgICAgICAgICBwRmlsZVdyaXRlICAgICAgLSAgIEEgcG9pbnRlciB0byBhIGN1c3RvbSBmaWxlIHdyaXRlIHN0cnVjdHVyZS4KIC8vICAgICAgICAgIGZsYWdzICAgICAgICAgICAtICAgVGhlIGNyZWF0aW5nIGZsYWdzLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVFJVRSBmb3Igc3VjY2VlZCwgRkFMU0UgZm9yIGZhaWxlZC4KIC8vCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9TYXZlQXNDb3B5KCAgICBGUERGX0RPQ1VNRU5UIGRvY3VtZW50LEZQREZfRklMRVdSSVRFICogcEZpbGVXcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgZmxhZ3MgKTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1NhdmVBc0NvcHkoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GSUxFV1JJVEUqIHBGaWxlV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgZmxhZ3MpOwogCiAvLyBGdW5jdGlvbjogRlBERl9TYXZlV2l0aFZlcnNpb24KLS8vICAgICAgICAgIFNhbWUgYXMgZnVuY3Rpb24gOjpGUERGX1NhdmVBc0NvcHksIGV4Y2VwdCB0aGUgZmlsZSB2ZXJzaW9uIG9mIHRoZSBzYXZlZCBkb2N1bWVudCBjb3VsZCBiZSBzcGVjaWZpZWQgYnkgdXNlci4KKy8vICAgICAgICAgIFNhbWUgYXMgZnVuY3Rpb24gOjpGUERGX1NhdmVBc0NvcHksIGV4Y2VwdCB0aGUgZmlsZSB2ZXJzaW9uIG9mIHRoZQorLy8gICAgICAgICAgc2F2ZWQgZG9jdW1lbnQgY291bGQgYmUgc3BlY2lmaWVkIGJ5IHVzZXIuCiAvLyBQYXJhbWV0ZXJzOgogLy8gICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuCiAvLyAgICAgICAgICBwRmlsZVdyaXRlICAgICAgLSAgIEEgcG9pbnRlciB0byBhIGN1c3RvbSBmaWxlIHdyaXRlIHN0cnVjdHVyZS4KIC8vICAgICAgICAgIGZsYWdzICAgICAgICAgICAtICAgVGhlIGNyZWF0aW5nIGZsYWdzLgotLy8gICAgICAgICAgZmlsZVZlcnNpb24gICAgIC0gICBUaGUgUERGIGZpbGUgdmVyc2lvbi4gRmlsZSB2ZXJzaW9uOiAxNCBmb3IgMS40LCAxNSBmb3IgMS41LCAuLi4KKy8vICAgICAgICAgIGZpbGVWZXJzaW9uICAgICAtICAgVGhlIFBERiBmaWxlIHZlcnNpb24uIEZpbGUgdmVyc2lvbjogMTQgZm9yIDEuNCwKKy8vICAgICAgICAgIDE1IGZvciAxLjUsIC4uLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVFJVRSBpZiBzdWNjZWVkLCBGQUxTRSBpZiBmYWlsZWQuCiAvLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfU2F2ZVdpdGhWZXJzaW9uKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsRlBERl9GSUxFV1JJVEUgKiBwRmlsZVdyaXRlLAotICAgIEZQREZfRFdPUkQgZmxhZ3MsIGludCBmaWxlVmVyc2lvbik7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9TYXZlV2l0aFZlcnNpb24oRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZJTEVXUklURSogcEZpbGVXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxlVmVyc2lvbik7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZfc2VhcmNoZXguaCBiL3B1YmxpYy9mcGRmX3NlYXJjaGV4LmgKaW5kZXggMWQ0M2VhYi4uYTZiNmUxYiAxMDA2NDQKLS0tIGEvcHVibGljL2ZwZGZfc2VhcmNoZXguaAorKysgYi9wdWJsaWMvZnBkZl9zZWFyY2hleC5oCkBAIC0xNiwxMSArMTYsMTQgQEAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9HZXRDaGFySW5kZXhGcm9tVGV4dEluZGV4CiAvLyAgICAgIEdldCB0aGUgYWN0dWFsbHkgY2hhciBpbmRleCBpbiB0ZXh0X3BhZ2UncyBpbnRlcm5hbCBjaGFyIGxpc3QuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgotLy8gICAgICAgICAgblRleHRJbmRleCAgLSAgIFRoZSBpbmRleCBvZiB0aGUgdGV4dCBpbiB0aGUgc3RyaW5nIGdldCBmcm9tIEZQREZUZXh0X0dldFRleHQuCisvLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKy8vICAgICAgICAgIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgblRleHRJbmRleCAgLSAgIFRoZSBpbmRleCBvZiB0aGUgdGV4dCBpbiB0aGUgc3RyaW5nIGdldCBmcm9tCisvLyAgICAgICAgICBGUERGVGV4dF9HZXRUZXh0LgogLy8gIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIGluIGludGVybmFsIGNoYXJsaXN0LiAtMSBmb3IgZXJyb3IuCi1ETExFWFBPUlQgaW50IFNURENBTEwgIEZQREZUZXh0X0dldENoYXJJbmRleEZyb21UZXh0SW5kZXgoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsIGludCBuVGV4dEluZGV4KTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTAorRlBERlRleHRfR2V0Q2hhckluZGV4RnJvbVRleHRJbmRleChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgaW50IG5UZXh0SW5kZXgpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX3N5c2ZvbnRpbmZvLmggYi9wdWJsaWMvZnBkZl9zeXNmb250aW5mby5oCmluZGV4IDYxNDY1ZjQuLmMyZGE3NGIgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX3N5c2ZvbnRpbmZvLmgKKysrIGIvcHVibGljL2ZwZGZfc3lzZm9udGluZm8uaApAQCAtMTAsMjIgKzEwLDIyIEBACiAjaW5jbHVkZSAiZnBkZnZpZXcuaCIKIAogLyogQ2hhcmFjdGVyIHNldHMgZm9yIHRoZSBmb250ICovCi0jZGVmaW5lIEZYRk9OVF9BTlNJX0NIQVJTRVQgICAgIDAKLSNkZWZpbmUgRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCAgMQotI2RlZmluZSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQgICAyCisjZGVmaW5lIEZYRk9OVF9BTlNJX0NIQVJTRVQgMAorI2RlZmluZSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUIDEKKyNkZWZpbmUgRlhGT05UX1NZTUJPTF9DSEFSU0VUIDIKICNkZWZpbmUgRlhGT05UX1NISUZUSklTX0NIQVJTRVQgMTI4Ci0jZGVmaW5lIEZYRk9OVF9IQU5HRVVMX0NIQVJTRVQgIDEyOQotI2RlZmluZSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQgICAxMzQKLSNkZWZpbmUgRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQgIDEzNgorI2RlZmluZSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUIDEyOQorI2RlZmluZSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQgMTM0CisjZGVmaW5lIEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUIDEzNgogCiAvKiBGb250IHBpdGNoIGFuZCBmYW1pbHkgZmxhZ3MgKi8KLSNkZWZpbmUgRlhGT05UX0ZGX0ZJWEVEUElUQ0ggICAgMQotI2RlZmluZSBGWEZPTlRfRkZfUk9NQU4gICAgICAgICAoMTw8NCkKLSNkZWZpbmUgRlhGT05UX0ZGX1NDUklQVCAgICAgICAgKDQ8PDQpCisjZGVmaW5lIEZYRk9OVF9GRl9GSVhFRFBJVENIIDEKKyNkZWZpbmUgRlhGT05UX0ZGX1JPTUFOICgxIDw8IDQpCisjZGVmaW5lIEZYRk9OVF9GRl9TQ1JJUFQgKDQgPDwgNCkKIAogLyogVHlwaWNhbCB3ZWlnaHQgdmFsdWVzICovCi0jZGVmaW5lIEZYRk9OVF9GV19OT1JNQUwgICAgICAgIDQwMAotI2RlZmluZSBGWEZPTlRfRldfQk9MRCAgICAgICAgICA3MDAKKyNkZWZpbmUgRlhGT05UX0ZXX05PUk1BTCA0MDAKKyNkZWZpbmUgRlhGT05UX0ZXX0JPTEQgNzAwCiAKIC8vIEV4cG9ydGVkIEZ1bmN0aW9ucwogI2lmZGVmIF9fY3BsdXNwbHVzCkBAIC0zNywxNjggKzM3LDIwMCBAQAogICogICAgICAgICAgSW50ZXJmYWNlIGZvciBnZXR0aW5nIHN5c3RlbSBmb250IGluZm9ybWF0aW9uIGFuZCBmb250IG1hcHBpbmcKICAqLwogdHlwZWRlZiBzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8gewotICAgIC8qKgotICAgICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDEuCi0gICAgICoqLwotICAgIGludCB2ZXJzaW9uOworICAvKioKKyAgICogVmVyc2lvbiBudW1iZXIgb2YgdGhlIGludGVyZmFjZS4gQ3VycmVudGx5IG11c3QgYmUgMS4KKyAgICoqLworICBpbnQgdmVyc2lvbjsKIAotICAgIC8qKgotICAgICAqIE1ldGhvZDogUmVsZWFzZQotICAgICAqICAgICAgICAgIEdpdmUgaW1wbGVtZW50YXRpb24gYSBjaGFuY2UgdG8gcmVsZWFzZSBhbnkgZGF0YSBhZnRlciB0aGUgaW50ZXJmYWNlIGlzIG5vIGxvbmdlciB1c2VkCi0gICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgICogICAgICAgICAgMQotICAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICAqICAgICAgICAgIE5vCi0gICAgICogQ29tbWVudHM6Ci0gICAgICogICAgICAgICAgQ2FsbGVkIGJ5IEZveGl0IFNESyBkdXJpbmcgdGhlIGZpbmFsIGNsZWFudXAgcHJvY2Vzcy4KLSAgICAgKiBQYXJhbWV0ZXJzOgotICAgICAqICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgICAgICBOb25lCi0gICAgICovCi0gICAgdm9pZCAoKlJlbGVhc2UpKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMpOworICAvKioKKyAgICogTWV0aG9kOiBSZWxlYXNlCisgICAqICAgICAgICAgIEdpdmUgaW1wbGVtZW50YXRpb24gYSBjaGFuY2UgdG8gcmVsZWFzZSBhbnkgZGF0YSBhZnRlciB0aGUKKyAgICogaW50ZXJmYWNlIGlzIG5vIGxvbmdlciB1c2VkCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgICAgICAxCisgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAgKiAgICAgICAgICBObworICAgKiBDb21tZW50czoKKyAgICogICAgICAgICAgQ2FsbGVkIGJ5IEZveGl0IFNESyBkdXJpbmcgdGhlIGZpbmFsIGNsZWFudXAgcHJvY2Vzcy4KKyAgICogUGFyYW1ldGVyczoKKyAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisgICAqIFJldHVybiBWYWx1ZToKKyAgICogICAgICAgICAgTm9uZQorICAgKi8KKyAgdm9pZCAoKlJlbGVhc2UpKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMpOwogCi0gICAgLyoqCi0gICAgICogTWV0aG9kOiBFbnVtRm9udHMKLSAgICAgKiAgICAgICAgICBFbnVtZXJhdGUgYWxsIGZvbnRzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtCi0gICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgICogICAgICAgICAgMQotICAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICAqICAgICAgICAgIE5vCi0gICAgICogQ29tbWVudHM6Ci0gICAgICogICAgICAgICAgSW1wbGVtZW50YXRpb24gc2hvdWxkIGNhbGwgRlBERl9BZGRJbnRhbGxlZEZvbnQoKSBmdW5jdGlvbiBmb3IgZWFjaCBmb250IGZvdW5kLgotICAgICAqICAgICAgICAgIE9ubHkgVHJ1ZVR5cGUvT3BlblR5cGUgYW5kIFR5cGUxIGZvbnRzIGFyZSBhY2NlcHRlZCBieSBGb3hpdCBTREsuCi0gICAgICogUGFyYW1ldGVyczoKLSAgICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAgKiAgICAgICAgICBwTWFwcGVyICAgICAtICAgQW4gb3BhcXVlIHBvaW50ZXIgdG8gaW50ZXJuYWwgZm9udCBtYXBwZXIsIHVzZWQgd2hlbiBjYWxsaW5nIEZQREZfQWRkSW5zdGFsbGVkRm9udAotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgICAgICBOb25lCi0gICAgICovCi0gICAgdm9pZCAoKkVudW1Gb250cykoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgdm9pZCogcE1hcHBlcik7CisgIC8qKgorICAgKiBNZXRob2Q6IEVudW1Gb250cworICAgKiAgICAgICAgICBFbnVtZXJhdGUgYWxsIGZvbnRzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgICAgICAxCisgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAgKiAgICAgICAgICBObworICAgKiBDb21tZW50czoKKyAgICogICAgICAgICAgSW1wbGVtZW50YXRpb24gc2hvdWxkIGNhbGwgRlBERl9BZGRJbnRhbGxlZEZvbnQoKSBmdW5jdGlvbiBmb3IKKyAgICogZWFjaCBmb250IGZvdW5kLgorICAgKiAgICAgICAgICBPbmx5IFRydWVUeXBlL09wZW5UeXBlIGFuZCBUeXBlMSBmb250cyBhcmUgYWNjZXB0ZWQgYnkgRm94aXQgU0RLLgorICAgKiBQYXJhbWV0ZXJzOgorICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKKyAgICogICAgICAgICAgcE1hcHBlciAgICAgLSAgIEFuIG9wYXF1ZSBwb2ludGVyIHRvIGludGVybmFsIGZvbnQgbWFwcGVyLCB1c2VkCisgICAqIHdoZW4gY2FsbGluZyBGUERGX0FkZEluc3RhbGxlZEZvbnQKKyAgICogUmV0dXJuIFZhbHVlOgorICAgKiAgICAgICAgICBOb25lCisgICAqLworICB2b2lkICgqRW51bUZvbnRzKShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBwTWFwcGVyKTsKIAotICAgIC8qKgotICAgICAqIE1ldGhvZDogTWFwRm9udAotICAgICAqICAgICAgICAgIFVzZSB0aGUgc3lzdGVtIGZvbnQgbWFwcGVyIHRvIGdldCBhIGZvbnQgaGFuZGxlIGZyb20gcmVxdWVzdGVkIHBhcmFtZXRlcnMKLSAgICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAgKiAgICAgICAgICAxCi0gICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgICogICAgICAgICAgWWVzIG9ubHkgaWYgR2V0Rm9udCBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLgotICAgICAqIENvbW1lbnRzOgotICAgICAqICAgICAgICAgIElmIHRoZSBzeXN0ZW0gc3VwcG9ydHMgbmF0aXZlIGZvbnQgbWFwcGVyIChsaWtlIFdpbmRvd3MpLCBpbXBsZW1lbnRhdGlvbiBjYW4gaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGdldCBhIGZvbnQgaGFuZGxlLgotICAgICAqICAgICAgICAgIE90aGVyd2lzZSwgRm94aXQgU0RLIHdpbGwgZG8gdGhlIG1hcHBpbmcgYW5kIHRoZW4gY2FsbCBHZXRGb250IG1ldGhvZC4KLSAgICAgKiAgICAgICAgICBPbmx5IFRydWVUeXBlL09wZW5UeXBlIGFuZCBUeXBlMSBmb250cyBhcmUgYWNjZXB0ZWQgYnkgRm94aXQgU0RLLgotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgICogICAgICAgICAgd2VpZ2h0ICAgICAgLSAgIFdlaWdodCBvZiB0aGUgcmVxdWVzdGVkIGZvbnQuIDQwMCBpcyBub3JtYWwgYW5kIDcwMCBpcyBib2xkLgotICAgICAqICAgICAgICAgIGJJdGFsaWMgICAgIC0gICBJdGFsaWMgb3B0aW9uIG9mIHRoZSByZXF1ZXN0ZWQgZm9udCwgVFJVRSBvciBGQUxTRS4KLSAgICAgKiAgICAgICAgICBjaGFyc2V0ICAgICAtICAgQ2hhcmFjdGVyIHNldCBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdGVkIGZvbnQuIFNlZSBhYm92ZSBkZWZpbmVkIGNvbnN0YW50cy4KLSAgICAgKiAgICAgICAgICBwaXRjaF9mYW1pbHkgLSAgQSBjb21iaW5hdGlvbiBvZiBmbGFncy4gU2VlIGFib3ZlIGRlZmluZWQgY29uc3RhbnRzLgotICAgICAqICAgICAgICAgIGZhY2UgICAgICAgIC0gICBUeXBlZmFjZSBuYW1lLiBDdXJyZW50bHkgdXNlIHN5c3RlbSBsb2NhbCBlbmNvZGluZyBvbmx5LgotICAgICAqICAgICAgICAgIGJFeGFjdCAgICAgIC0gICBQb2ludGVyIHRvIGEgYm9vbGVhbiB2YWx1ZSByZWNlaXZpbmcgdGhlIGluZGljYXRvciB3aGV0aGVyIG1hcHBlciBmb3VuZCB0aGUgZXhhY3QgbWF0Y2guCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIElmIG1hcHBlciBpcyBub3Qgc3VyZSB3aGV0aGVyIGl0J3MgZXhhY3QgbWF0Y2gsIGlnbm9yZSB0aGlzIHBhcmFtdGVyLgotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgICAgICBBbiBvcGFxdWUgcG9pbnRlciBmb3IgZm9udCBoYW5kbGUsIG9yIE5VTEwgaWYgc3lzdGVtIG1hcHBpbmcgaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgKiovCi0gICAgdm9pZCogKCpNYXBGb250KShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCBpbnQgd2VpZ2h0LCBGUERGX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmYWNlLCBGUERGX0JPT0wqIGJFeGFjdCk7CisgIC8qKgorICAgKiBNZXRob2Q6IE1hcEZvbnQKKyAgICogICAgICAgICAgVXNlIHRoZSBzeXN0ZW0gZm9udCBtYXBwZXIgdG8gZ2V0IGEgZm9udCBoYW5kbGUgZnJvbSByZXF1ZXN0ZWQKKyAgICpwYXJhbWV0ZXJzCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgICAgICAxCisgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAgKiAgICAgICAgICBZZXMgb25seSBpZiBHZXRGb250IG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAqIENvbW1lbnRzOgorICAgKiAgICAgICAgICBJZiB0aGUgc3lzdGVtIHN1cHBvcnRzIG5hdGl2ZSBmb250IG1hcHBlciAobGlrZSBXaW5kb3dzKSwKKyAgICppbXBsZW1lbnRhdGlvbiBjYW4gaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGdldCBhIGZvbnQgaGFuZGxlLgorICAgKiAgICAgICAgICBPdGhlcndpc2UsIEZveGl0IFNESyB3aWxsIGRvIHRoZSBtYXBwaW5nIGFuZCB0aGVuIGNhbGwgR2V0Rm9udAorICAgKm1ldGhvZC4KKyAgICogICAgICAgICAgT25seSBUcnVlVHlwZS9PcGVuVHlwZSBhbmQgVHlwZTEgZm9udHMgYXJlIGFjY2VwdGVkIGJ5IEZveGl0IFNESy4KKyAgICogUGFyYW1ldGVyczoKKyAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisgICAqICAgICAgICAgIHdlaWdodCAgICAgIC0gICBXZWlnaHQgb2YgdGhlIHJlcXVlc3RlZCBmb250LiA0MDAgaXMgbm9ybWFsIGFuZAorICAgKjcwMCBpcyBib2xkLgorICAgKiAgICAgICAgICBiSXRhbGljICAgICAtICAgSXRhbGljIG9wdGlvbiBvZiB0aGUgcmVxdWVzdGVkIGZvbnQsIFRSVUUgb3IKKyAgICpGQUxTRS4KKyAgICogICAgICAgICAgY2hhcnNldCAgICAgLSAgIENoYXJhY3RlciBzZXQgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3RlZCBmb250LgorICAgKlNlZSBhYm92ZSBkZWZpbmVkIGNvbnN0YW50cy4KKyAgICogICAgICAgICAgcGl0Y2hfZmFtaWx5IC0gIEEgY29tYmluYXRpb24gb2YgZmxhZ3MuIFNlZSBhYm92ZSBkZWZpbmVkCisgICAqY29uc3RhbnRzLgorICAgKiAgICAgICAgICBmYWNlICAgICAgICAtICAgVHlwZWZhY2UgbmFtZS4gQ3VycmVudGx5IHVzZSBzeXN0ZW0gbG9jYWwgZW5jb2RpbmcKKyAgICpvbmx5LgorICAgKiAgICAgICAgICBiRXhhY3QgICAgICAtICAgUG9pbnRlciB0byBhIGJvb2xlYW4gdmFsdWUgcmVjZWl2aW5nIHRoZSBpbmRpY2F0b3IKKyAgICp3aGV0aGVyIG1hcHBlciBmb3VuZCB0aGUgZXhhY3QgbWF0Y2guCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBtYXBwZXIgaXMgbm90IHN1cmUgd2hldGhlciBpdCdzIGV4YWN0IG1hdGNoLAorICAgKmlnbm9yZSB0aGlzIHBhcmFtdGVyLgorICAgKiBSZXR1cm4gVmFsdWU6CisgICAqICAgICAgICAgIEFuIG9wYXF1ZSBwb2ludGVyIGZvciBmb250IGhhbmRsZSwgb3IgTlVMTCBpZiBzeXN0ZW0gbWFwcGluZyBpcworICAgKm5vdCBzdXBwb3J0ZWQuCisgICAqKi8KKyAgdm9pZCogKCpNYXBGb250KShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJJdGFsaWMsCisgICAgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmYWNlLAorICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCogYkV4YWN0KTsKIAotICAgIC8qKgotICAgICAqIE1ldGhvZDogR2V0Rm9udAotICAgICAqICAgICAgICAgIEdldCBhIGhhbmRsZSB0byBhIHBhcnRpY3VsYXIgZm9udCBieSBpdHMgaW50ZXJuYWwgSUQKLSAgICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAgKiAgICAgICAgICAxCi0gICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgICogICAgICAgICAgWWVzIG9ubHkgaWYgTWFwRm9udCBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLgotICAgICAqIENvbW1lbnRzOgotICAgICAqICAgICAgICAgIElmIHRoZSBzeXN0ZW0gbWFwcGluZyBub3Qgc3VwcG9ydGVkLCBGb3hpdCBTREsgd2lsbCBkbyB0aGUgZm9udCBtYXBwaW5nIGFuZCB1c2UgdGhpcyBtZXRob2QgdG8gZ2V0IGEgZm9udCBoYW5kbGUuCi0gICAgICogUGFyYW1ldGVyczoKLSAgICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAgKiAgICAgICAgICBmYWNlICAgICAgICAtICAgVHlwZWZhY2UgbmFtZS4gQ3VycmVudGx5IHVzZSBzeXN0ZW0gbG9jYWwgZW5jb2Rpbmcgb25seS4KLSAgICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgICogICAgICAgICAgQW4gb3BhcXVlIHBvaW50ZXIgZm9yIGZvbnQgaGFuZGxlLgotICAgICAqKi8KLSAgICB2b2lkKiAoKkdldEZvbnQpKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIGNvbnN0IGNoYXIqIGZhY2UpOworICAvKioKKyAgICogTWV0aG9kOiBHZXRGb250CisgICAqICAgICAgICAgIEdldCBhIGhhbmRsZSB0byBhIHBhcnRpY3VsYXIgZm9udCBieSBpdHMgaW50ZXJuYWwgSUQKKyAgICogSW50ZXJmYWNlIFZlcnNpb246CisgICAqICAgICAgICAgIDEKKyAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICAqICAgICAgICAgIFllcyBvbmx5IGlmIE1hcEZvbnQgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4KKyAgICogQ29tbWVudHM6CisgICAqICAgICAgICAgIElmIHRoZSBzeXN0ZW0gbWFwcGluZyBub3Qgc3VwcG9ydGVkLCBGb3hpdCBTREsgd2lsbCBkbyB0aGUgZm9udAorICAgKm1hcHBpbmcgYW5kIHVzZSB0aGlzIG1ldGhvZCB0byBnZXQgYSBmb250IGhhbmRsZS4KKyAgICogUGFyYW1ldGVyczoKKyAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisgICAqICAgICAgICAgIGZhY2UgICAgICAgIC0gICBUeXBlZmFjZSBuYW1lLiBDdXJyZW50bHkgdXNlIHN5c3RlbSBsb2NhbCBlbmNvZGluZworICAgKm9ubHkuCisgICAqIFJldHVybiBWYWx1ZToKKyAgICogICAgICAgICAgQW4gb3BhcXVlIHBvaW50ZXIgZm9yIGZvbnQgaGFuZGxlLgorICAgKiovCisgIHZvaWQqICgqR2V0Rm9udCkoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgY29uc3QgY2hhciogZmFjZSk7CiAKLSAgICAvKioKLSAgICAgKiBNZXRob2Q6IEdldEZvbnREYXRhCi0gICAgICogICAgICAgICAgR2V0IGZvbnQgZGF0YSBmcm9tIGEgZm9udAotICAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICAqICAgICAgICAgIDEKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAgKiAgICAgICAgICBZZXMKLSAgICAgKiBDb21tZW50czoKLSAgICAgKiAgICAgICAgICBDYW4gcmVhZCBlaXRoZXIgZnVsbCBmb250IGZpbGUsIG9yIGEgcGFydGljdWxhciBUcnVlVHlwZS9PcGVuVHlwZSB0YWJsZQotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgICogICAgICAgICAgaEZvbnQgICAgICAgLSAgIEZvbnQgaGFuZGxlIHJldHVybmVkIGJ5IE1hcEZvbnQgb3IgR2V0Rm9udCBtZXRob2QKLSAgICAgKiAgICAgICAgICB0YWJsZSAgICAgICAtICAgVHJ1ZVR5cGUvT3BlblR5cGUgdGFibGUgaWRlbnRpZmllciAocmVmZXIgdG8gVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbikuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIDAgZm9yIHRoZSB3aG9sZSBmb250IGZpbGUuCi0gICAgICogICAgICAgICAgYnVmZmVyICAgICAgLSAgIFRoZSBidWZmZXIgcmVjZWl2aW5nIHRoZSBmb250IGRhdGEuIENhbiBiZSBOVUxMIGlmIG5vdCBwcm92aWRlZAotICAgICAqICAgICAgICAgIGJ1Zl9zaXplICAgIC0gICBCdWZmZXIgc2l6ZSwgY2FuIGJlIHplcm8gaWYgbm90IHByb3ZpZGVkCi0gICAgICogUmV0dXJuIFZhbHVlOgotICAgICAqICAgICAgICAgIE51bWJlciBvZiBieXRlcyBuZWVkZWQsIGlmIGJ1ZmZlciBub3QgcHJvdmlkZWQgb3Igbm90IGxhcmdlIGVub3VnaCwKLSAgICAgKiAgICAgICAgICBvciBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbnRvIGJ1ZmZlciBvdGhlcndpc2UuCi0gICAgICoqLwotICAgIHVuc2lnbmVkIGxvbmcgKCpHZXRGb250RGF0YSkoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgdm9pZCogaEZvbnQsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFibGUsIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBidWZfc2l6ZSk7CisgIC8qKgorICAgKiBNZXRob2Q6IEdldEZvbnREYXRhCisgICAqICAgICAgICAgIEdldCBmb250IGRhdGEgZnJvbSBhIGZvbnQKKyAgICogSW50ZXJmYWNlIFZlcnNpb246CisgICAqICAgICAgICAgIDEKKyAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICAqICAgICAgICAgIFllcworICAgKiBDb21tZW50czoKKyAgICogICAgICAgICAgQ2FuIHJlYWQgZWl0aGVyIGZ1bGwgZm9udCBmaWxlLCBvciBhIHBhcnRpY3VsYXIgVHJ1ZVR5cGUvT3BlblR5cGUKKyAgICp0YWJsZQorICAgKiBQYXJhbWV0ZXJzOgorICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKKyAgICogICAgICAgICAgaEZvbnQgICAgICAgLSAgIEZvbnQgaGFuZGxlIHJldHVybmVkIGJ5IE1hcEZvbnQgb3IgR2V0Rm9udCBtZXRob2QKKyAgICogICAgICAgICAgdGFibGUgICAgICAgLSAgIFRydWVUeXBlL09wZW5UeXBlIHRhYmxlIGlkZW50aWZpZXIgKHJlZmVyIHRvCisgICAqVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbikuCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAwIGZvciB0aGUgd2hvbGUgZm9udCBmaWxlLgorICAgKiAgICAgICAgICBidWZmZXIgICAgICAtICAgVGhlIGJ1ZmZlciByZWNlaXZpbmcgdGhlIGZvbnQgZGF0YS4gQ2FuIGJlIE5VTEwgaWYKKyAgICpub3QgcHJvdmlkZWQKKyAgICogICAgICAgICAgYnVmX3NpemUgICAgLSAgIEJ1ZmZlciBzaXplLCBjYW4gYmUgemVybyBpZiBub3QgcHJvdmlkZWQKKyAgICogUmV0dXJuIFZhbHVlOgorICAgKiAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgbmVlZGVkLCBpZiBidWZmZXIgbm90IHByb3ZpZGVkIG9yIG5vdCBsYXJnZQorICAgKmVub3VnaCwKKyAgICogICAgICAgICAgb3IgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW50byBidWZmZXIgb3RoZXJ3aXNlLgorICAgKiovCisgIHVuc2lnbmVkIGxvbmcgKCpHZXRGb250RGF0YSkoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBoRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmX3NpemUpOwogCi0gICAgLyoqCi0gICAgICogTWV0aG9kOiBHZXRGYWNlTmFtZQotICAgICAqICAgICAgICAgIEdldCBmYWNlIG5hbWUgZnJvbSBhIGZvbnQgaGFuZGxlCi0gICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgICogICAgICAgICAgMQotICAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICAqICAgICAgICAgIE5vCi0gICAgICogUGFyYW1ldGVyczoKLSAgICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAgKiAgICAgICAgICBoRm9udCAgICAgICAtICAgRm9udCBoYW5kbGUgcmV0dXJuZWQgYnkgTWFwRm9udCBvciBHZXRGb250IG1ldGhvZAotICAgICAqICAgICAgICAgIGJ1ZmZlciAgICAgIC0gICBUaGUgYnVmZmVyIHJlY2VpdmluZyB0aGUgZmFjZSBuYW1lLiBDYW4gYmUgTlVMTCBpZiBub3QgcHJvdmlkZWQKLSAgICAgKiAgICAgICAgICBidWZfc2l6ZSAgICAtICAgQnVmZmVyIHNpemUsIGNhbiBiZSB6ZXJvIGlmIG5vdCBwcm92aWRlZAotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgbmVlZGVkLCBpZiBidWZmZXIgbm90IHByb3ZpZGVkIG9yIG5vdCBsYXJnZSBlbm91Z2gsCi0gICAgICogICAgICAgICAgb3IgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW50byBidWZmZXIgb3RoZXJ3aXNlLgotICAgICAqKi8KLSAgICB1bnNpZ25lZCBsb25nICgqR2V0RmFjZU5hbWUpKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIHZvaWQqIGhGb250LCBjaGFyKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmX3NpemUpOworICAvKioKKyAgICogTWV0aG9kOiBHZXRGYWNlTmFtZQorICAgKiAgICAgICAgICBHZXQgZmFjZSBuYW1lIGZyb20gYSBmb250IGhhbmRsZQorICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgICogICAgICAgICAgMQorICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgICogICAgICAgICAgTm8KKyAgICogUGFyYW1ldGVyczoKKyAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisgICAqICAgICAgICAgIGhGb250ICAgICAgIC0gICBGb250IGhhbmRsZSByZXR1cm5lZCBieSBNYXBGb250IG9yIEdldEZvbnQgbWV0aG9kCisgICAqICAgICAgICAgIGJ1ZmZlciAgICAgIC0gICBUaGUgYnVmZmVyIHJlY2VpdmluZyB0aGUgZmFjZSBuYW1lLiBDYW4gYmUgTlVMTCBpZgorICAgKm5vdCBwcm92aWRlZAorICAgKiAgICAgICAgICBidWZfc2l6ZSAgICAtICAgQnVmZmVyIHNpemUsIGNhbiBiZSB6ZXJvIGlmIG5vdCBwcm92aWRlZAorICAgKiBSZXR1cm4gVmFsdWU6CisgICAqICAgICAgICAgIE51bWJlciBvZiBieXRlcyBuZWVkZWQsIGlmIGJ1ZmZlciBub3QgcHJvdmlkZWQgb3Igbm90IGxhcmdlCisgICAqZW5vdWdoLAorICAgKiAgICAgICAgICBvciBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbnRvIGJ1ZmZlciBvdGhlcndpc2UuCisgICAqKi8KKyAgdW5zaWduZWQgbG9uZyAoKkdldEZhY2VOYW1lKShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGhGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1Zl9zaXplKTsKIAotICAgIC8qKgotICAgICAqIE1ldGhvZDogR2V0Rm9udENoYXJzZXQKLSAgICAgKiAgICAgICAgICBHZXQgY2hhcmFjdGVyIHNldCBpbmZvcm1hdGlvbiBmb3IgYSBmb250IGhhbmRsZQotICAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICAqICAgICAgICAgIDEKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAgKiAgICAgICAgICBObwotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgICogICAgICAgICAgaEZvbnQgICAgICAgLSAgIEZvbnQgaGFuZGxlIHJldHVybmVkIGJ5IE1hcEZvbnQgb3IgR2V0Rm9udCBtZXRob2QKLSAgICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgICogICAgICAgICAgQ2hhcmFjdGVyIHNldCBpZGVudGlmaWVyLiBTZWUgZGVmaW5lZCBjb25zdGFudHMgYWJvdmUuCi0gICAgICoqLwotICAgIGludCAoKkdldEZvbnRDaGFyc2V0KShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBoRm9udCk7CisgIC8qKgorICAgKiBNZXRob2Q6IEdldEZvbnRDaGFyc2V0CisgICAqICAgICAgICAgIEdldCBjaGFyYWN0ZXIgc2V0IGluZm9ybWF0aW9uIGZvciBhIGZvbnQgaGFuZGxlCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgICAgICAxCisgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAgKiAgICAgICAgICBObworICAgKiBQYXJhbWV0ZXJzOgorICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKKyAgICogICAgICAgICAgaEZvbnQgICAgICAgLSAgIEZvbnQgaGFuZGxlIHJldHVybmVkIGJ5IE1hcEZvbnQgb3IgR2V0Rm9udCBtZXRob2QKKyAgICogUmV0dXJuIFZhbHVlOgorICAgKiAgICAgICAgICBDaGFyYWN0ZXIgc2V0IGlkZW50aWZpZXIuIFNlZSBkZWZpbmVkIGNvbnN0YW50cyBhYm92ZS4KKyAgICoqLworICBpbnQgKCpHZXRGb250Q2hhcnNldCkoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgdm9pZCogaEZvbnQpOwogCi0gICAgLyoqCi0gICAgICogTWV0aG9kOiBEZWxldGVGb250Ci0gICAgICogICAgICAgICAgRGVsZXRlIGEgZm9udCBoYW5kbGUKLSAgICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAgKiAgICAgICAgICAxCi0gICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgICogICAgICAgICAgWWVzCi0gICAgICogUGFyYW1ldGVyczoKLSAgICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAgKiAgICAgICAgICBoRm9udCAgICAgICAtICAgRm9udCBoYW5kbGUgcmV0dXJuZWQgYnkgTWFwRm9udCBvciBHZXRGb250IG1ldGhvZAotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgICAgICBOb25lCi0gICAgICoqLwotICAgIHZvaWQgKCpEZWxldGVGb250KShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBoRm9udCk7CisgIC8qKgorICAgKiBNZXRob2Q6IERlbGV0ZUZvbnQKKyAgICogICAgICAgICAgRGVsZXRlIGEgZm9udCBoYW5kbGUKKyAgICogSW50ZXJmYWNlIFZlcnNpb246CisgICAqICAgICAgICAgIDEKKyAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICAqICAgICAgICAgIFllcworICAgKiBQYXJhbWV0ZXJzOgorICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKKyAgICogICAgICAgICAgaEZvbnQgICAgICAgLSAgIEZvbnQgaGFuZGxlIHJldHVybmVkIGJ5IE1hcEZvbnQgb3IgR2V0Rm9udCBtZXRob2QKKyAgICogUmV0dXJuIFZhbHVlOgorICAgKiAgICAgICAgICBOb25lCisgICAqKi8KKyAgdm9pZCAoKkRlbGV0ZUZvbnQpKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIHZvaWQqIGhGb250KTsKIH0gRlBERl9TWVNGT05USU5GTzsKIAogLyoqCiAgKiBTdHJ1Y3Q6IEZQREZfQ2hhcnNldEZvbnRNYXAKICAqICAgIFByb3ZpZGVzIHRoZSBuYW1lIG9mIGEgZm9udCB0byB1c2UgZm9yIGEgZ2l2ZW4gY2hhcnNldCB2YWx1ZS4KICAqKi8KLXR5cGVkZWYgc3RydWN0IEZQREZfQ2hhcnNldEZvbnRNYXBfCi17Ci0gICAgaW50IGNoYXJzZXQ7ICAvLyBDaGFyYWN0ZXIgU2V0IEVudW0gdmFsdWUsIHNlZSBGWEZPTlRfKl9DSEFSU0VUIGFib3ZlLgotICAgIGNvbnN0IGNoYXIqIGZvbnRuYW1lOyAgLy8gTmFtZSBvZiBkZWZhdWx0IGZvbnQgdG8gdXNlIHdpdGggdGhhdCBjaGFyc2V0LgordHlwZWRlZiBzdHJ1Y3QgRlBERl9DaGFyc2V0Rm9udE1hcF8geworICBpbnQgY2hhcnNldDsgIC8vIENoYXJhY3RlciBTZXQgRW51bSB2YWx1ZSwgc2VlIEZYRk9OVF8qX0NIQVJTRVQgYWJvdmUuCisgIGNvbnN0IGNoYXIqIGZvbnRuYW1lOyAgLy8gTmFtZSBvZiBkZWZhdWx0IGZvbnQgdG8gdXNlIHdpdGggdGhhdCBjaGFyc2V0LgogfSBGUERGX0NoYXJzZXRGb250TWFwOwogCiAvKioKQEAgLTIxNyw3ICsyNDksOCBAQAogICogRnVuY3Rpb246IEZQREZfQWRkSW5zdGFsbGVkRm9udAogICogICAgICAgICAgQWRkIGEgc3lzdGVtIGZvbnQgdG8gdGhlIGxpc3QgaW4gRm94aXQgU0RLLgogICogQ29tbWVudHM6Ci0gKiAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGR1cmluZyB0aGUgc3lzdGVtIGZvbnQgbGlzdCBidWlsZGluZyBwcm9jZXNzLgorICogICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBkdXJpbmcgdGhlIHN5c3RlbSBmb250IGxpc3QgYnVpbGRpbmcKKyAqcHJvY2Vzcy4KICAqIFBhcmFtZXRlcnM6CiAgKiAgICAgICAgICBtYXBwZXIgICAgICAgICAgLSAgIE9wYXF1ZSBwb2ludGVyIHRvIEZveGl0IGZvbnQgbWFwcGVyCiAgKiAgICAgICAgICBmYWNlICAgICAgICAgICAgLSAgIFRoZSBmb250IGZhY2UgbmFtZQpAQCAtMjI1LDEzICsyNTgsMTYgQEAKICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIE5vbmUuCiAgKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfQWRkSW5zdGFsbGVkRm9udCh2b2lkKiBtYXBwZXIsIGNvbnN0IGNoYXIqIGZhY2UsIGludCBjaGFyc2V0KTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9BZGRJbnN0YWxsZWRGb250KHZvaWQqIG1hcHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCk7CiAKIC8qKgogICogRnVuY3Rpb246IEZQREZfU2V0U3lzdGVtRm9udEluZm8KICAqICAgICAgICAgIFNldCB0aGUgc3lzdGVtIGZvbnQgaW5mbyBpbnRlcmZhY2UgaW50byBGb3hpdCBTREsKICAqIENvbW1lbnRzOgotICogICAgICAgICAgUGxhdGZvcm0gc3VwcG9ydCBpbXBsZW1lbnRhdGlvbiBzaG91bGQgaW1wbGVtZW50IHJlcXVpcmVkIG1ldGhvZHMgb2YgRkZERl9TWVNGT05USU5GTyBpbnRlcmZhY2UsCisgKiAgICAgICAgICBQbGF0Zm9ybSBzdXBwb3J0IGltcGxlbWVudGF0aW9uIHNob3VsZCBpbXBsZW1lbnQgcmVxdWlyZWQgbWV0aG9kcyBvZgorICpGRkRGX1NZU0ZPTlRJTkZPIGludGVyZmFjZSwKICAqICAgICAgICAgIHRoZW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGR1cmluZyBTREsgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy4KICAqIFBhcmFtZXRlcnM6CiAgKiAgICAgICAgICBwRm9udEluZm8gICAgICAgLSAgIFBvaW50ZXIgdG8gYSBGUERGX1NZU0ZPTlRJTkZPIHN0cnVjdHVyZQpAQCAtMjQ0LDE0ICsyODAsMTggQEAKICAqIEZ1bmN0aW9uOiBGUERGX0dldERlZmF1bHRTeXN0ZW1Gb250SW5mbwogICogICAgICAgICAgR2V0IGRlZmF1bHQgc3lzdGVtIGZvbnQgaW5mbyBpbnRlcmZhY2UgZm9yIGN1cnJlbnQgcGxhdGZvcm0KICAqIENvbW1lbnRzOgotICogICAgICAgICAgRm9yIHNvbWUgcGxhdGZvcm1zIEZveGl0IFNESyBpbXBsZW1lbnQgYSBkZWZhdWx0IHZlcnNpb24gb2Ygc3lzdGVtIGZvbnQgaW5mbyBpbnRlcmZhY2UuCi0gKiAgICAgICAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgdXNlZCBpbiBGUERGX1NldFN5c3RlbUZvbnRJbmZvIGZ1bmN0aW9uLgorICogICAgICAgICAgRm9yIHNvbWUgcGxhdGZvcm1zIEZveGl0IFNESyBpbXBsZW1lbnQgYSBkZWZhdWx0IHZlcnNpb24gb2Ygc3lzdGVtCisgKmZvbnQgaW5mbyBpbnRlcmZhY2UuCisgKiAgICAgICAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgdXNlZCBpbiBGUERGX1NldFN5c3RlbUZvbnRJbmZvCisgKmZ1bmN0aW9uLgogICogUGFyYW1ldGVyczoKICAqICAgICAgICAgIE5vbmUKICAqIFJldHVybiBWYWx1ZToKLSAqICAgICAgICAgIFBvaW50ZXIgdG8gYSBGUERGX1NZU0ZPTlRJTkZPIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBkZWZhdWx0IGludGVyZmFjZS4KKyAqICAgICAgICAgIFBvaW50ZXIgdG8gYSBGUERGX1NZU0ZPTlRJTkZPIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBkZWZhdWx0CisgKmludGVyZmFjZS4KICAqICAgICAgICAgIE9yIE5VTEwgaWYgdGhlIHBsYXRmb3JtIGRvZXNuJ3QgaGF2ZSBhIGRlZmF1bHQgaW50ZXJmYWNlLgotICogICAgICAgICAgQXBwbGljYXRpb24gc2hvdWxkIGNhbGwgRlBERl9GcmVlTWVtb3J5IHRvIGZyZWUgdGhlIHJldHVybmVkIHBvaW50ZXIuCisgKiAgICAgICAgICBBcHBsaWNhdGlvbiBzaG91bGQgY2FsbCBGUERGX0ZyZWVNZW1vcnkgdG8gZnJlZSB0aGUgcmV0dXJuZWQKKyAqcG9pbnRlci4KICAqKi8KIERMTEVYUE9SVCBGUERGX1NZU0ZPTlRJTkZPKiBTVERDQUxMIEZQREZfR2V0RGVmYXVsdFN5c3RlbUZvbnRJbmZvKCk7CiAKZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX3RleHQuaCBiL3B1YmxpYy9mcGRmX3RleHQuaAppbmRleCAzYzBhZmQyLi4zMDQ2YmIwIDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl90ZXh0LmgKKysrIGIvcHVibGljL2ZwZGZfdGV4dC5oCkBAIC0xNywyMSArMTcsMjYgQEAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9Mb2FkUGFnZQogLy8gICAgICAgICAgUHJlcGFyZSBpbmZvcm1hdGlvbiBhYm91dCBhbGwgY2hhcmFjdGVycyBpbiBhIHBhZ2UuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgcGFnZSAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uIChpbiBGUERGVklFVyBtb2R1bGUpLgorLy8gICAgICAgICAgcGFnZSAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uCisvLyAgICAgICAgICAoaW4gRlBERlZJRVcgbW9kdWxlKS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIEEgaGFuZGxlIHRvIHRoZSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLgogLy8gICAgICAgICAgTlVMTCBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KIC8vIENvbW1lbnRzOgotLy8gICAgICAgICAgQXBwbGljYXRpb24gbXVzdCBjYWxsIEZQREZUZXh0X0Nsb3NlUGFnZSB0byByZWxlYXNlIHRoZSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24uCisvLyAgICAgICAgICBBcHBsaWNhdGlvbiBtdXN0IGNhbGwgRlBERlRleHRfQ2xvc2VQYWdlIHRvIHJlbGVhc2UgdGhlIHRleHQgcGFnZQorLy8gICAgICAgICAgaW5mb3JtYXRpb24uCiAvLyBOb3RlczoKLS8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIGxvYWQgb3V0IEZQREZfVEVYVFBBR0UgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIGxvYWQgb3V0IEZQREZfVEVYVFBBR0UgZm9yIHRoZQorLy8gICAgICAgICAgZG9jdW1lbnQgY29uc2lzdHMgb2YgZHluYW1pYyBmaWVsZHMuCiAvLwogRExMRVhQT1JUIEZQREZfVEVYVFBBR0UgU1REQ0FMTCBGUERGVGV4dF9Mb2FkUGFnZShGUERGX1BBR0UgcGFnZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9DbG9zZVBhZ2UKLS8vICAgICAgICAgIFJlbGVhc2UgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKy8vICAgICAgICAgIFJlbGVhc2UgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uCisvLyAgICAgICAgICBzdHJ1Y3R1cmUuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisvLyAgICAgICAgICBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KIC8vIFJldHVybiBWYWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLwpAQCAtNDAsMTMgKzQ1LDE3IEBACiAvLyBGdW5jdGlvbjogRlBERlRleHRfQ291bnRDaGFycwogLy8gICAgICAgICAgR2V0IG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgcGFnZS4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKy8vICAgICAgICAgIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHBhZ2UuIFJldHVybiAtMSBmb3IgZXJyb3IuCi0vLyAgICAgICAgICBHZW5lcmF0ZWQgY2hhcmFjdGVycywgbGlrZSBhZGRpdGlvbmFsIHNwYWNlIGNoYXJhY3RlcnMsIG5ldyBsaW5lIGNoYXJhY3RlcnMsIGFyZSBhbHNvIGNvdW50ZWQuCisvLyAgICAgICAgICBHZW5lcmF0ZWQgY2hhcmFjdGVycywgbGlrZSBhZGRpdGlvbmFsIHNwYWNlIGNoYXJhY3RlcnMsIG5ldyBsaW5lCisvLyAgICAgICAgICBjaGFyYWN0ZXJzLCBhcmUgYWxzbyBjb3VudGVkLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBDaGFyYWN0ZXJzIGluIGEgcGFnZSBmb3JtIGEgInN0cmVhbSIsIGluc2lkZSB0aGUgc3RyZWFtLCBlYWNoIGNoYXJhY3RlciBoYXMgYW4gaW5kZXguCi0vLyAgICAgICAgICBXZSB3aWxsIHVzZSB0aGUgaW5kZXggcGFyYW1ldGVycyBpbiBtYW55IG9mIEZQREZURVhUIGZ1bmN0aW9ucy4gVGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgcGFnZQorLy8gICAgICAgICAgQ2hhcmFjdGVycyBpbiBhIHBhZ2UgZm9ybSBhICJzdHJlYW0iLCBpbnNpZGUgdGhlIHN0cmVhbSwgZWFjaAorLy8gICAgICAgICAgY2hhcmFjdGVyIGhhcyBhbiBpbmRleC4KKy8vICAgICAgICAgIFdlIHdpbGwgdXNlIHRoZSBpbmRleCBwYXJhbWV0ZXJzIGluIG1hbnkgb2YgRlBERlRFWFQgZnVuY3Rpb25zLiBUaGUKKy8vICAgICAgICAgIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgcGFnZQogLy8gICAgICAgICAgaGFzIGFuIGluZGV4IHZhbHVlIG9mIHplcm8uCiAvLwogRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZUZXh0X0NvdW50Q2hhcnMoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UpOwpAQCAtNTQsMTQ5ICs2MywyMTMgQEAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9HZXRVbmljb2RlCiAvLyAgICAgICAgICBHZXQgVW5pY29kZSBvZiBhIGNoYXJhY3RlciBpbiBhIHBhZ2UuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisvLyAgICAgICAgICBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KIC8vICAgICAgICAgIGluZGV4ICAgICAgIC0gICBaZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUaGUgVW5pY29kZSBvZiB0aGUgcGFydGljdWxhciBjaGFyYWN0ZXIuCi0vLyAgICAgICAgICBJZiBhIGNoYXJhY3RlciBpcyBub3QgZW5jb2RlZCBpbiBVbmljb2RlIGFuZCBGb3hpdCBlbmdpbmUgY2FuJ3QgY29udmVydCB0byBVbmljb2RlLAorLy8gICAgICAgICAgSWYgYSBjaGFyYWN0ZXIgaXMgbm90IGVuY29kZWQgaW4gVW5pY29kZSBhbmQgRm94aXQgZW5naW5lIGNhbid0CisvLyAgICAgICAgICBjb252ZXJ0IHRvIFVuaWNvZGUsCiAvLyAgICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgemVyby4KIC8vCi1ETExFWFBPUlQgdW5zaWduZWQgaW50IFNURENBTEwgRlBERlRleHRfR2V0VW5pY29kZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgaW50IGluZGV4KTsKK0RMTEVYUE9SVCB1bnNpZ25lZCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRVbmljb2RlKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KTsKIAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0dldEZvbnRTaXplCiAvLyAgICAgICAgICBHZXQgdGhlIGZvbnQgc2l6ZSBvZiBhIHBhcnRpY3VsYXIgY2hhcmFjdGVyLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLiBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KKy8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorLy8gICAgICAgICAgUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCiAvLyAgICAgICAgICBpbmRleCAgICAgICAtICAgWmVyby1iYXNlZCBpbmRleCBvZiB0aGUgY2hhcmFjdGVyLgogLy8gUmV0dXJuIHZhbHVlOgotLy8gICAgICAgICAgVGhlIGZvbnQgc2l6ZSBvZiB0aGUgcGFydGljdWxhciBjaGFyYWN0ZXIsIG1lYXN1cmVkIGluIHBvaW50cyAoYWJvdXQgMS83MiBpbmNoKS4KKy8vICAgICAgICAgIFRoZSBmb250IHNpemUgb2YgdGhlIHBhcnRpY3VsYXIgY2hhcmFjdGVyLCBtZWFzdXJlZCBpbiBwb2ludHMgKGFib3V0CisvLyAgICAgICAgICAxLzcyIGluY2gpLgogLy8gICAgICAgICAgVGhpcyBpcyB0aGUgdHlwb2dyYXBoaWMgc2l6ZSBvZiB0aGUgZm9udCAoc28gY2FsbGVkICJlbSBzaXplIikuCiAvLwotRExMRVhQT1JUIGRvdWJsZSBTVERDQUxMIEZQREZUZXh0X0dldEZvbnRTaXplKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLCBpbnQgaW5kZXgpOworRExMRVhQT1JUIGRvdWJsZSBTVERDQUxMIEZQREZUZXh0X0dldEZvbnRTaXplKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9HZXRDaGFyQm94CiAvLyAgICAgICAgICBHZXQgYm91bmRpbmcgYm94IG9mIGEgcGFydGljdWxhciBjaGFyYWN0ZXIuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisvLyAgICAgICAgICBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KIC8vICAgICAgICAgIGluZGV4ICAgICAgIC0gICBaZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIuCi0vLyAgICAgICAgICBsZWZ0ICAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSBudW1iZXIgcmVjZWl2aW5nIGxlZnQgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciBib3guCi0vLyAgICAgICAgICByaWdodCAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSBudW1iZXIgcmVjZWl2aW5nIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgYm94LgotLy8gICAgICAgICAgYm90dG9tICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgbnVtYmVyIHJlY2VpdmluZyBib3R0b20gcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciBib3guCi0vLyAgICAgICAgICB0b3AgICAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSBudW1iZXIgcmVjZWl2aW5nIHRvcCBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIGJveC4KKy8vICAgICAgICAgIGxlZnQgICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIG51bWJlciByZWNlaXZpbmcgbGVmdCBwb3NpdGlvbgorLy8gICAgICAgICAgb2YgdGhlIGNoYXJhY3RlciBib3guCisvLyAgICAgICAgICByaWdodCAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSBudW1iZXIgcmVjZWl2aW5nIHJpZ2h0IHBvc2l0aW9uCisvLyAgICAgICAgICBvZiB0aGUgY2hhcmFjdGVyIGJveC4KKy8vICAgICAgICAgIGJvdHRvbSAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIG51bWJlciByZWNlaXZpbmcgYm90dG9tIHBvc2l0aW9uCisvLyAgICAgICAgICBvZiB0aGUgY2hhcmFjdGVyIGJveC4KKy8vICAgICAgICAgIHRvcCAgICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIG51bWJlciByZWNlaXZpbmcgdG9wIHBvc2l0aW9uIG9mCisvLyAgICAgICAgICB0aGUgY2hhcmFjdGVyIGJveC4KIC8vIFJldHVybiBWYWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLyBDb21tZW50czoKIC8vICAgICAgICAgIEFsbCBwb3NpdGlvbnMgYXJlIG1lYXN1cmVkIGluIFBERiAidXNlciBzcGFjZSIuCiAvLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9HZXRDaGFyQm94KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLCBpbnQgaW5kZXgsIGRvdWJsZSogbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJpZ2h0LCBkb3VibGUqIGJvdHRvbSwgZG91YmxlKiB0b3ApOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9HZXRDaGFyQm94KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRvcCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9HZXRDaGFySW5kZXhBdFBvcwotLy8gICAgICAgICAgR2V0IHRoZSBpbmRleCBvZiBhIGNoYXJhY3RlciBhdCBvciBuZWFyYnkgYSBjZXJ0YWluIHBvc2l0aW9uIG9uIHRoZSBwYWdlLgorLy8gICAgICAgICAgR2V0IHRoZSBpbmRleCBvZiBhIGNoYXJhY3RlciBhdCBvciBuZWFyYnkgYSBjZXJ0YWluIHBvc2l0aW9uIG9uIHRoZQorLy8gICAgICAgICAgcGFnZS4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKy8vICAgICAgICAgIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgogLy8gICAgICAgICAgeCAgICAgICAgICAgLSAgIFggcG9zaXRpb24gaW4gUERGICJ1c2VyIHNwYWNlIi4KIC8vICAgICAgICAgIHkgICAgICAgICAgIC0gICBZIHBvc2l0aW9uIGluIFBERiAidXNlciBzcGFjZSIuCi0vLyAgICAgICAgICB4VG9sZXJhbmNlICAtICAgQW4geC1heGlzIHRvbGVyYW5jZSB2YWx1ZSBmb3IgY2hhcmFjdGVyIGhpdCBkZXRlY3Rpb24sIGluIHBvaW50IHVuaXQuCi0vLyAgICAgICAgICB5VG9sZXJhbmNlICAtICAgQSB5LWF4aXMgdG9sZXJhbmNlIHZhbHVlIGZvciBjaGFyYWN0ZXIgaGl0IGRldGVjdGlvbiwgaW4gcG9pbnQgdW5pdC4KKy8vICAgICAgICAgIHhUb2xlcmFuY2UgIC0gICBBbiB4LWF4aXMgdG9sZXJhbmNlIHZhbHVlIGZvciBjaGFyYWN0ZXIgaGl0CisvLyAgICAgICAgICBkZXRlY3Rpb24sIGluIHBvaW50IHVuaXQuCisvLyAgICAgICAgICB5VG9sZXJhbmNlICAtICAgQSB5LWF4aXMgdG9sZXJhbmNlIHZhbHVlIGZvciBjaGFyYWN0ZXIgaGl0CisvLyAgICAgICAgICBkZXRlY3Rpb24sIGluIHBvaW50IHVuaXQuCiAvLyBSZXR1cm4gVmFsdWU6CiAvLyAgICAgICAgICBUaGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIGF0LCBvciBuZWFyYnkgdGhlIHBvaW50ICh4LHkpLgotLy8gICAgICAgICAgSWYgdGhlcmUgaXMgbm8gY2hhcmFjdGVyIGF0IG9yIG5lYXJieSB0aGUgcG9pbnQsIHJldHVybiB2YWx1ZSB3aWxsIGJlIC0xLgorLy8gICAgICAgICAgSWYgdGhlcmUgaXMgbm8gY2hhcmFjdGVyIGF0IG9yIG5lYXJieSB0aGUgcG9pbnQsIHJldHVybiB2YWx1ZSB3aWxsCisvLyAgICAgICAgICBiZSAtMS4KIC8vICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycywgLTMgd2lsbCBiZSByZXR1cm5lZC4KIC8vCiBETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0Q2hhckluZGV4QXRQb3MoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeFRvcmVsYW5jZSwgZG91YmxlIHlUb2xlcmFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4VG9yZWxhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB5VG9sZXJhbmNlKTsKIAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0dldFRleHQKIC8vICAgICAgICAgIEV4dHJhY3QgdW5pY29kZSB0ZXh0IHN0cmluZyBmcm9tIHRoZSBwYWdlLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLiBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KKy8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorLy8gICAgICAgICAgUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCiAvLyAgICAgICAgICBzdGFydF9pbmRleCAtICAgSW5kZXggZm9yIHRoZSBzdGFydCBjaGFyYWN0ZXJzLgogLy8gICAgICAgICAgY291bnQgICAgICAgLSAgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIGV4dHJhY3RlZC4KLS8vICAgICAgICAgIHJlc3VsdCAgICAgIC0gICBBIGJ1ZmZlciAoYWxsb2NhdGVkIGJ5IGFwcGxpY2F0aW9uKSByZWNlaXZpbmcgdGhlIGV4dHJhY3RlZCB1bmljb2Rlcy4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIG11c3QgYmUgYWJsZSB0byBob2xkIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwbHVzIGEgdGVybWluYXRvci4KKy8vICAgICAgICAgIHJlc3VsdCAgICAgIC0gICBBIGJ1ZmZlciAoYWxsb2NhdGVkIGJ5IGFwcGxpY2F0aW9uKSByZWNlaXZpbmcgdGhlCisvLyAgICAgICAgICBleHRyYWN0ZWQgdW5pY29kZXMuCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBtdXN0IGJlIGFibGUgdG8gaG9sZCB0aGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgY2hhcmFjdGVycyBwbHVzIGEgdGVybWluYXRvci4KIC8vIFJldHVybiBWYWx1ZToKLS8vICAgICAgICAgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4gaW50byB0aGUgcmVzdWx0IGJ1ZmZlciwgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyB0ZXJtaW5hdG9yLgorLy8gICAgICAgICAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiBpbnRvIHRoZSByZXN1bHQgYnVmZmVyLCBpbmNsdWRpbmcgdGhlCisvLyAgICAgICAgICB0cmFpbGluZyB0ZXJtaW5hdG9yLgogLy8gQ29tbWVudHM6CiAvLyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlnbm9yZXMgY2hhcmFjdGVycyB3aXRob3V0IHVuaWNvZGUgaW5mb3JtYXRpb24uCiAvLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZUZXh0X0dldFRleHQoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsIGludCBzdGFydF9pbmRleCwgaW50IGNvdW50LCB1bnNpZ25lZCBzaG9ydCogcmVzdWx0KTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRUZXh0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQqIHJlc3VsdCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9Db3VudFJlY3RzCiAvLyAgICAgICAgICBDb3VudCBudW1iZXIgb2YgcmVjdGFuZ3VsYXIgYXJlYXMgb2NjdXBpZWQgYnkgYSBzZWdtZW50IG9mIHRleHRzLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLiBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KKy8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorLy8gICAgICAgICAgUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCiAvLyAgICAgICAgICBzdGFydF9pbmRleCAtICAgSW5kZXggZm9yIHRoZSBzdGFydCBjaGFyYWN0ZXJzLgogLy8gICAgICAgICAgY291bnQgICAgICAgLSAgIE51bWJlciBvZiBjaGFyYWN0ZXJzLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTnVtYmVyIG9mIHJlY3RhbmdsZXMuIFplcm8gZm9yIGVycm9yLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBUaGlzIGZ1bmN0aW9uLCBhbG9uZyB3aXRoIEZQREZUZXh0X0dldFJlY3QgY2FuIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zIHRvIGRldGVjdCB0aGUgcG9zaXRpb24KLS8vICAgICAgICAgIG9uIHRoZSBwYWdlIGZvciBhIHRleHQgc2VnbWVudCwgc28gcHJvcGVyIGFyZWFzIGNhbiBiZSBoaWdobGlnaHRlZCBvciBzb21ldGhpbmcuCi0vLyAgICAgICAgICBGUERGVEVYVCB3aWxsIGF1dG9tYXRpY2FsbHkgbWVyZ2Ugc21hbGwgY2hhcmFjdGVyIGJveGVzIGludG8gYmlnZ2VyIG9uZSBpZiB0aG9zZSBjaGFyYWN0ZXJzCisvLyAgICAgICAgICBUaGlzIGZ1bmN0aW9uLCBhbG9uZyB3aXRoIEZQREZUZXh0X0dldFJlY3QgY2FuIGJlIHVzZWQgYnkKKy8vICAgICAgICAgIGFwcGxpY2F0aW9ucyB0byBkZXRlY3QgdGhlIHBvc2l0aW9uCisvLyAgICAgICAgICBvbiB0aGUgcGFnZSBmb3IgYSB0ZXh0IHNlZ21lbnQsIHNvIHByb3BlciBhcmVhcyBjYW4gYmUgaGlnaGxpZ2h0ZWQKKy8vICAgICAgICAgIG9yIHNvbWV0aGluZy4KKy8vICAgICAgICAgIEZQREZURVhUIHdpbGwgYXV0b21hdGljYWxseSBtZXJnZSBzbWFsbCBjaGFyYWN0ZXIgYm94ZXMgaW50byBiaWdnZXIKKy8vICAgICAgICAgIG9uZSBpZiB0aG9zZSBjaGFyYWN0ZXJzCiAvLyAgICAgICAgICBhcmUgb24gdGhlIHNhbWUgbGluZSBhbmQgdXNlIHNhbWUgZm9udCBzZXR0aW5ncy4KIC8vCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfQ291bnRSZWN0cyhGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgaW50IHN0YXJ0X2luZGV4LCBpbnQgY291bnQpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZUZXh0X0NvdW50UmVjdHMoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpOwogCiAvLyBGdW5jdGlvbjogRlBERlRleHRfR2V0UmVjdAotLy8gICAgICAgICAgR2V0IGEgcmVjdGFuZ3VsYXIgYXJlYSBmcm9tIHRoZSByZXN1bHQgZ2VuZXJhdGVkIGJ5IEZQREZUZXh0X0NvdW50UmVjdHMuCisvLyAgICAgICAgICBHZXQgYSByZWN0YW5ndWxhciBhcmVhIGZyb20gdGhlIHJlc3VsdCBnZW5lcmF0ZWQgYnkKKy8vICAgICAgICAgIEZQREZUZXh0X0NvdW50UmVjdHMuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisvLyAgICAgICAgICBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KIC8vICAgICAgICAgIHJlY3RfaW5kZXggIC0gICBaZXJvLWJhc2VkIGluZGV4IGZvciB0aGUgcmVjdGFuZ2xlLgotLy8gICAgICAgICAgbGVmdCAgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByZWN0YW5nbGUgbGVmdCBib3VuZGFyeS4KLS8vICAgICAgICAgIHRvcCAgICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlIHRvcCBib3VuZGFyeS4KLS8vICAgICAgICAgIHJpZ2h0ICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlIHJpZ2h0IGJvdW5kYXJ5LgotLy8gICAgICAgICAgYm90dG9tICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByZWN0YW5nbGUgYm90dG9tIGJvdW5kYXJ5LgorLy8gICAgICAgICAgbGVmdCAgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByZWN0YW5nbGUKKy8vICAgICAgICAgIGxlZnQgYm91bmRhcnkuCisvLyAgICAgICAgICB0b3AgICAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJlY3RhbmdsZQorLy8gICAgICAgICAgdG9wIGJvdW5kYXJ5LgorLy8gICAgICAgICAgcmlnaHQgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByZWN0YW5nbGUKKy8vICAgICAgICAgIHJpZ2h0IGJvdW5kYXJ5LgorLy8gICAgICAgICAgYm90dG9tICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByZWN0YW5nbGUKKy8vICAgICAgICAgIGJvdHRvbSBib3VuZGFyeS4KIC8vIFJldHVybiBWYWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9HZXRSZWN0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLCBpbnQgcmVjdF9pbmRleCwgZG91YmxlKiBsZWZ0LCBkb3VibGUqIHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByaWdodCwgZG91YmxlKiBib3R0b20pOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9HZXRSZWN0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYm90dG9tKTsKIAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0dldEJvdW5kZWRUZXh0CiAvLyAgICAgICAgICBFeHRyYWN0IHVuaWNvZGUgdGV4dCB3aXRoaW4gYSByZWN0YW5ndWxhciBib3VuZGFyeSBvbiB0aGUgcGFnZS4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKy8vICAgICAgICAgIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgogLy8gICAgICAgICAgbGVmdCAgICAgICAgLSAgIExlZnQgYm91bmRhcnkuCiAvLyAgICAgICAgICB0b3AgICAgICAgICAtICAgVG9wIGJvdW5kYXJ5LgogLy8gICAgICAgICAgcmlnaHQgICAgICAgLSAgIFJpZ2h0IGJvdW5kYXJ5LgogLy8gICAgICAgICAgYm90dG9tICAgICAgLSAgIEJvdHRvbSBib3VuZGFyeS4KIC8vICAgICAgICAgIGJ1ZmZlciAgICAgIC0gICBBIHVuaWNvZGUgYnVmZmVyLgotLy8gICAgICAgICAgYnVmbGVuICAgICAgLSAgIE51bWJlciBvZiBjaGFyYWN0ZXJzIChub3QgYnl0ZXMpIGZvciB0aGUgYnVmZmVyLCBleGNsdWRpbmcgYW4gYWRkaXRpb25hbCB0ZXJtaW5hdG9yLgorLy8gICAgICAgICAgYnVmbGVuICAgICAgLSAgIE51bWJlciBvZiBjaGFyYWN0ZXJzIChub3QgYnl0ZXMpIGZvciB0aGUgYnVmZmVyLAorLy8gICAgICAgICAgZXhjbHVkaW5nIGFuIGFkZGl0aW9uYWwgdGVybWluYXRvci4KIC8vIFJldHVybiBWYWx1ZToKLS8vICAgICAgICAgIElmIGJ1ZmZlciBpcyBOVUxMIG9yIGJ1ZmxlbiBpcyB6ZXJvLCByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgKG5vdCBieXRlcykgb2YgdGV4dCBwcmVzZW50IHdpdGhpbgotLy8gICAgICAgICAgdGhlIHJlY3RhbmdsZSwgZXhjbHVkaW5nIGEgdGVybWluYXRpbmcgTlVMLiAgR2VuZXJhbGx5IHlvdSBzaG91bGQgcGFzcyBhIGJ1ZmZlciBhdCBsZWFzdCBvbmUgbGFyZ2VyCi0vLyAgICAgICAgICB0aGFuIHRoaXMgaWYgeW91IHdhbnQgYSB0ZXJtaW5hdGluZyBOVUwsIHdoaWNoIHdpbGwgYmUgcHJvdmlkZWQgaWYgc3BhY2UgaXMgYXZhaWxhYmxlLgotLy8gICAgICAgICAgT3RoZXJ3aXNlLCByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkIGludG8gdGhlIGJ1ZmZlciwgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBOVUwKKy8vICAgICAgICAgIElmIGJ1ZmZlciBpcyBOVUxMIG9yIGJ1ZmxlbiBpcyB6ZXJvLCByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMKKy8vICAgICAgICAgIChub3QgYnl0ZXMpIG9mIHRleHQgcHJlc2VudCB3aXRoaW4KKy8vICAgICAgICAgIHRoZSByZWN0YW5nbGUsIGV4Y2x1ZGluZyBhIHRlcm1pbmF0aW5nIE5VTC4gIEdlbmVyYWxseSB5b3Ugc2hvdWxkCisvLyAgICAgICAgICBwYXNzIGEgYnVmZmVyIGF0IGxlYXN0IG9uZSBsYXJnZXIKKy8vICAgICAgICAgIHRoYW4gdGhpcyBpZiB5b3Ugd2FudCBhIHRlcm1pbmF0aW5nIE5VTCwgd2hpY2ggd2lsbCBiZSBwcm92aWRlZCBpZgorLy8gICAgICAgICAgc3BhY2UgaXMgYXZhaWxhYmxlLgorLy8gICAgICAgICAgT3RoZXJ3aXNlLCByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkIGludG8gdGhlIGJ1ZmZlciwKKy8vICAgICAgICAgIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMCiAvLyAgICAgICAgICB3aGVuIHNwYWNlIGZvciBpdCBpcyBhdmFpbGFibGUuCiAvLyBDb21tZW50OgotLy8gICAgICAgICAgSWYgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwsIGFzIG11Y2ggdGV4dCBhcyB3aWxsIGZpdCBpcyBjb3BpZWQgaW50byBpdC4KKy8vICAgICAgICAgIElmIHRoZSBidWZmZXIgaXMgdG9vIHNtYWxsLCBhcyBtdWNoIHRleHQgYXMgd2lsbCBmaXQgaXMgY29waWVkIGludG8KKy8vICAgICAgICAgIGl0LgogLy8KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRCb3VuZGVkVGV4dChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSxkb3VibGUgbGVmdCwgZG91YmxlIHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20sdW5zaWduZWQgc2hvcnQqIGJ1ZmZlcixpbnQgYnVmbGVuKTsKLQorRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZUZXh0X0dldEJvdW5kZWRUZXh0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmbGVuKTsKIAogLy8gRmxhZ3MgdXNlZCBieSBGUERGVGV4dF9GaW5kU3RhcnQgZnVuY3Rpb24uCi0jZGVmaW5lIEZQREZfTUFUQ0hDQVNFICAgICAgMHgwMDAwMDAwMSAgICAgIC8vSWYgbm90IHNldCwgaXQgd2lsbCBub3QgbWF0Y2ggY2FzZSBieSBkZWZhdWx0LgotI2RlZmluZSBGUERGX01BVENIV0hPTEVXT1JEIDB4MDAwMDAwMDIgICAgICAvL0lmIG5vdCBzZXQsIGl0IHdpbGwgbm90IG1hdGNoIHRoZSB3aG9sZSB3b3JkIGJ5IGRlZmF1bHQuCisjZGVmaW5lIEZQREZfTUFUQ0hDQVNFIFwKKyAgMHgwMDAwMDAwMSAgLy8gSWYgbm90IHNldCwgaXQgd2lsbCBub3QgbWF0Y2ggY2FzZSBieSBkZWZhdWx0LgorI2RlZmluZSBGUERGX01BVENIV0hPTEVXT1JEIFwKKyAgMHgwMDAwMDAwMiAgLy8gSWYgbm90IHNldCwgaXQgd2lsbCBub3QgbWF0Y2ggdGhlIHdob2xlIHdvcmQgYnkgZGVmYXVsdC4KIAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0ZpbmRTdGFydAogLy8gICAgICAgICAgU3RhcnQgYSBzZWFyY2guCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisvLyAgICAgICAgICBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KIC8vICAgICAgICAgIGZpbmR3aGF0ICAgIC0gICBBIHVuaWNvZGUgbWF0Y2ggcGF0dGVybi4KIC8vICAgICAgICAgIGZsYWdzICAgICAgIC0gICBPcHRpb24gZmxhZ3MuCiAvLyAgICAgICAgICBzdGFydF9pbmRleCAtICAgU3RhcnQgZnJvbSB0aGlzIGNoYXJhY3Rlci4gLTEgZm9yIGVuZCBvZiB0aGUgcGFnZS4KIC8vIFJldHVybiBWYWx1ZToKLS8vICAgICAgICAgIEEgaGFuZGxlIGZvciB0aGUgc2VhcmNoIGNvbnRleHQuIEZQREZUZXh0X0ZpbmRDbG9zZSBtdXN0IGJlIGNhbGxlZCB0byByZWxlYXNlIHRoaXMgaGFuZGxlLgorLy8gICAgICAgICAgQSBoYW5kbGUgZm9yIHRoZSBzZWFyY2ggY29udGV4dC4gRlBERlRleHRfRmluZENsb3NlIG11c3QgYmUgY2FsbGVkCisvLyAgICAgICAgICB0byByZWxlYXNlIHRoaXMgaGFuZGxlLgogLy8KLURMTEVYUE9SVCBGUERGX1NDSEhBTkRMRSBTVERDQUxMIEZQREZUZXh0X0ZpbmRTdGFydChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgRlBERl9XSURFU1RSSU5HIGZpbmR3aGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBzdGFydF9pbmRleCk7CitETExFWFBPUlQgRlBERl9TQ0hIQU5ETEUgU1REQ0FMTCBGUERGVGV4dF9GaW5kU3RhcnQoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIGZpbmR3aGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2luZGV4KTsKIAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0ZpbmROZXh0CiAvLyAgICAgICAgICBTZWFyY2ggaW4gdGhlIGRpcmVjdGlvbiBmcm9tIHBhZ2Ugc3RhcnQgdG8gZW5kLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGhhbmRsZSAgICAgIC0gICBBIHNlYXJjaCBjb250ZXh0IGhhbmRsZSByZXR1cm5lZCBieSBGUERGVGV4dF9GaW5kU3RhcnQuCisvLyAgICAgICAgICBoYW5kbGUgICAgICAtICAgQSBzZWFyY2ggY29udGV4dCBoYW5kbGUgcmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZUZXh0X0ZpbmRTdGFydC4KIC8vIFJldHVybiBWYWx1ZToKIC8vICAgICAgICAgIFdoZXRoZXIgYSBtYXRjaCBpcyBmb3VuZC4KIC8vCkBAIC0yMDUsNyArMjc4LDggQEAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9GaW5kUHJldgogLy8gICAgICAgICAgU2VhcmNoIGluIHRoZSBkaXJlY3Rpb24gZnJvbSBwYWdlIGVuZCB0byBzdGFydC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBoYW5kbGUgICAgICAtICAgQSBzZWFyY2ggY29udGV4dCBoYW5kbGUgcmV0dXJuZWQgYnkgRlBERlRleHRfRmluZFN0YXJ0LgorLy8gICAgICAgICAgaGFuZGxlICAgICAgLSAgIEEgc2VhcmNoIGNvbnRleHQgaGFuZGxlIHJldHVybmVkIGJ5CisvLyAgICAgICAgICBGUERGVGV4dF9GaW5kU3RhcnQuCiAvLyBSZXR1cm4gVmFsdWU6CiAvLyAgICAgICAgICBXaGV0aGVyIGEgbWF0Y2ggaXMgZm91bmQuCiAvLwpAQCAtMjE0LDcgKzI4OCw4IEBACiAvLyBGdW5jdGlvbjogRlBERlRleHRfR2V0U2NoUmVzdWx0SW5kZXgKIC8vICAgICAgICAgIEdldCB0aGUgc3RhcnRpbmcgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBzZWFyY2ggcmVzdWx0LgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGhhbmRsZSAgICAgIC0gICBBIHNlYXJjaCBjb250ZXh0IGhhbmRsZSByZXR1cm5lZCBieSBGUERGVGV4dF9GaW5kU3RhcnQuCisvLyAgICAgICAgICBoYW5kbGUgICAgICAtICAgQSBzZWFyY2ggY29udGV4dCBoYW5kbGUgcmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZUZXh0X0ZpbmRTdGFydC4KIC8vIFJldHVybiBWYWx1ZToKIC8vICAgICAgICAgIEluZGV4IGZvciB0aGUgc3RhcnRpbmcgY2hhcmFjdGVyLgogLy8KQEAgLTIyMyw3ICsyOTgsOCBAQAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0dldFNjaENvdW50CiAvLyAgICAgICAgICBHZXQgdGhlIG51bWJlciBvZiBtYXRjaGVkIGNoYXJhY3RlcnMgaW4gdGhlIHNlYXJjaCByZXN1bHQuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgaGFuZGxlICAgICAgLSAgIEEgc2VhcmNoIGNvbnRleHQgaGFuZGxlIHJldHVybmVkIGJ5IEZQREZUZXh0X0ZpbmRTdGFydC4KKy8vICAgICAgICAgIGhhbmRsZSAgICAgIC0gICBBIHNlYXJjaCBjb250ZXh0IGhhbmRsZSByZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERlRleHRfRmluZFN0YXJ0LgogLy8gUmV0dXJuIFZhbHVlOgogLy8gICAgICAgICAgTnVtYmVyIG9mIG1hdGNoZWQgY2hhcmFjdGVycy4KIC8vCkBAIC0yMzIsNyArMzA4LDggQEAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9GaW5kQ2xvc2UKIC8vICAgICAgICAgIFJlbGVhc2UgYSBzZWFyY2ggY29udGV4dC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBoYW5kbGUgICAgICAtICAgQSBzZWFyY2ggY29udGV4dCBoYW5kbGUgcmV0dXJuZWQgYnkgRlBERlRleHRfRmluZFN0YXJ0LgorLy8gICAgICAgICAgaGFuZGxlICAgICAgLSAgIEEgc2VhcmNoIGNvbnRleHQgaGFuZGxlIHJldHVybmVkIGJ5CisvLyAgICAgICAgICBGUERGVGV4dF9GaW5kU3RhcnQuCiAvLyBSZXR1cm4gVmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8KQEAgLTI0MSwxNiArMzE4LDIyIEBACiAvLyBGdW5jdGlvbjogRlBERkxpbmtfTG9hZFdlYkxpbmtzCiAvLyAgICAgICAgICBQcmVwYXJlIGluZm9ybWF0aW9uIGFib3V0IHdlYmxpbmtzIGluIGEgcGFnZS4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKy8vICAgICAgICAgIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgogLy8gUmV0dXJuIFZhbHVlOgogLy8gICAgICAgICAgQSBoYW5kbGUgdG8gdGhlIHBhZ2UncyBsaW5rcyBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCiAvLyAgICAgICAgICBOVUxMIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBXZWJsaW5rcyBhcmUgdGhvc2UgbGlua3MgaW1wbGljaXRseSBlbWJlZGRlZCBpbiBQREYgcGFnZXMuIFBERiBhbHNvIGhhcyBhIHR5cGUgb2YKLS8vICAgICAgICAgIGFubm90YXRpb24gY2FsbGVkICJsaW5rIiwgRlBERlRFWFQgZG9lc24ndCBkZWFsIHdpdGggdGhhdCBraW5kIG9mIGxpbmsuCi0vLyAgICAgICAgICBGUERGVEVYVCB3ZWJsaW5rIGZlYXR1cmUgaXMgdXNlZnVsIGZvciBhdXRvbWF0aWNhbGx5IGRldGVjdGluZyBsaW5rcyBpbiB0aGUgcGFnZQotLy8gICAgICAgICAgY29udGVudHMuIEZvciBleGFtcGxlLCB0aGluZ3MgbGlrZSAiaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbSIgd2lsbCBiZSBkZXRlY3RlZCwKLS8vICAgICAgICAgIHNvIGFwcGxpY2F0aW9ucyBjYW4gYWxsb3cgdXNlciB0byBjbGljayBvbiB0aG9zZSBjaGFyYWN0ZXJzIHRvIGFjdGl2YXRlIHRoZSBsaW5rLAorLy8gICAgICAgICAgV2VibGlua3MgYXJlIHRob3NlIGxpbmtzIGltcGxpY2l0bHkgZW1iZWRkZWQgaW4gUERGIHBhZ2VzLiBQREYgYWxzbworLy8gICAgICAgICAgaGFzIGEgdHlwZSBvZgorLy8gICAgICAgICAgYW5ub3RhdGlvbiBjYWxsZWQgImxpbmsiLCBGUERGVEVYVCBkb2Vzbid0IGRlYWwgd2l0aCB0aGF0IGtpbmQgb2YKKy8vICAgICAgICAgIGxpbmsuCisvLyAgICAgICAgICBGUERGVEVYVCB3ZWJsaW5rIGZlYXR1cmUgaXMgdXNlZnVsIGZvciBhdXRvbWF0aWNhbGx5IGRldGVjdGluZyBsaW5rcworLy8gICAgICAgICAgaW4gdGhlIHBhZ2UKKy8vICAgICAgICAgIGNvbnRlbnRzLiBGb3IgZXhhbXBsZSwgdGhpbmdzIGxpa2UgImh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20iCisvLyAgICAgICAgICB3aWxsIGJlIGRldGVjdGVkLAorLy8gICAgICAgICAgc28gYXBwbGljYXRpb25zIGNhbiBhbGxvdyB1c2VyIHRvIGNsaWNrIG9uIHRob3NlIGNoYXJhY3RlcnMgdG8KKy8vICAgICAgICAgIGFjdGl2YXRlIHRoZSBsaW5rLAogLy8gICAgICAgICAgZXZlbiB0aGUgUERGIGRvZXNuJ3QgY29tZSB3aXRoIGxpbmsgYW5ub3RhdGlvbnMuCiAvLwogLy8gICAgICAgICAgRlBERkxpbmtfQ2xvc2VXZWJMaW5rcyBtdXN0IGJlIGNhbGxlZCB0byByZWxlYXNlIHJlc291cmNlcy4KQEAgLTI3MiwxMiArMzU1LDE3IEBACiAvLyAgICAgICAgICBsaW5rX3BhZ2UgICAtICAgSGFuZGxlIHJldHVybmVkIGJ5IEZQREZMaW5rX0xvYWRXZWJMaW5rcy4KIC8vICAgICAgICAgIGxpbmtfaW5kZXggIC0gICBaZXJvLWJhc2VkIGluZGV4IGZvciB0aGUgbGluay4KIC8vICAgICAgICAgIGJ1ZmZlciAgICAgIC0gICBBIHVuaWNvZGUgYnVmZmVyLgotLy8gICAgICAgICAgYnVmbGVuICAgICAgLSAgIE51bWJlciBvZiBjaGFyYWN0ZXJzIChub3QgYnl0ZXMpIGZvciB0aGUgYnVmZmVyLCBpbmNsdWRpbmcgYW4gYWRkaXRpb25hbCB0ZXJtaW5hdG9yLgorLy8gICAgICAgICAgYnVmbGVuICAgICAgLSAgIE51bWJlciBvZiBjaGFyYWN0ZXJzIChub3QgYnl0ZXMpIGZvciB0aGUgYnVmZmVyLAorLy8gICAgICAgICAgaW5jbHVkaW5nIGFuIGFkZGl0aW9uYWwgdGVybWluYXRvci4KIC8vIFJldHVybiBWYWx1ZToKLS8vICAgICAgICAgIElmIGJ1ZmZlciBpcyBOVUxMIG9yIGJ1ZmxlbiBpcyB6ZXJvLCByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgKG5vdCBieXRlcyBhbmQgYW4gYWRkaXRpb25hbCB0ZXJtaW5hdG9yIGlzIGFsc28gY291bnRlZCkgbmVlZGVkLAorLy8gICAgICAgICAgSWYgYnVmZmVyIGlzIE5VTEwgb3IgYnVmbGVuIGlzIHplcm8sIHJldHVybiBudW1iZXIgb2YgY2hhcmFjdGVycworLy8gICAgICAgICAgKG5vdCBieXRlcyBhbmQgYW4gYWRkaXRpb25hbCB0ZXJtaW5hdG9yIGlzIGFsc28gY291bnRlZCkgbmVlZGVkLAogLy8gICAgICAgICAgb3RoZXJ3aXNlLCByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkIGludG8gdGhlIGJ1ZmZlci4KIC8vCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkxpbmtfR2V0VVJMKEZQREZfUEFHRUxJTksgbGlua19wYWdlLCBpbnQgbGlua19pbmRleCwgdW5zaWduZWQgc2hvcnQqIGJ1ZmZlcixpbnQgYnVmbGVuKTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGTGlua19HZXRVUkwoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5rX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmbGVuKTsKIAogLy8gRnVuY3Rpb246IEZQREZMaW5rX0NvdW50UmVjdHMKIC8vICAgICAgICAgIENvdW50IG51bWJlciBvZiByZWN0YW5ndWxhciBhcmVhcyBmb3IgdGhlIGxpbmsuCkBAIC0yODcsNyArMzc1LDggQEAKIC8vIFJldHVybiBWYWx1ZToKIC8vICAgICAgICAgIE51bWJlciBvZiByZWN0YW5ndWxhciBhcmVhcyBmb3IgdGhlIGxpbmsuCiAvLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZMaW5rX0NvdW50UmVjdHMoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UsIGludCBsaW5rX2luZGV4KTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGTGlua19Db3VudFJlY3RzKEZQREZfUEFHRUxJTksgbGlua19wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmtfaW5kZXgpOwogCiAvLyBGdW5jdGlvbjogRlBERkxpbmtfR2V0UmVjdAogLy8gICAgICAgICAgRmV0Y2ggdGhlIGJvdW5kYXJpZXMgb2YgYSByZWN0YW5nbGUgZm9yIGEgbGluay4KQEAgLTI5NSwxNSArMzg0LDI0IEBACiAvLyAgICAgICAgICBsaW5rX3BhZ2UgICAtICAgSGFuZGxlIHJldHVybmVkIGJ5IEZQREZMaW5rX0xvYWRXZWJMaW5rcy4KIC8vICAgICAgICAgIGxpbmtfaW5kZXggIC0gICBaZXJvLWJhc2VkIGluZGV4IGZvciB0aGUgbGluay4KIC8vICAgICAgICAgIHJlY3RfaW5kZXggIC0gICBaZXJvLWJhc2VkIGluZGV4IGZvciBhIHJlY3RhbmdsZS4KLS8vICAgICAgICAgIGxlZnQgICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlIGxlZnQgYm91bmRhcnkuCi0vLyAgICAgICAgICB0b3AgICAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJlY3RhbmdsZSB0b3AgYm91bmRhcnkuCi0vLyAgICAgICAgICByaWdodCAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJlY3RhbmdsZSByaWdodCBib3VuZGFyeS4KLS8vICAgICAgICAgIGJvdHRvbSAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlIGJvdHRvbSBib3VuZGFyeS4KKy8vICAgICAgICAgIGxlZnQgICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlCisvLyAgICAgICAgICBsZWZ0IGJvdW5kYXJ5LgorLy8gICAgICAgICAgdG9wICAgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByZWN0YW5nbGUKKy8vICAgICAgICAgIHRvcCBib3VuZGFyeS4KKy8vICAgICAgICAgIHJpZ2h0ICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlCisvLyAgICAgICAgICByaWdodCBib3VuZGFyeS4KKy8vICAgICAgICAgIGJvdHRvbSAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlCisvLyAgICAgICAgICBib3R0b20gYm91bmRhcnkuCiAvLyBSZXR1cm4gVmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERkxpbmtfR2V0UmVjdChGUERGX1BBR0VMSU5LIGxpbmtfcGFnZSwgaW50IGxpbmtfaW5kZXgsIGludCByZWN0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbGVmdCwgZG91YmxlKiB0b3AsZG91YmxlKiByaWdodCwgZG91YmxlKiBib3R0b20pOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGTGlua19HZXRSZWN0KEZQREZfUEFHRUxJTksgbGlua19wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5rX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYm90dG9tKTsKIAogLy8gRnVuY3Rpb246IEZQREZMaW5rX0Nsb3NlV2ViTGlua3MKIC8vICAgICAgICAgIFJlbGVhc2UgcmVzb3VyY2VzIHVzZWQgYnkgd2VibGluayBmZWF0dXJlLgpAQCAtMzE0LDcgKzQxMiw2IEBACiAvLwogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGTGlua19DbG9zZVdlYkxpbmtzKEZQREZfUEFHRUxJTksgbGlua19wYWdlKTsKIAotCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZfdHJhbnNmb3JtcGFnZS5oIGIvcHVibGljL2ZwZGZfdHJhbnNmb3JtcGFnZS5oCmluZGV4IDMyNGJjZGEuLjIxNDIxYTEgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX3RyYW5zZm9ybXBhZ2UuaAorKysgYi9wdWJsaWMvZnBkZl90cmFuc2Zvcm1wYWdlLmgKQEAgLTI0LDkgKzI0LDE0IEBACiAqIEBwYXJhbVtpbl0gcmlnaHQgIC0gVGhlIHJpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCiAqIEBwYXJhbVtpbl0gdG9wICAgIC0gVGhlIHRvcCBvZiB0aGUgcmVjdGFuZ2xlLgogKiBAcmV0dmFsIE5vbmUuCi0qIEBub3RlIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIHNldCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCB3aGljaCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisqIEBub3RlIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIHNldCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCB3aGljaAorKiBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCiAqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9TZXRNZWRpYUJveChGUERGX1BBR0UgcGFnZSwgZmxvYXQgbGVmdCwgZmxvYXQgYm90dG9tLCBmbG9hdCByaWdodCwgZmxvYXQgdG9wKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfU2V0TWVkaWFCb3goRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRvcCk7CiAKIC8qKgogKiAgU2V0ICJDcm9wQm94IiBlbnRyeSB0byB0aGUgcGFnZSBkaWN0aW9uYXJ5LgpAQCAtMzYsNDcgKzQxLDc1IEBACiAqIEBwYXJhbVtpbl0gcmlnaHQgIC0gVGhlIHJpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCiAqIEBwYXJhbVtpbl0gdG9wICAgIC0gVGhlIHRvcCBvZiB0aGUgcmVjdGFuZ2xlLgogKiBAcmV0dmFsIE5vbmUuCi0qIEBub3RlIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIHNldCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCB3aGljaCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisqIEBub3RlIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIHNldCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCB3aGljaAorKiBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCiAqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9TZXRDcm9wQm94KEZQREZfUEFHRSBwYWdlLCBmbG9hdCBsZWZ0LCBmbG9hdCBib3R0b20sIGZsb2F0IHJpZ2h0LCBmbG9hdCB0b3ApOwotCitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX1NldENyb3BCb3goRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdG9wKTsKIAogLyoqICBHZXQgIk1lZGlhQm94IiBlbnRyeSBmcm9tIHRoZSBwYWdlIGRpY3Rpb25hcnkuCiAqIEBwYXJhbVtpbl0gcGFnZSAgIC0gSGFuZGxlIHRvIGEgcGFnZS4KLSogQHBhcmFtW2luXSBsZWZ0ICAgLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgbGVmdCBvZiB0aGUgcmVjdGFuZ2xlLgotKiBAcGFyYW1baW5dIGJvdHRvbSAtIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSBib3R0b20gb2YgdGhlIHJlY3RhbmdsZS4KLSogQHBhcmFtW2luXSByaWdodCAgLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KLSogQHBhcmFtW2luXSB0b3AgICAgLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgdG9wIG9mIHRoZSByZWN0YW5nbGUuCisqIEBwYXJhbVtpbl0gbGVmdCAgIC0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIGxlZnQgb2YgdGhlCisqIHJlY3RhbmdsZS4KKyogQHBhcmFtW2luXSBib3R0b20gLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgYm90dG9tIG9mIHRoZQorKiByZWN0YW5nbGUuCisqIEBwYXJhbVtpbl0gcmlnaHQgIC0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJpZ2h0IG9mIHRoZQorKiByZWN0YW5nbGUuCisqIEBwYXJhbVtpbl0gdG9wICAgIC0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHRvcCBvZiB0aGUKKyogcmVjdGFuZ2xlLgogKiBAcmV0dmFsIFRydWUgaWYgc3VjY2VzcyxlbHNlIGZhaWwuCi0qIEBub3RlIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIGdldCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCB3aGljaCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisqIEBub3RlIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIGdldCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCB3aGljaAorKiBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCiAqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0dldE1lZGlhQm94KEZQREZfUEFHRSBwYWdlLCBmbG9hdCogbGVmdCwgZmxvYXQqIGJvdHRvbSwgZmxvYXQqIHJpZ2h0LCBmbG9hdCogdG9wKTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9HZXRNZWRpYUJveChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdG9wKTsKIAogLyoqICBHZXQgIkNyb3BCb3giIGVudHJ5IGZyb20gdGhlIHBhZ2UgZGljdGlvbmFyeS4KICogQHBhcmFtW2luXSBwYWdlICAgLSBIYW5kbGUgdG8gYSBwYWdlLgotKiBAcGFyYW1baW5dIGxlZnQgICAtIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSBsZWZ0IG9mIHRoZSByZWN0YW5nbGUuCi0qIEBwYXJhbVtpbl0gYm90dG9tIC0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIGJvdHRvbSBvZiB0aGUgcmVjdGFuZ2xlLgotKiBAcGFyYW1baW5dIHJpZ2h0ICAtIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgotKiBAcGFyYW1baW5dIHRvcCAgICAtIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSB0b3Agb2YgdGhlIHJlY3RhbmdsZS4KKyogQHBhcmFtW2luXSBsZWZ0ICAgLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgbGVmdCBvZiB0aGUKKyogcmVjdGFuZ2xlLgorKiBAcGFyYW1baW5dIGJvdHRvbSAtIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSBib3R0b20gb2YgdGhlCisqIHJlY3RhbmdsZS4KKyogQHBhcmFtW2luXSByaWdodCAgLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmlnaHQgb2YgdGhlCisqIHJlY3RhbmdsZS4KKyogQHBhcmFtW2luXSB0b3AgICAgLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgdG9wIG9mIHRoZQorKiByZWN0YW5nbGUuCiAqIEByZXR2YWwgVHJ1ZSBpZiBzdWNjZXNzLGVsc2UgZmFpbC4KLSogQG5vdGUgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdG8gZ2V0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IHdoaWNoIGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKyogQG5vdGUgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdG8gZ2V0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IHdoaWNoCisqIGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KICovCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfR2V0Q3JvcEJveChGUERGX1BBR0UgcGFnZSwgZmxvYXQqIGxlZnQsIGZsb2F0KiBib3R0b20sIGZsb2F0KiByaWdodCwgZmxvYXQqIHRvcCk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfR2V0Q3JvcEJveChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0b3ApOwogCiAvKioKLSogVHJhbnNmb3JtIHRoZSB3aG9sZSBwYWdlIHdpdGggYSBzcGVjaWZpZWQgbWF0cml4LCB0aGVuIGNsaXAgdGhlIHBhZ2UgY29udGVudCByZWdpb24uCisqIFRyYW5zZm9ybSB0aGUgd2hvbGUgcGFnZSB3aXRoIGEgc3BlY2lmaWVkIG1hdHJpeCwgdGhlbiBjbGlwIHRoZSBwYWdlIGNvbnRlbnQKKyogcmVnaW9uLgogKgogKiBAcGFyYW1baW5dIHBhZ2UgICAgICAgIC0gQSBwYWdlIGhhbmRsZS4KICogQHBhcmFtW2luXSBtYXRyaXggICAgICAtIFRoZSB0cmFuc2Zvcm0gbWF0cml4LgogKiBAcGFyYW1baW5dIGNsaXBSZWN0ICAgIC0gQSByZWN0YW5nbGUgcGFnZSBhcmVhIHRvIGJlIGNsaXBwZWQuCi0qIEBOb3RlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdHJhbnNmb3JtIHRoZSB3aG9sZSBwYWdlLCBhbmQgd291bGQgdGFrZSBlZmZlY3QgdG8gYWxsIHRoZSBvYmplY3RzIGluIHRoZSBwYWdlLgotKiAgICAgICAgVGhlIG1ldGhvZCBjYW4gbm90IHN1cHBvcnQgdG8gZ2V0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50IHdoaWNoIGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKyogQE5vdGUuIFRoaXMgZnVuY3Rpb24gd2lsbCB0cmFuc2Zvcm0gdGhlIHdob2xlIHBhZ2UsIGFuZCB3b3VsZCB0YWtlIGVmZmVjdCB0bworKiBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIHBhZ2UuCisqICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byBnZXQgdGhpcyBmZWF0dXJlIGZvciB0aGUgZG9jdW1lbnQgd2hpY2gKKyogY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgogKi8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9UcmFuc0Zvcm1XaXRoQ2xpcChGUERGX1BBR0UgcGFnZSwgRlNfTUFUUklYKiBtYXRyaXgsIEZTX1JFQ1RGKiBjbGlwUmVjdCk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfVHJhbnNGb3JtV2l0aENsaXAoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfTUFUUklYKiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfUkVDVEYqIGNsaXBSZWN0KTsKIAogLyoqCiAqIFRyYW5zZm9ybSAoc2NhbGUsIHJvdGF0ZSwgc2hlYXIsIG1vdmUpIHRoZSBjbGlwIHBhdGggb2YgcGFnZSBvYmplY3QuCi0qIEBwYXJhbVtpbl0gcGFnZV9vYmplY3QgLSBIYW5kbGUgdG8gYSBwYWdlIG9iamVjdC4gUmV0dXJuZWQgYnkgRlBERlBhZ2VPYmpfTmV3SW1hZ2VPYmouCisqIEBwYXJhbVtpbl0gcGFnZV9vYmplY3QgLSBIYW5kbGUgdG8gYSBwYWdlIG9iamVjdC4gUmV0dXJuZWQgYnkKKyogRlBERlBhZ2VPYmpfTmV3SW1hZ2VPYmouCiAqIEBwYXJhbVtpbl0gYSAgLSBUaGUgY29lZmZpY2llbnQgImEiIG9mIHRoZSBtYXRyaXguCiAqIEBwYXJhbVtpbl0gYiAgLSBUaGUgY29lZmZpY2llbnQgImIiIG9mIHRoZSBtYXRyaXguCiAqIEBwYXJhbVtpbl0gYyAgLSBUaGUgY29lZmZpY2llbnQgImMiIG9mIHRoZSBtYXRyaXguCkBAIC04NSw3ICsxMTgsMTQgQEAKICogQHBhcmFtW2luXSBmICAtIFRoZSBjb2VmZmljaWVudCAiZiIgb2YgdGhlIG1hdHJpeC4KICogQHJldHZhbCBOb25lLgogKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VPYmpfVHJhbnNmb3JtQ2xpcFBhdGgoRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqZWN0LGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIGMsIGRvdWJsZSBkLCBkb3VibGUgZSwgZG91YmxlIGYpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTAorRlBERlBhZ2VPYmpfVHJhbnNmb3JtQ2xpcFBhdGgoRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmKTsKIAogLyoqCiAqIENyZWF0ZSBhIG5ldyBjbGlwIHBhdGgsIHdpdGggYSByZWN0YW5nbGUgaW5zZXJ0ZWQuCkBAIC05Niw3ICsxMzYsMTAgQEAKICogQHBhcmFtW2luXSB0b3AgICAgLSBUaGUgdG9wIG9mIHRoZSBjbGlwIGJveC4KICogQHJldHZhbCBhIGhhbmRsZSB0byB0aGUgY2xpcCBwYXRoLgogKi8KLURMTEVYUE9SVCBGUERGX0NMSVBQQVRIIFNURENBTEwgRlBERl9DcmVhdGVDbGlwUGF0aChmbG9hdCBsZWZ0LCBmbG9hdCBib3R0b20sIGZsb2F0IHJpZ2h0LCBmbG9hdCB0b3ApOworRExMRVhQT1JUIEZQREZfQ0xJUFBBVEggU1REQ0FMTCBGUERGX0NyZWF0ZUNsaXBQYXRoKGZsb2F0IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRvcCk7CiAKIC8qKgogKiBEZXN0cm95IHRoZSBjbGlwIHBhdGguCkBAIC0xMDgsMTQgKzE1MSwxOCBAQAogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0Rlc3Ryb3lDbGlwUGF0aChGUERGX0NMSVBQQVRIIGNsaXBQYXRoKTsKIAogLyoqCi0qIENsaXAgdGhlIHBhZ2UgY29udGVudCwgdGhlIHBhZ2UgY29udGVudCB0aGF0IG91dHNpZGUgdGhlIGNsaXBwaW5nIHJlZ2lvbiBiZWNvbWUgaW52aXNpYmxlLgorKiBDbGlwIHRoZSBwYWdlIGNvbnRlbnQsIHRoZSBwYWdlIGNvbnRlbnQgdGhhdCBvdXRzaWRlIHRoZSBjbGlwcGluZyByZWdpb24KKyogYmVjb21lIGludmlzaWJsZS4KICoKICogQHBhcmFtW2luXSBwYWdlICAgICAgICAtIEEgcGFnZSBoYW5kbGUuCiAqIEBwYXJhbVtpbl0gY2xpcFBhdGggICAgLSBBIGhhbmRsZSB0byB0aGUgY2xpcCBwYXRoLgotKiBATm90ZS4gQSBjbGlwIHBhdGggd2lsbCBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIHBhZ2UgY29udGVudCBzdHJlYW0gb3IgY29udGVudCBhcnJheS4gSW4gdGhpcyB3YXksIHRoZSBwYWdlIGNvbnRlbnQgd2lsbCBiZSBjbGlwcGVkCi0qIGJ5IHRoaXMgY2xpcCBwYXRoLiBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisqIEBOb3RlLiBBIGNsaXAgcGF0aCB3aWxsIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgcGFnZSBjb250ZW50IHN0cmVhbSBvciBjb250ZW50CisqIGFycmF5LiBJbiB0aGlzIHdheSwgdGhlIHBhZ2UgY29udGVudCB3aWxsIGJlIGNsaXBwZWQKKyogYnkgdGhpcyBjbGlwIHBhdGguIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBmb3IgdGhlIGRvY3VtZW50CisqIGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KICovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX0luc2VydENsaXBQYXRoKEZQREZfUEFHRSBwYWdlLEZQREZfQ0xJUFBBVEggY2xpcFBhdGgpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9JbnNlcnRDbGlwUGF0aChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9DTElQUEFUSCBjbGlwUGF0aCk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZ2aWV3LmggYi9wdWJsaWMvZnBkZnZpZXcuaAppbmRleCBlNTYwNzFhLi4xNThmODIxIDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZnZpZXcuaAorKysgYi9wdWJsaWMvZnBkZnZpZXcuaApAQCAtMjUsNyArMjUsNyBAQAogdHlwZWRlZiB2b2lkKiBGUERGX1BBR0U7CiB0eXBlZGVmIHZvaWQqIEZQREZfV0lER0VUOwogdHlwZWRlZiB2b2lkKiBGUERGX1NUUklOR0hBTkRMRTsKLXR5cGVkZWYgdm9pZCogRlBERl9QQUdFT0JKRUNUOyAgICAvLyBQYWdlIG9iamVjdCh0ZXh0LCBwYXRoLCBldGMpCit0eXBlZGVmIHZvaWQqIEZQREZfUEFHRU9CSkVDVDsgIC8vIFBhZ2Ugb2JqZWN0KHRleHQsIHBhdGgsIGV0YykKIHR5cGVkZWYgdm9pZCogRlBERl9QQVRIOwogdHlwZWRlZiB2b2lkKiBGUERGX0NMSVBQQVRIOwogdHlwZWRlZiB2b2lkKiBGUERGX0JJVE1BUDsKQEAgLTUyLDEwICs1MiwxMCBAQAogCiAvLyBEdXBsZXggdHlwZXMKIHR5cGVkZWYgZW51bSBfRlBERl9EVVBMRVhUWVBFXyB7Ci0gICAgRHVwbGV4VW5kZWZpbmVkID0gMCwKLSAgICBTaW1wbGV4LAotICAgIER1cGxleEZsaXBTaG9ydEVkZ2UsCi0gICAgRHVwbGV4RmxpcExvbmdFZGdlCisgIER1cGxleFVuZGVmaW5lZCA9IDAsCisgIFNpbXBsZXgsCisgIER1cGxleEZsaXBTaG9ydEVkZ2UsCisgIER1cGxleEZsaXBMb25nRWRnZQogfSBGUERGX0RVUExFWFRZUEU7CiAKIC8vIFN0cmluZyB0eXBlcwpAQCAtNjMsMTEgKzYzLDEzIEBACiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgY29uc3QqIEZQREZfTFBDQllURTsKIHR5cGVkZWYgY2hhciBjb25zdCogRlBERl9MUENTVFI7CiAKLS8vIEZQREZTREsgbWF5IHVzZSB0aHJlZSB0eXBlcyBvZiBzdHJpbmdzOiBieXRlIHN0cmluZywgd2lkZSBzdHJpbmcgKFVURi0xNkxFIGVuY29kZWQpLCBhbmQgcGxhdGZvcm0gZGVwZW5kZW50IHN0cmluZworLy8gRlBERlNESyBtYXkgdXNlIHRocmVlIHR5cGVzIG9mIHN0cmluZ3M6IGJ5dGUgc3RyaW5nLCB3aWRlIHN0cmluZyAoVVRGLTE2TEUKKy8vIGVuY29kZWQpLCBhbmQgcGxhdGZvcm0gZGVwZW5kZW50IHN0cmluZwogdHlwZWRlZiBjb25zdCBjaGFyKiBGUERGX0JZVEVTVFJJTkc7CiAKLXR5cGVkZWYgY29uc3QgdW5zaWduZWQgc2hvcnQqIEZQREZfV0lERVNUUklORzsgICAgICAgIC8vIEZveGl0IFBERiBTREsgYWx3YXlzIHVzZSBVVEYtMTZMRSBlbmNvZGluZyB3aWRlIHN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVhY2ggY2hhcmFjdGVyIHVzZSAyIGJ5dGVzIChleGNlcHQgc3Vycm9nYXRpb24pLCB3aXRoIGxvdyBieXRlIGZpcnN0LgordHlwZWRlZiBjb25zdCB1bnNpZ25lZCBzaG9ydCoKKyAgICBGUERGX1dJREVTVFJJTkc7ICAvLyBGb3hpdCBQREYgU0RLIGFsd2F5cyB1c2UgVVRGLTE2TEUgZW5jb2Rpbmcgd2lkZSBzdHJpbmcsCisvLyBlYWNoIGNoYXJhY3RlciB1c2UgMiBieXRlcyAoZXhjZXB0IHN1cnJvZ2F0aW9uKSwgd2l0aCBsb3cgYnl0ZSBmaXJzdC4KIAogI2lmbmRlZiBfRlBERl9ERUZfU1RSXwogI2RlZmluZSBfRlBERl9ERUZfU1RSXwpAQCAtNzUsMjQgKzc3LDI3IEBACiAgICoKICAgKiBAbm90ZSBJbiBTREssIGEgYnl0ZSBzdHJpbmcgY29tbW9ubHkgbWVhbnMgYSBVVEYtMTZMRSBmb3JtYXQgc3RyaW5nLgogICAqLwotdHlwZWRlZiBzdHJ1Y3QgX0ZQREZfQlNUUgotewotICAgIC8qKgotICAgICAqIEBicmllZiBTdHJpbmcgYnVmZmVyLgotICAgICAqLwotICAgIGNoYXIqICAgc3RyOwotICAgIC8qKgotICAgICAqIEBicmllZiAgIExlbmd0aCBvZiBhIHN0cmluZywgaW4gYnl0ZXMuCi0gICAgICovCi0gICAgaW50IGxlbjsKK3R5cGVkZWYgc3RydWN0IF9GUERGX0JTVFIgeworICAvKioKKyAgICogQGJyaWVmIFN0cmluZyBidWZmZXIuCisgICAqLworICBjaGFyKiBzdHI7CisgIC8qKgorICAgKiBAYnJpZWYgICBMZW5ndGggb2YgYSBzdHJpbmcsIGluIGJ5dGVzLgorICAgKi8KKyAgaW50IGxlbjsKIH0gRlBERl9CU1RSOwogCiAjZW5kaWYKIAotLy8gRm9yIFdpbmRvd3MgcHJvZ3JhbW1lcnM6IGZvciBtb3N0IGNhc2UgaXQncyBPSyB0byB0cmVhdCBGUERGX1dJREVTVFJJTkcgYXMgV2luZG93cyB1bmljb2RlIHN0cmluZywKLS8vICAgICAgIGhvd2V2ZXIsIHNwZWNpYWwgY2FyZSBuZWVkcyB0byBiZSB0YWtlbiBpZiB5b3UgZXhwZWN0IHRvIHByb2Nlc3MgVW5pY29kZSBsYXJnZXIgdGhhbiAweGZmZmYuCi0vLyBGb3IgTGludXgvVW5peCBwcm9ncmFtbWVyczogbW9zdCBjb21waWxlci9saWJyYXJ5IGVudmlyb25tZW50IHVzZXMgNCBieXRlcyBmb3IgYSBVbmljb2RlIGNoYXJhY3RlciwKLS8vICAgICAgeW91IGhhdmUgdG8gY29udmVydCBiZXR3ZWVuIEZQREZfV0lERVNUUklORyBhbmQgc3lzdGVtIHdpZGUgc3RyaW5nIGJ5IHlvdXJzZWxmLgorLy8gRm9yIFdpbmRvd3MgcHJvZ3JhbW1lcnM6IGZvciBtb3N0IGNhc2UgaXQncyBPSyB0byB0cmVhdCBGUERGX1dJREVTVFJJTkcgYXMKKy8vIFdpbmRvd3MgdW5pY29kZSBzdHJpbmcsCisvLyAgICAgICBob3dldmVyLCBzcGVjaWFsIGNhcmUgbmVlZHMgdG8gYmUgdGFrZW4gaWYgeW91IGV4cGVjdCB0byBwcm9jZXNzCisvLyAgICAgICBVbmljb2RlIGxhcmdlciB0aGFuIDB4ZmZmZi4KKy8vIEZvciBMaW51eC9Vbml4IHByb2dyYW1tZXJzOiBtb3N0IGNvbXBpbGVyL2xpYnJhcnkgZW52aXJvbm1lbnQgdXNlcyA0IGJ5dGVzCisvLyBmb3IgYSBVbmljb2RlIGNoYXJhY3RlciwKKy8vICAgICAgeW91IGhhdmUgdG8gY29udmVydCBiZXR3ZWVuIEZQREZfV0lERVNUUklORyBhbmQgc3lzdGVtIHdpZGUgc3RyaW5nIGJ5CisvLyAgICAgIHlvdXJzZWxmLgogCiAjaWZkZWYgX1dJTjMyX1dDRQogdHlwZWRlZiBjb25zdCB1bnNpZ25lZCBzaG9ydCogRlBERl9TVFJJTkc7CkBAIC0xMDEsMzYgKzEwNiwzNCBAQAogI2VuZGlmCiAKIC8qKiBAYnJpZWYgTWF0cml4IGZvciB0cmFuc2Zvcm1hdGlvbi4gKi8KLXR5cGVkZWYgc3RydWN0IF9GU19NQVRSSVhfCi17Ci0gICAgZmxvYXQgICBhOyAgLyoqPCBAYnJpZWYgQ29lZmZpY2llbnQgYS4qLwotICAgIGZsb2F0ICAgYjsgIC8qKjwgQGJyaWVmIENvZWZmaWNpZW50IGIuKi8KLSAgICBmbG9hdCAgIGM7ICAvKio8IEBicmllZiBDb2VmZmljaWVudCBjLiovCi0gICAgZmxvYXQgICBkOyAgLyoqPCBAYnJpZWYgQ29lZmZpY2llbnQgZC4qLwotICAgIGZsb2F0ICAgZTsgIC8qKjwgQGJyaWVmIENvZWZmaWNpZW50IGUuKi8KLSAgICBmbG9hdCAgIGY7ICAvKio8IEBicmllZiBDb2VmZmljaWVudCBmLiovCit0eXBlZGVmIHN0cnVjdCBfRlNfTUFUUklYXyB7CisgIGZsb2F0IGE7IC8qKjwgQGJyaWVmIENvZWZmaWNpZW50IGEuKi8KKyAgZmxvYXQgYjsgLyoqPCBAYnJpZWYgQ29lZmZpY2llbnQgYi4qLworICBmbG9hdCBjOyAvKio8IEBicmllZiBDb2VmZmljaWVudCBjLiovCisgIGZsb2F0IGQ7IC8qKjwgQGJyaWVmIENvZWZmaWNpZW50IGQuKi8KKyAgZmxvYXQgZTsgLyoqPCBAYnJpZWYgQ29lZmZpY2llbnQgZS4qLworICBmbG9hdCBmOyAvKio8IEBicmllZiBDb2VmZmljaWVudCBmLiovCiB9IEZTX01BVFJJWDsKIAogLyoqIEBicmllZiBSZWN0YW5nbGUgYXJlYShmbG9hdCkgaW4gZGV2aWNlIG9yIHBhZ2UgY29vcmRpbmF0aW9uIHN5c3RlbS4gKi8KLXR5cGVkZWYgc3RydWN0IF9GU19SRUNURl8KLXsKLSAgICAvKipAeyovCi0gICAgLyoqIEBicmllZiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBsZWZ0LXRvcCBjb3JuZXIuICovCi0gICAgZmxvYXQgICBsZWZ0OwotICAgIC8qKiBAYnJpZWYgVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgbGVmdC10b3AgY29ybmVyLiAqLwotICAgIGZsb2F0ICAgdG9wOwotICAgIC8qKiBAYnJpZWYgVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgcmlnaHQtYm90dG9tIGNvcm5lci4gKi8KLSAgICBmbG9hdCAgIHJpZ2h0OwotICAgIC8qKiBAYnJpZWYgVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgcmlnaHQtYm90dG9tIGNvcm5lci4gKi8KLSAgICBmbG9hdCAgIGJvdHRvbTsKLSAgICAvKipAfSovCi19KiBGU19MUFJFQ1RGLCBGU19SRUNURjsKK3R5cGVkZWYgc3RydWN0IF9GU19SRUNURl8geworICAvKipAeyovCisgIC8qKiBAYnJpZWYgVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgbGVmdC10b3AgY29ybmVyLiAqLworICBmbG9hdCBsZWZ0OworICAvKiogQGJyaWVmIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGxlZnQtdG9wIGNvcm5lci4gKi8KKyAgZmxvYXQgdG9wOworICAvKiogQGJyaWVmIFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHJpZ2h0LWJvdHRvbSBjb3JuZXIuICovCisgIGZsb2F0IHJpZ2h0OworICAvKiogQGJyaWVmIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHJpZ2h0LWJvdHRvbSBjb3JuZXIuICovCisgIGZsb2F0IGJvdHRvbTsKKyAgLyoqQH0qLworfSAqIEZTX0xQUkVDVEYsIEZTX1JFQ1RGOwogLyoqIEBicmllZiBDb25zdCBQb2ludGVyIHRvIDo6RlNfUkVDVEYgc3RydWN0dXJlLiovCiB0eXBlZGVmIGNvbnN0IEZTX1JFQ1RGKiBGU19MUENSRUNURjsKIAogI2lmIGRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKEZQREZTREtfRVhQT1JUUykKIC8vIE9uIFdpbmRvd3Mgc3lzdGVtLCBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGluIGEgRExMCi0jZGVmaW5lIERMTEVYUE9SVCBfX2RlY2xzcGVjKCBkbGxleHBvcnQgKQorI2RlZmluZSBETExFWFBPUlQgX19kZWNsc3BlYyhkbGxleHBvcnQpCiAjZGVmaW5lIFNURENBTEwgX19zdGRjYWxsCiAjZWxzZQogI2RlZmluZSBETExFWFBPUlQKQEAgLTE0OSw3ICsxNTIsOCBAQAogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KIC8vIENvbW1lbnRzOgotLy8gICAgICAgICAgWW91IGhhdmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGJlZm9yZSB5b3UgY2FuIGNhbGwgYW55IFBERiBwcm9jZXNzaW5nIGZ1bmN0aW9ucy4KKy8vICAgICAgICAgIFlvdSBoYXZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgeW91IGNhbiBjYWxsIGFueSBQREYKKy8vICAgICAgICAgIHByb2Nlc3NpbmcgZnVuY3Rpb25zLgogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0luaXRMaWJyYXJ5KCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0Rlc3Ryb3lMaWJhcnkKQEAgLTE1OSwyMSArMTYzLDI1IEBACiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBZb3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0byByZWxlYXNlIGFsbCBtZW1vcnkgYmxvY2tzIGFsbG9jYXRlZCBieSB0aGUgbGlicmFyeS4KLS8vICAgICAgICAgIEFmdGVyIHRoaXMgZnVuY3Rpb24gY2FsbGVkLCB5b3Ugc2hvdWxkIG5vdCBjYWxsIGFueSBQREYgcHJvY2Vzc2luZyBmdW5jdGlvbnMuCisvLyAgICAgICAgICBZb3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0byByZWxlYXNlIGFsbCBtZW1vcnkgYmxvY2tzIGFsbG9jYXRlZCBieQorLy8gICAgICAgICAgdGhlIGxpYnJhcnkuCisvLyAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uIGNhbGxlZCwgeW91IHNob3VsZCBub3QgY2FsbCBhbnkgUERGIHByb2Nlc3NpbmcKKy8vICAgICAgICAgIGZ1bmN0aW9ucy4KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9EZXN0cm95TGlicmFyeSgpOwogCi0vL1BvbGljeSBmb3IgYWNjZXNzaW5nIHRoZSBsb2NhbCBtYWNoaW5lIHRpbWUuCi0jZGVmaW5lIEZQREZfUE9MSUNZX01BQ0hJTkVUSU1FX0FDQ0VTUyAgMAorLy8gUG9saWN5IGZvciBhY2Nlc3NpbmcgdGhlIGxvY2FsIG1hY2hpbmUgdGltZS4KKyNkZWZpbmUgRlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTIDAKIAogLy8gRnVuY3Rpb246IEZQREZfU2V0U2FuZEJveFBvbGljeQogLy8gICAgICAgICAgU2V0IHRoZSBwb2xpY3kgZm9yIHRoZSBzYW5kYm94IGVudmlyb25tZW50LgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBvbGljeSAgICAgIC0gICBUaGUgc3BlY2lmaWVkIHBvbGljeSBmb3Igc2V0dGluZywgZm9yIGV4YW1wbGU6RlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTLgorLy8gICAgICAgICAgcG9saWN5ICAgICAgLSAgIFRoZSBzcGVjaWZpZWQgcG9saWN5IGZvciBzZXR0aW5nLCBmb3IKKy8vICAgICAgICAgIGV4YW1wbGU6RlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTLgogLy8gICAgICAgICAgZW5hYmxlICAgICAgLSAgIFRydWUgZm9yIGVuYWJsZSwgRmFsc2UgZm9yIGRpc2FibGUgdGhlIHBvbGljeS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCi1ETExFWFBPUlQgdm9pZCAgU1REQ0FMTCBGUERGX1NldFNhbmRCb3hQb2xpY3koRlBERl9EV09SRCBwb2xpY3ksIEZQREZfQk9PTCBlbmFibGUpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1NldFNhbmRCb3hQb2xpY3koRlBERl9EV09SRCBwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgZW5hYmxlKTsKIAogLy8gRnVuY3Rpb246IEZQREZfTG9hZERvY3VtZW50CiAvLyAgICAgICAgICBPcGVuIGFuZCBsb2FkIGEgUERGIGRvY3VtZW50LgpAQCAtMTg3LDEwICsxOTUsMTEgQEAKIC8vICAgICAgICAgIExvYWRlZCBkb2N1bWVudCBjYW4gYmUgY2xvc2VkIGJ5IEZQREZfQ2xvc2VEb2N1bWVudCgpLgogLy8gICAgICAgICAgSWYgdGhpcyBmdW5jdGlvbiBmYWlscywgeW91IGNhbiB1c2UgRlBERl9HZXRMYXN0RXJyb3IoKSB0byByZXRyaWV2ZQogLy8gICAgICAgICAgdGhlIHJlYXNvbiB3aHkgaXQgZmFpbGVkLgotLy8gICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIDo6RlBERl9Mb2FkWEZBIGZ1bmN0aW9uIGFmdGVyIFBERiBkb2N1bWVudCBsb2FkZWQKKy8vICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgY2FsbCA6OkZQREZfTG9hZFhGQSBmdW5jdGlvbiBhZnRlciBQREYKKy8vICAgICAgICAgIGRvY3VtZW50IGxvYWRlZAogLy8gICAgICAgICAgdG8gc3VwcG9ydCBYRkEgZmllbGRzIGluIGZwZGZmb3JtZmlsbC5oIGZpbGUuCiBETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMIEZQREZfTG9hZERvY3VtZW50KEZQREZfU1RSSU5HIGZpbGVfcGF0aCwKLSAgICBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpOwogCiAvLyBGdW5jdGlvbjogRlBERl9Mb2FkTWVtRG9jdW1lbnQKIC8vICAgICAgICAgIE9wZW4gYW5kIGxvYWQgYSBQREYgZG9jdW1lbnQgZnJvbSBtZW1vcnkuCkBAIC0yMDcsMjcgKzIxNiwzMyBAQAogLy8gICAgICAgICAgSWYgdGhpcyBmdW5jdGlvbiBmYWlscywgeW91IGNhbiB1c2UgRlBERl9HZXRMYXN0RXJyb3IoKSB0byByZXRyaWV2ZQogLy8gICAgICAgICAgdGhlIHJlYXNvbiB3aHkgaXQgZmFpbHMuCiAvLyBOb3RlczoKLS8vICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgY2FsbCA6OkZQREZfTG9hZFhGQSBmdW5jdGlvbiBhZnRlciBQREYgZG9jdW1lbnQgbG9hZGVkCisvLyAgICAgICAgICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGNhbGwgOjpGUERGX0xvYWRYRkEgZnVuY3Rpb24gYWZ0ZXIgUERGCisvLyAgICAgICAgICBkb2N1bWVudCBsb2FkZWQKIC8vICAgICAgICAgIHRvIHN1cHBvcnQgWEZBIGZpZWxkcyBpbiBmcGRmZm9ybWZpbGwuaCBmaWxlLgogLy8KIERMTEVYUE9SVCBGUERGX0RPQ1VNRU5UIFNURENBTEwgRlBERl9Mb2FkTWVtRG9jdW1lbnQoY29uc3Qgdm9pZCogZGF0YV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIHBhc3N3b3JkKTsKIAogLy8gU3RydWN0dXJlIGZvciBjdXN0b20gZmlsZSBhY2Nlc3MuCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgLy8gRmlsZSBsZW5ndGgsIGluIGJ5dGVzLgotICAgIHVuc2lnbmVkIGxvbmcgICBtX0ZpbGVMZW47CisgIC8vIEZpbGUgbGVuZ3RoLCBpbiBieXRlcy4KKyAgdW5zaWduZWQgbG9uZyBtX0ZpbGVMZW47CiAKLSAgICAvLyBBIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIGdldHRpbmcgYSBibG9jayBvZiBkYXRhIGZyb20gc3BlY2lmaWMgcG9zaXRpb24uCi0gICAgLy8gUG9zaXRpb24gaXMgc3BlY2lmaWVkIGJ5IGJ5dGUgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgotICAgIC8vIFRoZSBwb3NpdGlvbiBhbmQgc2l6ZSB3aWxsIG5ldmVyIGdvIG91dCByYW5nZSBvZiBmaWxlIGxlbmd0aC4KLSAgICAvLyBJdCBtYXkgYmUgcG9zc2libGUgZm9yIEZQREZTREsgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlIHRpbWVzIGZvciBzYW1lIHBvc2l0aW9uLgotICAgIC8vIFJldHVybiB2YWx1ZTogc2hvdWxkIGJlIG5vbi16ZXJvIGlmIHN1Y2Nlc3NmdWwsIHplcm8gZm9yIGVycm9yLgotICAgIGludCAgICAgICAgICAgICAoKm1fR2V0QmxvY2spKHZvaWQqIHBhcmFtLCB1bnNpZ25lZCBsb25nIHBvc2l0aW9uLCB1bnNpZ25lZCBjaGFyKiBwQnVmLCB1bnNpZ25lZCBsb25nIHNpemUpOworICAvLyBBIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIGdldHRpbmcgYSBibG9jayBvZiBkYXRhIGZyb20gc3BlY2lmaWMgcG9zaXRpb24uCisgIC8vIFBvc2l0aW9uIGlzIHNwZWNpZmllZCBieSBieXRlIG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKyAgLy8gVGhlIHBvc2l0aW9uIGFuZCBzaXplIHdpbGwgbmV2ZXIgZ28gb3V0IHJhbmdlIG9mIGZpbGUgbGVuZ3RoLgorICAvLyBJdCBtYXkgYmUgcG9zc2libGUgZm9yIEZQREZTREsgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlIHRpbWVzIGZvcgorICAvLyBzYW1lIHBvc2l0aW9uLgorICAvLyBSZXR1cm4gdmFsdWU6IHNob3VsZCBiZSBub24temVybyBpZiBzdWNjZXNzZnVsLCB6ZXJvIGZvciBlcnJvci4KKyAgaW50ICgqbV9HZXRCbG9jaykodm9pZCogcGFyYW0sCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiAKLSAgICAvLyBBIGN1c3RvbSBwb2ludGVyIGZvciBhbGwgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgZGF0YS4KLSAgICAvLyBUaGlzIHBvaW50ZXIgd2lsbCBiZSB1c2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gbV9HZXRCbG9jayBjYWxsYmFjay4KLSAgICB2b2lkKiAgICAgICAgICAgbV9QYXJhbTsKKyAgLy8gQSBjdXN0b20gcG9pbnRlciBmb3IgYWxsIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGRhdGEuCisgIC8vIFRoaXMgcG9pbnRlciB3aWxsIGJlIHVzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byBtX0dldEJsb2NrIGNhbGxiYWNrLgorICB2b2lkKiBtX1BhcmFtOwogfSBGUERGX0ZJTEVBQ0NFU1M7CiAKIC8qKgpAQCAtMjM1LDcwICsyNTAsNzcgQEAKICAqCiAgKiBAbm90ZSBUaGlzIGlzIGEgaGFuZGxlciBhbmQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGNhbGxlcnMuCiAgKi8KLXR5cGVkZWYgc3RydWN0IF9GUERGX0ZJTEVIQU5ETEVSCi17Ci0gICAgLyoqCi0gICAgICogQGJyaWVmIFVzZXItZGVmaW5lZCBkYXRhLgotICAgICAqIEBub3RlIENhbGxlcnMgY2FuIHVzZSB0aGlzIGZpZWxkIHRvIHRyYWNrIGNvbnRyb2xzLgotICAgICAqLwotICAgIEZQREZfTFBWT0lEIGNsaWVudERhdGE7Ci0gICAgLyoqCi0gICAgICogQGJyaWVmIENhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlbGVhc2UgdGhlIGN1cnJlbnQgZmlsZSBzdHJlYW0gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBjbGllbnREYXRhICAgIFBvaW50ZXIgdG8gdXNlci1kZWZpbmVkIGRhdGEuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE5vbmUuCi0gICAgICovCi0gICAgdm9pZCAgICAgICAgKCpSZWxlYXNlKShGUERGX0xQVk9JRCBjbGllbnREYXRhKTsKLSAgICAvKioKLSAgICAgKiBAYnJpZWYgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgZmlsZSBzdHJlYW0gc2l6ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gY2xpZW50RGF0YSAgICBQb2ludGVyIHRvIHVzZXItZGVmaW5lZCBkYXRhLgotICAgICAqCi0gICAgICogQHJldHVybiBTaXplIG9mIGZpbGUgc3RyZWFtLgotICAgICAqLwotICAgIEZQREZfRFdPUkQgICgqR2V0U2l6ZSkoRlBERl9MUFZPSUQgY2xpZW50RGF0YSk7Ci0gICAgLyoqCi0gICAgICogQGJyaWVmIENhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBjdXJyZW50IGZpbGUgc3RyZWFtLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSAgIGNsaWVudERhdGEgIFBvaW50ZXIgdG8gdXNlci1kZWZpbmVkIGRhdGEuCi0gICAgICogQHBhcmFtW2luXSAgIG9mZnNldCAgICAgIE9mZnNldCBwb3NpdGlvbiBzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGZpbGUgc3RyZWFtLiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgcmVhZGluZyBwb3NpdGlvbi4KLSAgICAgKiBAcGFyYW1baW5dICAgYnVmZmVyICAgICAgTWVtb3J5IGJ1ZmZlciB0byBzdG9yZSBkYXRhIHdoaWNoIGFyZSByZWFkIGZyb20gZmlsZSBzdHJlYW0uIFRoaXMgcGFyYW1ldGVyIHNob3VsZCBub3QgYmUgPGI+TlVMTDwvYj4uCi0gICAgICogQHBhcmFtW2luXSAgIHNpemUgICAgICAgIFNpemUgb2YgZGF0YSB3aGljaCBzaG91bGQgYmUgcmVhZCBmcm9tIGZpbGUgc3RyZWFtLCBpbiBieXRlcy4gVGhlIGJ1ZmZlciBpbmRpY2F0ZWQgYnkgdGhlIHBhcmFtZXRlciA8aT5idWZmZXI8L2k+IHNob3VsZCBiZSBlbm91Z2ggdG8gc3RvcmUgc3BlY2lmaWVkIGRhdGEuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIG90aGVyIHZhbHVlIGZvciBmYWlsdXJlLgotICAgICAqLwotICAgIEZQREZfUkVTVUxUICgqUmVhZEJsb2NrKShGUERGX0xQVk9JRCBjbGllbnREYXRhLCBGUERGX0RXT1JEIG9mZnNldCwgRlBERl9MUFZPSUQgYnVmZmVyLCBGUERGX0RXT1JEIHNpemUpOwotICAgIC8qKgotICAgICAqIEBicmllZiAgIENhbGxiYWNrIGZ1bmN0aW9uIHRvIHdyaXRlIGRhdGEgaW50byB0aGUgY3VycmVudCBmaWxlIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gICBjbGllbnREYXRhICBQb2ludGVyIHRvIHVzZXItZGVmaW5lZCBkYXRhLgotICAgICAqIEBwYXJhbVtpbl0gICBvZmZzZXQgICAgICBPZmZzZXQgcG9zaXRpb24gc3RhcnRzIGZyb20gdGhlIGJlZ2lubmluZyBvZiBmaWxlIHN0cmVhbS4gVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdyaXRpbmcgcG9zaXRpb24uCi0gICAgICogQHBhcmFtW2luXSAgIGJ1ZmZlciAgICAgIE1lbW9yeSBidWZmZXIgY29udGFpbnMgZGF0YSB3aGljaCBpcyB3cml0dGVuIGludG8gZmlsZSBzdHJlYW0uIFRoaXMgcGFyYW1ldGVyIHNob3VsZCBub3QgYmUgPGI+TlVMTDwvYj4uCi0gICAgICogQHBhcmFtW2luXSAgIHNpemUgICAgICAgIFNpemUgb2YgZGF0YSB3aGljaCBzaG91bGQgYmUgd3JpdHRlbiBpbnRvIGZpbGUgc3RyZWFtLCBpbiBieXRlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gMCBmb3Igc3VjY2Vzcywgb3RoZXIgdmFsdWUgZm9yIGZhaWx1cmUuCi0gICAgICovCi0gICAgRlBERl9SRVNVTFQgKCpXcml0ZUJsb2NrKShGUERGX0xQVk9JRCBjbGllbnREYXRhLCBGUERGX0RXT1JEIG9mZnNldCwgRlBERl9MUENWT0lEIGJ1ZmZlciwgRlBERl9EV09SRCBzaXplKTsKLSAgICAvKioKLSAgICAgKiBAYnJpZWYgICBDYWxsYmFjayBmdW5jdGlvbiB0byBmbHVzaCBhbGwgaW50ZXJuYWwgYWNjZXNzaW5nIGJ1ZmZlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dICAgY2xpZW50RGF0YSAgUG9pbnRlciB0byB1c2VyLWRlZmluZWQgZGF0YS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gMCBmb3Igc3VjY2Vzcywgb3RoZXIgdmFsdWUgZm9yIGZhaWx1cmUuCi0gICAgICovCi0gICAgRlBERl9SRVNVTFQgKCpGbHVzaCkoRlBERl9MUFZPSUQgY2xpZW50RGF0YSk7Ci0gICAgLyoqCi0gICAgICogQGJyaWVmICAgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2hhbmdlIGZpbGUgc2l6ZS4KLSAgICAgKgotICAgICAqIEBkZXRhaWxzIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIHdyaXRpbmcgbW9kZSB1c3VhbGx5LiBJbXBsZW1lbnRlciBjYW4gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcmVhbGl6ZSBpdCBiYXNlZCBvbiBhcHBsaWNhdGlvbiByZXF1ZXN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gICBjbGllbnREYXRhICBQb2ludGVyIHRvIHVzZXItZGVmaW5lZCBkYXRhLgotICAgICAqIEBwYXJhbVtpbl0gICBzaXplICAgICAgICBOZXcgc2l6ZSBvZiBmaWxlIHN0cmVhbSwgaW4gYnl0ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIG90aGVyIHZhbHVlIGZvciBmYWlsdXJlLgotICAgICAqLwotICAgIEZQREZfUkVTVUxUICgqVHJ1bmNhdGUpKEZQREZfTFBWT0lEIGNsaWVudERhdGEsIEZQREZfRFdPUkQgc2l6ZSk7Cit0eXBlZGVmIHN0cnVjdCBfRlBERl9GSUxFSEFORExFUiB7CisgIC8qKgorICAgKiBAYnJpZWYgVXNlci1kZWZpbmVkIGRhdGEuCisgICAqIEBub3RlIENhbGxlcnMgY2FuIHVzZSB0aGlzIGZpZWxkIHRvIHRyYWNrIGNvbnRyb2xzLgorICAgKi8KKyAgRlBERl9MUFZPSUQgY2xpZW50RGF0YTsKKyAgLyoqCisgICAqIEBicmllZiBDYWxsYmFjayBmdW5jdGlvbiB0byByZWxlYXNlIHRoZSBjdXJyZW50IGZpbGUgc3RyZWFtIG9iamVjdC4KKyAgICoKKyAgICogQHBhcmFtW2luXSBjbGllbnREYXRhICAgIFBvaW50ZXIgdG8gdXNlci1kZWZpbmVkIGRhdGEuCisgICAqCisgICAqIEByZXR1cm4gTm9uZS4KKyAgICovCisgIHZvaWQgKCpSZWxlYXNlKShGUERGX0xQVk9JRCBjbGllbnREYXRhKTsKKyAgLyoqCisgICAqIEBicmllZiBDYWxsYmFjayBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgY3VycmVudCBmaWxlIHN0cmVhbSBzaXplLgorICAgKgorICAgKiBAcGFyYW1baW5dIGNsaWVudERhdGEgICAgUG9pbnRlciB0byB1c2VyLWRlZmluZWQgZGF0YS4KKyAgICoKKyAgICogQHJldHVybiBTaXplIG9mIGZpbGUgc3RyZWFtLgorICAgKi8KKyAgRlBERl9EV09SRCAoKkdldFNpemUpKEZQREZfTFBWT0lEIGNsaWVudERhdGEpOworICAvKioKKyAgICogQGJyaWVmIENhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBjdXJyZW50IGZpbGUgc3RyZWFtLgorICAgKgorICAgKiBAcGFyYW1baW5dICAgY2xpZW50RGF0YSAgUG9pbnRlciB0byB1c2VyLWRlZmluZWQgZGF0YS4KKyAgICogQHBhcmFtW2luXSAgIG9mZnNldCAgICAgIE9mZnNldCBwb3NpdGlvbiBzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGZpbGUKKyAgICogc3RyZWFtLiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgcmVhZGluZyBwb3NpdGlvbi4KKyAgICogQHBhcmFtW2luXSAgIGJ1ZmZlciAgICAgIE1lbW9yeSBidWZmZXIgdG8gc3RvcmUgZGF0YSB3aGljaCBhcmUgcmVhZCBmcm9tCisgICAqIGZpbGUgc3RyZWFtLiBUaGlzIHBhcmFtZXRlciBzaG91bGQgbm90IGJlIDxiPk5VTEw8L2I+LgorICAgKiBAcGFyYW1baW5dICAgc2l6ZSAgICAgICAgU2l6ZSBvZiBkYXRhIHdoaWNoIHNob3VsZCBiZSByZWFkIGZyb20gZmlsZQorICAgKiBzdHJlYW0sIGluIGJ5dGVzLiBUaGUgYnVmZmVyIGluZGljYXRlZCBieSB0aGUgcGFyYW1ldGVyIDxpPmJ1ZmZlcjwvaT4KKyAgICogc2hvdWxkIGJlIGVub3VnaCB0byBzdG9yZSBzcGVjaWZpZWQgZGF0YS4KKyAgICoKKyAgICogQHJldHVybiAwIGZvciBzdWNjZXNzLCBvdGhlciB2YWx1ZSBmb3IgZmFpbHVyZS4KKyAgICovCisgIEZQREZfUkVTVUxUICgqUmVhZEJsb2NrKShGUERGX0xQVk9JRCBjbGllbnREYXRhLCBGUERGX0RXT1JEIG9mZnNldCwgRlBERl9MUFZPSUQgYnVmZmVyLCBGUERGX0RXT1JEIHNpemUpOworICAvKioKKyAgICogQGJyaWVmICAgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gd3JpdGUgZGF0YSBpbnRvIHRoZSBjdXJyZW50IGZpbGUgc3RyZWFtLgorICAgKgorICAgKiBAcGFyYW1baW5dICAgY2xpZW50RGF0YSAgUG9pbnRlciB0byB1c2VyLWRlZmluZWQgZGF0YS4KKyAgICogQHBhcmFtW2luXSAgIG9mZnNldCAgICAgIE9mZnNldCBwb3NpdGlvbiBzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGZpbGUKKyAgICogc3RyZWFtLiBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgd3JpdGluZyBwb3NpdGlvbi4KKyAgICogQHBhcmFtW2luXSAgIGJ1ZmZlciAgICAgIE1lbW9yeSBidWZmZXIgY29udGFpbnMgZGF0YSB3aGljaCBpcyB3cml0dGVuIGludG8KKyAgICogZmlsZSBzdHJlYW0uIFRoaXMgcGFyYW1ldGVyIHNob3VsZCBub3QgYmUgPGI+TlVMTDwvYj4uCisgICAqIEBwYXJhbVtpbl0gICBzaXplICAgICAgICBTaXplIG9mIGRhdGEgd2hpY2ggc2hvdWxkIGJlIHdyaXR0ZW4gaW50byBmaWxlCisgICAqIHN0cmVhbSwgaW4gYnl0ZXMuCisgICAqCisgICAqIEByZXR1cm4gMCBmb3Igc3VjY2Vzcywgb3RoZXIgdmFsdWUgZm9yIGZhaWx1cmUuCisgICAqLworICBGUERGX1JFU1VMVCAoKldyaXRlQmxvY2spKEZQREZfTFBWT0lEIGNsaWVudERhdGEsIEZQREZfRFdPUkQgb2Zmc2V0LCBGUERGX0xQQ1ZPSUQgYnVmZmVyLCBGUERGX0RXT1JEIHNpemUpOworICAvKioKKyAgICogQGJyaWVmICAgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gZmx1c2ggYWxsIGludGVybmFsIGFjY2Vzc2luZyBidWZmZXJzLgorICAgKgorICAgKiBAcGFyYW1baW5dICAgY2xpZW50RGF0YSAgUG9pbnRlciB0byB1c2VyLWRlZmluZWQgZGF0YS4KKyAgICoKKyAgICogQHJldHVybiAwIGZvciBzdWNjZXNzLCBvdGhlciB2YWx1ZSBmb3IgZmFpbHVyZS4KKyAgICovCisgIEZQREZfUkVTVUxUICgqRmx1c2gpKEZQREZfTFBWT0lEIGNsaWVudERhdGEpOworICAvKioKKyAgICogQGJyaWVmICAgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2hhbmdlIGZpbGUgc2l6ZS4KKyAgICoKKyAgICogQGRldGFpbHMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgd3JpdGluZyBtb2RlIHVzdWFsbHkuIEltcGxlbWVudGVyCisgICAqIGNhbiBkZXRlcm1pbmUgd2hldGhlciB0byByZWFsaXplIGl0IGJhc2VkIG9uIGFwcGxpY2F0aW9uIHJlcXVlc3RzLgorICAgKgorICAgKiBAcGFyYW1baW5dICAgY2xpZW50RGF0YSAgUG9pbnRlciB0byB1c2VyLWRlZmluZWQgZGF0YS4KKyAgICogQHBhcmFtW2luXSAgIHNpemUgICAgICAgIE5ldyBzaXplIG9mIGZpbGUgc3RyZWFtLCBpbiBieXRlcy4KKyAgICoKKyAgICogQHJldHVybiAwIGZvciBzdWNjZXNzLCBvdGhlciB2YWx1ZSBmb3IgZmFpbHVyZS4KKyAgICovCisgIEZQREZfUkVTVUxUICgqVHJ1bmNhdGUpKEZQREZfTFBWT0lEIGNsaWVudERhdGEsIEZQREZfRFdPUkQgc2l6ZSk7CiAKIH0gRlBERl9GSUxFSEFORExFUiwgKkZQREZfTFBGSUxFSEFORExFUjsKIApAQCAtMzEwLDM2ICszMzIsNDEgQEAKIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIEEgaGFuZGxlIHRvIHRoZSBsb2FkZWQgZG9jdW1lbnQuIElmIGZhaWxlZCwgTlVMTCBpcyByZXR1cm5lZC4KIC8vIENvbW1lbnRzOgotLy8gICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBtYWludGFpbiB0aGUgZmlsZSByZXNvdXJjZXMgYmVpbmcgdmFsaWQgdW50aWwgdGhlIFBERiBkb2N1bWVudCBjbG9zZS4KKy8vICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbWFpbnRhaW4gdGhlIGZpbGUgcmVzb3VyY2VzIGJlaW5nIHZhbGlkIHVudGlsCisvLyAgICAgICAgICB0aGUgUERGIGRvY3VtZW50IGNsb3NlLgogLy8gICAgICAgICAgTG9hZGVkIGRvY3VtZW50IGNhbiBiZSBjbG9zZWQgYnkgRlBERl9DbG9zZURvY3VtZW50LgogLy8gTm90ZXM6Ci0vLyAgICAgICAgICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGNhbGwgOjpGUERGX0xvYWRYRkEgZnVuY3Rpb24gYWZ0ZXIgUERGIGRvY3VtZW50IGxvYWRlZAorLy8gICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIDo6RlBERl9Mb2FkWEZBIGZ1bmN0aW9uIGFmdGVyIFBERgorLy8gICAgICAgICAgZG9jdW1lbnQgbG9hZGVkCiAvLyAgICAgICAgICB0byBzdXBwb3J0IFhGQSBmaWVsZHMgaW4gZnBkZmZvcm1maWxsLmggZmlsZS4KIC8vCi1ETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMIEZQREZfTG9hZEN1c3RvbURvY3VtZW50KEZQREZfRklMRUFDQ0VTUyogcEZpbGVBY2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBwYXNzd29yZCk7CitETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMCitGUERGX0xvYWRDdXN0b21Eb2N1bWVudChGUERGX0ZJTEVBQ0NFU1MqIHBGaWxlQWNjZXNzLCBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpOwogCiAvLyBGdW5jdGlvbjogRlBERl9HZXRGaWxlVmVyc2lvbgogLy8gICAgICAgICAgR2V0IHRoZSBmaWxlIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljIFBERiBkb2N1bWVudC4KIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBkb2MgICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LgotLy8gICAgICAgICAgZmlsZVZlcnNpb24gLSAgIFRoZSBQREYgZmlsZSB2ZXJzaW9uLiBGaWxlIHZlcnNpb246IDE0IGZvciAxLjQsIDE1IGZvciAxLjUsIC4uLgorLy8gICAgICAgICAgZmlsZVZlcnNpb24gLSAgIFRoZSBQREYgZmlsZSB2ZXJzaW9uLiBGaWxlIHZlcnNpb246IDE0IGZvciAxLjQsIDE1CisvLyAgICAgICAgICBmb3IgMS41LCAuLi4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRSVUUgaWYgdGhpcyBjYWxsIHN1Y2NlZWQsIElmIGZhaWxlZCwgRkFMU0UgaXMgcmV0dXJuZWQuCiAvLyBDb21tZW50czoKLS8vICAgICAgICAgIElmIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkIGJ5IGZ1bmN0aW9uIDo6RlBERl9DcmVhdGVOZXdEb2N1bWVudCwgdGhlbiB0aGlzIGZ1bmN0aW9uIHdvdWxkIGFsd2F5cyBmYWlsLgorLy8gICAgICAgICAgSWYgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQgYnkgZnVuY3Rpb24gOjpGUERGX0NyZWF0ZU5ld0RvY3VtZW50LAorLy8gICAgICAgICAgdGhlbiB0aGlzIGZ1bmN0aW9uIHdvdWxkIGFsd2F5cyBmYWlsLgogLy8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0dldEZpbGVWZXJzaW9uKEZQREZfRE9DVU1FTlQgZG9jLCBpbnQqIGZpbGVWZXJzaW9uKTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0dldEZpbGVWZXJzaW9uKEZQREZfRE9DVU1FTlQgZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBmaWxlVmVyc2lvbik7CiAKLSNkZWZpbmUgRlBERl9FUlJfU1VDQ0VTUyAgICAgICAgMCAgICAgICAvLyBObyBlcnJvci4KLSNkZWZpbmUgRlBERl9FUlJfVU5LTk9XTiAgICAgICAgMSAgICAgICAvLyBVbmtub3duIGVycm9yLgotI2RlZmluZSBGUERGX0VSUl9GSUxFICAgICAgICAgICAyICAgICAgIC8vIEZpbGUgbm90IGZvdW5kIG9yIGNvdWxkIG5vdCBiZSBvcGVuZWQuCi0jZGVmaW5lIEZQREZfRVJSX0ZPUk1BVCAgICAgICAgIDMgICAgICAgLy8gRmlsZSBub3QgaW4gUERGIGZvcm1hdCBvciBjb3JydXB0ZWQuCi0jZGVmaW5lIEZQREZfRVJSX1BBU1NXT1JEICAgICAgIDQgICAgICAgLy8gUGFzc3dvcmQgcmVxdWlyZWQgb3IgaW5jb3JyZWN0IHBhc3N3b3JkLgotI2RlZmluZSBGUERGX0VSUl9TRUNVUklUWSAgICAgICA1ICAgICAgIC8vIFVuc3VwcG9ydGVkIHNlY3VyaXR5IHNjaGVtZS4KLSNkZWZpbmUgRlBERl9FUlJfUEFHRSAgICAgICAgICAgNiAgICAgICAvLyBQYWdlIG5vdCBmb3VuZCBvciBjb250ZW50IGVycm9yLgotI2RlZmluZSBGUERGX0VSUl9YRkFMT0FEICAgICAgICA3ICAgICAgIC8vIExvYWQgWEZBIGVycm9yLgotI2RlZmluZSBGUERGX0VSUl9YRkFMQVlPVVQgICAgICA4ICAgICAgIC8vIExheW91dCBYRkEgZXJyb3IuCisjZGVmaW5lIEZQREZfRVJSX1NVQ0NFU1MgMCAgICAvLyBObyBlcnJvci4KKyNkZWZpbmUgRlBERl9FUlJfVU5LTk9XTiAxICAgIC8vIFVua25vd24gZXJyb3IuCisjZGVmaW5lIEZQREZfRVJSX0ZJTEUgMiAgICAgICAvLyBGaWxlIG5vdCBmb3VuZCBvciBjb3VsZCBub3QgYmUgb3BlbmVkLgorI2RlZmluZSBGUERGX0VSUl9GT1JNQVQgMyAgICAgLy8gRmlsZSBub3QgaW4gUERGIGZvcm1hdCBvciBjb3JydXB0ZWQuCisjZGVmaW5lIEZQREZfRVJSX1BBU1NXT1JEIDQgICAvLyBQYXNzd29yZCByZXF1aXJlZCBvciBpbmNvcnJlY3QgcGFzc3dvcmQuCisjZGVmaW5lIEZQREZfRVJSX1NFQ1VSSVRZIDUgICAvLyBVbnN1cHBvcnRlZCBzZWN1cml0eSBzY2hlbWUuCisjZGVmaW5lIEZQREZfRVJSX1BBR0UgNiAgICAgICAvLyBQYWdlIG5vdCBmb3VuZCBvciBjb250ZW50IGVycm9yLgorI2RlZmluZSBGUERGX0VSUl9YRkFMT0FEIDcgICAgLy8gTG9hZCBYRkEgZXJyb3IuCisjZGVmaW5lIEZQREZfRVJSX1hGQUxBWU9VVCA4ICAvLyBMYXlvdXQgWEZBIGVycm9yLgogCiAvLyBGdW5jdGlvbjogRlBERl9HZXRMYXN0RXJyb3IKIC8vICAgICAgICAgIEdldCBsYXN0IGVycm9yIGNvZGUgd2hlbiBhbiBTREsgZnVuY3Rpb24gZmFpbGVkLgpAQCAtMzQ4LDcgKzM3NSw4IEBACiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBBIDMyLWJpdCBpbnRlZ2VyIGluZGljYXRpbmcgZXJyb3IgY29kZXMgKGRlZmluZWQgYWJvdmUpLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBJZiB0aGUgcHJldmlvdXMgU0RLIGNhbGwgc3VjY2VlZGVkLCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24KKy8vICAgICAgICAgIElmIHRoZSBwcmV2aW91cyBTREsgY2FsbCBzdWNjZWVkZWQsIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcworLy8gICAgICAgICAgZnVuY3Rpb24KIC8vICAgICAgICAgIGlzIG5vdCBkZWZpbmVkLgogLy8KIERMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERl9HZXRMYXN0RXJyb3IoKTsKQEAgLTM1NiwyNyArMzg0LDM0IEBACiAvLyBGdW5jdGlvbjogRlBERl9HZXREb2NQZXJtaXNzaW9uCiAvLyAgICAgICAgICBHZXQgZmlsZSBwZXJtaXNzaW9uIGZsYWdzIG9mIHRoZSBkb2N1bWVudC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKy8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50CisvLyAgICAgICAgICBmdW5jdGlvbi4KIC8vIFJldHVybiB2YWx1ZToKLS8vICAgICAgICAgIEEgMzItYml0IGludGVnZXIgaW5kaWNhdGluZyBwZXJtaXNzaW9uIGZsYWdzLiBQbGVhc2UgcmVmZXIgdG8gUERGIFJlZmVyZW5jZSBmb3IKLS8vICAgICAgICAgIGRldGFpbGVkIGRlc2NyaXB0aW9uLiBJZiB0aGUgZG9jdW1lbnQgaXMgbm90IHByb3RlY3RlZCwgMHhmZmZmZmZmZiB3aWxsIGJlIHJldHVybmVkLgorLy8gICAgICAgICAgQSAzMi1iaXQgaW50ZWdlciBpbmRpY2F0aW5nIHBlcm1pc3Npb24gZmxhZ3MuIFBsZWFzZSByZWZlciB0byBQREYKKy8vICAgICAgICAgIFJlZmVyZW5jZSBmb3IKKy8vICAgICAgICAgIGRldGFpbGVkIGRlc2NyaXB0aW9uLiBJZiB0aGUgZG9jdW1lbnQgaXMgbm90IHByb3RlY3RlZCwgMHhmZmZmZmZmZgorLy8gICAgICAgICAgd2lsbCBiZSByZXR1cm5lZC4KIC8vCiBETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZfR2V0RG9jUGVybWlzc2lvbnMoRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0dldFNlY3VyaXR5SGFuZGxlclJldmlzaW9uCiAvLyAgICAgICAgICBHZXQgdGhlIHJldmlzaW9uIGZvciBzZWN1cml0eSBoYW5kbGVyLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQKKy8vICAgICAgICAgIGZ1bmN0aW9uLgogLy8gUmV0dXJuIHZhbHVlOgotLy8gICAgICAgICAgVGhlIHNlY3VyaXR5IGhhbmRsZXIgcmV2aXNpb24gbnVtYmVyLiBQbGVhc2UgcmVmZXIgdG8gUERGIFJlZmVyZW5jZSBmb3IKLS8vICAgICAgICAgIGRldGFpbGVkIGRlc2NyaXB0aW9uLiBJZiB0aGUgZG9jdW1lbnQgaXMgbm90IHByb3RlY3RlZCwgLTEgd2lsbCBiZSByZXR1cm5lZC4KKy8vICAgICAgICAgIFRoZSBzZWN1cml0eSBoYW5kbGVyIHJldmlzaW9uIG51bWJlci4gUGxlYXNlIHJlZmVyIHRvIFBERiBSZWZlcmVuY2UKKy8vICAgICAgICAgIGZvcgorLy8gICAgICAgICAgZGV0YWlsZWQgZGVzY3JpcHRpb24uIElmIHRoZSBkb2N1bWVudCBpcyBub3QgcHJvdGVjdGVkLCAtMSB3aWxsIGJlCisvLyAgICAgICAgICByZXR1cm5lZC4KIC8vCiBETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9HZXRTZWN1cml0eUhhbmRsZXJSZXZpc2lvbihGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAogLy8gRnVuY3Rpb246IEZQREZfR2V0UGFnZUNvdW50CiAvLyAgICAgICAgICBHZXQgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGluIGEgZG9jdW1lbnQuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisvLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudAorLy8gICAgICAgICAgZnVuY3Rpb24uCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUb3RhbCBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIGRvY3VtZW50LgogLy8KQEAgLTM4NSwyMCArNDIwLDI0IEBACiAvLyBGdW5jdGlvbjogRlBERl9Mb2FkUGFnZQogLy8gICAgICAgICAgTG9hZCBhIHBhZ2UgaW5zaWRlIGEgZG9jdW1lbnQuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisvLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudAorLy8gICAgICAgICAgZnVuY3Rpb24uCiAvLyAgICAgICAgICBwYWdlX2luZGV4ICAtICAgSW5kZXggbnVtYmVyIG9mIHRoZSBwYWdlLiAwIGZvciB0aGUgZmlyc3QgcGFnZS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIEEgaGFuZGxlIHRvIHRoZSBsb2FkZWQgcGFnZS4gSWYgZmFpbGVkLCBOVUxMIGlzIHJldHVybmVkLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBMb2FkZWQgcGFnZSBjYW4gYmUgcmVuZGVyZWQgdG8gZGV2aWNlcyB1c2luZyBGUERGX1JlbmRlclBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICBMb2FkZWQgcGFnZSBjYW4gYmUgcmVuZGVyZWQgdG8gZGV2aWNlcyB1c2luZyBGUERGX1JlbmRlclBhZ2UKKy8vICAgICAgICAgIGZ1bmN0aW9uLgogLy8gICAgICAgICAgTG9hZGVkIHBhZ2UgY2FuIGJlIGNsb3NlZCBieSBGUERGX0Nsb3NlUGFnZS4KIC8vCi1ETExFWFBPUlQgRlBERl9QQUdFIFNURENBTEwgRlBERl9Mb2FkUGFnZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQgcGFnZV9pbmRleCk7CitETExFWFBPUlQgRlBERl9QQUdFIFNURENBTEwgRlBERl9Mb2FkUGFnZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgpOwogCiAvLyBGdW5jdGlvbjogRlBERl9HZXRQYWdlV2lkdGgKIC8vICAgICAgICAgIEdldCBwYWdlIHdpZHRoLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisvLyAgICAgICAgICBmdW5jdGlvbi4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFBhZ2Ugd2lkdGggKGV4Y2x1ZGluZyBub24tZGlzcGxheWFibGUgYXJlYSkgbWVhc3VyZWQgaW4gcG9pbnRzLgogLy8gICAgICAgICAgT25lIHBvaW50IGlzIDEvNzIgaW5jaCAoYXJvdW5kIDAuMzUyOCBtbSkuCkBAIC00MDgsNyArNDQ3LDggQEAKIC8vIEZ1bmN0aW9uOiBGUERGX0dldFBhZ2VIZWlnaHQKIC8vICAgICAgICAgIEdldCBwYWdlIGhlaWdodC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorLy8gICAgICAgICAgZnVuY3Rpb24uCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBQYWdlIGhlaWdodCAoZXhjbHVkaW5nIG5vbi1kaXNwbGF5YWJsZSBhcmVhKSBtZWFzdXJlZCBpbiBwb2ludHMuCiAvLyAgICAgICAgICBPbmUgcG9pbnQgaXMgMS83MiBpbmNoIChhcm91bmQgMC4zNTI4IG1tKQpAQCAtNDE4LDcxICs0NTgsMTA5IEBACiAvLyBGdW5jdGlvbjogRlBERl9HZXRQYWdlU2l6ZUJ5SW5kZXgKIC8vICAgICAgICAgIEdldCB0aGUgc2l6ZSBvZiBhIHBhZ2UgYnkgaW5kZXguCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisvLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudAorLy8gICAgICAgICAgZnVuY3Rpb24uCiAvLyAgICAgICAgICBwYWdlX2luZGV4ICAtICAgUGFnZSBpbmRleCwgemVybyBmb3IgdGhlIGZpcnN0IHBhZ2UuCi0vLyAgICAgICAgICB3aWR0aCAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHBhZ2Ugd2lkdGggKGluIHBvaW50cykuCi0vLyAgICAgICAgICBoZWlnaHQgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHBhZ2UgaGVpZ2h0IChpbiBwb2ludHMpLgorLy8gICAgICAgICAgd2lkdGggICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSBwYWdlIHdpZHRoCisvLyAgICAgICAgICAoaW4gcG9pbnRzKS4KKy8vICAgICAgICAgIGhlaWdodCAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcGFnZSBoZWlnaHQKKy8vICAgICAgICAgIChpbiBwb2ludHMpLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTm9uLXplcm8gZm9yIHN1Y2Nlc3MuIDAgZm9yIGVycm9yIChkb2N1bWVudCBvciBwYWdlIG5vdCBmb3VuZCkuCiAvLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfR2V0UGFnZVNpemVCeUluZGV4KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBwYWdlX2luZGV4LCBkb3VibGUqIHdpZHRoLCBkb3VibGUqIGhlaWdodCk7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9HZXRQYWdlU2l6ZUJ5SW5kZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogaGVpZ2h0KTsKIAogLy8gUGFnZSByZW5kZXJpbmcgZmxhZ3MuIFRoZXkgY2FuIGJlIGNvbWJpbmVkIHdpdGggYml0IE9SLgotI2RlZmluZSBGUERGX0FOTk9UICAgICAgICAgIDB4MDEgICAgICAgIC8vIFNldCBpZiBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcmVuZGVyZWQuCi0jZGVmaW5lIEZQREZfTENEX1RFWFQgICAgICAgMHgwMiAgICAgICAgLy8gU2V0IGlmIHVzaW5nIHRleHQgcmVuZGVyaW5nIG9wdGltaXplZCBmb3IgTENEIGRpc3BsYXkuCi0jZGVmaW5lIEZQREZfTk9fTkFUSVZFVEVYVCAgMHgwNCAgICAgICAgLy8gRG9uJ3QgdXNlIHRoZSBuYXRpdmUgdGV4dCBvdXRwdXQgYXZhaWxhYmxlIG9uIHNvbWUgcGxhdGZvcm1zCi0jZGVmaW5lIEZQREZfR1JBWVNDQUxFICAgICAgMHgwOCAgICAgICAgLy8gR3JheXNjYWxlIG91dHB1dC4KLSNkZWZpbmUgRlBERl9ERUJVR19JTkZPICAgICAweDgwICAgICAgICAvLyBTZXQgaWYgeW91IHdhbnQgdG8gZ2V0IHNvbWUgZGVidWcgaW5mby4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQbGVhc2UgZGlzY3VzcyB3aXRoIEZveGl0IGZpcnN0IGlmIHlvdSBuZWVkIHRvIGNvbGxlY3QgZGVidWcgaW5mby4KLSNkZWZpbmUgRlBERl9OT19DQVRDSCAgICAgICAweDEwMCAgICAgICAvLyBTZXQgaWYgeW91IGRvbid0IHdhbnQgdG8gY2F0Y2ggZXhjZXB0aW9uLgotI2RlZmluZSBGUERGX1JFTkRFUl9MSU1JVEVESU1BR0VDQUNIRSAgIDB4MjAwICAgLy8gTGltaXQgaW1hZ2UgY2FjaGUgc2l6ZS4KLSNkZWZpbmUgRlBERl9SRU5ERVJfRk9SQ0VIQUxGVE9ORSAgICAgICAweDQwMCAgIC8vIEFsd2F5cyB1c2UgaGFsZnRvbmUgZm9yIGltYWdlIHN0cmV0Y2hpbmcuCi0jZGVmaW5lIEZQREZfUFJJTlRJTkcgICAgICAgMHg4MDAgICAvLyBSZW5kZXIgZm9yIHByaW50aW5nLgotI2RlZmluZSBGUERGX1JFVkVSU0VfQllURV9PUkRFUiAgICAgMHgxMCAgICAgICAgLy9zZXQgd2hldGhlciByZW5kZXIgaW4gYSByZXZlcnNlIEJ5dGUgb3JkZXIsIHRoaXMgZmxhZyBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VuYWJsZSB3aGVuIHJlbmRlciB0byBhIGJpdG1hcC4KKyNkZWZpbmUgRlBERl9BTk5PVCAweDAxICAvLyBTZXQgaWYgYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHJlbmRlcmVkLgorI2RlZmluZSBGUERGX0xDRF9URVhUIFwKKyAgMHgwMiAgLy8gU2V0IGlmIHVzaW5nIHRleHQgcmVuZGVyaW5nIG9wdGltaXplZCBmb3IgTENEIGRpc3BsYXkuCisjZGVmaW5lIEZQREZfTk9fTkFUSVZFVEVYVCBcCisgIDB4MDQgIC8vIERvbid0IHVzZSB0aGUgbmF0aXZlIHRleHQgb3V0cHV0IGF2YWlsYWJsZSBvbiBzb21lIHBsYXRmb3JtcworI2RlZmluZSBGUERGX0dSQVlTQ0FMRSAweDA4ICAgLy8gR3JheXNjYWxlIG91dHB1dC4KKyNkZWZpbmUgRlBERl9ERUJVR19JTkZPIDB4ODAgIC8vIFNldCBpZiB5b3Ugd2FudCB0byBnZXQgc29tZSBkZWJ1ZyBpbmZvLgorLy8gUGxlYXNlIGRpc2N1c3Mgd2l0aCBGb3hpdCBmaXJzdCBpZiB5b3UgbmVlZCB0byBjb2xsZWN0IGRlYnVnIGluZm8uCisjZGVmaW5lIEZQREZfTk9fQ0FUQ0ggMHgxMDAgIC8vIFNldCBpZiB5b3UgZG9uJ3Qgd2FudCB0byBjYXRjaCBleGNlcHRpb24uCisjZGVmaW5lIEZQREZfUkVOREVSX0xJTUlURURJTUFHRUNBQ0hFIDB4MjAwICAvLyBMaW1pdCBpbWFnZSBjYWNoZSBzaXplLgorI2RlZmluZSBGUERGX1JFTkRFUl9GT1JDRUhBTEZUT05FIFwKKyAgMHg0MDAgICAgICAgICAgICAgICAgICAgICAgLy8gQWx3YXlzIHVzZSBoYWxmdG9uZSBmb3IgaW1hZ2Ugc3RyZXRjaGluZy4KKyNkZWZpbmUgRlBERl9QUklOVElORyAweDgwMCAgLy8gUmVuZGVyIGZvciBwcmludGluZy4KKyNkZWZpbmUgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIgXAorICAweDEwICAvLyBzZXQgd2hldGhlciByZW5kZXIgaW4gYSByZXZlcnNlIEJ5dGUgb3JkZXIsIHRoaXMgZmxhZyBvbmx5CisvLyBlbmFibGUgd2hlbiByZW5kZXIgdG8gYSBiaXRtYXAuCiAjaWZkZWYgX1dJTjMyCiAvLyBGdW5jdGlvbjogRlBERl9SZW5kZXJQYWdlCiAvLyAgICAgICAgICBSZW5kZXIgY29udGVudHMgaW4gYSBwYWdlIHRvIGEgZGV2aWNlIChzY3JlZW4sIGJpdG1hcCwgb3IgcHJpbnRlcikuCiAvLyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIG9uIFdpbmRvd3Mgc3lzdGVtLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIGRjICAgICAgICAgIC0gICBIYW5kbGUgdG8gZGV2aWNlIGNvbnRleHQuCi0vLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotLy8gICAgICAgICAgc3RhcnRfeCAgICAgLSAgIExlZnQgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgZGV2aWNlIGNvb3JkaW5hdGUuCi0vLyAgICAgICAgICBzdGFydF95ICAgICAtICAgVG9wIHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlIGRldmljZSBjb29yZGluYXRlLgorLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorLy8gICAgICAgICAgZnVuY3Rpb24uCisvLyAgICAgICAgICBzdGFydF94ICAgICAtICAgTGVmdCBwaXhlbCBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheSBhcmVhIGluIHRoZQorLy8gICAgICAgICAgZGV2aWNlIGNvb3JkaW5hdGUuCisvLyAgICAgICAgICBzdGFydF95ICAgICAtICAgVG9wIHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlIGRldmljZQorLy8gICAgICAgICAgY29vcmRpbmF0ZS4KIC8vICAgICAgICAgIHNpemVfeCAgICAgIC0gICBIb3Jpem9udGFsIHNpemUgKGluIHBpeGVscykgZm9yIGRpc3BsYXlpbmcgdGhlIHBhZ2UuCiAvLyAgICAgICAgICBzaXplX3kgICAgICAtICAgVmVydGljYWwgc2l6ZSAoaW4gcGl4ZWxzKSBmb3IgZGlzcGxheWluZyB0aGUgcGFnZS4KLS8vICAgICAgICAgIHJvdGF0ZSAgICAgIC0gICBQYWdlIG9yaWVudGF0aW9uOiAwIChub3JtYWwpLCAxIChyb3RhdGVkIDkwIGRlZ3JlZXMgY2xvY2t3aXNlKSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAocm90YXRlZCAxODAgZGVncmVlcyksIDMgKHJvdGF0ZWQgOTAgZGVncmVlcyBjb3VudGVyLWNsb2Nrd2lzZSkuCi0vLyAgICAgICAgICBmbGFncyAgICAgICAtICAgMCBmb3Igbm9ybWFsIGRpc3BsYXksIG9yIGNvbWJpbmF0aW9uIG9mIGZsYWdzIGRlZmluZWQgYWJvdmUuCisvLyAgICAgICAgICByb3RhdGUgICAgICAtICAgUGFnZSBvcmllbnRhdGlvbjogMCAobm9ybWFsKSwgMSAocm90YXRlZCA5MCBkZWdyZWVzCisvLyAgICAgICAgICBjbG9ja3dpc2UpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKSwgMyAocm90YXRlZCA5MCBkZWdyZWVzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXItY2xvY2t3aXNlKS4KKy8vICAgICAgICAgIGZsYWdzICAgICAgIC0gICAwIGZvciBub3JtYWwgZGlzcGxheSwgb3IgY29tYmluYXRpb24gb2YgZmxhZ3MKKy8vICAgICAgICAgIGRlZmluZWQgYWJvdmUuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8gTm90ZXM6Ci0vLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byByZW5kZXIgdGhlIHBhZ2UgZm9yIHRoZSBkb2N1bWVudCBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCisvLyAgICAgICAgICBUaGUgbWV0aG9kIGNhbiBub3Qgc3VwcG9ydCB0byByZW5kZXIgdGhlIHBhZ2UgZm9yIHRoZSBkb2N1bWVudAorLy8gICAgICAgICAgY29uc2lzdHMgb2YgZHluYW1pYyBYRkEgZmllbGRzLgogLy8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9SZW5kZXJQYWdlKEhEQyBkYywgRlBERl9QQUdFIHBhZ2UsIGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwgaW50IHNpemVfeCwgaW50IHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsIGludCBmbGFncyk7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZShIREMgZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOwogI2VuZGlmCiAKIC8vIEZ1bmN0aW9uOiBGUERGX1JlbmRlclBhZ2VCaXRtYXAKIC8vICAgICAgICAgIFJlbmRlciBjb250ZW50cyBpbiBhIHBhZ2UgdG8gYSBkZXZpY2UgaW5kZXBlbmRlbnQgYml0bWFwCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcCAoYXMgdGhlIG91dHB1dCBidWZmZXIpLgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBoYW5kbGUgY2FuIGJlIGNyZWF0ZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24uCi0vLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotLy8gICAgICAgICAgc3RhcnRfeCAgICAgLSAgIExlZnQgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgYml0bWFwIGNvb3JkaW5hdGUuCi0vLyAgICAgICAgICBzdGFydF95ICAgICAtICAgVG9wIHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlIGJpdG1hcCBjb29yZGluYXRlLgorLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcCAoYXMgdGhlCisvLyAgICAgICAgICBvdXRwdXQgYnVmZmVyKS4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgaGFuZGxlIGNhbiBiZSBjcmVhdGVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisvLyAgICAgICAgICBmdW5jdGlvbi4KKy8vICAgICAgICAgIHN0YXJ0X3ggICAgIC0gICBMZWZ0IHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlCisvLyAgICAgICAgICBiaXRtYXAgY29vcmRpbmF0ZS4KKy8vICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgYml0bWFwCisvLyAgICAgICAgICBjb29yZGluYXRlLgogLy8gICAgICAgICAgc2l6ZV94ICAgICAgLSAgIEhvcml6b250YWwgc2l6ZSAoaW4gcGl4ZWxzKSBmb3IgZGlzcGxheWluZyB0aGUgcGFnZS4KIC8vICAgICAgICAgIHNpemVfeSAgICAgIC0gICBWZXJ0aWNhbCBzaXplIChpbiBwaXhlbHMpIGZvciBkaXNwbGF5aW5nIHRoZSBwYWdlLgotLy8gICAgICAgICAgcm90YXRlICAgICAgLSAgIFBhZ2Ugb3JpZW50YXRpb246IDAgKG5vcm1hbCksIDEgKHJvdGF0ZWQgOTAgZGVncmVlcyBjbG9ja3dpc2UpLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKSwgMyAocm90YXRlZCA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlKS4KLS8vICAgICAgICAgIGZsYWdzICAgICAgIC0gICAwIGZvciBub3JtYWwgZGlzcGxheSwgb3IgY29tYmluYXRpb24gb2YgZmxhZ3MgZGVmaW5lZCBhYm92ZS4KKy8vICAgICAgICAgIHJvdGF0ZSAgICAgIC0gICBQYWdlIG9yaWVudGF0aW9uOiAwIChub3JtYWwpLCAxIChyb3RhdGVkIDkwIGRlZ3JlZXMKKy8vICAgICAgICAgIGNsb2Nrd2lzZSksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKHJvdGF0ZWQgMTgwIGRlZ3JlZXMpLCAzIChyb3RhdGVkIDkwIGRlZ3JlZXMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlci1jbG9ja3dpc2UpLgorLy8gICAgICAgICAgZmxhZ3MgICAgICAgLSAgIDAgZm9yIG5vcm1hbCBkaXNwbGF5LCBvciBjb21iaW5hdGlvbiBvZiBmbGFncworLy8gICAgICAgICAgZGVmaW5lZCBhYm92ZS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLyBOb3RlczoKLS8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIHJlbmRlciB0aGUgcGFnZSBmb3IgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIGR5bmFtaWMgWEZBIGZpZWxkcy4KKy8vICAgICAgICAgIFRoZSBtZXRob2QgY2FuIG5vdCBzdXBwb3J0IHRvIHJlbmRlciB0aGUgcGFnZSBmb3IgdGhlIGRvY3VtZW50CisvLyAgICAgICAgICBjb25zaXN0cyBvZiBkeW5hbWljIFhGQSBmaWVsZHMuCiAvLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1JlbmRlclBhZ2VCaXRtYXAoRlBERl9CSVRNQVAgYml0bWFwLCBGUERGX1BBR0UgcGFnZSwgaW50IHN0YXJ0X3gsIGludCBzdGFydF95LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwgaW50IHNpemVfeSwgaW50IHJvdGF0ZSwgaW50IGZsYWdzKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9SZW5kZXJQYWdlQml0bWFwKEZQREZfQklUTUFQIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0Nsb3NlUGFnZQogLy8gICAgICAgICAgQ2xvc2UgYSBsb2FkZWQgUERGIHBhZ2UuCkBAIC01MDUsMTQwICs1ODMsMjI1IEBACiAvLyBGdW5jdGlvbjogRlBERl9EZXZpY2VUb1BhZ2UKIC8vICAgICAgICAgIENvbnZlcnQgdGhlIHNjcmVlbiBjb29yZGluYXRlIG9mIGEgcG9pbnQgdG8gcGFnZSBjb29yZGluYXRlLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0vLyAgICAgICAgICBzdGFydF94ICAgICAtICAgTGVmdCBwaXhlbCBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheSBhcmVhIGluIHRoZSBkZXZpY2UgY29vcmRpbmF0ZS4KLS8vICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgZGV2aWNlIGNvb3JkaW5hdGUuCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisvLyAgICAgICAgICBmdW5jdGlvbi4KKy8vICAgICAgICAgIHN0YXJ0X3ggICAgIC0gICBMZWZ0IHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlCisvLyAgICAgICAgICBkZXZpY2UgY29vcmRpbmF0ZS4KKy8vICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgZGV2aWNlCisvLyAgICAgICAgICBjb29yZGluYXRlLgogLy8gICAgICAgICAgc2l6ZV94ICAgICAgLSAgIEhvcml6b250YWwgc2l6ZSAoaW4gcGl4ZWxzKSBmb3IgZGlzcGxheWluZyB0aGUgcGFnZS4KIC8vICAgICAgICAgIHNpemVfeSAgICAgIC0gICBWZXJ0aWNhbCBzaXplIChpbiBwaXhlbHMpIGZvciBkaXNwbGF5aW5nIHRoZSBwYWdlLgotLy8gICAgICAgICAgcm90YXRlICAgICAgLSAgIFBhZ2Ugb3JpZW50YXRpb246IDAgKG5vcm1hbCksIDEgKHJvdGF0ZWQgOTAgZGVncmVlcyBjbG9ja3dpc2UpLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKSwgMyAocm90YXRlZCA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlKS4KLS8vICAgICAgICAgIGRldmljZV94ICAgIC0gICBYIHZhbHVlIGluIGRldmljZSBjb29yZGluYXRlLCBmb3IgdGhlIHBvaW50IHRvIGJlIGNvbnZlcnRlZC4KLS8vICAgICAgICAgIGRldmljZV95ICAgIC0gICBZIHZhbHVlIGluIGRldmljZSBjb29yZGluYXRlLCBmb3IgdGhlIHBvaW50IHRvIGJlIGNvbnZlcnRlZC4KLS8vICAgICAgICAgIHBhZ2VfeCAgICAgIC0gICBBIFBvaW50ZXIgdG8gYSBkb3VibGUgcmVjZWl2aW5nIHRoZSBjb252ZXJ0ZWQgWCB2YWx1ZSBpbiBwYWdlIGNvb3JkaW5hdGUuCi0vLyAgICAgICAgICBwYWdlX3kgICAgICAtICAgQSBQb2ludGVyIHRvIGEgZG91YmxlIHJlY2VpdmluZyB0aGUgY29udmVydGVkIFkgdmFsdWUgaW4gcGFnZSBjb29yZGluYXRlLgorLy8gICAgICAgICAgcm90YXRlICAgICAgLSAgIFBhZ2Ugb3JpZW50YXRpb246IDAgKG5vcm1hbCksIDEgKHJvdGF0ZWQgOTAgZGVncmVlcworLy8gICAgICAgICAgY2xvY2t3aXNlKSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAocm90YXRlZCAxODAgZGVncmVlcyksIDMgKHJvdGF0ZWQgOTAgZGVncmVlcworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyLWNsb2Nrd2lzZSkuCisvLyAgICAgICAgICBkZXZpY2VfeCAgICAtICAgWCB2YWx1ZSBpbiBkZXZpY2UgY29vcmRpbmF0ZSwgZm9yIHRoZSBwb2ludCB0byBiZQorLy8gICAgICAgICAgY29udmVydGVkLgorLy8gICAgICAgICAgZGV2aWNlX3kgICAgLSAgIFkgdmFsdWUgaW4gZGV2aWNlIGNvb3JkaW5hdGUsIGZvciB0aGUgcG9pbnQgdG8gYmUKKy8vICAgICAgICAgIGNvbnZlcnRlZC4KKy8vICAgICAgICAgIHBhZ2VfeCAgICAgIC0gICBBIFBvaW50ZXIgdG8gYSBkb3VibGUgcmVjZWl2aW5nIHRoZSBjb252ZXJ0ZWQgWAorLy8gICAgICAgICAgdmFsdWUgaW4gcGFnZSBjb29yZGluYXRlLgorLy8gICAgICAgICAgcGFnZV95ICAgICAgLSAgIEEgUG9pbnRlciB0byBhIGRvdWJsZSByZWNlaXZpbmcgdGhlIGNvbnZlcnRlZCBZCisvLyAgICAgICAgICB2YWx1ZSBpbiBwYWdlIGNvb3JkaW5hdGUuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBUaGUgcGFnZSBjb29yZGluYXRlIHN5c3RlbSBoYXMgaXRzIG9yaWdpbiBhdCBsZWZ0LWJvdHRvbSBjb3JuZXIgb2YgdGhlIHBhZ2UsIHdpdGggWCBheGlzIGdvZXMgYWxvbmcKLS8vICAgICAgICAgIHRoZSBib3R0b20gc2lkZSB0byB0aGUgcmlnaHQsIGFuZCBZIGF4aXMgZ29lcyBhbG9uZyB0aGUgbGVmdCBzaWRlIHVwd2FyZC4gTk9URTogdGhpcyBjb29yZGluYXRlIHN5c3RlbQotLy8gICAgICAgICAgY2FuIGJlIGFsdGVyZWQgd2hlbiB5b3Ugem9vbSwgc2Nyb2xsLCBvciByb3RhdGUgYSBwYWdlLCBob3dldmVyLCBhIHBvaW50IG9uIHRoZSBwYWdlIHNob3VsZCBhbHdheXMgaGF2ZQorLy8gICAgICAgICAgVGhlIHBhZ2UgY29vcmRpbmF0ZSBzeXN0ZW0gaGFzIGl0cyBvcmlnaW4gYXQgbGVmdC1ib3R0b20gY29ybmVyIG9mCisvLyAgICAgICAgICB0aGUgcGFnZSwgd2l0aCBYIGF4aXMgZ29lcyBhbG9uZworLy8gICAgICAgICAgdGhlIGJvdHRvbSBzaWRlIHRvIHRoZSByaWdodCwgYW5kIFkgYXhpcyBnb2VzIGFsb25nIHRoZSBsZWZ0IHNpZGUKKy8vICAgICAgICAgIHVwd2FyZC4gTk9URTogdGhpcyBjb29yZGluYXRlIHN5c3RlbQorLy8gICAgICAgICAgY2FuIGJlIGFsdGVyZWQgd2hlbiB5b3Ugem9vbSwgc2Nyb2xsLCBvciByb3RhdGUgYSBwYWdlLCBob3dldmVyLCBhCisvLyAgICAgICAgICBwb2ludCBvbiB0aGUgcGFnZSBzaG91bGQgYWx3YXlzIGhhdmUKIC8vICAgICAgICAgIHRoZSBzYW1lIGNvb3JkaW5hdGUgdmFsdWVzIGluIHRoZSBwYWdlIGNvb3JkaW5hdGUgc3lzdGVtLgogLy8KLS8vICAgICAgICAgIFRoZSBkZXZpY2UgY29vcmRpbmF0ZSBzeXN0ZW0gaXMgZGV2aWNlIGRlcGVuZGVudC4gRm9yIHNjcmVlbiBkZXZpY2UsIGl0cyBvcmlnaW4gaXMgYXQgbGVmdC10b3AKLS8vICAgICAgICAgIGNvcm5lciBvZiB0aGUgd2luZG93LiBIb3dldmVyIHRoaXMgb3JpZ2luIGNhbiBiZSBhbHRlcmVkIGJ5IFdpbmRvd3MgY29vcmRpbmF0ZSB0cmFuc2Zvcm1hdGlvbgotLy8gICAgICAgICAgdXRpbGl0aWVzLiBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95IGFuZCByb3RhdGUgcGFyYW1ldGVycyBoYXZlIGV4YWN0bHkKKy8vICAgICAgICAgIFRoZSBkZXZpY2UgY29vcmRpbmF0ZSBzeXN0ZW0gaXMgZGV2aWNlIGRlcGVuZGVudC4gRm9yIHNjcmVlbiBkZXZpY2UsCisvLyAgICAgICAgICBpdHMgb3JpZ2luIGlzIGF0IGxlZnQtdG9wCisvLyAgICAgICAgICBjb3JuZXIgb2YgdGhlIHdpbmRvdy4gSG93ZXZlciB0aGlzIG9yaWdpbiBjYW4gYmUgYWx0ZXJlZCBieSBXaW5kb3dzCisvLyAgICAgICAgICBjb29yZGluYXRlIHRyYW5zZm9ybWF0aW9uCisvLyAgICAgICAgICB1dGlsaXRpZXMuIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3kKKy8vICAgICAgICAgIGFuZCByb3RhdGUgcGFyYW1ldGVycyBoYXZlIGV4YWN0bHkKIC8vICAgICAgICAgIHNhbWUgdmFsdWVzIGFzIHlvdSB1c2VkIGluIEZQREZfUmVuZGVyUGFnZSgpIGZ1bmN0aW9uIGNhbGwuCiAvLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0RldmljZVRvUGFnZShGUERGX1BBR0UgcGFnZSwgaW50IHN0YXJ0X3gsIGludCBzdGFydF95LCBpbnQgc2l6ZV94LCBpbnQgc2l6ZV95LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwgaW50IGRldmljZV94LCBpbnQgZGV2aWNlX3ksIGRvdWJsZSogcGFnZV94LCBkb3VibGUqIHBhZ2VfeSk7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfRGV2aWNlVG9QYWdlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXZpY2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRldmljZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYWdlX3kpOwogCiAvLyBGdW5jdGlvbjogRlBERl9QYWdlVG9EZXZpY2UKIC8vICAgICAgICAgIENvbnZlcnQgdGhlIHBhZ2UgY29vcmRpbmF0ZSBvZiBhIHBvaW50IHRvIHNjcmVlbiBjb29yZGluYXRlLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0vLyAgICAgICAgICBzdGFydF94ICAgICAtICAgTGVmdCBwaXhlbCBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheSBhcmVhIGluIHRoZSBkZXZpY2UgY29vcmRpbmF0ZS4KLS8vICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgZGV2aWNlIGNvb3JkaW5hdGUuCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisvLyAgICAgICAgICBmdW5jdGlvbi4KKy8vICAgICAgICAgIHN0YXJ0X3ggICAgIC0gICBMZWZ0IHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlCisvLyAgICAgICAgICBkZXZpY2UgY29vcmRpbmF0ZS4KKy8vICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgZGV2aWNlCisvLyAgICAgICAgICBjb29yZGluYXRlLgogLy8gICAgICAgICAgc2l6ZV94ICAgICAgLSAgIEhvcml6b250YWwgc2l6ZSAoaW4gcGl4ZWxzKSBmb3IgZGlzcGxheWluZyB0aGUgcGFnZS4KIC8vICAgICAgICAgIHNpemVfeSAgICAgIC0gICBWZXJ0aWNhbCBzaXplIChpbiBwaXhlbHMpIGZvciBkaXNwbGF5aW5nIHRoZSBwYWdlLgotLy8gICAgICAgICAgcm90YXRlICAgICAgLSAgIFBhZ2Ugb3JpZW50YXRpb246IDAgKG5vcm1hbCksIDEgKHJvdGF0ZWQgOTAgZGVncmVlcyBjbG9ja3dpc2UpLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKSwgMyAocm90YXRlZCA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlKS4KLS8vICAgICAgICAgIHBhZ2VfeCAgICAgIC0gICBYIHZhbHVlIGluIHBhZ2UgY29vcmRpbmF0ZSwgZm9yIHRoZSBwb2ludCB0byBiZSBjb252ZXJ0ZWQuCi0vLyAgICAgICAgICBwYWdlX3kgICAgICAtICAgWSB2YWx1ZSBpbiBwYWdlIGNvb3JkaW5hdGUsIGZvciB0aGUgcG9pbnQgdG8gYmUgY29udmVydGVkLgotLy8gICAgICAgICAgZGV2aWNlX3ggICAgLSAgIEEgcG9pbnRlciB0byBhbiBpbnRlZ2VyIHJlY2VpdmluZyB0aGUgcmVzdWx0IFggdmFsdWUgaW4gZGV2aWNlIGNvb3JkaW5hdGUuCi0vLyAgICAgICAgICBkZXZpY2VfeSAgICAtICAgQSBwb2ludGVyIHRvIGFuIGludGVnZXIgcmVjZWl2aW5nIHRoZSByZXN1bHQgWSB2YWx1ZSBpbiBkZXZpY2UgY29vcmRpbmF0ZS4KKy8vICAgICAgICAgIHJvdGF0ZSAgICAgIC0gICBQYWdlIG9yaWVudGF0aW9uOiAwIChub3JtYWwpLCAxIChyb3RhdGVkIDkwIGRlZ3JlZXMKKy8vICAgICAgICAgIGNsb2Nrd2lzZSksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKHJvdGF0ZWQgMTgwIGRlZ3JlZXMpLCAzIChyb3RhdGVkIDkwIGRlZ3JlZXMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlci1jbG9ja3dpc2UpLgorLy8gICAgICAgICAgcGFnZV94ICAgICAgLSAgIFggdmFsdWUgaW4gcGFnZSBjb29yZGluYXRlLCBmb3IgdGhlIHBvaW50IHRvIGJlCisvLyAgICAgICAgICBjb252ZXJ0ZWQuCisvLyAgICAgICAgICBwYWdlX3kgICAgICAtICAgWSB2YWx1ZSBpbiBwYWdlIGNvb3JkaW5hdGUsIGZvciB0aGUgcG9pbnQgdG8gYmUKKy8vICAgICAgICAgIGNvbnZlcnRlZC4KKy8vICAgICAgICAgIGRldmljZV94ICAgIC0gICBBIHBvaW50ZXIgdG8gYW4gaW50ZWdlciByZWNlaXZpbmcgdGhlIHJlc3VsdCBYIHZhbHVlCisvLyAgICAgICAgICBpbiBkZXZpY2UgY29vcmRpbmF0ZS4KKy8vICAgICAgICAgIGRldmljZV95ICAgIC0gICBBIHBvaW50ZXIgdG8gYW4gaW50ZWdlciByZWNlaXZpbmcgdGhlIHJlc3VsdCBZIHZhbHVlCisvLyAgICAgICAgICBpbiBkZXZpY2UgY29vcmRpbmF0ZS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLyBDb21tZW50czoKIC8vICAgICAgICAgIFNlZSBjb21tZW50cyBvZiBGUERGX0RldmljZVRvUGFnZSgpIGZ1bmN0aW9uLgogLy8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9QYWdlVG9EZXZpY2UoRlBERl9QQUdFIHBhZ2UsIGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwgaW50IHNpemVfeCwgaW50IHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsIGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3ksIGludCogZGV2aWNlX3gsIGludCogZGV2aWNlX3kpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1BhZ2VUb0RldmljZShGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRldmljZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRldmljZV95KTsKIAogLy8gRnVuY3Rpb246IEZQREZCaXRtYXBfQ3JlYXRlCiAvLyAgICAgICAgICBDcmVhdGUgYSBGb3hpdCBEZXZpY2UgSW5kZXBlbmRlbnQgQml0bWFwIChGWERJQikuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgd2lkdGggICAgICAgLSAgIE51bWJlciBvZiBwaXhlbHMgaW4gYSBob3Jpem9udGFsIGxpbmUgb2YgdGhlIGJpdG1hcC4gTXVzdCBiZSBncmVhdGVyIHRoYW4gMC4KLS8vICAgICAgICAgIGhlaWdodCAgICAgIC0gICBOdW1iZXIgb2YgcGl4ZWxzIGluIGEgdmVydGljYWwgbGluZSBvZiB0aGUgYml0bWFwLiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgotLy8gICAgICAgICAgYWxwaGEgICAgICAgLSAgIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYWxwaGEgY2hhbm5lbCBpcyB1c2VkLiBOb24temVybyBmb3IgdXNpbmcgYWxwaGEsIHplcm8gZm9yIG5vdCB1c2luZy4KKy8vICAgICAgICAgIHdpZHRoICAgICAgIC0gICBOdW1iZXIgb2YgcGl4ZWxzIGluIGEgaG9yaXpvbnRhbCBsaW5lIG9mIHRoZSBiaXRtYXAuCisvLyAgICAgICAgICBNdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgorLy8gICAgICAgICAgaGVpZ2h0ICAgICAgLSAgIE51bWJlciBvZiBwaXhlbHMgaW4gYSB2ZXJ0aWNhbCBsaW5lIG9mIHRoZSBiaXRtYXAuCisvLyAgICAgICAgICBNdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgorLy8gICAgICAgICAgYWxwaGEgICAgICAgLSAgIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYWxwaGEgY2hhbm5lbCBpcyB1c2VkLgorLy8gICAgICAgICAgTm9uLXplcm8gZm9yIHVzaW5nIGFscGhhLCB6ZXJvIGZvciBub3QgdXNpbmcuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBUaGUgY3JlYXRlZCBiaXRtYXAgaGFuZGxlLCBvciBOVUxMIGlmIHBhcmFtZXRlciBlcnJvciBvciBvdXQgb2YgbWVtb3J5LgorLy8gICAgICAgICAgVGhlIGNyZWF0ZWQgYml0bWFwIGhhbmRsZSwgb3IgTlVMTCBpZiBwYXJhbWV0ZXIgZXJyb3Igb3Igb3V0IG9mCisvLyAgICAgICAgICBtZW1vcnkuCiAvLyBDb21tZW50czoKLS8vICAgICAgICAgIEFuIEZYRElCIGFsd2F5cyB1c2UgNCBieXRlIHBlciBwaXhlbC4gVGhlIGZpcnN0IGJ5dGUgb2YgYSBwaXhlbCBpcyBhbHdheXMgZG91YmxlIHdvcmQgYWxpZ25lZC4KLS8vICAgICAgICAgIEVhY2ggcGl4ZWwgY29udGFpbnMgcmVkIChSKSwgZ3JlZW4gKEcpLCBibHVlIChCKSBhbmQgb3B0aW9uYWxseSBhbHBoYSAoQSkgdmFsdWVzLgotLy8gICAgICAgICAgVGhlIGJ5dGUgb3JkZXIgaXMgQkdSeCAodGhlIGxhc3QgYnl0ZSB1bnVzZWQgaWYgbm8gYWxwaGEgY2hhbm5lbCkgb3IgQkdSQS4KKy8vICAgICAgICAgIEFuIEZYRElCIGFsd2F5cyB1c2UgNCBieXRlIHBlciBwaXhlbC4gVGhlIGZpcnN0IGJ5dGUgb2YgYSBwaXhlbCBpcworLy8gICAgICAgICAgYWx3YXlzIGRvdWJsZSB3b3JkIGFsaWduZWQuCisvLyAgICAgICAgICBFYWNoIHBpeGVsIGNvbnRhaW5zIHJlZCAoUiksIGdyZWVuIChHKSwgYmx1ZSAoQikgYW5kIG9wdGlvbmFsbHkKKy8vICAgICAgICAgIGFscGhhIChBKSB2YWx1ZXMuCisvLyAgICAgICAgICBUaGUgYnl0ZSBvcmRlciBpcyBCR1J4ICh0aGUgbGFzdCBieXRlIHVudXNlZCBpZiBubyBhbHBoYSBjaGFubmVsKSBvcgorLy8gICAgICAgICAgQkdSQS4KIC8vCi0vLyAgICAgICAgICBUaGUgcGl4ZWxzIGluIGEgaG9yaXpvbnRhbCBsaW5lIChhbHNvIGNhbGxlZCBzY2FuIGxpbmUpIGFyZSBzdG9yZWQgc2lkZSBieSBzaWRlLCB3aXRoIGxlZnQgbW9zdAotLy8gICAgICAgICAgcGl4ZWwgc3RvcmVkIGZpcnN0ICh3aXRoIGxvd2VyIG1lbW9yeSBhZGRyZXNzKS4gRWFjaCBzY2FuIGxpbmUgdXNlcyB3aWR0aCo0IGJ5dGVzLgorLy8gICAgICAgICAgVGhlIHBpeGVscyBpbiBhIGhvcml6b250YWwgbGluZSAoYWxzbyBjYWxsZWQgc2NhbiBsaW5lKSBhcmUgc3RvcmVkCisvLyAgICAgICAgICBzaWRlIGJ5IHNpZGUsIHdpdGggbGVmdCBtb3N0CisvLyAgICAgICAgICBwaXhlbCBzdG9yZWQgZmlyc3QgKHdpdGggbG93ZXIgbWVtb3J5IGFkZHJlc3MpLiBFYWNoIHNjYW4gbGluZSB1c2VzCisvLyAgICAgICAgICB3aWR0aCo0IGJ5dGVzLgogLy8KLS8vICAgICAgICAgIFNjYW4gbGluZXMgYXJlIHN0b3JlZCBvbmUgYWZ0ZXIgYW5vdGhlciwgd2l0aCB0b3AgbW9zdCBzY2FuIGxpbmUgc3RvcmVkIGZpcnN0LiBUaGVyZSBpcyBubyBnYXAKKy8vICAgICAgICAgIFNjYW4gbGluZXMgYXJlIHN0b3JlZCBvbmUgYWZ0ZXIgYW5vdGhlciwgd2l0aCB0b3AgbW9zdCBzY2FuIGxpbmUKKy8vICAgICAgICAgIHN0b3JlZCBmaXJzdC4gVGhlcmUgaXMgbm8gZ2FwCiAvLyAgICAgICAgICBiZXR3ZWVuIGFkamFjZW50IHNjYW4gbGluZXMuCiAvLwotLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgZW5vdWdoIG1lbW9yeSBmb3IgaG9sZGluZyBhbGwgcGl4ZWxzIGluIHRoZSBiaXRtYXAsIGJ1dCBpdCBkb2Vzbid0Ci0vLyAgICAgICAgICBpbml0aWFsaXplIHRoZSBidWZmZXIuIEFwcGxpY2F0aW9ucyBjYW4gdXNlIEZQREZCaXRtYXBfRmlsbFJlY3QgdG8gZmlsbCB0aGUgYml0bWFwIHVzaW5nIGFueSBjb2xvci4KLURMTEVYUE9SVCBGUERGX0JJVE1BUCBTVERDQUxMIEZQREZCaXRtYXBfQ3JlYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGFscGhhKTsKKy8vICAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGVub3VnaCBtZW1vcnkgZm9yIGhvbGRpbmcgYWxsIHBpeGVscyBpbiB0aGUKKy8vICAgICAgICAgIGJpdG1hcCwgYnV0IGl0IGRvZXNuJ3QKKy8vICAgICAgICAgIGluaXRpYWxpemUgdGhlIGJ1ZmZlci4gQXBwbGljYXRpb25zIGNhbiB1c2UgRlBERkJpdG1hcF9GaWxsUmVjdCB0bworLy8gICAgICAgICAgZmlsbCB0aGUgYml0bWFwIHVzaW5nIGFueSBjb2xvci4KK0RMTEVYUE9SVCBGUERGX0JJVE1BUCBTVERDQUxMIEZQREZCaXRtYXBfQ3JlYXRlKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEpOwogCiAvLyBNb3JlIERJQiBmb3JtYXRzCi0jZGVmaW5lIEZQREZCaXRtYXBfR3JheSAgICAgMSAgICAgICAvLyBHcmF5IHNjYWxlIGJpdG1hcCwgb25lIGJ5dGUgcGVyIHBpeGVsLgotI2RlZmluZSBGUERGQml0bWFwX0JHUiAgICAgIDIgICAgICAgLy8gMyBieXRlcyBwZXIgcGl4ZWwsIGJ5dGUgb3JkZXI6IGJsdWUsIGdyZWVuLCByZWQuCi0jZGVmaW5lIEZQREZCaXRtYXBfQkdSeCAgICAgMyAgICAgICAvLyA0IGJ5dGVzIHBlciBwaXhlbCwgYnl0ZSBvcmRlcjogYmx1ZSwgZ3JlZW4sIHJlZCwgdW51c2VkLgotI2RlZmluZSBGUERGQml0bWFwX0JHUkEgICAgIDQgICAgICAgLy8gNCBieXRlcyBwZXIgcGl4ZWwsIGJ5dGUgb3JkZXI6IGJsdWUsIGdyZWVuLCByZWQsIGFscGhhLgorI2RlZmluZSBGUERGQml0bWFwX0dyYXkgMSAgLy8gR3JheSBzY2FsZSBiaXRtYXAsIG9uZSBieXRlIHBlciBwaXhlbC4KKyNkZWZpbmUgRlBERkJpdG1hcF9CR1IgMiAgIC8vIDMgYnl0ZXMgcGVyIHBpeGVsLCBieXRlIG9yZGVyOiBibHVlLCBncmVlbiwgcmVkLgorI2RlZmluZSBGUERGQml0bWFwX0JHUnggXAorICAzICAvLyA0IGJ5dGVzIHBlciBwaXhlbCwgYnl0ZSBvcmRlcjogYmx1ZSwgZ3JlZW4sIHJlZCwgdW51c2VkLgorI2RlZmluZSBGUERGQml0bWFwX0JHUkEgXAorICA0ICAvLyA0IGJ5dGVzIHBlciBwaXhlbCwgYnl0ZSBvcmRlcjogYmx1ZSwgZ3JlZW4sIHJlZCwgYWxwaGEuCiAKIC8vIEZ1bmN0aW9uOiBGUERGQml0bWFwX0NyZWF0ZUV4CiAvLyAgICAgICAgICBDcmVhdGUgYSBGb3hpdCBEZXZpY2UgSW5kZXBlbmRlbnQgQml0bWFwIChGWERJQikKIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICB3aWR0aCAgICAgICAtICAgTnVtYmVyIG9mIHBpeGVscyBpbiBhIGhvcml6b250YWwgbGluZSBvZiB0aGUgYml0bWFwLiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgotLy8gICAgICAgICAgaGVpZ2h0ICAgICAgLSAgIE51bWJlciBvZiBwaXhlbHMgaW4gYSB2ZXJ0aWNhbCBsaW5lIG9mIHRoZSBiaXRtYXAuIE11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCi0vLyAgICAgICAgICBmb3JtYXQgICAgICAtICAgQSBudW1iZXIgaW5kaWNhdGluZyBmb3IgYml0bWFwIGZvcm1hdCwgYXMgZGVmaW5lZCBhYm92ZS4KLS8vICAgICAgICAgIGZpcnN0X3NjYW4gIC0gICBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgZmlyc3Qgc2NhbiBsaW5lLCBmb3IgZXh0ZXJuYWwgYnVmZmVyCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgb25seS4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgTlVMTCwgdGhlbiB0aGUgU0RLIHdpbGwgY3JlYXRlIGl0cyBvd24gYnVmZmVyLgotLy8gICAgICAgICAgc3RyaWRlICAgICAgLSAgIE51bWJlciBvZiBieXRlcyBmb3IgZWFjaCBzY2FuIGxpbmUsIGZvciBleHRlcm5hbCBidWZmZXIgb25seS4uCisvLyAgICAgICAgICB3aWR0aCAgICAgICAtICAgTnVtYmVyIG9mIHBpeGVscyBpbiBhIGhvcml6b250YWwgbGluZSBvZiB0aGUgYml0bWFwLgorLy8gICAgICAgICAgTXVzdCBiZSBncmVhdGVyIHRoYW4gMC4KKy8vICAgICAgICAgIGhlaWdodCAgICAgIC0gICBOdW1iZXIgb2YgcGl4ZWxzIGluIGEgdmVydGljYWwgbGluZSBvZiB0aGUgYml0bWFwLgorLy8gICAgICAgICAgTXVzdCBiZSBncmVhdGVyIHRoYW4gMC4KKy8vICAgICAgICAgIGZvcm1hdCAgICAgIC0gICBBIG51bWJlciBpbmRpY2F0aW5nIGZvciBiaXRtYXAgZm9ybWF0LCBhcyBkZWZpbmVkCisvLyAgICAgICAgICBhYm92ZS4KKy8vICAgICAgICAgIGZpcnN0X3NjYW4gIC0gICBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgZmlyc3Qgc2NhbiBsaW5lLCBmb3IKKy8vICAgICAgICAgIGV4dGVybmFsIGJ1ZmZlcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkuIElmIHRoaXMgcGFyYW1ldGVyIGlzIE5VTEwsIHRoZW4gdGhlIFNESyB3aWxsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlIGl0cyBvd24gYnVmZmVyLgorLy8gICAgICAgICAgc3RyaWRlICAgICAgLSAgIE51bWJlciBvZiBieXRlcyBmb3IgZWFjaCBzY2FuIGxpbmUsIGZvciBleHRlcm5hbAorLy8gICAgICAgICAgYnVmZmVyIG9ubHkuLgogLy8gUmV0dXJuIHZhbHVlOgotLy8gICAgICAgICAgVGhlIGNyZWF0ZWQgYml0bWFwIGhhbmRsZSwgb3IgTlVMTCBpZiBwYXJhbWV0ZXIgZXJyb3Igb3Igb3V0IG9mIG1lbW9yeS4KKy8vICAgICAgICAgIFRoZSBjcmVhdGVkIGJpdG1hcCBoYW5kbGUsIG9yIE5VTEwgaWYgcGFyYW1ldGVyIGVycm9yIG9yIG91dCBvZgorLy8gICAgICAgICAgbWVtb3J5LgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBTaW1pbGFyIHRvIEZQREZCaXRtYXBfQ3JlYXRlIGZ1bmN0aW9uLCB3aXRoIG1vcmUgZm9ybWF0cyBhbmQgZXh0ZXJuYWwgYnVmZmVyIHN1cHBvcnRlZC4KLS8vICAgICAgICAgIEJpdG1hcCBjcmVhdGVkIGJ5IHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgaW4gYW55IHBsYWNlIHRoYXQgYSBGUERGX0JJVE1BUCBoYW5kbGUgaXMKKy8vICAgICAgICAgIFNpbWlsYXIgdG8gRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24sIHdpdGggbW9yZSBmb3JtYXRzIGFuZAorLy8gICAgICAgICAgZXh0ZXJuYWwgYnVmZmVyIHN1cHBvcnRlZC4KKy8vICAgICAgICAgIEJpdG1hcCBjcmVhdGVkIGJ5IHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgaW4gYW55IHBsYWNlIHRoYXQgYQorLy8gICAgICAgICAgRlBERl9CSVRNQVAgaGFuZGxlIGlzCiAvLyAgICAgICAgICByZXF1aXJlZC4KIC8vCi0vLyAgICAgICAgICBJZiBleHRlcm5hbCBzY2FubGluZSBidWZmZXIgaXMgdXNlZCwgdGhlbiB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGRlc3Ryb3kgdGhlIGJ1ZmZlcgorLy8gICAgICAgICAgSWYgZXh0ZXJuYWwgc2NhbmxpbmUgYnVmZmVyIGlzIHVzZWQsIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHNob3VsZAorLy8gICAgICAgICAgZGVzdHJveSB0aGUgYnVmZmVyCiAvLyAgICAgICAgICBieSBpdHNlbGYuIEZQREZCaXRtYXBfRGVzdHJveSBmdW5jdGlvbiB3aWxsIG5vdCBkZXN0cm95IHRoZSBidWZmZXIuCiAvLwotRExMRVhQT1JUIEZQREZfQklUTUFQIFNURENBTEwgRlBERkJpdG1hcF9DcmVhdGVFeChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIHZvaWQqIGZpcnN0X3NjYW4sIGludCBzdHJpZGUpOworRExMRVhQT1JUIEZQREZfQklUTUFQIFNURENBTEwgRlBERkJpdG1hcF9DcmVhdGVFeChpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGZpcnN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpOwogCiAvLyBGdW5jdGlvbjogRlBERkJpdG1hcF9GaWxsUmVjdAogLy8gICAgICAgICAgRmlsbCBhIHJlY3RhbmdsZSBhcmVhIGluIGFuIEZYRElCLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBUaGUgaGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlIGZ1bmN0aW9uLgotLy8gICAgICAgICAgbGVmdCAgICAgICAgLSAgIFRoZSBsZWZ0IHNpZGUgcG9zaXRpb24uIFN0YXJ0aW5nIGZyb20gMCBhdCB0aGUgbGVmdC1tb3N0IHBpeGVsLgotLy8gICAgICAgICAgdG9wICAgICAgICAgLSAgIFRoZSB0b3Agc2lkZSBwb3NpdGlvbi4gU3RhcnRpbmcgZnJvbSAwIGF0IHRoZSB0b3AtbW9zdCBzY2FuIGxpbmUuCisvLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgVGhlIGhhbmRsZSB0byB0aGUgYml0bWFwLiBSZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24uCisvLyAgICAgICAgICBsZWZ0ICAgICAgICAtICAgVGhlIGxlZnQgc2lkZSBwb3NpdGlvbi4gU3RhcnRpbmcgZnJvbSAwIGF0IHRoZQorLy8gICAgICAgICAgbGVmdC1tb3N0IHBpeGVsLgorLy8gICAgICAgICAgdG9wICAgICAgICAgLSAgIFRoZSB0b3Agc2lkZSBwb3NpdGlvbi4gU3RhcnRpbmcgZnJvbSAwIGF0IHRoZQorLy8gICAgICAgICAgdG9wLW1vc3Qgc2NhbiBsaW5lLgogLy8gICAgICAgICAgd2lkdGggICAgICAgLSAgIE51bWJlciBvZiBwaXhlbHMgdG8gYmUgZmlsbGVkIGluIGVhY2ggc2NhbiBsaW5lLgogLy8gICAgICAgICAgaGVpZ2h0ICAgICAgLSAgIE51bWJlciBvZiBzY2FuIGxpbmVzIHRvIGJlIGZpbGxlZC4KLS8vICAgICAgICAgIGNvbG9yICAgICAgIC0gICBBIDMyLWJpdCB2YWx1ZSBzcGVjaWZpbmcgdGhlIGNvbG9yLCBpbiA4ODg4IEFSR0IgZm9ybWF0LgorLy8gICAgICAgICAgY29sb3IgICAgICAgLSAgIEEgMzItYml0IHZhbHVlIHNwZWNpZmluZyB0aGUgY29sb3IsIGluIDg4ODggQVJHQgorLy8gICAgICAgICAgZm9ybWF0LgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KIC8vIENvbW1lbnRzOgotLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiBzZXQgdGhlIGNvbG9yIGFuZCAob3B0aW9uYWxseSkgYWxwaGEgdmFsdWUgaW4gc3BlY2lmaWVkIHJlZ2lvbiBvZiB0aGUgYml0bWFwLgotLy8gICAgICAgICAgTk9URTogSWYgYWxwaGEgY2hhbm5lbCBpcyB1c2VkLCB0aGlzIGZ1bmN0aW9uIGRvZXMgTk9UIGNvbXBvc2l0ZSB0aGUgYmFja2dyb3VuZCB3aXRoIHRoZSBzb3VyY2UgY29sb3IsCi0vLyAgICAgICAgICBpbnN0ZWFkIHRoZSBiYWNrZ3JvdW5kIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHNvdXJjZSBjb2xvciBhbmQgYWxwaGEuCisvLyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHNldCB0aGUgY29sb3IgYW5kIChvcHRpb25hbGx5KSBhbHBoYSB2YWx1ZSBpbgorLy8gICAgICAgICAgc3BlY2lmaWVkIHJlZ2lvbiBvZiB0aGUgYml0bWFwLgorLy8gICAgICAgICAgTk9URTogSWYgYWxwaGEgY2hhbm5lbCBpcyB1c2VkLCB0aGlzIGZ1bmN0aW9uIGRvZXMgTk9UIGNvbXBvc2l0ZSB0aGUKKy8vICAgICAgICAgIGJhY2tncm91bmQgd2l0aCB0aGUgc291cmNlIGNvbG9yLAorLy8gICAgICAgICAgaW5zdGVhZCB0aGUgYmFja2dyb3VuZCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBzb3VyY2UgY29sb3IgYW5kCisvLyAgICAgICAgICBhbHBoYS4KIC8vICAgICAgICAgIElmIGFscGhhIGNoYW5uZWwgaXMgbm90IHVzZWQsIHRoZSAiYWxwaGEiIHBhcmFtZXRlciBpcyBpZ25vcmVkLgogLy8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERkJpdG1hcF9GaWxsUmVjdChGUERGX0JJVE1BUCBiaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZQREZfRFdPUkQgY29sb3IpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGQml0bWFwX0ZpbGxSZWN0KEZQREZfQklUTUFQIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgY29sb3IpOwogCiAvLyBGdW5jdGlvbjogRlBERkJpdG1hcF9HZXRCdWZmZXIKIC8vICAgICAgICAgIEdldCBkYXRhIGJ1ZmZlciBvZiBhbiBGWERJQgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGJpdG1hcC4gUmV0dXJuZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24uCisvLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlCisvLyAgICAgICAgICBmdW5jdGlvbi4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBiaXRtYXAgYnVmZmVyLgogLy8gQ29tbWVudHM6CiAvLyAgICAgICAgICBUaGUgc3RyaWRlIG1heSBiZSBtb3JlIHRoYW4gd2lkdGggKiBudW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsCi0vLyAgICAgICAgICBBcHBsaWNhdGlvbnMgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGdldCB0aGUgYml0bWFwIGJ1ZmZlciBwb2ludGVyLCB0aGVuIG1hbmlwdWxhdGUgYW55IGNvbG9yCisvLyAgICAgICAgICBBcHBsaWNhdGlvbnMgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGdldCB0aGUgYml0bWFwIGJ1ZmZlciBwb2ludGVyLAorLy8gICAgICAgICAgdGhlbiBtYW5pcHVsYXRlIGFueSBjb2xvcgogLy8gICAgICAgICAgYW5kL29yIGFscGhhIHZhbHVlcyBmb3IgYW55IHBpeGVscyBpbiB0aGUgYml0bWFwLgogRExMRVhQT1JUIHZvaWQqIFNURENBTEwgRlBERkJpdG1hcF9HZXRCdWZmZXIoRlBERl9CSVRNQVAgYml0bWFwKTsKIAogLy8gRnVuY3Rpb246IEZQREZCaXRtYXBfR2V0V2lkdGgKIC8vICAgICAgICAgIEdldCB3aWR0aCBvZiBhbiBGWERJQi4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgYml0bWFwLiBSZXR1cm5lZCBieSBGUERGQml0bWFwX0NyZWF0ZQorLy8gICAgICAgICAgZnVuY3Rpb24uCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUaGUgbnVtYmVyIG9mIHBpeGVscyBpbiBhIGhvcml6b250YWwgbGluZSBvZiB0aGUgYml0bWFwLgogRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZCaXRtYXBfR2V0V2lkdGgoRlBERl9CSVRNQVAgYml0bWFwKTsKQEAgLTY0Niw3ICs4MDksOCBAQAogLy8gRnVuY3Rpb246IEZQREZCaXRtYXBfR2V0SGVpZ2h0CiAvLyAgICAgICAgICBHZXQgaGVpZ2h0IG9mIGFuIEZYRElCLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGJpdG1hcC4gUmV0dXJuZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24uCisvLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlCisvLyAgICAgICAgICBmdW5jdGlvbi4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBudW1iZXIgb2YgcGl4ZWxzIGluIGEgdmVydGljYWwgbGluZSBvZiB0aGUgYml0bWFwLgogRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZCaXRtYXBfR2V0SGVpZ2h0KEZQREZfQklUTUFQIGJpdG1hcCk7CkBAIC02NTQsNyArODE4LDggQEAKIC8vIEZ1bmN0aW9uOiBGUERGQml0bWFwX0dldFN0cmlkZQogLy8gICAgICAgICAgR2V0IG51bWJlciBvZiBieXRlcyBmb3IgZWFjaCBzY2FuIGxpbmUgaW4gdGhlIGJpdG1hcCBidWZmZXIuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgYml0bWFwLiBSZXR1cm5lZCBieSBGUERGQml0bWFwX0NyZWF0ZSBmdW5jdGlvbi4KKy8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGJpdG1hcC4gUmV0dXJuZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUKKy8vICAgICAgICAgIGZ1bmN0aW9uLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyBmb3IgZWFjaCBzY2FuIGxpbmUgaW4gdGhlIGJpdG1hcCBidWZmZXIuCiAvLyBDb21tZW50czoKQEAgLTY2NCw3ICs4MjksOCBAQAogLy8gRnVuY3Rpb246IEZQREZCaXRtYXBfRGVzdHJveQogLy8gICAgICAgICAgRGVzdHJveSBhbiBGWERJQiBhbmQgcmVsZWFzZSBhbGwgcmVsYXRlZCBidWZmZXJzLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGJpdG1hcC4gUmV0dXJuZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24uCisvLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlCisvLyAgICAgICAgICBmdW5jdGlvbi4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLyBDb21tZW50czoKQEAgLTY3OSw3ICs4NDUsOCBAQAogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KIC8vCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9WSUVXRVJSRUZfR2V0UHJpbnRTY2FsaW5nKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGUERGX1ZJRVdFUlJFRl9HZXRQcmludFNjYWxpbmcoRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX1ZJRVdFUlJFRl9HZXROdW1Db3BpZXMKIC8vICAgICAgICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBjb3BpZXMgdG8gYmUgcHJpbnRlZC4KQEAgLTY5NywxNiArODY0LDE5IEBACiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUaGUgcHJpbnQgcGFnZSByYW5nZSB0byBiZSB1c2VkIGZvciBwcmludGluZy4KIC8vCi1ETExFWFBPUlQgRlBERl9QQUdFUkFOR0UgU1REQ0FMTCBGUERGX1ZJRVdFUlJFRl9HZXRQcmludFBhZ2VSYW5nZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKK0RMTEVYUE9SVCBGUERGX1BBR0VSQU5HRSBTVERDQUxMCitGUERGX1ZJRVdFUlJFRl9HZXRQcmludFBhZ2VSYW5nZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAogLy8gRnVuY3Rpb246IEZQREZfVklFV0VSUkVGX0dldER1cGxleAotLy8gICAgICAgICAgUmV0dXJucyB0aGUgcGFwZXIgaGFuZGxpbmcgb3B0aW9uIHRvIGJlIHVzZWQgd2hlbiBwcmludGluZyBmcm9tIHByaW50IGRpYWxvZy4KKy8vICAgICAgICAgIFJldHVybnMgdGhlIHBhcGVyIGhhbmRsaW5nIG9wdGlvbiB0byBiZSB1c2VkIHdoZW4gcHJpbnRpbmcgZnJvbQorLy8gICAgICAgICAgcHJpbnQgZGlhbG9nLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGxvYWRlZCBkb2N1bWVudC4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBwYXBlciBoYW5kbGluZyBvcHRpb24gdG8gYmUgdXNlZCB3aGVuIHByaW50aW5nLgogLy8KLURMTEVYUE9SVCBGUERGX0RVUExFWFRZUEUgU1REQ0FMTCBGUERGX1ZJRVdFUlJFRl9HZXREdXBsZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CitETExFWFBPUlQgRlBERl9EVVBMRVhUWVBFIFNURENBTEwKK0ZQREZfVklFV0VSUkVGX0dldER1cGxleChGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAogLy8gRnVuY3Rpb246IEZQREZfQ291bnROYW1lZERlc3RzCiAvLyAgICAgICAgICBHZXQgdGhlIGNvdW50IG9mIG5hbWVkIGRlc3RpbmF0aW9ucyBpbiB0aGUgUERGIGRvY3VtZW50LgpAQCAtNzI0LDI0ICs4OTQsMzMgQEAKIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBoYW5kbGUgb2YgdGhlIGRlc3QuCiAvLwotRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZfR2V0TmFtZWREZXN0QnlOYW1lKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQllURVNUUklORyBuYW1lKTsKK0RMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGX0dldE5hbWVkRGVzdEJ5TmFtZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBuYW1lKTsKIAogLy8gRnVuY3Rpb246IEZQREZfR2V0TmFtZWREZXN0CiAvLyAgICAgICAgICBHZXQgdGhlIHNwZWNpZmllZCBuYW1lZCBkZXN0aW5hdGlvbnMgb2YgdGhlIFBERiBkb2N1bWVudCBieSBpbmRleC4KIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBhIGRvY3VtZW50CiAvLyAgICAgICAgICBpbmRleCAgICAgICAgICAgLSAgIFRoZSBpbmRleCBvZiBuYW1lZCBkZXN0aW5hdGlvbi4KLS8vICAgICAgICAgIGJ1ZmZlciAgICAgICAgICAtICAgVGhlIGJ1ZmZlciB0byBvYnRhaW4gZGVzdGluYXRpb24gbmFtZSwgdXNlZCBhcyB3Y2hhcl90Ki4KLS8vICAgICAgICAgIGJ1ZmxlbiBbaW4vb3V0XSAtICAgU2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzIG9uIGlucHV0LCBsZW5ndGggb2YgdGhlIHJlc3VsdCBpbiBieXRlcyBvbiBvdXRwdXQgb3IgLTEgaWYgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwuCisvLyAgICAgICAgICBidWZmZXIgICAgICAgICAgLSAgIFRoZSBidWZmZXIgdG8gb2J0YWluIGRlc3RpbmF0aW9uIG5hbWUsIHVzZWQgYXMKKy8vICAgICAgICAgIHdjaGFyX3QqLgorLy8gICAgICAgICAgYnVmbGVuIFtpbi9vdXRdIC0gICBTaXplIG9mIHRoZSBidWZmZXIgaW4gYnl0ZXMgb24gaW5wdXQsIGxlbmd0aCBvZgorLy8gICAgICAgICAgdGhlIHJlc3VsdCBpbiBieXRlcyBvbiBvdXRwdXQgb3IgLTEgaWYgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBUaGUgZGVzdGluYXRpb24gaGFuZGxlIG9mIGEgbmFtZWQgZGVzdGluYXRpb24sIG9yIE5VTEwgaWYgbm8gbmFtZWQgZGVzdGluYXRpb24gY29ycmVzcG9uZGluZyB0byB8aW5kZXh8LgorLy8gICAgICAgICAgVGhlIGRlc3RpbmF0aW9uIGhhbmRsZSBvZiBhIG5hbWVkIGRlc3RpbmF0aW9uLCBvciBOVUxMIGlmIG5vIG5hbWVkCisvLyAgICAgICAgICBkZXN0aW5hdGlvbiBjb3JyZXNwb25kaW5nIHRvIHxpbmRleHwuCiAvLyBDb21tZW50czoKIC8vICAgICAgICAgIENhbGwgdGhpcyBmdW5jdGlvbiB0d2ljZSB0byBnZXQgdGhlIG5hbWUgb2YgdGhlIG5hbWVkIGRlc3RpbmF0aW9uOgogLy8gICAgICAgICAgMSkgRmlyc3QgdGltZSBwYXNzIGluIHxidWZmZXJ8IGFzIE5VTEwgYW5kIGdldCBidWZsZW4uCi0vLyAgICAgICAgICAyKSBTZWNvbmQgdGltZSBwYXNzIGluIGFsbG9jYXRlZCB8YnVmZmVyfCBhbmQgYnVmbGVuIHRvIHJldHJpZXZlIHxidWZmZXJ8LCB3aGljaCBzaG91bGQgYmUgdXNlZCBhcyB3Y2hhcl90Ki4KLS8vICAgICAgICAgICAgIElmIGJ1ZmxlbiBpcyBub3Qgc3VmZmljaWVudGx5IGxhcmdlLCBpdCB3aWxsIGJlIHNldCB0byAtMSB1cG9uIHJldHVybi4KKy8vICAgICAgICAgIDIpIFNlY29uZCB0aW1lIHBhc3MgaW4gYWxsb2NhdGVkIHxidWZmZXJ8IGFuZCBidWZsZW4gdG8gcmV0cmlldmUKKy8vICAgICAgICAgIHxidWZmZXJ8LCB3aGljaCBzaG91bGQgYmUgdXNlZCBhcyB3Y2hhcl90Ki4KKy8vICAgICAgICAgICAgIElmIGJ1ZmxlbiBpcyBub3Qgc3VmZmljaWVudGx5IGxhcmdlLCBpdCB3aWxsIGJlIHNldCB0byAtMSB1cG9uCisvLyAgICAgICAgICAgICByZXR1cm4uCiAvLwotRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZfR2V0TmFtZWREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBpbmRleCwgdm9pZCogYnVmZmVyLCBsb25nKiBidWZsZW4pOworRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZfR2V0TmFtZWREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nKiBidWZsZW4pOwogCiAvLyBGdW5jdGlvbjogRlBERl9CU3RyX0luaXQKIC8vICAgICAgICAgIEhlbHBlciBmdW5jdGlvbiB0byBpbml0aWFsaXplIGEgYnl0ZSBzdHJpbmcuCkBAIC03NDksNyArOTI4LDkgQEAKIAogLy8gRnVuY3Rpb246IEZQREZfQlN0cl9TZXQKIC8vICAgICAgICAgIEhlbHBlciBmdW5jdGlvbiB0byBzZXQgc3RyaW5nIGRhdGEuCi1ETExFWFBPUlQgRlBERl9SRVNVTFQgU1REQ0FMTCBGUERGX0JTdHJfU2V0KEZQREZfQlNUUiogc3RyLCBGUERGX0xQQ1NUUiBic3RyLCBpbnQgbGVuZ3RoKTsKK0RMTEVYUE9SVCBGUERGX1JFU1VMVCBTVERDQUxMIEZQREZfQlN0cl9TZXQoRlBERl9CU1RSKiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfTFBDU1RSIGJzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpOwogCiAvLyBGdW5jdGlvbjogRlBERl9CU3RyX0NsZWFyCiAvLyAgICAgICAgICBIZWxwZXIgZnVuY3Rpb24gdG8gY2xlYXIgYSBieXRlIHN0cmluZy4K