VGhlIFJlZ2lzdHJ5Ci0tLS0tLS0tLS0tLQoKICAgQWZ0ZXIgV2luMy54LCB0aGUgcmVnaXN0cnkgYmVjYW1lIGEgZnVuZGFtZW50YWwgcGFydCBvZiBXaW5kb3dzLiBJdCBpcwogICB0aGUgcGxhY2Ugd2hlcmUgYm90aCBXaW5kb3dzIGl0c2VsZiwgYW5kIGFsbAogICBXaW45NS85OC9OVC8yMDAwL3doYXRldmVyLWNvbXBsaWFudCBhcHBsaWNhdGlvbnMsIHN0b3JlIGNvbmZpZ3VyYXRpb24KICAgYW5kIHN0YXRlIGRhdGEuIFdoaWxlIG1vc3Qgc2FuZSBzeXN0ZW0gYWRtaW5pc3RyYXRvcnMgKGFuZCBXaW5lCiAgIGRldmVsb3BlcnMpIGN1cnNlIGJhZGx5IGF0IHRoZSB0d2lzdGVkIG5hdHVyZSBvZiB0aGUgV2luZG93cyByZWdpc3RyeSwKICAgaXQgaXMgc3RpbGwgbmVjZXNzYXJ5IGZvciBXaW5lIHRvIHN1cHBvcnQgaXQgc29tZWhvdy4KICAgCiAgUmVnaXN0cnkgc3RydWN0dXJlCiAgCiAgIFRoZSBXaW5kb3dzIHJlZ2lzdHJ5IGlzIGFuIGVsYWJvcmF0ZSB0cmVlIHN0cnVjdHVyZSwgYW5kIG5vdCBldmVuIG1vc3QKICAgV2luZG93cyBwcm9ncmFtbWVycyBhcmUgZnVsbHkgYXdhcmUgb2YgaG93IHRoZSByZWdpc3RyeSBpcyBsYWlkIG91dCwKICAgd2l0aCBpdHMgZGlmZmVyZW50ICJoaXZlcyIgYW5kIG51bWVyb3VzIGxpbmtzIGJldHdlZW4gdGhlbTsgYSBmdWxsCiAgIGNvdmVyYWdlIGlzIG91dCBvZiB0aGUgc2NvcGUgb2YgdGhpcyBkb2N1bWVudC4gQnV0IGhlcmUgYXJlIHRoZSBiYXNpYwogICByZWdpc3RyeSBrZXlzIHlvdSBtaWdodCBuZWVkIHRvIGtub3cgYWJvdXQgZm9yIG5vdy4KICAgCiAgIEhLRVlfTE9DQUxfTUFDSElORQogICAgICAgICAgVGhpcyBmdW5kYW1lbnRhbCByb290IGtleSAoaW4gd2luOXgsIHN0b3JlZCBpbiB0aGUgaGlkZGVuIGZpbGUKICAgICAgICAgIHN5c3RlbS5kYXQpIGNvbnRhaW5zIGV2ZXJ5dGhpbmcgcGVydGFpbmluZyB0byB0aGUgY3VycmVudAogICAgICAgICAgV2luZG93cyBpbnN0YWxsYXRpb24uCiAgICAgICAgICAKICAgSEtFWV9VU0VSUwogICAgICAgICAgVGhpcyBmdW5kYW1lbnRhbCByb290IGtleSAoaW4gd2luOXgsIHN0b3JlZCBpbiB0aGUgaGlkZGVuIGZpbGUKICAgICAgICAgIHVzZXIuZGF0KSBjb250YWlucyBjb25maWd1cmF0aW9uIGRhdGEgZm9yIGV2ZXJ5IHVzZXIgb2YgdGhlCiAgICAgICAgICBpbnN0YWxsYXRpb24uCiAgICAgICAgICAKICAgSEtFWV9DTEFTU0VTX1JPT1QKICAgICAgICAgIFRoaXMgaXMgYSBsaW5rIHRvIEhLRVlfTE9DQUxfTUFDSElORVxTb2Z0d2FyZVxDbGFzc2VzLiBJdAogICAgICAgICAgY29udGFpbnMgZGF0YSBkZXNjcmliaW5nIHRoaW5ncyBsaWtlIGZpbGUgYXNzb2NpYXRpb25zLCBPTEUKICAgICAgICAgIGRvY3VtZW50IGhhbmRsZXJzLCBhbmQgQ09NIGNsYXNzZXMuCiAgICAgICAgICAKICAgSEtFWV9DVVJSRU5UX1VTRVIKICAgICAgICAgIFRoaXMgaXMgYSBsaW5rIHRvIEhLRVlfVVNFUlNceW91cl91c2VybmFtZSwgaS5lLiwgeW91ciBwZXJzb25hbAogICAgICAgICAgY29uZmlndXJhdGlvbi4KICAgICAgICAgIAogIFVzaW5nIGEgV2luZG93cyByZWdpc3RyeQogIAogICBJZiB5b3UgcG9pbnQgV2luZSBhdCBhbiBleGlzdGluZyBNUyBXaW5kb3dzIGluc3RhbGxhdGlvbiAoYnkgc2V0dGluZwogICB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXMgaW4gd2luZS5jb25mLy53aW5lcmMpLCB0aGVuIFdpbmUgaXMgYWJsZQogICB0byBsb2FkIHJlZ2lzdHJ5IGRhdGEgZnJvbSBpdC4gSG93ZXZlciwgV2luZSB3aWxsIG5vdCBzYXZlIGFueXRoaW5nIHRvCiAgIHRoZSByZWFsIFdpbmRvd3MgcmVnaXN0cnksIGJ1dCByYXRoZXIgdG8gaXRzIG93biByZWdpc3RyeSBmaWxlcyAoc2VlCiAgIGJlbG93KS4gT2YgY291cnNlLCBpZiBhIHBhcnRpY3VsYXIgcmVnaXN0cnkgdmFsdWUgZXhpc3RzIGluIGJvdGggdGhlCiAgIFdpbmRvd3MgcmVnaXN0cnkgYW5kIGluIHRoZSBXaW5lIHJlZ2lzdHJ5LCB0aGVuIFdpbmUgd2lsbCB1c2UgdGhlCiAgIGxhdHRlci4KICAgCiAgIE9jY2FzaW9uYWxseSwgV2luZSBtYXkgaGF2ZSB0cm91YmxlIGxvYWRpbmcgdGhlIFdpbmRvd3MgcmVnaXN0cnkuCiAgIFVzdWFsbHksIHRoaXMgaXMgYmVjYXVzZSB0aGUgcmVnaXN0cnkgaXMgaW5jb25zaXN0ZW50IG9yIGRhbWFnZWQgaW4KICAgc29tZSB3YXkuIElmIHRoYXQgYmVjb21lcyBhIHByb2JsZW0sIHlvdSBtYXkgd2FudCB0byBkb3dubG9hZCB0aGUKICAgcmVnY2xlYW4uZXhlIGZyb20gdGhlIE1TIHdlYnNpdGUgYW5kIHVzZSBpdCB0byBjbGVhbiB1cCB0aGUgcmVnaXN0cnkuCiAgIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gYWx3YXlzIHVzZSByZWdlZGl0LmV4ZSB0byBleHBvcnQgdGhlIHJlZ2lzdHJ5CiAgIGRhdGEgeW91IHdhbnQgaW50byBhIHRleHQgZmlsZSwgYW5kIHRoZW4gaW1wb3J0IGl0IGluIFdpbmUuCiAgIAogIFdpbmUgcmVnaXN0cnkgZGF0YSBmaWxlcwogIAogICBJbiB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LCB0aGVyZSBpcyBhIHN1YmRpcmVjdG9yeSBuYW1lZCAud2luZSwKICAgd2hlcmUgV2luZSB3aWxsIHRyeSB0byBzYXZlIGl0cyByZWdpc3RyeSBieSBkZWZhdWx0LiBJdCBzYXZlcyBpbnRvCiAgIGZvdXIgZmlsZXMsIHdoaWNoIGFyZToKICAgCiAgIHN5c3RlbS5yZWcKICAgICAgICAgIFRoaXMgZmlsZSBjb250YWlucyBIS0VZX0xPQ0FMX01BQ0hJTkUuCiAgICAgICAgICAKICAgdXNlci5yZWcKICAgICAgICAgIFRoaXMgZmlsZSBjb250YWlucyBIS0VZX0NVUlJFTlRfVVNFUi4KICAgICAgICAgIAogICB1c2VyZGVmLnJlZwogICAgICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIEhLRVlfVVNFUlNcLkRlZmF1bHQgKGkuZS4gdGhlIGRlZmF1bHQgdXNlcgogICAgICAgICAgc2V0dGluZ3MpLgogICAgICAgICAgCiAgIHdpbmUudXNlcnJlZwogICAgICAgICAgV2luZSBzYXZlcyBIS0VZX1VTRVJTIHRvIHRoaXMgZmlsZSAoYm90aCBjdXJyZW50IGFuZCBkZWZhdWx0CiAgICAgICAgICB1c2VyKSwgYnV0IGRvZXMgbm90IGxvYWQgZnJvbSBpdCwgdW5sZXNzIHVzZXJkZWYucmVnIGlzCiAgICAgICAgICBtaXNzaW5nLgogICAgICAgICAgCiAgIEFsbCBvZiB0aGVzZSBmaWxlcyBhcmUgaHVtYW4tcmVhZGFibGUgdGV4dCBmaWxlcywgc28gdW5saWtlIFdpbmRvd3MsCiAgIHlvdSBjYW4gYWN0dWFsbHkgdXNlIGFuIG9yZGluYXJ5IHRleHQgZWRpdG9yIG9uIHRoZW0gaWYgeW91IG11c3QuCiAgIAogICBJbiBhZGRpdGlvbiB0byB0aGVzZSBmaWxlcywgV2luZSBjYW4gYWxzbyBvcHRpb25hbGx5IGxvYWQgZnJvbSBnbG9iYWwKICAgcmVnaXN0cnkgZmlsZXMgcmVzaWRpbmcgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBnbG9iYWwgd2luZS5jb25mCiAgIChpLmUuIC91c3IvbG9jYWwvZXRjIGlmIHlvdSBjb21waWxlZCBmcm9tIHNvdXJjZSkuIFRoZXNlIGFyZToKICAgCiAgIHdpbmUuc3lzdGVtcmVnCiAgICAgICAgICBDb250YWlucyBIS0VZX0xPQ0FMX01BQ0hJTkUuCiAgICAgICAgICAKICAgd2luZS51c2VycmVnCiAgICAgICAgICBDb250YWlucyBIS0VZX1VTRVJTLgogICAgICAgICAgCiAgU3lzdGVtIGFkbWluaXN0cmF0aW9uCiAgCiAgIFdpdGggdGhlIGFib3ZlIGZpbGUgc3RydWN0dXJlLCBpdCBpcyBwb3NzaWJsZSBmb3IgYSBzeXN0ZW0KICAgYWRtaW5pc3RyYXRvciB0byBjb25maWd1cmUgdGhlIHN5c3RlbSBzbyB0aGF0IGEgc3lzdGVtIFdpbmUKICAgaW5zdGFsbGF0aW9uIChhbmQgYXBwbGljYXRpb25zKSBjYW4gYmUgc2hhcmVkIGJ5IGFsbCB0aGUgdXNlcnMsIGFuZAogICBzdGlsbCBsZXQgdGhlIHVzZXJzIGFsbCBoYXZlIHRoZWlyIG93biBwZXJzb25hbGl6ZWQgY29uZmlndXJhdGlvbi4gQW4KICAgYWRtaW5pc3RyYXRvciBjYW4sIGFmdGVyIGhhdmluZyBpbnN0YWxsZWQgV2luZSBhbmQgYW55IFdpbmRvd3MKICAgYXBwbGljYXRpb24gc29mdHdhcmUgaGUgd2FudHMgdGhlIHVzZXJzIHRvIGhhdmUgYWNjZXNzIHRvLCBjb3B5IHRoZQogICByZXN1bHRpbmcgc3lzdGVtLnJlZyBhbmQgd2luZS51c2VycmVnIG92ZXIgdG8gdGhlIGdsb2JhbCByZWdpc3RyeQogICBmaWxlcyAod2hpY2ggd2UgYXNzdW1lIHdpbGwgcmVzaWRlIGluIC91c3IvbG9jYWwvZXRjIGhlcmUpLCB3aXRoOgogICAKY2Qgfi8ud2luZQpjcCBzeXN0ZW0ucmVnIC91c3IvbG9jYWwvZXRjL3dpbmUuc3lzdGVtcmVnCmNwIHdpbmUudXNlcnJlZyAvdXNyL2xvY2FsL2V0Yy93aW5lLnVzZXJyZWcKCiAgIGFuZCBwZXJoYXBzIGV2ZW4gc3ltbGluayB0aGVzZSBiYWNrIHRvIHRoZSBhZG1pbmlzdHJhdG9yJ3MgYWNjb3VudCwgdG8KICAgbWFrZSBpdCBlYXNpZXIgdG8gaW5zdGFsbCBhcHBzIHN5c3RlbS13aWRlIGxhdGVyOgogICAKbG4gLXNmIC91c3IvbG9jYWwvZXRjL3dpbmUuc3lzdGVtcmVnIHN5c3RlbS5yZWcKbG4gLXNmIC91c3IvbG9jYWwvZXRjL3dpbmUudXNlcnJlZyB3aW5lLnVzZXJyZWcKCiAgIE5vdGUgdGhhdCB0aGUgdG9vbHMvd2luZWluc3RhbGwgc2NyaXB0IGFscmVhZHkgZG9lcyBhbGwgb2YgdGhpcyBmb3IKICAgeW91LCBpZiB5b3UgaW5zdGFsbCBXaW5lIGFzIHJvb3QuIElmIHlvdSB0aGVuIGluc3RhbGwgV2luZG93cwogICBhcHBsaWNhdGlvbnMgd2hpbGUgbG9nZ2VkIGluIGFzIHJvb3QsIGFsbCB5b3VyIHVzZXJzIHdpbGwKICAgYXV0b21hdGljYWxseSBiZSBhYmxlIHRvIHVzZSB0aGVtLiBXaGlsZSB0aGUgYXBwbGljYXRpb24gc2V0dXAgd2lsbCBiZQogICB0YWtlbiBmcm9tIHRoZSBnbG9iYWwgcmVnaXN0cnksIHRoZSB1c2VycycgcGVyc29uYWxpemVkIGNvbmZpZ3VyYXRpb25zCiAgIHdpbGwgYmUgc2F2ZWQgaW4gdGhlaXIgb3duIGhvbWUgZGlyZWN0b3JpZXMuCiAgIAogICBCdXQgYmUgY2FyZWZ1bCB3aXRoIHdoYXQgeW91IGRvIHdpdGggdGhlIGFkbWluaXN0cmF0b3IgYWNjb3VudCAtIGlmCiAgIHlvdSBkbyBjb3B5IG9yIGxpbmsgdGhlIGFkbWluaXN0cmF0b3IncyByZWdpc3RyeSB0byB0aGUgZ2xvYmFsCiAgIHJlZ2lzdHJ5LCBhbnkgdXNlciBtaWdodCBiZSBhYmxlIHRvIHJlYWQgdGhlIGFkbWluaXN0cmF0b3IncwogICBwcmVmZXJlbmNlcywgd2hpY2ggbWlnaHQgbm90IGJlIGdvb2QgaWYgc2Vuc2l0aXZlIGluZm9ybWF0aW9uCiAgIChwYXNzd29yZHMsIHBlcnNvbmFsIGluZm9ybWF0aW9uLCBldGMpIGlzIHN0b3JlZCB0aGVyZS4gT25seSB1c2UgdGhlCiAgIGFkbWluaXN0cmF0b3IgYWNjb3VudCB0byBpbnN0YWxsIHNvZnR3YXJlLCBub3QgZm9yIGRhaWx5IHdvcms7IHVzZSBhbgogICBvcmRpbmFyeSB1c2VyIGFjY291bnQgZm9yIHRoYXQuCiAgIAogIFRoZSBkZWZhdWx0IHJlZ2lzdHJ5CiAgCiAgIEEgV2luZG93cyByZWdpc3RyeSBjb250YWlucyBtYW55IGtleXMgYnkgZGVmYXVsdCwgYW5kIHNvbWUgb2YgdGhlbSBhcmUKICAgbmVjZXNzYXJ5IGZvciBldmVuIGluc3RhbGxlcnMgdG8gb3BlcmF0ZSBjb3JyZWN0bHkuIFRoZSBrZXlzIHRoYXQgdGhlCiAgIFdpbmUgZGV2ZWxvcGVycyBoYXZlIGZvdW5kIG5lY2Vzc2FyeSB0byBpbnN0YWxsIGFwcGxpY2F0aW9ucyBhcmUKICAgZGlzdHJpYnV0ZWQgaW4gYSBmaWxlIGNhbGxlZCAid2luZWRlZmF1bHQucmVnIi4gSXQgaXMgYXV0b21hdGljYWxseQogICBpbnN0YWxsZWQgZm9yIHlvdSBpZiB5b3UgdXNlIHRoZSB0b29scy93aW5laW5zdGFsbCBzY3JpcHQsIGJ1dCBpZiB5b3UKICAgd2FudCB0byBpbnN0YWxsIGl0IG1hbnVhbGx5LCB5b3UgY2FuIGRvIHNvIGJ5IHVzaW5nIHRoZSByZWdhcGkgdG9vbC4KICAgWW91IGNhbiBmaW5kIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbiB0aGUKICAgZG9jdW1lbnRhdGlvbi9uby13aW5kb3dzIGRvY3VtZW50IGluIHRoZSBXaW5lIGRpc3RyaWJ1dGlvbi4KICAgCiAgVGhlIFtyZWdpc3RyeV0gc2VjdGlvbgogIAogICBXaXRoIHRoZSBhYm92ZSBpbmZvcm1hdGlvbiBmcmVzaCBpbiBtaW5kLCBsZXQncyBsb29rIGF0IHRoZQogICB3aW5lLmNvbmYvLndpbmVyYyBvcHRpb25zIGZvciBoYW5kbGluZyB0aGUgcmVnaXN0cnkuCiAgIAogICBMb2FkR2xvYmFsUmVnaXN0cnlGaWxlcwogICAgICAgICAgQ29udHJvbHMgd2hldGhlciB0byB0cnkgdG8gbG9hZCB0aGUgZ2xvYmFsIHJlZ2lzdHJ5IGZpbGVzLCBpZgogICAgICAgICAgdGhleSBleGlzdC4KICAgICAgICAgIAogICBMb2FkSG9tZVJlZ2lzdHJ5RmlsZXMKICAgICAgICAgIENvbnRyb2xzIHdoZXRoZXIgdG8gdHJ5IHRvIGxvYWQgdGhlIHVzZXIncyByZWdpc3RyeSBmaWxlcyAoaW4KICAgICAgICAgIHRoZSAud2luZSBzdWJkaXJlY3Rvcnkgb2YgdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSkuCiAgICAgICAgICAKICAgTG9hZFdpbmRvd3NSZWdpc3RyeUZpbGVzCiAgICAgICAgICBDb250cm9scyB3aGV0aGVyIFdpbmUgd2lsbCBhdHRlbXB0IHRvIGxvYWQgcmVnaXN0cnkgZGF0YSBmcm9tIGEKICAgICAgICAgIHJlYWwgV2luZG93cyByZWdpc3RyeSBpbiBhbiBleGlzdGluZyBNUyBXaW5kb3dzIGluc3RhbGxhdGlvbi4KICAgICAgICAgIAogICBXcml0ZXRvSG9tZVJlZ2lzdHJ5RmlsZXMKICAgICAgICAgIENvbnRyb2xzIHdoZXRoZXIgcmVnaXN0cnkgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIHVzZXIncwogICAgICAgICAgcmVnaXN0cnkgZmlsZXMuIChDdXJyZW50bHksIHRoZXJlIGlzIG5vIGFsdGVybmF0aXZlLCBzbyBpZiB5b3UKICAgICAgICAgIHR1cm4gdGhpcyBvZmYsIFdpbmUgY2Fubm90IHNhdmUgdGhlIHJlZ2lzdHJ5IG9uIGRpc2sgYXQgYWxsOwogICAgICAgICAgYWZ0ZXIgeW91IGV4aXQgV2luZSwgeW91ciBjaGFuZ2VzIHdpbGwgYmUgbG9zdC4pCiAgICAgICAgICAKICAgVXNlTmV3Rm9ybWF0CiAgICAgICAgICBUaGlzIG9wdGlvbiBpcyBvYnNvbGV0ZS4gV2luZSBub3cgYWx3YXlzIHVzZSB0aGUgbmV3IGZvcm1hdDsKICAgICAgICAgIHN1cHBvcnQgZm9yIHRoZSBvbGQgZm9ybWF0IHdhcyByZW1vdmVkIGEgd2hpbGUgYWdvLgogICAgICAgICAgCiAgIFBlcmlvZGljU2F2ZQogICAgICAgICAgSWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIGEgbm9uemVybyB2YWx1ZSwgaXQgc3BlY2lmaWVzIHRoYXQgeW91CiAgICAgICAgICB3YW50IHRoZSByZWdpc3RyeSB0byBiZSBzYXZlZCB0byBkaXNrIGF0IHRoZSBnaXZlbiBpbnRlcnZhbC4gSWYKICAgICAgICAgIGl0IGlzIG5vdCBzZXQsIHRoZSByZWdpc3RyeSB3aWxsIG9ubHkgYmUgc2F2ZWQgdG8gZGlzayB3aGVuIHRoZQogICAgICAgICAgd2luZXNlcnZlciB0ZXJtaW5hdGVzLgogICAgICAgICAgCiAgIFNhdmVPbmx5VXBkYXRlZEtleXMKICAgICAgICAgIENvbnRyb2xzIHdoZXRoZXIgdGhlIGVudGlyZSByZWdpc3RyeSBpcyBzYXZlZCB0byB0aGUgdXNlcidzCiAgICAgICAgICByZWdpc3RyeSBmaWxlcywgb3Igb25seSBzdWJrZXlzIHRoZSB1c2VyIGhhdmUgYWN0dWFsbHkgY2hhbmdlZC4KICAgICAgICAgIENvbnNpZGVyaW5nIHRoYXQgdGhlIHVzZXIncyByZWdpc3RyeSB3aWxsIG92ZXJyaWRlIGFueSBnbG9iYWwKICAgICAgICAgIHJlZ2lzdHJ5IGZpbGVzIGFuZCBXaW5kb3dzIHJlZ2lzdHJ5IGZpbGVzLCBpdCB1c3VhbGx5IG1ha2VzCiAgICAgICAgICBzZW5zZSB0byBvbmx5IHNhdmUgdXNlci1tb2RpZmllZCBzdWJrZXlzOyB0aGF0IHdheSwgY2hhbmdlcyB0bwogICAgICAgICAgdGhlIHJlc3Qgb2YgdGhlIGdsb2JhbCBvciBXaW5kb3dzIHJlZ2lzdHJpZXMgd2lsbCBzdGlsbCBhZmZlY3QKICAgICAgICAgIHRoZSB1c2VyLgogICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBPdmUgS+V2ZW4K