LyogY2FjaGUuaCAtIGRlZmluaXRpb25zIGZvciB0aGUgTFJVIGNhY2hlDQogKg0KICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPg0KICoNCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLg0KICoNCiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkDQogKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzDQogKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLg0KICoNCiAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLA0KICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdA0KICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOg0KICoNCiAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90DQogKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQ0KICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlDQogKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLg0KICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUNCiAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4NCiAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uDQogKi8NCg0KI2lmbmRlZiBQWVNRTElURV9DQUNIRV9IDQojZGVmaW5lIFBZU1FMSVRFX0NBQ0hFX0gNCiNpbmNsdWRlICJQeXRob24uaCINCg0KLyogVGhlIExSVSBjYWNoZSBpcyBpbXBsZW1lbnRlZCBhcyBhIGNvbWJpbmF0aW9uIG9mIGEgZG91Ymx5LWxpbmtlZCB3aXRoIGENCiAqIGRpY3Rpb25hcnkuIFRoZSBsaXN0IGl0ZW1zIGFyZSBvZiB0eXBlICdOb2RlJyBhbmQgdGhlIGRpY3Rpb25hcnkgaGFzIHRoZQ0KICogbm9kZXMgYXMgdmFsdWVzLiAqLw0KDQp0eXBlZGVmIHN0cnVjdCBfcHlzcWxpdGVfTm9kZQ0Kew0KICAgIFB5T2JqZWN0X0hFQUQNCiAgICBQeU9iamVjdCoga2V5Ow0KICAgIFB5T2JqZWN0KiBkYXRhOw0KICAgIGxvbmcgY291bnQ7DQogICAgc3RydWN0IF9weXNxbGl0ZV9Ob2RlKiBwcmV2Ow0KICAgIHN0cnVjdCBfcHlzcWxpdGVfTm9kZSogbmV4dDsNCn0gcHlzcWxpdGVfTm9kZTsNCg0KdHlwZWRlZiBzdHJ1Y3QNCnsNCiAgICBQeU9iamVjdF9IRUFEDQogICAgaW50IHNpemU7DQoNCiAgICAvKiBhIGRpY3Rpb25hcnkgbWFwcGluZyBrZXlzIHRvIE5vZGUgZW50cmllcyAqLw0KICAgIFB5T2JqZWN0KiBtYXBwaW5nOw0KDQogICAgLyogdGhlIGZhY3RvcnkgY2FsbGFibGUgKi8NCiAgICBQeU9iamVjdCogZmFjdG9yeTsNCg0KICAgIHB5c3FsaXRlX05vZGUqIGZpcnN0Ow0KICAgIHB5c3FsaXRlX05vZGUqIGxhc3Q7DQoNCiAgICAvKiBpZiBzZXQsIGRlY3JlbWVudCB0aGUgZmFjdG9yeSBmdW5jdGlvbiB3aGVuIHRoZSBDYWNoZSBpcyBkZWFsbG9jYXRlZC4NCiAgICAgKiB0aGlzIGlzIGFsbW9zdCBhbHdheXMgZGVzaXJhYmxlLCBidXQgbm90IGluIHRoZSBweXNxbGl0ZSBjb250ZXh0ICovDQogICAgaW50IGRlY3JlZl9mYWN0b3J5Ow0KfSBweXNxbGl0ZV9DYWNoZTsNCg0KZXh0ZXJuIFB5VHlwZU9iamVjdCBweXNxbGl0ZV9Ob2RlVHlwZTsNCmV4dGVybiBQeVR5cGVPYmplY3QgcHlzcWxpdGVfQ2FjaGVUeXBlOw0KDQppbnQgcHlzcWxpdGVfbm9kZV9pbml0KHB5c3FsaXRlX05vZGUqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKTsNCnZvaWQgcHlzcWxpdGVfbm9kZV9kZWFsbG9jKHB5c3FsaXRlX05vZGUqIHNlbGYpOw0KDQppbnQgcHlzcWxpdGVfY2FjaGVfaW5pdChweXNxbGl0ZV9DYWNoZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpOw0Kdm9pZCBweXNxbGl0ZV9jYWNoZV9kZWFsbG9jKHB5c3FsaXRlX0NhY2hlKiBzZWxmKTsNClB5T2JqZWN0KiBweXNxbGl0ZV9jYWNoZV9nZXQocHlzcWxpdGVfQ2FjaGUqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsNCg0KaW50IHB5c3FsaXRlX2NhY2hlX3NldHVwX3R5cGVzKHZvaWQpOw0KDQojZW5kaWYNCg==