TEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjEuNCBhbmQgMi4xLjMKCiAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwoKICAgIC0gVXBkYXRlZCB0byBuZXdlc3QgbGlidG9vbCB2ZXJzaW9uLCBmaXhpbmcgYnVpbGQgcHJvYmxlbXMgb24gdmFyaW91cwogICAgICBwbGF0Zm9ybXMuCgogICAgLSBBIGZpeCBpbiB0aGUgR3ppcCBzdHJlYW0gcmVhZGVyOiBJdCBjb3VsZG4ndCByZWFkIGNlcnRhaW4gLmd6IGZpbGVzCiAgICAgIHByb3Blcmx5IGR1ZSB0byBhIHNtYWxsIHR5cG8uICBJbiBjZXJ0YWluIGNhc2VzLCBGcmVlVHlwZSBjb3VsZCBhbHNvCiAgICAgIGxvb3AgZW5kbGVzc2x5IHdoZW4gdHJ5aW5nIHRvIGxvYWQgdGlueSBnemlwcGVkIGZpbGVzLgoKICAgIC0gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IHRyaWVzIHRvIHVzZSB0aGUgc3lzdGVtLXdpZGUgemxpYiB3aGVuCiAgICAgIGl0IGZpbmRzIG9uZSAoaW5zdGVhZCBvZiB0aGUgY29weSBmb3VuZCBpbiBzcmMvZ3ppcCkuICBBbmQKICAgICAgImZyZWV0eXBlLWNvbmZpZyIgaGFzIGJlZW4gdXBkYXRlZCB0byByZXR1cm4gcmVsZXZhbnQgZmxhZ3MgaW4gdGhpcwogICAgICBjYXNlIHdoZW4gaW52b2tlZCB3aXRoICItLWxpYnMiIChlLmcuICItbHpsaWIiKS4KCiAgICAtIENlcnRhaW4gZm9udHMgY291bGRuJ3QgYmUgbG9hZGVkIGJ5IDIuMS4zIGJlY2F1c2UgdGhleSBsYWNrZWQgYQogICAgICBVbmljb2RlIGNoYXJtYXAgKGUuZy4gU1lNQk9MLlRURikuICBGcmVlVHlwZSBlcnJvbmVvdXNseSByZWplY3RlZAogICAgICB0aGVtLgoKICAgIC0gVGhlIENGRiBsb2FkZXIgd2FzIG1vZGlmaWVkIHRvIGFjY2VwdCBmb250cyB3aGljaCBvbmx5IGNvbnRhaW4gYQogICAgICBzdWJzZXQgb2YgdGhlaXIgcmVmZXJlbmNlIGNoYXJzZXQuICBUaGlzIHByZXZlbnRlZCB0aGUgY29ycmVjdCB1c2UKICAgICAgb2YgUERGLWVtYmVkZGVkIGZvbnRzLgoKICAgIC0gVGhlIGxvZ2ljIHRvIGRldGVjdCBVbmljb2RlIGNoYXJtYXBzIGhhcyBiZWVuIG1vZGlmaWVkLiAgVGhpcyBpcwogICAgICByZXF1aXJlZCB0byBzdXBwb3J0IGZvbnRzIHdoaWNoIGluY2x1ZGUgYm90aCAxNi1iaXQgYW5kIDMyLWJpdAogICAgICBjaGFybWFwcyAobGlrZSB2ZXJ5IHJlY2VudCBhc2lhbiBvbmVzKSB1c2luZyB0aGUgbmV3IDEwIGFuZCAxMiBTRk5UCiAgICAgIGZvcm1hdHMuCgogICAgLSBUaGUgVHJ1ZVR5cGUgbG9hZGVyIG5vdyBsaW1pdHMgdGhlIGRlcHRoIG9mIGNvbXBvc2l0ZSBnbHlwaHMuICBUaGlzIGlzCiAgICAgIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGJyb2tlbiBmb250cyB0byBicmVhayB0aGUgZW5naW5lIGJ5IGJsb3dpbmcgdGhlCiAgICAgIHN0YWNrIHdpdGggcmVjdXJzaXZlIGdseXBoIGRlZmluaXRpb25zLgoKICAgIC0gVGhlIENNYXAgY2FjaGUgaXMgbm93IGNhcGFibGUgb2YgbWFuYWdpbmcgVUNTLTQgY2hhcmFjdGVyIGNvZGVzIHRoYXQKICAgICAgYXJlIG1hcHBlZCB0aHJvdWdoIGV4dGVuZGVkIGNoYXJtYXBzIGluIHJlY2VudCBUcnVlVHlwZS9PcGVuVHlwZQogICAgICBmb250cy4KCiAgICAtIFRoZSBjYWNoZSBzdWItc3lzdGVtIG5vdyBwcm9wZXJseSBtYW5hZ2VzIG91dC1vZi1tZW1vcnkgY29uZGl0aW9ucwogICAgICBpbnN0ZWFkIG9mIGJsaW5kbHkgcmVwb3J0aW5nIHRoZW0gdG8gdGhlIGNhbGxlci4gIFRoaXMgbWVhbnMgdGhhdCBpdAogICAgICB3aWxsIHRyeSB0byBlbXB0eSB0aGUgY2FjaGUgYmVmb3JlIHJlc3RhcnRpbmcgaXRzIGFsbG9jYXRpb25zIHRvIHNlZQogICAgICBpZiB0aGF0IGNhbiBoZWxwLgoKICAgIC0gVGhlIFBGUiBkcml2ZXIgZGlkbid0IHJldHVybiB0aGUgbGlzdCBvZiBhdmFpbGFibGUgZW1iZWRkZWQgYml0bWFwcwogICAgICBwcm9wZXJseS4KCiAgICAtIFRoZXJlIHdhcyBhIG5hc3R5IG1lbW9yeSBsZWFrIHdoZW4gdXNpbmcgZW1iZWRkZWQgYml0bWFwcyBpbiBjZXJ0YWluCiAgICAgIGZvbnQgZm9ybWF0cy4KCgogIElJLiBJTVBPUlRBTlQgQ0hBTkdFUwoKICAgIC0gRGF2aWQgQ2hlc3RlciBjb250cmlidXRlZCBzb21lIGVuaGFuY2VtZW50cyB0byB0aGUgYXV0by1oaW50ZXIgdGhhdAogICAgICBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSBxdWFsaXR5IG9mIGl0cyBvdXRwdXQuICBUaGUgUG9zdHNjcmlwdAogICAgICBoaW50ZXIgd2FzIGFsc28gaW1wcm92ZWQgaW4gc2V2ZXJhbCB3YXlzLgoKICAgIC0gVGhlIEZUX1JFTkRFUl9NT0RFX0xJR0hUIHJlbmRlciBtb2RlIHdhcyBpbXBsZW1lbnRlZC4KCiAgICAtIEEgbmV3IEFQSSBmdW5jdGlvbiBjYWxsZWQgYEZUX0dldF9CREZfUHJvcGVydHknIGhhcyBiZWVuIGFkZGVkIHRvCiAgICAgIEZUX0JERl9IIHRvIHJldHJpZXZlIEJERiBwcm9wZXJ0aWVzIGZyb20gQkRGIF9hbmRfIFBDRiBmb250IGZpbGVzLgogICAgICBUSElTIElTIFNUSUxMIEVYUEVSSU1FTlRBTCwgc2luY2UgaXQgaGFzbid0IGJlZW4gcHJvcGVybHkgdGVzdGVkIHlldC4KCiAgICAtIEEgV2luZG93cyBGTlQgc3BlY2lmaWMgQVBJIGhhcyBiZWVuIGFkZGVkLCBtb3N0bHkgdG8gYWNjZXNzIGZvbnQKICAgICAgaGVhZGVycy4gIFRoaXMgaXMgdXNlZCBieSBXaW5lLgoKICAgIC0gVHJ1ZVR5cGUgdGFibGVzIHdpdGhvdXQgYW4gImhtdHgiIHRhYmxlIGFyZSBub3cgdG9sZXJhdGVkIHdoZW4gYW4KICAgICAgaW5jcmVtZW50YWwgaW50ZXJmYWNlIGlzIHVzZWQuICBUaGlzIGhhcHBlbnMgZm9yIGNlcnRhaW4gVHlwZTQyIGZvbnRzCiAgICAgIHBhc3NlZCBmcm9tIEdob3N0c2NyaXB0IHRvIEZyZWVUeXBlLgoKICAgIC0gVGhlIFBGUiBmb250IGRyaXZlciBpcyBub3cgY2FwYWJsZSBvZiByZXR1cm5pbmcgdGhlIGZvbnQgZmFtaWx5IGFuZAogICAgICBzdHlsZSBuYW1lcyB3aGVuIHRoZXkgYXJlIGF2YWlsYWJsZSAoaW5zdGVhZCBvZiB0aGUgc29sZSAiRm9udElEIikuCiAgICAgIFRoaXMgaXMgcGVyZm9ybWVkIGJ5IHBhcnNpbmcgYW4gKnVuZG9jdW1lbnRlZCogcG9ydGlvbiBvZiB0aGUgZm9udAogICAgICBmaWxlIQoKCiAgSUlJLiBNSVNDRUxMQU5FT1VTCgogICAgLSBUaGUgcGF0aCBzdHJva2VyIGluIEZUX1NUUk9LRVJfSCBoYXMgZW50ZXJlZCBiZXRhIHN0YWdlLiAgSXQgbm93IHdvcmtzCiAgICAgIHZlcnkgd2VsbCwgYnV0IGl0cyBpbnRlcmZhY2UgbWlnaHQgY2hhbmdlIGEgYml0IGluIHRoZSBmdXR1cmUuICBNb3JlCiAgICAgIG9uIHRoaXMgaW4gbGF0ZXIgcmVsZWFzZXMuCgogICAgLSBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgRlRfU2l6ZV9NZXRyaWNzIGRpZG4ndCBhcHBlYXIgcHJvcGVybHkgaW4gdGhlCiAgICAgIEFQSSByZWZlcmVuY2UuCgogICAgLSBUaGUgZmlsZSBkb2NzL1ZFUlNJT04uRExMIGhhcyBiZWVuIHVwZGF0ZWQgdG8gZXhwbGFpbiB2ZXJzaW9uaW5nCiAgICAgIHdpdGggRnJlZVR5cGUgKGkuZS4sIGNvbXBhcmluZyByZWxlYXNlL2xpYnRvb2wvc28gbnVtYmVycywgYW5kIGhvdyB0bwogICAgICB1c2UgdGhlbSBpbiBhdXRvY29uZiBzY3JpcHRzKS4KCiAgICAtIFRoZSBpbnN0YWxsYXRpb24gZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiBzZXJpb3VzbHkgcmV2YW1wZWQuIAogICAgICBFdmVyeXRoaW5nIGlzIG5vdyBpbiB0aGUgImRvY3MiIGRpcmVjdG9yeS4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkxBVEVTVCBDSEFOR0VTIEJFVFdFRU4gMi4xLjMgYW5kIDIuMS4yCgogIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKCiAgICAtIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0gaGFkIGJlZW4gaW5jb3JyZWN0bHkgbW9kaWZpZWQgaW4gMi4xLjIsIHJlc3VsdGluZwogICAgICBpbiBpbmNvcnJlY3QgdHJhbnNmb3JtYXRpb25zIGJlaW5nIGFwcGxpZWQgKGZvciBleGFtcGxlLCByb3RhdGlvbnMKICAgICAgd2VyZSBwcm9jZXNzZWQgaW4gb3Bwb3NpdGUgYW5nbGVzKS4KCiAgICAtIFRoZSBmb3JtYXQgOCBhbmQgMTIgVHJ1ZVR5cGUgY2hhcm1hcCBlbnVtZXJhdGlvbiByb3V0aW5lcyBoYXZlIGJlZW4KICAgICAgZml4ZWQgKEZUX0dldF9OZXh0X0NoYXIgcmV0dXJuZWQgaW52YWxpZCB2YWx1ZXMpLgoKICAgIC0gVGhlIFBGUiBmb250IGRyaXZlciByZXR1cm5lZCBpbmNvcnJlY3QgYWR2YW5jZSB3aWR0aHMgaWYgdGhlIG91dGxpbmUKICAgICAgYW5kIG1ldHJpY3MgcmVzb2x1dGlvbiBkZWZpbmVkIGluIHRoZSBmb250IGZpbGUgd2VyZSBkaWZmZXJlbnQuCgogICAgLSBGVF9HbHlwaF9Ub19CaXRtYXAgbm93IHJldHVybnMgc3VjY2Vzc2Z1bGx5IHdoZW4gY2FsbGVkIHdpdGggYW4KICAgICAgRlRfQml0bWFwR2x5cGggYXJndW1lbnQgKGl0IHByZXZpb3VzbHkgcmV0dXJuZWQgYW4gZXJyb3IpLgoKICAgIC0gQSBidWcgaW4gdGhlIFR5cGUgMSBsb2FkZXIgdGhhdCBwcmV2ZW50ZWQgdmFsaWQgZm9udCBib3VuZGluZyBib3hlcyB0bwogICAgICBiZSBsb2FkZWQgZnJvbSBtdWx0aXBsZSBtYXN0ZXIgZm9udHMuCgogICAgLSBUaGUgU0ZOVCB2YWxpZGF0aW9uIGNvZGUgaGFzIGJlZW4gcmV3cml0dGVuLiAgRnJlZVR5cGUgY2FuIG5vdyBsb2FkCiAgICAgICJicm9rZW4iIGZvbnRzIHRoYXQgd2VyZSB1c2FibGUgb24gV2luZG93cywgYnV0IG5vdCB3aXRoIHByZXZpb3VzCiAgICAgIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5LgoKICAgIC0gVGhlIGNvbXB1dGF0aW9uIG9mIGJlYXJpbmdzIGluIHRoZSBCREYgZHJpdmVyIGhhcyBiZWVuIGZpeGVkLgoKICAgIC0gVGhlIFBvc3RzY3JpcHQgaGludGVyIGNyYXNoZWQgd2hlbiB0cnlpbmcgdG8gaGludCBjZXJ0YWluIGdseXBocyAobW9yZQogICAgICBwcmVjaXNlbHksIHdoZW4gdHJ5aW5nIHRvIGFwcGx5IGhpbnRzIHRvIGFuIGVtcHR5IGdseXBoIG91dGxpbmUpLgoKICAgIC0gVGhlIFRydWVUeXBlIGdseXBoIGxvYWRlciBub3cgc3VwcG9ydHMgY29tcG9zaXRlcyBpbiAiQXBwbGUgZm9ybWF0IgogICAgICAodGhleSBkaWZmZXIgc2xpZ2h0bHkgZnJvbSBNaWNyb3NvZnQvT3BlblR5cGUgb25lcyBpbiB0aGUgd2F5CiAgICAgIHRyYW5zZm9ybWF0aW9uIG9mZnNldHMgYXJlIGNvbXB1dGVkKS4KCiAgICAtIEZyZWVUeXBlIHdhcyB2ZXJ5IHNsb3cgYXQgb3BlbmluZyBjZXJ0YWluIGFzaWFuIENJRC9DRkYgZm9udHMsIGR1ZQogICAgICB0byBmaXhlZCBpbmNyZW1lbnQgaW4gZHluYW1pYyBhcnJheSByZS1hbGxvY2F0aW9ucy4gIFRoaXMgaGFzIGJlZW4KICAgICAgY2hhbmdlZCB0byBleHBvbmVudGlhbCBiZWhhdmlvdXIgdG8gZ2V0IGFjY2VwdGFibGUgcGVyZm9ybWFuY2UuCgoKCiAgSUkuIElNUE9SVEFOVCBDSEFOR0VTCgogICAgLSBUaGUgUENGIGRyaXZlciBub3cgc3VwcG9ydHMgZ3ppcC1jb21wcmVzc2VkIGZvbnQgZmlsZXMgbmF0aXZlbHkuICBUaGlzCiAgICAgIG1lYW5zIHRoYXQgeW91IHdpbGwgYmUgYWJsZSB0byB1c2UgYWxsIHRoZXNlIGJpdG1hcCBmb250cyB0aGF0IGNvbWUKICAgICAgd2l0aCBYRnJlZTg2IHdpdGggRnJlZVR5cGUgKGFuZCBsaWJYZnQvbGliWGZ0MiwgYnkgZXh0ZW5zaW9uKS4KCiAgICAtIFRoZSBhdXRvbWF0aWMgYW5kIHBvc3RzY3JpcHQgaGludGVycyBoYXZlIGJvdGggYmVlbiB1cGRhdGVkLiAgVGhpcwogICAgICByZXN1bHRzIGluIGEgcmVsYXRpdmVseSBpbXBvcnRhbnQgaW5jcmVhc2Ugb2YgcmVuZGVyaW5nIHF1YWxpdHkgc2luY2UKICAgICAgbWFueSBuYXN0eSBkZWZhdWx0cyBoYXZlIGJlZW4gc3VwcmVzc2VkLiAgUGxlYXNlIHZpc2l0IHRoZSB3ZWIgcGFnZToKCiAgICAgICAgaHR0cDovL3d3dy5mcmVldHlwZS5vcmcvaGludGluZy9zbW9vdGgtaGludGluZy5odG1sCgogICAgICBmb3IgYWRkaXRpb25hbCBkZXRhaWxzIG9uIHRoaXMgdG9waWMuCgogICAgLSBUaGUgImxvYWRfZmxhZ3MiIHBhcmFtZXRlciBvZiBGVF9Mb2FkX0dseXBoIGlzIG5vdyBhbiBGVF9JbnQzMgogICAgICAoaW5zdGVhZCBvZiBqdXN0IGJlaW5nIGFuIEZUX0ludCkuICBUaGlzIGJyZWFrcyBzb3VyY2UgYW5kIGJpbmFyeQogICAgICBjb21wYXRpYmlsaXR5IGZvciAxNmJpdCBzeXN0ZW1zIG9ubHksIHdoaWxlIHJldGFpbmluZyBib3RoIG9mIHRoZW0gZm9yCiAgICAgIDMyIGFuZCA2NCBiaXQgb25lcy4KCiAgICAgIFNvbWUgbmV3IGZsYWdzIGhhdmUgYmVlbiBhZGRlZCBjb25zZXF1ZW50bHk6CgogICAgICAgIEZUX0xPQURfTk9fQVVUT0hJTlQgICA6OiBEaXNhYmxlIHRoZSB1c2Ugb2YgdGhlIGF1dG8taGludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidXQgbm90IG5hdGl2ZSBmb3JtYXQgaGludGVycykuCgogICAgICAgIEZUX0xPQURfVEFSR0VUX05PUk1BTCA6OiBIaW50IGFuZCByZW5kZXIgZm9yIG5vcm1hbCBhbnRpLWFsaWFzZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheXMuCgogICAgICAgIEZUX0xPQURfVEFSR0VUX01PTk8gICA6OiBIaW50IGFuZCByZW5kZXIgZm9yIDEtYml0IGRpc3BsYXlzLgoKICAgICAgICBGVF9MT0FEX1RBUkdFVF9MQ0QgICAgOjogSGludCBhbmQgcmVuZGVyIGZvciBob3Jpem9udGFsIFJHQiBvciBCR1IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLXBpeGVsIGRpc3BsYXlzIChsaWtlIExDRCBzY3JlZW5zKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhJUyBJUyBTVElMTCBFWFBFUklNRU5UQUwhCgogICAgICAgIEZUX0xPQURfVEFSR0VUX0xDRF9WICA6OiBTYW1lIGFzIEZUX0xPQURfVEFSR0VUX0xDRCwgZm9yIHZlcnRpY2FsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi1waXhlbCBkaXNwbGF5cyAobGlrZSByb3RhdGVkIExDRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5zKS4gIFRISVMgSVMgU1RJTEwgRVhQRVJJTUVOVEFMIQoKICAgICAgRlRfTE9BRF9NT05PQ0hST01FIGlzIHN0aWxsIHN1cHBvcnRlZCwgYnV0IG9ubHkgYWZmZWN0cyByZW5kZXJpbmcsIG5vdAogICAgICB0aGUgaGludGluZy4KCiAgICAgIE5vdGUgdGhhdCB0aGUgJ2Z0dmlldycgZGVtbyBwcm9ncmFtIGF2YWlsYWJsZSBpbiB0aGUgJ2Z0MmRlbW9zJyBwYWNrYWdlCiAgICAgIGhhcyBiZWVuIHVwZGF0ZWQgdG8gc3VwcG9ydCBMQ0Qtb3B0aW1pemVkIGRpc3BsYXkgb24gbm9uLXBhbGV0dGVkCiAgICAgIGRpc3BsYXlzICh1bmRlciBXaW4zMiBhbmQgWDExKS4KCiAgICAtIFRoZSBQRlIgZHJpdmVyIG5vdyBzdXBwb3J0cyBlbWJlZGRlZCBiaXRtYXBzIChhbGwgZm9ybWF0cyBzdXBwb3J0ZWQpLAogICAgICBhbmQgcmV0dXJucyBjb3JyZWN0IGtlcm5pbmcgbWV0cmljcyBmb3IgYWxsIGdseXBocy4KCiAgICAtIFRoZSBUcnVlVHlwZSBjaGFybWFwIGxvYWRlciBub3cgc3VwcG9ydHMgY2VydGFpbiAiYnJva2VuIiBmb250cyB0aGF0CiAgICAgIGxvYWQgdW5kZXIgV2luZG93cyB3aXRob3V0IHByb2JsZW1zLgoKICAgIC0gVGhlIGNhY2hlIEFQSSBoYXMgYmVlbiBzbGlnaHRseSBtb2RpZmllZCAoaXQncyBzdGlsbCBhIGJldGEhKToKCiAgICAgICAtIFRoZSB0eXBlIEZUQ19JbWFnZURlc2MgaGFzIGJlZW4gcmVtb3ZlZDsgaXQgaXMgbm93IHJlcGxhY2VkIGJ5CiAgICAgICAgIEZUQ19JbWFnZVR5cGVSZWMuICBOb3RlIHRoYXQgb25lIG9mIGl0cyBmaWVsZHMgaXMgYSBgbG9hZF9mbGFnJwogICAgICAgICBwYXJhbWV0ZXIgZm9yIEZUX0xvYWRfR2x5cGguCgogICAgICAgLSBUaGUgZmllbGQgIm51bV9ncmF5cyIgb2YgRlRfU0JpdFJlYyBoYXMgYmVlbiBjaGFuZ2VkIHRvICJtYXhfZ3JheXMiCiAgICAgICAgIGluIG9yZGVyIHRvIGZpdCB3aXRoaW4gYSBzaW5nbGUgYnl0ZS4gIEl0cyBtYXhpbXVtIHZhbHVlIGlzIHRodXMgMjU1CiAgICAgICAgIChpbnN0ZWFkIG9mIDI1NiBhcyBwcmV2aW91c2x5KS4KCgogIElJSS4gTUlTQ0VMTEFORU9VUwoKICAgIC0gQWRkZWQgc3VwcG9ydCBmb3IgdGhlIERFU1RESVIgdmFyaWFibGUgZHVyaW5nICJtYWtlIGluc3RhbGwiLiAgVGhpcwogICAgICBzaW1wbGlmaWVzIHBhY2thZ2luZyBvZiBGcmVlVHlwZS4KCiAgICAtIEluY2x1ZGVkIG1vZGlmaWVkIGNvcGllcyBvZiB0aGUgWkxpYiBzb3VyY2VzIGluICdzcmMvZ3ppcCcgaW4gb3JkZXIgdG8KICAgICAgc3VwcG9ydCBnemlwLWNvbXByZXNzZWQgUENGIGZvbnRzLiAgV2UgZG8gbm90IHVzZSB0aGUgc3lzdGVtLXByb3ZpZGVkCiAgICAgIHpsaWIgZm9yIG5vdywgdGhvdWdoIHRoaXMgaXMgYSBwcm9iYWJsZSBlbmhhbmNlbWVudCBmb3IgZnV0dXJlCiAgICAgIHJlbGVhc2VzLgoKICAgIC0gVGhlIERvY01ha2VyIHRvb2wgdXNlZCB0byBnZW5lcmF0ZSB0aGUgb24tbGluZSBBUEkgcmVmZXJlbmNlIGhhcyBiZWVuCiAgICAgIGNvbXBsZXRlbHkgcmV3cml0dGVuLiAgSXQgaXMgbm93IGxvY2F0ZWQgaW4KICAgICAgInNyYy90b29scy9kb2NtYWtlci9kb2NtYWtlci5weSIuICBGZWF0dXJlczoKCiAgICAgICAgLSBiZXR0ZXIgY3Jvc3MtcmVmZXJlbmNlZCBvdXRwdXQKICAgICAgICAtIG1vcmUgcG9saXNoZWQgb3V0cHV0CiAgICAgICAgLSB1c2VzIFB5dGhvbiByZWd1bGFyIGV4cHJlc3Npb25zICh0aG91Z2ggaXQgZGlkbid0IHNwZWVkIHRoZQogICAgICAgICAgcHJvZ3JhbSkKICAgICAgICAtIG11Y2ggbW9yZSBtb2R1bGFyIHN0cnVjdHVyZSwgd2hpY2ggYWxsb3dzIGZvciBkaWZmZXJlbnQgImJhY2tlbmRzIgogICAgICAgICAgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgSFRNTCwgWE1MLCBvciB3aGF0ZXZlciBmb3JtYXQuCgogICAgICBPbmUgY2FuIHJlZ2VuZXJhdGUgdGhlIEFQSSByZWZlcmVuY2UgYnkgY2FsbGluZzoKCiAgICAgICAgIHB5dGhvbiBzcmMvdG9vbHMvZG9jbWFrZXIvZG9jbWFrZXIucHkgXAogICAgICAgICAgICAgICAgLS1wcmVmaXg9ZnQyIFwKICAgICAgICAgICAgICAgIC0tdGl0bGU9RnJlZVR5cGUtMi4xLjMgXAogICAgICAgICAgICAgICAgLS1vdXRwdXQ9PG91dHB1dGRpcmVjdG9yeT4KICAgICAgICAgICAgICAgIGluY2x1ZGUvZnJlZXR5cGUvKi5oIFwKICAgICAgICAgICAgICAgIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnLyouaCBcCiAgICAgICAgICAgICAgICBpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlLyouaAoKICAgIC0gQSBuZXcsIGV4cGVyaW1lbnRhbCwgc3VwcG9ydCBmb3IgaW5jcmVtZW50YWwgZm9udCBsb2FkaW5nIChpLmUuLAogICAgICBsb2FkaW5nIG9mIGZvbnRzIHdoZXJlIHRoZSBnbHlwaHMgYXJlIG5vdCBpbiB0aGUgZm9udCBmaWxlIGl0c2VsZiwgYnV0CiAgICAgIHByb3ZpZGVkIGJ5IGFuIGV4dGVybmFsIGNvbXBvbmVudCwgbGlrZSBhIFBvc3RzY3JpcHQgaW50ZXJwcmV0ZXIpIGhhcwogICAgICBiZWVuIGFkZGVkIGJ5IEdyYWhhbSBBc2hlci4gIFRoaXMgaXMgc3RpbGwgd29yayBpbiBwcm9ncmVzcywgaG93ZXZlci4KCiAgICAtIEEgbmV3LCBFWFBFUklNRU5UQUwsIHBhdGggc3Ryb2tlciBoYXMgYmVlbiBhZGRlZC4gIEl0IGRvZXNuJ3Qgc3VmZmVyCiAgICAgIGZyb20gc2V2ZXJlIHJvdW5kaW5nIGVycm9ycyBhbmQgdHJlYXQgYmV6aWVyIGFyY3MgZGlyZWN0bHkuICBTdGlsbAogICAgICB3b3JrIGluIHByb2dyZXNzIChpLmUuIG5vdCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCBBUEkpLiAgU2VlIHRoZSBmaWxlCiAgICAgIDxmcmVldHlwZS9mdHN0cm9rZXIuaD4gZm9yIHNvbWUgb2YgdGhlIGRldGFpbHMuCgogICAgLSBUaGUgbWFzc2l2ZSByZS1mb3JtYXR0aW5nIG9mIHNvdXJjZXMgYW5kIGludGVybmFsIHJlLWRlc2lnbiBpcyBzdGlsbAogICAgICB1bmRlci13YXkuICBNYW55IGludGVybmFsIGZ1bmN0aW9ucywgY29uc3RhbnRzLCBhbmQgdHlwZXMgaGF2ZSBiZWVuCiAgICAgIHJlbmFtZWQuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMS4yIGFuZCAyLjEuMQoKICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCgogICAgLSBNYW55IGZvbnQgZHJpdmVycyBkaWRuJ3Qgc2VsZWN0IGEgVW5pY29kZSBjaGFybWFwIGJ5IGRlZmF1bHQgd2hlbgogICAgICBhIG5ldyBmYWNlIHdhcyBvcGVuZWQgKHdpdGggdGhlIEZUX0NPTkZJR19PUFRJT05fVVNFX0NNQVBTIG9wdGlvbnMKICAgICAgZW5hYmxlZCksIGNhdXNpbmcgbWFueSBhcHBsaWNhdGlvbnMgdG8gbm90IGJlIGFibGUgdG8gZGlzcGxheSB0ZXh0CiAgICAgIGNvcnJlY3RseSB3aXRoIHRoZSAyLjEueCByZWxlYXNlcy4KCiAgICAtIFRoZSBQRlIgZHJpdmVyIGhhZCBhIGJ1ZyBpbiBpdHMgY29tcG9zaXRlIGxvYWRpbmcgY29kZSB0aGF0IHByb2R1Y2VzCiAgICAgIGluY29ycmVjdGx5IHBsYWNlZCBhY2NlbnRzIHdpdGggbWFueSBmb250cy4KCiAgICAtIFRoZSBUeXBlNDIgZHJpdmVyIGNyYXNoZWQgc29tZXRpbWVzIGR1ZSB0byBhIG5hc3R5IGJ1Zy4KCiAgICAtIFRoZSBUeXBlIDEgY3VzdG9tIGVuY29kaW5nIGNoYXJtYXAgZGlkbid0IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUKICAgICAgZmlyc3QgZ2x5cGggaW5kZXggd2Fzbid0IDAuCgogICAgLSBBIHNlcmlvdXMgdHlwbyBpbiB0aGUgVHJ1ZVR5cGUgY29tcG9zaXRlIGxvYWRlciBwcm9kdWNlZCBpbmNvcnJlY3RseQogICAgICBwbGFjZWQgZ2x5cGhzIGluIGZvbnRzIGxpa2UgIldpbmdkaW5ncyIgYW5kIGEgZmV3IG90aGVycy4KCgogIElJLiBNSVNDRUxMQU5FT1VTCgogICAgLSBUaGUgV2luMzIgVmlzdWFsIEMrKyBwcm9qZWN0IGZpbGUgaGFzIGJlZW4gdXBkYXRlZCB0byBpbmNsdWRlIHRoZQogICAgICBQRlIgZHJpdmVyIGFzIHdlbGwuCgogICAgLSAiZnJlZXR5cGUubTQiIGlzIG5vdyBpbnN0YWxsZWQgYnkgZGVmYXVsdCBieSAibWFrZSBpbnN0YWxsIiBvbiBVbml4CiAgICAgIHN5c3RlbXMuCgogICAgLSBUaGUgZnVuY3Rpb24gRlRfR2V0X1BTX0ZvbnRfSW5mbyBub3cgd29ya3Mgd2l0aCBDSUQgYW5kIFR5cGU0MiBmb250cwogICAgICBhcyB3ZWxsLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjEuMSBhbmQgMi4xLjAKCiAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwoKICAgIC0gVGhlIGB2ZXJzaW9uX2luZm8nIHJldHVybmVkIGJ5IGBmcmVldHlwZS1jb25maWcnIGluIDIuMS4wIHJldHVybmVkIGFuCiAgICAgIGludmFsaWQgdmFsdWUuIEl0IG5vdyByZXR1cm5zIDk6MTozICgyLjAuOSByZXR1cm5lZCA5OjA6MykuCgogICAgLSBWZXJzaW9uIDIuMS4wIGNvdWxkbid0IGJlIGxpbmtlZCBhZ2FpbnN0IGFwcGxpY2F0aW9ucyBvbiBXaW4zMiBhbmQKICAgICAgQW1pZ2Egc3lzdGVtcyBkdWUgdG8gYSBuZXcgZGVidWcgZnVuY3Rpb24gdGhhdCB3YXNuJ3QgcHJvcGVybHkKICAgICAgcHJvcGFnYXRlZCB0byB0aGUgc3lzdGVtLXNwZWNpZmljIGRpcmVjdG9yeSBpbiBgYnVpbGRzJy4KCiAgICAtIFZhcmlvdXMgTWFjT1MgYW5kIE1hYyBPUyBYIHNwZWNpZmljIGZpeGVzLgoKICAgIC0gRml4ZWQgYSBidWcgaW4gdGhlIFRydWVUeXBlIGNoYXJtYXAgdmFsaWRhdGlvbiByb3V0aW5lcyB0aGF0IG1hZGUKICAgICAgdmVyc2lvbiAyLjEuMCB0b28gcmVzdHJpY3RpdmUgLS0gbWFueSBwb3B1bGFyIGZvbnRzIGhhdmUgYmVlbgogICAgICByZWplY3RlZC4KCiAgICAtIFRoZXJlIHdhcyBzdGlsbCBhIHZlcnkgc21hbGwgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBtb25vY2hyb21lIGdseXBoCiAgICAgIGJpdG1hcHMgcHJvZHVjZWQgYnkgRnJlZVR5cGUgMS54IGFuZCBGcmVlVHlwZSAyLnggd2l0aCB0aGUgYnl0ZWNvZGUKICAgICAgaW50ZXJwcmV0ZXIgZW5hYmxlZC4gIFRoaXMgd2FzIGNhdXNlZCBieSBhbiBpbnZhbGlkIGZsYWcgc2V0dGluZyBpbgogICAgICB0aGUgVHJ1ZVR5cGUgZ2x5cGggbG9hZGVyLCBtYWtpbmcgdGhlIHJhc3Rlcml6ZXIgY2hhbmdlIGl0cyBkcm9wLW91dAogICAgICBjb250cm9sIG1vZGUuICBOb3cgdGhlcmVzdWx0cyBzaG91bGQgX3JlYWxseV8gYmUgY29tcGxldGVseSBpZGVudGljYWwuCgogICAgLSBUaGUgVHJ1ZVR5cGUgbmFtZSB0YWJsZSBsb2FkZXIgaGFzIGJlZW4gaW1wcm92ZWQgdG8gc3VwcG9ydCBtYW55CiAgICAgIHBvcHVsYXIgdGhvdWdoIGJ1Z2d5IEFzaWFuIGZvbnRzLiAgSXQgbm93IGlnbm9yZXMgZW1wdHkgbmFtZSBlbnRyaWVzLAogICAgICBpbnZhbGlkIHBvaW50ZXIgb2Zmc2V0cyBhbmQgYSBmZXcgb3RoZXIgaW5jb3JyZWN0IHN1YnRsZXRpZXMuCiAgICAgIE1vcmVvdmVyLCBuYW1lIHN0cmluZ3MgYXJlIG5vdyBsb2FkZWQgb24gZGVtYW5kLCB3aGljaCByZWR1Y2VzIHRoZQogICAgICBtZW1vcnkgbG9hZCBvZiBtYW55IGZhY2VzIChlLmcuIHRoZSBBUklBTC5UVEYgZm9udCBmaWxlIGNvbnRhaW5zIGEKICAgICAgMTBrQnl0ZSBuYW1lIHRhYmxlIHdpdGggNzAgbmFtZXMpLgoKICAgIC0gRml4ZWQgYSBidWcgaW4gdGhlIFBvc3RzY3JpcHQgaGludGVyIHRoYXQgcHJldmVudGVkIGZhbWlseSBibHVlcwogICAgICBzdWJzdGl0dXRpb24gdG8gaGFwcGVuIGNvcnJlY3RseS4KCgogIElJLiBORVcgRkVBVFVSRVMKCiAgICAtIFRocmVlIG5ldyBmb250IGRyaXZlcnMgaW4gdGhpcyByZWxlYXNlOgoKICAgICAgKiBBIEJERiBmb250IGRyaXZlciwgY29udHJpYnV0ZWQgYnkgRnJhbmNvIFphcHBhIE5hcmRlbGxpLCBoZWF2aWx5CiAgICAgICAgbW9kaWZpZWQgYnkgV2VybmVyIExlbWJlcmcuICBJdCBhbHNvIHN1cHBvcnRzIGFudGktYWxpYXNlZCBiaXRtYXBzCiAgICAgICAgKHVzaW5nIGEgc2xpZ2h0bHkgZXh0ZW5kZWQgQkRGIGZvcm1hdCkuCgogICAgICAqIEEgVHlwZTQyIGZvbnQgZHJpdmVyLCBjb250cmlidXRlZCBieSBSb2JlcnRvIEFsYW1lZGEuICBJdCBpcwogICAgICAgIHN0aWxsIGV4cGVyaW1lbnRhbCBidXQgc2VlbXMgdG8gd29yayByZWxhdGl2ZWx5IHdlbGwuCgogICAgICAqIEEgUEZSIGZvbnQgZHJpdmVyLCBjb250cmlidXRlZCBieSBEYXZpZCBUdXJuZXIgaGltc2VsZi4gIEl0IGRvZXNuJ3QKICAgICAgICBzdXBwb3J0IFBGUiBoaW50aW5nIC0tIG5vdGUgdGhhdCBCaXRTdHJlYW0gaGFzIGF0IGxlYXN0IHR3byBwYXRlbnRzCiAgICAgICAgb24gdGhpcyBmb3JtYXQhCgoKICBJSUkuIE1JU0NFTExBTkVPVVMKCiAgICAtIFRoZSBjYWNoZSBzdWItc3lzdGVtIGhhcyBiZWVuIG9wdGltaXplZCBpbiBpbXBvcnRhbnQgd2F5cy4gIENhY2hlIGhpdHMKICAgICAgYXJlIG5vdyBzaWduaWZpY2FudGx5IGZhc3Rlci4gIEZvciBleGFtcGxlLCB1c2luZyB0aGUgQ01hcCBjYWNoZSBpcwogICAgICBhYm91dCB0d2ljZSBmYXN0ZXIgdGhhbiBjYWxsaW5nIEZUX0dldF9DaGFyX0luZGV4IG9uIG1vc3QgcGxhdGZvcm1zLgogICAgICBTaW1pbGFybHksIHVzaW5nIGFuIFNCaXQgY2FjaGUgaXMgYWJvdXQgZml2ZSB0aW1lcyBmYXN0ZXIgdGhhbiBsb2FkaW5nCiAgICAgIHRoZSBiaXRtYXBzIGZyb20gYSBiaXRtYXAgZmlsZSwgYW5kIDMwMCB0byA1MDAgdGltZXMgZmFzdGVyIHRoYW4KICAgICAgZ2VuZXJhdGluZyB0aGVtIGZyb20gYSBzY2FsYWJsZSBmb3JtYXQuCgogICAgICBOb3RlIHRoYXQgeW91IHNob3VsZCByZWNvbXBpbGUgeW91ciBzb3VyY2VzIGlmIHlvdSBkZXNpZ25lZCBhIGN1c3RvbQogICAgICBjYWNoZSBjbGFzcyBmb3IgdGhlIEZUMiBDYWNoZSBzdWJzeXN0ZW0sIHNpbmNlIHRoZSBjaGFuZ2VzIHBlcmZvcm1lZAogICAgICBhcmUgc291cmNlLCBidXQgbm90IGJpbmFyeSwgY29tcGF0aWJsZS4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkxBVEVTVCBDSEFOR0VTIEJFVFdFRU4gMi4xLjAgYW5kIDIuMC45CgogIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKCiAgICAtIFRoZSBUcnVlVHlwZSBieXRlY29kZSBpbnRlcnByZXRlciBoYXMgYmVlbiBmaXhlZCB0byBwcm9kdWNlCiAgICAgIF9leGFjdGx5XyB0aGUgc2FtZSBvdXRwdXQgYXMgRnJlZVR5cGUgMS54LiAgUHJldmlvdXMgZGlmZmVyZW5jZXMKICAgICAgd2VyZSBkdWUgdG8gc2xpZ2h0bHkgZGlzdGluY3QgZml4ZWQtcG9pbnQgY29tcHV0YXRpb24gcm91dGluZXMKICAgICAgdXNlZCB0byBwZXJmb3JtIGRvdCBwcm9kdWN0cyBhbmQgdmVjdG9yIGxlbmd0aCBtZWFzdXJlbWVudHMuCgogICAgICBJdCBzZWVtcyB0aGF0IG5hdGl2ZSBUcnVlVHlwZSBoaW50aW5nIGlzIF9leHRyZW1lbHlfIHNlbnNpdGl2ZQogICAgICB0byByb3VuZGluZyBlcnJvcnMuICBUaGUgcmVxdWlyZWQgdmVjdG9yIGNvbXB1dGF0aW9uIHJvdXRpbmVzIGhhdmUKICAgICAgYmVlbiBvcHRpbWl6ZWQgYW5kIHBsYWNlZCB3aXRoaW4gdGhlICJ0dGludGVycC5jIiBmaWxlLgoKICAgIC0gRml4ZWQgdGhlIHBhcnNpbmcgb2YgYWNjZWxlcmF0b3IgdGFibGVzIGluIHRoZSBQQ0YgZm9udCBkcml2ZXIuCgogICAgLSBGaXhlZCB0aGUgVHlwZTEgZ2x5cGggbG9hZGVyIHJvdXRpbmUgdXNlZCB0byBjb21wdXRlIHRoZSBmb250J3MKICAgICAgbWF4aW11bSBhZHZhbmNlIHdpZHRoLgoKICBJSS4gTkVXIEZFQVRVUkVTCgogICAgLSBUaGUgYGNvbmZpZ3VyZScgc2NyaXB0IHVzZWQgb24gVW5peCBzeXN0ZW1zIGhhcyBiZWVuIG1vZGlmaWVkIHRvCiAgICAgIGNoZWNrIHRoYXQgR05VIE1ha2UgaXMgYmVpbmcgdXNlZCB0byBidWlsZCB0aGUgbGlicmFyeS4gIE90aGVyd2lzZSwKICAgICAgaXQgd2lsbCBkaXNwbGF5IGEgbWVzc2FnZSBwcm9wb3NpbmcgdG8gdXNlIHRoZSBHTlVNQUtFIGVudmlyb25tZW50CiAgICAgIHZhcmlhYmxlIHRvIG5hbWUgaXQuCgogICAgICBUaGUgVW5peC1zcGVjaWZpYyBmaWxlIFJFQURNRS5VTlggaGFzIGJlZW4gbW9kaWZpZWQgYWNjb3JkaW5nbHkuCgoKICBJSUkuIE1JU0NFTExBTkVPVVMKCiAgICAtIFRoZSBGcmVlVHlwZSBMaWNlbnNlIGluIGBkb2NzL0ZUTC50eHQnIGhhcyBiZWVuIHVwZGF0ZWQgdG8gaW5jbHVkZQogICAgICBhIHByb3Bvc2VkIHByZWZlcnJlZCBkaXNjbGFpbWVyLiAgSWYgeW91IGFyZSB1c2luZyBGcmVlVHlwZSBpbiB5b3VyCiAgICAgIHByb2R1Y3RzLCB5b3UgYXJlIGVuY291cmFnZWQgKGJ1dCBub3QgbWFuZGF0ZWQpIHRvIHVzZSB0aGUgZm9sbG93aW5nCiAgICAgIHRleHQgaW4geW91ciBkb2N1bWVudGF0aW9uOgoKICAgICAgIiIiCiAgICAgICAgUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgY29weXJpZ2h0IKkgMTk5Ni0yMDAyIFRoZSBGcmVlVHlwZQogICAgICAgIFByb2plY3QgKHd3dy5mcmVldHlwZS5vcmcpLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAgIiIiCgogICAgLSBUaGUgZGVmYXVsdCBzaXplIG9mIHRoZSByZW5kZXIgcG9vbCBoYXMgYmVlbiByZWR1Y2VkIHRvIDE2a0J5dGUuCiAgICAgIFRoaXMgc2hvdWxkbid0IHJlc3VsdCBpbiBhbnkgbm90aWNlYWJsZSBwZXJmb3JtYW5jZSBwZW5hbHR5LCB1bmxlc3MKICAgICAgeW91IGFyZSB1c2luZyB0aGUgZW5naW5lIGFzLWlzIHRvIHJlbmRlciB2ZXJ5IGxhcmdlIGFuZCBjb21wbGV4CiAgICAgIGdseXBocy4KCiAgICAtIFRoZSBGcmVlVHlwZSAyIHJlZGVzaWduIGhhcyBiZWd1bi4gIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kCiAgICAgIGF0IHRoaXMgVVJMOgoKICAgICAgICBodHRwOi8vd3d3LmZyZWV0eXBlLm9yZy9mcmVldHlwZTIvcmVkZXNpZ24uaHRtbAoKICAgICAgVGhlIGZvbGxvd2luZyBpbnRlcm5hbCBjaGFuZ2VzIGhhdmUgYmVlbiBwZXJmb3JtZWQgd2l0aGluIHRoZSBzb3VyY2VzCiAgICAgIG9mIHRoaXMgcmVsZWFzZToKCiAgICAgICAgLSBNYW55IGludGVybmFsIHR5cGVzIGhhdmUgYmVlbiByZW5hbWVkIHRvIGluY3JlYXNlIGNvbnNpc3RlbmN5LgogICAgICAgICAgVGhlIGZvbGxvd2luZyBzaG91bGQgYmUgdHJ1ZSwgZXhjZXB0IGZvciBwdWJsaWMgdHlwZXM6CgogICAgICAgICAgICAqIEFsbCBzdHJ1Y3R1cmUgdHlwZXMgaGF2ZSBhIG5hbWUgZW5kaW5nIGluICJSZWMiIChzaG9ydCBmb3IKICAgICAgICAgICAgICBgcmVjb3JkJykuCgogICAgICAgICAgICAqIEEgcG9pbnRlci10by1zdHJ1Y3R1cmUgdHlwZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUKICAgICAgICAgICAgICBzdHJ1Y3R1cmUsIF93aXRob3V0XyB0aGUgIlJlYyIgc3VmZml4LgoKICAgICAgICAgICAgICAgIEV4YW1wbGU6CgogICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCBGb29SZWNfCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICAgICAgICAgIH0gRm9vUmVjLCAqRm9vOwoKICAgICAgICAtIE1hbnkgaW50ZXJuYWwgbWFjcm9zIGhhdmUgYmVlbiByZW5hbWVkIHRvIGluY3JlYXNlIGNvbnNpc3RlbmN5LgogICAgICAgICAgVGhlIGZvbGxvd2luZyBzaG91bGQgYmUgdHJ1ZToKCiAgICAgICAgICAgICogQWxsIG1hY3JvcyBoYXZlIGEgbmFtZSBiZWdpbm5pbmcgd2l0aCAiRlRfIi4gIFRoaXMgcmVxdWlyZWQKICAgICAgICAgICAgICBhIGZldyBjaGFuZ2VzIGxpa2UKCiAgICAgICAgICAgICAgICBBTExPQyAgID0+IEZUX0FMTE9DCiAgICAgICAgICAgICAgICBGUkVFICAgID0+IEZUX0ZSRUUKICAgICAgICAgICAgICAgIFJFQUxMT0MgPT4gRlRfUkVBTExPQwoKICAgICAgICAgICAgKiBBbGwgbWFjcm9zIGFyZSBjb21wbGV0ZWx5IFVQUEVSQ0FTRS4gIFRoaXMgcmVxdWlyZWQgYSBmZXcKICAgICAgICAgICAgICBjaGFuZ2VzIGxpa2U6CgogICAgICAgICAgICAgICAgUkVBRF9TaG9ydCAgPT4gRlRfUkVBRF9TSE9SVAogICAgICAgICAgICAgICAgTkVYVF9TaG9ydCAgPT4gRlRfTkVYVF9TSE9SVAogICAgICAgICAgICAgICAgR0VUX1VMb25nTEUgPT4gRlRfR0VUX1VMT05HX0xFCiAgICAgICAgICAgICAgICBNRU1fU2V0ICAgICA9PiBGVF9NRU1fU0VUCiAgICAgICAgICAgICAgICBNRU1fQ29weSAgICA9PiBGVF9NRU1fQ09QWQogICAgICAgICAgICAgICAgZXRjLgoKICAgICAgICAgICAgKiBXaGVuZXZlciBwb3NzaWJsZSwgYWxsIG1hY3JvIG5hbWVzIGZvbGxvdyB0aGUKICAgICAgICAgICAgICBGVF88T0JKRUNUPl88TUVUSE9EPiBwYXR0ZXJuLiAgRm9yIGV4YW1wbGUKCiAgICAgICAgICAgICAgICBBQ0NFU1NfRnJhbWUgICA9PiBGVF9GUkFNRV9FTlRFUgogICAgICAgICAgICAgICAgRk9SR0VUX0ZyYW1lICAgPT4gRlRfRlJBTUVfRVhJVAogICAgICAgICAgICAgICAgRVhUUkFDVF9GcmFtZSAgPT4gRlRfRlJBTUVfRVhUUkFDVAogICAgICAgICAgICAgICAgUkVMRUFTRV9GcmFtZSAgPT4gRlRfRlJBTUVfUkVMRUFTRQoKICAgICAgICAgICAgICAgIEZJTEVfUG9zICAgICAgID0+IEZUX1NUUkVBTV9QT1MKICAgICAgICAgICAgICAgIEZJTEVfU2VlayAgICAgID0+IEZUX1NUUkVBTV9TRUVLCiAgICAgICAgICAgICAgICBGSUxFX1JlYWQgICAgICA9PiBGVF9TVFJFQU1fUkVBRAogICAgICAgICAgICAgICAgRklMRV9SZWFkQXQgICAgPT4gRlRfU1RSRUFNX1JFQURfQVQKICAgICAgICAgICAgICAgIFJFQURfRmllbGRzICAgID0+IEZUX1NUUkVBTV9SRUFEX0ZJRUxEUwoKICAgICAgICAtIE1hbnkgaW50ZXJuYWwgZnVuY3Rpb25zIGhhdmUgYmVlbiByZW5hbWVkIHRvIGZvbGxvdyB0aGUKICAgICAgICAgIEZUXzxPYmplY3Q+XzxNZXRob2Q+IHBhdHRlcm4uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIEZUX1NlZWtfU3RyZWFtICAgICAgID0+IEZUX1N0cmVhbV9TZWVrCiAgICAgICAgICAgIEZUX1JlYWRfU3RyZWFtX0F0ICAgID0+IEZUX1N0cmVhbV9SZWFkQXQKICAgICAgICAgICAgRlRfRG9uZV9TdHJlYW0gICAgICAgPT4gRlRfU3RyZWFtX0Nsb3NlCiAgICAgICAgICAgIEZUX05ld19TdHJlYW0gICAgICAgID0+IEZUX1N0cmVhbV9PcGVuCiAgICAgICAgICAgIEZUX05ld19NZW1vcnlfU3RyZWFtID0+IEZUX1N0cmVhbV9PcGVuTWVtb3J5CiAgICAgICAgICAgIEZUX0V4dHJhY3RfRnJhbWUgICAgID0+IEZUX1N0cmVhbV9FeHRyYWN0RnJhbWUKCiAgICAgICAgICBOb3RlIHRoYXQgbWV0aG9kIG5hbWVzIGRvIG5vdCBjb250YWluICJfIi4KCiAgICAgICAgLSBUaGUgRlRfQUxMT0NfQVJSQVkgYW5kIEZUX1JFQUxMT0NfQVJSQVkgaGF2ZSBiZWVuIHJlcGxhY2VkCiAgICAgICAgICB3aXRoIEZUX05FV19BUlJBWSBhbmQgRlRfUkVORVdfQVJSQVkgd2hpY2ggZG8gbm90IHRha2UgYSB0eXBlCiAgICAgICAgICBhcyB0aGUgZm91cnRoIGFyZ3VtZW50LiAgSW5zdGVhZCwgdGhlIGFycmF5IGVsZW1lbnQgdHlwZSBzaXplCiAgICAgICAgICBpcyBjb21wdXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIHR5cGUgb2YgdGhlIHRhcmdldCBwb2ludGVyCiAgICAgICAgICB1c2VkLgoKICAgICAgICAtIEEgbmV3IG9iamVjdCBjbGFzcywgRlRfQ01hcCwgaGFzIGJlZW4gaW50cm9kdWNlZC4gIFRoZXNlCiAgICAgICAgICBpbnRlcm5hbCBvYmplY3RzIGFyZSB1c2VkIHRvIG1vZGVsIGNoYXJhY3RlciBtYXBzLiAgVGhpcyBlYXNlcwogICAgICAgICAgdGhlIHN1cHBvcnQgb2YgYWRkaXRpb25hbCBjaGFybWFwIHR5cGVzIHdpdGhpbiB0aGUgZW5naW5lLgoKICAgICAgICAtIEEgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZSBuYW1lZCAiZnRzdGRsaWIuaCIgaGFzIGJlZW4gYWRkZWQKICAgICAgICAgIHRvIGBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZycuICBJdCBpcyB1c2VkIHRvIGRlZmluZSBhbGlhc2VzCiAgICAgICAgICBmb3IgX2V2ZXJ5XyByb3V0aW5lIG9mIHRoZSBJU08gQyBsaWJyYXJ5IHRoYXQgdGhlIGZvbnQgZW5naW5lCiAgICAgICAgICB1c2VzLiAgRWFjaCBhbGlhc2VzIGhhcyBhICJmdF8iIHByZWZpeCAoZS5nLiAiZnRfc3RybGVuIiBpcyBhbgogICAgICAgICAgYWxpYXMgZm9yICJzdHJsZW4iKS4KCiAgICAgICAgICBUaGlzIGlzIHVzZWQgdG8gZWFzZSB0aGUgcG9ydGluZyBvZiBGcmVlVHlwZSAyIHRvIGV4b3RpYyBydW50aW1lCiAgICAgICAgICBlbnZpcm9ubWVudHMgd2hlcmUgdGhlIElTTyBDIExpYnJhcnkgaXNuJ3QgYXZhaWxhYmxlIChlLmcuCiAgICAgICAgICBYRnJlZTg2IGV4dGVuc2lvbiBtb2R1bGVzKS4KCiAgICAgIE1vcmUgZGV0YWlscyBhcmUgYXZhaWxhYmxlIGluIHRoZSAiQ2hhbmdlTG9nIiBmaWxlLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkxBVEVTVCBDSEFOR0VTIEJFVFdFRU4gMi4wLjkgYW5kIDIuMC44CgogIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKCiAgICAtIENlcnRhaW4gZm9udHMgbGlrZSAiZm94anVtcC50dGYiIGNvbnRhaW4gYnJva2VuIG5hbWUgdGFibGVzIHdpdGgKICAgICAgaW52YWxpZCBlbnRyaWVzIGFuZCB3aWxkIG9mZnNldHMuICBUaGlzIGNhdXNlZCBGcmVlVHlwZSB0byBjcmFzaCB3aGVuCiAgICAgIHRyeWluZyB0byBsb2FkIHRoZW0uCgogICAgICBUaGUgU0ZOVCBgbmFtZScgdGFibGUgbG9hZGVyIGhhcyBiZWVuIGZpeGVkIHRvIGJlIGFibGUgdG8gc3VwcG9ydAogICAgICB0aGVzZSBzdHJhbmdlIGZvbnRzLgoKICAgICAgTW9yZW92ZXIsIHRoZSBjb2RlIGluIGNoYXJnZSBvZiBwcm9jZXNzaW5nIHRoaXMgdGFibGUgaGFzIGJlZW4gY2hhbmdlZAogICAgICB0byBhbHdheXMgZmF2b3VyIFdpbmRvd3MtZm9ybWF0dGVkIGVudHJpZXMgb3ZlciBvdGhlciBvbmVzLiAgSGVuY2UsIGEKICAgICAgZm9udCB0aGF0IHdvcmtzIG9uIFdpbmRvd3MgYnV0IG5vdCBvbiB0aGUgTWFjIHdpbGwgbG9hZCBjbGVhbmx5IGluCiAgICAgIEZyZWVUeXBlIGFuZCByZXBvcnQgYWNjdXJhdGUgdmFsdWVzIGZvciBGYW1pbHkgJiBQb3N0U2NyaXB0IG5hbWVzLgoKICAgIC0gVGhlIENJRCBmb250IGRyaXZlciBoYXMgYmVlbiBmaXhlZC4gIEl0IHVuZm9ydHVuYXRlbHkgcmV0dXJuZWQgYQogICAgICBQb3N0c2NyaXB0IEZvbnQgbmFtZSB3aXRoIGEgbGVhZGluZyBzbGFzaCwgYXMgaW4KICAgICAgIi9NdW5od2FHb3RoaWMtUmVndWxhciIuCgogICAgLSBGcmVlVHlwZSAyIHNob3VsZCBub3cgY29tcGlsZSBmaW5lIG9uIEFJWCA0LjMuMyBhcyBhIHNoYXJlZCBsaWJyYXJ5LgoKICAgIC0gQSBidWcgaW4gdGhlIFBvc3RzY3JpcHQgaGludGVyIGhhcyBiZWVuIGZvdW5kIGFuZCBmaXhlZCwgcmVtb3ZpbmcKICAgICAgdW4tZXZlbiBzdGVtIHdpZHRocyBhdCBzbWFsbCBwaXhlbCBzaXplcyAobGlrZSAxNC0xNykuCgogICAgICBUaGlzIGltcHJvdmVzIHRoZSBxdWFsaXR5IG9mIGEgY2VydGFpbiBudW1iZXIgb2YgUG9zdHNjcmlwdCBmb250cy4KCgogIElJLiBORVcgRkVBVFVSRVMKCiAgICAtIEEgbmV3IGZ1bmN0aW9uIG5hbWVkIGBGVF9MaWJyYXJ5X1ZlcnNpb24nIGhhcyBiZWVuIGFkZGVkIHRvIHJldHVybgogICAgICB0aGUgY3VycmVudCBsaWJyYXJ5J3MgbWFqb3IsIG1pbm9yLCBhbmQgcGF0Y2ggdmVyc2lvbiBudW1iZXJzLiAgVGhpcwogICAgICBpcyBpbXBvcnRhbnQgc2luY2UgdGhlIG1hY3JvcyBGUkVFVFlQRV9NQUpPUiwgRlJFRVRZUEVfTUlOT1IsIGFuZAogICAgICBGUkVFVFlQRV9QQVRDSCBjYW5ub3QgYmUgdXNlZCB3aGVuIHRoZSBsaWJyYXJ5IGlzIGR5bmFtaWNhbGx5IGxpbmtlZAogICAgICBieSBhIHByb2dyYW0uCgogICAgLSBUd28gbmV3IEFQSXMgaGF2ZSBiZWVuIGFkZGVkOiBgRlRfR2V0X0ZpcnN0X0NoYXInIGFuZAogICAgICBgRlRfR2V0X05leHRfQ2hhcicuCgogICAgICBUb2dldGhlciwgdGhlc2UgY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSBlZmZpY2llbnRseSBvdmVyIHRoZSBjdXJyZW50bHkKICAgICAgc2VsZWN0ZWQgY2hhcm1hcCBvZiBhIGdpdmVuIGZhY2UuICBSZWFkIHRoZSBBUEkgcmVmZXJlbmNlIGZvciBtb3JlCiAgICAgIGRldGFpbHMuCgoKICBJSUkuIE1JU0NFTExBTkVPVVMKCiAgICAtIFRoZSBGcmVlVHlwZSBzb3VyY2VzIGFyZSB1bmRlciBoZWF2eSBpbnRlcm5hbCByZS1mYWN0b3JpbmcuICBBcyBhCiAgICAgIGNvbnNlcXVlbmNlLCB3ZSBoYXZlIGNyZWF0ZWQgYSBicmFuY2ggbmFtZWQgIlNUQUJMRSIgb24gdGhlIENWUyB0bwogICAgICBob2xkIGFsbCBmdXR1cmUgcmVsZWFzZXMvZml4ZXMgaW4gdGhlIDIuMC54IGZhbWlseS4KCiAgICAgIFRoZSBIRUFEIGJyYW5jaCBub3cgY29udGFpbnMgdGhlIHJlLWZhY3RvcmVkIHNvdXJjZXMgYW5kIHNob3VsZG4ndCBiZQogICAgICB1c2VkIGZvciB0ZXN0aW5nIG9yIHBhY2thZ2luZyBuZXcgcmVsZWFzZXMuICBJbiBjYXNlIHlvdSB3b3VsZCBsaWtlCiAgICAgIHRvIGFjY2VzcyB0aGUgMi4wLjkgc291cmNlcyBmcm9tIG91ciBDVlMgcmVwb3NpdG9yeSwgdXNlIHRoZSB0YWcKICAgICAgYFZFUi0yLTAtOScuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjAuOCBhbmQgMi4wLjcKCiAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwoKICAgIC0gVGhlcmUgd2FzIGEgc21hbGwgYnV0IG5hc3R5IGJ1ZyBpbiAiZnJlZXR5cGUtY29uZmlnLmluIiB3aGljaAogICAgICBjYXVzZWQgdGhlICJmcmVldHlwZS1jb25maWciIHNjcmlwdCB0byBmYWlsIG9uIFVuaXguCgogICAgICBUaGlzIGRpZG4ndCBwcmV2ZW50IHRoZSBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkgb3IgZXZlbgogICAgICBpdHMgZXhlY3V0aW9uLCBidXQgY2F1c2VkIHByb2JsZW1zIHdoZW4gdHJ5aW5nIHRvIGNvbXBpbGUgbWFueQogICAgICBVbml4IHBhY2thZ2VzIHRoYXQgZGVwZW5kIG9uIGl0LgoKICAgIC0gU29tZSBUcnVlVHlwZSBvciBPcGVuVHlwZSBmb250cyBlbWJlZGRlZCBpbiBQREYgZG9jdW1lbnRzIGRvCiAgICAgIG5vdCBoYXZlIGEgJ2NtYXAnLCAncG9zdCcgYW5kICduYW1lJyBhcyBpcyByZXF1aXJlZCBieSB0aGUKICAgICAgc3BlY2lmaWNhdGlvbi4gIEZyZWVUeXBlIG5vIGxvbmdlciByZWZ1c2VzIHRvIGxvYWQgc3VjaCBmb250cy4KCiAgICAtIHZhcmlvdXMgZml4ZXMgdG8gdGhlIFBDRiBmb250IGRyaXZlcgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkxBVEVTVCBDSEFOR0VTIEJFVFdFRU4gMi4wLjcgYW5kIDIuMC42CgogIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKCiAgICAtIEZpeGVkIHR3byBidWdzIGluIHRoZSBUeXBlIDEgZm9udCBkcml2ZXIuICBUaGUgZmlyc3Qgb25lIHJlc3VsdGVkIGluIGEKICAgICAgbWVtb3J5IGxlYWsgaW4gc3VidGxlIGNhc2VzLiAgVGhlIG90aGVyIG9uZSBjYXVzZWQgRnJlZVR5cGUgdG8gY3Jhc2gKICAgICAgd2hlbiB0cnlpbmcgdG8gbG9hZCAiLmdzZiIgZmlsZXMgKEdob3N0c2NyaXB0IHNvLWNhbGxlZCBQb3N0c2NyaXB0CiAgICAgIGZvbnRzKS4KCiAgICAgIChUaGlzIG1hZGUgX21hbnlfIEtERSBhcHBsaWNhdGlvbnMgY3Jhc2ggb24gY2VydGFpbiBzeXN0ZW1zLiAgRnJlZVR5cGUKICAgICAgIF9pc18gYmVjb21pbmcgYSBjcml0aWNhbCBzeXN0ZW0gY29tcG9uZW50IG9uIExpbnV4IDotKQoKICAgIC0gRml4ZWQgYSBtZW1vcnkgbGVhayBpbiB0aGUgQ0ZGIGZvbnQgZHJpdmVyLgoKICAgIC0gRml4ZWQgYSBtZW1vcnkgbGVhayBpbiB0aGUgUENGIGZvbnQgZHJpdmVyLgoKICAgIC0gRml4ZWQgdGhlIFZpc3VhbCBDKysgcHJvamVjdCBmaWxlICJidWlsZHMvd2luMzIvdmlzdWFsYy9mcmVldHlwZS5kc3AiCiAgICAgIHNpbmNlIGl0IGRpZG4ndCBpbmNsdWRlIHRoZSBQb3N0c2NyaXB0IGhpbnRlciBjb21wb25lbnQsIGNhdXNpbmcKICAgICAgZXJyb3JzIGF0IGJ1aWxkIHRpbWUuCgogICAgLSBGaXhlZCBhIHNtYWxsIHJlbmRlcmluZyBidWcgaW4gdGhlIGFudGktYWxpYXNlZCByZW5kZXJlciB0aGF0IG9ubHkKICAgICAgb2NjdXJyZWQgd2hlbiB0cnlpbmcgdG8gZHJhdyB0aGluIChsZXNzIHRoYW4gMSBwaXhlbCkgc3Ryb2tlcy4KCiAgICAtIEZpeGVkICJidWlsZHMvdW5peC9mcmVldHlwZTIuYTQiIHdoaWNoIGlzIHVzZWQgdG8gZ2VuZXJhdGUgYSB2YWxpZAogICAgICAiZnJlZXR5cGUyLm00IiBmb3IgdXNlIHdpdGggYXV0b2NvbmYuCgogICAgLSBGaXhlZCB0aGUgT3BlblZNUyBNYWtlZmlsZXMuCgoKICBJSS4gTUlTQ0VMTEFORU9VUwoKICAgIC0gQWRkZWQgImNvbmZpZ3VyZSIgYW5kICJpbnN0YWxsIiBzY3JpcHRzIHRvIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgogICAgICBBIEdOVS1zdHlsZSBpbnN0YWxsYXRpb24gaXMgdGh1cyBub3cgZWFzaWx5IHBvc3NpYmxlIHdpdGgKCiAgICAgICAgICAuL2NvbmZpZ3VyZSAgPG9wdGlvbnM+CiAgICAgICAgICBtYWtlCiAgICAgICAgICBtYWtlIGluc3RhbGwKCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMC42IGFuZCAyLjAuNQoKICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCgogICAgLSBJdCB3YXNuJ3QgcG9zc2libGUgdG8gbG9hZCBlbWJlZGRlZCBiaXRtYXBzIHdoZW4gdGhlIGF1dG8taGludGVyIHdhcwogICAgICB1c2VkLiAgVGhpcyBpcyBub3cgZml4ZWQuCgogICAgLSBUaGUgVHJ1ZVR5cGUgZm9udCBkcml2ZXIgZGlkbid0IGxvYWQgc29tZSBjb21wb3NpdGVzIHByb3Blcmx5ICh0aGUKICAgICAgc3ViLWdseXBocyB3ZXJlIHNsaWdodGx5IHNoaWZ0ZWQsIGFuZCB0aGlzIHdhcyBvbmx5IG5vdGljZWFibGUgd2hlbgogICAgICB1c2luZyBtb25vY2hyb21lIHJlbmRlcmluZykuCgogICAgLSBWYXJpb3VzIGZpeGVzIHRvIHRoZSBhdXRvLWhpbnRlci4gIFRoZXkgbWVyZWx5IGltcHJvdmUgdGhlIG91dHB1dCBvZgogICAgICBzYW5zLXNlcmlmIGZvbnRzLiAgTm90ZSB0aGF0IHRoZXJlIGFyZSBzdGlsbCBwcm9ibGVtcyB3aXRoIHNlcmlmZWQKICAgICAgZm9udHMgYW5kIGNvbXBvc2l0ZXMgKGFjY2VudGVkIGNoYXJhY3RlcnMpLgoKICAgIC0gQWxsIHNjYWxhYmxlIGZvbnQgZHJpdmVycyBlcnJvbmVvdXNseSByZXR1cm5lZCB1bi1maXR0ZWQgZ2x5cGgKICAgICAgYWR2YW5jZXMgd2hlbiBoaW50aW5nIHdhcyByZXF1ZXN0ZWQuICBUaGlzIGNyZWF0ZWQgcHJvYmxlbXMgZm9yIGEKICAgICAgbnVtYmVyIG9mIGxheW91dCBhcHBsaWNhdGlvbnMuICBUaGlzIGlzIGEgdmVyeSBvbGQgYnVnIHRoYXQgZ290CiAgICAgIHVuZGV0ZWN0ZWQgbWFpbmx5IGJlY2F1c2UgbW9zdCB0ZXN0L2RlbW8gcHJvZ3JhbSBwZXJmb3JtIHJvdW5kaW5nCiAgICAgIGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSAodGhyb3VnaCB0aGUgY2FjaGUpLgoKICAgIC0gRlRfR2x5cGhfVG9fQml0bWFwKCkgZGlkIGVycm9uZW91c2x5IG1vZGlmeSB0aGUgc291cmNlIGdseXBoIGluCiAgICAgIGNlcnRhaW4gY2FzZXMuCgogICAgLSAiZ2xuYW1lcy5weSIgc3RpbGwgY29udGFpbmVkIGEgYnVnIHRoYXQgbWFkZSBGcmVlVHlwZSByZXR1cm4gaW52YWxpZAogICAgICBuYW1lcyBmb3IgY2VydGFpbiBnbHlwaHMuCgogICAgLSBUaGUgbGlicmFyeSBjcmFzaGVkIHdoZW4gbG9hZGluZyBjZXJ0YWluIFR5cGUgMSBmb250cyBsaWtlICJzYWRuLnBmYiIKICAgICAgKCJTdGFsaW5ncmFkIE5vcm1hbCIpLCB3aGljaCBhcHBlYXIgdG8gY29udGFpbiBwYXRoZXRpYyBmb250IGluZm8KICAgICAgZGljdGlvbmFyaWVzLgoKICAgIC0gVGhlIFRydWVUeXBlIGdseXBoIGxvYWRlciBpcyBub3cgbXVjaCBtb3JlIHBhcmFub2lkIGFuZCBjaGVja3MgZXZlcnl0aGluZwogICAgICB3aGVuIGxvYWRpbmcgYSBnaXZlbiBnbHlwaCBpbWFnZS4gIFRoaXMgd2FzIG5lY2Vzc2FyeSB0byBhdm9pZAogICAgICBwcm9ibGVtcyAoY3Jhc2hlcyBhbmQvb3IgbWVtb3J5IG92ZXJ3cml0ZXMpIHdpdGggYnJva2VuIGZvbnRzIHRoYXQKICAgICAgY2FtZSBmcm9tIGEgcmVhbGx5IGJ1Z2d5IGF1dG9tYXRpYyBmb250IGNvbnZlcnRlci4KCgogIElJLiBJTVBPUlRBTlQgVVBEQVRFUyBBTkQgTkVXIEZFQVRVUkVTCgogICAgLSBJbXBvcnRhbnQgdXBkYXRlcyB0byB0aGUgTWFjLXNwZWNpZmljIHBhcnRzIG9mIHRoZSBsaWJyYXJ5LgoKICAgIC0gVGhlIGNhY2hpbmcgc3ViLXN5c3RlbSBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlLWRlc2lnbmVkLCBhbmQgaXRzIEFQSQogICAgICBoYXMgZXZvbHZlZCAodGhlIG9sZCBvbmUgaXMgc3RpbGwgc3VwcG9ydGVkIGZvciBiYWNrd2FyZHMKICAgICAgY29tcGF0aWJpbGl0eSkuCgogICAgICBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgaXQgaXMgbm90IHlldCBjb21wbGV0ZWQsIHNvcnJ5LiAgRm9yIG5vdywgeW91CiAgICAgIGFyZSBlbmNvdXJhZ2VkIHRvIGNvbnRpbnVlIHVzaW5nIHRoZSBvbGQgQVBJLiAgSG93ZXZlciwgdGhlIGZ0dmlldwogICAgICBkZW1vIHByb2dyYW0gaW4gdGhlIGZ0MmRlbW9zIHBhY2thZ2UgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkIHRvIHVzZQogICAgICB0aGUgbmV3IGNhY2hpbmcgZnVuY3Rpb25zLgoKICAgIC0gQSBuZXcgY2hhcm1hcCBjYWNoZSBpcyBwcm92aWRlZCB0b28uICBTZWUgRlRDX0NNYXBDYWNoZSgpLiAgVGhpcyBpcwogICAgICB1c2VmdWwgdG8gcGVyZm9ybSBjaGFyYWN0ZXIgY29kZSAtPiBnbHlwaCBpbmRleCB0cmFuc2xhdGlvbnMgcXVpY2tseSwKICAgICAgd2l0aG91dCB0aGUgbmVlZCBmb3IgYW4gb3BlbmVkIEZUX0ZhY2UuCgogICAgLSBBIE5FVyBQT1NUU0NSSVBUIEhJTlRFUiBtb2R1bGUgaGFzIGJlZW4gYWRkZWQgdG8gc3VwcG9ydCBuYXRpdmUgaGludHMKICAgICAgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXRzOiBQb3N0U2NyaXB0IFR5cGUgMSwgUG9zdFNjcmlwdCBDSUQsIGFuZAogICAgICBDRkYvQ0VGLgoKICAgICAgUGxlYXNlIHRlc3QhICBOb3RlIHRoYXQgdGhlIGF1dG8taGludGVyIHByb2R1Y2VzIGJldHRlciByZXN1bHRzIGZvciBhCiAgICAgIG51bWJlciBvZiBiYWRseS1oaW50ZWQgZm9udHMgKG1vc3RseSBhdXRvLWdlbmVyYXRlZCBvbmVzKSB0aG91Z2guCgogICAgLSBBIG1lbW9yeSBkZWJ1Z2dlciBpcyBub3cgcGFydCBvZiB0aGUgc3RhbmRhcmQgRnJlZVR5cGUgc291cmNlcy4gIFRvCiAgICAgIGVuYWJsZSBpdCwgZGVmaW5lIEZUX0RFQlVHX01FTU9SWSBpbiA8ZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmg+LCBhbmQKICAgICAgcmVjb21waWxlIHRoZSBsaWJyYXJ5LgoKICAgICAgQWRkaXRpb25hbGx5LCBkZWZpbmUgdGhlIF9lbnZpcm9ubWVudF8gdmFyaWFibGUgRlRfREVCVUdfTUVNT1JZIGFuZAogICAgICBydW4gYW55IHByb2dyYW0gdXNpbmcgRnJlZVR5cGUuICBXaGVuIHRoZSBsaWJyYXJ5IGlzIGV4aXRlZCwgYSBzdW1tYXJ5CiAgICAgIG9mIG1lbW9yeSBmb290cHJpbnRzIGFuZCBwb3NzaWJsZSBsZWFrcyB3aWxsIGJlIGRpc3BsYXllZC4KCiAgICAgIFRoaXMgd29ya3MgdHJhbnNwYXJlbnRseSB3aXRoIF9hbnlfIHByb2dyYW0gdGhhdCB1c2VzIEZyZWVUeXBlLgogICAgICBIb3dldmVyLCB5b3Ugd2lsbCBuZWVkIGEgbG90IG9mIG1lbW9yeSB0byB1c2UgdGhpcyAoYWxsb2NhdGVkIGJsb2NrcwogICAgICBhcmUgbmV2ZXIgcmVsZWFzZWQgdG8gdGhlIGhlYXAgdG8gZGV0ZWN0IGRvdWJsZSBkZWxldGVzIGVhc2lseSkuCgoKICBJSUkuIE1JU0NFTExBTkVPVVMKCiAgICAtIFdlIGFyZSBhd2FyZSBvZiBzdWJ0bGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgb3V0cHV0IG9mIEZyZWVUeXBlCiAgICAgIHZlcnNpb25zIDEgYW5kIDIgd2hlbiBpdCBjb21lcyB0byBtb25vY2hyb21lIFRydWVUeXBlLWhpbnRlZCBnbHlwaHMuCiAgICAgIFRoZXNlIGFyZSBtb3N0IHByb2JhYmx5IGR1ZSB0byBzbWFsbCBkaWZmZXJlbmNlcyBpbiB0aGUgbW9ub2Nocm9tZQogICAgICByYXN0ZXJpemVycyBhbmQgd2lsbCBiZSB3b3JrZWQgb3V0IGluIGFuIHVwY29taW5nIHJlbGVhc2UuCgogICAgLSBXZSBoYXZlIGRlY2lkZWQgdG8gZm9yayB0aGUgc291cmNlcyBpbiBhICJzdGFibGUiIGJyYW5jaCwgYW5kIGFuCiAgICAgICJ1bnN0YWJsZSIgb25lLCBzaW5jZSBGcmVlVHlwZSBpcyBiZWNvbWluZyBhIGNyaXRpY2FsIGNvbXBvbmVudCBvZgogICAgICBtYW55IFVuaXggc3lzdGVtcy4KCiAgICAgIFRoZSBuZXh0IGJ1Zy1maXggcmVsZWFzZXMgb2YgdGhlIGxpYnJhcnkgd2lsbCBiZSBuYW1lZCAyLjAuNywgMi4wLjgsCiAgICAgIGV0Yy4sIHdoaWxlIHRoZSAiMi4xIiBicmFuY2ggd2lsbCBjb250YWluIGEgdmVyc2lvbiBvZiB0aGUgc291cmNlcwogICAgICB3aGVyZSB3ZSB3aWxsIHN0YXJ0IG1ham9yIHJld29ya2luZyBvZiB0aGUgbGlicmFyeSdzIGludGVybmFscywgaW4KICAgICAgb3JkZXIgdG8gcHJvZHVjZSBGcmVlVHlwZSAyLjIuMCAob3IgZXZlbiAzLjApIGluIGEgbW9yZSBkaXN0YW50CiAgICAgIGZ1dHVyZS4KCiAgICAgIFdlIGFsc28gaG9wZSB0aGF0IHRoaXMgc2NoZW1lIHdpbGwgYWxsb3cgbXVjaCBtb3JlIGZyZXF1ZW50IHJlbGVhc2VzCiAgICAgIHRoYW4gaW4gdGhlIHBhc3QuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjAuNSBhbmQgMi4wLjQKCiAgTk9URSBUSEFUIDIuMC41IERPRVMgTk9UIENPTlRBSU4gVEhFIFBPU1RTQ1JJUFQgSElOVEVSLiAgVEhJUyBNT0RVTEUgV0lMTAogIEJFIFBBUlQgT0YgVEhFIE5FWFQgUkVMRUFTRSAoRUlUSEVSIDIuMC42IG9yIDIuMSkKCiAgLSBGaXhlZCBhIGJ1ZyB0aGF0IG1hZGUgY2VydGFpbiBnbHlwaHMsIGxpa2UgIkNhY3V0ZSIsICJjYWN1dGUiIGFuZAogICAgImxzbGFzaCIgdW5hdmFpbGFibGUgZnJvbSBVbmljb2RlIGNoYXJtYXBzIG9mIFBvc3RzY3JpcHQgZm9udHMuICBUaGlzCiAgICBwcmV2ZW50ZWQgdGhlIGNvcnJlY3QgZGlzcGxheSBvZiBQb2xpc2ggdGV4dCwgZm9yIGV4YW1wbGUuCgogIC0gVGhlIGtlcm5pbmcgdGFibGUgb2YgVHlwZSAxIGZvbnRzIHdhcyBsb2FkZWQgYnkgRnJlZVR5cGUsIHdoZW4gaXRzIEFGTQogICAgZmlsZSB3YXMgYXR0YWNoZWQgdG8gaXRzIGZhY2UsIGJ1dCB0aGUgRlRfRkFDRV9GTEFHX0hBU19LRVJOSU5HIGJpdAogICAgZmxhZ3Mgd2FzIG5vdCBzZXQgY29ycmVjdGx5LCBwcmV2ZW50aW5nIEZUX0dldF9LZXJuaW5nIHRvIHJldHVybgogICAgbWVhbmluZ2Z1bCB2YWx1ZXMuCgogIC0gSW1wcm92ZWQgU0ZOVCAoVHJ1ZVR5cGUgJiBPcGVuVHlwZSkgY2hhcm1hcCBzdXBwb3J0LiAgU2xpZ2h0bHkgYmV0dGVyCiAgICBwZXJmb3JtYW5jZSwgYXMgd2VsbCBhcyBzdXBwb3J0IGZvciB0aGUgbmV3IGZvcm1hdHMgZGVmaW5lZCBieSB0aGUKICAgIE9wZW5UeXBlIDEuMyBzcGVjaWZpY2F0aW9uICg4LCAxMCwgYW5kIDEyKQoKICAtIEZpeGVkIGEgc2VyaW91cyB0eXBvIGluICJzcmMvYmFzZS9mdGNhbGMuYyIgd2hpY2ggY2F1c2VkIGludmFsaWQKICAgIGNvbXB1dGF0aW9ucyBpbiBjZXJ0YWluIHJhcmUgY2FzZXMsIHByb2R1Y2luZyB1Z2x5IGFydGVmYWN0cy4KCiAgLSBUaGUgc2l6ZSBvZiB0aGUgRU0gc3F1YXJlIGlzIGNvbXB1dGVkIHdpdGggYSBtb3JlIGFjY3VyYXRlIGFsZ29yaXRobQogICAgZm9yIFBvc3RzY3JpcHQgZm9udHMuICBUaGUgb2xkIG9uZSBjYXVzZWQgc2xpZ2h0IGVycm9ycyB3aXRoIGVtYmVkZGVkCiAgICBmb250cyBmb3VuZCBpbiBQREYgZG9jdW1lbnRzLgoKICAtIEZpeGVkIGEgYnVnIGluIHRoZSBjYWNoZSBtYW5hZ2VyIHRoYXQgcHJldmVudGVkIG5vcm1hbCBMUlUgYmVoYXZpb3VyCiAgICB3aXRoaW4gdGhlIGNhY2hlIG1hbmFnZXIsIGNhdXNpbmcgdW5uZWNlc3NhcnkgcmVsb2FkcyAoZm9yIEZUX0ZhY2UgYW5kCiAgICBGVF9TaXplIG9iamVjdHMgb25seSkuCgogIC0gQWRkZWQgYSBuZXcgZnVuY3Rpb24gbmFtZWQgIkZUX0dldF9OYW1lX0luZGV4IiB0byByZXRyaWV2ZSB0aGUgZ2x5cGgKICAgIGluZGV4IG9mIGEgZ2l2ZW4gZ2x5cGggbmFtZSwgd2hlbiBmb3VuZCBpbiBhIGZhY2UuCgogIC0gQWRkZWQgYSBuZXcgZnVuY3Rpb24gbmFtZWQgIkZUX0dldF9Qb3N0c2NyaXB0X05hbWUiIHRvIHJldHJpZXZlIHRoZQogICAgInVuaXF1ZSIgUG9zdHNjcmlwdCBmb250IG5hbWUgb2YgYSBnaXZlbiBmYWNlLgoKICAtIEFkZGVkIGEgbmV3IHB1YmxpYyBoZWFkZXIgc2l6ZSBuYW1lZCBGVF9TSVpFU19IIChvcgogICAgPGZyZWV0eXBlL2Z0c2l6ZXMuaD4pIHByb3ZpZGluZyBuZXcgRlRfU2l6ZS1tYW5hZ2VtZW50IGZ1bmN0aW9uczoKICAgIEZUX05ld19TaXplLCBGVF9BY3RpdmF0ZV9TaXplLCBGVF9Eb25lX1NpemUuCgogIC0gRml4ZWQgYSByZWFsbG9jYXRpb24gYnVnIHRoYXQgZ2VuZXJhdGVkIGEgZGFuZ2xpbmcgcG9pbnRlciAoYW5kIHBvc3NpYmx5CiAgICBtZW1vcnkgbGVha3MpIHdpdGggUG9zdHNjcmlwdCBmb250cyAoaW4gc3JjL3BzYXV4L3Bzb2Jqcy5jKS4KCiAgLSBNYW55IGZpeGVzIGZvciAxNi1iaXQgY29ycmVjdG5lc3MuCgogIC0gUmVtb3ZlZCBtYW55IHBlZGFudGljIGNvbXBpbGVyIHdhcm5pbmdzIGZyb20gdGhlIHNvdXJjZXMuCgogIC0gQWRkZWQgYW4gQW1pZ2EgYnVpbGQgZGlyZWN0b3J5IGluICJidWlsZHMvYW1pZ2EiLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjAuNCBhbmQgMi4wLjMKCiAgLSBGaXhlZCBhIHJhdGhlciBhbm5veWluZyBidWcgdGhhdCB3YXMgaW50cm9kdWNlZCBpbiAyLjAuMy4gIE5hbWVseSwgdGhlCiAgICBmb250IHRyYW5zZm9ybWF0aW9uIHNldCB0aHJvdWdoIEZUX1NldF9UcmFuc2Zvcm0gd2FzIGFwcGxpZWQgdHdpY2UgdG8KICAgIGF1dG8taGludGVkIGdseXBocywgcmVzdWx0aW5nIGluIGluY29ycmVjdGx5IHJvdGF0ZWQgdGV4dCBvdXRwdXQuCgogIC0gRml4ZWQgX21hbnlfIGNvbXBpbGVyIHdhcm5pbmdzLiAgRlQyIHNob3VsZCBub3cgY29tcGlsZSBjbGVhbmx5IHdpdGgKICAgIFZpc3VhbCBDKysncyBtb3N0IHBlZGFudGljIHdhcm5pbmcgbGV2ZWwgKC9XNCkuICBJdCBhbHJlYWR5IGNvbXBpbGVkCiAgICBmaW5lIHdpdGggR0NDIGFuZCBhIGZldyBvdGhlciBjb21waWxlcnMuCgogIC0gRml4ZWQgYSBidWcgdGhhdCBwcmV2ZW50ZWQgdGhlIGxpbmVhciBhZHZhbmNlIHdpZHRoIG9mIGNvbXBvc2l0ZQogICAgVHJ1ZVR5cGUgZ2x5cGhzIHRvIGJlIGNvcnJlY3RseSByZXR1cm5lZC4KCiAgLSBGaXhlZCB0aGUgVmlzdWFsIEMrKyBwcm9qZWN0IGZpbGVzIGxvY2F0ZWQgaW4gImJ1aWxkcy93aW4zMi92aXN1YWxjIgogICAgKHByZXZpb3VzIHZlcnNpb25zIHVzZWQgb2xkZXIgbmFtZXMgb2YgdGhlIGxpYnJhcnkpLgoKICAtIE1hbnkgMzItYml0IGNvbnN0YW50cyBoYXZlIGFuICJMIiBhcHBlbmRlZCB0byB0aGVpciB2YWx1ZSwgaW4gb3JkZXIKICAgIHRvIGltcHJvdmUgdGhlIDE2LWJpdG5lc3Mgb2YgdGhlIGNvZGUuICBTb21lb25lIGlzIGFjdHVhbGx5IHRyeWluZyB0bwogICAgdXNlIEZUMiBvbiBhbiBBdGFyaSBTVCBtYWNoaW5lIQoKICAtIFVwZGF0ZWQgdGhlICJidWlsZHMvZGV0ZWN0Lm1rIiBmaWxlIGluIG9yZGVyIHRvIGF1dG9tYXRpY2FsbHkgYnVpbGQKICAgIEZUMiBvbiBBSVggc3lzdGVtcy4gIEFJWCB1c2VzICIvdXNyL3NiaW4vaW5pdCIgaW5zdGVhZCBvZiAiL3NiaW4vaW5pdCIKICAgIGFuZCB3YXNuJ3QgcHJldmlvdXNseSBkZXRlY3RlZCBhcyBhIFVuaXggcGxhdGZvcm0gYnkgdGhlIEZyZWVUeXBlIGJ1aWxkCiAgICBzeXN0ZW0uCgogIC0gVXBkYXRlZCB0aGUgVW5peC1zcGVjaWZpYyBwb3J0aW9ucyBvZiB0aGUgYnVpbGQgc3lzdGVtIChuZXcgbGlidG9vbAogICAgdmVyc2lvbiwgZXRjLikuCgogIC0gVGhlIFNGTlQga2VybmluZyBsb2RhZXIgbm93IGVuc3VyZXMgdGhhdCB0aGUgdGFibGUgaXMgc29ydGVkIChzaW5jZSBzb21lCiAgICBwcm9ibGVtIGZvbnRzIGRvIG5vdCBtZWV0IHRoaXMgcmVxdWlyZW1lbnQpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjAuMyBhbmQgMi4wLjIKCiAgSS4gQ0hBTkdFUyBUTyBUSEUgTU9EVUxFUyAvIEZPTlQgRFJJVkVSUwoKICAgIC0gVEhFIEFVVE8tSElOVEVSIEhBUyBCRUVOIFNMSUdIVExZIElNUFJPVkVELCBpbiBvcmRlciB0byBmaXggc2V2ZXJhbAogICAgICBhbm5veWluZyBhcnRlZmFjdHMsIG1haW5seToKCiAgICAgICAgLSBCbHVlIHpvbmUgYWxpZ25lbWVudCBvZiBob3Jpem9udGFsIHN0ZW1zIHdhc24ndCBwZXJmb3JtZWQKICAgICAgICAgIGNvcnJlY3RseSwgcmVzdWx0aW5nIGluIGFydGVmYWN0cyBsaWtlIHRoZSAiZCIgYmVpbmcgcGxhY2VkIG9uZQogICAgICAgICAgcGl4ZWwgYmVsb3cgdGhlICJiIiBpbiBzb21lIGZvbnRzIGxpa2UgVGltZSBOZXcgUm9tYW4uCgogICAgICAgIC0gT3ZlcnNob290IHRocmVzaG9sZGluZyB3YXNuJ3QgcGVyZm9ybWVkIGNvcnJlY3RseSwgY3JlYXRpbmcKICAgICAgICAgIHVucGxlYXNhbnQgYXJ0ZWZhY3RzIGF0IGxhcmdlIGNoYXJhY3RlciBwaXhlbCBzaXplcy4KCiAgICAgICAgLSBDb21wb3NpdGUgZ2x5cGggbG9hZGluZyBoYXMgYmVlbiBzaW1wbGlmaWVkLiAgVGhpcyBnZXRzIHJpZAogICAgICAgICAgb2YgdmFyaW91cyBhcnRlZmFjdHMgd2hlcmUgdGhlIGNvbXBvbmVudHMgb2YgYSBjb21wb3NpdGUgZ2x5cGhzCiAgICAgICAgICB3ZXJlIG5vdCBjb3JyZWN0bHkgc3BhY2VkLgoKICAgICAgVGhlc2UgYXJlIHRoZSBsYXN0IGNoYW5nZXMgdG8gdGhlIGN1cnJlbnQgYXV0by1oaW50aW5nIG1vZHVsZS4gIEEgbmV3CiAgICAgIGhpbnRpbmcgc3ViLXN5c3RlbSBpcyBjdXJyZW50bHkgaW4gdGhlIHdvcmsgaW4gb3JkZXIgdG8gc3VwcG9ydCBuYXRpdmUKICAgICAgaGludHMgaW4gVHlwZSAxIC8gQ0ZGIC8gT3BlblR5cGUgZm9udHMsIGFzIHdlbGwgYXMgZ2xvYmFsbHkgaW1wcm92ZQogICAgICByZW5kZXJpbmcuCgogICAgLSBUaGUgUENGIGRyaXZlciBoYXMgYmVlbiBmaXhlZC4gIEl0IHJlcG9ydGVkIGludmFsaWQgZ2x5cGggZGltZW5zaW9ucwogICAgICBmb3IgdGhlIGZvbnRzIGF2YWlsYWJsZSBvbiBTb2xhcmlzLgoKICAgIC0gVGhlIFR5cGUgMSwgQ0lEIGFuZCBDRkYgZHJpdmVycyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gZml4IHRoZQogICAgICBjb21wdXRhdGlvbiBvZiB0aGUgRU0gc2l6ZS4KCiAgICAtIFRoZSBUeXBlIDEgZHJpdmVyIGhhcyBiZWVuIGZpeGVkIHRvIGF2b2lkIGEgZGFuZ2Vyb3VzIGJ1ZyB0aGF0CiAgICAgIGNyYXNoZWQgdGhlIGxpYnJhcnkgd2l0aCBub24tY29uZm9ybWluZyBmb250cyAoaS5lLiBvbmVzIHRoYXQgZG8gbm90CiAgICAgIHBsYWNlIHRoZSAubm90ZGVmIGdseXBoIGF0IHBvc2l0aW9uIDApLgoKICAgIC0gVGhlIFRydWVUeXBlIGRyaXZlciBoYWQgYSByYXRoZXIgc3VidGxlIGJ1ZyAoZGFuZ2xpbmcgcG9pbnRlciB3aGVuCiAgICAgIGxvYWRpbmcgY29tcG9zaXRlIGdseXBocykgdGhhdCBjb3VsZCBjcmFzaCB0aGUgbGlicmFyeSBpbiByYXJlCiAgICAgIG9jY2FzaW9ucyEKCgogIElJLiBISUdILUxFVkVMIEFQSSBDSEFOR0VTCgogICAgLSBUaGUgZXJyb3IgY29kZSBlbnVtZXJhdGlvbiB2YWx1ZXMgaGF2ZSBiZWVuIGNoYW5nZWQuICBBbiBlcnJvciB2YWx1ZQogICAgICBpcyBkZWNvbXBvc2VkIGluIGEgZ2VuZXJpYyBlcnJvciBjb2RlLCBhbmQgYSBtb2R1bGUgbnVtYmVyLiAgc2VlCiAgICAgIDxmcmVldHlwZS9mdGVycm9ycy5oPiBmb3IgZGV0YWlscy4KCiAgICAtIEEgbmV3IHB1YmxpYyBoZWFkZXIgZmlsZSBoYXMgYmVlbiBpbnRyb2R1Y2VkLCBuYW1lZCBGVF9UUklHT05PTUVUUllfSAogICAgICAoaW5jbHVkZS9mcmVldHlwZS9mdHRyaWcuaCksIHByb3ZpZGluZyB0cmlnb25vbWV0cmljIGZ1bmN0aW9ucyB0bwogICAgICBjb21wdXRlIHNpbmVzLCBjb3NpbmVzLCBhcmN0YW5nZW50cywgZXRjLiB3aXRoIDE2LjE2IGZpeGVkIHByZWNpc2lvbi4KICAgICAgVGhlIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBDT1JESUMgYWxnb3JpdGhtIGFuZCBpcyB2ZXJ5IGZhc3QKICAgICAgd2hpbGUgYmVpbmcgc3VmZmljaWVudGx5IGFjY3VyYXRlLgoKCiAgSUlJLiBJTlRFUk5BTFMKCiAgICAtIEFkZGVkIEJlT1Mtc3BlY2lmaWMgZmlsZXMgaW4gdGhlIG9sZCBidWlsZCBzdWItc3lzdGVtLiAgTm90ZSB0aGF0CiAgICAgIG5vIGNoYW5nZXMgd2VyZSByZXF1aXJlZCB0byBjb21waWxlIHRoZSBsaWJyYXJ5IHdpdGggSmFtLgoKICAgIC0gVGhlIGNvbmZpZ3VyYXRpb24gaXMgbm93IGNhcGFibGUgb2YgYXV0b21hdGljYWxseSBkZXRlY3RpbmcgNjQtYml0CiAgICAgIGludGVnZXJzIG9uIGEgc2V0IG9mIHByZWRlZmluZWQgY29tcGlsZXJzIChHQ0MsIFZpc3VhbCBDKyssIEJvcmxhbmQKICAgICAgQysrKSBhbmQgd2lsbCB1c2UgdGhlbSBieSBkZWZhdWx0LiAgVGhpcyBwcm92aWRlcyBhIHNtYWxsIHBlcmZvcm1hbmNlCiAgICAgIGJvb3N0LgoKICAgIC0gQSBzbWFsbCBtZW1vcnkgbGVhayB0aGF0IGhhcHBlbmVkIHdoZW4gb3BlbmluZyAwLXNpemVkIGZpbGVzIChkdWghKQogICAgICBoYXZlIGJlZW4gZml4ZWQuCgogICAgLSBGaXhlZCBiZXppZXIgc3RhY2sgZGVwdGggYnVnIGluIHRoZSByb3V0aW5lcyBwcm92aWRlZCBieSB0aGUKICAgICAgRlRfQkJPWF9IIGhlYWRlciBmaWxlLiAgQWxzbyBmaXhlZCBzaW1pbGFyIGJ1Z3MgaW4gdGhlIHJhc3Rlcml6ZXJzLgoKICAgIC0gVGhlIG91dGxpbmUgYm91bmRpbmcgYm94IGNvZGUgaGFzIGJlZW4gcmV3cml0dGVuIHRvIHVzZSBkaXJlY3QKICAgICAgY29tcHV0YXRpb25zLCBpbnN0ZWFkIG9mIGJlemllciBzdWItZGl2aXNpb24sIHRvIGNvbXB1dGUgdGhlIGV4YWN0CiAgICAgIGJvdW5kaW5nIGJveCBvZiBnbHlwaHMuICBUaGlzIGlzIHNsaWdodGx5IHNsb3dlciBidXQgbW9yZSBhY2N1cmF0ZS4KCiAgICAtIFRoZSBidWlsZCBzeXN0ZW0gaGFzIGJlZW4gaW1wcm92ZWQgYW5kIGZpeGVkLCBtYWlubHkgdG8gc3VwcG9ydCAibWFrZSIKICAgICAgb24gV2luZG93cyAyMDAwIGNvcnJlY3RseSwgYXZvaWQgcHJvYmxlbXMgd2l0aCAibWFrZSBkaXN0Y2xlYW4iIG9uIG5vbgogICAgICBVbml4IHN5c3RlbXMsIGV0Yy4KCiAgICAtIEhleGFkZWNpbWFsIGNvbnN0YW50cyBoYXZlIGJlZW4gc3VmZml4ZWQgd2l0aCAiVSIgdG8gYXZvaWQgcHJvYmxlbXMKICAgICAgd2l0aCBjZXJ0YWluIGNvbXBpbGVycyBvbiA2NC1iaXQgcGxhdGZvcm1zLgoKICAgIC0gQSBuZXcgZGlyZWN0b3J5IG5hbWVkICJzcmMvdG9vbHMiIGhhcyBiZWVuIGNyZWF0ZWQuICBJdCBjb250YWlucwogICAgICBQeXRob24gc2NyaXB0cyBhbmQgc2ltcGxlIHVuaXQgdGVzdCBwcm9ncmFtcyB1c2VkIHRvIGRldmVsb3AgdGhlCiAgICAgIGxpYnJhcnkuCgogICAgLSBUaGUgRG9jTWFrZXIgdG9vbCBoYXMgYmVlbiBtb3ZlZCBmcm9tICJkb2NzIiB0byAic3JjL3Rvb2xzIiBhbmQKICAgICAgaGFzIGJlZW4gdXBkYXRlZCB3aXRoIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAtIE5vdyBhY2NlcHRzIHRoZSAiLS10aXRsZT1YWFhYIiBvciAiLXQgWFhYWCIgb3B0aW9uIGZyb20gdGhlCiAgICAgICAgICAgY29tbWFuZCBsaW5lIHRvIHNldCB0aGUgcHJvamVjdCdzIG5hbWUgaW4gdGhlIGdlbmVyYXRlZCBBUEkKICAgICAgICAgICByZWZlcmVuY2UuCgogICAgICAgICAtIE5vdyBhY2NlcHRzIHRoZSAiLS1vdXRwdXQ9RElSIiBvciAiLW8gRElSIiBvcHRpb24gZnJvbSB0aGUKICAgICAgICAgICBjb21tYW5kIGxpbmUgdG8gc2V0IHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciBhbGwgZ2VuZXJhdGVkIEhUTUwKICAgICAgICAgICBmaWxlcy4KCiAgICAgICAgIC0gTm93IGFjY2VwdHMgdGhlICItLXByZWZpeD1YWFhYIiBvciAiLXAgWFhYIiBvcHRpb24gZnJvbSB0aGUKICAgICAgICAgICBjb21tYW5kIGxpbmUgdG8gc2V0IHRoZSBmaWxlIHByZWZpeCB0byB1c2UgZm9yIGFsbCBnZW5lcmF0ZWQgSFRNTAogICAgICAgICAgIGZpbGVzLgoKICAgICAgICAgLSBOb3cgZ2VuZXJhdGVzIHRoZSBjdXJyZW50IHRpbWUvZGF0YSBvbiBlYWNoIGdlbmVyYXRlZCBwYWdlCiAgICAgICAgICAgaW4gb3JkZXIgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB2ZXJzaW9ucy4KCiAgICAgIERvY01ha2VyIGNhbiBiZSB1c2VkIHdpdGggb3RoZXIgcHJvamVjdHMgbm93LCBub3Qgb25seSBGVDIgKGUuZy4gTUxpYiwKICAgICAgRlRMYXlvdXQsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMC4yIGFuZCAyLjAuMQoKCiAgSS4gQ0hBTkdFUyBUTyBUSEUgTU9EVUxFUyAvIEZPTlQgRFJJVkVSUwoKICAgIC0gVEhFIFRSVUVUWVBFIEJZVEVDT0RFIElOVEVSUFJFVEVSIElTIE5PVyBUVVJORUQgT0ZGLCBpbiBvcmRlciB0bwogICAgICBhdm9pZCBsZWdhbCBwcm9ibGVtcyAgd2l0aCB0aGUgQXBwbGUgcGF0ZW50cy4gIEl0ICBzZWVtcyB0aGF0IHdlCiAgICAgIG1pc3Rha2VubHkgIHR1cm5lZCB0aGlzIG9wdGlvbiAgb24gaW4gIHByZXZpb3VzIHJlbGVhc2VzICBvZiB0aGUKICAgICAgYnVpbGQuCgogICAgICBOb3RlIHRoYXQgaWYgIHlvdSB3YW50IHRvIHVzZSB0aGUgIGJ5dGVjb2RlIGludGVycHJldGVyIGluIG9yZGVyCiAgICAgIHRvIGdldCBoaWdoLXF1YWxpdHkgVHJ1ZVR5cGUgIHJlbmRlcmluZywgeW91IHdpbGwgbmVlZCB0byB0b2dnbGUKICAgICAgYnkgICAgICAgIGhhbmQgICAgICAgIHRoZSAgICAgICAgZGVmaW5pdGlvbiAgICAgICAgb2YgICAgICAgIHRoZQogICAgICBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSICAgbWFjcm8gICAgaW4gICB0aGUgICBmaWxlCiAgICAgICJpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oIi4KCiAgICAtIFRoZSBDRkYgZHJpdmVyIGhhcyBiZWVuIGltcHJvdmVkIGJ5IFRvbSBLYWN2aW5za3kgYW5kIFNhbmRlciB2YW4KICAgICAgZGVyIFdhbDoKCiAgICAgICogU3VwcG9ydCBmb3IgInNlYWMiIGVtdWxhdGlvbi4KICAgICAgKiBTdXBwb3J0IGZvciAiZG90c2VjdGlvbiIuCiAgICAgICogU3VwcG9ydCBmb3IgcmV0cmlldmluZyBnbHlwaCBuYW1lcyB0aHJvdWdoCiAgICAgICAgIkZUX0dldF9HbHlwaF9OYW1lIi4KCiAgICAgIFRoZSBmaXJzdCB0d28gaXRlbXMgYXJlIG5lY2Vzc2FyeSB0byBjb3JyZWN0bHkgYSBsYXJnZSBudW1iZXIgb2YKICAgICAgVHlwZSAxIGZvbnRzIGNvbnZlcnRlZCB0byB0aGUgQ0ZGIGZvcm1hdHMgYnkgQWRvYmUgQWNyb2JhdC4KCiAgICAtIFRoZSBUeXBlIDEgZHJpdmVyIHdhcyBhbHNvIGltcHJvdmVkIGJ5IFRvbSAmIG90aGVyczoKCiAgICAgICogQmV0dGVyIEVNIHNpemUgY29tcHV0YXRpb24uCiAgICAgICogQmV0dGVyIHN1cHBvcnQgZm9yIHN5bnRoZXRpYyAodHJhbnNmb3JtZWQpIGZvbnRzLgogICAgICAqIFRoZSAgVHlwZSAxICBkcml2ZXIgcmV0dXJucyAgdGhlIGNoYXJzdHJpbmdzICBjb3JyZXNwb25kaW5nIHRvCiAgICAgICAgZWFjaCBnbHlwaCBpbiB0aGUgICJnbHlwaC0+Y29udHJvbF9kYXRhIiBmaWVsZCBhZnRlciBhIGNhbGwgdG8KICAgICAgICAiRlRfTG9hZF9HbHlwaCIgKHRoYW5rcyBIYSBTaGFvKS4KCiAgICAtIFZhcmlvdXMgb3RoZXIgYnVnZml4ZXMsIGluY2x1ZGluZyB0aGUgZm9sbG93aW5nOgoKICAgICAgKiBGaXhlZCBhIG5hc3R5IG1lbW9yeSBsZWFrIGluIHRoZSBUeXBlIDEgZHJpdmVyLgogICAgICAqIFRoZSBhdXRvaGludGVyICBhbmQgdGhlIHBjZiAgZHJpdmVyIHVzZWQgc3RhdGljICB3cml0YWJsZSBkYXRhCiAgICAgICAgd2hlbiB0aGV5IHNob3VsZG4ndC4KICAgICAgKiBNYW55IGNhc3RzIHdlcmUgYWRkZWQgdG8gIG1ha2UgdGhlIGNvZGUgbW9yZSA2NC1iaXRzIHNhZmUuICBJdAogICAgICAgIGFsc28gbm93IGNvbXBpbGVzIG9uIFdpbmRvd3MgWFAgNjQtYml0cyB3aXRob3V0IHdhcm5pbmdzLgogICAgICAqIFNvbWUgaW5jb3JyZWN0IHdyaXRhYmxlIHN0YXRpY3Mgd2VyZSByZW1vdmVkIGluIHRoZSAiYXV0b2hpbnQiCiAgICAgICAgYW5kICJwY2YiIGRyaXZlcnMuICBGcmVlVHlwZSAyIG5vdyBjb21waWxlcyBvbiBFcG9jIGFnYWluLgoKCiAgSUkuIENIQU5HRVMgVE8gVEhFIEhJR0gtTEVWRUwgQVBJCgogICAgLSBUaGUgbGlicmFyeSBoZWFkZXIgZmlsZXMgaW5jbHVzaW9uIHNjaGVtZSBoYXMgYmVlbiBjaGFuZ2VkLiAgVGhlCiAgICAgIG9sZCBzY2hlbWUgbG9va2VkIGxpa2U6CgogICAgICAgICNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgogICAgICAgICNpbmNsdWRlIDxmcmVldHlwZS9mdGdseXBoLmg+CiAgICAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2Z0Y2FjaGUuaD4KICAgICAgICAjaW5jbHVkZSA8ZnJlZXR5cGUvY2FjaGUvZnRpbWFnZS5oPgoKICAgICAgTm93IHlvdSBzaG91bGQgdXNlOgoKICAgICAgICAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KICAgICAgICAjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICiAgICAgICAgI2luY2x1ZGUgRlRfR0xZUEhfSAogICAgICAgICNpbmNsdWRlIEZUX0NBQ0hFX0gKICAgICAgICAjaW5jbHVkZSBGVF9DQUNIRV9JTUFHRV9ICgogICAgICBOT1RFIFRIQVQgIFRIRSBPTEQgIElOQ0xVU0lPTiBTQ0hFTUUgV0lMTCAgU1RJTEwgV09SSyAgV0lUSCBUSElTCiAgICAgIFJFTEVBU0UuICBIT1dFVkVSLCBXRSAgRE8gTk9UIEdVQVJBTlRFRSBUSEFUIFRISVMgIFdJTEwgU1RJTEwgQkUKICAgICAgVFJVRSBJTiBUSEUgTkVYVCBPTkUgKEEuSy5BLiBGUkVFVFlQRSAyLjEpLgoKICAgICAgVGhlICBmaWxlIDxmdDJidWlsZC5oPiAgaXMgdXNlZCAgdG8gZGVmaW5lICB0aGUgIGhlYWRlciBmaWxlbmFtZQogICAgICBtYWNyb3MuICBUaGUgY29tcGxldGUgYW5kICBjb21tZW50ZWQgbGlzdCBvZiBtYWNyb3MgaXMgYXZhaWxhYmxlCiAgICAgIGluIHRoZSBBUEkgcmVmZXJlbmNlIHVuZGVyIHRoZSBzZWN0aW9uIG5hbWUgIkhlYWRlciBGaWxlIE1hY3JvcyIKICAgICAgaW4gQ2hhcHRlciBJLgoKICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBzZWN0aW9uIEkgb2YgdGhlIGZvbGxvd2luZyBkb2N1bWVudDoKCiAgICAgICAgaHR0cDovL3d3dy5mcmVldHlwZS5vcmcvCiAgICAgICAgICBmcmVldHlwZTIvZG9jcy90dXRvcmlhbC9zdGVwMS5odG1sCgogICAgICBvcgoKICAgICAgICBodHRwOi8vZnJlZXR5cGUuc291cmNlZm9yZ2UubmV0LwogICAgICAgICAgZnJlZXR5cGUyL2RvY3MvdHV0b3JpYWwvc3RlcDEuaHRtbAoKICAgIC0gTWFueSwgbWFueSBjb21tZW50cyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHB1YmxpYyBzb3VyY2UgZmlsZSBpbgogICAgICBvcmRlciB0byAgYXV0b21hdGljYWxseSBnZW5lcmF0ZSAgdGhlIEFQSSBSZWZlcmVuY2UgIHRocm91Z2ggdGhlCiAgICAgICJkb2NtYWtlci5weSIgUHl0aG9uIHNjcmlwdC4KCiAgICAgIFRoZSBsYXR0ZXIgaGFzIGJlZW4gdXBkYXRlZCAgdG8gc3VwcG9ydCB0aGUgZ3JvdXBpbmcgb2Ygc2VjdGlvbnMKICAgICAgaW4gY2hhcHRlcnMgYW5kIGJldHRlciBpbmRleCBzb3J0LiAgU2VlOgoKICAgICAgICBodHRwOi8vd3d3LmZyZWV0eXBlLm9yZy9mcmVldHlwZTIvZG9jcy9yZWZlcmVuY2UvZnQyLXRvYy5odG1sCgoKICBJSUkuIENIQU5HRVMgVE8gVEhFIEJVSUxEIFBST0NFU1MKCiAgICAtIElmIHlvdSAgYXJlIG5vdCAgYnVpbGRpbmcgRnJlZVR5cGUgMiAgd2l0aCBpdHMgb3duICBidWlsZCBzeXN0ZW0KICAgICAgKGJ1dCB3aXRoIHlvdXIgb3duIE1ha2VmaWxlcyBvciBwcm9qZWN0IGZpbGVzKSwgeW91IHdpbGwgbmVlZCB0bwogICAgICBiZSAgYXdhcmUgdGhhdCAgdGhlICBidWlsZCAgcHJvY2VzcyBoYXMgIGNoYW5nZWQgIGEgbGl0dGxlICBiaXQuCgogICAgICBZb3UgZG9uJ3QgIG5lZWQgdG8gcHV0IHRoZSAgInNyYyIgZGlyZWN0b3J5IGluICB0aGUgaW5jbHVkZSBwYXRoCiAgICAgIHdoZW4gIGNvbXBpbGluZyAgYW55IEZUMiAgY29tcG9uZW50LiAgIEluc3RlYWQsICBzaW1wbHkgcHV0ICB0aGUKICAgICAgY29tcG9uZW50J3MgZGlyZWN0b3J5IGluIHRoZSBjdXJyZW50IGluY2x1ZGUgcGF0aC4KCiAgICAgIFNvLCBpZiB5b3Ugd2VyZSBkb2luZyBzb21ldGhpbmcgbGlrZToKCiAgICAgICAgY2MgLWMgLUlpbmNsdWRlIC1Jc3JjIHNyYy9iYXNlL2Z0YmFzZS5jCgogICAgICBjaGFuZ2UgdGhlIGxpbmUgdG86CgogICAgICAgIGNjIC1jIC1JaW5jbHVkZSAtSXNyYy9iYXNlIHNyYy9iYXNlL2Z0YmFzZS5jCgogICAgICBJZiB5b3Ugd2VyZSBkb2luZyBzb21ldGhpbmcgbGlrZToKCiAgICAgICAgY2Qgc3JjL2Jhc2UKICAgICAgICBjYyAtYyAtSS4uLy4uL2luY2x1ZGUgLUkuLiBmdGJhc2UuYwoKICAgICAgY2hhbmdlIGl0IHRvOgoKICAgICAgICBjZCBzcmMvYmFzZQogICAgICAgIGNjIC1jIC1JLi4vLi4vaW5jbHVkZSBmdGJhc2UuYwoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkxBVEVTVCBDSEFOR0VTIEJFVFdFRU4gMi4wLjEgYW5kIDIuMAoKICAyLjAuMSBpbnRyb2R1Y2VzIGEgZmV3IGNoYW5nZXM6CgogICAgLSBGaXhlZCBtYW55IGJ1Z3MgcmVsYXRlZCB0byAgdGhlIHN1cHBvcnQgb2YgQ0ZGIC8gT3BlblR5cGUgZm9udHMuCiAgICAgIFRoZXNlICBmb3JtYXRzIGFyZSAgbm93IG11Y2ggIGJldHRlciBzdXBwb3J0ZWQgIHRob3VnaCAgdGhlcmUgaXMKICAgICAgc3RpbGwgd29yayBwbGFubmVkIHRvICBkZWFsIHdpdGggY2hhcnNldCB0YWJsZXMgYW5kIFBERi1lbWJlZGRlZAogICAgICBDRkYgZmlsZXMgdGhhdCB1c2UgdGhlIG9sZCAic2VhYyIgY29tbWFuZC4KCiAgICAtIFRoZSAgbGlicmFyeSBjb3VsZCBub3QgIGJlIGNvbXBpbGVkICBpbiBkZWJ1ZyAgbW9kZSB3aXRoICBhIHZlcnkKICAgICAgc21hbGwgIG51bWJlciAgIG9mICBDICBjb21waWxlcnMgICB3aG9zZSAgcHJlLXByb2Nlc3NvcnMgIGRpZG4ndAogICAgICBpbXBsZW1lbnQgdGhlICIjIyIgIGRpcmVjdGl2ZSBjb3JyZWN0bHkgKGkuZS4gcGVyIHNlICB0aGUgQU5TSSBDCiAgICAgIHNwZWNpZmljYXRpb24hKSAgQW4gZWxlZ2FudCBmaXggd2FzIGZvdW5kLgoKICAgIC0gQWRkZWQgIHN1cHBvcnQgZm9yICB0aGUgIGZyZWUgQm9ybGFuZCAgY29tbWFuZC1saW5lIEMrKyAgQnVpbGRlcgogICAgICBjb21waWxlci4gICBVc2UgIm1ha2UgIHNldHVwIGJjYzMyIi4gICBBbHNvIGZpeGVkICBhICBmZXcgc291cmNlCiAgICAgIGxpbmVzIHRoYXQgZ2VuZXJhdGVkIG5ldyB3YXJuaW5ncyB3aXRoIEJDQzMyLgoKICAgIC0gRml4ZWQgYSBidWcgaW4gRlRfT3V0bGluZV9HZXRfQkJveCB3aGVuIGNvbXB1dGluZyB0aGUgZXh0cmVtYSBvZgogICAgICBhIGNvbmljIEJlemllciBhcmMuCgogICAgLSBVcGRhdGVkIHRoZSBJTlNUQUxMIGZpbGUgdG8gYWRkIElERSBjb21waWxhdGlvbi4KCiAgICAtIE90aGVyICBtaW5vciBidWcgIGZpeGVzLCAgZnJvbSAgaW52YWxpZCBUeXBlICAxICBzdHlsZSBmbGFncyAgdG8KICAgICAgY29ycmVjdCAgIHN1cHBvcnQgICBvZiAgc3ludGhldGljICAgKG9ibGlxdWVkKSAgIGZvbnRzICBpbiAgIHRoZQogICAgICBhdXRvLWhpbnRlciwgYmV0dGVyIHN1cHBvcnQgZm9yIGVtYmVkZGVkIGJpdG1hcHMgaW4gYSBTRk5UIGZvbnQuCgogICAgLSBGaXhlZCBzb21lIHByb2JsZW1zIHdpdGggImZyZWV0eXBlLWNvbmZpZyIuCgogIEZpbmFsbHksIHRoZSAic3RhbmRhcmQiIHNjaGVtZSBmb3IgaW5jbHVkaW5nIEZyZWVUeXBlIGhlYWRlcnMgaXMgbm93CiAgZ3JhZHVhbGx5IGNoYW5naW5nLCAgYnV0IHRoaXMgd2lsbCAgYmUgZXhwbGFpbmVkIGluIGEgIGxhdGVyIHJlbGVhc2UKICAocHJvYmFibHkgMi4wLjIpLgoKICBBbmQgdmVyeSAgc3BlY2lhbCB0aGFua3MgdG8gVG9tIEthY3ZpbnNreSAgYW5kIFlBTUFOTy1VQ0hJIEhpZGV0b3NoaQogIGZvciB0aGVpciBjb250cmlidXRpb25zIQoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkNIQU5HRVMgQkVUV0VFTiBiZXRhOCBhbmQgMi4wCgogIC0gQ2hhbmdlZCAgdGhlIGRlZmF1bHQgIGluc3RhbGxhdGlvbiAgcGF0aCBmb3IgIHB1YmxpYyBoZWFkZXJzICBmcm9tCiAgICAiaW5jbHVkZS9mcmVldHlwZSIgdG8gImluY2x1ZGUvZnJlZXR5cGUyIi4KCiAgICBBbHNvIGFkZGVkIGEgbmV3ICJmcmVldHlwZS1jb25maWciIHRoYXQgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKICAgIGFuZCBpbnN0YWxsZWQgIG9uIFVuaXggYW5kICBDeWd3aW4gc3lzdGVtcy4gIFRoZSBzY3JpcHQgIGl0c2VsZiBpcwogICAgdXNlZCB0byByZXRyaWV2ZSB0aGUgY3VycmVudCAgaW5zdGFsbCBwYXRoLCBDIGNvbXBpbGF0aW9uIGZsYWdzIGFzCiAgICB3ZWxsIGFzIGxpbmtlciBmbGFncy4KCiAgLSBGaXhlZCBzZXZlcmFsIHNtYWxsIGJ1Z3M6CgogICAgKiBJbmNvcnJlY3QgbWF4IGFkdmFuY2Ugd2lkdGggZm9yIGZpeGVkLXBpdGNoIFR5cGUgMSBmb250cy4KICAgICogSW5jb3JyZWN0IGdseXBoIG5hbWVzIGZvciBjZXJ0YWluIFRydWVUeXBlIGZvbnRzLgogICAgKiBUaGUgIGdseXBoIGFkdmFuY2UgIHdhcyBub3QgIGNvcGllZCB3aGVuICBGVF9HbHlwaF9Ub19CaXRtYXAgd2FzCiAgICAgIGNhbGxlZC4KICAgICogVGhlICBsaW5lYXJIb3JpQWR2YW5jZSAgYW5kICBsaW5lclZlcnRBZHZhbmNlICBmaWVsZHMgIHdlcmUgIG5vdAogICAgICBjb3JyZWN0bHkgcmV0dXJuZWQgZm9yIGdseXBocyBwcm9jZXNzZWQgYnkgdGhlIGF1dG8taGludGVyLgogICAgKiAidHlwZTF6IiAgcmVuYW1lZCBiYWNrIHRvICAidHlwZTEiOyB0aGUgIG9sZCAidHlwZTEiICBtb2R1bGUgaGFzCiAgICAgIGJlZW4gcmVtb3ZlZC4KCiAgLSBSZXZhbXBlZCB0aGUgIGJ1aWxkIHN5c3RlbSAgdG8gbWFrZSBpdCAgYSBsb3QgbW9yZSAgZ2VuZXJpYy4gIFRoaXMKICAgIHdpbGwgIGFsbG93IHVzICB0byAgcmUtdXNlICBuZWFybHkgdW4tbW9kaWZpZWQgIGluICBsb3RzIG9mICBvdGhlcgogICAgcHJvamVjdHMgKGluY2x1ZGluZyBGcmVlVHlwZSBMYXlvdXQpLgoKICAtIENoYW5nZWQgImNpZCIgdG8gdXNlICJwc2F1eCIgdG9vLgoKICAtIEFkZGVkIHRoZSAgY2FjaGUgc3ViLXN5c3RlbS4gIFNlZSA8ZnJlZXR5cGUvZnRjYWNoZS5oPiAgYXMgd2VsbCBhcwogICAgdGhlIHNvdXJjZXMgIGluICJzcmMvY2FjaGUiLiAgTm90ZSAgdGhhdCBpdCBjb21waWxlcyBidXQgIGlzIHN0aWxsCiAgICB1bnRlc3RlZCBmb3Igbm93LgoKICAtIFVwZGF0ZWQgImRvY3MvZG9jbWFrZXIucHkiLCBhIGRyYWZ0ICBBUEkgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZSBhdAogICAgaHR0cDovL3d3dy5mcmVldHlwZS5vcmcvZnQyYXBpLmh0bWwuCgogIC0gQ2hhbmdlZCAidHlwZTEiIHRvIHVzZSAicHNhdXgiLgoKICAtIENyZWF0ZWQgYSAgbmV3IG1vZHVsZSBuYW1lZCAgInBzYXV4IiB0byBob2xkICB0aGUgVHlwZSAxICYgIFR5cGUgMgogICAgcGFyc2luZyByb3V0aW5lcy4gIEl0IHNob3VsZCBiZSAgdXNlZCBieSAidHlwZTEiLCAiY2lkIiwgYW5kICJjZmYiCiAgICBpbiB0aGUgZnV0dXJlLgoKICAtIEZpeGVkIGFuIGltcG9ydGFudCBidWcgaW4gIkZUX0dseXBoX0dldF9DQm94Ii4KCiAgLSBGaXhlZCAgc29tZSBjb21waWxlciAgd2FybmluZ3MgIHRoYXQgaGFwcGVuZWQgIHNpbmNlIHRoZSAgVHJ1ZVR5cGUKICAgIGJ5dGVjb2RlIGRlY29kZXIgd2FzIGRlYWN0aXZhdGVkIGJ5IGRlZmF1bHQuCgogIC0gRml4ZWQgdHdvIG1lbW9yeSBsZWFrczoKCiAgICAqIFRoZSAgICBtZW1vcnkgICBtYW5hZ2VyICAgKDE2ICAgIGJ5dGVzKSAgIGlzbid0ICAgIHJlbGVhc2VkICAgaW4KICAgICAgRlRfRG9uZV9GcmVlVHlwZSEKICAgICogVXNpbmcgY3VzdG9tIGlucHV0IHN0cmVhbXMsIHRoZSAgY29weSBvZiB0aGUgb3JpZ2luYWwgc3RyZWFtIHdhcwogICAgICBuZXZlciByZWxlYXNlZC4KCiAgLSBGaXhlZCB0aGUgIGF1dG8taGludGVyIGJ5IHBlcmZvcm1pbmcgYXV0b21hdGljICBjb21wdXRhdGlvbiBvZiB0aGUKICAgICJmaWxsaW5nIGRpcmVjdGlvbiIgb2YgZWFjaCBnbHlwaC4gICBUaGlzIGlzIGRvbmUgdGhyb3VnaCBhIHNpbXBsZQogICAgYW5kICBmYXN0IGFwcHJveGltYXRpb24sIGFuZCAgc2VlbXMgdG8gIHdvcmsgKHByb2JsZW1zICBzcG90dGVkIGJ5CiAgICBXZXJuZXIgdGhvdWdoKS4gIFRoZSBBcnBoaWMgZm9udHMgYXJlIGEgbG90IG5pY2VyIHRob3VnaCB0aGVyZSBhcmUKICAgIHN0aWxsIGEgbG90IG9mIHRoaW5ncyB0byBkbyB0byBoYW5kbGUgQXNpYW4gZm9udHMgY29ycmVjdGx5LgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkJFVEEtOCAoUkVMRUFTRSBDQU5ESURBVEUpIENIQU5HRVMKCiAgLSBEZWFjdGl2YXRlZCB0aGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgYnkgZGVmYXVsdC4KCiAgLSBEZWFjdGl2YXRlZCB0aGUgInNyYy90eXBlMSIgZm9udCBkcml2ZXIuICBOb3cgInNyYy90eXBlMXoiIGlzIHVzZWQKICAgIGJ5IGRlZmF1bHQuCgogIC0gVXBkYXRlcyB0byB0aGUgYnVpbGQgc3lzdGVtLiAgV2Ugbm93IGNvbXBpbGUgdGhlIGxpYnJhcnkgY29ycmVjdGx5CiAgICB1bmRlciAgVW5peCAgc3lzdGVtICB0aHJvdWdoICAiY29uZmlndXJlIiB3aGljaCAgaXMgIGF1dG9tYXRpY2FsbHkKICAgIGNhbGxlZCBvbiB0aGUgZmlyc3QgIm1ha2UiIGludm9jYXRpb24uCgogIC0gQWRkZWQgdGhlIGF1dG8taGludGluZyBtb2R1bGUhICBGaXhpbmcgc29tZSBidWdzIGhlcmUgYW5kIHRoZXJlLgoKICAtIEZvdW5kIHNvbWUgYnVncyBpbiB0aGUgIGNvbXBvc2l0ZSBsb2FkZXIgKHNlYWMpIG9mIHRoZSBUeXBlMS1iYXNlZAogICAgZm9udCBkcml2ZXJzLgoKICAtIFJlbmFtZWQgdGhlIGRpcmVjdG9yeSAiZnJlZXR5cGUyL2NvbmZpZyIgdG8gImZyZWV0eXBlMi9idWlsZHMiIGFuZAogICAgdXBkYXRlZCBhbGwgcmVsZXZhbnQgZmlsZXMuCgogIC0gRm91bmQgYSBtZW1vcnkgbGVhayBpbiB0aGUgInR5cGUxIiBkcml2ZXIuCgogIC0gSW5jb3Jwb3JhdGVkIFRvbSdzIHBhdGNoZXMgdG8gIHN1cHBvcnQgZmxleCBvcGVyYXRvcnMgY29ycmVjdGx5IGluCiAgICBPcGVuVHlwZS9DRkYgZm9udHMuICBOb3cgYWxsIEkgbmVlZCBpcyB0byBzdXBwb3J0IHB1cmUgQ0ZGIGFuZCBDRUYKICAgIGZvbnRzIHRvIGJlIGRvbmUgd2l0aCB0aGlzIGRyaXZlciA6LSkKCiAgLSBBZGRlZCB0aGUgIFdpbmRvd3MgRk5UL0ZPTiBkcml2ZXIgaW4gInNyYy93aW5mb250cyIuICAgRm9yIG5vdywgaXQKICAgIGFsd2F5cyAgInNpbXVsYXRlcyIgICBhICBVbmljb2RlICBjaGFybWFwLCAgc28gICBpdCAgc2hvdWxkbid0ICBiZQogICAgY29uc2lkZXJlZCBjb21wbGV0ZWQgcmlnaHQgbm93LgoKICAgIEl0ICBpcyB0aGVyZSAgdG8gYmUgIG1vcmUgYSAgcHJvb2Ygb2YgIGNvbmNlcHQgdGhhbiAgYW55dGhpbmcgZWxzZQogICAgYW55d2F5LiAgVGhlIGRyaXZlciBpcyBhIHNpbmdsZSAgQyBzb3VyY2UgZmlsZSwgdGhhdCBjb21waWxlcyB0byAzCiAgICBLYiBvZiBjb2RlLgoKICAgIEknbSAgc3RpbGwgd29ya2luZyBvbiAgdGhlIFBDRi9CREYgIGRyaXZlcnMsIGJ1dCAgSSdtIHRvbyAgbGF6eSB0bwogICAgZmluaXNoIHRoZW0gbm93LgoKICAtIENIQU5HRVMgVE8gVEhFIEhJR0gtTEVWRUwgQVBJCgogICAgKiBGVF9HZXRfS2VybmluZyBoYXMgYSBuZXcgcGFyYW1ldGVyIHRoYXQgYWxsb3dzIHlvdSB0byBzZWxlY3QgdGhlCiAgICAgIGNvb3JkaW5hdGVzIG9mIHRoZSBrZXJuaW5nICB2ZWN0b3IgKGZvbnQgdW5pdHMsIHNjYWxlZCwgc2NhbGVkICsKICAgICAgZ3JpZC1maXR0ZWQpLgogICAgKiBUaGUgIG91dGxpbmUgZnVuY3Rpb25zIGFyZSAgbm93IGluIDxmcmVldHlwZS9mdG91dGxuLmg+ICBhbmQgbm90CiAgICAgIHBhcnQgb2YgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+IGFueW1vcmUuCiAgICAqIDxmcmVldHlwZS9mdG1vZHVsZS5oPiAgICBub3cgICAgIGNvbnRhaW5zICAgIGRlY2xhcmF0aW9ucyAgICBmb3IKICAgICAgIEZUX05ld19MaWJyYXJ5LCBGVF9Eb25lX0xpYnJhcnksIEZUX0FkZF9EZWZhdWx0X01vZHVsZXMuCiAgICAqIFRoZSBzby1jYWxsZWQgY29udmVuaWVuY2UgIGZ1bmN0aW9ucyBoYXZlIG1vdmVkIGZyb20gImZ0b3V0bG4uYyIKICAgICAgdG8gICJmdGdseXBoLmMiLCAgYW5kICBhcmUgIHRodXMgYXZhaWxhYmxlICB3aXRoICB0aGlzICBvcHRpb25hbAogICAgICBjb21wb25lbnQgICAgb2YgICB0aGUgICBsaWJyYXJ5LiAgICAgVGhleSAgIGFyZSAgICBkZWNsYXJlZCAgIGluCiAgICAgIDxmcmVldHlwZS9mdGdseXBoLmg+IG5vdy4KICAgICogQW50aS1hbGlhc2VkICByZW5kZXJpbmcgaXMgbm93ICB0aGUgZGVmYXVsdCAgZm9yIEZUX1JlbmRlcl9HbHlwaAogICAgICAoaS5lLiBjb3JyZXNwb25kcyB0byByZW5kZXJfbW9kZSA9PSAwID09IGZ0X3JlbmRlcl9tb2RlX25vcm1hbCkuCiAgICAgIFRvIGdlbmVyYXRlIGEgbW9ub2Nocm9tZSBiaXRtYXAsIHVzZSBmdF9yZW5kZXJfbW9kZV9tb25vLCBvciB0aGUKICAgICAgRlRfTE9BRF9NT05PQ0hST01FICAgICBmbGFnICAgIGluICAgIEZUX0xvYWRfR2x5cGgvRlRfTG9hZF9DaGFyLgogICAgICBGVF9MT0FEX0FOVElfQUxJQVMgaXMgc3RpbGwgZGVmaW5lZCwgYnV0IHZhbHVlcyB0byAwLgogICAgKiA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4gIG5vdyBpbmNsdWRlIDxmcmVldHlwZS9jb25maWcvZnRjb25maWcuaD4sCiAgICAgIHNvbHZpbmcgYSBmZXcgaGVhZGFjaGVzIDotKQogICAgKiBUaGUgdHlwZSBGVF9HbHlwaFNsb3RSZWMgaGFzIG5vdyBhICJsaWJyYXJ5IiBmaWVsZC4KCiAgLSBDSEFOR0VTIFRPIFRIRSAiZnRnbHlwaC5oIiBBUEkKCiAgICBUaGlzIEFQSSBoYXMgIGJlZW4gc2V2ZXJlbHkgbW9kaWZpZWQgaW4gb3JkZXIgIHRvIG1ha2UgaXQgc2ltcGxlciwKICAgIGNsZWFyZXIsIGFuZCBtb3JlICBlZmZpY2llbnQuICBJdCBjZXJ0YWlubHkgbm93IGxvb2tzICBsaWtlIGEgcmVhbAogICAgImdseXBoIGZhY3RvcnkiICBvYmplY3QsIGFuZCBhbGxvd3MgY2xpZW50ICBhcHBsaWNhdGlvbnMgdG8gbWFuYWdlCiAgICAoaS5lLiAgdHJhbnNmb3JtLCAgYmJveCAgYW5kICByZW5kZXIpIGdseXBoICBpbWFnZXMgIHdpdGhvdXQgIGV2ZXIKICAgIGtub3dpbmcgdGhlaXIgb3JpZ2luYWwgZm9ybWF0LgoKICAtIEFkZGVkICBzdXBwb3J0ICBmb3IgQ0lELWtleWVkICBmb250cyAgdG8gIHRoZSAgQ0ZGIGRyaXZlci4gICBNYXliZQogICAgc3VwcG9ydCBmb3IgcHVyZSBDRkYgKyBDRUYgZm9udHMgc2hvdWxkIGNvbWUgaW4/CgogIC0gQ2xlYW5lZCB1cCAgc291cmNlIGNvZGUgaW4gb3JkZXIgIHRvIGF2b2lkIHR3byAgZnVuY3Rpb25zIHdpdGggdGhlCiAgICBzYW1lIG5hbWUuICBBbHNvICBjaGFuZ2VkIHRoZSBuYW1lcyBvZiB0aGUgIGZpbGVzIGluICJ0eXBlMXoiIGZyb20KICAgICJ0MVhYWFgiIHRvICJ6MVhYWFgiIGluIG9yZGVyIHRvIGF2b2lkIGFueSBjb25mbGljdHMuCgogICAgIm1ha2UgbXVsdGkiIG5vdyB3b3JrcyB3ZWxsIDotKQoKICAgIEFsc28gcmVtb3ZlZCB0aGUgdXNlIG9mICJjaWRhZm0iIGZvciBub3csIGV2ZW4gaWYgdGhlIHNvdXJjZSBmaWxlcwogICAgYXJlICBzdGlsbCB0aGVyZS4gIFRoaXMgIGZ1bmN0aW9uYWxpdHkgd2lsbCAgY2VydGFpbmx5ICBnbyBpbnRvICBhCiAgICBzcGVjaWZpYyBtb2R1bGUuCgogIC0gQURERUQgU1VQUE9SVCBGT1IgVEhFIEFVVE8tSElOVEVSCgogICAgSXQgIHdvcmtzIDotKSBJICBoYXZlIGEgIGRlbW8gcHJvZ3JhbSAgd2hpY2ggc2ltcGx5ICBpcyBhICBjb3B5IG9mCiAgICAiZnR2aWV3IiAgICAgICB0aGF0ICAgICAgZG9lcyAgICAgICBhICAgICAgYEZUX0FkZF9Nb2R1bGUobGlicmFyeSwKICAgICZhdXRvaGludGVyX21vZHVsZV9jbGFzcyknIGFmdGVyICBsaWJyYXJ5IGluaXRpYWxpemF0aW9uLCBhbmQgVHlwZQogICAgMSAmIE9wZW5UeXBlL0NGRiBmb250cyBhcmUgbm93IGhpbnRlZC4KCiAgICBDSUQgIGZvbnRzIGFyZSAgbm90IGhpbnRlZCwgIGFzIHRoZXkgIGluY2x1ZGUgbm8gIGNoYXJtYXAgIGFuZCB0aGUKICAgIGF1dG8taGludGVyIGRvZXNuJ3QgaW5jbHVkZSAgImdlbmVyaWMiIGdsb2JhbCBtZXRyaWNzIGNvbXB1dGF0aW9ucwogICAgeWV0LgoKICAgIE5vdywgSSBuZWVkIHRvIHJlbGVhc2UgdGhpcyB0aGluZyB0byB0aGUgRnJlZVR5cGUgMiBzb3VyY2UuCgogIC0gQ0hBTkdFUyBUTyBUSEUgUkVOREVSRVIgTU9EVUxFUwoKICAgIFRoZSAgbW9ub2Nocm9tZSAgYW5kIHNtb290aCAgcmVuZGVyZXJzICBhcmUgIG5vdyAgaW4gdHdvICBkaXN0aW5jdAogICAgZGlyZWN0b3JpZXMsIG5hbWVseSAic3JjL3Jhc3RlcjEiIGFuZCAic3JjL3Ntb290aCIuICBOb3RlIHRoYXQgdGhlCiAgICBvbGQgInNyYy9yZW5kZXJlciIgaXMgbm93IGdvbmUuCgogICAgSSBkaXRjaGVkICB0aGUgNS1ncmF5LWxldmVscyByZW5kZXJlcnMuICBCYXNpY2FsbHksICBpdCBpbnZvbHZlZCBhCiAgICBzaW1wbGUgI2RlZmluZSB0b2dnbGUgaW4gJ3NyYy9yYXN0ZXIxL2Z0cmFzdGVyLmMnLgoKICAgIEZUX1JlbmRlcl9HbHlwaCwgIEZUX091dGxpbmVfUmVuZGVyICAmICBGVF9PdXRsaW5lX0dldF9CaXRtYXAgIG5vdwogICAgc2VsZWN0IHRoZSBiZXN0IHJlbmRlcmVyICBhdmFpbGFibGUsIGRlcGVuZGluZyBvbiByZW5kZXIgbW9kZS4gIElmCiAgICB0aGUgY3VycmVudCByZW5kZXJlciBmb3IgYSAgZ2l2ZW4gZ2x5cGggaW1hZ2UgZm9ybWF0IGlzbid0IGNhcGFibGUKICAgIG9mIHN1cHBvcnRpbmcgIHRoZSByZW5kZXIgbW9kZSwgYW5vdGhlciAgb25lIHdpbGwgYmUgIGZvdW5kIGluIHRoZQogICAgbGlicmFyeSdzIGxpc3QuICAgVGhpcyBtZWFucyB0aGF0IGNsaWVudCBhcHBsaWNhdGlvbnMgIGRvIG5vdCBuZWVkCiAgICB0byAgc3dpdGNoIG9yICBzZXQgIHRoZSAgcmVuZGVyZXJzIHRoZW1zZWx2ZXMgIChhcyAgaW4gdGhlICBsYXRlc3QKICAgIGNoYW5nZSksIHRoZXknbGwgZ2V0IHdoYXQgdGhleSB3YW50IGF1dG9tYXRpY2FsbHkuICBBdCBsYXN0LgoKICAgIENoYW5nZWQgdGhlIGRlbW8gcHJvZ3JhbXMgYWNjb3JkaW5nbHkuCgogIC0gTUFKT1IgSU5URVJOQUwgUkVERVNJR046CgogICAgQSBsb3Qgb2YgaW50ZXJuYWwgbW9kaWZpY2F0aW9ucyAgaGF2ZSBiZWVuIHBlcmZvcm1lZCBsYXRlbHkgb24gdGhlCiAgICBzb3VyY2UgaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgZm9sbG93aW5nIGVuaGFuY2VtZW50czoKCiAgICAqIE1vcmUgZ2VuZXJpYyBtb2R1bGUgc3VwcG9ydDoKCiAgICAgIFRoZSBGVF9Nb2R1bGUgIHR5cGUgaXMgIG5vdyBkZWZpbmVkIHRvICByZXByZXNlbnQgYSBoYW5kbGUgIHRvIGEKICAgICAgZ2l2ZW4gIG1vZHVsZS4gICBUaGUgIGZpbGUgIDxmcmVldHlwZS9mdG1vZHVsZS5oPiAgY29udGFpbnMgIHRoZQogICAgICBGVF9Nb2R1bGVfQ2xhc3MgZGVmaW5pdGlvbiwgYXMgd2VsbCBhcyB0aGUgbW9kdWxlLWxvYWRpbmcgcHVibGljCiAgICAgIEFQSS4KCiAgICAgIFRoZSAgRlRfRHJpdmVyIHR5cGUgIGlzIHN0aWxsICBkZWZpbmVkLCBhbmQgIHN0aWxsICByZXByZXNlbnRzIGEKICAgICAgcG9pbnRlciB0byAgYSBmb250IGRyaXZlci4gIE5vdGUgdGhhdCAgRlRfQWRkX0RyaXZlciBpcyByZXBsYWNlZAogICAgICBieSBGVF9BZGRfTW9kdWxlLCBGVF9HZXRfRHJpdmVyIGJ5IEZUX0dldF9Nb2R1bGUsIGV0Yy4KCiAgICAqIFN1cHBvcnQgZm9yIGdlbmVyaWMgZ2x5cGggaW1hZ2UgdHlwZXM6CgogICAgICBUaGUgRlRfUmVuZGVyZXIgIHR5cGUgaXMgYSBwb2ludGVyICB0byBhIG1vZHVsZSAgdXNlZCB0byBwZXJmb3JtCiAgICAgIHZhcmlvdXMgb3BlcmF0aW9ucyBvbiBnbHlwaCBpbWFnZS4KCiAgICAgIEVhY2ggcmVuZGVyZXIgaXMgIGNhcGFibGUgb2YgaGFuZGxpbmcgaW1hZ2VzIGluICBhIHNpbmdsZSBmb3JtYXQKICAgICAgKGUuZy4gZnRfZ2x5cGhfZm9ybWF0X291dGxpbmUpLiAgSXRzIGZ1bmN0aW9ucyBhcmUgdXNlZCB0bzoKCiAgICAgIC0gdHJhbnNmb3JtIGFuIGdseXBoIGltYWdlCiAgICAgIC0gcmVuZGVyIGEgZ2x5cGggaW1hZ2UgaW50byBhIGJpdG1hcAogICAgICAtIHJldHVybiB0aGUgY29udHJvbCBib3ggKGRpbWVuc2lvbnMpIG9mIGEgZ2l2ZW4gZ2x5cGggaW1hZ2UKCiAgICAgIFRoZSBzY2FuIGNvbnZlcnRlcnMgImZ0cmFzdGVyLmMiIGFuZCAiZnRncmF5cy5jIiBoYXZlIGJlZW4gbW92ZWQKICAgICAgdG8gdGhlIG5ldyBkaXJlY3RvcnkgInNyYy9yZW5kZXJlciIsIGFuZCBhcmUgdXNlZCB0byBwcm92aWRlIHR3bwogICAgICBkZWZhdWx0IHJlbmRlcmVyIG1vZHVsZXMuCgogICAgICBPbmUgY29ycmVzcG9uZHMgIHRvIHRoZSAic3RhbmRhcmQiIHNjYW4tY29udmVydGVyLCAgdGhlIG90aGVyIHRvCiAgICAgIHRoZSAic21vb3RoIiBvbmUuCgogICAgICBoZSAgY3VycmVudCAgcmVuZGVyZXIgIGNhbiAgYmUgIHNldCAgdGhyb3VnaCAgdGhlICBuZXcgIGZ1bmN0aW9uCiAgICAgIEZUX1NldF9SZW5kZXJlci4KCiAgICAgIFRoZSBvbGQgcmFzdGVyLXJlbGF0ZWQgZnVuY3Rpb24gRlRfU2V0X1Jhc3RlciwgRlRfR2V0X1Jhc3RlciBhbmQKICAgICAgRlRfU2V0X1Jhc3Rlcl9Nb2RlIGhhdmUgbm93IGRpc2FwcGVhcmVkLCBpbiBmYXZvciBvZiB0aGUgbmV3OgoKICAgICAgICBGVF9HZXRfUmVuZGVyZXIKICAgICAgICBGVF9TZXRfUmVuZGVyZXIKCiAgICAgIFNlZSB0aGUgZmlsZSA8ZnJlZXR5cGUvZnRyZW5kZXIuaD4gZm9yIG1vcmUgZGV0YWlscy4KCiAgICAgIFRoZXNlICBjaGFuZ2VzICB3ZXJlICBuZWNlc3NhcnkgIHRvIHByb3Blcmx5ICBzdXBwb3J0ICBkaWZmZXJlbnQKICAgICAgc2NhbGFibGUgZm9ybWF0cyBpbiB0aGUgZnV0dXJlLCBsaWtlIGJpLWNvbG9yIGdseXBocywgZXRjLgoKICAgICogR2x5cGggbG9hZGVyIG9iamVjdDoKCiAgICAgIEEgIG5ldyAgaW50ZXJuYWwgIG9iamVjdCwgIGNhbGxlZCAgYSAgJ2dseXBoICBsb2FkZXInICBoYXMgIGJlZW4KICAgICAgaW50cm9kdWNlZCBpbiB0aGUgYmFzZSBsYXllci4gIEl0IGlzIHVzZWQgYnkgYWxsIHNjYWxhYmxlIGZvcm1hdAogICAgICBmb250IGRyaXZlcnMgdG8gbG9hZCBnbHlwaHMgYW5kIGNvbXBvc2l0ZXMuCgogICAgICBUaGlzIG9iamVjdCAgaGFzIGJlZW4gIGNyZWF0ZWQgdG8gcmVkdWNlICB0aGUgY29kZSBzaXplICBvZiBlYWNoCiAgICAgIGRyaXZlciwgIGFzICBlYWNoICBvbmUgIG9mICB0aGVtICBiYXNpY2FsbHkgIHJlLWltcGxlbWVudGVkICBpdHMKICAgICAgZnVuY3Rpb25hbGl0eS4KCiAgICAgIFNlZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+IGFuZCB0aGUgRlRfR2x5cGhMb2FkZXIgdHlwZSBmb3IKICAgICAgbW9yZSBpbmZvcm1hdGlvbi4KCiAgICAqIEZUX0dseXBoU2xvdCBoYXMgbmV3IGZpZWxkczoKCiAgICAgIEluICBvcmRlciAgIHRvICBzdXBwb3J0ICBleHRlbmRlZCAgZmVhdHVyZXMgICAoc2VlICBiZWxvdyksICB0aGUKICAgICAgRlRfR2x5cGhTbG90IHN0cnVjdHVyZSBoYXMgYSBmZXcgbmV3IGZpZWxkczoKCiAgICAgIGxpbmVhckhvcmlBZHZhbmNlOgoKICAgICAgICBUaGlzICBmaWVsZCAgZ2l2ZXMgIHRoZSAgIGxpbmVhcmx5ICBzY2FsZWQgIChpLmUuICBzY2FsZWQgIGJ1dAogICAgICAgIHVuaGludGVkKSBhZHZhbmNlICB3aWR0aCBmb3IgdGhlICBnbHlwaCwgZXhwcmVzc2VkIGFzICBhIDE2LjE2CiAgICAgICAgZml4ZWQgcGl4ZWwgdmFsdWUuICBUaGlzIGlzIHVzZWZ1bCB0byBwZXJmb3JtIFdZU0lXWUcgdGV4dC4KCiAgICAgIGxpbmVhclZlcnRBZHZhbmNlOgogICAgICAgIFRoaXMgZmllbGQgIGdpdmVzIHRoZSBsaW5lYXJseSAgc2NhbGVkIGFkdmFuY2UgaGVpZ2h0ICBmb3IgdGhlCiAgICAgICAgZ2x5cGggIChyZWxldmFudCBpbiAgdmVydGljYWwgIGdseXBoIGxheW91dHMgIG9ubHkpLiAgVGhpcyAgaXMKICAgICAgICB1c2VmdWwgdG8gcGVyZm9ybSBXWVNJV1lHIHRleHQuCgogICAgICAgIE5vdGUgdGhhdCAgdGhlIHR3byBhYm92ZSBmaWVsZCByZXBsYWNlICB0aGUgcmVtb3ZlZCAibWV0cmljczIiCiAgICAgICAgZmllbGQgaW4gdGhlIGdseXBoIHNsb3QuCgogICAgICBhZHZhbmNlOgogICAgICAgIFRoaXMgZmllbGQgaXMgYSB2ZWN0b3IgIHRoYXQgZ2l2ZXMgdGhlIHRyYW5zZm9ybWVkIGFkdmFuY2UgZm9yCiAgICAgICAgdGhlIGdseXBoLiAgIEJ5IGRlZmF1bHQsIGl0IGNvcnJlc3BvbmRzIHRvICB0aGUgYWR2YW5jZSB3aWR0aCwKICAgICAgICB1bmxlc3MgIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICB3YXMgIHNwZWNpZmllZCAgd2hlbiAgY2FsbGluZwogICAgICAgIEZUX0xvYWRfR2x5cGggb3IgRlRfTG9hZF9DaGFyLgoKICAgICAgYml0bWFwX2xlZnQ6CiAgICAgICAgVGhpcyAgZmllbGQgZ2l2ZXMgIHRoZSAgZGlzdGFuY2UgaW4gIGludGVnZXIgIHBpeGVscyBmcm9tICB0aGUKICAgICAgICBjdXJyZW50IHBlbiBwb3NpdGlvbiAgdG8gdGhlIGxlZnQtbW9zdCBwaXhlbCBvZiAgYSBnbHlwaCBpbWFnZQogICAgICAgIElGIElUIElTICBBIEJJVE1BUC4gIEl0IGlzIG9ubHkgdmFsaWQgIHdoZW4gdGhlICJmb3JtYXQiIGZpZWxkCiAgICAgICAgaXMgc2V0IHRvICJmdF9nbHlwaF9mb3JtYXRfYml0bWFwIiwgZm9yIGV4YW1wbGUsIGFmdGVyIGNhbGxpbmcKICAgICAgICB0aGUgbmV3IGZ1bmN0aW9uIEZUX1JlbmRlcl9HbHlwaC4KCiAgICAgIGJpdG1hcF90b3A6CiAgICAgICAgVGhpcyAgZmllbGQgZ2l2ZXMgIHRoZSAgZGlzdGFuY2UgaW4gIGludGVnZXIgIHBpeGVscyBmcm9tICB0aGUKICAgICAgICBjdXJyZW50IHBlbiBwb3NpdGlvbiAobG9jYXRlZCBvbiB0aGUgYmFzZWxpbmUpIHRvIHRoZSB0b3AtbW9zdAogICAgICAgIHBpeGVsIG9mIHRoZSAgZ2x5cGggaW1hZ2UgSUYgSVQgSVMgIEEgQklUTUFQLiAgUG9zaXRpdmUgdmFsdWVzCiAgICAgICAgY29ycmVzcG9uZCB0byB1cHdhcmRzIFkuCgogICAgICBsb2FkZXI6CiAgICAgICAgVGhpcyAgaXMgYSAgbmV3ICBwcml2YXRlICBmaWVsZCBmb3IgIHRoZSAgZ2x5cGggc2xvdC4gICBDbGllbnQKICAgICAgICBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCB0b3VjaCBpdC4KCgogICAgKiBTdXBwb3J0IGZvciB0cmFuc2Zvcm1zIGFuZCBkaXJlY3QgcmVuZGVyaW5nIGluIEZUX0xvYWRfR2x5cGg6CgogICAgICBNb3N0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGZvdW5kIGluIDxmcmVldHlwZS9mdGdseXBoLmg+IGhhcyBiZWVuCiAgICAgIG1vdmVkIHRvIHRoZSBjb3JlIGxpYnJhcnkuIEhlbmNlLCB0aGUgZm9sbG93aW5nOgoKICAgICAgLSBBICAgdHJhbnNmb3JtICAgY2FuICAgYmUgICBzcGVjaWZpZWQgIGZvciAgIGEgICBmYWNlICAgdGhyb3VnaAogICAgICAgIEZUX1NldF9UcmFuc2Zvcm0uICB0aGlzIHRyYW5zZm9ybSAgaXMgYXBwbGllZCBieSBGVF9Mb2FkX0dseXBoCiAgICAgICAgdG8gIHNjYWxhYmxlIGdseXBoICBpbWFnZXMgKGkuZS4gIE5PVCBUTyAgQklUTUFQUykgIGJlZm9yZSB0aGUKICAgICAgICBmdW5jdGlvbiByZXR1cm5zLCB1bmxlc3MgdGhlIGJpdCBmbGFnIEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STQogICAgICAgIHdhcyBzZXQgaW4gdGhlIGxvYWQgZmxhZ3MuCgogICAgICAtIE9uY2UgIGEgIGdseXBoIGltYWdlICBoYXMgIGJlZW4gIGxvYWRlZCwgIGl0IGNhbiAgYmUgIGRpcmVjdGx5CiAgICAgICAgY29udmVydGVkICB0byAgYSAgYml0bWFwICBieSAgdXNpbmcgIHRoZSAgbmV3ICBGVF9SZW5kZXJfR2x5cGgKICAgICAgICBmdW5jdGlvbi4gIE5vdGUgdGhhdCB0aGlzICBmdW5jdGlvbiB0YWtlcyB0aGUgZ2x5cGggaW1hZ2UgZnJvbQogICAgICAgIHRoZSBnbHlwaCBzbG90LCAgYW5kIGNvbnZlcnRzIGl0IHRvIGEgIGJpdG1hcCB3aG9zZSBwcm9wZXJ0aWVzCiAgICAgICAgYXJlIHJldHVybmVkICBpbiAiZmFjZS5nbHlwaC5iaXRtYXAiLCAiZmFjZS5nbHlwaC5iaXRtYXBfbGVmdCIKICAgICAgICBhbmQgImZhY2UuZ2x5cGguYml0bWFwX3RvcCIuICBUaGUgIG9yaWdpbmFsIG5hdGl2ZSBpbWFnZSBtaWdodAogICAgICAgIGJlIGxvc3QgYWZ0ZXIgdGhlIGNvbnZlcnNpb24uCgogICAgICAtIFdoZW4gdXNpbmcgdGhlIG5ldyAgYml0IGZsYWcgRlRfTE9BRF9SRU5ERVIsIHRoZSBGVF9Mb2FkX0dseXBoCiAgICAgICAgYW5kICAgRlRfTG9hZF9DaGFyICAgZnVuY3Rpb25zICAgd2lsbCAgIGNhbGwgICBGVF9SZW5kZXJfR2x5cGgKICAgICAgICBhdXRvbWF0aWNhbGx5IHdoZW4gbmVlZGVkLgoKICAtIFJlZm9ybWF0dGVkIGFsbCAgbW9kdWxlcyBzb3VyY2UgIGNvZGUgaW4gb3JkZXIgIHRvIGdldCByaWQgIG9mIHRoZQogICAgYmFzaWMgZGF0YSB0eXBlcyByZWRpZmluaXRpb25zIChpLmUuICJUVF9JbnQiIGluc3RlYWQgb2YgIkZUX0ludCIsCiAgICAiVDFfRml4ZWQiICBpbnN0ZWFkICBvZiAgIkZUX0ZpeGVkIikuICBIZW5jZSAgdGhlICBmb3JtYXQtc3BlY2lmaWMKICAgIHByZWZpeGVzIGxpa2UgICJUVF8iLCAiVDFfIiwgICJUMl8iIGFuZCAiQ0lEXyIgIGFyZSBvbmx5ICB1c2VkIGZvcgogICAgcmVsZXZhbnQgc3RydWN0dXJlcy4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpPTEQgQ0hBTkdFUyBGT1IgQkVUQSA3CgogIC0gYnVnLWZpeGVkIHRoZSAgT3BlblR5cGUvQ0ZGIHBhcnNlci4gSXQgIG5vdyBsb2FkcyBhbmQgIGRpc3BsYXlzIG15CiAgICB0d28gIGZvbnRzIG5pY2VseSwgIGJ1dCBJJ20gIHByZXR0eSBjZXJ0YWluICB0aGF0IG1vcmUgIHRlc3RpbmcgaXMKICAgIG5lZWRlZCA6LSkKCiAgLSBmaXhlZCB0aGUgY3J1bW15IFR5cGUgMSBoaW50ZXIsIGl0IG5vdyBoYW5kbGVzIGFjY2VudGVkIGNoYXJhY3RlcnMKICAgIGNvcnJlY3RseSAod2VsbCwgdGhlIGFjY2VudCBpcyAgbm90IGFsd2F5cyB3ZWxsIHBsYWNlZCwgYnV0IHRoYXQncwogICAgYW5vdGhlciBwcm9ibGVtLi4pCgogIC0gYWRkZWQgdGhlIENJRC1rZXllZCBUeXBlIDEgIGRyaXZlciBpbiAic3JjL2NpZCIuIFdvcmtzIHByZXR0eSB3ZWxsCiAgICBmb3Igb25seSAxMyBLYiBvZiBjb2RlICA7LSkgRG9lc24ndCByZWFkIEFGTSBmaWxlcyB0aG91Z2gsIG5vciB0aGUKICAgIHJlYWxseSB1c2VmdWwgQ01BUCBmaWxlcy4uCgogIC0gZml4ZWQgdHdvIGJ1Z3MgaW4gdGhlIHNtb290aCByZW5kZXJlciAoc3JjL2Jhc2UvZnRncmF5cy5jKS4gVGhhbmtzCiAgICB0byBCb3JpcyBMZXRvY2hhIGZvciBzcG90dGluZyB0aGVtIGFuZCBwcm92aWRpbmcgYSBmaXguLgoKICAtIGZpeGVkIHBvdGVudGlhbCAiZGl2aWRlIGJ5IHplcm8iIGJ1Z3MgaW4gZnRjYWxjLmMuLiBteSBnb2QuLgoKICAtIGFkZGVkIHNvdXJjZSAgY29kZSBmb3IgIHRoZSBPcGVuVHlwZS9DRkYgZHJpdmVyICAoc3RpbGwgaW5jb21wbGV0ZQogICAgdGhvdWdoLi4pCgogIC0gbW9kaWZpZWQgdGhlICBTRk5UIGRyaXZlciBzbGlnaHRseSAgdG8gcGVyZm9ybSBtb3JlICByb2J1c3QgaGVhZGVyCiAgICBjaGVja3MgIGluIFRUX0xvYWRfU0ZOVF9IZWFkZXIuIFRoaXMgIHByZXZlbnRzIGNlcnRhaW4gIGZvbnQgZmlsZXMKICAgIChlLmcuICBzb21lICBUeXBlICAxICBNdWx0aXBsZSAgTWFzdGVycykgIGZyb20gIGJlaW5nICBpbmNvcnJlY3RseQogICAgInJlY29nbml6ZWQiIGFzIFRydWVUeXBlIGZvbnQgZmlsZXMuLgoKICAtIG1vdmVkIGEgbG90IG9mIHN0dWZmIGZyb20gIHRoZSBUcnVlVHlwZSBkcml2ZXIgdG8gdGhlIFNGTlQgbW9kdWxlLAogICAgdGhpcyAgIGFsbG93cyAgIGdyZWF0ZXIgICBjb2RlICAgcmUtdXNlICAgYmV0d2VlbiAgIGZvbnQgICBkcml2ZXJzCiAgICAoZS5nLiBUcnVlVHlwZSwgT3BlblR5cGUsIENvbXBhY3QtVHJ1ZVR5cGUsIGV0Yy4uKQoKICAtIGFkZGVkIGEgdGlueSBzZWdtZW50IGNhY2hlIHRvIHRoZSBTRk5UIENoYXJtYXAgNCBkZWNvZGVyLCBpbiBvcmRlcgogICAgdG8gbWluaW1hbGx5IHNwZWVkIGl0IHVwLi4KCiAgLSBhZGRlZCBzdXBwb3J0IGZvciBNdWx0aXBsZSBNYXN0ZXIgZm9udHMgaW4gInR5cGUxeiIuIFRoZXJlIGlzIGFsc28KICAgIGEgIG5ldyBmaWxlICBuYW1lZCAgPGZyZWV0eXBlL2Z0bW0uaD4gd2hpY2ggIGRlZmluZXMgZnVuY3Rpb25zICB0bwogICAgbWFuYWdlIHRoZW0gZnJvbSBjbGllbnQgYXBwbGljYXRpb25zLgoKICAgIFRoZSBuZXcgZmlsZSAic3JjL2Jhc2UvZnRtbS5jIiBpcyBhbHNvIG9wdGlvbmFsIHRvIHRoZSBlbmdpbmUuLgoKICAtIHZhcmlvdXMgIGZvcm1hdHRpbmcgY2hhbmdlcyAoZS5nLiAgRVhQT1JUX0RFRiAtPiAgRlRfRVhQT1JUX0RFRikgKwogICAgc21hbGwgYnVnIGZpeGVzIGluIEZUX0xvYWRfR2x5cGgsIHRoZSAidHlwZTEiIGRyaXZlciwgZXRjLi4KCiAgLSBhIG1pbm9yIGZpeCB0byB0aGUgVHlwZSAxIGRyaXZlciB0byBsZXQgdGhlbSBhcHBseSB0aGUgZm9udCBtYXRyaXgKICAgIGNvcnJlY3RseSAodXNlZCBmb3IgbWFueSBvYmxpcXVlIGZvbnRzLi4pCgogIC0gc29tZSBmaXhlcyBmb3IgNjQtYml0IHN5c3RlbXMgKG1haW5seSBjaGFuZ2luZyBzb21lIEZUX1RSQUNFIGNhbGxzCiAgICB0byB1c2UgJXAgaW5zdGVhZCBvZiAlbHgpLi4gVGhhbmtzIHRvIEthcmwgUm9iaWxsYXJkCgogIC0gZml4ZWQgIHNvbWUgYnVncyAgaW4gIHRoZSBzYml0ICBsb2FkZXIgKHNyYy9iYXNlL3NmbnQvdHRzYml0LmMpICArCiAgICBhZGRlZCAgYSBuZXcgZmxhZywgIEZUX0xPQURfQ1JPUF9CSVRNQVAgdG8gIHF1ZXJ5IHRoYXQgIGJpdG1hcHMgYmUKICAgIGNyb3BwZWQgd2hlbiAgbG9hZGVkIGZyb20gYSBmaWxlICAobWF5YmUgSSBzaG91bGQgIG1vdmUgdGhlIGJpdG1hcAogICAgY3JvcHBlciB0byB0aGUgYmFzZSBsYXllciA/PykuCgogIC0gY2hhbmdlZCB0aGUgZGVmYXVsdCAgbnVtYmVyIG9mIGdyYXkgbGV2ZWxzIG9mICB0aGUgc21vb3RoIHJlbmRlcmVyCiAgICB0byAyNTYgIChpbnN0ZWFkIG9mICB0aGUgcHJldmlvdXMgMTI4KS4gIE9mIGNvdXJzZSwgdGhlICBodW1hbiBleWUKICAgIGNhbid0IHNlZSBhbnkgZGlmZmVyZW5jZSA7LSkKCiAgLSByZW1vdmVkIFRUX01BWF9TVUJHTFlQSFMsICB0aGVyZSBpcyBubyBzdGF0aWMgbGltaXQgIG9uIHRoZSBudW1iZXIKICAgIG9mIHN1YmdseXBocyBpbiBhIFRydWVUeXBlIGZvbnQgbm93Li4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpPTEQgQ0hBTkdFUyAxNiBNYXkgMjAwMAoKICAtIHRhZ2dlZCAiQkVUQS02IiAgaW4gdGhlICBDVlMgdHJlZS4gVGhpcyAgb25lIGlzIGEgIHNlcmlvdXMgcmVsZWFzZQogICAgY2FuZGlkYXRlIGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3QgaW5jb3Jwb3JhdGUgdGhlIGF1dG8taGludGVyIHlldC4uCgogIC0gdmFyaW91cyBvYnNvbGV0ZSBmaWxlcyB3ZXJlIHJlbW92ZWQsIGFuZCBjb3B5cmlnaHQgaGVhZGVyIHVwZGF0ZWQKCiAgLSBmaW5hbGx5ICB1cGRhdGVkICB0aGUgIHN0YW5kYXJkICAgcmFzdGVyICB0byAgZml4ICB0aGUgIG1vbm9jaHJvbWUKICAgIHJlbmRlcmluZyBidWcgKyByZS1lbmFibGUgIHN1cHBvcnQgZm9yIDUtZ3JheSBsZXZlbHMgYW50aS1hbGlhc2luZwogICAgKHN1Y2ssIHN1Y2suLikKCiAgLSBjcmVhdGVkIG5ldyBoZWFkZXIgZmlsZXMsIGFuZCBtb2RpZmllZCBzb3VyY2VzIGFjY29yZGluZ2x5OgoKICAgICA8ZnJlZXR5cGUvZnR0eXBlcy5oPgogICAgICAgLSBzaW1wbGUgRnJlZVR5cGUgdHlwZXMsIHdpdGhvdXQgdGhlIEFQSQogICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oPgogICAgICAgLSBkZWZpbml0aW9uIG9mIG1lbW9yeS1tYW5hZ2VtZW50IG1hY3JvcwoKICAtIGFkZGVkICAgdGhlICAgIkRTSUciICAgKE9wZW5UeXBlICAgRGlnaXRhbCAgIFNpZ25hdHVyZSkgICB0YWcgICB0bwogICAgPGZyZWV0eXBlL3R0dGFncy5oPgoKICAtIGxpZ2h0IHVwZGF0ZS9jbGVhbmluZyBvZiB0aGUgYnVpbGQgc3lzdGVtICsgY2hhbmdlcyB0byB0aGUgc291cmNlcwogICAgaW4gIG9yZGVyICB0byAgZ2V0ICByaWQgIG9mIF9hbGxfICBjb21waWxlciAgd2FybmluZ3MgIHdpdGggIHRocmVlCiAgICBjb21waWxlcnMsIGkuZToKCiAgICBnY2Mgd2l0aCAiLWFuc2kgLXBlZGFudGljIC1XYWxsIC1XIiwgVmlzdWFsIEMrKyB3aXRoICIvVzMgL1dYIiBhbmQKICAgIExDQwoKICAgIElNUE9SVEFOVCBOT1RFIEZPUiBXSU4zMi1MQ0MgVVNFUlM6CiAgICB8CiAgICB8ICBJdCBzZWVtcyB0aGUgQyBwcmUtcHJvY2Vzc29yICB0aGF0IGNvbWVzIHdpdGggTENDIGlzIGJyb2tlbiwgaXQKICAgIHwgIGRvZXNuJ3QgIHJlY29nbml6ZSAgdGhlICBBTlNJICBzdGFuZGFyZCAgZGlyZWN0aXZlcyAgIyAgYW5kICAjIwogICAgfCAgY29ycmVjdGx5IHdoZW4gb25lIG9mIHRoZSAgYXJndW1lbnQgaXMgYSBtYWNyby4gQWxzbywgc29tZXRoaW5nCiAgICB8ICBsaWtlOgogICAgfAogICAgfCAgICAgI2RlZmluZSBGKHgpICBwcmludCMjeAogICAgfAogICAgfCAgICAgRigoImhlbGxvIikpCiAgICB8CiAgICB8ICB3aWxsIGdldCBpbmNvcnJlY3RseSB0cmFuc2xhdGVkIHRvOgogICAgfAogICAgfCAgICAgcHJpbnQgImhlbGxvIikKICAgIHwKICAgIHwgIGJ5IGl0cyBwcmUtcHJvY2Vzc29yLiBGb3IgIHRoaXMgcmVhc29uLCB5b3Ugc2ltcGx5IGNhbm5vdCBidWlsZAogICAgfCAgRnJlZVR5cGUgMiBpbiBkZWJ1ZyBtb2RlIHdpdGggdGhpcyBjb21waWxlci4uCgogIC0geWV0IGFub3RoZXIgbWFzc2l2ZSBncnVudCB3b3JrLiBJJ3ZlIGNoYW5nZWQgdGhlIGRlZmluaXRpb24gb2YgdGhlCiAgICBFWFBPUlRfREVGLCAgRVhQT1JUX0ZVTkMsIEJBU0VfREVGICYgIEJBU0VfRlVOQyBtYWNyb3MuICBUaGVzZSBub3cKICAgIHRha2UgYW4gYXJndW1lbnQsIHdoaWNoIGlzIHRoZSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZSB0eXBlLgoKICAgIFRoaXMgIGlzIG5lY2Vzc2FyeSB0byAgY29tcGlsZSBGcmVlVHlwZSAgYXMgYSAgRExMIG9uICBXaW5kb3dzIGFuZAogICAgT1MvMi4gIERlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIgdXNlZCwgYSBjb21waWxlci1zcGVjaWZpYyBrZXl3b3JkCiAgICBsaWtlICBfX2V4cG9ydCBvciBfX3N5c3RlbSAgbXVzdCBiZSAgcGxhY2VkIGJlZm9yZSAgKFZpc3VhbEMrKykgb3IKICAgIGFmdGVyIChCb3JsYW5kQysrKSB0aGUgdHlwZS4uCgogICAgT2YgY291cnNlLCB0aGlzIG5lZWRlZCBhIGxvdCBvZiBjaGFuZ2VzIHRocm91Z2hvdXQgdGhlIHNvdXJjZSBjb2RlCiAgICB0byBtYWtlIGl0IGNvbXBpbGUgYWdhaW4uLi4gQWxsIGNsZWFuZWQgdXAgbm93LCBhcHBhcmVudGx5Li4KCiAgICBOb3RlIGFsc28gIHRoYXQgdGhlcmUgaXMgYSAgbmV3IEVYUE9SVF9WQVIgbWFjcm8gIGRlZmluZWQgdG8gYWxsb3cKICAgIHRoZSAgIF9kZWNsYXJhdGlvbl8gICAgb2YgICBhbiAgIGV4cG9ydGFibGUgICAgcHVibGljICAgKGNvbnN0YW50KQogICAgdmFyaWFibGUuICBUaGlzICBpcyAgdGhlICAgY2FzZSAgb2YgIHRoZSAgcmFzdGVyICBpbnRlcmZhY2VzICAoc2VlCiAgICBmdHJhc3Rlci5oIGFuZCBmdGdyYXlzLmgpLCBhcyB3ZWxsIGFzIGVhY2ggbW9kdWxlJ3MgaW50ZXJmYWNlIChzZWUKICAgIHNmZHJpdmVyLmgsIHBzZHJpdmVyLmgsIGV0Yy4uKQoKICAtIG5ldyBmZWF0dXJlOiBpdCAgaXMgbm93IHBvc3NpYmxlIHRvIHBhc3MgIGV4dHJhIHBhcmFtZXRlcnMgdG8gZm9udAogICAgICAgICAgICAgICAgIGRyaXZlcnMgIHdoZW4gY3JlYXRpbmcgIGEgbmV3ICBmYWNlIG9iamVjdC4gIEZvciBub3csCiAgICAgICAgICAgICAgICAgdGhpcyBjYXBhYmlsaXR5IGlzIHVudXNlZC4gIEl0IGNvdWxkIGhvd2V2ZXIgcHJvdmUgdG8KICAgICAgICAgICAgICAgICBiZSB1c2VmdWwgaW4gYSBuZWFyIGZ1dHVyZS4uCgogICAgICB0aGUgRlRfT3Blbl9BcmdzIHN0cnVjdHVyZSB3YXMgIGNoYW5nZXMsIGFzIHdlbGwgYXMgdGhlIGludGVybmFsCiAgICAgIGRyaXZlciBpbnRlcmZhY2UgICh0aGUgc3BlY2lmaWMgImluaXRfZmFjZSIgIG1vZHVsZSBmdW5jdGlvbiBoYXMKICAgICAgbm93IGEgZGlmZmVyZW50IHNpZ25hdHVyZSkuCgogIC0gdXBkYXRlZCB0aGUgdHV0b3JpYWwgKG5vdCBmaW5pc2hlZCB0aG91Z2gpLgoKICAtIHVwZGF0ZWQgdGhlIHRvcC1sZXZlbCBCVUlMRCAgZG9jdW1lbnQKCiAgLSBmaXhlZCAgYSAgcG90ZW50aWFsIG1lbW9yeSAgbGVhayAgdGhhdCAgY291bGQgIG9jY3VyIHdoZW4gIGxvYWRpbmcKICAgIGVtYmVkZGVkIGJpdG1hcHMuCgogIC0gYWRkZWQgICAgIHRoZSAgICAgZGVjbGFyYXRpb24gICAgIG9mICAgICBGVF9OZXdfTWVtb3J5X0ZhY2UgICAgIGluCiAgICA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4sIGFzICBpdCB3YXMgIG1pc3NpbmcgZnJvbSB0aGUgIHB1YmxpYyBoZWFkZXIKICAgICh0aGUgaW1wbGVtZW50YXRpb24gd2FzIGFscmVhZHkgaW4gImZ0b2Jqcy5jIikuCgogIC0gdGhlIGZpbGUgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+IGhhcyBiZWVuIHNlcmlvdXNseSB1cGRhdGVkIGluIG9yZGVyCiAgICB0byBhbGxvdyB0aGUgYXV0b21hdGljIGdlbmVyYXRpb24gb2YgZXJyb3IgbWVzc2FnZSB0YWJsZXMuIFNlZSB0aGUKICAgIGNvbW1lbnRzIHdpdGhpbiBpdCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KCiAgLSBtYWpvciBkaXJlY3RvcnkgIGhpZXJhcmNoeSByZS1vcmdhbmlzYXRpb24uIFRoaXMgd2FzICBkb25lIGZvciB0d28KICAgIHRoaW5nczoKCiAgICAgICogZmlyc3QsICB0byBlYXNlICB0aGUgIm1hbnVhbCIgIGNvbXBpbGF0aW9uIG9mICB0aGUgIGxpYnJhcnkgYnkKICAgICAgICByZXF1aXJpbmcgYXQgbG90IGxlc3MgaW5jbHVkZSBwYXRocyA6LSkKCiAgICAgICogc2Vjb25kLCAgdG8gIGFsbG93ICBleHRlcm5hbCAgcHJvZ3JhbXMgdG8gIGVmZmVjdGl2ZWx5ICBhY2Nlc3MKICAgICAgICBpbnRlcm5hbCAgZGF0YSAgZmllbGRzLiBGb3IgIGV4YW1wbGUsICB0aGlzICBjYW4gYmUgIGV4dHJlbWVseQogICAgICAgIHVzZWZ1bCBpZiAgc29tZW9uZSB3YW50cyAgdG8gd3JpdGUgYSAgZm9udCBwcm9kdWNlciBvciAgYSBmb250CiAgICAgICAgbWFuYWdlciBvbiB0b3Agb2YgRnJlZVR5cGUuCgogICAgQmFzaWNhbGx5LCB5b3UgIHNob3VsZCBub3cgdXNlICB0aGUgJ2ZyZWV0eXBlLycgcHJlZml4ICBmb3IgaGVhZGVyCiAgICBpbmNsdXNpb24sIGFzIGluOgoKICAgICAgICAjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KICAgICAgICAjaW5jbHVkZSA8ZnJlZXR5cGUvZnRnbHlwaC5oPgoKICAgIFNvbWUgbmV3IGluY2x1ZGUgc3ViLWRpcmVjdG9yaWVzIGFyZSBhdmFpbGFibGU6CgogICAgIGEuIHRoZSAgImZyZWV0eXBlL2NvbmZpZyIgZGlyZWN0b3J5LCAgY29udGFpbnMgdHdvIGZpbGVzICB1c2VkIHRvCiAgICAgICAgY29uZmlndXJlIHRoZSBidWlsZCBvZiB0aGUgbGlicmFyeS4gQ2xpZW50IGFwcGxpY2F0aW9ucyBzaG91bGQKICAgICAgICBub3QgbmVlZCB0byBsb29rIGF0IHRoZXNlIG5vcm1hbGx5LCBidXQgdGhleSBjYW4gaWYgdGhleSB3YW50LgoKICAgICAgICAjaW5jbHVkZSA8ZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmg+CiAgICAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oPgoKICAgICBiLiB0aGUgImZyZWV0eXBlL2ludGVybmFsIiAgZGlyZWN0b3J5LCBjb250YWlucyBoZWFkZXIgZmlsZXMgdGhhdAogICAgICAgIGRlc2NyaWJlcyBsaWJyYXJ5ICBpbnRlcm5hbHMuIFRoZXNlIGFyZSB0aGUgIGhlYWRlciBmaWxlcyB0aGF0CiAgICAgICAgd2VyZSAgcHJldmlvdXNseSAgZm91bmQgIGluICB0aGUgInNyYy9iYXNlIiAgYW5kICAic3JjL3NoYXJlZCIKICAgICAgICBkaXJlY3Rvcmllcy4KCgogICAgQXMgIHVzdWFsLCB0aGUgYnVpbGQgIHN5c3RlbSBhbmQgIHRoZSBkZW1vcyAgaGF2ZSBiZWVuICB1cGRhdGVkIHRvCiAgICByZWZsZWN0IHRoZSBjaGFuZ2UuLgoKICAgIEhlcmUncyBhIGxheW91dCBvZiB0aGUgbmV3IGRpcmVjdG9yeSBoaWVyYXJjaHk6CgogICAgVE9QX0RJUgogICAgICBpbmNsdWRlLwogICAgICAgICBmcmVldHlwZS8KICAgICAgICAgICAgZnJlZXR5cGUuaAogICAgICAgICAgICAuLi4KICAgICAgICAgICAgY29uZmlnLwogICAgICAgICAgICAgIGZ0b3B0aW9uLmgKICAgICAgICAgICAgICBmdGNvbmZpZy5oCiAgICAgICAgICAgICAgZnRtb2R1bGUuaAoKICAgICAgICAgICAgaW50ZXJuYWwvCiAgICAgICAgICAgICAgZnRvYmpzLmgKICAgICAgICAgICAgICBmdHN0cmVhbS5oCiAgICAgICAgICAgICAgZnRjYWxjLmgKICAgICAgICAgICAgICAuLi4KCiAgICAgIHNyYy8KICAgICAgICAgYmFzZS8KICAgICAgICAgICAgLi4uCgogICAgICAgICBzZm50LwogICAgICAgICBwc25hbWVzLwogICAgICAgICB0cnVldHlwZS8KICAgICAgICAgdHlwZTEvCiAgICAgICAgIHR5cGUxei8KCgogICAgQ29tcGlsaW5nIGEgbW9kdWxlIGlzIG5vdyAgbXVjaCBlYXNpZXIsIGZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nCiAgICBzaG91bGQgd29yayB3aGVuIGluIHRoZSBUT1BfRElSIGRpcmVjdG9yeSBvbiBhbiBBTlNJIGJ1aWxkOgoKICAgICAgIGdjYyAtYyAtSS4vaW5jbHVkZSAtSS4vc3JjL2Jhc2Ugc3JjL2Jhc2UvZnRiYXNlLmMKICAgICAgIGdjYyAtYyAtSS4vaW5jbHVkZSAtSS4vc3JjL3NmbnQgc3JjL3NmbnQvc2ZudC5jCiAgICAgICBldGMuLgoKICAgIChvZiBjb3Vyc2UsIHVzaW5nIC1JY29uZmlnLzxzeXN0ZW0+IGlmIHlvdSBwcm92aWRlIHN5c3RlbS1zcGVjaWZpYwogICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMpLgoKICAtIHVwZGF0ZWQgdGhlIHN0cnVjdHVyZSBvZiBGVF9PdXRsaW5lX0Z1bmNzIGluIG9yZGVyIHRvIGFsbG93IGRpcmVjdAogICAgY29vcmRpbmF0ZSBzY2FsaW5nIHdpdGhpbiAgdGhlIG91dGxpbmUgZGVjb21wb3NpdGlvbiByb3V0aW5lICh0aGlzCiAgICBpcyAgaW1wb3J0YW50IGZvciB2aXJ0dWFsICAib24iIHBvaW50cyAgd2l0aCBUcnVlVHlwZSAgb3V0bGluZXMpICsKICAgIHVwZGF0ZXMgdG8gdGhlIHJhc3RlcnMgdG8gc3VwcG9ydCB0aGlzLi4KCiAgLSB1cGRhdGVkICB0aGUgT1MvMiAgdGFibGUgIGxvYWRpbmcgY29kZSAgaW4gInNyYy9zZm50L3R0bG9hZC5jIiAgaW4KICAgIG9yZGVyIHRvIHN1cHBvcnQgdmVyc2lvbiAyIG9mIHRoZSB0YWJsZSAoc2VlIE9wZW5UeXBlIDEuMiBzcGVjKQoKICAtIGNyZWF0ZWQgICJpbmNsdWRlL3R0dGFibGVzLmgiICBhbmQgICJpbmNsdWRlL3QxdGFibGVzLmgiIHRvICBhbGxvdwogICAgY2xpZW50IGFwcGxpY2F0aW9ucyB0byBhY2Nlc3Mgc29tZSBvZiAgdGhlIFNGTlQgYW5kIFQxIHRhYmxlcyBvZiBhCiAgICBmYWNlICB3aXRoICBhICBwcm9jZWR1cmFsICBpbnRlcmZhY2UgKHNlZSAgRlRfR2V0X1NmbnRfVGFibGUoKSkgICsKICAgIHVwZGF0ZXMgdG8gaW50ZXJuYWwgc291cmNlIGZpbGVzIHRvIHJlZmxlY3QgdGhlIGNoYW5nZS4uCgogIC0gc29tZSAgY2xlYW51cHMgaW4gIHRoZSBzb3VyY2UgIGNvZGUgdG8gIGdldCByaWQgIG9mICB3YXJuaW5ncyB3aGVuCiAgICBjb21waWxpbmcgd2l0aCB0aGUgIi1XYWxsIC1XIC1hbnNpIC1wZWRhbnRpYyIgb3B0aW9ucyBpbiBnY2MuCgogIC0gZGVidWdnZWQgYW5kIG1vdmVkIHRoZSBzbW9vdGggcmVuZGVyZXIgdG8gInNyYy9iYXNlL2Z0Z3JheXMuYyIgYW5kCiAgICBpdHMgaGVhZGVyIHRvICJpbmNsdWRlL2Z0Z3JheXMuaCIKCiAgLSB1cGRhdGVkIFRUX01BWF9TVUJHTFlQSFMgIHRvIDk2IGFzIHNvbWUgQ0pLICBmb250cyBoYXZlIGNvbXBvc2l0ZXMKICAgIHdpdGggdXAgdG8gODAgc3ViLWdseXBocyAhISBUaGFua3MgdG8gV2VybmVyCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKT0xEIENIQU5HRVMgLSAxNC1hcHItMjAwMAoKICAtIGZpeGVkICBhIGJ1ZyAgaW4gIHRoZSAgVHJ1ZVR5cGUgZ2x5cGggIGxvYWRlciAgdGhhdCBwcmV2ZW50ZWQgIHRoZQogICAgY29ycmVjdCBsb2FkaW5nIG9mIHNvbWUgQ0pLIGdseXBocyBpbiBtaW5nbGkudHRmCgogIC0gaW1wcm92ZWQgdGhlIHN0YW5kYXJkIFR5cGUgMSBoaW50ZXIgaW4gInNyYy90eXBlMSIKCiAgLSBmaXhlZCB0d28gYnVncyAgaW4gdGhlIGV4cGVyaW1lbnRhbCBUeXBlIDEgIGRyaXZlciBpbiAic3JjL3R5cGUxeiIKICAgIHRvIGhhbmRsZSB0aGUgbmV3IFhGcmVlODYgNC4wIGZvbnRzIChhbmQgYSBmZXcgb3RoZXIgb25lcy4uKQoKICAtIHRoZSBzbW9vdGggIHJlbmRlcmVyIGlzIG5vdyAgY29tcGxldGUgYW5kIHN1cHBvcnRzICBzdWItYmFuZGluZyB0bwogICAgcmVuZGVyIGxhcmdlIGdseXBocyBhdCBoaWdoIHNwZWVkLiBIb3dldmVyLCBpdCBpcyBzdGlsbCBsb2NhdGVkIGluCiAgICAiZGVtb3Mvc3JjL2Z0Z3JheXMuYyIgYW5kIHNob3VsZCBtb3ZlIHRvIHRoZSBsaWJyYXJ5IGl0c2VsZiBpbiB0aGUKICAgIG5leHQgIGJldGEuLiAgIE5PVEU6ICBUaGUgIHNtb290aCAgcmVuZGVyZXIgICBkb2Vzbid0ICBjb21waWxlICBpbgogICAgc3RhbmQtYWxvbmUgbW9kZSBhbnltb3JlLCBidXQgdGhpcyBzaG91bGQgYmUgZml4ZWQgUlNOLi4KCiAgLSBpbnRyb2R1Y2VkIGNvbnZlbmllbmNlICBmdW5jdGlvbnMgdG8gIG1vcmUgZWFzaWx5IGRlYWwgIHdpdGggZ2x5cGgKICAgIGltYWdlcywgc2VlICAiaW5jbHVkZS9mdGdseXBoLmgiIGZvciBtb3JlIGRldGFpbHMsIGFzICB3ZWxsIGFzIHRoZQogICAgbmV3ICBkZW1vIHByb2dyYW0gIG5hbWVkICJkZW1vcy9zcmMvZnRzdHJpbmcuYyIgIHRoYXQgZGVtb25zdHJhdGVzCiAgICBpdHMgdXNlCgogIC0gaW1wbGVtZW50ZWQgIEZUX0xPQURfTk9fUkVDVVJTRSBpbiAgYm90aCB0aGUgIFRydWVUeXBlIGFuZCAgVHlwZSAxCiAgICBkcml2ZXJzICAodGhpcyAgaXMgcmVxdWlyZWQgIGJ5ICB0aGUgIGF1dG8taGludGVyICB0byBpbXByb3ZlICBpdHMKICAgIHJlc3VsdHMpLgoKICAtIGNoYW5nZWQgICB0aGUgIHJhc3RlciAgIGludGVyZmFjZSwgIGluICAgb3JkZXIgIHRvICAgYWxsb3cgIGNsaWVudAogICAgYXBwbGljYXRpb25zIHRvIHByb3ZpZGUgdGhlaXIgb3duIHNwYW4tZHJhd2luZyBjYWxsYmFja3MuIEhvd2V2ZXIsCiAgICBvbmx5IHRoZSBzbW9vdGggcmVuZGVyZXIgIHN1cHBvcnRzIHRoaXMuIFNlZSAiRlRfUmFzdGVyX1BhcmFtcyIgaW4KICAgIHRoZSBmaWxlICJpbmNsdWRlL2Z0aW1hZ2UuaCIKCiAgLSBmaXhlZCAgYSBzbWFsbCBidWcgIGluIEZUX011bEZpeCAgdGhhdCBjYXVzZWQgIGluY29ycmVjdCB0cmFuc2Zvcm0KICAgIGNvbXB1dGF0aW9uIQoKICAtIE5vdGU6IFRoZSB0dXRvcmlhbCBpcyBvdXQtb2YtZGF0ZSwgZ3J1bXBmLi4gOi0oCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKT0xEIENIQU5HRVMgLSAxMi1tYXItMjAwMAoKICAtIGNoYW5nZWQgIHRoZSAgbGF5b3V0ICBvZiAgY29uZmlndXJhdGlvbiAgZmlsZXMgIDogIG5vdywgIGFsbCAgQU5TSQogICAgY29uZmlndXJhdGlvbiAgICAgICAgIGZpbGVzICAgICAgICAgYXJlICAgICAgICAgbG9jYXRlZCAgICAgICAgIGluCiAgICAiZnJlZXR5cGUyL2NvbmZpZyIuICBTeXN0ZW0tc3BlY2lmaWMgb3Zlci1yaWRlcyAgY2FuIGJlICBwbGFjZWQgaW4KICAgICJmcmVldHlwZTIvY29uZmlnLzxzeXN0ZW0+Ii4KCiAgLSBtb3ZlZCBhbGwgY29uZmlndXJhdGlvbiBtYWNyb3MgdG8gImNvbmZpZy9mdG9wdGlvbi5oIgoKICAtIGltcHJvdmVtZW50cyBpbiB0aGUgVHlwZSAxIGRyaXZlciB3aXRoIEFGTSBzdXBwb3J0CgogIC0gY2hhbmdlZCB0aGUgZmllbGRzICBpbiB0aGUgRlRfT3V0bGluZSBzdHJ1Y3R1cmUgOiAgdGhlIG9sZCAiZmxhZ3MiCiAgICBhcnJheSBpcyByZS1uYW1lZCAidGFncyIsIHdoaWxlIGFsbCBhbmNpZW50IGZsYWdzIGFyZSBlbmNvZGVkIGludG8KICAgIGEgc2luZ2xlIHVuc2lnbmVkIGludCBuYW1lZCAiZmxhZ3MiLgoKICAtIGludHJvZHVjZWQgICAgIG5ldyAgICAgIGZsYWdzICAgICBpbiAgICAgRlRfT3V0bGluZS5mbGFncyAgICAgKHNlZQogICAgZnRfb3V0bGluZV8uLi4uIGVudW1zIGluICJmdGltYWdlLmgiKS4KCiAgLSBjaGFuZ2VkIG91dGxpbmUgZnVuY3Rpb25zIHRvICJGVF9PdXRsaW5lXzxhY3Rpb24+IiBzeW50YXgKCiAgLSBhZGRlZCBhIHNtb290aCBhbnRpLWFsaWFzIHJlbmRlcmVyIHRvIHRoZSBkZW1vbnN0cmF0aW9uIHByb2dyYW1zCgogIC0gYWRkZWQgTWFjIGdyYXBoaWNzIGRyaXZlciAodGhhbmtzIEp1c3QpCgogIC0gRlRfT3Blbl9GYWNlICBjaGFuZ2VkICBpbiAgb3JkZXIgICB0byAgcmVjZWl2ZWQgIGEgIHBvaW50ZXIgIHRvICBhCiAgICBGVF9PcGVuX0FyZ3MgZGVzY3JpcHRvci4uCgogIC0gdmFyaW91cyAgY2xlYW51cHMsICBhICBmZXcgIG1vcmUgQVBJICBmdW5jdGlvbnMgIGltcGxlbWVudGVkICAoc2VlCiAgICBGVF9BdHRhY2hfRmlsZSkKCiAgLSB1cGRhdGVkIHNvbWUgZG9jcwoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk9MRCBDSEFOR0VTIC0gMjItZmViLTIwMDAKCiAgLSBpbnRyb2R1Y2VkIHRoZSAicHNuYW1lcyIgbW9kdWxlLiBJdCBpcyB1c2VkIHRvOgoKICAgICAgbyBjb252ZXJ0ICBhIFBvc3RzY3JpcHQgZ2x5cGggIG5hbWUgaW50byB0aGUgIGVxdWl2YWxlbnQgVW5pY29kZQogICAgICAgIGNoYXJhY3RlciBjb2RlICh1c2VkIGJ5IHRoZSAgVHlwZSAxIGRyaXZlcihzKSB0byBzeW50aGV0aXplIG9uCiAgICAgICAgdGhlIGZseSBhIFVuaWNvZGUgY2hhcm1hcCkuCgogICAgICBvIHByb3ZpZGUgYW4gIGludGVyZmFjZSB0byByZXRyaWV2ZSB0aGUgUG9zdHNjcmlwdCAgbmFtZXMgb2YgdGhlCiAgICAgICAgTWFjaW50b3NoLCAgQWRvYmUgIFN0YW5kYXJkICYgIEFkb2JlICBFeHBlcnQgY2hhcmFjdGVyICBjb2Rlcy4KICAgICAgICAodGhlIE1hY2ludG9zaCAgbmFtZXMgYXJlICB1c2VkIGJ5IHRoZSAgU0ZOVC1tb2R1bGUgcG9zdHNjcmlwdAogICAgICAgIG5hbWVzIHN1cHBvcnQgcm91dGluZXMsIHdoaWxlIHRoZSBvdGhlciB0d28gdGFibGVzIGFyZSB1c2VkIGJ5CiAgICAgICAgdGhlIFR5cGUgMSBkcml2ZXIocykpLgoKICAtIGludHJvZHVjZWQgdGhlICJ0eXBlMXoiIGFsdGVybmF0ZSBUeXBlICAxIGRyaXZlci4gVGhpcyBpcyBhIChzdGlsbAogICAgZXhwZXJpbWVudGFsKSBkcml2ZXIgIGZvciB0aGUgVHlwZSAgMSBmb3JtYXQgdGhhdCAgd2lsbCB1bHRpbWF0ZWx5CiAgICByZXBsYWNlIHRoZSBvbmUgIGluICJzcmMvdHlwZTEiLiBJdCB1c2VzIHBhdHRlcm4gIG1hdGNoaW5nIHRvIGxvYWQKICAgIGRhdGEgZnJvbSB0aGUgIGZvbnQsIGluc3RlYWQgb2YgYSBmaW5pdGUgIHN0YXRlIGFuYWx5emVyLiBJdCB3b3JrcwogICAgbXVjaCBiZXR0ZXIgdGhhbiB0aGUgIm9sZCIgIGRyaXZlciB3aXRoICJicm9rZW4iIGZvbnRzLiBJdCBpcyBhbHNvCiAgICBtdWNoIHNtYWxsZXIgKHVuZGVyIDE1IEtiKS4KCiAgLSB0aGUgIFR5cGUgMSAgZHJpdmVycyAoYm90aCAgaW4gInNyYy90eXBlMSIgIGFuZCAgInNyYy90eXBlMXoiKSBhcmUKICAgIG5lYXJseSAgY29tcGxldGUuICBUaGV5ICBib3RoICBwcm92aWRlIGF1dG9tYXRpYyAgVW5pY29kZSAgY2hhcm1hcAogICAgc3ludGhlc2lzIHRocm91Z2ggIHRoZSAicHNuYW1lcyIgbW9kdWxlLiBObyAgcmUtZW5jb2RpbmcgdmVjdG9yIGlzCiAgICBuZWVkZWQuICAobm90ZSAgdGhhdCB0aGV5ICBzdGlsbCAgbGVhayAgbWVtb3J5ICBkdWUgdG8gIHNvbWUgIGNvZGUKICAgIG1pc3NpbmcsIGFuZCBJJ20gZ2V0dGluZyBsYXp5KS4KCiAgICBUcml2aWFsIEFGTSBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkIHRvIHJlYWQga2VybmluZyBpbmZvcm1hdGlvbiBidXQKICAgIHdhc24ndCBleGFjdGx5IHRlc3RlZCBhcyBpdCBzaG91bGQgOy0pCgogIC0gVGhlIFRydWVUeXBlICBnbHlwaCBsb2FkZXIgaGFzICBiZWVuIHNlcmlvdXNseSByZXdyaXR0ZW4gIChzZWUgdGhlCiAgICBmaWxlICAic3JjL3RydWV0eXBlL3R0Z2xvYWQuYyIuIEl0ICBpcyBub3cgIG11Y2gsIG11Y2ggIHNpbXBsZXIgYXMKICAgIHdlbGwgYXMgIGVhc2llciB0byByZWFkLCAgbWFpbnRhaW4gYW5kIHVuZGVyc3RhbmQgIDotKSBQcmVsaW1pbmFyeQogICAgdmVyc2lvbnMgaW50cm9kdWNlZCBhICBtZW1vcnkgbGVhayB0aGF0IGhhcyBiZWVuICByZXBvcnRlZCBieSBKYWNrCiAgICBEYXZpcywgYW5kIGlzIG5vdyBmaXhlZC4uCgogIC0gaW50cm9kdWNlZCAgdGhlIG5ldyAgImZ0X2dseXBoX2Zvcm1hdF9wbG90dGVyIiwgdXNlZCAgdG8gcmVwcmVzZW50CiAgICBzdHJva2VkIG91dGxpbmVzICBsaWtlIFdpbmRvd3MgIlZlY3RvciIgZm9udHMsIGFuZCAgY2VydGFpbiBUeXBlIDEKICAgIGZvbnRzICBsaWtlICJIZXJzaGV5Ii4gIFRoZSBjb3JyZXNwb25kaW5nICByYXN0ZXIgd2lsbCAgYmUgd3JpdHRlbgogICAgc29vbi4KCiAgLSBGVF9OZXdfTWVtb3J5X0ZhY2UgIGlzICBnb25lLiAgTGlrZXdpc2UsICBGVF9PcGVuX0ZhY2UgaGFzICBhICBuZXcKICAgIGludGVyZmFjZSB0aGF0IHVzZXMgYSBzdHJ1Y3R1cmUgIHRvIGRlc2NyaWJlIHRoZSBpbnB1dCBzdHJlYW0sIHRoZQogICAgZHJpdmVyIChpZiByZXF1aXJlZCksIGV0Yy4uCgoKVE9ETwoKICAtIFdyaXRlIEZUX0dldF9HbHlwaF9CaXRtYXAgYW5kIEZUX0xvYWRfR2x5cGhfQml0bWFwCgogIC0gQWRkIGEgZnVuY3Rpb24gbGlrZSBGVF9Mb2FkX0NoYXJhY3RlciggZmFjZSwgY2hhcl9jb2RlLCBsb2FkX2ZsYWdzCiAgICApICB0aGF0ICB3b3VsZCByZWFsbHkgIGVtYmJlZCAgYSAgY2FsbCAgdG8gRlRfR2V0X0NoYXJfSW5kZXggIHRoZW4KICAgIEZUX0xvYWRfR2x5cGggdG8gZWFzZSBkZXZlbG9wZXIncyB3b3JrLgoKICAtIFVwZGF0ZSB0aGUgdHV0b3JpYWwhCgogIC0gY29uc2lkZXIgYWRkaW5nICBzdXBwb3J0IGZvciBNdWx0aXBsZSAgTWFzdGVyIGZvbnRzIGluIHRoZSAgVHlwZSAxCiAgICBkcml2ZXJzLgoKICAtIFRlc3QgdGhlIEFGTSByb3V0aW5lcyBvZiB0aGUgIFR5cGUgMSBkcml2ZXJzIHRvIGNoZWNrIHRoYXQga2VybmluZwogICAgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgY29ycmVjdGx5LgoKICAtIHdyaXRlIGEgZGVjZW50IGF1dG8tZ3JpZGRpbmcgY29tcG9uZW50ICAhISBXZSBuZWVkIHRoaXMgdG8gcmVsZWFzZQogICAgRnJlZVR5cGUgMi4wIGdvbGQgIQoKCmxlc3MgdXJnZW50IG5lZWRzOgoKICAtIGFkZCBhIENGRi9UeXBlMiBkcml2ZXIKICAtIGFkZCBhIEJERiBkcml2ZXIKICAtIGFkZCBhIEZOVC9QQ0YvSEJGIGRyaXZlcgogIC0gYWRkIGEgU3BlZWRvIGRyaXZlciBmcm9tIHRoZSBYMTEgc291cmNlcwoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk9MREVSIENIQU5HRVMgLSAyNy1qYW4tMjAwMAoKICAtIHVwZGF0ZWQgdGhlICAic2ZudCIgbW9kdWxlICBpbnRlcmZhY2UgdG8gYWxsb3cgIHNldmVyYWwgU0ZOVC1iYXNlZAogICAgZHJpdmVycyB0byBjby1leGlzdCBwZWFjZWZ1bGx5CgogIC0gdXBkYXRlZCAgdGhlICJUMV9GYWNlIiAgdHlwZSAgdG8gYmV0dGVyICBzZXBhcmF0ZSBQb3N0c2NyaXB0ICBmb250CiAgICBjb250ZW50ICBmcm9tIHRoZSAgcmVzdCBvZiAgdGhlIEZUX0ZhY2UgIHN0cnVjdHVyZS4gTWlnaHQgIGJlIHVzZWQKICAgIGxhdGVyIGJ5IHRoZSBDRkYvVHlwZTIgZHJpdmVyLi4KCiAgLSBhZGRlZCBhbiBleHBlcmltZW50YWwgcmVwbGFjZW1lbnQgVHlwZSAxIGRyaXZlciBmZWF0dXJpbmcgYWR2YW5jZWQKICAgIChhbmQgc3BlZWR5KSBwYXR0ZXJuIG1hdGNoaW5nIHRvIHJldHJpZXZlIHRoZSBkYXRhIGZyb20gcG9zdHNjcmlwdAogICAgZm9udHMuCgogIC0gdmVyeSBtaW5vciAgY2hhbmdlcyBpbiB0aGUgaW1wbGVtZW50YXRpb24gIG9mIEZUX1NldF9DaGFyX1NpemUgYW5kCiAgICBGVF9TZXRfUGl4ZWxfU2l6ZXMgKHRoZXkgbm93IGltcGxlbWVudCBkZWZhdWx0IHRvIGxpZ3RoZW4gdGhlIGZvbnQKICAgIGRyaXZlcidzIGNvZGUpLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk9MRCBNRVNTQUdFCgpUaGlzIGZpbGUgc3VtbWFyaXplcyB0aGUgY2hhbmdlcyB0aGF0IG9jY3VyZWQgc2luY2UgdGhlIGxhc3QgImJldGEiIG9mCkZyZWVUeXBlIDIuICBCZWNhdXNlICB0aGUgbGlzdCBpcyBpbXBvcnRhbnQsIGl0ICBoYXMgYmVlbiBkaXZpZGVkIGludG8Kc2VwYXJhdGUgc2VjdGlvbnM6CgpUYWJsZSBPZiBDb250ZW50czoKCiAgICBJICAgSGlnaC1MZXZlbCBJbnRlcmZhY2UgKGVhc2llciAhKQogICBJSSAgIERpcmVjdG9yeSBTdHJ1Y3R1cmUKICBJSUkgICBHbHlwaCBJbWFnZSBGb3JtYXRzCiAgIElWICAgQnVpbGQgU3lzdGVtCiAgICBWICAgUG9ydGFiaWxpdHkKICAgVkkgICBGb250IERyaXZlcnMKCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpIaWdoLUxldmVsIEludGVyZmFjZToKCiAgVGhlIGhpZ2gtbGV2ZWwgQVBJIGhhcyBiZWVuIGNvbnNpZGVyYWJseSBzaW1wbGlmaWVkLiAgSGVyZSBpcyBob3c6CgogICAgLSByZXNvdXJjZSBvYmplY3RzIGhhdmUgZGlzYXBwZWFyZWQuICB0aGlzIG1lYW5zIHRoYXQgZmFjZSBvYmplY3RzCiAgICAgIGNhbiBub3cgYmUgY3JlYXRlZCB3aXRoICBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsIChzZWUgRlRfTmV3X0ZhY2UKICAgICAgYW5kIEZUX09wZW5fRmFjZSkKCiAgICAtIHdoZW4gY2FsbGluZyAgZWl0aGVyIEZUX05ld19GYWNlICAmIEZUX09wZW5fRmFjZSwgYSAgc2l6ZSBvYmplY3QKICAgICAgYW5kIGEgZ2x5cGggc2xvdCBvYmplY3QgIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZm9yIHRoZSBmYWNlLAogICAgICBhbmQgY2FuICBiZSBhY2Nlc3NlZCAgdGhyb3VnaCAiZmFjZS0+Z2x5cGgiIGFuZCAgImZhY2UtPnNpemUiIGlmCiAgICAgIG9uZSByZWFsbHkgIG5lZWRzIHRvLiAgIEluIG1vc3QgY2FzZXMsICB0aGVyZSdzIG5vIG5lZWQgIHRvIGNhbGwKICAgICAgRlRfTmV3X1NpemUgb3IgRlRfTmV3X0dseXBoLgoKICAgIC0gc2ltaWxhcmx5LCAgRlRfTG9hZF9HbHlwaCAgbm93ICBvbmx5ICB0YWtlcyAgYSAgImZhY2UiICBhcmd1bWVudAogICAgICAoaW5zdGVhZCAgb2YgYSAgZ2x5cGggIHNsb3QgIGFuZCBhICBzaXplKS4gIEFsc28sIGl0J3MgICJyZXN1bHQiCiAgICAgIHBhcmFtZXRlciBpcyAgZ29uZSwgYXMgdGhlIGdseXBoICBpbWFnZSB0eXBlIGlzICByZXR1cm5lZCBpbiB0aGUKICAgICAgZmllbGQgImZhY2UtPmdseXBoLmZvcm1hdCIKCiAgICAtIHRoZSBsaXN0ICBvZiBhdmFpbGFibGUgIGNoYXJtYXBzIGlzIGRpcmVjdGx5ICBhY2Nlc3NpYmxlIHRocm91Z2gKICAgICAgImZhY2UtPmNoYXJtYXBzIiwgIGNvdW50aW5nICJmYWNlLT5udW1fY2hhcm1hcHMiICBlbGVtZW50cy4gRWFjaAogICAgICBjaGFybWFwICBoYXMgYW4gICdlbmNvZGluZycgIGZpZWxkIHdoaWNoICBzcGVjaWZpZXMgd2hpY2ggIGtub3duCiAgICAgIGVuY29kaW5nIGl0IGRlYWxzIHdpdGguIFZhbGlkIHZhbHVlcyBhcmUsIGZvciBleGFtcGxlIDoKCiAgICAgICAgICBmdF9lbmNvZGluZ191bmljb2RlICAgICAgKGZvciBBU0NJSSwgTGF0aW4tMSBhbmQgVW5pY29kZSkKICAgICAgICAgIGZ0X2VuY29kaW5nX2FwcGxlX3JvbWFuCiAgICAgICAgICBmdF9lbmNvZGluZ19zamlzCiAgICAgICAgICBmdF9lbmNvZGluZ19hZG9iZV9zdGFuZGFyZAogICAgICAgICAgZnRfZW5jb2RpbmdfYWRvYmVfZXhwZXJ0CgogICAgICBvdGhlciAgdmFsdWVzIG1heSAgYmUgYWRkZWQgIGluIHRoZSAgZnV0dXJlLiBFYWNoICBjaGFybWFwIHN0aWxsCiAgICAgIGhvbGRzICBpdHMgInBsYXRmb3JtX2lkIiAgYW5kICJlbmNvZGluZ19pZCIgIHZhbHVlcyBpbiAgY2FzZSB0aGUKICAgICAgZW5jb2RpbmcgaXMgdG9vIGV4b3RpYyBmb3IgdGhlIGN1cnJlbnQgbGlicmFyeQoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkRpcmVjdG9yeSBTdHJ1Y3R1cmU6CgogIFNob3VsZCBzZWVtIG9idmlvdXMgdG8gbW9zdCBvZiB5b3U6CgogICAgIGZyZWV0eXBlLwogICAgICAgICBjb25maWcvICAgICAgICAtLSBjb25maWd1cmF0aW9uIHN1Yi1tYWtlZmlsZXMKICAgICAgICAgICAgYW5zaS8KICAgICAgICAgICAgdW5peC8gICAgICAgLS0gcGxhdGZvcm0tc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlcwogICAgICAgICAgICB3aW4zMi8KICAgICAgICAgICAgb3MyLwogICAgICAgICAgICBtc2Rvcy8KCiAgICAgICAgIGluY2x1ZGUvICAgICAgIC0tIHB1YmxpYyBoZWFkZXIgIGZpbGVzLCB0aG9zZSB0byAgYmUgaW5jbHVkZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0bHkgYnkgY2xpZW50IGFwcHMKCiAgICAgICAgIHNyYy8gICAgICAgICAgIC0tIHNvdXJjZXMgb2YgdGhlIGxpYnJhcnkKICAgICAgICAgICBiYXNlLyAgICAgICAgLS0gdGhlIGJhc2UgbGF5ZXIKICAgICAgICAgICBzZm50LyAgICAgICAgLS0gdGhlIHNmbnQgImRyaXZlciIgIChzZWUgdGhlIGRyaXZlcnMgc2VjdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxvdykKICAgICAgICAgICB0cnVldHlwZS8gICAgLS0gdGhlIHRydWV0eXBlIGRyaXZlcgogICAgICAgICAgIHR5cGUxLyAgICAgICAtLSB0aGUgdHlwZTEgZHJpdmVyCiAgICAgICAgICAgc2hhcmVkLyAgICAgIC0tIHNvbWUgaGVhZGVyIGZpbGVzIHNoYXJlZCBiZXR3ZWVuIGRyaXZlcnMKCiAgICAgICAgIGRlbW9zLyAgICAgICAgIC0tIGRlbW9zL3Rvb2xzCgogICAgICAgICBkb2NzLyAgICAgICAgICAtLSBkb2N1bWVudGF0aW9uIChhIGJpdCBlbXB0eSBmb3Igbm93KQoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkdseXBoIEltYWdlIEZvcm1hdHM6CgogIERyaXZlcnMgYXJlIG5vdyBhYmxlIHRvICByZWdpc3RlciBuZXcgZ2x5cGggaW1hZ2UgZm9ybWF0cyB3aXRoaW4gdGhlCiAgbGlicmFyeS4gIEZvciAgbm93LCB0aGUgIGJhc2UgbGF5ZXIgc3VwcG9ydHMgIG9mIGNvdXJzZSAgYml0bWFwcyBhbmQKICB2ZWN0b3IgIG91dGxpbmVzLCBidXQgIG9uZSAgY291bGQgaW1hZ2luZSAgc29tZXRoaW5nIGRpZmZlcmVudCAgbGlrZQogIGNvbG9yZWQgYml0bWFwcywgYmktY29sb3IgdmVjdG9ycyBvciB3YXRoZXZlciBlbHNlIChNZXRhZm9udHMgYW55b25lCiAgPz8pLgoKICBTZWUgIHRoZSAgIGZpbGUgIGBpbmNsdWRlL2Z0aW1hZ2UuaCcuICAgTm90ZSAgYWxzbyAgdGhhdCAgIHRoZSAgdHlwZQogIEZUX1Jhc3Rlcl9NYXAgIGlzIGdvbmUsICBhbmQgIGlzIG5vdyAgcmVwbGFjZWQgIGJ5IEZUX0JpdG1hcCwgIHdoaWNoCiAgc2hvdWxkIGVuY29tcGFzcyBhbGwga25vd24gYml0bWFwIHR5cGVzLgoKICBFYWNoIG5ldyAgaW1hZ2UgZm9ybWF0ICBtdXN0IHByb3ZpZGUgYXQgIGxlYXN0IG9uZSAicmFzdGVyIiwgIGkuZS4gYQogIG1vZHVsZSBjYXBhYmxlIG9mICB0cmFuc2Zvcm1pbmcgdGhlIGdseXBoIGltYWdlIGludG8gIGEgYml0bWFwLiBJdCdzCiAgYWxzbyBwb3NzaWJsZSAgdG8gY2hhbmdlIHRoZSBkZWZhdWx0ICByYXN0ZXIgdXNlZCBmb3IgIGEgZ2l2ZW4gZ2x5cGgKICBpbWFnZSBmb3JtYXQuCgogIFRoZSBkZWZhdWx0IG91dGxpbmUgIHNjYW4tY29udmVydGVyIG5vdyB1c2VzIDEyOCBsZXZlbHMgIG9mIGdyYXlzIGJ5CiAgZGVmYXVsdCwgIHdoaWNoIHRlbmRzICB0byBzbW9vdGggIG1hbnkgIHRoaW5ncy4gTm90ZSAgdGhhdCB0aGUgIGRlbW8KICBwcm9ncmFtcyBoYXZlIGJlZW4gdXBkYXRlZCBzaWduaWZpY2FudGx5IGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlc2UuLgoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkJ1aWxkIHN5c3RlbToKCiAgWW91IHN0aWxsIG5lZWQgIEdOVSBNYWtlIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LiAgVGhlIGJ1aWxkIHN5c3RlbSBoYXMKICBiZWVuIHZlcnkgc2VyaW91c2x5IHJlLXZhbXBlZCBpbiBvcmRlciB0byBwcm92aWRlIHRoaW5ncyBsaWtlIDoKCiAgIC0gYXV0b21hdGljIGhvc3QgcGxhdGZvcm0gIGRldGVjdGlvbiAocmV2ZXJ0aW5nIHRvICdjb25maWcvYW5zaScgaWYKICAgICBpdCBpcyBub3QgZGV0ZWN0ZWQsIHdpdGggcHNldWRvLXN0YW5kYXJkIGNvbXBpbGF0aW9uIGZsYWdzKQoKICAgLSB0aGUgYWJpbGl0eSB0byBjb21waWxlIGZyb20gdGhlIE1ha2VmaWxlcyB3aXRoIHZlcnkgZGlmZmVyZW50IGFuZAogICAgIGV4b3RpYyBjb21waWxlcnMuIE5vdGUgdGhhdCAgbGlua2luZyB0aGUgbGlicmFyeSBjYW4gYmUgZGlmZmljdWx0CiAgICAgZm9yIHNvbWUgcGxhdGZvcm1zLgoKICAgICBGb3IgZXhhbXBsZSwgdGhlIGZpbGUgYGNvbmZpZy93aW4zMi9sY2NsaWIuYmF0JyBpcyBpbnZva2VkIGJ5IHRoZQogICAgIGJ1aWxkIHN5c3RlbSB0byBjcmVhdGUgdGhlICIubGliIiBmaWxlIHdpdGggTENDLVdpbjMyIGJlY2F1c2UgaXRzCiAgICAgbGlicmFyaWFuICBoYXMgdG9vICBtYW55IGZsYXdzICB0byBiZSAgaW52b2tlZCBkaXJlY3RseSAgZnJvbSB0aGUKICAgICBNYWtlZmlsZS4KCiAgSGVyZSdzIGhvdyBpdCB3b3JrczoKCiAgLSB0aGUgZmlyc3QgdGltZSB5b3UgdHlwZSBgbWFrZScsICB0aGUgYnVpbGQgc3lzdGVtIHJ1bnMgYSBzZXJpZXMgb2YKICAgIHN1Yi1tYWtlZmlsZXMgaW4gb3JkZXIgdG8gZGV0ZWN0IHlvdXIgaG9zdCBwbGF0Zm9ybS4gSXQgdGhlbiBkdW1wcwogICAgd2hhdCAgaXQgZm91bmQsICBhbmQgIGNyZWF0ZXMgIGEgZmlsZSAgY2FsbGVkICBgY29uZmlnLm1rJyBpbiAgdGhlCiAgICBjdXJyZW50ICBkaXJlY3RvcnkuIFRoaXMgIGlzIGEgIHN1Yi1NYWtlZmlsZSB1c2VkICB0byAgZGVmaW5lIG1hbnkKICAgIGltcG9ydGFudCBNYWtlIHZhcmlhYmxlcyB1c2VkIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LgoKICAtIHRoZSBzZWNvbmQgdGltZSwgdGhlIGJ1aWxkIHN5c3RlbSBkZXRlY3RzIHRoZSBgY29uZmlnLm1rJyB0aGVuIHVzZQogICAgaXQgIHRvICBidWlsZCB0aGUgIGxpYnJhcnkuICBBbGwgb2JqZWN0ICBmaWxlcyAgZ28gIGludG8gJ29iaicgIGJ5CiAgICBkZWZhdWx0LCAgYXMgd2VsbCAgYXMgdGhlICBsaWJyYXJ5IGZpbGUsICBidXQgdGhpcyAgY2FuICBlYXNpbHkgYmUKICAgIGNoYW5nZWQuCgogIE5vdGUgdGhhdCAgeW91IGNhbiBydW4gIm1ha2UgIHNldHVwIiB0byBmb3JjZSAgYW5vdGhlciBob3N0IHBsYXRmb3JtCiAgZGV0ZWN0aW9uICBldmVuICAgaWYgIGEgIGBjb25maWcubWsnICBpcyAgcHJlc2VudCAgIGluICB0aGUgIGN1cnJlbnQKICBkaXJlY3RvcnkuICBBbm90aGVyIHNvbHV0aW9uICBpcyAgc2ltcGx5IHRvICBkZWxldGUgIHRoZSBmaWxlLCAgdGhlbgogIHJlLXJ1biBtYWtlLgoKICBGaW5hbGx5LCB0aGUgIGRlZmF1bHQgY29tcGlsZXIgIGZvciBhbGwgcGxhdGZvcm1zICBpcyBnY2MgIChmb3Igbm93LAogIHRoaXMgd2lsbCBob3BlZnVsbHkgY2hhbmdlZCBpbiAgdGhlIGZ1dHVyZSkuIFlvdSBjYW4gaG93ZXZlciBzcGVjaWZ5CiAgYSBkaWZmZXJlbnQgIGNvbXBpbGVyIGJ5IHNwZWNpZnlpbmcgIGl0IGFmdGVyIHRoZSAnc2V0dXAnICB0YXJnZXQgYXMKICBpbjoKCiAgICAgIGdudW1ha2Ugc2V0dXAgbGNjICAgICAgICAgb24gV2luMzIgdG8gdXNlIHRoZSBMQ0MgY29tcGlsZXIKICAgICAgZ251bWFrZSBzZXR1cCB2aXN1YWxjICAgICBvbiBXaW4zMiB0byB1c2UgVmlzdWFsIEMrKwoKICBTZWUgIHRoZSBmaWxlICBgY29uZmlnLzxzeXN0ZW0+L2RldGVjdC5taycgZm9yICBhIGxpc3QgIG9mIHN1cHBvcnRlZAogIGNvbXBpbGVycyBmb3IgeW91ciBwbGF0Zm9ybXMuCgogIEl0IHNob3VsZCBiZSByZWxhdGl2ZWx5IGVhc3kgIHRvIHdyaXRlIG5ldyBkZXRlY3Rpb24gcnVsZXMgZmlsZXMgYW5kCiAgY29uZmlnLm1rLi4KCiAgRmluYWxseSwgdG8gIGJ1aWxkIHRoZSBkZW1vIHByb2dyYW1zLCAgZ28gdG8gYGRlbW9zJyAgYW5kIGxhdW5jaCBHTlUKICBNYWtlLCBpdCB3aWxsIHVzZSB0aGUgYGNvbmZpZy5taycgIGluIHRoZSB0b3AgZGlyZWN0b3J5IHRvIGJ1aWxkIHRoZQogIHRlc3QgcHJvZ3JhbXMuLgoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClBvcnRhYmlsaXR5OgoKICBJbiAgdGhlICBwcmV2aW91cyAgYmV0YSwgIGEgIHNpbmdsZSBGVF9TeXN0ZW0gIG9iamVjdCAgd2FzICB1c2VkICB0bwogIGVuY29tcGFzcyAgYWxsICBsb3ctbGV2ZWwgIG9wZXJhdGlvbnMgbGlrZSAgdGhyZWFkICBzeW5jaHJvbmlzYXRpb24sCiAgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIGkvbyBhY2Nlc3MuIFRoaXMgaGFzIGJlZW4gZ3JlYXRseSBzaW1wbGlmaWVkOgoKICAgIC0gdGhyZWFkIHN5bmNocm9uaXNhdGlvbiAgaGFzIGJlZW4gZHJvcHBlZCwgZm9yICB0aGUgc2ltcGxlIHJlYXNvbgogICAgICB0aGF0IHRoZSBsaWJyYXJ5ICBpcyBhbHJlYWR5IHJlLWVudHJhbnQsIGFuZCB0aGF0ICBpZiB5b3UgcmVhbGx5CiAgICAgIG5lZWQgIHR3byAgdGhyZWFkcyBhY2Nlc3NpbmcgIHRoZSAgc2FtZSAgRlRfTGlicmFyeSwgeW91ICBzaG91bGQKICAgICAgcmVhbGx5IHN5bmNocm9uaXplIGFjY2VzcyB0byBpdCB5b3Vyc2VsZiB3aXRoIGEgc2ltcGxlIG11dGV4LgoKICAgIC0gbWVtb3J5ICBtYW5hZ2VtZW50IGlzICBwZXJmb3JtZWQgIHRocm91Z2ggYSAgdmVyeSBzaW1wbGUgIG9iamVjdAogICAgICBjYWxsZWQgIkZUX01lbW9yeSIsICB3aGljaCByZWFsbHkgaXMgYSB0YWJsZSAgY29udGFpbmluZyBhIHRhYmxlCiAgICAgIG9mIHBvaW50ZXJzIHRvICBmdW5jdGlvbnMgbGlrZSBtYWxsb2MsIHJlYWxsb2MgYW5kICBmcmVlIGFzIHdlbGwKICAgICAgYXMgc29tZSB1c2VyIGRhdGEgKGNsb3N1cmUpLgoKICAgIC0gcmVzb3VyY2VzIGhhdmUgZGlzYXBwZWFyZWQgKHRoZXkgY3JlYXRlZCBtb3JlIHByb2JsZW1zIHRoYW4gdGhleQogICAgICBzb2x2ZWQpLCBhbmQgIGkvbyBtYW5hZ2VtZW50IGhhdmUgIGJlZW4gc2ltcGxpZmllZCBncmVhdGx5ICBhcyBhCiAgICAgIHJlc3VsdC4gU3RyZWFtcyBhcmUgZGVmaW5lZCB0aHJvdWdoIEZUX1N0cmVhbSBvYmplY3RzLCB3aGljaCBjYW4KICAgICAgYmUgZWl0aGVyIG1lbW9yeS1iYXNlZCBvciBkaXNrLWJhc2VkLgoKICAgICAgTm90ZSB0aGF0ICBlYWNoIGZhY2UgIGhhcyBpdHMgb3duICBzdHJlYW0sIHdoaWNoIGlzICBjbG9zZWQgb25seQogICAgICB3aGVuICB0aGUgIGZhY2Ugb2JqZWN0ICBpcyAgZGVzdHJveWVkLiAgSGVuY2UsICBhIGZ1bmN0aW9uICBsaWtlCiAgICAgIFRUX0ZsdXNoX0ZhY2UgaW4gIDEueCBjYW5ub3QgYmUgZGlyZWN0bHkgIHN1cHBvcnRlZC4gSG93ZXZlciwgaWYKICAgICAgeW91IHJlYWxseSBuZWVkIHNvbWV0aGluZyBsaWtlICB0aGlzLCB5b3UgY2FuIGVhc2lseSB0YWlsb3IgeW91cgogICAgICBvd24gc3RyZWFtcyAgdG8gYWNoaWV2ZSB0aGUgc2FtZSAgZmVhdHVyZSBhdCBhICBsb3dlciBsZXZlbCAoYW5kCiAgICAgIHVzZSBGVF9PcGVuX0ZhY2UgaW5zdGVhZCBvZiBGVF9OZXdfRmFjZSB0byBjcmVhdGUgdGhlIGZhY2UpLgoKICBTZWUgdGhlIGZpbGUgICJpbmNsdWRlL2Z0c3lzdGVtLmgiIGZvciBtb3JlIGRldGFpbHMsIGFzICB3ZWxsIGFzIHRoZQogIGltcGxlbWVudGF0aW9ucyBmb3VuZCBpbiAiY29uZmlnL3VuaXgiIGFuZCAiY29uZmlnL2Fuc2kiLgoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZvbnQgRHJpdmVyczoKCiAgVGhlICBGb250IERyaXZlciAgaW50ZXJmYWNlIGhhcyAgYmVlbiBtb2RpZmllZCAgaW4gb3JkZXIgIHRvIHN1cHBvcnQKICBleHRlbnNpb25zICYgdmVyc2lvbmluZy4KCgogIFRoZSAgbGlzdCBvZiAgdGhlIGZvbnQgIGRyaXZlcnMgdGhhdCAgYXJlIHN0YXRpY2FsbHkgIGxpbmtlZCAgdG8gdGhlCiAgbGlicmFyeSBhdCBjb21waWxlIHRpbWUgaXMgIG1hbmFnZWQgdGhyb3VnaCBhIG5ldyBjb25maWd1cmF0aW9uIGZpbGUKICBjYWxsZWQgYGNvbmZpZy88cGxhdGZvcm0+L2Z0bW9kdWxlLmgnLgoKICBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCB3aGVuIGludm9raW5nIGBtYWtlIG1vZHVsZXMnLiBUaGlzIHRhcmdldAogIHdpbGwgcGFyc2UgIGFsbCBzdWItZGlyZWN0b3JpZXMgb2YgJ3NyYycsIGxvb2tpbmcgIGZvciBhICJtb2R1bGUubWsiCiAgcnVsZXMgZmlsZSwgdXNlZCB0byBkZXNjcmliZSB0aGUgZHJpdmVyIHRvIHRoZSBidWlsZCBzeXN0ZW0uCgogIEhlbmNlLCBvbmUgIHNob3VsZCBjYWxsICBgbWFrZSBtb2R1bGVzJyBlYWNoICB0aW1lIGEgZm9udCAgZHJpdmVyIGlzCiAgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBgc3JjJyBkaXJlY3RvcnkuCgogIEZpbmFsbHksIHRoaXMgdmVyc2lvbiBwcm92aWRlcyBhICJwc2V1ZG8tZHJpdmVyIiBpbiBgc3JjL3NmbnQnLiBUaGlzCiAgZHJpdmVyIGRvZXNuJ3QgIHN1cHBvcnQgZm9udCAgZmlsZXMgZGlyZWN0bHksIGJ1dCAgcHJvdmlkZXMgc2VydmljZXMKICB1c2VkIGJ5ICBhbGwgVHJ1ZVR5cGUtbGlrZSBmb250ICBkcml2ZXJzLiBIZW5jZSwgaXRzIGNvZGUgIGlzIHNoYXJlZAogIGJldHdlZW4gIHRoZSBUcnVlVHlwZSAgJiBPcGVuVHlwZSAgZm9udCBmb3JtYXRzLCAgYW5kICBwb3NzaWJseSBtb3JlCiAgZm9ybWF0cyB0byBjb21lIGlmIHdlJ3JlIGx1Y2t5Li4KCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpFeHRlbnNpb25zIHN1cHBvcnQ6CgogIFRoZSBleHRlbnNpb25zIHN1cHBvcnQgaXMgaW5zcGlyZWQgYnkgdGhlIG9uZSBmb3VuZCBpbiAxLnguCgogIE5vdywgZWFjaCBmb250IGRyaXZlciBoYXMgIGl0cyBvd24gImV4dGVuc2lvbiByZWdpc3RyeSIsIHdoaWNoIGxpc3RzCiAgd2hpY2ggZXh0ZW5zaW9ucyAgYXJlIGF2YWlsYWJsZSAgZm9yIHRoZSBmb250ICBmYWNlcyBtYW5hZ2VkICBieSB0aGUKICBkcml2ZXIuCgogIEV4dGVuc2lvbiBpZHMgYXJlICBub3cgc3RyaW5ncywgcmF0aGVyIHRoYW4gNC1ieXRlICB0YWdzLCBhcyB0aGlzIGlzCiAgdXN1YWxseSBtb3JlIHJlYWRhYmxlLi4KCiAgRWFjaCBleHRlbnNpb24gaGFzOgogICAgLSBzb21lIGRhdGEsIGFzc29jaWF0ZWQgdG8gZWFjaCBmYWNlIG9iamVjdAogICAgLSBhbiBpbnRlcmZhY2UgKHRhYmxlIG9mIGZ1bmN0aW9uIHBvaW50ZXJzKQoKICBBbiBleHRlbnNpb24gIHRoYXQgaXMgZm9ybWF0LXNwZWNpZmljIHNob3VsZCAgc2ltcGx5IHJlZ2lzdGVyIGl0c2VsZgogIHRvIHRoZSBjb3JyZWN0IGZvbnQgZHJpdmVyLiBIZXJlIGlzIHNvbWUgZXhhbXBsZSBjb2RlOgoKICAgLy8gUmVnaXN0ZXJpbmcgYW4gZXh0ZW5zaW9ucwogICAvLwogICBGVF9FcnJvciAgRlRfSW5pdF9YWFhYX0V4dGVuc2lvbiggRlRfTGlicmFyeSAgbGlicmFyeSApCiAgIHsKICAgICBGVF9Ecml2ZXJJbnRlcmZhY2UqICB0dF9kcml2ZXI7CgogICAgIGRyaXZlciA9IEZUX0dldF9Ecml2ZXIoIGxpYnJhcnksICJ0cnVldHlwZSIgKTsKICAgICBpZiAoIWRyaXZlcikgcmV0dXJuIEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmU7CgogICAgIHJldHVybiBGVF9SZWdpc3Rlcl9FeHRlbnNpb24oIGRyaXZlciwgJmV4dGVuc2lvbl9jbGFzcyApOwogICB9CgoKICAgLy8gSW1wbGVtZW50aW5nIHRoZSBleHRlbnNpb25zCiAgIC8vCiAgIEZUX0Vycm9yICBGVF9Qcm9jZWVkX0V4dGVuc2lvbl9YWFgoIEZUX0ZhY2UgIGZhY2UgKQogICB7CiAgICAgRlRfWFhYX0V4dGVuc2lvbiAgICAgICAgICAgIGV4dDsKICAgICBGVF9YWFhfRXh0ZW5zaW9uX0ludGVyZmFjZSAgZXh0X2ludGVyZmFjZTsKCiAgICAgZXh0ID0gRlRfR2V0X0V4dGVuc2lvbiggZmFjZSwgImV4dGVuc2lvbmlkIiwgJmV4dF9pbnRlcmZhY2UgKTsKICAgICBpZiAoIWV4dCkgcmV0dXJuIGVycm9yOwoKICAgICByZXR1cm4gZXh0X2ludGVyZmFjZS0+ZG9faXQoZXh0KTsKICAgfQoKLS0tIGVuZCBvZiBDSEFOR0VTIC0tLQo=