TmFtZQoKICAgIEFNRF9mcmFtZWJ1ZmZlcl9zYW1wbGVfcG9zaXRpb25zCgpOYW1lIFN0cmluZ3MKCiAgICBHTF9BTURfZnJhbWVidWZmZXJfc2FtcGxlX3Bvc2l0aW9ucwoKQ29udGFjdAoKICAgIE1haXMgQWxuYXNzZXIsIEFNRCAobWFpcy5hbG5hc3NlciAnYXQnIGFtZC5jb20pCgpDb250cmlidXRvcnMKCiAgICBNYWlzIEFsbmFzc2VyLCBBTUQKICAgIEdyYWhhbSBTZWxsZXJzLCBBTUQKClN0YXR1cwoKICAgIFNoaXBwaW5nCgpWZXJzaW9uCgogICAgTGFzdCBNb2RpZmllZCBEYXRlOiAgICAgICAgIDExLzEwLzE2CiAgICBSZXZpc2lvbjogICAgICAgICAgICAgICAgICAgNAoKTnVtYmVyCgogICAgT3BlbkdMIEV4dGVuc2lvbiAjNDU0CgpEZXBlbmRlbmNpZXMKCiAgICBPcGVuR0wgMy4yIGlzIHJlcXVpcmVkLgoKICAgIFRoaXMgc3BlY2lmaWNhdGlvbiBpbnRlcmFjdHMgd2l0aCBFWFRfZGlyZWN0X3N0YXRlX2FjY2Vzcy4KCiAgICBUaGlzIGV4dGVuc2lvbiBpcyB3cml0dGVuIGFnYWluc3QgdGhlIE9wZW5HTCA0LjQgKENvcmUpIHNwZWNpZmljYXRpb24uCgpPdmVydmlldwoKICAgIEluIHVuZXh0ZW5kZWQgR0wsIHRoZSBzdWItcGl4ZWwgbG9hdGlvbnMgb2YgbXVsdGlzYW1wbGVkIHRleHR1cmVzIGFuZAogICAgcmVuZGVyYnVmZmVycyBhcmUgZ2VuZXJhbGx5IGRldGVybWluZWQgaW4gYW4gaW1wbGVtZW50YXRpb24gZGVwZW5kZW50CiAgICBtYW5uZXIuIFNvbWUgYWxnb3JpdGhtcyAtLSBpbiBwYXJ0aWN1bGFyIGN1c3RvbSBhbnRpYWxpYXNpbmcgZnVuY3Rpb25zIC0tCiAgICBkZXBlbmQgb24gdGhlIGtub3dsZWRnZSBvZiwgb3IgZXZlbiByZXF1aXJlIGNvbnRyb2wgb3ZlciB0aGUgcG9zaXRpb25zIG9mCiAgICBzYW1wbGVzIHdpdGhpbiBlYWNoIHBpeGVsLgoKICAgIFRoZSBBTURfc2FtcGxlX3Bvc2l0aW9ucyBleHRlbnNpb24gYWRkZWQgc29tZSBjb250cm9sIG92ZXIgdGhlIHBvc2l0aW9ucwogICAgb2Ygc2FtcGxlcyB3aXRoaW4gYSBzaW5nbGUgZnJhbWVidWZmZXIuIEhvd2V2ZXIsIGl0IGZvcmNlZCBhbGwgcGl4ZWxzCiAgICB3aXRoaW4gYSBmcmFtZWJ1ZmZlciB0byBoYXZlIHRoZSBzZXQgb2Ygc2FtcGxlIHBvc2l0aW9ucy4KCiAgICBUaGlzIGV4dGVuc2lvbiBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBleHBsaWNpdGx5IHNldCBzYW1wbGUgcG9zaXRpb25zIGZvcgogICAgYSBmcmFtZWJ1ZmZlciBvYmplY3Qgd2l0aCBtdWx0aS1zYW1wbGVkIGF0dGFjaG1lbnRzIGluIGEgcmVwZWF0aW5nIHBhdHRlcm4sCiAgICBhbGxvd2luZyBkaWZmZXJlbnQgcGl4ZWxzIHRvIHVzZSBkaWZmZXJlbnQgc3ViLXBpeGVsIGxvY2F0aW9ucyBmb3IgdGhlaXIKICAgIHNhbXBsZXMuIFRoZSBzYW1wbGUgbG9jYXRpb25zIHVzZWQgYnkgdGhlIEZCTyBjYW4gYmUgZml4ZWQgZm9yIGFsbCBwaXhlbHMKICAgIGluIHRoZSBGQk+ScyBhdHRhY2htZW50cyBvciB0aGV5IGNhbiBiZSBmaXhlZCBmb3IgYSBzYW1wbGluZyBwYXR0ZXJuCiAgICBjb21wcmlzZWQgb2YgbXVsdGlwbGUgcGl4ZWxzLCB3aGVyZSB0aGUgc2FtcGxpbmcgcGF0dGVybiBpcyByZXBlYXRlZCBvdmVyCiAgICBhbGwgcGl4ZWxzLiBUaGUgcmF0ZSBvZiByZXBlYXQgb2YgdGhpcyBzYW1wbGluZyBwYXR0ZXJuIHNpemUgaXRzZWxmIGlzCiAgICBmaXhlZCBhbmQgaXMgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LgoKTmV3IFRva2VucwoKICAgIEFjY2VwdGVkIGJ5IHRoZSA8cG5hbWU+IHBhcmFtZXRlciBvZiBHZXRGbG9hdHY6CgogICAgICAgIFNVQlNBTVBMRV9ESVNUQU5DRV9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgzRgoKICAgIEFjY2VwdGVkIGJ5IHRoZSA8cG5hbWU+IHBhcmFtZXRlciBvZiBHZXRJbnRlZ2VydjoKCiAgICAgICAgUElYRUxTX1BFUl9TQU1QTEVfUEFUVEVSTl9YX0FNRCAgICAgICAgICAgICAgICAgMHg5MUFFCiAgICAgICAgUElYRUxTX1BFUl9TQU1QTEVfUEFUVEVSTl9ZX0FNRCAgICAgICAgICAgICAgICAgMHg5MUFGCgogICAgQWNjZXB0ZWQgYnkgdGhlIDxwaXhlbGluZGV4PiBwYXJhbWV0ZXIgb2YgRnJhbWVidWZmZXJTYW1wbGVQb3NpdGlvbnNmdkFNRCwKICAgIE5hbWVkRnJhbWVidWZmZXJTYW1wbGVQb3NpdGlvbnNmdkFNRCwgR2V0RnJhbWVidWZmZXJQYXJhbWV0ZXJmdkFNRAogICAgYW5kIEdldE5hbWVkRnJhbWVidWZmZXJQYXJhbWV0ZXJmdkFNRDoKCiAgICAgICAgQUxMX1BJWEVMU19BTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgoKCk5ldyBQcm9jZWR1cmVzIGFuZCBGdW5jdGlvbnMKCiAgICB2b2lkIEZyYW1lYnVmZmVyU2FtcGxlUG9zaXRpb25zZnZBTUQoZW51bSB0YXJnZXQsIHVpbnQgbnVtc2FtcGxlcywKICAgICAgICB1aW50IHBpeGVsaW5kZXgsIGNvbnN0IGZsb2F0ICp2YWx1ZXMpCgogICAgdm9pZCBOYW1lZEZyYW1lYnVmZmVyU2FtcGxlUG9zaXRpb25zZnZBTUQodWludCBmcmFtZWJ1ZmZlciwKICAgICAgICB1aW50IG51bXNhbXBsZXMsIHVpbnQgcGl4ZWxpbmRleCwgY29uc3QgZmxvYXQgKnZhbHVlcykKCiAgICB2b2lkIEdldEZyYW1lYnVmZmVyUGFyYW1ldGVyZnZBTUQoZW51bSB0YXJnZXQsIGVudW0gcG5hbWUsCiAgICAgICAgdWludCBudW1zYW1wbGVzLCB1aW50IHBpeGVsaW5kZXgsIHNpemVpIHNpemUsIGZsb2F0ICp2YWx1ZXMpCgogICAgdm9pZCBHZXROYW1lZEZyYW1lYnVmZmVyUGFyYW1ldGVyZnZBTUQodWludCBmcmFtZWJ1ZmZlciwKICAgICAgICBlbnVtIHBuYW1lLCB1aW50IG51bXNhbXBsZXMsIHVpbnQgcGl4ZWxpbmRleCwgc2l6ZWkgc2l6ZSwKICAgICAgICBmbG9hdCAqdmFsdWVzKQoKCkFkZGl0aW9ucyB0byBDaGFwdGVyIDkgb2YgdGhlIE9wZW5HTCA0LjQgKENvcmUpIFNwZWNpZmljYXRpb24KKEZyYW1lYnVmZmVycyBhbmQgRnJhbWVidWZmZXIgT2JqZWN0cykKCiAgICBBZGQgc2VjdGlvbiA5LjIuOSwgRnJhbWVidWZmZXIgU2FtcGxlIFBvc2l0aW9ucywgcC4gMjg3CgogICAgU2FtcGxlIGxvY2F0aW9ucyBjYW4gYmUgbW9kaWZpZWQgZm9yIGFsbCBwaXhlbHMgaW4gYSBtdWx0aS1zYW1wbGVkCiAgICBmcmFtZWJ1ZmZlciB1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CgogICAgICAgIHZvaWQgRnJhbWVidWZmZXJTYW1wbGVQb3NpdGlvbnNmdkFNRChlbnVtIHRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludCBudW1zYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50IHBpeGVsaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICp2YWx1ZXMpOwoKICAgIDx0YXJnZXQ+IG11c3QgYmUgRFJBV19GUkFNRUJVRkZFUiwgUkVBRF9GUkFNRUJVRkZFUiwgb3IgRlJBTUVCVUZGRVIuCiAgICA8bnVtc2FtcGxlcz4gaXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHNldCBhbmQgbXVzdCBiZSBncmVhdGVyCiAgICB0aGFuIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgdmFsdWUgb2YgU0FNUExFUy4gVGhlIGVycm9yCiAgICBJTlZBTElEX1ZBTFVFIGlzIGdlbmVyYXRlZCBpZiA8bnVtc2FtcGxlcz4gaXMgb3V0c2lkZSB0aGlzIHJhbmdlLgogICAgPHBpeGVsaW5kZXg+IGlzIHRoZSBpbmRleCBvZiB0aGUgcGl4ZWwgdG8gc2V0IHRoZSBzYW1wbGVzIGZvciBhbmQKICAgIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgYW5kIGxlc3MgdGhhbiB0aGUgcmVzdWx0IG9mIHF1ZXJ5aW5nCiAgICBQSVhFTFNfUEVSX1NBTVBMRV9QQVRURVJOX1hfQU1EIG11bHRpcGxpZWQgYnkgdGhlIHJlc3VsdCBvZgogICAgcXVlcnlpbmcgUElYRUxTX1BFUl9TQU1QTEVfUEFUVEVSTl9ZX0FNRC4gVGhlIHBpeGVscyBhcmUgb3JkZXJlZCBsZWZ0IHRvCiAgICByaWdodCwgdG9wIHRvIGJvdHRvbSwgd2hlcmUgdGhlIG9yaWdpbiBpcyB0aGUgdXBwZXIgbGVmdCBjb3JuZXIuCiAgICA8cGl4ZWxpbmRleD4gbWF5IGFsc28gc3BlY2lmeSBBTExfUElYRUxTX0FNRCwgd2hpY2ggc2V0cyBzYW1wbGVzIG9mIGFsbAogICAgcGl4ZWxzIHRvIHRoZSBzYW1lIHNldCBvZiBsb2NhdGlvbnMuIFRoZSBlcnJvciBJTlZBTElEX1ZBTFVFIGlzIGdlbmVyYXRlZAogICAgaWYgPHBpeGVsaW5kZXg+IGlzIGxlc3MgdGhhbiB6ZXJvIG9yIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUKICAgIHJlc3VsdCBvZiBxdWVyeWluZyBQSVhFTFNfUEVSX1NBTVBMRV9QQVRURVJOX1hfQU1EIG11bHRpcGxpZWQgYnkgdGhlCiAgICByZXN1bHQgb2YgcXVlcnlpbmcgUElYRUxTX1BFUl9TQU1QTEVfUEFUVEVSTl9ZX0FNRCBhbmQgaXMgbm90IGVxdWFsIHRvCiAgICBBTExfUElYRUxTX0FNRC4gVGhlIHNhbXBsZSBsb2NhdGlvbnMgYXJlIHNldCBieSBwYXNzaW5nIGZsb2F0aW5nIHBvaW50CiAgICB2YWx1ZXMgb2YgeCBhbmQgeSBpbiA8dmFsdWVzWzIgKiBpXT4gYW5kIDx2YWx1ZXNbMiAqIGkgKyAxXT4gcmVzcGVjdGl2ZWx5LAogICAgYWxsIGluIHRoZSByYW5nZSBbMC4wLCAxLjApLCBjb3JyZXNwb25kaW5nIHRvIHRoZSA8eD4gYW5kIDx5PiBsb2NhdGlvbnMgaW4KICAgIHBpeGVsIHNwYWNlIG9mIHRoYXQgc2FtcGxlLCByZXNwZWN0aXZlbHkuICgwLjUsIDAuNSkgdGh1cyBjb3JyZXNwb25kcyB0bwogICAgdGhlIHBpeGVsIGNlbnRlci4gVGhlIHJhbmdlIFswLjAsIDAuMSkgaW1wbGllcyB0aGF0IHNhbXBsZSBsb2NhdGlvbnMgY2Fubm90CiAgICBvdmVybGFwIGF0IHBpeGVsIGJvdW5kYXJpZXMuCgogICAgRnJhbWVidWZmZXJTYW1wbGVQb3NpdGlvbnNmdkFNRCBnZW5lcmF0ZXMgYW4gSU5WQUxJRF9PUEVSQVRJT04gZXJyb3IgaWYgdGhlCiAgICBjdXJyZW50bHkgYm91bmQgZnJhbWVidWZmZXIgaXMgaW5jb21wbGV0ZSBvciBpcyB0aGUgZGVmYXVsdCBmcmFtZWJ1ZmZlci4KCiAgICBJZiA8dmFsdWVzPiBpcyBOVUxMLCA8bnVtU2FtcGxlcz4gaXMgaWdub3JlZCBhbmQgYWxsIHNhbXBsZSBwb3NpdGlvbnMgZm9yCiAgICA8cGl4ZWxpbmRleD4gYXJlIHJldHVybmVkIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiBQYXNzaW5nIEFMTF9QSVhFTFNfQU1ECiAgICB0aGVyZWZvcmUgcmVzZXRzIHRoZSBzYW1wbGUgcG9zaXRpb25zIGZvciBhbGwgcGl4ZWxzIGluIHRoZSBzYW1wbGluZwogICAgcGF0dGVybi4KCiAgICBUaGUgc3VicGl4ZWwgcmFuZ2UgWzAsMSkgaXMgZGlzY3JldGl6ZWQgYmFzZWQgb24gdGhlIGltcGxlbWVudGF0aW9uLQogICAgZGVwZW5kZW50IHZhbHVlIG9mIFNVQlNBTVBMRV9ESVNUQU5DRV9BTUQuIEdldEZsb2F0diBjYW4gYmUgdXNlZCB3aXRoCiAgICBTVUJTQU1QTEVfRElTVEFOQ0VfQU1EIGFzIHRoZSBwbmFtZSBwYXJhbWV0ZXIgdG8gcXVlcnkgdGhlIHN1YnBpeGVsCiAgICBwcmVjaXNpb24sIHdoaWNoIGlzIHRoZSBzYW1lIGZvciBib3RoIHRoZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbAogICAgZGlyZWN0aW9ucy4gR2l2ZW4gdHdvIHNhbXBsZSBwb3NpdGlvbnMgKHgwLCB5MCkgYW5kICh4MSwgeTEpLCBvbmUgY2FuIG1ha2UKICAgIHN1cmUgdGhleSBkb24ndCBmYWxsIGluIHRoZSBzYW1lIHN1YnBpeGVsIGlmCgogICAgICAgICAgICBhYnMoeDAgLSB4MSkgPj0gc3NkIGFuZCBhYnMoeTAgLSB5MSkgPj0gc3NkLAoKICAgIHdoZXJlIHNzZCBpcyB0aGUgZmxvYXQgdmFsdWUgcmV0dXJuZWQgd2hlbiBxdWVyeWluZyBTVUJTQU1QTEVfRElTVEFOQ0VfQU1ELgoKICAgIFRoZSBxdWFudGl6ZWQgc2FtcGxlIHBvc2l0aW9ucyBjYW4gYmUgcmV0cmlldmVkIHZpYSB0aGUgbmV3IGVudHJ5IHBvaW50OgoKICAgICAgICB2b2lkIEdldEZyYW1lYnVmZmVyUGFyYW1ldGVyZnZBTUQoZW51bSB0YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQgbnVtc2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludCBwaXhlbGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplaSBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqdmFsdWVzKTsKCiAgICA8dGFyZ2V0PiBtdXN0IGJlIERSQVdfRlJBTUVCVUZGRVIsIFJFQURfRlJBTUVCVUZGRVIsIG9yIEZSQU1FQlVGRkVSLgogICAgRlJBTUVCVUZGRVIgaXMgZXF1aXZhbGVudCB0byBEUkFXX0ZSQU1FQlVGRkVSLiA8cG5hbWU+IG11c3QgYmUKICAgIFNBTVBMRV9QT1NJVElPTlMuIDxudW1zYW1wbGVzPiBpcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gZ2V0IGFuZCBtdXN0CiAgICBiZSBncmVhdGVyIHRoYW4gMCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSB2YWx1ZSBvZiBTQU1QTEVTLiBUaGUKICAgIGVycm9yIElOVkFMSURfVkFMVUUgaXMgZ2VuZXJhdGVkIGlmIDxudW1zYW1wbGVzPiBpcyBvdXRzaWRlIHRoaXMgcmFuZ2UuCiAgICA8cGl4ZWxpbmRleD4gaXMgdGhlIGluZGV4IG9mIHRoZSBwaXhlbCB0byBzZXQgdGhlIHNhbXBsZXMgZm9yIGFuZCBtdXN0IGJlCiAgICBsZXNzIHRoYW4gdGhlIHJlc3VsdCBvZiBxdWVyeWluZyBQSVhFTFNfUEVSX1NBTVBMRV9QQVRURVJOX1hfQU1ECiAgICBtdWx0aXBsaWVkIGJ5IHRoZSByZXN1bHQgb2YgcXVlcnlpbmcgUElYRUxTX1BFUl9TQU1QTEVfUEFUVEVSTl9ZX0FNRC4KICAgIENhbGxpbmcgR2V0RnJhbWVidWZmZXJQYXJhbWV0ZXJmdkFNRCB3aXRoIDxwaXhlbGluZGV4PiB3aXRoaW4gdGhpcwogICAgcmFuZ2UgcmV0cmlldmVzIHRoZSBzZXQgb2Ygc2FtcGxlIHBvc2l0aW9ucyBmb3IgdGhlIHBpeGVsIG1hdGNoaW5nCiAgICA8cGl4ZWxpbmRleD4uIDxwaXhlbGluZGV4PiBjYW4gYWxzbyBiZSBlcXVhbCB0byBBTExfUElYRUxTX0FNRCwgd2hpY2gKICAgIHdvdWxkIGNhdXNlIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHJlcXVlc3RlZCA8bnVtc2FtcGxlcz4KICAgIHBlciBlYWNoIHBpeGVsIGluIHRoZSBzYW1wbGluZyBwYXR0ZXJuLgoKICAgIFRoZSBlcnJvciBJTlZBTElEX1ZBTFVFIGlzIGdlbmVyYXRlZCBpZiA8cGl4ZWxpbmRleD4gaXMgbGVzcyB0aGFuIAogICAgemVybyBvciBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJlc3VsdCBvZiBxdWVyeWluZwogICAgUElYRUxTX1BFUl9TQU1QTEVfUEFUVEVSTl9YX0FNRCBtdWx0aXBsaWVkIGJ5IHRoZSByZXN1bHQgb2YgcXVlcnlpbmcKICAgIFBJWEVMU19QRVJfU0FNUExFX1BBVFRFUk5fWV9BTUQgYW5kIGlzIG5vdCBlcXVhbCB0byBBTExfU0FNUExFUy4gVGhlCiAgICBzYW1wbGVzIHJldHVybmVkIGFyZSBvcmRlcmVkIHBlciBwaXhlbCwgYW5kIHRoZSBvcmRlciBvZiB0aGUgcGl4ZWxzIHdvdWxkCiAgICBiZSBsZWZ0IHRvIHJpZ2h0LCB0aGVuIHRvcCB0byBib3R0b20sIHdoZXJlIHRoZSBzYW1wbGluZyBwYXR0ZXJuIG9yaWdpbiBpcwogICAgdGhlIHVwcGVyIGxlZnQgY29ybmVyLiA8c2l6ZT4gaXMgdGhlIHJlcXVlc3RlZCBzaXplIG9mIHRoZSByZXRyaWV2ZWQgc2FtcGxlCiAgICBsb2NhdGlvbnMgaW4gYnl0ZXMuIDx2YWx1ZXM+IHdpbGwgY29udGFpbiB0aGUgcmV0dXJuZWQgPHg+IGFuZCA8eT4KICAgIGNvb3JkaW5hdGVzIG9mIHRoZSByZXF1ZXN0ZWQgc2FtcGxlcyBpbiBwaXhlbCBzcGFjZS4gVGhlIHNhbXBsZSBsb2NhdGlvbnMKICAgIHJldHVybmVkIGFyZSBhbGwgaW4gdGhlIHJhbmdlIFswLCAxKSwgY29ycmVzcG9uZGluZyB0byB0aGUgPHg+IGFuZCA8eT4KICAgIGxvY2F0aW9ucyBpbiBwaXhlbCBzcGFjZSBvZiB0aGF0IHNhbXBsZSwgcmVzcGVjdGl2ZWx5LiAoMC41LCAwLjUpIHRodXMKICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBwaXhlbCBjZW50ZXIuCgogICAgVGhlIGNvbW1hbmRzOgoKICAgICAgICB2b2lkIE5hbWVkRnJhbWVidWZmZXJTYW1wbGVQb3NpdGlvbnNmdkFNRCh1aW50IGZyYW1lYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQgbnVtc2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50IHBpeGVsaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnZhbHVlcyk7CgogICAgICAgIHZvaWQgR2V0TmFtZWRGcmFtZWJ1ZmZlclBhcmFtZXRlcmZ2QU1EKHVpbnQgZnJhbWVidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBwbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50IG51bXNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludCBwaXhlbGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVpIHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnZhbHVlKTsKCiAgICBiZWhhdmUgaWRlbnRpY2FsbHkgdG8gRnJhbWVidWZmZXJTYW1wbGVQb3NpdGlvbnNmdkFNRCBhbmQKICAgIEdldEZyYW1lYnVmZmVyU2FtcGxlUGFyYW1ldGVyZnZBTUQsIGV4Y2VwdCB0aGF0IHRoZSB0YXJnZXQgb2YgdGhlCiAgICBvcGVyYXRpb24gaXMgdGhlIGZyYW1lYnVmZmVyIG9iamVjdCBuYW1lZCA8ZnJhbWVidWZmZXI+IHJhdGhlciB0aGFuCiAgICB0aGUgb2JqZWN0IGJvdW5kIHRvIGEgc3BlY2lmaWVkIHRhcmdldC4gSWYgPGZyYW1lYnVmZmVyPiBpcyBub3QgdGhlIG5hbWUKICAgIG9mIGFuIGV4aXN0aW5nIGZyYW1lYnVmZmVyIG9iamVjdCBhbiBJTlZBTElEX09QRVJBVElPTiBlcnJvciBpcyBnZW5lcmF0ZWQuCgpBZGRpdGlvbnMgdG8gQ2hhcHRlciAxNCBvZiB0aGUgT3BlbkdMIDQuNCAoQ29yZSkgU3BlY2lmaWNhdGlvbiAoRml4ZWQtRnVuY3Rpb24KUHJpbWl0aXZlIEFzc2VtYmx5IGFuZCBSYXN0ZXJpemF0aW9uKQoKICAgIChNb2RpZnkgU2VjdGlvbiAxNC4zLCBBbnRpYWxpYXNpbmcsIHAuIDQxMikKCiAgICBBZGQgYWZ0ZXIgdGhlIHNlZ21lbnQ6ICJJZiB0aGUgbXVsdGlzYW1wbGUgbW9kZSBkb2VzIG5vdCBoYXZlIGZpeGVkIHNhbXBsZQogICAgbG9jYXRpb25zLCB0aGUgcmV0dXJuZWQgdmFsdWVzIG1heSBvbmx5IHJlZmxlY3QgdGhlIGxvY2F0aW9ucyBvZiBzYW1wbGVzCiAgICB3aXRoaW4gc29tZSBwaXhlbHMuIiwgYXBwZW5kOgoKICAgICAgICBJZiBHZXRNdWx0aXNhbXBsZWZ2IGlzIHVzZWQgdG8gcXVlcnkgdGhlIHJlc3VsdCBvZiB1c2luZwogICAgRnJhbWVidWZmZXJTYW1wbGVQb3NpdGlvbnNmdkFNRCBvciBOYW1lZEZyYW1lYnVmZmVyU2FtcGxlUG9zaXRpb25zZnZBTUQKICAgIHdpdGggQUxMX1BJWEVMU19BTUQsIHRoZSByZXR1cm5lZCBzYW1wbGUgcG9zaXRpb24gbWF0Y2hlcyB0aGF0IG9mCiAgICA8cGl4ZWxpbmRleD4gZXF1YWwgdG8gemVyby4KCkVycm9ycwoKICAgIElOVkFMSURfVkFMVUUgaXMgZ2VuZXJhdGVkIGJ5IEZyYW1lYnVmZmVyU2FtcGxlUG9zaXRpb25zZnZBTUQsCiAgICBOYW1lZEZyYW1lYnVmZmVyU2FtcGxlUG9zaXRpb25zZnZBTUQsIEdldEZyYW1lYnVmZmVyUGFyYW1ldGVyZnZBTUQKICAgIGFuZCBHZXROYW1lZEZyYW1lYnVmZmVyUGFyYW1ldGVyZnZBTUQgaWYgbnVtc2FtcGxlcyBpcyBncmVhdGVyIHRoYW4KICAgIHRoZSB2YWx1ZSBvZiBTQU1QTEVTLgoKICAgIElOVkFMSURfVkFMVUUgaXMgZ2VuZXJhdGVkIGJ5IEZyYW1lYnVmZmVyU2FtcGxlUG9zaXRpb25zZnZBTUQgaWYKICAgIHBpeGVsaW5kZXggaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSB2YWx1ZSBvZgogICAgTlVNX1BJWEVMU19QRVJfU0FNUExFX1BBVFRFUk5fWF9BTUQgKiBOVU1fUElYRUxTX1BFUl9TQU1QTEVfUEFUVEVSTl9ZX0FNRAogICAgYW5kIGlzIG5vdCBlcXVhbCB0byBBTExfU0FNUExFU19BTUQuCgogICAgSU5WQUxJRF9PUEVSQVRJT04gaXMgZ2VuZXJhdGVkIGJ5IEZyYW1lYnVmZmVyU2FtcGxlUG9zaXRpb25zZnZBTUQKICAgIGlmIHRoZSBjdXJyZW50bHkgYm91bmQgZnJhbWVidWZmZXIgaXMgdGhlIGRlZmF1bHQgZnJhbWVidWZmZXIuCgogICAgSU5WQUxJRF9PUEVSQVRJT04gaXMgZ2VuZXJhdGVkIGJ5IE5hbWVkRnJhbWVidWZmZXJTYW1wbGVQb3NpdGlvbnNmdkFNRAogICAgaWYgdGhlIDxmcmFtZWJ1ZmZlcj4gaXMgbm90IHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGZyYW1lYnVmZXIgb2JqZWN0LgoKICAgIElOVkFMSURfT1BFUkFUSU9OIGlzIGdlbmVyYXRlZCBieSBGcmFtZWJ1ZmZlclNhbXBsZVBvc2l0aW9uc2Z2QU1ECiAgICBpZiB0aGUgY3VycmVudGx5IGJvdW5kIGZyYW1lYnVmZmVyIGlzIGluY29tcGxldGUuCgogICAgSU5WQUxJRF9PUEVSQVRJT04gaXMgZ2VuZXJhdGVkIGJ5IE5hbWVkRnJhbWVidWZmZXJTYW1wbGVQb3NpdGlvbnNmdkFNRAogICAgaWYgdGhlIDxmcmFtZWJ1ZmZlcj4gaXMgaW5jb21wbGV0ZS4KCk5ldyBTdGF0ZQoKICAgIEFkZCB0byBUYWJsZSAyMy4yNCwgRnJhbWVidWZmZXIgKHN0YXRlIHBlciBmcmFtZWJ1ZmZlciBvYmplY3QpLCBwLiA1NDU6CgogICAgR2V0IFZhbHVlICAgICAgICBUeXBlICAgIEdldCBDb21tYW5kICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjLgogICAgLS0tLS0tLS0tICAgICAgICAtLS0tICAgIC0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgLS0tLS0KICAgIFNBTVBMRV9QT1NJVElPTlMgMnhSKyAgICBHZXRGcmFtZWJ1ZmZlclBhcmFtZXRlcmZ2QU1EICAgICAgICAgICAgVGhlICh4LCB5KSBzYW1wbGUgbG9jYXRpb25zIGluICAgICAgIDkuMi45CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwgMSkKCk5ldyBJbXBsZW1lbnRhdGlvbiBEZXBlbmRlbnQgU3RhdGUKCiAgICBBZGQgdG8gVGFibGUgMjMuMTEsIE11bHRpc2FtcGxpbmcsIHAuIDUzMjoKCiAgICBHZXQgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgIEdldCBDb21tYW5kICBWYWx1ZSAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgIFNlYy4KICAgIC0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0gLS0tLS0tLS0tLS0gIC0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgLS0tLS0KICAgIFNVQlNBTVBMRV9ESVNUQU5DRV9BTUQgICAgICAgICAgICAgICAgIFIrICAgICAgR2V0RmxvYXR2ICAgICAgICAgICAgcHJlY2lzaW9uIHN0ZXAgYmV0d2VlbiAgICAgICAgOS4yLjkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2FtcGxlcwogICAgUElYRUxTX1BFUl9TQU1QTEVfUEFUVEVSTl9YX0FNRCAgICAgICAgWisgICAgICBHZXRJbnRlZ2VydiAgICAgICAgICBudW1iZXIgb2YgcGl4ZWxzIGluIHRoZSAgICAgICA5LjIuOQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYIGRpcmVjdGlvbgogICAgUElYRUxTX1BFUl9TQU1QTEVfUEFUVEVSTl9ZX0FNRCAgICAgICAgWisgICAgICBHZXRJbnRlZ2VydiAgICAgICAgICBudW1iZXIgb2YgcGl4ZWxzIGluIHRoZSAgICAgICA5LjIuOQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZIGRpcmVjdGlvbgoKSW50ZXJhY3Rpb24gd2l0aCBBUkJfdGV4dHVyZV9tdWx0aXNhbXBsZQoKICAgIElmIEFSQl90ZXh0dXJlX211bHRpc2FtcGxlIGlzIG5vdCBzdXBwb3J0ZWQsIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0bwogICAgR2V0TXVsdGlzYW1wbGVmdi4KCgpEZXBlbmRlbmNpZXMgb24gRVhUX2RpcmVjdF9zdGF0ZV9hY2Nlc3MKCiAgICBJZiBFWFRfZGlyZWN0X3N0YXRlX2FjY2VzcyBpcyBub3Qgc3VwcG9ydGVkLCByZW1vdmUgcmVmZXJlbmNlcyB0byB0aGUKICAgIE5hbWVkKiBjb21tYW5kcyBhZGRlZCBieSB0aGlzIGV4dGVuc2lvbi4KCgpJc3N1ZXMKCiAgICAoMSkgV2hhdCBoYXBwZW5zIGlmIGFuIGFwcCBqdXN0IHNldHMgb25lIHNhbXBsZSBwb3NpdGlvbj8KCiAgICAgICAgUkVTT0xWRUQ6IEFueSBhdHRhY2htZW50IHRvIHRoZSBib3VuZCBGQk8gd2lsbCBoYXZlIHRoZSBpbmRleCAwCiAgICAgICAgcG9zaXRpb24gdXBkYXRlZC4gQWxsIHRoZSByZXN0IG9mIHRoZSBwb3NpdGlvbnMgd2lsbCBrZWVwIHRoZWlyCiAgICAgICAgb3JpZ2luYWwgdmFsdWVzLiBBbnkgb3RoZXIgRkJPcyB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSB0aGlzIGNoYW5nZS4KCgogICAgKDIpIFNob3VsZCB3ZSBhbHNvIGV4cG9zZSB0aGUgcHJlY2lzaW9uPyBDYW4gYW4gYXBwIHVzZSBpdCBpbiBzZXR0aW5nCiAgICAgICAgc2FtcGxlIHBvc2l0aW9ucz8KCiAgICAgICAgUkVTT0xWRUQ6IFNVQlNBTVBMRV9ESVNUQU5DRV9BTUQgaXMgYWRkZWQgYXMgYSBuZXcgdG9rZW4uIEl0IGNhbiBiZQogICAgICAgIHVzZWQgYnkgR2V0RmxvYXR2IHRvIHF1ZXJ5IHRoZSBwcmVjaXNpb24gc3RlcCwgd2hpY2ggd2lsbCBiZSB0aGUgc2FtZQogICAgICAgIGZvciBib3RoIHRoZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBkaXJlY3Rpb25zLiBUaGUgc3VicGl4ZWwgcmFuZ2UKICAgICAgICBbMCwxKSBpcyBkaXNjcmV0aXplZCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgU1VCU0FNUExFX0RJU1RBTkNFX0FNRC4KICAgICAgICBMZXQgc3NkIGJlIHRoZSBmbG9hdCB2YWx1ZSByZXR1cm5lZCB3aGVuIFNVQlNBTVBMRV9ESVNUQU5DRV9BTUQgaXMKICAgICAgICBxdWVyaWVkLCB0aGVuIG9uZSBjYW4gaW5mZXIgdGhlIHN1YnBpeGlsaXphdGlvbiB0byBiZSAxL3NzZCsxLiBGb3IKICAgICAgICBleGFtcGxlLCBpZiBzc2QgPSAwLjA2NjY3IHRoZW4gdGhlIHBpeGVsIGlzIHN1YmRpdmlkZWQgaW50bwogICAgICAgIDEvMC4wNjY3KzEgPSAxNiBzdWJwaXhlbHMgaW4gZWFjaCAgZGltZW5zaW9uLiAKCiAgICAgICAgT25lIGNhbiBhbHNvIGF2b2lkIHVzaW5nIHNhbXBsZSBwb3NpdGlvbnMgdGhhdCB3b3VsZCBtYXAgdG8gdGhlIHNhbWUKICAgICAgICBzdWJwaXhlbC4gQSBjb29yZGluYXRlIGMgd2lsbCBtYXAgdG8gdGhlIGdyZWF0ZXN0IG11bHRpcGxlIG9mIHNzZCB0aGF0CiAgICAgICAgaXMgbGVzcyBvciBlcXVhbCB0byBjLiBGb3IgZXhhbXBsZSwgZ2l2ZW4gdHdvIHNhbXBsZSBwb3NpdGlvbnMsCiAgICAgICAgKHgwLCB5MCkgYW5kICh4MSwgeTEpLCBpZiBhYnMoeDEteDApIDwgc3NkIGFuZCBhYnMoeTEteTApIDwgc3NkLCB0aGVuCiAgICAgICAgYm90aCBwb2ludHMgd2lsbCBtYXAgdG8gdGhlIHNhbWUgc3VicGl4ZWwsIHdoaWNoIG1lYW5zIHRoZSBhcHBsaWNhdGlvbgogICAgICAgIG1pZ2h0IHdhbnQgdG8gc3Vic3RpdHV0ZSBvbmUgb2YgdGhlc2UgcG9zaXRpb25zIHdpdGggYW5vdGhlciB0aGF0IGlzCiAgICAgICAgbm90IHJlZHVuZGFudC4KCiAgICAgICAgVXNpbmcgbnVtZXJpY2FsIHZhbHVlcyBhcyBhbiBleGFtcGxlLCBsZXQgYSA9ICgwLjIwMSwgMC4wKSBhbmQKICAgICAgICBiID0gKDAuMjUsIDAuNSkgYmUgc2FtcGxlIHBvc2l0aW9ucyBhbmQgc3NkID0gMC4wNjY2Ny4gQm90aCB0aGUKICAgICAgICB4LWNvb3JkaW5hdGUgdmFsdWVzIDAuMjAxIGFuZCAwLjI1IGZhbGwgYmV0d2VlbiAwLjA2NjY3KjM9MC4yIGFuZAogICAgICAgIDAuMDY2NjcqNCA9IDAuMjY2NjcgYW5kIHdvdWxkIHRoZXJlZm9yZSBtYXAgdG8gdGhlIHNhbWUgdmFsdWUgb2YgMC4yLgogICAgICAgIFRoZSB5LWNvb3JkaW5hdGVzIGFsc28gbWFwIHRvIHRoZSBzYW1lIHZhbHVlIG9mIDAgYmVjYXVzZSB0aGV5IGJvdGgKICAgICAgICBiZWxvbmcgaW4gdGhlIHJhbmdlIFswLCAwLjA2NjY3KS4gVGhpcyBtZWFucyB0aGUgdHdvIHBvaW50cyBhcmUKICAgICAgICByZWR1bmRhbnQuIFRoZXJlZm9yZSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjaG9vc2UgYSBkaWZmZXJlbnQgcG9pbnQKICAgICAgICBjID0gKDAuMywgMC40NSkgZm9yIGV4YW1wbGUuIGMgd291bGQgYmUgYSBnb29kIGNob2ljZSBiZWNhdXNlIHRoZQogICAgICAgIGRpc3RhbmNlIGJldHdlZW4gaXRzIHgtY29vcmRpbmF0ZSBhbmQgYSdzIHgtY29vcmRpbmF0ZSBpcyBncmVhdGVyIHRoYW4KICAgICAgICBzc2QsIHRoYXQgaXMgMC4zLTAuMjAxID4gMC4wNjY2Ny4KCiAgICAoMykgV2hhdCB3b3VsZCBiZSB0aGUgZXhwZWN0ZWQgcmVzdWx0cyBmb3IgdGhlIGZvbGxvd2luZyBzY2VuYXJpb3M6CgogICAgICAgIFNjZW5hcmlvIDEKICAgICAgICBUaGUgY3VycmVudCBudW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgZnJhbWVidWZmZXIgaXMgOC4KICAgICAgICBUaGUgYXBwbGljYXRpb24gcmVxdWVzdHMgNSBzYW1wbGUgcG9zaXRpb25zIGFuZCBHTF9BTExfUElYRUxTLgogICAgICAgIFRoZSBhcHBsaWNhdGlvbiBwYXNzZXMgMjIqMipzaXplb2YoR0x1aW50KSBhcyB0aGUgc2l6ZSBpbiBieXRlcwogICAgICAgIChtb3JlIHRoYW4gbmVlZGVkKS4KCiAgICAgICAgUkVTT0xWRUQ6IFRoZSByZXR1cm5lZCBhcnJheSB3b3VsZCBoYXZlIGEgY2FwcGVkIHNpemUgb2YKICAgICAgICAyMCoyKnNpemVvZihHTHVpbnQpIGFuZCB3aWxsIGNvbnRhaW4gdGhlIGZpcnN0IDUgc2FtcGxlcyBvZiBwaXhlbAogICAgICAgICh4MCwgeTApLCB0aGVuIHRoZSBmaXJzdCA1IHNhbXBsZXMgb2YgcGl4ZWwgKHgxLCB5MCksIHRoZW4gdGhlIGZpcnN0CiAgICAgICAgNSBzYW1wbGVzIG9mIHBpeGVsICh4MCwgeTEpIGFuZCBmaW5hbGx5IHRoZSBmaXJzdCA1IHNhbXBsZXMgb2YgcGl4ZWwKICAgICAgICAoeDEsIHkxKS4KCiAgICAgICAgU2NlbmFyaW8gMgogICAgICAgIFRoZSBjdXJyZW50IG51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBmcmFtZWJ1ZmZlciBpcyA4LgogICAgICAgIFRoZSBhcHBsaWNhdGlvbiByZXF1ZXN0cyA1IHNhbXBsZSBwb3NpdGlvbnMgYW5kIEdMX0FMTF9QSVhFTFMuCiAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHBhc3NlcyAxOCoyKnNpemVvZihHTHVpbnQpIGFzIHRoZSBzaXplIGluIGJ5dGVzCiAgICAgICAgKGxlc3MgdGhhbiBuZWVkZWQpLgoKICAgICAgICBSRVNPTFZFRDogVGhlIHJldHVybmVkIGFycmF5IHdvdWxkIGhhdmUgYSBzaXplIG9mIDE4KjIqc2l6ZW9mKEdMdWludCkKICAgICAgICBhbmQgd2lsbCBjb250YWluIHRoZSBmaXJzdCA1IHNhbXBsZXMgb2YgcGl4ZWwgKHgwLCB5MCksIHRoZW4gdGhlIGZpcnN0CiAgICAgICAgNSBzYW1wbGVzIG9mIHBpeGVsICh4MSwgeTApLCB0aGVuIHRoZSBmaXJzdCA1IHNhbXBsZXMgb2YgcGl4ZWwKICAgICAgICAoeDAsIHkxKSBhbmQgZmluYWxseSB0aGUgZmlyc3QgMyBzYW1wbGVzIG9mIHBpeGVsICh4MSwgeTEpLgoKICAgICAgICBTY2VuYXJpbyAzCiAgICAgICAgVGhlIGN1cnJlbnQgbnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGZyYW1lYnVmZmVyIGlzIDguCiAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHJlcXVlc3RzIDUgc2FtcGxlIHBvc2l0aW9ucyBhbmQgR0xfQUxMX1BJWEVMUy4KICAgICAgICBUaGUgYXBwbGljYXRpb24gcGFzc2VzIDEyKjIqc2l6ZW9mKEdMdWludCkgYXMgdGhlIHNpemUgaW4gYnl0ZXMKICAgICAgICAobGVzcyB0aGFuIG5lZWRlZCkuCgogICAgICAgIFJFU09MVkVEOiBUaGUgcmV0dXJuZWQgYXJyYXkgd291bGQgaGF2ZSBhIHNpemUgb2YgMTIqMipzaXplb2YoR0x1aW50KQogICAgICAgIGFuZCB3aWxsIGNvbnRhaW4gdGhlIGZpcnN0IDUgc2FtcGxlcyBvZiBwaXhlbCAoeDAsIHkwKSwgdGhlbiB0aGUgZmlyc3QKICAgICAgICA1IHNhbXBsZXMgb2YgcGl4ZWwgKHgxLCB5MCksIGFuZCB0aGUgZmlyc3QgMiBzYW1wbGVzIG9mIHBpeGVsCiAgICAgICAgKHgwLCB5MSkuCgogICAgKDQpIFdoYXQgaXMgdGhlIGV4cGVjdGVkIGJlaGF2aW9yIG9mIGEgbXVsdGlzYW1wbGVkIHRleHR1cmUgaXMgYXR0YWNoZWQKICAgICAgICB3aXRoIDxmaXhlZHNhbXBsZWxvY2F0aW9ucz4gZXF1YWwgdG8gVFJVRSBhbmQgdGhlbiB0aGUgYXBwbGljYXRpb24KICAgICAgICBhdHRlbXB0cyB0byBzZXQgZGlmZmVyZW50IHNhbXBsZXMgcGVyIHBpeGVscyBpbiBhIHNhbXBsaW5nIHBhdHRlcm4/CgogICAgICAgIFJFU09MVkVEOiBJZiA8Zml4ZWRzYW1wbGVsb2NhdGlvbnM+IGlzIHNldCB0byBUUlVFLCB0aGUgc2FtcGxlCiAgICAgICAgcG9zaXRpb25zIGluIDxwaXhlbGluZGV4PiBlcXVhbGluZyB6ZXJvIGdldCByZXBsaWNhdGVkIHRvIGFsbCBvdGhlcgogICAgICAgIHBpeGVscyBpbiB0aGUgc2FtcGxpbmcgcGF0dGVybi4KCiAgICAoNSkgV2hhdCBpcyB0aGUgcmVzdWx0IG9mIHJlbmRlcmluZyB0byBhIGZyYW1lYnVmZmVyLCBjaGFuZ2luZyBpdHMgc2FtcGxlCiAgICAgICAgbG9jYXRpb25zIGFuZCB0aGVuIHJlbmRlcmluZyBhZ2FpbiBpbnRvIHRoYXQgZnJhbWVidWZmZXIgd2l0aG91dAogICAgICAgIGNsZWFyaW5nIGl0IGZpcnN0PwoKICAgICAgICBSRVNPTFZFRDogVGhlIHJlc3VsdCBpcyBlZmZlY3RpdmVseSB1bmRlZmluZWQuIFRoZSByZXN1bHQgb2YgcmVuZGVyaW5nCiAgICAgICAgd2lsbCBub3QgYmUgY29uc2lzdGVudCBiZXR3ZWVuIHRoZSB0d28gcGFzc2VzLiBObyBpbGwgZWZmZWN0IHNob3VsZAogICAgICAgIGNvbWUgb2YgdGhpcywgYnV0IHRoZSBmcmFtZWJ1ZmZlciBjb250ZW50IG1heSBhcHBlYXIgY29ycnVwdGVkLgoKUmV2aXNpb24gSGlzdG9yeQoKICAgIFJldi4gICAgRGF0ZSAgICBBdXRob3IgICAgQ2hhbmdlcwogICAgLS0tLSAgLS0tLS0tLS0gIC0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgNCAgICAgMTEvMTAvMTYgIG1hbG5hc3NlICBNb2RpZnkgdGhlICdmcmFtZWJ1ZmZlcicgcGFyYW1ldGVyIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE5hbWVkRnJhbWVidWZmZXJQYXJhbWV0ZXJmdkFNRCBmcm9tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0byBHTHVpbnQgdG8gbWF0Y2ggdGhlIERTQSBzdHlsZS4KICAgIDMgICAgIDExLzA5LzE2ICBtYWxuYXNzZSAgVXBkYXRlIFBJWEVMU19QRVJfU0FNUExFX1BBVFRFUk5fWF9BTUQgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJWEVMU19QRVJfU0FNUExFX1BBVFRFUk5fWV9BTUQgdG9rZW4gdmFsdWVzLgogICAgMiAgICAgMDQvMTgvMTQgIGdzZWxsZXJzICBSZWFkeSBmb3IgcG9zdGluZy4KICAgIDEgICAgIDEwLzE0LzEzICBtYWxuYXNzZSAgRmlyc3QgcmV2aXNpb24uCgo=