Q2hhbmdlcyB3aXRoIEFwYWNoZSAyLjEuMwoKICBbUmVtb3ZlIGVudHJpZXMgdG8gdGhlIGN1cnJlbnQgMi4wIHNlY3Rpb24gYmVsb3csIHdoZW4gYmFja3BvcnRlZF0KCiAgKikgUmVtb3ZlIHNvbWUgY29tcGlsZXIgd2FybmluZ3Mgd2l0aGluIHRoZSBMREFQIG1vZHVsZXMgW0dyYWhhbSBMZWdnZXR0XQoKICAqKSBBZGQgYSBidWlsZCBzY3JpcHQgdG8gY3JlYXRlIGEgc29sYXJpcyBwYWNrYWdlLiBbR3JhaGFtIExlZ2dldHRdCgogICopIGFwX2h0dHBfc2NoZW1lKCkgcmVwbGFjZWQgd2l0aCBhcF9odHRwX21ldGhvZCgpIC0gdGhpcyBmdW5jdGlvbgogICAgIHJldHVybnMgdGhlIHNjaGVtZSAoaHR0cCB2LnMuIGh0dHBzKS4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBtb2RfcHJveHk6IEZpeCBhIHJlcXVlc3QgY29ycnVwdGlvbiBwcm9ibGVtIGFuZCBhIGJ1ZmZlcmluZyBwcm9ibGVtCiAgICAgd2hpY2ggc29tZXRpbWVzIHByZXZlbnRlZCBwcm94eS1zZW5kY2h1bmtzIGZyb20gd29ya2luZy4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggdGhlIFJQTSBzcGVjIGZpbGUgc28gdGhhdCBhbiBSUE0gYnVpbGQgbm93IHdvcmtzLiBBbiBSUE0KICAgICBidWlsZCBub3cgcmVxdWlyZXMgc3lzdGVtIGluc3RhbGxhdGlvbnMgb2YgQVBSIGFuZCBBUFItdXRpbC4KICAgICBbR3JhaGFtIExlZ2dldHRdCgogICopIFNpZ25pZmljYW50bHkgc2ltcGxpZnkgdGhlIGxvYWQgYmFsYW5jZXIgc2NoZWR1bGluZyBhbGdvcml0aG0KICAgICBmb3IgdGhlIHByb3h5IEJhbGFuY2VyTWVtYmVyIHdlaWdodGluZy4gbG9hZGZhY3RvcnMgKGxiZmFjdG9ycykKICAgICBhcmUgbm93IG5vcm1hbGl6ZWQgd2l0aCByZXNwZWN0IHRvIGVhY2ggb3RoZXIuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBtb2RfZHVtcGlvOiBBZGRlZCB0byB0aGUgYXZhaWxhYmxlIG1vZHVsZSBzdWl0ZTsgaXQgaXMgYW4KICAgICBJL08gbG9nZ2luZy9kdW1waW5nIG1vZHVsZS4gUGxhY2VkIGluIHRoZSAobmV3KSBkZWJ1ZyBtb2R1bGUKICAgICBzdWJkaXJlY3RvcnkuIG1vZF9idWNrZXRlZXIgbW92ZWQgdG8gdGhhdCBkaXJlY3RvcnkgYXMgd2VsbC4KICAgICBbSmltIEphZ2llbHNraV0KCiAgKikgY29yZTogQWRkIHN1cHBvcnQgZm9yIEFQUl9UQ1BfREVGRVJfQUNDRVBUIHRvIGRlZmVyIGFjY2VwdGluZwogICAgIG9mIGEgY29ubmVjdGlvbiB1bnRpbCBkYXRhIGlzIGF2YWlsYWJsZS4KICAgICBbUGF1bCBRdWVybmFdCgogICopIGNvbmY6IFJlbW92ZSBBZGREZWZhdWx0Q2hhcnNldCBmcm9tIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYmVjYXVzZQogICAgIHNldHRpbmcgYSBzaXRlLXdpZGUgZGVmYXVsdCBkb2VzIG1vcmUgaGFybSB0aGFuIGdvb2QuIFBSIDIzNDIxLgogICAgIFtSb3kgRmllbGRpbmddCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMS4yCgogICopIG1vZF9wcm94eTogUmVzcGVjdCBlcnJvcnMgcmVwb3J0ZWQgYnkgcHJlX2Nvbm5lY3Rpb24gaG9va3MuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgd29ya2VyIE1QTTogRml4IGEgcHJvYmxlbSB3aGljaCBjb3VsZCBjYXVzZSBodHRwZCBwcm9jZXNzZXMgdG8KICAgICByZW1haW4gYWN0aXZlIGFmdGVyIHNodXRkb3duLiAgW0plZmYgVHJhd2lja10KCiAgKikgY29yZTogRXJyb3Igb3V0IG9uIHNlY3Rpb25zIHRoYXQgYXJlIG1pc3NpbmcgYW4gYXJndW1lbnQgaW5zdGVhZCBvZgogICAgIHNpbGVudGx5IGNvbnN1bWluZyB0aGUgc2VjdGlvbi4gUFIgMjU0NjAuCiAgICAgW0dlb2ZmcmV5IFlvdW5nLCBQYXVsIFF1ZXJuYV0KCiAgKikgbW9kX2NhY2hlL21vZF9tZW1fY2FjaGUvbW9kX2Rpc2tfY2FjaGU6IE1vdmUgb3V0IG9mIGV4cGVyaW1lbnRhbC4KCiAgKikgVXBncmFkZWQgUENSRSB0byB2ZXJzaW9uIDUuMC4gW0JyaWFuIFBhbmVdCgogICopIG1vZF9jZ2lkOiBDYXRjaCBjb25maWd1cmF0aW9uIHByb2JsZW0gd2hlcmUgdHdvIHdlYiBzZXJ2ZXIgaW5zdGFuY2VzCiAgICAgc2hhcmUgc2FtZSBTZXJ2ZXJSb290IGJ1dCBhZG1pbiBmb3Jnb3QgdG8gdXNlIFNjcmlwdFNvY2suCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgbW9kX2NnaTogRW5zdXJlIHRoYXQgYWxsIHN0ZGVyciBpcyBsb2dnZWQgZm9yIGEgc2NyaXB0IHdoaWNoIHJldHVybnMKICAgICBhIExvY2F0aW9uIGhlYWRlciB0byBnZW5lcmF0ZSBhIG5vbi1sb2NhbCByZWRpcmVjdC4gIFBSIDIwMTExLgogICAgIFtKb2UgT3J0b25dCgogICopIEFkZGVkIHRoZSBFdmVudCBNUE0gdG8gbW9yZSBlZmZpY2llbnRseSBoYW5kbGUgY2xpZW50cyBkdXJpbmcgYSAKICAgICBLZWVwIEFsaXZlIHJlcXVlc3QuCiAgICAgW1BhdWwgUXVlcm5hLCBHcmVnIEFtZXNdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMS4xCgogICopIG1vZF9wcm94eV9odHRwOiBTdHJlYW0gY29udGVudCBiZXR0ZXIgLSBhbHdheXMgZmx1c2ggYnVmZmVyZWQgZGF0YSB0bwogICAgIHRoZSBjbGllbnQgYmVmb3JlIGJsb2NraW5nIHdhaXRpbmcgZm9yIG5ldyBkYXRhLiAgUFIgMTk5NTQuCiAgICAgW0pvZSBPcnRvbl0KCiAgKikgbW9kX3NzbDogQWRkIHN1cHBvcnQgZm9yIGNvbW1hbmQtbGluZSBvcHRpb24gIi10IC1ERFVNUF9DRVJUUyIgd2hpY2gKICAgICB3aWxsIGR1bXAgdGhlIGZpbGVuYW1lcyBvZiBhbGwgY29uZmlndXJlZCBTU0wgY2VydGlmaWNhdGVzIHRvIHN0ZG91dC4KICAgICBbSm9lIE9ydG9uXQoKICAqKSBtb2RfZGlza19jYWNoZTogUmVtb3ZlIGEgYnVuY2ggb2Ygbm9uLWltcGxlbWVudGVkIGdhcmJhZ2UgY29sbGVjdGlvbgogICAgIGFuZCBjYWNoZSBzaXplIGRpcmVjdGl2ZXMgdGhhdCBhcmUgbm93IGF2YWlsYWJsZSB0aHJvdWdoIGh0Y2FjaGVjbGVhbi4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEFkZCBodGNhY2hlY2xlYW4gdG8gc3VwcG9ydC8gZm9yIGFzc2lzdGFuY2Ugd2l0aCBtb2RfZGlza19jYWNoZS4KICAgICBbQW5kcmVhcyBTdGVpbm1ldHpdCgogICopIG1vZF9hdXRobnpfbGRhcDogQWRkZWQgdGhlIGRpcmVjdGl2ZSAiUmVxdWlyZXMgbGRhcC1maWx0ZXIiIHRoYXQKICAgICBhbGxvd3MgdGhlIG1vZHVsZSB0byBhdXRob3JpemUgYSB1c2VyIGJhc2VkIG9uIGEgY29tcGxleCBMREFQCiAgICAgc2VhcmNoIGZpbHRlci4gIFtCcmFkIE5pY2hvbGVzXQoKICAqKSBtb2RfdXNlcnRyYWNrOiBSdW4gdGhlIGZpeHVwcyBob29rIGJlZm9yZSBvdGhlciBtb2R1bGVzLgogICAgIFBSIDI5NzU1LiAgW1BhdWwgUXVlcm5hXQoKICAqKSBBbGxvdyBtb2RfYXV0aG56X2xkYXAgYXV0aG9yaXphdGlvbiBmdW5jdGlvbmFsaXR5IHRvIGJlIHVzZWQgCiAgICAgd2l0aG91dCByZXF1aXJpbmcgdGhlIHVzZXIgdG8gYWxzbyBiZSBhdXRoZW50aWNhdGVkIHRocm91Z2ggCiAgICAgbW9kX2F1dGhuel9sZGFwLiBUaGlzIGFsbG93cyBvdGhlciBhdXRoZW50aWNhdGlvbiBtb2R1bGVzIHRvIAogICAgIHRha2UgYWR2YW50YWdlIG9mIExEQVAgYXV0aG9yaXphdGlvbiBvbmx5IFtQUiAyODI1M10KICAgICBbSmFyaSBBaG9uZW4gamFoIHByb2dyZXNzLmNvbSwgQnJhZCBOaWNob2xlc10KICAgICAKICAqKSBMb2cgdGhlIGNsaWVudCBJUCBhZGRyZXNzIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGRpc2FibGluZyBuYWdsZSBvbiBhCiAgICAgY29ubmVjdGlvbiwgYnV0IGxvZyBhdCBhIHNldmVyaXR5IG9mIGRlYnVnIHNpbmNlIHRoaXMgZXJyb3IgCiAgICAgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgdGhlIGNvbm5lY3Rpb24gd2FzIGRyb3BwZWQgYmVmb3JlIGRhdGEgd2FzCiAgICAgc2VudC4gIExvZyB0aGUgY2xpZW50IElQIGFkZHJlc3Mgd2hlbiByZXBvcnRpbmcgZXJyb3JzIGluIHRoZSBjb3JlCiAgICAgb3V0cHV0IGZpbHRlci4gIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZCBhcF9sb2dfY2Vycm9yKCkgZm9yIGxvZ2dpbmcgbWVzc2FnZXMgYXNzb2NpYXRlZCB3aXRoIHBhcnRpY3VsYXIKICAgICBjbGllbnQgY29ubmVjdGlvbnMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBjb3JlOiBBZGQgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgdGhlIHJlcXVlc3QgbGluZSByZWFkIGZhaWxzLgogICAgIFtQYXVsIFF1ZXJuYV0KCiAgKikgbW9kX2NhY2hlOiBBZGQgQ2FjaGVJZ25vcmVIZWFkZXJzIGRpcmVjdGl2ZS4gIFBSIDMwMzk5LgogICAgIFtSw7xpZ2VyIFBsw7wgPHIucGx1ZW0gdC1vbmxpbmUuZGU+XQoKICAqKSBtb2RfcmV3cml0ZTogUmVtb3ZlZCB0aGUgTWF4UmVkaXJlY3RzIG9wdGlvbiBpbiBmYXZvciBvZiB0aGUKICAgICBjb3JlIExpbWl0SW50ZXJuYWxSZWN1cnNpb24gZGlyZWN0aXZlLiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9hdXRoX2xkYXA6IEhhbmRsZSB0aGUgaW5jb25zaXN0ZW50IHdheSBpbiB3aGljaCB0aGUgTVMgTERBUAogICAgIGxpYnJhcnkgaGFuZGxlcyBzcGVjaWFsIGNoYXJhY3RlcnMuIFBSIDI0NDM3IFtKZXNzIEhvbGxlXQoKICAqKSBVbml4IE1QTXM6IFNodXQgZG93biB0aGUgc2VydmVyIG1vcmUgcXVpY2tseSB3aGVuIGNoaWxkIHByb2Nlc3NlcyBhcmUKICAgICBzbG93IHRvIGV4aXQuICBbSm9lIE9ydG9uLCBKZWZmIFRyYXdpY2tdCgogICopIG1vZF9pbmZvOiBBZGRlZCBsaXN0aW5nIG9mIHRoZSBSZXF1ZXN0IEhvb2tzIGFuZCBhZGRlZCBtb3JlIGJ1aWxkIAogICAgIGluZm9ybWF0aW9uIGxpa2UgJ2h0dHBkIC1WJyBjb250YWlucy4gQ2hhbmdlZCBvdXRwdXQgdG8gWEhUTUwuIAogICAgIFtQYXVsIFF1ZXJuYV0KCiAgKikgbW9kX2luZm86IFJld3JvdGUgY29uZmlnIHRyZWUgd2FsayB1c2luZyBhIHJlY3Vyc2l2ZSBmdW5jdGlvbi4KICAgICBBZGRlZCA/Y29uZmlnIG9wdGlvbi4gQWRkZWQgcHJpbnRvdXQgb2YgY29uZmlnIGZpbGVuYW1lIGFuZCBsaW5lIG51bWJlcnMuCiAgICAgW1JpY2kgTGFrZSA8cmljaSByaWNpbGFrZS5uZXQ+LCBQYXVsIFF1ZXJuYV0KCiAgKikgbW9kX3Byb3h5OiBGaXggdHlwZSBlcnJvciB0aGF0IHByZXZlbnRzIHByb3h5LXNlbmRjaHVua3MgZnJvbSB3b3JraW5nLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgbW9kX3Byb3h5OiBGaXggZGF0YSBjb3JydXB0aW9uIGJ5IHByb3Blcmx5IHNldHRpbmcgYXNpZGUgYnVja2V0cy4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIG1vZF9wcm94eTogSWYgYSByZXF1ZXN0IGhhcyBhIGJsYW5rIGJvZHkgYW5kIGhhcyBhIDAgQ29udGVudC1MZW5ndGgKICAgICBoZWFkZXJzLCBwYXNzIHRoYXQgdG8gdGhlIHByb3h5LiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBSZWNvZ25pemUgUVNBIGZsYWcgaW4gbW9kX3Jld3JpdGUgYWdhaW4uCiAgICAgW0phbiBLcmF0b2NodmlsIDxyY3B0LWRldi5BVC5odHRwZC5hcGFjaGUub3JnIGphbmtyYXRvY2h2aWwubmV0Pl0KCiAgKikgUmVzdHJ1Y3R1cmVkIG1vZF9hdXRoX2xkYXAgdG8gZml0IHRoZSBuZXcgYXV0aGVudGljYXRpb24gbW9kZWwuCiAgICAgVGhlIG1vZHVsZSBpcyBub3cgY2FsbGVkIGF1dGhuel9sZGFwIGFuZCBoYXMgYmVlbiBtb3ZlZCBvdXQgb2YKICAgICB0aGUgbW9kdWxlcy9leHBlcmltZW50YWwgYXJlYSBhbmQgaW50byBtb2R1bGVzL2FhYSB3aXRoIHRoZSBvdGhlcgogICAgIGF1dGggbW9kdWxlcy4gIEJvdGggdGhlIGF1dGhuX2xkYXAgcHJvdmlkZXIgYW5kIHRoZSBhdXRoel9sZGFwCiAgICAgaGFuZGxlciBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGUgYXV0aG56X2xkYXAgbW9kdWxlLiAgVGhlIAogICAgIGF1dGh6X2xkYXAgaGFuZGxlciBpbnRyb2R1Y2VzIDMgbmV3ICJyZXF1aXJlcyIgdmFsdWVzIGZvciBoYW5kbGluZwogICAgIGF1dGhvcml6YXRpb24uICBUaGVzZSBoYW5kbGVycyBhcmUgbGRhcC11c2VyLCBsZGFwLWdyb3VwIGFuZCAKICAgICBsZGFwLWRuLiBbQnJhZCBOaWNob2xlc10KCiAgKikgRml4IHNvbWUgY29tcGlsZXIgd2FybmluZ3MgaW4gcHJveHkKICAgICBbR2VvZmZyZXkgWW91bmcgPGdlb2ZmQG1vZHBlcmxjb29rYm9vay5vcmc+XQoKICAqKSBtb2Rfc3NsOiBBZGQgU1NMX0NMSUVOVF9WX1JFTUFJTiB2YXJpYWJsZSwgcmVwcmVzZW50aW5nIHRoZQogICAgIG51bWJlciBvZiBkYXlzIHVudGlsIHRoZSBjbGllbnQgY2VydCBleHBpcmVzLiAgW0pvZSBPcnRvbl0KCiAgKikgQWRkIHRlc3RfY29uZmlnIGhvb2ssIHJ1biBvbmx5IGlmIGh0dHBkIGlzIGludm9rZWQgdXNpbmcgLXQuCiAgICAgW0pvZSBPcnRvbl0KCiAgKikgSW1wcm92ZSBlcnJvciBoYW5kbGluZyBmb3IgY29ycnVwdGVkIHBpZCBmaWxlcy4gIFtKZWZmIFRyYXdpY2tdCgogICopIG1vZF9wcm94eS5jIGFuZCBwcm94eV91dGlsLmM6IEVuYWJsZSBjb21waWxpbmcgb24gMi4wLUhFQUQgCiAgICAgKGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSk6CiAgICAgQXZvaWRzIG1vZF9zc2wuaCAobm90IGluY2x1ZGVkIGluIDIuMC1IRUFEKSBhbmQKICAgICB1c2UgYXByX3NvY2tldF9jcmVhdGVfZXggZm9yIDAuOS54IAogICAgIFtNbGFkZW4gVHVya10KCiAgKikgQWRkZWQgcHJveHlfYWpwLmMgbW9kdWxlIGZvciBwcm94eSBzdXBwb3J0IHRvIGFqcDovLyBiYWNrZW5kcy4KICAgICBbSmVhbiBGcmVkZXJpYyBDbGVyZV0KCiAgKikgRml4ZXMgdGhlIGJ1aWxkIG9mIHByb3h5IG9uIFdpbmRvd3MuIFNpbmNlIHRoZSBwcm94eV9tb2R1bGUgaXMgZGVjbGFyZWQKICAgICBhcyBleHRlcm4gdXNpbmcgQVBfTU9EVUxFX0RFQ0xBUkVfREFUQSB0aGF0IGV4cGFuZHMgdG8gZGxsZXhwb3J0LCB0aGVyZQogICAgIGlzIGEgTE5LMjAwMSBlcnJvciB3aGVuIGJ1aWxkaW5nIHByb3h5X2h0dHAuIFtNbGFkZW4gVHVya10KCiAgKikgUmVtb3ZlIExEQVAgdG9vbGtpdCBzcGVjaWZpYyBjb2RlIGZyb20gdXRpbF9sZGFwIGFuZCBtb2RfYXV0aF9sZGFwLgogICAgIFtHcmFoYW0gTGVnZ2V0dF0KCiAgKikgUmVtb3ZlIGRlcHJlY2F0ZWQvcmVtb3ZlZCBBUFJfU1RBVFVTX0lTX1NVQ0NFU1MoKS4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgcGVyY2hpbGQgTVBNOiBGaXggdGhyZWFkIHNhZmV0eSBwcm9ibGVtIGluIHRoZSB1c2Ugb2YgbG9uZ2ptcCgpLgogICAgIFtUc3V5b3NoaSBTQVNBTU9UTyA8bmF6b25hem8gc3VwZXIud2luLm5lLmpwPl0KCiAgKikgQWRkIGxvYWQgYmFsYW5jZXIgc3VwcG9ydCB0byB0aGUgc2NvcmVib2FyZCBpbiBwcmVwYXJhdGlvbiBmb3IKICAgICBsb2FkIGJhbGFuY2luZyBzdXBwb3J0IGluIG1vZF9wcm94eS4gW01sYWRlbiBUdXJrXQoKICAqKSBtb2Rfbndfc3NsOiBBZGRlZCB0aGUgZGlyZWN0aXZlIE5XU1NMVXBncmFkZWFibGUgdG8gbW9kX253X3NzbCB0byAKICAgICBhbGxvdyBhIG5vbi1zZWN1cmUgY29ubmVjdGlvbiB0byBiZSB1cGdyYWRlZCB0byBzZWN1cmUgY29ubmVjdGlvbnMKICAgICBbQnJhZCBOaWNob2xlc10KICAgICAKICAqKSBjb3JlOiBBZGQgT3B0aW9ucz0gc3ludGF4IHRvIEFsbG93T3ZlcnJpZGUgdG8gc3BlY2lmeSB3aGljaCBvcHRpb25zCiAgICAgbWF5IGJlIG92ZXJyaWRkZW4gaW4gLmh0YWNjZXNzIGZpbGVzLiBQUiAyOTMxMC4KICAgICBbVG9tIEFsc2JlcmcgPGFsc2Jlcmd0IGNzLmh1amkuYWMuaWw+LCBQYXVsIFF1ZXJuYV0KCiAgKikgYWI6IEhhbmRsZSBsb25nIFVSTHMgd2l0aCBhbiBlcnJvciBpbnN0ZWFkIG9mIGFuIGJ1ZmZlciBvdmVyZmxvdy4KICAgICBQUiAyODIwNC4gW0VyaWsgV2VpZGUgPGVyaWsud2VpZGVsIG1wbHVzLXRlY2hub2xvZ2llcy5kZT4sIFBhdWwgUXVlcm5hXQoKICAqKSBtb2Rfc28sIGNvcmU6IEFkZCBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMgdG8gcHJpbnQgYWxsIGxvYWRlZAogICAgIG1vZHVsZXMuICctdCAtRCBEVU1QX01PRFVMRVMnIGFuZCAnLU0nIHdpbGwgc2hvdyBhbGwgc3RhdGljIAogICAgIGFuZCBzaGFyZWQgbW9kdWxlcyBhcyBsb2FkZWQgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgogICAgIFtQYXVsIFF1ZXJuYV0KCiAgKikgbW9kX2F1dG9pbmRleDogQWRkIFNob3dGb3JiaWRkZW4gdG8gSW5kZXhPcHRpb25zIHRvIGxpc3QgZmlsZXMKICAgICB0aGF0IGFyZSBub3Qgc2hvd24gYmVjYXVzZSB0aGUgc3VicmVxdWVzdCByZXR1cm5lZCA0MDEgb3IgNDAzLiAKICAgICBQUiAxMDU3NS4gIFtQYXVsIFF1ZXJuYV0KCiAgKikgbW9kX2hlYWRlcnM6IGltcGxlbWVudCAiRWFybHkiIHByb2Nlc3Npbmcgb3B0aW9uIGluIHBvc3RfcmVhZF9yZXF1ZXN0CiAgICAgdG8gZW5hYmxlIEhlYWRlciBhbmQgUmVxdWVzdEhlYWRlciBkaXJlY3RpdmVzIHRvIGJlIHVzZWQgdG8gc2V0IHVwCiAgICAgdGVzdGNhc2VzIGZvciBwcmUtZml4dXBzIHJlcXVlc3QgcGhhc2VzIFtOaWNrIEtld10KCiAgKikgbW9kX3Byb3h5OiBtdWx0aXBsZSBidWdmaXhlcywgcHJpbmNpcGFsbHkgc3VwcG9ydCBjb29raWVzIGluCiAgICAgUHJveHlQYXNzUmV2ZXJzZSwgYW5kIGRvbid0IGNhbm9uaWNhbGlzZSBVUkwgcGFzc2VkIHRvIGJhY2tlbmQuCiAgICAgRG9jdW1lbnRhdGlvbiBjb3JyZXNwb25kaW5nbHkgdXBkYXRlZC4gW05pY2sgS2V3IDxuaWNrIHdlYnRoaW5nLmNvbT5dCgogICopIG1vZF9kZWZsYXRlOiBzdXBwb3J0IGd6aXAgZmxhZ3MgaW4gaW5mbGF0ZV9vdXRfZmlsdGVyCiAgICAgW05pY2sgS2V3IDxuaWNrIHdlYnRoaW5nLmNvbT5dCgogICopIERyb3AgdGhlIEVycm9ySGVhZGVyIGRpcmVjdGl2ZSB3aGljaCB0dXJuZWQgb3V0IHRvIGJlIGEgbWlzbm9tZXIuCiAgICAgSW5zdGVhZCB0aGVyZSdzIGEgbmV3IG9wdGlvbmFsIGZsYWcgZm9yIHRoZSBIZWFkZXIgZGlyZWN0aXZlCiAgICAgKCdhbHdheXMnKSwgd2hpY2gga2VlcHMgdGhlIGZvcm1lciBFcnJvckhlYWRlciBmdW5jdGlvbmFsaXR5LgogICAgIFtBbmRy6SBNYWxvXQoKICAqKSBtb2RfZGVmbGF0ZTogRG9uJ3QgZGVmbGF0ZSByZXNwb25zZXMgd2l0aCB6ZXJvIGxlbmd0aCAKICAgICBlLmcuIHByb3hpZWQgMzA0J3MgW0FsbGFuIEVkd2FyZHNdCgogICopIDxJZk1vZHVsZT4gbm93IHJlY29nbml6ZXMgdGhlIG1vZHVsZSBpZGVudGlmaWVyIGluIGFkZGl0aW9uIHRvIHRoZQogICAgIGZpbGUgbmFtZS4gUFIgMjkwMDMuICBbRWR3YXJkIFJ1ZGQgPGVkZGllIG9tZWdhd2FyZS5jb20+LCBBbmRy6SBNYWxvXQoKICAqKSBtb2Rfc3NsOiBBZGQgIlNTTEhvbm9yQ2lwaGVyT3JkZXIiIGRpcmVjdGl2ZSB0byBlbmFibGUgdGhlCiAgICAgT3BlblNTTCAwLjkuNyBmbGFnIHdoaWNoIHVzZXMgdGhlIHNlcnZlcidzIGNpcGhlciBvcmRlciByYXRoZXIKICAgICB0aGFuIHRoZSBjbGllbnQncy4gIFBSIDI4NjY1LgogICAgIFtKaW0gU2NobmVpZGVyIDxqc2NobmVpZCBuZXRpbGxhLmNvbT5dCgogICopIG1vZF9zc2w6IERyb3Agc3VwcG9ydCBmb3IgdGhlIENvbXBhdEVudlZhcnMgYXJndW1lbnQgdG8KICAgICBTU0xPcHRpb25zLCB3aGljaCB3YXMgbmV2ZXIgYWN0dWFsbHkgaW1wbGVtZW50ZWQgaW4gMi4wLgogICAgIFtKb2UgT3J0b25dCgogICopIEZpeCBidWcgaW4gbW9kX2RlZmxhdGUgdGhhdCB1bmNvbmRpdGlvbmFsbHkgc2VudCBkZWZsYXRlJ2Qgb3V0cHV0CiAgICAgZXZlbiB3aGVuIEFjY2VwdC1FbmNvZGluZyBpcyBub3QgcHJlc2VudC4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgUGFzcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhyb3VnaCB0byBwaXBlZCBsb2dnZXJzIGFuZCBzdGFydAogICAgIHRoZW0gdmlhIHRoZSBzaGVsbCwgcmVzb2x2aW5nIHJlZ3Jlc3Npb25zIHNpbmNlIDEuMy4gIFBSIDI4ODE1CiAgICAgW0tlbiBDb2FyLCBKZWZmIFRyYXdpY2tdCgogICopIEV4dGVybmFsIHJld3JpdGUgbWFwIHJlc3BvbnNlcyBhcmUgbm8gbG9uZ2VyIGxpbWl0ZWQgdG8gMjA0OAogICAgIGJ5dGVzLiAgW0FuZHLpIE1hbG9dCgogICopIFByb3h5IHNlcnZlciB3YXMgZGVsZXRpbmcgY29va2llcyB0aGF0IEFwYWNoZSBoYWQgYWxyZWFkeQogICAgIGFzc2lnbmVkIGlmIHRoZSBvcmlnaW4gc2VydmVyIGhhZCBzZXQgYW55IGNvb2tpZXMuIFBSIDI3MDIzLgogICAgIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBSZW1vdmVkIG9sZCBhbmQgdW5tYWludGFpbmVkIGFwX2FkZF9uYW1lZF9tb2R1bGUgQVBJIGFuZCBjaGFuZ2VkCiAgICAgdGhlIGZvbGxvd2luZyBBUElzIHRvIHJldHVybiBhbiBlcnJvciBpbnN0ZWFkIG9mIGhhcmQgZXhpdGluZzoKICAgICBhcF9hZGRfbW9kdWxlLCBhcF9hZGRfbG9hZGVkX21vZHVsZSwgYXBfc2V0dXBfcHJlbGlua2VkX21vZHVsZXMsCiAgICAgYW5kIGFwX3Byb2Nlc3NfcmVzb3VyY2VfY29uZmlnLiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9oZWFkZXJzOiBBbGxvdyAlJSBpbiBoZWFkZXIgdmFsdWVzIHRvIHJlcHJlc2VudCBhIGxpdGVyYWwgJS4KICAgICBbQW5kcukgTWFsb10KCiAgKikgbW9kX2hlYWRlcnM6IEFsbG93IGVudiBjbGF1c2VzIGFsc28gZm9yICdlY2hvJyBhbmQgJ3Vuc2V0JyBhY3Rpb25zLgogICAgIFtBbmRy6SBNYWxvXQoKICAqKSBtb2RfaGVhZGVyczogQWxsb3cgJ2VjaG8nIGFsc28gZm9yIEVycm9ySGVhZGVycy4gIFtBbmRy6SBNYWxvXQoKICAqKSBtb2RfZGVmbGF0ZTogTmV3IG9wdGlvbiBmb3IgREVGTEFURSBvdXRwdXQgZmlsZSAoZm9yY2UtZ3ppcCksCiAgICAgbmV3IG91dHB1dCBmaWx0ZXIgJ0lORkxBVEUnIGZvciB1bmNvbXByZXNzaW5nIHJlc3BvbnNlcy4KICAgICBbTmljayBLZXcgPE5pY2sgYXQgV2ViVGhpbmcgZG90IGNvbT4sIElhbiBIb2xzbWFuXQoKICAqKSBBZGRlZCBuZXcgbW9kdWxlIG1vZF92ZXJzaW9uLCB3aGljaCBwcm92aWRlcyB2ZXJzaW9uIGRlcGVuZGVudAogICAgIGNvbmZpZ3VyYXRpb24gY29udGFpbmVycy4gIFtBbmRy6SBNYWxvXQoKICAqKSBtb2RfbG9nX2NvbmZpZyBub3cgbG9ncyBhbGwgU2V0LUNvb2tpZSBoZWFkZXJzIGlmIHRoZSAle1NldC1Db29raWV9bwogICAgIGZvcm1hdCBpcyB1c2VkLiAgUFIgMjc3ODcuICBbQW5kcukgTWFsb10KCiAgKikgQWxsb3cgRGlnZXN0IHByb3ZpZGVycyB0byByZXR1cm4gQVVUSF9ERU5JRUQgdG8gcHJvcGFnYXRlIGEgNDAxCiAgICAgc3RhdHVzIGFuZCB0ZXJtaW5hdGUgdGhlIHByb3ZpZGVyIGNoYWluIHByaW9yIHRvIGNoZWNraW5nIHRoZSBwYXNzd29yZC4KICAgICBbR2VvZmZyZXkgWW91bmddCgogICopIG1vZF9jZ2lkOiBEb24ndCBhbGxvdyBTY3JpcHRzb2NrIHRvIGJlIHNwZWNpZmllZCBpbnNpZGUgVmlydHVhbEhvc3Q7CiAgICAgRG9uJ3QgcGxhY2Ugc2NyaXB0IHNvY2tldCBpbnNpZGUgZGVmYXVsdCBzZXJ2ZXIgcm9vdCBpbnN0ZWFkIG9mCiAgICAgYWN0dWFsIHNlcnZlciByb290LiAgUFIgMjc4ODYuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBtb2RfcHJveHk6IEZpeCBoYW5kbGluZyBvZiBub24tMjAwIHN1Y2Nlc3Mgc3RhdHVzIGNvZGVzIHdoZW4KICAgICAiUHJveHlFcnJvck92ZXJyaWRlIE9uIiBpcyBjb25maWd1cmVkLiAgUFIgMjAxODMuCiAgICAgW01hcmN1cyBKYW5zb24gPG1hcmN1cy5qYW5zb24gdHJlLnNlPiwgSm9lIE9ydG9uXQoKICAqKSBUaHJlYWRlZCBNUE1zIGZvciBVbml4IGFuZCBXaW4zMjogQWRkIHN1cHBvcnQgZm9yIFRocmVhZFN0YWNrU2l6ZSAKICAgICBkaXJlY3RpdmUgKHByZXZpb3VzbHkgTmV0V2FyZS1vbmx5KSB0byBvdmVycmlkZSBkZWZhdWx0IHRocmVhZCAKICAgICBzdGFjayBzaXplIGZvciB0aHJlYWRzIHdoaWNoIGhhbmRsZSBjbGllbnQgY29ubmVjdGlvbnMuICBSZXF1aXJlZCAKICAgICBmb3Igc29tZSB0aGlyZC1wYXJ0eSBtb2R1bGVzIG9uIHBsYXRmb3JtcyB3aXRoIHNtYWxsIGRlZmF1bHQgCiAgICAgdGhyZWFkIHN0YWNrIHNpemUuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBtaW5vciBtb2RfYXV0aF9iYXNpYyBhbmQgbW9kX2F1dGhfZGlnZXN0IHN5bmMuICBtb2RfYXV0aF9iYXNpYwogICAgIG5vdyBwb3B1bGF0ZXMgci0+dXNlciB3aXRoIHRoZSAocG9zc2libHkgdW5hdXRoZW50aWNhdGVkKSB1c2VyLAogICAgIGFuZCBtb2RfYXV0aF9kaWdlc3QgcmV0dXJucyA1MDAgd2hlbiBhIHByb3ZpZGVyIHJldHVybnMKICAgICBBVVRIX0dFTkVSQUxfRVJST1IuCiAgICAgW0dlb2ZmcmV5IFlvdW5nXQoKICAqKSBUaGUgd2hvbGUgY29kZWJhc2Ugd2FzIHJlbGljZW5zZWQgYW5kIGlzIG5vdyBhdmFpbGFibGUgdW5kZXIKICAgICB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMpLgogICAgIFtBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbl0KCiAgKikgRGVsZXRlIHNvbWUgbWFrZS1nZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNlcnZlciBkaXJlY3RvcnkgZHVyaW5nIAogICAgICJtYWtlIGNsZWFuIiBwcm9jZXNzaW5nLiAgUFIgMjY1NTIuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBZGQgY29yZSB2ZXJzaW9uIHF1ZXJ5IGZ1bmN0aW9uIChhcF9nZXRfc2VydmVyX3JldmlzaW9uKSBhbmQKICAgICBhY2NvbXBhbnlpbmcgYXBfdmVyc2lvbl90IHN0cnVjdHVyZSAobWlub3IgTU1OIGJ1bXApLgogICAgIFtBbmRy6SBNYWxvXQoKICAqKSBtb2RfcmV3cml0ZTogRU9McyBzZW50IGJ5IGV4dGVybmFsIHJld3JpdGVtYXBzIGFyZSBub3cgY29uc3VtZWQKICAgICBhcyB3aG9sZS4gVGhhdCB3YXksIG9uIHN5c3RlbXMgd2l0aCBtb3JlIHRoYW4gb25lIEVPTCBjaGFyYWN0ZXIKICAgICByZXdyaXRlbWFwIHByb2dyYW1zIG5vIGxvbmdlciBuZWVkIHRvIHN3aXRjaCBzdGRvdXQgdG8gYmluYXJ5CiAgICAgbW9kZS4gUFIgMjU2MzUuICBbQW5kcukgTWFsb10KCiAgKikgbW9kX3Jld3JpdGU6IEludHJvZHVjZSB0aGUgYWJpbGl0eSB0byBmb3JjZSBhIGNvbnRlbnQgaGFuZGxlciB2aWEKICAgICB0aGUgW2hhbmRsZXI9Li4uXSBmbGFnLiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9yZXdyaXRlOiBJbnRyb2R1Y2UgdGhlIFJld3JpdGVDb25kIC14IGNoZWNrLCB3aGljaCByZXR1cm5zCiAgICAgdHJ1ZSBpZiB0aGUgcGF0dGVybiBpcyBhIGZpbGUgd2l0aCBleGVjdXRpb24gcGVybWlzc2lvbnMuCiAgICAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9yZXdyaXRlOiBBbGxvdyBwcm94eWluZyBhbmQgUmV3cml0ZVJ1bGVzIGluIGRpcmVjdG9yeSBjb250ZXh0CiAgICAgZm9yIHN1YnJlcXVlc3RzLiAgUFIgMTQ2NDgsIDE1MTE0LiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9yZXdyaXRlOiBBbGxvdyBzZXR0aW5nIG9mIGFueSB2YWxpZCBIVFRQIHJlc3BvbnNlIGNvZGUuCiAgICAgUFIgMjU5MTcuICBbQW5kcukgTWFsb10KCiAgKikgbW9kX3Jld3JpdGU6IENvb2tpZSBjcmVhdGlvbiBub3cgd29ya3MgbG9jYWxlIGluZGVwZW5kZW50LgogICAgIFtBbmRy6SBNYWxvXQoKICAqKSBtb2Rfc3NsOiBBZGQgc3VwcG9ydCBmb3IgZGlzdHJpYnV0ZWQgc2Vzc2lvbiBjYWNoZSB1c2luZyAnZGlzdGNhY2hlJy4KICAgICBbR2VvZmYgVGhvcnBlIDxnZW9mZiBnZW9mZnRob3JwZS5uZXQ+XQoKICAqKSBtb2RfZGF2OiBEaXNhbGxvdyByZXF1ZXN0cyB3aXRoIGFuIHVuZXNjYXBlZCBoYXNoIGNoYXJhY3RlciBpbgogICAgIHRoZSBSZXF1ZXN0LVVSSS4gIFBSIDIxNzc5LiAgW0FtaXQgQXRoYXZhbGUgPGFtaXRfYXRoYXZhbGUgbHljb3MuY29tPl0KCiAgKikgbW9kX3Byb3h5IHdpdGggUHJveHlFcnJvck92ZXJyaWRlIE9uIGluIGEgcmV2ZXJzZS1wcm94eSBjb25maWd1cmF0aW9uCiAgICAgYXR0YWNoZXMgYSBib2R5IHRvIHRoZSAzMDIgcmVzcG9uc2UgYW5kIGEgd3JvbmcgQ29udGVudC1MZW5ndGggaGVhZGVyLgogICAgIFBSOiAyMjk1MSBbRXJtYW5ubyBTY2FnbGlvbmUgc2NhZ2xpb25lIC4uYXQuLiBzdGFybmV0b25lLmRlXQoKICAqKSBCcmluZyBFcnJvckhlYWRlciBjb25jZXB0IGZvcndhcmQgZnJvbSAxLjMsIHNvIHRoYXQgcmVzcG9uc2UKICAgICBoZWFkZXIgZmllbGRzIGNhbiBiZSBzZXQgZm9yIHJldHVybiBldmVuIG9uIGVycm9ycyBvciBleHRlcm5hbAogICAgIHJlZGlyZWN0cy4gIFtLZW4gQ29hcl0KCiAgKikgRml4IDxMaW1pdD4gYW5kIDxMaW1pdEV4Y2VwdD4gcGFyc2luZyB0byByZXF1aXJlIGEgY2xvc2luZyAnPicgCiAgICAgaW4gdGhlIGluaXRpYWwgY29udGFpbmVyLiAgUFIgMjU0MTQuIAogICAgIFtHZW9mZnJleSBZb3VuZyA8Z2VvZmYgYXBhY2hlLm9yZz5dCgogICopIENsZWFuIHVwIGh0dHBkIC1WIG91dHB1dDogSW5zdGVhZCBvZiBkaXNwbGF5aW5nIHRoZSBNUE0gc291cmNlCiAgICAgZGlyZWN0b3J5LCBkaXNwbGF5IHRoZSBNUE0gbmFtZSBhbmQgc29tZSBNUE0gcHJvcGVydGllcy4KICAgICBbR2VvZmZyZXkgWW91bmcgPGdlb2ZmIGFwYWNoZS5vcmc+XQoKICAqKSBtb2Rfc3NsL21vZF9zdGF0dXM6IFJlLWVuYWJsZSBzdXBwb3J0IGZvciBvdXRwdXQgb2YgU1NMIHNlc3Npb24KICAgICBjYWNoZSBpbmZvcm1hdGlvbiBpbiBzZXJ2ZXItc3RhdHVzIHBhZ2UuICBbSm9lIE9ydG9uXQoKICAqKSBtb2Rfc3NsOiBSZW1vdmUgdGhlIHNobWh0IHNlc3Npb24gY2FjaGUsIHNobWNiIHNob3VsZCBiZSB1c2VkCiAgICAgaW5zdGVhZC4gIFtKb2UgT3J0b25dCgogICopIG1vZF9sb2dpbzogQWNjb3VudCBmb3Igc29tZSBieXRlcyBoYW5kZWQgdG8gdGhlIG5ldHdvcmsgbGF5ZXIgcHJpb3IgdG8KICAgICBkcm9wcGVkIGNvbm5lY3Rpb25zLiAgW0plZmYgVHJhd2lja10KCiAgKikgbW9kX2F1dG9pbmRleDogbmV3IGRpcmVjdGl2ZSBJbmRleFN0eWxlU2hlZXQgCiAgICBbVHlsZXIgUmlkZGxlIDx0cmlkZGxlXzE5OTkgeWFob28uY29tPiwgUGF1bCBRdWVybmEgPGNoaXAgZm9yY2UtZWxpdGUuY29tPl0KCiAgKikgRml4IHVuaW5pdGlhbGl6ZWQgZ3Byb2YgZGlyZWN0b3J5IG5hbWUgaW4gcHJlZm9yayBNUE0uICBQUiAyNDQ1MC4KICAgICBbQ2hyaXMgS25pZ2h0IDxDaHJpc3RvcGhlci5ELktuaWdodCBuYXNhLmdvdj5dCgogICopIExvZyBhbiBlcnJvciB3aGVuIHJlcXVlc3RzIGZvciBVUklzIHdoaWNoIGZhaWwgdG8gbWFwIHRvIGEgdmFsaWQgCiAgICAgZmlsZXN5c3RlbSBuYW1lIGFyZSByZWplY3RlZCB3aXRoIDQwMy4gIFtKZWZmIFRyYXdpY2tdCgogICopIFN3aXRjaCB0byBBUFIgMS4wIEFQSS4KCiAgKikgTWFqb3Igb3ZlcmhhdWwgb2YgbW9kX2luY2x1ZGUncyBmaWx0ZXIgcGFyc2VyLiBUaGUgbmV3IHBhcnNlciBjb2RlCiAgICAgaXMgZXhwZWN0ZWQgdG8gYmUgbW9yZSByb2J1c3QgYW5kIHNob3VsZCBjYXRjaCBhbGwgb2YgdGhlIGVkZ2UgY2FzZXMKICAgICB0aGF0IHdlcmUgbm90IGhhbmRsZWQgYnkgdGhlIHByZXZpb3VzIG9uZS4gVGhpcyBpbmNsdWRlcyBhIGJpbmFyeQogICAgIGluY29tcGF0aWJsZSBjaGFuZ2Ugb2YgbW9kX2luY2x1ZGUncyBleHRlcm5hbCBBUEkuICBbQW5kcukgTWFsb10KCiAgKikgbW9kX3Jld3JpdGU6IEFsbG93IGZvcmNlZCBtaW1ldHlwZXMgW1Q9Li4uXSB0byBnZXQgZXhwYW5kZWQuCiAgICAgUFIgMTQyMjMuICBbQW5kcukgTWFsb10KCiAgKikgbW9kX3Jld3JpdGU6IEZpeCBMQS1VIGFuZCBMQS1GIGxvb2t1cHMgaW4gZGlyZWN0b3J5IGNvbnRleHQuIFByZXZpb3VzbHkKICAgICB0aGUgY3VycmVudCByZXdyaXRlIHN0YXRlIHdhcyBqdXN0IHVzZWQgYXMgbG9va3VwIHBhdGgsIHdoaWNoIGxlYWQgdG8KICAgICBzdHJhbmdlIGFuZCBvZnRlbiB1c2VsZXNzIHJlc3VsdHMuIFJlbGF0ZWQgdG8gUFIgODQ5My4gIFtBbmRy6SBNYWxvXQoKICAqKSBDaGFuZ2UgTGlzdGVuIGRpcmVjdGl2ZSB0byBiaW5kIHRvIGFsbCBhZGRyZXNzZXMgd2hlbiBhIGhvc3RuYW1lIGlzCiAgICAgbm90IHNwZWNpZmllZC4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgQ29ycmVjdCBmYWlsdXJlIHdpdGggTGlzdGVuIGRpcmVjdGl2ZXMgb24gbWFjaGluZXMgd2l0aCBJUHY2IGVuYWJsZWQuCiAgICAgW0NvbG0gTWFjQ+FydGhhaWdoIDxjb2xtIHN0ZGxpYi5uZXQ+LCBKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRml4IGEgbGluayBmYWlsdXJlIGluIG1vZF9zc2wgd2hlbiB0aGUgT3BlblNTTCBsaWJyYXJpZXMgY29udGFpbgogICAgIHRoZSBFTkdJTkUgZnVuY3Rpb25zIGJ1dCB0aGUgZW5naW5lIGhlYWRlciBmaWxlcyBhcmUgbWlzc2luZy4KICAgICBbQ2xpZmYgV29vbGxleV0KCiAgKikgbW9kX3Jld3JpdGU6IFJld3JpdGVSdWxlcyBpbiBzZXJ2ZXIgY29udGV4dCB1c2luZyB0aGUgZm9yY2UKICAgICB0eXBlIGZlYXR1cmUgW1Q9Li4uXSBubyBsb25nZXIgZGlzYWJsZSBNdWx0aVZpZXdzLiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9yZXdyaXRlOiBBbGxvdyBwaXBlZCByZXdyaXRlIGxvZ3MgdG8gYmUgcmVsYXRpdmUgdG8gU2VydmVyUm9vdC4KICAgICBbQW5kcukgTWFsb10KCiAgKikgbW9kX2F1dGh6X2dyb3VwZmlsZTogU3RyaXAgdHJhaWxpbmcgc3BhY2VzIG9mIGdyb3VwIG5hbWVzLiBUaGlzCiAgICAgaG9wZWZ1bGx5IHNhdmVzIHNvbWUgaG91cnMgb2Ygc2VhcmNoaW5nIGZvciB0eXBvcy4gUFIgMTI4NjMuCiAgICAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9hY3Rpb25zOiBQcm9wYWdhdGUgdGhlIGhhbmRsZXIgbmFtZSB0byB0aGUgYWN0aW9uIHNjcmlwdCB2aWEKICAgICB0aGUgUkVESVJFQ1RfSEFORExFUiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIFtBbmRy6SBNYWxvXQoKICAqKSBtb2RfYWN0aW9uczogSW50cm9kdWNlIHRoZSAidmlydHVhbCIgbW9kaWZpZXIgdG8gdGhlIEFjdGlvbiBkaXJlY3RpdmUsCiAgICAgd2hpY2ggYWxsb3dzIHRoZSB1c2Ugb2YgaGFuZGxlcnMgZm9yIHZpcnR1YWwgbG9jYXRpb25zLiBQUiA4NDMxLgogICAgIFtBbmRy6SBNYWxvXQoKICAqKSBtb2Rfc3BlbGluZzogUmVjb2duaXplIEFjY2VwdFBhdGhJbmZvIHNldHRpbmcgZm9yIHRoZSBwYXJ0aWN1bGFyCiAgICAgbG9jYXRpb24uIERlZmF1bHQgaXMgdG8gcmVqZWN0IHBhdGggaW5mb3JtYXRpb24uIFBSIDIxMDU5LgogICAgIFtBbmRy6SBNYWxvXQoKICAqKSBtb2RfZXh0X2ZpbHRlcjogQWRkIHRoZSBhYmlsaXR5IHRvIGZpbHRlciByZXF1ZXN0IGJvZGllcy4KICAgICBbUGhpbGlwcCBSZWlzbmVyIDxwaGlsaXBwLnJlaXNuZXIgbGluYml0LmNvbT5dCgogICopIEZpeCBzb21lIGJyb2tlbiBsb2cgbWVzc2FnZXMgaW4gV2luTlQgTVBNLiAgCiAgICAgW0p1YW4gUml2ZXJhIDxKdWFuLlJpdmVyYSBjaXRyaXguY29tPl0KCiAgKikgcHJlZm9yayBNUE06IFVzZSB0aGUgcmlnaHQgcGVybWlzc2lvbnMgZm9yIHRoZSBkaXJlY3RvcnkgY3JlYXRlZCAKICAgICBmb3IgZ3Byb2Ygc3VwcG9ydC4gIFtKaW0gQ2FybHNvbiA8amNhcmxzb24gam5vdXMuY29tPl0KCiAgKikgRml4IGEgY29tcGlsZSBmYWlsdXJlIHdpdGggcmVjZW50IE9wZW5TU0wgYW5kIHBpY2t5IGNvbXBpbGVycwogICAgIChlLmcuLCBPcGVuU1NMIDAuOS43YSBhbmQgeGxjX3Igb24gQUlYKS4gIFtKZWZmIFRyYXdpY2tdCgogICopIE9wZW5TU0wgaGVhZGVycyBzaG91bGQgYmUgaW5jbHVkZWQgYXMgIm9wZW5zc2wvc3NsLmgiLCBhbmQgbm90IHJlbHkgb24KICAgICB0aGUgSU5DTFVERSBwYXRoIHRvIGJlIGRlZmluZWQgcHJvcGVybHkuCiAgICAgUFIgMTEzMTAuIFtHZW9mZiBUaG9ycGUgPGdlb2ZmIGdlb2ZmdGhvcnBlLm5ldD5dCgogICopIE1vZGlmeSBBUEFDSEVfQ0hFQ0tfU1NMX1RPT0xLSVQgdG8gZGV0ZWN0IFNTTC1DLiBbTWFkaHVzdWRhbiBNYXRoaWhhbGxpXQoKICAqKSBSZXBsYWNlIHRoZSBBUEFDSEVfQ0hFQ0tfU1NMX1RPT0xLSVQgbWV0aG9kIHdpdGggYSBjbGVhbmVyIG9uZSwgdXNpbmcKICAgICBhdXRvY29uZiB0b29scyAoQUNfQ0hFQ0tfSEVBREVSLCBBQ19DSEVDS19MSUIgZXRjKS4gCiAgICAgW0dlb2ZmIFRob3JwZSA8Z2VvZmYgZ2VvZmZ0aG9ycGUubmV0Pl0KCiAgKikgY2hhbmdlIGRpcmVjdGl2ZSBuYW1lIGZyb20gJ2NvbXByZXNzaW9ubGV2ZWwnIHRvICdkZWZsYXRlY29tcHJlc3Npb25sZXZlbCcKICAgICBbSWFuIEhvbHNtYW4sIEFuZHLpIE1hbG9dCgogICopIG1vZF9uZWdvdGlhdGlvbjogcXVhbGl0eSB2YWx1ZXMgYXJlIG5vdyBwYXJzZWQgaW5kZXBlbmRlbnQgZnJvbQogICAgIHRoZSBjdXJyZW50IGxvY2FsZS4gbGV2ZWwgdmFsdWVzIGFyZSBub3cgcmVhbGx5IHBhcnNlZCBhcyBpbnRlZ2Vycy4KICAgICBQUiAxNzU2NC4gIFtBbmRy6SBNYWxvXQoKICAqKSBFeHRlbmQgbW9kX25lZ290aWF0aW9uIHRvIGV2YWx1YXRlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKICAgICBuby1nemlwIGFuZCBnemlwLW9ubHktdGV4dC9odG1sIHRoZSBzYW1lIHdheSBhcyBtb2RfZGVmbGF0ZSBkb2VzLgogICAgIFtBbmRy6SBNYWxvXQoKICAqKSBtb2RfcmV3cml0ZTogRml4IHNvbWUgcHJvYmxlbXMgcmVwb3J0aW5nIGVycm9ycyB3aXRoIG1hcHBpbmcKICAgICBwcm9ncmFtcyAoUmV3cml0ZU1hcCBwcmc6L3NvbWV0aGluZykuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBSZXR1cm4gNDEzIGlmIGNodW5rLWV4dC1oZWFkZXIgaXMgdG9vIGxvbmcgcmF0aGVyIHRoYW4gcmVhZGluZyBmcm9tCiAgICAgdGhlIHRydW5jYXRlZCBsaW5lLiAgUFIgMTU4NTcuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEFsbG93IHJlc3RhcnQgb2YgaHR0cGQgdG8gb2NjdXIgZXZlbiB3aXRoIHN5bnRheCBlcnJvcnMgaW4gdGhlIGNvbmZpZwogICAgIGZpbGUuICBQUiAxNjgxMy4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgVXNlIEFQUl9MQVlPVVQgaW5zdGVhZCBvZiBBUEFDSEVfTEFZT1VUIGluIGNvbmZpZ3VyZS4gIFBSIDE1Njc5LgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgUmVtb3ZlIGZpbGVzIG9uICdtYWtlIGRpc3RjbGVhbicgdGhhdCBzaG91bGQgYmUuICBQUiAxNTU5Mi4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEFsbG93IGFwYWNoZWN0bCB0byBwZXJmb3JtIHN0YXR1cyB3aXRoIGxpbmtzIGFuZCBlbGlua3MgYXMgd2VsbC4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIG1vZF9sb2dfY29uZmlnIGNoYW5nZSBvcHRpb25hbCBob29rIHRvIHJldHVybiBwcmV2aW91cyBoYW5kbGVyCiAgICAgW0lhbiBIb2xzbWFuXQoKICAqKSBGb3J3YXJkIHBvcnQgb2YgbW9kX2FjdGlvbnMnIGFiaWxpdHkgdG8gaGFuZGxlIGFyYml0cmFyeSBtZXRob2RzCiAgICAgd2l0aCB0aGUgU2NyaXB0IGRpcmVjdGl2ZS4gIFtBbmRy6SBNYWxvXQoKICAqKSBMZXQgc3VleGVjIHNlbmQgYSBtZXNzYWdlIHRvIHN0ZGVyciwgaWYgaXQgZmFpbGVkIG9yIGl0cyBwb2xpY3kKICAgICB3YXMgdmlvbGF0ZWQuIFRoaXMgbWVzc2FnZSBhcHBlYXJzIGluIHRoZSBlcnJvciBsb2cgYW5kIGFsbG93cwogICAgIGZvciBlYXNpZXIgZGVidWdnaW5nLiBQUiA1MzgxLCA3NjM4LCA4MjU1LCAxMDc3My4gIFtBbmRy6SBNYWxvXQoKICAqKSBNb2RpZnkgYnVpbGRjb25mIHRvIGNvcHkgYWxsIHJlcXVpcmVkIGZpbGVzIGludG8gaHR0cGQncyB0cmVlLgogICAgIFtUaG9tIE1heSA8dGhvbSBwbGFuZXRhcnl0cmFtcC5uZXQ+XQoKICAqKSBBbGxvdyBtb2RfZGF2IHRvIGRvIHdlYWsgZW50aXR5IGNvbXBhcmlzb24gZnVuY3Rpb25zLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgTW92ZSBSRkMgMTQxMyBpZGVudCByZXF1ZXN0cyBmcm9tIGNvcmUgdG8gbmV3IG1vZHVsZSBtb2RfaWRlbnQuCiAgICAgW0FuZHLpIE1hbG9dCgogICopIEFkZCBtb2RfYXV0aHpfb3duZXIgLSBhIGZvcndhcmQgcG9ydCBvZiAiUmVxdWlyZSBmaWxlLW93bmVyIgogICAgIGFuZCAiUmVxdWlyZSBmaWxlLWdyb3VwIiwgd2hpY2ggd2FzIGFscmVhZHkgcHJlc2VudCBpbiB2ZXJzaW9uCiAgICAgMS4zLjIxLiAgW0FuZHLpIE1hbG9dCgogICopIEFkZCBtb2RfZGF2X2xvY2sgLSBhIGdlbmVyaWMgc3Vic2V0IG9mIHRoZSBEQVYgbG9ja2luZyBpbXBsZW1lbnRhdGlvbi4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIFJlcGxhY2Ugc29tZSBvZiB0aGUgbXV0ZXggbG9ja2luZyBpbiB0aGUgd29ya2VyIE1QTSB3aXRoCiAgICAgYXRvbWljIG9wZXJhdGlvbnMgZm9yIGhpZ2hlciBjb25jdXJyZW5jeS4gIFtCcmlhbiBQYW5lXQoKICAqKSBBbGxvdyAnbWFrZSBkZXBlbmQnIHRvIHdvcmsgd2l0aCBub24tR0NDIGNvbXBpbGVycy4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIElmIGFuIGh0dHBkLmNvbmYgaGFzIGNvbW1lbnRlZCBvdXQgQWRkTW9kdWxlIGRpcmVjdGl2ZXMsIAogICAgIGFweHMgLWkgLWEgd2lsbCBhZGQgYW4gdW4tY29tbWVudGVkIEFkZE1vZHVsZSBkaXJlY3RpdmUgZm9yIAogICAgIHRoZSBuZXcgbW9kdWxlLCB3aGljaCBicmVha3MgdGhlIGNvbmZpZy4KICAgICBQUjogMTEyMTIgW0pvZSBPcnRvbl0KCiAgKikgRml4IG1vZF9wcm94eSBoYW5kbGluZyBvZiBmaWx0ZXJlZCBpbnB1dCBib2RpZXMuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIE1vdmUgdGhlIGNoZWNrIG9mIHRoZSBFeHBlY3QgcmVxdWVzdCBoZWFkZXIgZmllbGQgYWZ0ZXIgdGhlIGhvb2sKICAgICBmb3IgYXBfcG9zdF9yZWFkX3JlcXVlc3QsIHNpbmNlIHRoYXQgaXMgdGhlIG9ubHkgb3Bwb3J0dW5pdHkgZm9yCiAgICAgbW9kdWxlcyB0byBoYW5kbGUgRXhwZWN0IGV4dGVuc2lvbnMuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIFJld3JpdGUgb2YgYWFhIG1vZHVsZXMgdG8gYW4gYXV0aG4vYXV0aHogbW9kZWwuCiAgICAgW0RpcmstV2lsbGVtIHZhbiBHdWxpaywgSnVzdGluIEVyZW5rcmFudHpdCgoKICBbQXBhY2hlIDIuMS4wLWRldiBpbmNsdWRlcyB0aG9zZSBidWcgZml4ZXMgYW5kIGNoYW5nZXMgd2l0aCB0aGUKICAgQXBhY2hlIDIuMC54eCB0cmVlIGFzIGRvY3VtZW50ZWQsIGFuZCBleGNlcHQgYXMgbm90ZWQsIGJlbG93Ll0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjUzCgogICopIFV0aWxfbGRhcDogSW1wbGVtZW50ZWQgdGhlIHV0aWxfbGRhcF9jYWNoZV9nZXR1c2VyZG4oKSBBUEkgc28gdGhhdCAKICAgICBsZGFwIGF1dGhvcml6YXRpb24gb25seSBtb2R1bGVzIGhhdmUgYWNjZXNzIHRvIHRoZSB1dGlsX2xkYXAgCiAgICAgdXNlciBjYWNoZSB3aXRob3V0IGhhdmluZyB0byByZXF1aXJlIGxkYXAgYXV0aGVudGljYXRpb24gYXMgd2VsbC4gIAogICAgIFtQUiAzMTg5OF0gW0phcmkgQWhvbmVuIGphaCBwcm9ncmVzcy5jb20sIEJyYWQgTmljaG9sZXNdCgogICopIG1vZF9hdXRoX2xkYXA6IEFkZGVkIHRoZSBkaXJlY3RpdmUgIlJlcXVpcmVzIGxkYXAtYXR0cmlidXRlIiB0aGF0CiAgICAgYWxsb3dzIHRoZSBtb2R1bGUgdG8gb25seSBhdXRob3JpemUgYSB1c2VyIGlmIHRoZSBhdHRyaWJ1dGUgdmFsdWUKICAgICBzcGVjaWZpZWQgbWF0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIHVzZXIgb2JqZWN0LiBQUiAzMTkxMwogICAgIFtSeWFuIE1vcmdhbiA8cm1vcmdhbiBwb2JveC5jb20+XQoKICAqKSBTRUNVUklUWTogQ0FOLTIwMDQtMDk0MiAoY3ZlLm1pdHJlLm9yZykKICAgICBGaXggZm9yIG1lbW9yeSBjb25zdW1wdGlvbiBEb1MgaW4gaGFuZGxpbmcgb2YgTUlNRSBmb2xkZWQgcmVxdWVzdAogICAgIGhlYWRlcnMuICBbSm9lIE9ydG9uXQoKICAqKSBTRUNVUklUWTogQ0FOLTIwMDQtMDg4NSAoY3ZlLm1pdHJlLm9yZykKICAgICBtb2Rfc3NsOiBGaXggYSBidWcgd2hpY2ggYWxsb3dlZCBhbiBTU0xDaXBoZXJTdWl0ZSBzZXR0aW5nIHRvIGJlCiAgICAgYnlwYXNzZWQgZHVyaW5nIGFuIFNTTCByZW5lZ290aWF0aW9uLiAgUFIgMzE1MDUuICAKICAgICBbSGFydG11dCBLZWlsIDxIYXJ0bXV0LktlaWwgYWRub3Z1bS5jaD4sIEpvZSBPcnRvbl0KCiAgKikgbW9kX3NzbDogRmFpbCBhdCBzdGFydHVwIHJhdGhlciB0aGFuIHNlZ2ZhdWx0IGF0IHJ1bnRpbWUgaWYgYQogICAgIGNsaWVudCBjZXJ0IGlzIGNvbmZpZ3VyZWQgd2l0aCBhbiBlbmNyeXB0ZWQgcHJpdmF0ZSBrZXkuCiAgICAgUFIgMjQwMzAuICBbSm9lIE9ydG9uXQoKICAqKSBhcHhzOiBmaXggaGFuZGxpbmcgb2YgLVdjLy1XbCBhbmQgIi1vIG1vZF9mb28uc28iLiBQUiAzMTQ0OAogICAgIFtKb2UgT3J0b25dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKikgbW9kX2xkYXA6IEZpeCBmb3JtYXQgc3RyaW5ncyB0byB1c2UgJUFQUl9QSURfVF9GTVQgaW5zdGVhZCBvZiAlZC4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBtb2RfY2FjaGU6IENhY2hlRGlzYWJsZSB3aWxsIG9ubHkgZGlzYWJsZSB0aGUgVVJMcyBpdCB3YXMgbWVhbnQgdG8gCiAgICAgZGlzYWJsZSwgbm90IGFsbCBjYWNoaW5nLiBQUiAzMTEyOC4KICAgICBbRWR3YXJkIFJ1ZGQgPGVkZGllIG9tZWdhd2FyZS5jb20+LCBQYXVsIFF1ZXJuYV0KCiAgKikgbW9kX2NhY2hlOiBUcnkgdG8gY29ycmVjdGx5IGZvbGxvdyBSRkMgMjYxNiAxMy4zIG9uIHZhbGlkYXRpbmcgc3RhbGUKICAgICBjYWNoZSByZXNwb25zZXMuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIG1vZF9yZXdyaXRlOiBIYW5kbGUgcGVyLWxvY2F0aW9uIHJ1bGVzIHdoZW4gci0+ZmlsZW5hbWUgaXMgdW5zZXQuCiAgICAgUHJldmlvdXNseSB0aGlzIHdvdWxkIHNlZ2ZhdWx0IG9yIHNpbXBseSBub3QgbWF0Y2ggYXMgZXhwZWN0ZWQsCiAgICAgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4gIFtKZWZmIFRyYXdpY2tdCgogICopIG1vZF9yZXdyaXRlOiBGaXggcXVlcnkgc3RyaW5nIGhhbmRsaW5nIGZvciBwcm94aWVkIFVSTHMuIFBSIDE0NTE4LgogICAgIFttaWNoYWVsIHRlaXRsZXIgPG1pY2hhZWwudGVpdGxlciBjZXRlbGVtLmZyPiwKICAgICAgSmFuIEtyYXRvY2h2aWwgPHJjcHQtZGV2LkFULmh0dHBkLmFwYWNoZS5vcmcgamFua3JhdG9jaHZpbC5uZXQ+XQoKICAqKSBtb2RfcmV3cml0ZTogRml4IDAgYnl0ZXMgd3JpdGUgaW50byByYW5kb20gbWVtb3J5IHBvc2l0aW9uLgogICAgIFBSIDMxMDM2LiBbQW5kcukgTWFsb10KCiAgKikgbW9kX2Rpc2tfY2FjaGU6IERvIG5vdCBzdG9yZSBhYm9ydGVkIGNvbnRlbnQuICBQUiAyMTQ5Mi4KICAgICBbUsO8aWdlciBQbMO8IDxyLnBsdWVtIHQtb25saW5lLmRlPl0KCiAgKikgbW9kX2Rpc2tfY2FjaGU6IENvcnJlY3RseSBzdG9yZSBjYWNoZWQgY29udGVudCB0eXBlLiAgUFIgMzAyNzguCiAgICAgW1LDvGlnZXIgUGzDvCA8ci5wbHVlbSB0LW9ubGluZS5kZT5dCgogICopIG1vZF9sZGFwOiBwcmV2ZW50IHRoZSBwb3NzaWJsaXR5IG9mIGFuIGluZmluaXRlIGxvb3AgaW4gdGhlIExEQVAKICAgICBzdGF0aXN0aWNzIGRpc3BsYXkuIFBSIDI5MjE2IFtHcmFoYW0gTGVnZ2V0dF0KCiAgKikgbW9kX2xkYXA6IGZpeCBhIGJvZ3VzIGVycm9yIG1lc3NhZ2UgdG8gdGVsbCB0aGUgdXNlciB3aGljaCBmaWxlCiAgICAgaXMgY2F1c2luZyBhIHBvdGVudGlhbCBwcm9ibGVtIHdpdGggdGhlIExEQVAgc2hhcmVkIG1lbW9yeSBjYWNoZS4KICAgICBQUiAzMTQzMSBbR3JhaGFtIExlZ2dldHRdCgogICopIG1vZF9kaXNrX2NhY2hlOiBEbyBub3Qgc3RvcmUgaG9wLWJ5LWhvcCBoZWFkZXJzLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBGaXggdGhlIHJlLWxpbmtpbmcgaXNzdWUgd2hlbiBwdXJnaW5nIGVsZW1lbnRzIGZyb20gdGhlIExEQVAgY2FjaGUKICAgICBQUiAyNDgwMSBbSmVzcyBIb2xsZSA8amVzc2ggcHRjLmNvbT5dCiAgICAgIAogICopIG1vZF9kaXNrX2NhY2hlOiBGaXggcmFjZXMgaW4gc2F2aW5nIHJlc3BvbnNlcy4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRml4IEV4cGlyZXMgaGFuZGxpbmcgaW4gbW9kX2NhY2hlLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBBbHRlciBtb2RfZXhwaXJlcyB0byBydW4gYXQgYSBkaWZmZXJlbnQgZmlsdGVyIHByaW9yaXR5IHRvIGFsbG93CiAgICAgcHJvcGVyIEV4cGlyZXMgc3RvcmFnZSBieSBtb2RfY2FjaGUuICBbSnVzdGluIEVyZW5rcmFudHpdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC41MgoKICAqKSBVc2UgSFRNTCAyLjAgPGhyPiBmb3IgZXJyb3IgcGFnZXMuIFBSIDMwNzMyIFtBbmRy6SBNYWxvXQoKICAqKSBGaXggdGhlIGdsb2JhbCBtdXRleCBjcmFzaCB3aGVuIHRoZSBnbG9iYWwgbXV0ZXggaXMgbmV2ZXIgYWxsb2NhdGVkCiAgICAgZHVlIHRvIGRpc2FibGVkL2VtcHR5IGNhY2hlcy4gW0plc3MgSG9sbGUgPGplc3NoIHB0Yy5jb20+XQoKICAqKSBGaXggYSBzZWdmYXVsdCBpbiB0aGUgTERBUCBjYWNoZSB3aGVuIGl0IGlzIGNvbmZpZ3VyZWQgc3dpdGNoZWQKICAgICBvZmYuIFtKZXNzIEhvbGxlIDxqZXNzaCBwdGMuY29tPl0KCiAgKikgU0VDVVJJVFk6IENBTi0yMDA0LTA4MTEgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4IG1lcmdpbmcgb2YgdGhlIFNhdGlzZnkgZGlyZWN0aXZlLCB3aGljaCB3YXMgYXBwbGllZCB0bwogICAgIHRoZSBzdXJyb3VuZGluZyBjb250ZXh0IGFuZCBjb3VsZCBhbGxvdyBhY2Nlc3MgZGVzcGl0ZSBjb25maWd1cmVkCiAgICAgYXV0aGVudGljYXRpb24uICBQUiAzMTMxNS4gIFtSaWNpIExha2UgPHJpY2kgcmljaWxha2UubmV0Pl0KCiAgKikgRml4IHRoZSBoYW5kbGluZyBvZiBVUklzIGNvbnRhaW5pbmcgJTJGIHdoZW4gQWxsb3dFbmNvZGVkU2xhc2hlcwogICAgIGlzIGVuYWJsZWQuICBQcmV2aW91c2x5LCBzdWNoIHVybHMgd291bGQgc3RpbGwgYmUgcmVqZWN0ZWQuCiAgICAgW0plZmYgVHJhd2ljaywgQmlsbCBTdG9kZGFyZF0KCiAgKikgbW9kX21lbV9jYWNoZTogRml4ZWQgcmFjZSBjb25kaXRpb24gY2F1c2luZyBzZWdmYXVsdCBiZWNhdXNlIG9mIG1lbW9yeSBiZWluZwogICAgIGZyZWVkIHR3aWNlLCBvciByZXVzZWQgYWZ0ZXIgYmVpbmcgZnJlZWQuCiAgICAgW0ouIENsYXIsIFcuIFN0b2RkYXJkLCBHLiBBbWVzXQoKICAqKSBBZGQgLWwgb3B0aW9uIHRvIHJvdGF0ZWxvZ3MgdG8gbGV0IGl0IHVzZSBsb2NhbCB0aW1lIHJhdGhlciB0aGFuCiAgICAgVVRDLiAgUFIgMjQ0MTcuICBbS2VuIENvYXIsIFVsaSBaYXBwZSA8dWxpIHJpdHVhbC5vcmc+XQoKICAqKSBtb2RfbG9nX2NvbmZpZzogRml4IGEgYnVnIHdoaWNoIHByZXZlbnRlZCByZXF1ZXN0IGNvbXBsZXRpb24gdGltZQogICAgIGZyb20gYmVpbmcgbG9nZ2VkIGZvciBJX0lOU0lTVF9PTl9FWFRSQV9DWUNMRVNfRk9SX0NMRl9DT01QTElBTkNFCiAgICAgcHJvY2Vzc2luZy4gIFBSIDI5Njk2LiAgW0Fsb2lzIFRyZWluZGwgPGFsb2lzIGFzdHJvLmNoPl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjUxCgogICopIFNFQ1VSSVRZOiBDQU4tMjAwNC0wNzg2IChjdmUubWl0cmUub3JnKQogICAgIEZpeCBhbiBpbnB1dCB2YWxpZGF0aW9uIGlzc3VlIGluIGFwci11dGlsIHdoaWNoIGNvdWxkIGJlCiAgICAgdHJpZ2dlcmVkIGJ5IG1hbGZvcm1lZCBJUHY2IGxpdGVyYWwgYWRkcmVzc2VzLiAgW0pvZSBPcnRvbl0KCiAgKikgU0VDVVJJVFk6IENBTi0yMDA0LTA3NDcgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4IGJ1ZmZlciBvdmVyZmxvdyBpbiBleHBhbnNpb24gb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluCiAgICAgY29uZmlndXJhdGlvbiBmaWxlIHBhcnNpbmcuICBbQW5kcukgTWFsb10KCiAgKikgU0VDVVJJVFk6IENBTi0yMDA0LTA4MDkgKGN2ZS5taXRyZS5vcmcpCiAgICAgbW9kX2Rhdl9mczogRml4IGEgc2VnZmF1bHQgaW4gdGhlIGhhbmRsaW5nIG9mIGFuIGluZGlyZWN0IGxvY2sKICAgICByZWZyZXNoLiAgUFIgMzExODMuICBbSm9lIE9ydG9uXQoKICAqKSBtb2RfaW5jbHVkZSBubyBsb25nZXIgY2hlY2tzIGZvciByZWN1cnNpb24sIGJlY2F1c2UgdGhhdCdzIGRvbmUKICAgICBpbiB0aGUgY29yZS4gVGhpcyBhbGxvd3MgZm9yIGNhcmVmdWwgdXNhZ2Ugb2YgcmVjdXJzaXZlIFNTSS4KICAgICBbQW5kcukgTWFsb10KCiAgKikgRml4IG1lbW9yeSBsZWFrIGluIHRoZSBjYWNoZSBoYW5kbGluZyBvZiBtb2RfcmV3cml0ZS4gUFIgMjc4NjIuCiAgICAgW2NodW55YW4gc2hlbmcgPHNoZW5ncGVyc29uIHlhaG9vLmNvbT4sIEFuZHLpIE1hbG9dCgogICopIEluY2x1ZGUgZGlyZWN0aXZlcyBubyBsb25nZXIgcmVmdXNlIHRvIHByb2Nlc3Mgc3ltbGlua3Mgb24KICAgICBkaXJlY3Rvcmllcy4gSW5zdGVhZCB0aGVyZSdzIG5vdyBhIG1heGltdW0gbmVzdGluZyBsZXZlbAogICAgIG9mIGluY2x1ZGVkIGRpcmVjdG9yaWVzICgxMjggYXMgZGlzdHJpYnV0ZWQpLiBUaGlzIGlzIGNvbmZpZ3VyYWJsZQogICAgIGF0IGNvbXBpbGUgdGltZSB1c2luZyB0aGUgLURBUF9NQVhfSU5DTFVERV9ESVJfREVQVEggc3dpdGNoLgogICAgIFBSIDI4NDkyLiAgW0FuZHLpIE1hbG9dCgogICopIFdpbjMyOiBhcGFjaGUgLWsgc3RhcnR8cmVzdGFydHxpbnN0YWxsfGNvbmZpZyBjYW4gbGVhdmUgc3RyYW5kZWQKICAgICBwaXBlZCBsb2dnZXIgcHJvY2Vzc2VzIChlZywgcm90YXRlbG9ncy5leGUpIGR1ZSB0byBpbXByb3BlcgogICAgIHNlcnZlciBzaHV0ZG93biBvbiB0aGVzZSBjb2RlIHBhdGhzLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBTRUNVUklUWTogQ0FOLTIwMDQtMDc1MSAoY3ZlLm1pdHJlLm9yZykKICAgICBtb2Rfc3NsOiBGaXggYSBzZWdmYXVsdCBpbiB0aGUgU1NMIGlucHV0IGZpbHRlciB3aGljaCBjb3VsZCBiZQogICAgIHRyaWdnZXJlZCBpZiB1c2luZyAic3BlY3VsYXRpdmUiIG1vZGUsIGZvciBpbnN0YW5jZSBieSBhIAogICAgIHByb3h5IHJlcXVlc3QgdG8gYW4gU1NMIHNlcnZlci4gIFBSIDMwMTM0LiAgW0pvZSBPcnRvbl0KCiAgKikgbW9kX3Jld3JpdGU6IEFkZCAle1NTTDouLi59IGFuZCAle0hUVFBTfSB2YXJpYWJsZSBsb29rdXBzLgogICAgIFBSIDMwNDY0LiAgW0pvZSBPcnRvbiwgTWFkaHVzdWRhbiBNYXRoaWhhbGxpXQoKICAqKSBtb2Rfc3NsOiBBZGQgbmV3ICdzc2xfaXNfaHR0cHMnIG9wdGlvbmFsIGZ1bmN0aW9uLiAgW0pvZSBPcnRvbl0KCiAgKikgUHJldmVudCBDR0kgc2NyaXB0IG91dHB1dCB3aGljaCBpbmNsdWRlcyBhIENvbnRlbnQtUmFuZ2UgaGVhZGVyCiAgICAgZnJvbSBiZWluZyBwYXNzZWQgdGhyb3VnaCB0aGUgYnl0ZXJhbmdlIGZpbHRlci4gIFtKb2UgT3J0b25dCgogICopIFNhdGlzZnkgZGlyZWN0aXZlcyBub3cgY2FuIGJlIGluZmx1ZW5jZWQgYnkgYSBzdXJyb3VuZGluZyA8TGltaXQ+CiAgICAgY29udGFpbmVyLiAgUFIgMTQ3MjYuICBbQW5kcukgTWFsb10KCiAgKikgbW9kX3Jld3JpdGUgbm93IG9mZmljaWFsbHkgc3VwcG9ydHMgUmV3cml0ZVJ1bGVzIGluIDxQcm94eT4gc2VjdGlvbnMuCiAgICAgUFIgMjc5ODUuICBbQW5kcukgTWFsb10KCiAgKikgbW9kX2Rpc2tfY2FjaGU6IEltcGxlbWVudCBiaW5hcnkgZm9ybWF0IGZvciBvbi1kaXNrIGhlYWRlciBmaWxlcy4KICAgICBbQnJpYW4gQWtpbnMgPGJha2lucyB3ZWIudHVybmVyLmNvbT4sIEp1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBtb2RfZGlza19jYWNoZTogT3B0aW1pemUgbmV0d29yayBwZXJmb3JtYW5jZSBvZiBkaXNrIGNhY2hlIHN1YnN5c3RlbSBieQogICAgIGFsbG93aW5nIHplcm8tY29weSAoc2VuZGZpbGUpIHdyaXRlcyBhbmQgb3RoZXIgbWlzY2VsbGFuZW91cyBmaXhlcy4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIG1vZF9jYWNoZSwgbW9kX2Rpc2tfY2FjaGUsIG1vZF9tZW1fY2FjaGU6IFJlZmFjdG9yIGNhY2hlIG1vZHVsZXMsIGFuZAogICAgIHN3aXRjaCB0byB0aGUgcHJvdmlkZXIgQVBJIGluc3RlYWQgb2YgaG9va3MuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIG1vZF9hdXRvaW5kZXg6IERvbid0IHRydW5jYXRlIHRoZSBkaXJlY3RvcnkgbGlzdGluZyBpZiBhIHN0YXQoKQogICAgIGNhbGwgZmFpbHMgKGZvciBpbnN0YW5jZSBvbiBhID4yR2IgZmlsZSkuICBQUiAxNzM1Ny4KICAgICBbSm9lIE9ydG9uXQoKICAqKSBNYWtlZmlsZSBmaXg6IGh0dHBkIGlzIGxpbmtlZCBhZ2FpbnN0IExJQlMgZ2l2ZW4gdG8gdGhlCiAgICAgJ21ha2UnIGludm9jYXRpb24uICBQUiA3ODgyLiAgW0pvZSBPcnRvbl0KCiAgKikgV2luTlQgTVBNOiBGaXggYSBicm9rZW4gbG9nIG1lc3NhZ2UgYXQgdGVybWluYXRpb24uICBQUiAyODA2My4KICAgICBbRWlkZXIgT2xpdmVpcmEgPGVpZGVyIGJvbC5jb20uYnI+XQoKICAqKSBQcmV2ZW50IFdpbjMyIHBvb2wgY29ycnVwdGlvbiBhdCBzdGFydHVwIFtBbGxhbiBFZHdhcmRzXQoKICAqKSBtb2Rfc3NsOiBBZGQgIlNTTFVzZXJOYW1lIiBkaXJlY3RpdmUgdG8gc2V0IHItPnVzZXIgYmFzZWQgb24gYQogICAgIGNob3NlbiBTU0wgZW52aXJvbm1lbnQgdmFyaWFibGUuICBQUiAyMDk1Ny4gCiAgICAgW01hcnRpbiB2LiBMb2V3aXMgPG1hcnRpbiB2LmxvZXdpcy5kZT5dCgogICopIHN1ZXhlYzogUGFzcyB0aGUgU0VSVkVSX1NJR05BVFVSRSBlbnZ2YXIgdGhyb3VnaCB0byBDR0lzLgogICAgIFtadmkgSGFyJ0VsIDxybCBtYXRoLnRlY2huaW9uLmFjLmlsPl0KCiAgKikgYXBhY2hlY3RsOiBGaXggYSBwcm9ibGVtIGZpbmRpbmcgZW52dmFycyBpZiBzYmluZGlyICE9IGJpbmRpci4KICAgICBQUiAzMDcyMy4gIFtGcmllZHJpY2ggSGF1YmVuc2FrIDxoc2sgaW1iLWplbmEuZGU+XQoKICAqKSBtb2Rfc3NsOiBCdWlsZCBvbiBSSEVMIDMuICBQUiAxODk4OS4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgU0VDVVJJVFk6IENBTi0yMDA0LTA3NDggKGN2ZS5taXRyZS5vcmcpCiAgICAgbW9kX3NzbDogRml4IGEgcG90ZW50aWFsIGluZmluaXRlIGxvb3AuICBQUiAyOTk2NC4gIFtKb2UgT3J0b25dCgogICopIG1vZF9zc2w6IEF2b2lkIHN0YXJ0dXAgZmFpbHVyZSBhZnRlciB1bmNsZWFuIHNodXRkb3duIGlmIHVzaW5nIHNobWNiLgogICAgIFBSIDE4OTg5LiAgW0pvZSBPcnRvbl0KCiAgKikgbW9kX3VzZXJkaXI6IEVuc3VyZSB0aGF0IHRoZSB1c2VyZGlyIGlkZW50aXR5IGlzIHVzZWQgZm9yCiAgICAgc3VleGVjIHVzZXJkaXIgYWNjZXNzIGluIGEgdmlydHVhbCBob3N0IHdoaWNoIGhhcyBzdWV4ZWMgY29uZmlndXJlZC4gIAogICAgIFBSIDE4MTU2LiAgW0pvc2h1YSBTbGl2ZV0KCiAgKikgbW9kX3Jld3JpdGUgbm8gbG9uZ2VyIGNvbmZ1c2VzIHRoZSBSZXdyaXRlTWFwIGNhY2hlcyBpZgogICAgIGRpZmZlcmVudCBtYXBzIGRlZmluZWQgaW4gZGlmZmVyZW50IHZpcnR1YWwgaG9zdHMgdXNlIHRoZQogICAgIHNhbWUgbWFwIG5hbWUuIFBSIDI2NDYyLiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9zZXRlbnZpZjogUmVtb3ZlICJzdXBwb3J0IiBmb3IgUmVtb3RlX1VzZXIgdmFyaWFibGUgd2hpY2gKICAgICBuZXZlciB3b3JrZWQgYXQgYWxsLiBQUiAyNTcyNS4gIFtBbmRy6SBNYWxvXQoKICAqKSBCYWNrcG9ydCBmcm9tIDIuMSAvIFJlZ3Jlc3Npb24gZnJvbSAxLjM6IG1vZF9oZWFkZXJzIG5vdyBrbm93cwogICAgIGFnYWluIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBFcnJvckhlYWRlciBkaXJlY3RpdmUuIEJ1dCBpbnN0ZWFkCiAgICAgdXNpbmcgdGhpcyBtaXNub21lciBhZGRpdGlvbmFsIGZsYWdzIHRvIHRoZSBIZWFkZXIgZGlyZWN0aXZlIHdlcmUKICAgICBpbnRyb2R1Y2VkICgiYWx3YXlzIiBhbmQgIm9uc3VjY2VzcyIsIGRlZmF1bHRpbmcgdG8gdGhlIGxhdHRlcikuCiAgICAgUFIgMjg2NTcuICBbQW5kcukgTWFsb10KCiAgKikgVXNlIHRoZSBoaWdoZXIgcGVyZm9ybWluZyAnaHR0cHJlYWR5JyBBY2NlcHQgRmlsdGVyIG9uIGFsbCBwbGF0Zm9ybXMgCiAgICAgZXhjZXB0IEZyZWVCU0QgPCA0LjEuMS4gW1BhdWwgUXVlcm5hXQoKICAqKSBtb2RfdXNlcnRyYWNrOiBFc2NhcGUgdGhlIGNvb2tpZSBuYW1lIGJlZm9yZSBwYXN0aW5nIGludG8gdGhlCiAgICAgcmVnZXhwLiAgW0FuZHLpIE1hbG9dCgogICopIEV4dGVuZCB0aGUgU2V0RW52SWYgZGlyZWN0aXZlIHRvIGNhcHR1cmUgc3ViZXhwcmVzc2lvbnMgb2YgdGhlCiAgICAgbWF0Y2hlZCB2YWx1ZS4gIFtBbmRy6SBNYWxvXQoKICAqKSBSZWN1cnNpdmUgSW5jbHVkZSBkaXJlY3RpdmVzIG5vIGxvbmdlciBjcmFzaC4gVGhlIHNlcnZlciBzdG9wcwogICAgIGluY2x1ZGluZyBjb25maWd1cmF0aW9uIGZpbGVzIGFmdGVyIGEgY2VydGFpbiBuZXN0aW5nIGxldmVsICgxMjgKICAgICBhcyBkaXN0cmlidXRlZCkuIFRoaXMgaXMgY29uZmlndXJhYmxlIGF0IGNvbXBpbGUgdGltZSB1c2luZyB0aGUKICAgICAtREFQX01BWF9JTkNMVURFX0RFUFRIIHN3aXRjaC4gUFIgMjgzNzAuICBbQW5kcukgTWFsb10KCiAgKikgbW9kX2RpcjogdGhlIHRyYWlsaW5nLXNsYXNoIGJlaGF2aW91ciBpcyBub3cgY29uZmlndXJhYmxlIHVzaW5nIHRoZQogICAgIERpcmVjdG9yeVNsYXNoIGRpcmVjdGl2ZS4gIFtBbmRy6SBNYWxvXQoKICAqKSBBbGxvdyBwcm94eWluZyBvZiByZXNvdXJjZXMgdGhhdCBhcmUgaW52b2tlZCB2aWEgRGlyZWN0b3J5SW5kZXguCiAgICAgUFIgMTQ2NDgsIDE1MTEyLCAyOTk2MS4gIFtBbmRy6SBNYWxvXQoKICAqKSB1dGlsX2xkYXA6IFN3aXRjaGVkIHRoZSBsb2NrIHR5cGVzIG9uIHRoZSBzaGFyZWQgbWVtb3J5IGNhY2hlIAogICAgIGZyb20gdGhyZWFkIHJlYWRlci93cml0ZXIgbG9ja3MgdG8gZ2xvYmFsIG11dGV4ZXMgaW4gb3JkZXIgdG8gCiAgICAgcHJvdmlkZSBjcm9zcyBwcm9jZXNzIGNhY2hlIHByb3RlY3Rpb24uIFtCcmFkIE5pY2hvbGVzXQogICAgIAogICopIHV0aWxfbGRhcDogUmV3b3JrZWQgdGhlIGNhY2hlIGxvY2tpbmcgc2NoZW1lIHRvIGVsaW1pbmF0ZSBkdXBsaWNhdGUgCiAgICAgY2FjaGUgZW50cmllcyBpbiB0aGUgY3JlZGVudGlhbHMgY2FjaGUgZHVlIHRvIHJhY2UgY29uZGl0aW9ucy4KICAgICBbQnJhZCBOaWNob2xlc10KICAgICAKICAqKSB1dGlsX2xkYXA6IEVuaGFuY2VkIHRoZSB1dGlsX2xkYXAgY2FjaGUtaW5mbyBkaXNwbGF5IHRvIHNob3cgbW9yZSAKICAgICBkZXRhaWwgYWJvdXQgdGhlIGNvbnRlbnRzIGFuZCBjdXJyZW50IHN0YXRlIG9mIHRoZSBjYWNoZS4gCiAgICAgW0JyYWQgTmljaG9sZXNdCiAgICAgCiAgKikgRW5hYmxlIHRoZSBvcHRpb24gdG8gc3VwcG9ydCBhbm9ueW1vdXMgc2hhcmVkIG1lbW9yeSBpbiBtb2RfbGRhcC4KICAgICBUaGlzIG1ha2VzIHRoZSBjYWNoZSB3b3JrIG9uIExpbnV4IGFnYWluLiBbR3JhaGFtIExlZ2dldHRdCgogICopIEVuYWJsZSBzcGVjaWFsIEVycm9yRG9jdW1lbnQgdmFsdWUgJ2RlZmF1bHQnIHdoaWNoIHJlc3RvcmVzIHRoZQogICAgIGNhbm5lZCBzZXJ2ZXIgcmVzcG9uc2UgZm9yIHRoZSBzY29wZSBvZiB0aGUgZGlyZWN0aXZlLgogICAgIFtHZW9mZnJleSBZb3VuZywgQW5kcukgTWFsb10KCiAgKikgd29yayBhcm91bmQgTVNJRSBEaWdlc3QgYXV0aCBidWcgLSBpZiBBdXRoRGlnZXN0RW5hYmxlUXVlcnlTdHJpbmdIYWNrCiAgICAgaXMgc2V0IGluIHItPnN1YnByb2Nlc3NfZW52IGFsbG93IG1pc21hdGNoZWQgcXVlcnkgc3RyaW5ncyB0byBwYXNzLgogICAgIFBSIDI3NzU4LiAgW1BhdWwgUXVlcm5hLCBHZW9mZnJleSBZb3VuZ10KCiAgKikgQWNjZXB0IFVSTHMgZm9yIHRoZSBTZXJ2ZXJBZG1pbiBkaXJlY3RpdmUuIElmIHRoZSBzdXBwbGllZAogICAgIGFyZ3VtZW50IGlzIG5vdCByZWNvZ25pemVkIGFzIGFuIFVSTCwgYXNzdW1lIGl0J3MgYSBtYWlsIGFkZHJlc3MuCiAgICAgUFIgMjgxNzQuICBbQW5kcukgTWFsbywgUGF1bCBRdWVybmFdCgogICopIGluaXRpYWxpemUgc2VydmVyIGFycmF5cyBwcmlvciB0byBjYWxsaW5nIGFwX3NldHVwX3ByZWxpbmtlZF9tb2R1bGVzCiAgICAgc28gdGhhdCBzdGF0aWMgbW9kdWxlcyBjYW4gcHVzaCBEZWZpbmVzIHZhbHVlcyB3aGVuIHJlZ2lzdGVyaW5nCiAgICAgaG9va3MganVzdCBsaWtlIERTTyBtb2R1bGVzIGNhbiBbIlBoaWxpcHBlIE0uIENoaWFzc29uIiA8Z296ZXIgY3Bhbi5vcmc+XQoKICAqKSBTbWFsbCBmaXggdG8gYWxsb3cgcmV2ZXJzZSBwcm94eWluZyB0byBhbiBmdHAgc2VydmVyLiBQcmV2aW91c2x5CiAgICAgYW4gYXR0ZW1wdCB0byBkbyB0aGlzIHdvdWxkIHRyeSBhbmQgY29ubmVjdCB0byAwLjAuMC4wLCByZWdhcmRsZXNzCiAgICAgb2YgdGhlIHNlcnZlciBzcGVjaWZpZWQuIFBSIDI0OTIyCiAgICAgW1Bhc2NhbCBUZXJqYW4gPHB0ZXJqYW5AbGludXhmci5vcmc+XQoKICAqKSBBZGQgdGhlIE5PVElDRSBmaWxlIHRvIHRoZSBycG0gc3BlYyBmaWxlIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKICAgICBBcGFjaGUgdjIuMCBsaWNlbnNlLiBbR3JhaGFtIExlZ2dldHRdCgogICopIFJQTSBzcGVjIGZpbGUgY2hhbmdlczogY2hhbmdlZCBkZWZhdWx0IGRlcGVuZGFuY3kgdG8gbGluayB0byBkYjQKICAgICBpbnN0ZWFkIG9mIGRiMy4gRml4ZWQgY29tcGxhaW50cyBhYm91dCB1bnBhY2thZ2VkIGZpbGVzLgogICAgIFtHcmFoYW0gTGVnZ2V0dF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjUwCgogICopIFNFQ1VSSVRZOiBDQU4tMjAwNC0wNDkzIChjdmUubWl0cmUub3JnKQogICAgIENsb3NlIGEgZGVuaWFsIG9mIHNlcnZpY2UgdnVsbmVyYWJpbGl0eSBpZGVudGlmaWVkIGJ5IEdlb3JnaQogICAgIEd1bmluc2tpIHdoaWNoIGNvdWxkIGxlYWQgdG8gbWVtb3J5IGV4aGF1c3Rpb24gd2l0aCBjZXJ0YWluCiAgICAgaW5wdXQgZGF0YS4gIFtKZWZmIFRyYXdpY2tdCgogICopIG1vZF9jZ2k6IEhhbmRsZSBvdXRwdXQgb24gc3RkZXJyIGR1cmluZyBzY3JpcHQgZXhlY3V0aW9uIG9uIFVuaXgKICAgICBwbGF0Zm9ybXM7IHByZXZlbnRpbmcgZGVhZGxvY2sgd2hlbiBzdGRlcnIgb3V0cHV0IGZpbGxzIHBpcGUgYnVmZmVyLgogICAgIEFsc28gZml4ZXMgY2FzZSB3aGVyZSBzdGRlcnIgZnJvbSBucGgtIHNjcmlwdHMgY291bGQgYmUgbG9zdC4KICAgICBQUiAyMjAzMCwgMTgzNDguICBbSm9lIE9ydG9uLCBKZWZmIFRyYXdpY2tdCgogICopIG1vZF9hbGlhcyBub3cgZW1pdHMgYSB3YXJuaW5nIGlmIGl0IGRldGVjdHMgb3ZlcmxhcHBpbmcgKkFsaWFzKgogICAgIGRpcmVjdGl2ZXMuICBbQW5kcukgTWFsb10KCiAgKikgbW9kX3Jld3JpdGUgbm8gbG9uZ2VyIHR1cm5zIGZvcndhcmQgcHJveHkgcmVxdWVzdHMgaW50byByZXZlcnNlIHByb3h5CiAgICAgcmVxdWVzdHMuIFBSIDI4MTI1ICBbYXN0IGRvbWR2LmRlLCBBbmRy6SBNYWxvXQoKICAqKSBhcF9zZXRfc3ViX3JlcV9wcm90b2NvbCBhbmQgYXBfZmluYWxpemVfc3ViX3JlcV9wcm90b2NvbCBhcmUgbm93CiAgICAgZXhwb3J0ZWQgb24gV2luMzIgYW5kIE5ldHdhcmUgYXMgd2VsbCAobWlub3IgTU1OIGJ1bXApLiAgUFIgMjg1MjMuCiAgICAgW0Vkd2FyZCBSdWRkIDxlZGRpZSBvbWVnYXdhcmUuY29tPiwgQW5kcukgTWFsb10KCiAgKikgUmVzdG9yZSB0aGUgYWJpbGl0eSB0byBkaXNhYmxlIHRoZSB1c2Ugb2YgQWNjZXB0RXggb24gV2luOXggc3lzdGVtcwogICAgIGF1dG9tYXRpY2FsbHkgKGJyb2tlbiBpbiAyLjAuNDkpLiBQUiAyODUyOS4gIFtBbmRy6SBNYWxvXQoKICAqKSA8VmlydHVhbEhvc3QgbXlob3N0PiBub3cgYXBwbGllcyB0byBhbGwgSVAgYWRkcmVzc2VzIGZvciBteWhvc3QKICAgICBpbnN0ZWFkIG9mIGp1c3QgdGhlIGZpcnN0IG9uZSByZXBvcnRlZCBieSB0aGUgcmVzb2x2ZXIuICBUaGlzCiAgICAgY29ycmVjdHMgYSByZWdyZXNzaW9uIHNpbmNlIDEuMy4gIFtKZWZmIFRyYXdpY2tdCgogICopIHV0aWxfbGRhcDogYWxsb3cgcmVsYXRpdmUgcGF0aHMgZm9yIExEQVBUcnVzdGVkQ0EgdG8gYmUgcmVzb2x2ZWQKICAgICBhZ2FpbnN0IFNlcnZlclJvb3QgUFIjMjY2MDIgW0JyYWQgTmljaG9sZXNdCiAgICAgICAKICAqKSBTRUNVUklUWTogQ0FOLTIwMDQtMDQ4OCAoY3ZlLm1pdHJlLm9yZykKICAgICBtb2Rfc3NsOiBGaXggYSBidWZmZXIgb3ZlcmZsb3cgaW4gdGhlIEZha2VCYXNpY0F1dGggY29kZSBmb3IgYQogICAgICh0cnVzdGVkKSBjbGllbnQgY2VydGlmaWNhdGUgc3ViamVjdCBETiB3aGljaCBleGNlZWRzIDZLIGluIGxlbmd0aC4KICAgICBbSm9lIE9ydG9uXQoKICAqKSBtb2RfZGF2X2ZzOiBGaXggTUtDT0wgcmVzcG9uc2UgZm9yIG1pc3NpbmcgcGFyZW50IGNvbGxlY3Rpb25zLCB3aGljaCAKICAgICBjYXVzZWQgaXNzdWVzIGZvciB0aGUgRWNsaXBzZSBXZWJEQVYgZXh0ZW5zaW9uLgogICAgIFBSIDI5MDM0LiAgW0pvZSBPcnRvbl0KCiAgKikgbW9kX2RlZmxhdGU6IEZpeCBtZW1vcnkgY29uc3VtcHRpb24gKHdoaWNoIHdhcyBwcm9wb3J0aW9uYWwgdG8gdGhlCiAgICAgcmVzcG9uc2Ugc2l6ZSkuICBQUiAyOTMxOC4gIFtKb2UgT3J0b25dCgogICopIG1vZF9zc2w6IExvZyB0aGUgZXJyb3JzIHJldHVybmVkIG9uIGZhaWx1cmUgdG8gbG9hZCBvciBpbml0aWFsaXplCiAgICAgYSBjcnlwdG8gYWNjZWxlcmF0b3IgZW5naW5lLiAgW0pvZSBPcnRvbl0KCiAgKikgQWxsb3cgUmVxdWVzdEhlYWRlciBkaXJlY3RpdmVzIHRvIGJlIGNvbmRpdGlvbmFsLiBQUiAyNzk1MS4KICAgICBbVmluY2VudCBEZWZmb250YWluZXMgPHZpbmNlbnQgZ3J5em9yLmNvbT4sIEFuZHLpIE1hbG9dCgogICopIEFsbG93IExpbWl0UmVxdWVzdEJvZHkgdG8gYmUgcmVzZXQgdG8gdW5saW1pdGVkLiBQUiAyOTEwNgogICAgIFtBbmRy6SBNYWxvXQoKICAqKSBGaXggYSBidW5jaCBvZiBjYXNlcyB3aGVyZSB0aGUgcmV0dXJuIGNvZGUgb2YgdGhlIHJlZ2V4IGNvbXBpbGVyCiAgICAgd2FzIG5vdCBjaGVja2VkIHByb3Blcmx5LiBUaGlzIGFmZmVjdHM6IG1vZF9zZXRlbnZpZiwgbW9kX3VzZXJ0cmFjaywKICAgICBtb2RfcHJveHksIG1vZF9wcm94eV9mdHAgYW5kIGNvcmUuIFBSIDI4MjE4LiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9zc2w6IEZpeCBhIHBvdGVudGlhbCBzZWdmYXVsdCBpbiB0aGUgJ3NobWNiJyBzZXNzaW9uIGNhY2hlIGZvcgogICAgIHNtYWxsIGNhY2hlIHNpemVzLiAgUFIgMjc3NTEuICBbR2VvZmYgVGhvcnBlIDxnZW9mZiBnZW9mZnRob3JwZS5uZXQ+XQoKICAqKSBSZW1vdmUgMkdiIGxvZyBmaWxlIHNpemUgcmVzdHJpY3Rpb24gb24gc29tZSAzMi1iaXQgcGxhdGZvcm1zLgogICAgIFBSIDEzNTExLiAgW0pvZSBPcnRvbl0KCiAgKikgbW9kX2xvZ2lvIG5vIGxvbmdlciByZW1vdmVzIHRoZSBFT1MgYnVja2V0LiBQUiAyNzkyOC4KICAgICBbQm9qYW4gU21vanZlciA8Ym9qYW4gcmV4dXJzaXZlLmNvbT5dCgogICopIGh0cGFzc3dkIG5vIGxvbmdlciByZWZ1c2VzIHRvIHByb2Nlc3MgZmlsZXMgdGhhdCBjb250YWluIGVtcHR5CiAgICAgbGluZXMuICBbQW5kcukgTWFsb10KCiAgKikgUmVncmVzc2lvbiBmcm9tIDEuMzogQXQgc3RhcnR1cCwgc3VleGVjIG5vdyB3aWxsIGJlIGNoZWNrZWQgZm9yCiAgICAgYXZhaWxhYmlsaXR5LCB0aGUgc2V0dWlkIGJpdCBhbmQgdXNlciByb290LiBUaGUgd29ya3Mgb25seSBpZgogICAgIGh0dHBkIGlzIGNvbXBpbGVkIHdpdGggdGhlIHNoaXBwZWQgQVBSIHZlcnNpb24gKDAuOS41KS4KICAgICBQUiAyODI4Ny4gIFtBbmRy6SBNYWxvXQoKICAqKSBVbml4IE1QTXM6IFN0b3AgZHJvcHBpbmcgY29ubmVjdGlvbnMgd2hlbiB0aGUgZmlsZSBkZXNjcmlwdG9yCiAgICAgaXMgYXQgbGVhc3QgRkRfU0VUU0laRS4gIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBoYW5kbGluZyBvZiBJUHY2IG51bWVyaWMgc3RyaW5ncyBpbiBtb2RfcHJveHkuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBtb2RfaXNhcGk6IHNlbmRfcmVzcG9uc2VfaGVhZGVyKCkgZmFpbGVkIHRvIGNvcHkgc3RhdHVzIHN0cmluZydzIAogICAgIGxhc3QgY2hhcmFjdGVyLiAgUFIgMjA2MTkuICBbSmVzc2UgUGVsdG9uIDxqc3AgcGtjLmNvbT5dCgogICopIEZpeCBhIHNlZ2ZhdWx0IHdoZW4gcmVxdWVzdHMgZm9yIHNoYXJlZCBtZW1vcnkgZmFpbHMgYW5kIHJldHVybnMKICAgICBOVUxMLiBGaXggYSBzZWdmYXVsdCBjYXVzZWQgYnkgYSBsYWNrIG9mIGJvdW5kcyBjaGVja2luZyBvbiB0aGUKICAgICBjYWNoZS4gIFBSIDI0ODAxLiAgW0dyYWhhbSBMZWdnZXR0XQoKICAqKSBUaHJvdyBhbiBlcnJvciBtZXNzYWdlIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB1c2UgdGhlIExEQVBUcnVzdGVkQ0EKICAgICBvciBMREFQVHJ1c3RlZENBVHlwZSBkaXJlY3RpdmVzIGluIGEgVmlydHVhbEhvc3QuIFBSIDI2MzkwCiAgICAgW0JyYWQgTmljaG9sZXNdCgogICopIEZpeCBhIHBvdGVudGlhbCBzZWdmYXVsdCBpZiB0aGUgYmluZCBwYXNzd29yZCBpbiB0aGUgTERBUCBjYWNoZQogICAgIGlzIE5VTEwuICBQUiAyODI1MC4gIFtKYXJpIEFob25lbiA8amFoIHByb2dyZXNzLmNvbT5dCgogICopIFF1b3RlcyBjYW5ub3QgYmUgdXNlZCBhcm91bmQgcmVxdWlyZSBncm91cCBhbmQgcmVxdWlyZSBkbgogICAgIGRpcmVjdGl2ZXMsIHVwZGF0ZSB0aGUgZG9jdW1lbnRhdGlvbiB0byByZWZsZWN0IHRoaXMuIEFsc28gYWRkCiAgICAgcXVvdGVzIGFyb3VuZCB0aGUgZG4gYW5kIGdyb3VwIHdpdGhpbiBkZWJ1ZyBtZXNzYWdlcywgdG8gbWFrZSBpdAogICAgIG1vcmUgb2J2aW91cyB3aHkgYXV0aGVudGljYXRpb24gaXMgZmFpbGluZyBpZiBxdW90ZXMgYXJlIHVzZWQgaW4KICAgICBlcnJvci4gIFBSIDE5MzA0LiAgW0dyYWhhbSBMZWdnZXR0XQoKICAqKSBUaGUgTWljcm9zb2Z0IExEQVAgU0RLIGVzY2FwZXMgZmlsdGVycyBmb3IgdXMsIHN0b3AgdXRpbF9sZGFwCiAgICAgZnJvbSBlc2NhcGluZyBmaWx0ZXJzIHR3aWNlIHdoZW4gdGhlIGJhY2tzbGFzaCBjaGFyYWN0ZXIgaXMgdXNlZC4KICAgICBQUiAyNDQzNy4gIFtKZXNzIEhvbGxlIDxqZXNzaCBwdGMuY29tPl0KCiAgKikgT3ZlcmhhdWwgaGFuZGxpbmcgb2YgTERBUCBlcnJvciBjb25kaXRpb25zLCBzbyB0aGF0IHRoZSB1dGlsX2xkYXBfKgogICAgIGZ1bmN0aW9ucyBsZWF2ZSB0aGUgY29ubmVjdGlvbnMgaW4gYSBzYW5lIHN0YXRlIGFmdGVyIGVycm9ycyBoYXZlCiAgICAgb2NjdXJyZWQuIFBSIDI3NzQ4LCAxNzI3NCwgMTc1OTksIDE4NjYxLCAyMTc4NywgMjQ1OTUsIDI0NjgzLCAyNzEzNCwKICAgICAyNzI3MSBbR3JhaGFtIExlZ2dldHRdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgKikgbW9kX2xkYXAgY2FsbHMgbGRhcF9zaW1wbGVfYmluZF9zKCkgdG8gdmFsaWRhdGUgdGhlIHVzZXIKICAgICBjcmVkZW50aWFscy4gIElmIHRoZSBiaW5kIGZhaWxzLCB0aGUgY29ubmVjdGlvbiBpcyBsZWZ0CiAgICAgaW4gYW4gdW5ib3VuZCBzdGF0ZS4gIE1ha2Ugc3VyZSB0aGF0IHRoZSBsZGFwIGNvbm5lY3Rpb24KICAgICByZWNvcmQgaXMgdXBkYXRlZCB0byBzaG93IHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgbm8gbG9uZ2VyCiAgICAgYm91bmQuIFtCcmFkIE5pY2hvbGVzXQoKICAqKSBFbnN1cmUgdGhhdCBsaW5lcyBpbiB0aGUgcmVxdWVzdCB3aGljaCBhcmUgdG9vIGxvbmcgYXJlIAogICAgIHByb3Blcmx5IHRlcm1pbmF0ZWQgYmVmb3JlIGxvZ2dpbmcuCiAgICAgW1RzdXJ1dGFuaSBOYW9raSA8dHVydXRhbmkgc2NwaHlzLmt5b3RvLXUuYWMuanA+XQoKICAqKSBVcGRhdGUgdGhlIGJpbmQgY3JlZGVudGlhbHMgZm9yIHRoZSBjYWNoZWQgTERBUCBjb25uZWN0aW9uIHRvIAogICAgIHJlZmxlY3QgdGhlIGxhc3QgYmluZC4gIFRoaXMgcHJldmVudHMgdXRpbF9sZGFwIGZyb20gY3JlYXRpbmcgCiAgICAgdW5uZWNlc3NhcnkgY29ubmVjdGlvbnMgcmF0aGVyIHRoYW4gcmV1c2luZyBjYWNoZWQgY29ubmVjdGlvbnMuCiAgICAgW0JyYWQgTmljaG9sZXNdCiAgICAgCiAgKikgbW9kX2lzYXBpOiBHZXRTZXJ2ZXJWYXJpYWJsZSByZXR1cm5lZCBpbXByb3Blcmx5IHRlcm1pbmF0ZWQgaGVhZGVyIAogICAgIGZpZWxkcyBnaXZlbiAiQUxMX0hUVFAiIG9yICJBTExfUkFXIi4gIFBSIDIwNjU2LgogICAgIFtKZXNzZSBQZWx0b24gPGpzcCBwa2MuY29tPl0KCiAgKikgbW9kX2lzYXBpOiBHZXRTZXJ2ZXJWYXJpYWJsZSgiQUxMX1JBVyIpIHJldHVybmVkIHRoZSB3cm9uZyBidWZmZXIKICAgICBzaXplLiAgUFIgMjA2MTcuICBbSmVzc2UgUGVsdG9uIDxqc3AgcGtjLmNvbT5dCgogICopIG1vZF9kYXY6IEZpeCBhIHByb2JsZW0gdGhhdCBjb3VsZCBjYXVzZSBjcmFzaGVzIHdoZW4gbWFuaXB1bGF0aW5nIAogICAgIGxvY2tzIG9uIHNvbWUgcGxhdGZvcm1zLiAgW0plZmYgVHJhd2lja10KCiAgKikgbW9kX2hlYWRlcnMgbm8gbG9uZ2VyIGNyYXNoZXMgaWYgYW4gZW1wdHkgaGVhZGVyIHZhbHVlIHNob3VsZAogICAgIGJlIGFkZGVkLiAgW0FuZHLpIE1hbG9dCgogICopIEZpeCBzZWdmYXVsdCBpbiBtb2RfZXhwaXJlcywgd2hpY2ggb2NjdXJlZCB1bmRlciBjZXJ0YWluCiAgICAgY2lyY3Vtc3RhbmNlcy4gUFIgMjgwNDcuICBbQW5kcukgTWFsb10KCiAgKikgaHRwYXNzd2Q6IHVzZSBhcHJfdGVtcF9kaXJfZ2V0KCkgYW5kIGdlbmVyYWwgY2xlYW51cAogICAgIFtHdWVudGVyIEtuYXVmIDxlZmxhc2ggZ214Lm5ldD4sIFRob20gTWF5XQoKICAqKSBtb2Rfc3NsOiBGaXggbWVtb3J5IGxlYWsgaW4gc2Vzc2lvbiBjYWNoZSBoYW5kbGluZy4gIFBSIDI2NTYyCiAgICAgW01hZGh1c3VkYW4gTWF0aGloYWxsaV0KCiAgKikgbW9kX3NzbDogRml4IHBvdGVudGlhbCBzZWdmYXVsdHMgd2hlbiBwZXJmb3JtaW5nIFNTTCBzaHV0ZG93biBmcm9tCiAgICAgYSBwb29sIGNsZWFudXAuICBQUiAyNzk0NS4gIFtKb2UgT3J0b25dCgogICopIEFkZCBmb3JlbnNpYyBsb2dnaW5nIG1vZHVsZSAobW9kX2xvZ19mb3JlbnNpYykuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIGxvZ3Jlc29sdmU6IEFsbG93IHNpemUgb2YgbG9nIGxpbmUgYnVmZmVyIHRvIGJlIG92ZXJyaWRkZW4gYXQKICAgICBidWlsZCB0aW1lIChNQVhMSU5FKS4gIFBSIDI3NzkzLiAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IHRoZSBjb21tZW50IGRlbGltaXRlciBpbiBodGRibSBzbyB0aGF0IGl0IGNvcnJlY3RseSBwYXJzZXMgdGhlIAogICAgIHVzZXJuYW1lIGNvbW1lbnQuICBBbHNvIGFkZCBhIHRlcm1pbmF0ZSBmdW5jdGlvbiB0byBhbGxvdyBOZXRXYXJlIAogICAgIHRvIHBhdXNlIHRoZSBvdXRwdXQgYmVmb3JlIHRoZSBzY3JlZW4gaXMgZGVzdHJveWVkLgogICAgIFtHdWVudGVyIEtuYXVmIDxlZmxhc2ggZ214Lm5ldD4sIEJyYWQgTmljaG9sZXNdIAogIAogICopIEZpeCBjcmFzaCB3aGVuIEFwYWNoZSB3YXMgc3RhcnRlZCB3aXRoIG5vIExpc3RlbiBkaXJlY3RpdmVzLgogICAgIFtNaWNoYWVsIENvcmNvcmFuIDxtY29yY29yYW4gd2FycHNvbHV0aW9ucy5jb20+XQoKICAqKSBjb3JlX291dHB1dF9maWx0ZXI6IEZpeCBidWcgdGhhdCBjb3VsZCByZXN1bHQgaW4gc2VuZGluZwogICAgIGdhcmJhZ2Ugb3ZlciB0aGUgbmV0d29yayB3aGVuIG1vZHVsZSBoYW5kbGVycyBjb25zdHJ1Y3QKICAgICBidWNrZXQgYnJpZ2FkZXMgY29udGFpbmluZyBtdWx0aXBsZSBmaWxlIGJ1Y2tldHMgYWxsIHJlZmVyZW5jaW5nCiAgICAgdGhlIHNhbWUgb3BlbiBmaWxlIGRlc2NyaXB0b3IuIFtCb2phbiBTbW9qdmVyXQoKICAqKSBGaXggbWVtb3J5IGNvcnJ1cHRpb24gcHJvYmxlbSB3aXRoIGFwX2N1c3RvbV9yZXNwb25zZSgpIGZ1bmN0aW9uLgogICAgIFRoZSBjb3JlIHBlci1kaXIgY29uZmlnIHdvdWxkIGxhdGVyIHBvaW50IHRvIHJlcXVlc3QgcG9vbCBkYXRhCiAgICAgdGhhdCB3b3VsZCBiZSByZXVzZWQgZm9yIGRpZmZlcmVudCBwdXJwb3NlcyBvbiBkaWZmZXJlbnQgcmVxdWVzdHMuCiAgICAgW0plZmYgVHJhd2ljaywgYmFzZWQgb24gYW4gb2xkIDEuMyBwYXRjaCBzdWJtaXR0ZWQgYnkgV2lsbCBMb3dlXQoKICAqKSBXaW4zMjogVHdlYWsgd29ya2VyIHRocmVhZCBhY2NvdW50aW5nIHJvdXRpbmVzIHRvIGVsaW1pbmF0ZQogICAgIHNlcnZlciBoYW5nIHdoZW4gbnVtYmVyIG9mIExpc3RlbiBkaXJlY3RpdmVzIGluIGh0dHBkLmNvbmYKICAgICBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNldHRpbmcgb2YgVGhyZWFkc1BlckNoaWxkLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuNDkKCiAgKikgU0VDVVJJVFk6IENBTi0yMDA0LTAxNzQgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4IHN0YXJ2YXRpb24gaXNzdWUgb24gbGlzdGVuaW5nIHNvY2tldHMgd2hlcmUgYSBzaG9ydC1saXZlZAogICAgIGNvbm5lY3Rpb24gb24gYSByYXJlbHktYWNjZXNzZWQgbGlzdGVuaW5nIHNvY2tldCB3aWxsIGNhdXNlIGEKICAgICBjaGlsZCB0byBob2xkIHRoZSBhY2NlcHQgbXV0ZXggYW5kIGJsb2NrIG91dCBuZXcgY29ubmVjdGlvbnMgdW50aWwKICAgICBhbm90aGVyIGNvbm5lY3Rpb24gYXJyaXZlcyBvbiB0aGF0IHJhcmVseS1hY2Nlc3NlZCBsaXN0ZW5pbmcgc29ja2V0LgogICAgIFdpdGggQXBhY2hlIDIueCB0aGVyZSBpcyBubyBwZXJmb3JtYW5jZSBjb25jZXJuIGFib3V0IGVuYWJsaW5nIHRoZSAKICAgICBsb2dpYyBmb3IgcGxhdGZvcm1zIHdoaWNoIGRvbid0IG5lZWQgaXQsIHNvIGl0IGlzIGVuYWJsZWQgZXZlcnl3aGVyZQogICAgIGV4Y2VwdCBmb3IgV2luMzIuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBtb2RfY2dpZDogRml4IHN0b3JhZ2UgY29ycnVwdGlvbiBjYXVzZWQgYnkgdXNlIG9mIGluY29ycmVjdCBwb29sLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIFdpbjMyOiBmaW5kX3JlYWRfbGlzdGVuZXJzIHdhcyBub3QgY29ycmVjdGx5IGhhbmRsaW5nIG11bHRpcGxlCiAgICAgbGlzdGVuZXJzIG9uIHRoZSBXaW4zMkRpc2FibGVBY2NlcHRFeCBwYXRoLiAgW0JpbGwgU3RvZGRhcmRdCgogICopIEZpeCBidWcgaW4gbW9kX3VzZXJ0cmFjayB3aGVuIG5vIENvb2tpZU5hbWUgaXMgc2V0LiAgUFIgMjQ0ODMuCiAgICAgW01hbm5pIFdvb2QgPG1hbm5pd29vZCBwbGFuZXQtc2F2ZS5jb20+XQoKICAqKSBGaXggc29tZSBwaXBlZCBsb2cgcHJvYmxlbXM6IGJvZ3VzICJwaXBlZCBsb2cgcHJvZ3JhbSAnKG51bGwpJwogICAgIGZhaWxlZCIgbWVzc2FnZXMgZHVyaW5nIHJlc3RhcnQgYW5kIHByb2JsZW0gd2l0aCB0aGUgbG9nZ2VyCiAgICAgcmVzcGF3bmluZyBhZ2FpbiBhZnRlciBBcGFjaGUgaXMgc3RvcHBlZC4gIFBSIDIxNjQ4LCBQUiAyNDgwNS4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXhlZCBmaWxlIGV4dGVuc2lvbnMgZm9yIHJlYWwgbWVkaWEgZmlsZXMgYW5kIHJlbW92ZWQgcnBtIGV4dGVuc2lvbgogICAgIGZyb20gbWltZS50eXBlcy4gUFIgMjYwNzkuICBbQWxsYW4gU2FuZGZlbGQgPGtkZSBjYXJld29sZi5jb20+XQoKICAqKSBSZW1vdmUgY29tcGlsZS10aW1lIGxlbmd0aCBsaW1pdCBvbiByZXF1ZXN0IHN0cmluZ3MuIExlbmd0aCBpcwogICAgIG5vdyBlbmZvcmNlZCBzb2xlbHkgd2l0aCB0aGUgTGltaXRSZXF1ZXN0TGluZSBjb25maWcgZGlyZWN0aXZlLgogICAgIFtQYXVsIEouIFJlZGVyXQoKICAqKSBtb2Rfc3NsOiBTZW5kIHRoZSBDbG9zZSBBbGVydCBtZXNzYWdlIHRvIHRoZSBwZWVyIGJlZm9yZSBjbG9zaW5nCiAgICAgdGhlIFNTTCBzZXNzaW9uLiAgUFIgMjc0MjguICBbTWFkaHVzdWRhbiBNYXRoaWhhbGxpLCBKb2UgT3J0b25dCgogICopIFNFQ1VSSVRZOiBDVkUtMjAwNC0wMTEzIChjdmUubWl0cmUub3JnKQogICAgIG1vZF9zc2w6IEZpeCBhIG1lbW9yeSBsZWFrIGluIHBsYWluLUhUVFAtb24tU1NMLXBvcnQgaGFuZGxpbmcuCiAgICAgUFIgMjcxMDYuICBbSm9lIE9ydG9uXQoKICAqKSBtb2Rfc3NsOiBGaXggYnVnIGluIHBhc3NwaHJhc2UgaGFuZGxpbmcgd2hpY2ggY291bGQgY2F1c2Ugc3B1cmlvdXMKICAgICBmYWlsdXJlcyBpbiBTU0wgZnVuY3Rpb25zIGxhdGVyLiAgUFIgMjExNjAuICBbSm9lIE9ydG9uXQoKICAqKSBtb2RfbG9nX2NvbmZpZzogRml4IGNvcnJ1cHRpb24gb2YgYnVmZmVyZWQgbG9ncyB3aXRoIHRocmVhZGVkCiAgICAgTVBNcy4gIFBSIDI1NTIwLiAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IG1vZF9pbmNsdWRlJ3MgZXhwcmVzc2lvbiBwYXJzZXIgdG8gcmVjb2duaXplIHN0cmluZ3MgY29ycmVjdGx5CiAgICAgZXZlbiBpZiB0aGV5IHN0YXJ0IHdpdGggYW4gZXNjYXBlZCB0b2tlbi4gIFtBbmRy6SBNYWxvXQoKICAqKSBBZGQgZmF0YWwgZXhjZXB0aW9uIGhvb2sgZm9yIHVzZSBieSBkaWFnbm9zdGljIG1vZHVsZXMuICBUaGUgaG9vawogICAgIGlzIG9ubHkgYXZhaWxhYmxlIGlmIHRoZSAtLWVuYWJsZS1leGNlcHRpb24taG9vayBjb25maWd1cmUgcGFybSAKICAgICBpcyB1c2VkIGFuZCB0aGUgRW5hYmxlRXhjZXB0aW9uSG9vayBkaXJlY3RpdmUgaGFzIGJlZW4gc2V0IHRvIAogICAgICJvbiIuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBbGxvdyBtb2RfYXV0aF9kaWdlc3QgdG8gd29yayB3aXRoIHN1Yi1yZXF1ZXN0cyB3aXRoIGRpZmZlcmVudAogICAgIG1ldGhvZHMgdGhhbiB0aGUgb3JpZ2luYWwgcmVxdWVzdC4gIFBSIDI1MDQwLgogICAgIFtKb3NoIERhZHkgPGpwZCBpbmRlY2lzaXZlLmNvbT5dCgogICopIGZpeCAiRXhwZWN0ZWQgPC9Gb28+PiBidXQgc2F3IDwvRm9vPiIgZXJyb3JzIGluIG5lc3RlZCwKICAgICBhcmd1bWVudGxlc3MgY29udGFpbmVycy4KICAgICBbIlBoaWxpcHBlIE0uIENoaWFzc29uIiA8Z296ZXIgY3Bhbi5vcmc+XQoKICAqKSBtb2RfYXV0aF9sZGFwOiBGaXggc29tZSBzZWdmYXVsdHMgaW4gdGhlIGNhY2hlIGxvZ2ljLiAgUFIgMTg3NTYuCiAgICAgW01hdHRoaWV1IEVzdHJhZGUgPGFwYWNoZSBtb3Jlc2VjdXJpdHkub3JnPiwgQnJhZCBOaWNob2xlc10KCiAgKikgbW9kX2NnaWQ6IFJlc3RhcnQgdGhlIGNnaWQgZGFlbW9uIGlmIGl0IGNyYXNoZXMuICBQUiAxOTg0OQogICAgIFtHbGVubiBOaWVsc2VuIDxnbGVubiBhcGFjaGUub3JnPl0KCiAgKikgVGhlIHdob2xlIGNvZGViYXNlIHdhcyByZWxpY2Vuc2VkIGFuZCBpcyBub3cgYXZhaWxhYmxlIHVuZGVyCiAgICAgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzKS4KICAgICBbQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb25dCgogICopIEZpeGVkIGNhY2hlLXJlbW92YWwgb3JkZXIgaW4gbW9kX21lbV9jYWNoZS4KICAgICBbSmVhbi1KYWNxdWVzIENsYXIsIENsaWZmIFdvb2xsZXldCgogICopIG1vZF9zZXRlbnZpZjogRml4IHRoZSByZWdleCBvcHRpbWl6ZXIsIHdoaWNoIHVuZGVyIGNpcmN1bXN0YW5jZXMKICAgICB0cmVhdGVkIHRoZSBzdXBwbGllZCByZWdleCBhcyBsaXRlcmFsIHN0cmluZy4gUFIgMjQyMTkuCiAgICAgW0FuZHLpIE1hbG9dCgogICopIGFwX21wbS5oOiBGaXggaW5jbHVkZSBndWFyZCBvZiBhcF9tcG0uaCB0byByZWZlcmVuY2UgbXBtCiAgICAgaW5zdGVhZCBvZiBtbW4uIFtBbmRy6SBNYWxvXQoKICAqKSBtb2RfcmV3cml0ZTogQ2F0Y2ggYW4gZWRnZSBjYXNlLCB3aGVyZSBzdHJhbmdlIHN1YnNlcXVlbnQgUmV3cml0ZVJ1bGVzCiAgICAgY291bGQgbGVhZCB0byBhIDQwMCAoQmFkIFJlcXVlc3QpIHJlc3BvbnNlLiAgW0FuZHLpIE1hbG9dCgogICopIEtlZXAgZm9jdXMgb2YgSVRFUkFURSBhbmQgSVRFUkFURTIgb24gdGhlIGN1cnJlbnQgbW9kdWxlIHdoZW4KICAgICB0aGUgbW9kdWxlIGNob29zZXMgdG8gcmV0dXJuIERFQ0xJTkVfQ01EIGZvciB0aGUgZGlyZWN0aXZlLgogICAgIFBSIDIyMjk5LiAgW0dlb2ZmcmV5IFlvdW5nIDxnZW9mZiBhcGFjaGUub3JnPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIElNVCBtaW5vci10eXBlIHdpbGRjYXJkcyAoZS5nLiwgdGV4dC8qKSB0bwogICAgIEV4cGlyZXNCeVR5cGUuICBQUiM3OTkxICBbS2VuIENvYXJdCgogICopIEZpeCBzZWdmYXVsdCBpbiBtb2RfbWVtX2NhY2hlIGNhY2hlX2luc2VydCgpIGR1ZSB0byBjYWNoZSBzaXplCiAgICAgYmVjb21pbmcgbmVnYXRpdmUuICBQUjogMjEyODUsIDIxMjg3CiAgICAgW0JpbGwgU3RvZGRhcmQsIE1hc3NpbW8gVG9ycXVhdGksIEplYW4tSmFjcXVlcyBDbGFyXQoKICAqKSBjb3JlLmM6IElmIGxhcmdlIGZpbGUgc3VwcG9ydCBpcyBlbmFibGVkLCBhbGxvdyBhbnkgZmlsZSB0aGF0IGlzCiAgICAgZ3JlYXRlciB0aGFuIEFQX01BWF9TRU5ERklMRSB0byBiZSBzcGxpdCBpbnRvIG11bHRpcGxlIGJ1Y2tldHMuCiAgICAgVGhpcyBhbGxvd3MgQXBhY2hlIHRvIHNlbmQgZmlsZXMgdGhhdCBhcmUgZ3JlYXRlciB0aGFuIDJnaWcuCiAgICAgT3RoZXJ3aXNlIHdlIHJ1biBpbnRvIDMyLzY0IGJpdCB0eXBlIG1pc21hdGNoZXMgaW4gdGhlIGZpbGUgc2l6ZS4KICAgICBbQnJhZCBOaWNob2xlc10KCiAgKikgcHJveHlfaHR0cCBmaXg6IG1vZF9wcm94eSBoYW5ncyB3aGVuIGJvdGggS2VlcEFsaXZlIGFuZAogICAgIFByb3h5RXJyb3JPdmVycmlkZSBhcmUgZW5hYmxlZCwgYW5kIGEgbm9uLTIwMCByZXNwb25zZSB3aXRob3V0IGEKICAgICBib2R5IGlzIGdlbmVyYXRlZCBieSB0aGUgYmFja2VuZCBzZXJ2ZXIuIChlLmcuOiBhIGNsaWVudCBtYWtlcyBhCiAgICAgcmVxdWVzdCBjb250YWluaW5nIHRoZSAiSWYtTW9kaWZpZWQtU2luY2UiIGFuZCAiSWYtTm9uZS1NYXRjaCIKICAgICBoZWFkZXJzLCB0byB3aGljaCB0aGUgYmFja2VuZCBzZXJ2ZXIgcmVzcG9uZCB3aXRoIHN0YXR1cyAzMDQuKQogICAgIFtHcmFoYW0gV2lzZW1hbiA8Z3dpc2VtYW4gZnNjaW50ZXJuZXQuY29tPiwgUmljaGFyZCBSZWluZXJdCgogICopIG1vZF9kYXY6IFJlamVjdCByZXF1ZXN0cyB3aGljaCBpbmNsdWRlIGFuIHVuZXNjYXBlZCBmcmFnbWVudCBpbiB0aGUKICAgICBSZXF1ZXN0LVVSSS4gIFBSIDIxNzc5LiAgW0FtaXQgQXRoYXZhbGUgPGFtaXRfYXRoYXZhbGUgbHljb3MuY29tPl0KCiAgKikgQnVpbGQgYXJyYXkgb2YgYWxsb3dlZCBtZXRob2RzIHdpdGggcHJvcGVyIGRpbWVuc2lvbnMsIGZpeGluZwogICAgIHBvc3NpYmxlIG1lbW9yeSBjb3JydXB0aW9uLiAgW0plZmYgVHJhd2lja10KCiAgKikgbW9kX3NzbDogRml4IHBvdGVudGlhbCBzZWdmYXVsdCBvbiBsb29rdXAgb2YgU1NMX1NFU1NJT05fSUQuCiAgICAgUFIgMTUwNTcuICBbT3RtYXIgTGVuZGwgPGxlbmRsIG5pYy5hdD5dCgogICopIG1vZF9zc2w6IEZpeCBzdHJlYW1pbmcgb3V0cHV0IGZyb20gYW4gbnBoLSBDR0kgc2NyaXB0LiBQUiAyMTk0NAogICAgIFtKb2UgT3J0b25dCgogICopIG1vZF91c2VydHJhY2sgbm8gbG9uZ2VyIGluc3BlY3RzIHRoZSBDb29raWUyIGhlYWRlciBmb3IKICAgICB0aGUgY29va2llIG5hbWUuIFBSIDExNDc1LiAgW0NocmlzIERhcnJvY2hpIDxjaHJpc2QgcGVhcnNvbmNtZy5jb20+XQoKICAqKSBtb2RfdXNlcnRyYWNrIG5vIGxvbmdlciBvdmVyd3JpdGVzIG90aGVyIGNvb2tpZXMuCiAgICAgUFIgMjYwMDIuICBbU2NvdHQgTW9vcmUgPGFwYWNoZSBub3BkZXNpZ24uY29tPl0KCiAgKikgd29ya2VyIE1QTTogZml4IHN0YWNrIG92ZXJsYXkgYnVnIHRoYXQgY291bGQgY2F1c2UgdGhlIHBhcmVudAogICAgIHByb2Nlc3MgdG8gY3Jhc2guICBbSmVmZiBUcmF3aWNrXQoKICAqKSBXaW4zMjogQWRkIFdpbjMyRGlzYWJsZUFjY2VwdEV4IGRpcmVjdGl2ZS4gVGhpcyBXaW5kb3dzCiAgICAgTlQvMjAwMC9DUCBkaXJlY3RpdmUgaXMgdXNlZnVsIHRvIHdvcmsgYXJvdW5kIGJ1Z3MgaW4gc29tZSAKICAgICB0aGlyZCBwYXJ0eSBsYXllcmVkIHNlcnZpY2UgcHJvdmlkZXJzIGxpa2UgdmlydXMgc2Nhbm5lcnMsIAogICAgIFZQTiBhbmQgZmlyZXdhbGwgcHJvZHVjdHMsIHRoYXQgZG8gbm90IHByb3Blcmx5IGhhbmRsZSAKICAgICBXaW5Tb2NrIDIgQVBJcy4gIFVzZSB0aGlzIGRpcmVjdGl2ZSBpZiB5b3VyIHNlcnZlciBpcyBpc3N1aW5nCiAgICAgQWNjZXB0RXggZmFpbGVkIG1lc3NhZ2VzLgogICAgIFtBbGxhbiBFZHdhcmRzLCBCaWxsIFJvd2UsIEJpbGwgU3RvZGRhcmQsIEplZmYgVHJhd2lja10KCiAgKikgTWFrZSBSRU1PVEVfUE9SVCB2YXJpYWJsZSBhdmFpbGFibGUgaW4gbW9kX3Jld3JpdGUuCiAgICAgUFIgMjU3NzIuICBbQW5kcukgTWFsb10KCiAgKikgRml4IGEgbG9uZyBkZWxheSB3aXRoIENHSSByZXF1ZXN0cyBhbmQga2VlcGFsaXZlIGNvbm5lY3Rpb25zIG9uCiAgICAgQUlYLiAgW0plZmYgVHJhd2lja10KCiAgKikgbW9kX2F1dG9pbmRleDogQWRkICdYSFRNTCcgb3B0aW9uIGluIG9yZGVyIHRvIGFsbG93IHN3aXRjaGluZyBiZXR3ZWVuCiAgICAgSFRNTCAzLjIgYW5kIFhIVE1MIDEuMCBvdXRwdXQuIFBSIDIzNzQ3LiAgW0FuZHLpIE1hbG9dCgogICopIEFkZCBYSFRNTCBEb2N1bWVudCBUeXBlIERlZmluaXRpb25zIHRvIGh0dHBkLmggKG1pbm9yIE1NTiBidW1wKS4KICAgICBbQW5kcukgTWFsb10KCiAgKikgbW9kX3NzbDogQWR2ZXJ0aXNlIFNTTCBsaWJyYXJ5IHZlcnNpb24gYXMgZGV0ZXJtaW5lZCBhdCBydW4tdGltZSByYXRoZXIKICAgICB0aGFuIGF0IGNvbXBpbGUtdGltZS4gIFBSIDIzOTU2LiAgW0VyaWMgU2VpZGVsIDxzZWlkZWwgYXBwbGUuY29tPl0KCiAgKikgbW9kX3NzbDogRml4IHNlZ2ZhdWx0IG9uIGEgbm9uLVNTTCByZXF1ZXN0IGlmIHRoZSAnYycgbG9nCiAgICAgZm9ybWF0IGNvZGUgaXMgdXNlZC4gIFBSIDIyNzQxLiAgW0dhcnkgRS4gTWlsbGVyIDxnZW0gcmVsbGltLmNvbT5dCgogICopIEZpeCBidWlsZCB3aXRoIHBhcmFsbGVsIG1ha2UuICBQUiAyNDY0My4gIFtKb2UgT3J0b25dCgogICopIG1vZF9yZXdyaXRlOiBJbiBleHRlcm5hbCByZXdyaXRlIG1hcHMgbG9va3VwIGtleXMgY29udGFpbmluZwogICAgIGEgbmV3bGluZSBub3cgY2F1c2UgYSBsb29rdXAgZmFpbHVyZS4gUFIgMTQ0NTMuCiAgICAgW0NlZHJpYyBHYXZhZ2UgPGNlZHJpYy5nYXZhZ2UgdW5peHRlY2guYmU+LCBBbmRy6SBNYWxvXQoKICAqKSBCYWNrcG9ydCBtYWpvciBvdmVyaGF1bCBvZiBtb2RfaW5jbHVkZSdzIGZpbHRlciBwYXJzZXIgZnJvbSAyLjEuCiAgICAgVGhlIG5ldyBwYXJzZXIgY29kZSBpcyBleHBlY3RlZCB0byBiZSBtb3JlIHJvYnVzdCBhbmQgc2hvdWxkCiAgICAgY2F0Y2ggYWxsIG9mIHRoZSBlZGdlIGNhc2VzIHRoYXQgd2VyZSBub3QgaGFuZGxlZCBieSB0aGUgcHJldmlvdXMgb25lLgogICAgIFRoZSAyLjEgZXh0ZXJuYWwgQVBJIGNoYW5nZXMgd2VyZSBoaWRkZW4gYnkgYSB3cmFwcGVyIHdoaWNoIGlzCiAgICAgZXhwZWN0ZWQgdG8ga2VlcCB0aGUgQVBJIGJhY2t3YXJkcyBjb21wYXRpYmxlLiAgW0FuZHLpIE1hbG9dCgogICopIEFkZCBhIGhvb2sgKGluc2VydF9lcnJvcl9maWx0ZXIpIHRvIGFsbG93IGZpbHRlcnMgdG8gcmUtaW5zZXJ0CiAgICAgdGhlbXNlbHZlcyBkdXJpbmcgcHJvY2Vzc2luZyBvZiBlcnJvciByZXNwb25zZXMuIEVuYWJsZSBtb2RfZXhwaXJlcwogICAgIHRvIHVzZSB0aGUgbmV3IGhvb2sgdG8gaW5jbHVkZSBFeHBpcmVzIGhlYWRlcnMgaW4gdmFsaWQgZXJyb3IKICAgICByZXNwb25zZXMuIFRoaXMgYWRkcmVzc2VzIGFuIFJGQyB2aW9sYXRpb24uIEl0IGZpeGVzIFBScyAxOTc5NCwKICAgICAyNDg4NCwgYW5kIDI1MTIzLiBbUGF1bCBKLiBSZWRlcl0KCiAgKikgQWRkIFBvbGlzaCB0cmFuc2xhdGlvbiBvZiBlcnJvciBtZXNzYWdlcy4gIFBSIDI1MTAxLgogICAgIFtUb21hc3ogS2VwY3p5bnNraSA8dG9tZWsgam90MjMub3JnPl0KCiAgKikgQWRkIEFQX01QTVFfTVBNX1NUQVRFIGZ1bmN0aW9uIGNvZGUgZm9yIGFwX21wbV9xdWVyeS4gKE5vdCB5ZXQKICAgICBzdXBwb3J0ZWQgZm9yIEJlT1Mgb3IgT1MvMiBNUE1zLikgIFtKZWZmIFRyYXdpY2ssIEJyYWQgTmljaG9sZXMsCiAgICAgQmlsbCBTdG9kZGFyZF0KCiAgKikgQWRkIG1vZF9zdGF0dXMgaG9vayB0byBhbGxvdyBtb2R1bGVzIHRvIGFkZCB0byB0aGUgbW9kX3N0YXR1cwogICAgIHJlcG9ydC4gIFtKb2UgT3J0b25dCgogICopIEZpeCBodGRibSB0byBnZW5lcmF0ZSBjb21tZW50IGZpZWxkcyBpbiBEQk0gZmlsZXMgY29ycmVjdGx5LgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgbW9kX2RhdjogVXNlIGJ1Y2tldCBicmlnYWRlcyB3aGVuIHJlYWRpbmcgUFVUIGRhdGEuIFRoaXMgYXZvaWRzCiAgICAgcHJvYmxlbXMgaWYgdGhlIGRhdGEgc3RyZWFtIGlzIG1vZGlmaWVkIGJ5IGFuIGlucHV0IGZpbHRlci4gUFIgMjIxMDQuCiAgICAgW1RpbSBSb2JiaW5zIDx0aW0gcm9iYmlucy5kcm9wYmVhci5pZC5hdT4sIEFuZHLpIE1hbG9dCgogICopIEZpeCBSZXdyaXRlQmFzZSBkaXJlY3RpdmUgdG8gbm90IGFkZCBkb3VibGUgc2xhc2hlcy4gIFtBbmRy6SBNYWxvXQoKICAqKSBJbXByb3ZlICdjb25maWd1cmUgLS1oZWxwJyBvdXRwdXQgZm9yIHNvbWUgbW9kdWxlcy4gIFtBc3RyaWQgS2XfbGVyXQoKICAqKSBDb3JyZWN0IFVzZUNhbm9uaWNhbE5hbWUgT2ZmIHRvIHByb3Blcmx5IGNoZWNrIGluY29taW5nIHBvcnQgbnVtYmVyLgogICAgIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBGaXggc2xvdyBncmFjZWZ1bCByZXN0YXJ0cyB3aXRoIHByZWZvcmsgTVBNLiAgW0pvZSBPcnRvbl0KCiAgKikgRml4IGEgcHJvYmxlbSB3aXRoIG5hbWVzcGFjZSBtYXBwaW5ncyBiZWluZyBkcm9wcGVkIGluIG1vZF9kYXZfZnM7CiAgICAgaWYgYW55IHByb3BlcnR5IHZhbHVlcyB3ZXJlIHNldCB3aGljaCBkZWZpbmVkIG5hbWVzcGFjZXMgdGhlc2UKICAgICBjYW1lIG91dCBtYW5nbGVkIGluIHRoZSBQUk9QRklORCByZXNwb25zZS4gIFBSIDExNjM3LgogICAgIFtBbWl0IEF0aGF2YWxlIDxhbWl0X2F0aGF2YWxlIHBlcnNpc3RlbnQuY28uaW4+XQoKICAqKSBtb2RfZGF2OiBSZXR1cm4gYSBXV1ctYXV0aCBoZWFkZXIgZm9yIE1PVkUvQ09QWSByZXF1ZXN0cyB3aGVyZQogICAgIHRoZSBkZXN0aW5hdGlvbiByZXNvdXJjZSBnaXZlcyBhIDQwMS4gIFBSIDE1NTcxLiAgW0pvZSBPcnRvbl0KCiAgKikgU0VDVVJJVFk6IENWRS0yMDAzLTAwMjAgKGN2ZS5taXRyZS5vcmcpCiAgICAgRXNjYXBlIGFyYml0cmFyeSBkYXRhIGJlZm9yZSB3cml0aW5nIGludG8gdGhlIGVycm9ybG9nLiBVbmVzY2FwZWQKICAgICBlcnJvcmxvZ3MgYXJlIHN0aWxsIHBvc3NpYmxlIHVzaW5nIHRoZSBjb21waWxlIHRpbWUgc3dpdGNoCiAgICAgIi1EQVBfVU5TQUZFX0VSUk9SX0xPR19VTkVTQ0FQRUQiLiAgW0dlb2ZmcmV5IFlvdW5nLCBBbmRy6SBNYWxvXQoKICAqKSBtb2RfYXV0b2luZGV4IC8gY29yZTogRG9uJ3QgZmFpbCB0byBzaG93IGZpbGVuYW1lcyBjb250YWluaW5nCiAgICAgc3BlY2lhbCBjaGFyYWN0ZXJzIGxpa2UgJyUnLiBQUiAxMzU5OC4gIFtBbmRy6SBNYWxvXQogCiAgKikgbW9kX3N0YXR1czogUmVwb3J0IHRvdGFsIENQVSB0aW1lIGFjY3VyYXRlbHkgd2hlbiB1c2luZyBhIHRocmVhZGVkCiAgICAgTVBNLiAgUFIgMjM3OTUuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggbWVtb3J5IGxlYWsgaW4gaGFuZGxpbmcgb2YgcmVxdWVzdCBib2RpZXMgZHVyaW5nIHJldmVyc2UKICAgICBwcm94eSBvcGVyYXRpb25zLiAgUFIgMjQ5OTEuIFtMYXJyeSBUb3BwaSA8bGFycnkudG9wcGkgY2l0cml4LmNvbT5dCgogICopIFdpbjMyIE1QTTogSW1wbGVtZW50IE1heE1lbUZyZWUgdG8gZW5hYmxlIHNldHRpbmcgYW4gdXBwZXIKICAgICBsaW1pdCBvbiB0aGUgYW1vdW50IG9mIHN0b3JhZ2UgdXNlZCBieSB0aGUgYnVja2V0IGJyaWdhZGVzCiAgICAgaW4gZWFjaCBzZXJ2ZXIgdGhyZWFkLiBbQmlsbCBTdG9kZGFyZF0KCiAgKikgTW9kaWZpZWQgdGhlIGNhY2hlIGNvZGUgdG8gYmUgaGVhZGVyLWxvY2F0aW9uIGFnbm9zdGljLiBBbHNvCiAgICAgZml4ZWQgYSBudW1iZXIgb2Ygb3RoZXIgY2FjaGUgY29kZSBidWdzIHJlbGF0ZWQgdG8gUFIgMTU4NTIuCiAgICAgSW5jbHVkZXMgYSBwYXRjaCBzdWJtaXR0ZWQgYnkgU3VzaG1hIFJhaSA8cnN1c2htYSBub3ZlbGwuY29tPi4KICAgICBUaGlzIGZpeGVzIG1vZF9tZW1fY2FjaGUgYnV0IG5vdCBtb2RfZGlza19jYWNoZSB5ZXQgc28gSSdtIG5vdAogICAgIGNsb3NpbmcgdGhlIFBSIHNpbmNlIHRoYXQgaXMgd2hhdCB0aGV5IGFyZSB1c2luZy4gW1BhdWwgSi4gUmVkZXJdCgogICopIGNvbXBsYWluIHZpYSBlcnJvcl9sb2cgd2hlbiBtb2RfaW5jbHVkZSdzIElOQ0xVREVTIGZpbHRlciBpcwogICAgIGVuYWJsZWQsIGJ1dCB0aGUgcmVsZXZhbnQgT3B0aW9ucyBmbGFnIGFsbG93aW5nIHRoZSBmaWx0ZXIgdG8gcnVuCiAgICAgZm9yIHRoZSBzcGVjaWZpYyByZXNvdXJjZSB3YXNuJ3Qgc2V0LCBzbyB0aGF0IHRoZSBmaWx0ZXIgd29uJ3QKICAgICBzaWxlbnRseSBnZXQgc2tpcHBlZC4gbmV4dCByZW1vdmUgaXRzZWxmLCBzbyB0aGUgd2FybmluZyB3aWxsIGJlCiAgICAgbG9nZ2VkIG9ubHkgb25jZSBbU3RhcyBCZWttYW4sIEplZmYgVHJhd2ljaywgQmlsbCBSb3dlXQoKICAqKSBtb2RfaW5mbzogSFRNTCBlc2NhcGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBzbyBpdCBkaXNwbGF5cyAKICAgICBjb3JyZWN0bHkuIFBSIDI0MjMyLiBbVGhvbSBNYXldCiAgICAgCiAgKikgUmVzdG9yZSB0aGUgYWJpbGl0eSB0byBhZGQgYSBkZXNjcmlwdGlvbiBmb3IgZGlyZWN0b3JpZXMgdGhhdAogICAgIGRvbid0IGNvbnRhaW4gYW4gaW5kZXggZmlsZS4gIChCcm9rZW4gaW4gMi4wLjQ4KSBbQW5kcukgTWFsb10KCiAgKikgRml4IGEgcHJvYmxlbSB3aXRoIHRoZSBkaXNwbGF5IG9mIGVtcHR5IHZhcmlhYmxlcyAoIlNldEVudiBmb28iKSBpbgogICAgIG1vZF9pbmNsdWRlLiAgUFIgMjQ3MzQgIFtNYXJrdXMgSnVsZW4gPG1qIHplcm1hdHQubmV0Pl0KCiAgKikgbW9kX2xvZ19jb25maWc6IExvZyB0aGUgbWludXRlcyBjb21wb25lbnQgb2YgdGhlIHRpbWV6b25lIGNvcnJlY3RseS4KICAgICBQUiAyMzY0Mi4gIFtIb25nLUd1bm4gQ2hldyA8aGdidWcgZ3VubmV0Lm9yZz5dCgogICopIG1vZF9wcm94eTogRml4IGNhc2VzIHdoZXJlIGFuIGludmFsaWQgc3RhdHVzLWxpbmUgY291bGQgYmUgc2VudCAKICAgICB0byB0aGUgY2xpZW50LiAgUFIgMjM5OTguICBbSm9lIE9ydG9uXQoKICAqKSBtb2Rfc3NsOiBGaXggc2VnZmF1bHRzIGF0IHN0YXJ0dXAgaWYgb3RoZXIgbW9kdWxlcyB3aGljaCB1c2UgT3BlblNTTAogICAgIGFyZSBhbHNvIGxvYWRlZC4gIFtKb2UgT3J0b25dCgogICopIG1vZF9zc2w6IFVzZSBodW1hbi1yZWFkYWJsZSBPcGVuU1NMIGVycm9yIHN0cmluZ3MgaW4gbG9nczsgdXNlCiAgICAgdGhyZWFkLXNhZmUgaW50ZXJmYWNlIGZvciByZXRyaWV2aW5nIGVycm9yIHN0cmluZ3MuICBbSm9lIE9ydG9uXQoKICAqKSBtb2RfZXhwaXJlczogSW5pdGlhbGl6ZSBFeHBpcmVzRGVmYXVsdCB0byBOVUxMIGluc3RlYWQgb2YgIiIgdG8KICAgICBhdm9pZCByZXBvcnRpbmcgYW4gSW50ZXJuYWwgU2VydmVyIGVycm9yIGlmIGl0IGlzIHVzZWQgd2l0aG91dAogICAgIGhhdmluZyBiZWVuIHNldCBpbiB0aGUgaHR0cGQuY29uZiBmaWxlLiBQUjogMjM3NDgsIDI0NDU5CiAgICAgW0FuZHJlIE1hbG8sIExpYW0gUXVpbm4gIDxsaWFtIGh0bWxoZWxwLmNvbT5dCgogICopIG1vZF9hdXRvaW5kZXg6IERvbid0IG9taXQgdGhlIDx0cj4gc3RhcnQgdGFnIGlmIHRoZSBTdXBwcmVzc0ljb24KICAgICBvcHRpb24gaXMgc2V0LiBQUiAyMTY2OC4gIFtKZXNzZSBUaWUtVGVuLVF1ZWUgPGhpZ2hvcyBoaWdob3MuY29tPl0KCiAgKikgbW9kX2luY2x1ZGUgbm8gbG9uZ2VyIGFsbG93cyBhbiBFVGFnIGhlYWRlciBvbiAzMDQgcmVzcG9uc2VzLgogICAgIFBSIDE5MzU1LiBbR2VvZmZyZXkgWW91bmcgPGdlb2ZmIGFwYWNoZS5vcmc+LCBBbmRy6SBNYWxvXQoKICAqKSBFQkNESUM6IENvbnZlcnQgaGVhZGVyIGZpZWxkcyB0byBBU0NJSSBiZWZvcmUgc2VuZGluZyAoYnJva2VuCiAgICAgc2luY2UgMi4wLjQ0KS4gW01hcnRpbiBLcmFlbWVyXQoKICAqKSBGaXggdGhlIGluYWJpbGl0eSB0byBsb2cgZXJyb3JzIGxpa2UgZXhlYyBmYWlsdXJlIGluCiAgICAgbW9kX2V4dF9maWx0ZXIvbW9kX2NnaSBzY3JpcHQgY2hpbGRyZW4uICBUaGlzIHdhcyBicm9rZW4gYWZ0ZXIgCiAgICAgc3VjaCBjaGlsZHJlbiBzdG9wcGVkIGluaGVyaXRpbmcgdGhlIGVycm9yIGxvZyBoYW5kbGUuICAKICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggbW9kX2luZm8gdG8gdXNlIHRoZSByZWFsIGNvbmZpZyBmaWxlIG5hbWUsIG5vdCB0aGUgZGVmYXVsdAogICAgIGNvbmZpZyBmaWxlIG5hbWUuICBbQXJ5ZWggS2F0eiA8YXJ5ZWggc2VjdXJlZC1zZXJ2aWNlcy5jb20+XQoKICAqKSBTZXQgdGhlIHNjb3JlYm9hcmQgc3RhdGUgdG8gaW5kaWNhdGUgbG9nZ2luZyBwcmlvciB0byBydW5uaW5nIAogICAgIGxvZ2dpbmcgaG9va3Mgc28gdGhhdCBzZXJ2ZXItc3RhdHVzIHdpbGwgc2hvdyAnTCcgZm9yIGh1bmcgbG9nZ2VycwogICAgIGluc3RlYWQgb2YgJ1cnLiAgW0plZmYgVHJhd2lja10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjQ4CgogICopIFNFQ1VSSVRZOiBDQU4tMjAwMy0wNzg5IChjdmUubWl0cmUub3JnKQogICAgIG1vZF9jZ2lkOiBSZXNvbHZlIHNvbWUgbWlzaGFuZGxpbmcgb2YgdGhlIEFGX1VOSVggc29ja2V0IHVzZWQgdG8KICAgICBjb21tdW5pY2F0ZSB3aXRoIHRoZSBjZ2lkIGRhZW1vbiBhbmQgdGhlIENHSSBzY3JpcHQuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgU0VDVVJJVFk6IENBTi0yMDAzLTA1NDIgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4IGJ1ZmZlciBvdmVyZmxvd3MgaW4gbW9kX2FsaWFzIGFuZCBtb2RfcmV3cml0ZSB3aGljaCBvY2N1cnJlZAogICAgIGlmIG9uZSBjb25maWd1cmVkIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGggbW9yZSB0aGFuIDkgY2FwdHVyZXMuCiAgICAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9pbmNsdWRlOiBmaXggc2VnZmF1bHQgd2hpY2ggb2NjdXJlZCBpZiB0aGUgZmlsZW5hbWUgd2FzIG5vdAogICAgIHNldCwgZm9yIGV4YW1wbGUsIHdoZW4gcHJvY2Vzc2luZyBzb21lIGVycm9yIGNvbmRpdGlvbnMuCiAgICAgUFIgMjM4MzYuICBbQnJpYW4gQWtpbnMgPGJha2lucyB3ZWIudHVybmVyLmNvbT4sIEFuZHLpIE1hbG9dCgogICopIGZpeCB0aGUgY29uZmlnIHBhcnNlciB0byBzdXBwb3J0IDxGb28+Li48L0Zvbz4gY29udGFpbmVycyAobm8KICAgICBhcmd1bWVudHMgaW4gdGhlIG9wZW5pbmcgdGFnKSBzdXBwb3J0ZWQgYnkgaHR0cGQgMS4zLiBXaXRob3V0CiAgICAgdGhpcyBjaGFuZ2UgbW9kX3BlcmwgMi4wJ3MgPFBlcmw+IHNlY3Rpb25zIGFyZSBicm9rZW4uCiAgICAgWyJQaGlsaXBwZSBNLiBDaGlhc3NvbiIgPGdvemVyIGNwYW4ub3JnPl0KCiAgKikgbW9kX2NnaWQ6IGZpeCBhIGhhc2ggdGFibGUgY29ycnVwdGlvbiBwcm9ibGVtIHdoaWNoIGNvdWxkCiAgICAgcmVzdWx0IGluIHRoZSB3cm9uZyBzY3JpcHQgYmVpbmcgY2xlYW5lZCB1cCBhdCB0aGUgZW5kIG9mIGEKICAgICByZXF1ZXN0LiAgW0plZmYgVHJhd2lja10KCiAgKikgVXBkYXRlIGh0dHBkLSouY29uZiB0byBiZSBjbGVhcmVyIGluIGRlc2NyaWJpbmcgdGhlIGNvbm5lY3Rpb24KICAgICBiZXR3ZWVuIEFkZFR5cGUgYW5kIEFkZEVuY29kaW5nIGZvciBkZWZpbmluZyB0aGUgbWVhbmluZyBvZgogICAgIGNvbXByZXNzZWQgZmlsZSBleHRlbnNpb25zLiBbUm95IEZpZWxkaW5nXQoKICAqKSBtb2RfcmV3cml0ZTogRG9uJ3QgZGllIHNpbGVudGx5IHdoZW4gZmFpbGluZyB0byBvcGVuIFJld3JpdGVMb2dzLgogICAgIFBSIDIzNDE2LiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9yZXdyaXRlOiBGaXggbW9kX3Jld3JpdGUncyBzdXBwb3J0IG9mIHRoZSBbUF0gb3B0aW9uIHRvIHNlbmQKICAgICByZXdyaXR0ZW4gcmVxdWVzdCB1c2luZyAicHJveHk6Ii4gVGhlIGNvZGUgd2FzIGFkZGluZyBtdWx0aXBsZSAicHJveHk6IgogICAgIGZpZWxkcyBpbiB0aGUgcmV3cml0dGVuIFVSSS4gUFI6IDEzOTQ2LgogICAgIFtFaWRlciBPbGl2ZWlyYSA8ZWlkZXIgYm9sLmNvbS5icj5dCgogICopIGNhY2hlX3V0aWw6IEZpeCBhcF9jaGVja19jYWNoZV9mcmVzaG5lc3MgdG8gY2hlY2sgbWF4X2FnZSwgc21heF9hZ2UsIGFuZAogICAgIGV4cGlyZXMgYXMgZGlyZWN0ZWQgaW4gUkZDIDI2MTYuIFtUaG9tYXMgQ2FzdGVsbGUgPHRjYXN0ZWxsZSBnZW5lcmFsaS5mcj5dCgogICopIEVuc3VyZSB0aGF0IHNzbC1zdGQuY29uZiBpcyBnZW5lcmF0ZWQgYXQgY29uZmlndXJlIHRpbWUsIGFuZCBzd2l0Y2gKICAgICB0byB1c2luZyB0aGUgZXhwYW5kZWQgY29uZmlnIHZhcmlhYmxlcyB0byB3b3JrIHRoZSBzYW1lIGFzCiAgICAgaHR0cGQtc3RkLmNvbmYgUFI6IDE5NjExCiAgICAgW1Rob20gTWF5XQoKICAqKSBtb2Rfc3NsOiBGaXggc2VnZmF1bHRzIGFmdGVyIHJlbmVnb3RpYXRpb24gZmFpbHVyZS4gUFIgMjEzNzAKICAgICBbSGFydG11dCBLZWlsIDxIYXJ0bXV0LktlaWwgYWRub3Z1bS5jaD5dCgogICopIG1vZF9hdXRvaW5kZXg6IElmIGEgZGlyZWN0b3J5IGNvbnRhaW5zIGEgZmlsZSBsaXN0ZWQgaW4gdGhlCiAgICAgRGlyZWN0b3J5SW5kZXggZGlyZWN0aXZlLCB0aGUgZm9sZGVyIGljb24gaXMgbm8gbG9uZ2VyIHJlcGxhY2VkCiAgICAgYnkgdGhlIGljb24gb2YgdGhhdCBmaWxlLiBQUiA5NTg3LgogICAgIFtEYXZpZCBTaGFuZSBIb2xkZW4gPGRwZWplc2ggeWFob28uY29tPl0KCiAgKikgRml4ZWQgbW9kX3VzZXJ0cmFjayB0byBub3QgZ2V0IGZhbHNlIHBvc2l0aXZlIG1hdGNoZXMgb24gdGhlCiAgICAgdXNlci10cmFja2luZyBjb29raWUncyBuYW1lLiAgUFIgMTY2NjEuCiAgICAgW01hbm5pIFdvb2QgPG1hbm5pd29vZCBwbGFuZXQtc2F2ZS5jb20+XQoKICAqKSBtb2RfY2FjaGU6IEZpeCB0aGUgY2FjaGUgY29kZSBzbyB0aGF0IHJlc3BvbnNlcyBjYW4gYmUgY2FjaGVkCiAgICAgaWYgdGhleSBoYXZlIGFuIEV4cGlyZXMgaGVhZGVyIGJ1dCBubyBFdGFnIG9yIExhc3QtTW9kaWZpZWQKICAgICBoZWFkZXJzLiBQUiAyMzEzMC4KICAgICBbPGJqb3JuIGV4b3dlYi5uZXQ+XQoKICAqKSBtb2RfbG9nX2NvbmZpZzogRml4ICViIGxvZyBmb3JtYXQgdG8gd3JpdGUgcmVhbGx5ICItIiB3aGVuIDAgYnl0ZXMKICAgICB3ZXJlIHNlbnQgKGUuZy4gd2l0aCAzMDQgb3IgMjA0IHJlc3BvbnNlIGNvZGVzKS4gIFtBc3RyaWQgS2XfbGVyXQoKICAqKSBNb2RpZnkgYXBfZ2V0X2NsaWVudF9ibG9jaygpIHRvIG5vdGUgaWYgaXQgaGFzIHNlZW4gRU9TLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRml4IGEgYnVnLCB3aGVyZSBtb2RfZGVmbGF0ZSBzb21ldGltZXMgdW5jb25kaXRpb25hbGx5IGNvbXByZXNzZWQgdGhlCiAgICAgY29udGVudCBpZiB0aGUgQWNjZXB0LUVuY29kaW5nIGhlYWRlciBjb250YWluZWQgb25seSBvdGhlciB0b2tlbnMgdGhhbgogICAgICJnemlwIiAoc3VjaCBhcyAiZGVmbGF0ZSIpLiBQUiAyMTUyMy4gIFtKb2UgT3J0b24sIEFuZHLpIE1hbG9dCgogICopIEF2b2lkIGFuIGluZmluaXRlIHJlY3Vyc2lvbiwgd2hpY2ggb2NjdXJlZCBpZiB0aGUgbmFtZSBvZiBhbiBpbmNsdWRlZAogICAgIGNvbmZpZyBmaWxlIG9yIGRpcmVjdG9yeSBjb250YWluZWQgYSB3aWxkY2FyZCBjaGFyYWN0ZXIuIFBSIDIyMTk0LgogICAgIFtBbmRy6SBNYWxvXQoKICAqKSBtb2Rfc3NsOiBGaXggYSBwcm9ibGVtIHNldHRpbmcgdmFyaWFibGVzIHRoYXQgcmVwcmVzZW50IHRoZQogICAgIGNsaWVudCBjZXJ0aWZpY2F0ZSBjaGFpbi4gIFBSIDIxMzcxICBbSmVmZiBUcmF3aWNrXQoKICAqKSBVbml4OiBIYW5kbGUgcGVybWlzc2lvbnMgc2V0dGluZ3MgZm9yIGZsb2NrLWJhc2VkIG11dGV4ZXMgaW4gCiAgICAgdW5peGRfc2V0X2dsb2JhbHxwcm9jX211dGV4X3Blcm1zKCkuICBBbGxvdyB0aGUgZnVuY3Rpb25zIHRvIGJlCiAgICAgY2FsbGVkIGZvciBhbnkgdHlwZSBvZiBtdXRleC4gIFBSIDIwMzEyICBbSmVmZiBUcmF3aWNrXQoKICAqKSBhYjogV29yayBvdmVyIG5vbi1sb29wYmFjayBvbiBVbml4IGFnYWluLiBQUiAyMTQ5NS4gW0plZmYgVHJhd2lja10KCiAgKikgRml4IGEgbWlzbGVhZGluZyBtZXNzYWdlIGZyb20gdGhlIHNvbWUgb2YgdGhlIHRocmVhZGVkIE1QTXMgd2hlbiAKICAgICBNYXhDbGllbnRzIGhhcyB0byBiZSBsb3dlcmVkIGR1ZSB0byB0aGUgc2V0dGluZyBvZiBTZXJ2ZXJMaW1pdC4gIAogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIExvd2VyIHRoZSBzZXZlcml0eSBvZiB0aGUgImxpc3RlbmVyIHRocmVhZCBkaWRuJ3QgZXhpdCIgbWVzc2FnZQogICAgIHRvIGRlYnVnLCBhcyBpdCBpcyBvZiBpbnRlcmVzdCBvbmx5IHRvIGRldmVsb3BlcnMuICBQUiA5MDExCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgTVBNczogVGhlIGJ1Y2tldCBicmlnYWRlcyBzdWJzeXN0ZW0gbm93IGhvbm9ycyB0aGUgTWF4TWVtRnJlZSBzZXR0aW5nLgogICAgIFtDbGlmZiBXb29sbGV5LCBKZWFuLUphY3F1ZXMgQ2xhcl0KCiAgKikgSW5zdGFsbCBjb25maWcubmljZSBpbnRvIHRoZSBidWlsZC8gZGlyZWN0b3J5IHRvIG1ha2UKICAgICBtaW5vciB2ZXJzaW9uIHVwZ3JhZGVzIGVhc2llci4gW0pvc2h1YSBTbGl2ZV0KCiAgKikgRml4IG1vZF9kZWZsYXRlIHNvIHRoYXQgaXQgZG9lcyBub3QgY2FsbCBkZWZsYXRlKCkgd2l0aG91dCBjaGVja2luZwogICAgIGZpcnN0IHdoZXRoZXIgaXQgaGFzIHNvbWV0aGluZyB0byBkZWZsYXRlLiAoQ3VycmVudGx5IHRoaXMgY2F1c2VzCiAgICAgZGVmbGF0ZSB0byBnZW5lcmF0ZSBhIGZhdGFsIGVycm9yIGFjY29yZGluZyB0byB0aGUgemxpYiBzcGVjLikKICAgICBQUiAyMjI1OS4gW1N0YXMgQmVrbWFuXQoKICAqKSBtb2Rfc3NsOiBGaXggRmFrZUJhc2ljQXV0aCBmb3Igc3VicmVxdWVzdC4gIExvZyBhbiBlcnJvciB3aGVuIGFuCiAgICAgaWRlbnRpdHkgc3Bvb2YgaXMgZW5jb3VudGVyZWQuCiAgICAgW1NhbmRlciBTdHJpa2VyXQoKICAqKSBtb2RfcmV3cml0ZTogSWdub3JlIFJld3JpdGVSdWxlcyBpbiAuaHRhY2Nlc3MgZmlsZXMgaWYgdGhlIGRpcmVjdG9yeQogICAgIGNvbnRhaW5pbmcgdGhlIC5odGFjY2VzcyBmaWxlIGlzIHJlcXVlc3RlZCB3aXRob3V0IGEgdHJhaWxpbmcgc2xhc2guCiAgICAgUFIgMjAxOTUuICBbQW5kcukgTWFsb10KCiAgKikgYWI6IE92ZXJsb25nIGNyZWRlbnRpYWxzIGdpdmVuIHZpYSBjb21tYW5kIGxpbmUgbm8gbG9uZ2VyIGNsb2JiZXIKICAgICB0aGUgYnVmZmVyLiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9kZWZsYXRlOiBEb24ndCBhdHRlbXB0IHRvIGhvbGQgYWxsIG9mIHRoZSByZXNwb25zZSB1bnRpbCB3ZSdyZQogICAgIGRvbmUuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEFzc3VyZSB0aGF0IHdlIGJsb2NrIHByb3Blcmx5IHdoZW4gcmVhZGluZyBpbnB1dCBib2RpZXMgd2l0aCBTU0wuCiAgICAgUFIgMTkyNDIuICBbRGF2aWQgRGVhdmVzIDxEYXZpZC5EZWF2ZXMgZGQuaWQuYXU+LCBXaWxsaWFtIFJvd2VdCgogICopIFVwZGF0ZSBtaW1lLnR5cGVzIHRvIGluY2x1ZGUgbGF0ZXN0IElBTkEgYW5kIFczQyB0eXBlcy4gIFtSb3kgRmllbGRpbmddCgogICopIG1vZF9leHRfZmlsdGVyOiBTZXQgYWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHVzZSBieQogICAgIHRoZSBleHRlcm5hbCBmaWx0ZXIuICBQUiAyMDk0NC4gIFtBbmRyZXcgSG8sIEplZmYgVHJhd2lja10KCiAgKikgRml4IGJ1aWxkY29uZiBlcnJvcnMgd2hlbiBsaWJ0b29sIHZlcnNpb24gY2hhbmdlcy4gIFtKZWZmIFRyYXdpY2tdCgogICopIFJlbWVtYmVyIGFuIGF1dGhlbnRpY2F0ZWQgdXNlciBkdXJpbmcgaW50ZXJuYWwgcmVkaXJlY3RzIGlmIHRoZQogICAgIHJlZGlyZWN0aW9uIHRhcmdldCBpcyBub3QgYWNjZXNzIHByb3RlY3RlZCBhbmQgcGFzcyBpdAogICAgIHRvIHNjcmlwdHMgdXNpbmcgdGhlIFJFRElSRUNUX1JFTU9URV9VU0VSIGVudmlyb25tZW50IHZhcmlhYmxlLgogICAgIFBSIDEwNjc4LCAxMTYwMi4gIFtBbmRy6SBNYWxvXQoKICAqKSBtb2RfaW5jbHVkZTogRml4IGEgdHJpbyBvZiBidWdzIHRoYXQgd291bGQgY2F1c2UgdmFyaW91cyB1bnVzdWFsCiAgICAgc2VxdWVuY2VzIG9mIHBhcnNlZCBieXRlcyB0byBvbWl0IHBvcnRpb25zIG9mIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgIFBSIDIxMDk1LiBbUm9uIFBhcmsgPHJvbmFsZC5wYXJrIGNuZXQuY29tPiwgQW5kcukgTWFsbywgQ2xpZmYgV29vbGxleV0KCiAgKikgVXBkYXRlIHRoZSBoZWFkZXIgdG9rZW4gcGFyc2luZyBjb2RlIHRvIGFsbG93IExXUyBiZXR3ZWVuIHRoZQogICAgIHRva2VuIHdvcmQgYW5kIHRoZSAnOicgc2VwZXJhdG9yLiAgW1BSIDE2NTIwXQogICAgIFtLcmlzIFZlcmJlZWNrIDxrcmlzLnZlcmJlZWNrIGFkdmFsdmFzLmJlPiwgTmljZWwgS00gPG1uaWNlbCB5YWhvby5jb20+XQoKICAqKSBFbGltaW5hdGUgY3JlYXRpb24gb2YgYSB0ZW1wb3JhcnkgdGFibGUgaW4gYXBfZ2V0X21pbWVfaGVhZGVyc19jb3JlKCkKICAgICBbSm9lIFNjaGFlZmVyIDxqb2UrZ21hbmUgc3Vuc3RhcnN5cy5jb20+XQoKICAqKSBBZGRlZCBGcmVlQlNEIGRpcmVjdG9yeSBsYXlvdXQuIFBSIDIxMTAwLgogICAgIFtTYW5kZXIgSG9sdGhhdXMgPGluZm8gb3JhbmdleGwuY29tPiwgQW5kcukgTWFsb10KCiAgKikgRml4IE5VTEwtcG9pbnRlciBpc3N1ZSBpbiBhYiB3aGVuIHBhcnNpbmcgYW4gaW5jb21wbGV0ZSBvciBub24tSFRUUAogICAgIHJlc3BvbnNlLiBQUiAyMTA4NS4gW0dsZW5uIE5pZWxzZW4gPGdsZW5uIGFwYWNoZS5vcmc+LCBBbmRy6SBNYWxvXQoKICAqKSBtb2RfcmV3cml0ZTogUGVyZm9ybSBjaGlsZCBpbml0aWFsaXphdGlvbiBvbiB0aGUgcmV3cml0ZSBsb2cgbG9jay4KICAgICBUaGlzIGZpeGVzIGEgbG9nIGNvcnJ1cHRpb24gaXNzdWUgd2hlbiBmbG9jay1iYXNlZCBzZXJpYWxpemF0aW9uCiAgICAgaXMgdXNlZCAoZS5nLiwgRnJlZUJTRCkuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBEb24ndCByZXNwZWN0IHRoZSBTZXJ2ZXIgaGVhZGVyIGZpZWxkIGFzIHNldCBieSBtb2R1bGVzIGFuZCBDR0lzLgogICAgIEFzIHdpdGggMS4zLCBmb3IgcHJveHkgcmVxdWVzdHMgYW55IHN1Y2ggZmllbGQgaXMgZnJvbSB0aGUgb3JpZ2luCiAgICAgc2VydmVyOyBvdGhlcndpc2UgaXQgd2lsbCBoYXZlIG91ciBzZXJ2ZXIgaW5mbyBhcyBjb250cm9sbGVkIGJ5CiAgICAgdGhlIFNlcnZlclRva2VucyBkaXJlY3RpdmUuICBbSmVmZiBUcmF3aWNrXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuNDcKCiAgKikgU0VDVVJJVFk6IENBTi0yMDAzLTAxOTIgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4ZWQgYSBidWcgd2hlcmVieSBjZXJ0YWluIHNlcXVlbmNlcyBvZiBwZXItZGlyZWN0b3J5CiAgICAgcmVuZWdvdGlhdGlvbnMgYW5kIHRoZSBTU0xDaXBoZXJTdWl0ZSBkaXJlY3RpdmUgYmVpbmcgdXNlZCB0bwogICAgIHVwZ3JhZGUgZnJvbSBhIHdlYWsgY2lwaGVyc3VpdGUgdG8gYSBzdHJvbmcgb25lIGNvdWxkIHJlc3VsdCBpbgogICAgIHRoZSB3ZWFrIGNpcGhlcnN1aXRlIGJlaW5nIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIHN0cm9uZyBvbmUuICAKICAgICBbQmVuIExhdXJpZV0KCiAgKikgU0VDVVJJVFk6IENBTi0yMDAzLTAyNTMgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4ZWQgYSBidWcgaW4gcHJlZm9yayBNUE0gY2F1c2luZyB0ZW1wb3JhcnkgZGVuaWFsIG9mIHNlcnZpY2UKICAgICB3aGVuIGFjY2VwdCgpIG9uIGEgcmFyZWx5IGFjY2Vzc2VkIHBvcnQgcmV0dXJucyBjZXJ0YWluIGVycm9ycy4KICAgICBSZXBvcnRlZCBieSBTYWhlZWQgQWtodGFyIDxTLkFraHRhciB0YWxpcy5jb20+LiAgW0plZmYgVHJhd2lja10KCiAgKikgU0VDVVJJVFk6IENBTi0yMDAzLTAyNTQgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4ZWQgYSBidWcgaW4gZnRwIHByb3h5IGNhdXNpbmcgZGVuaWFsIG9mIHNlcnZpY2Ugd2hlbiB0YXJnZXQKICAgICBob3N0IGlzIElQdjYgYnV0IHByb3h5IHNlcnZlciBjYW4ndCBjcmVhdGUgSVB2NiBzb2NrZXQuICBGaXhlZCBieQogICAgIHRoZSByZXBvcnRlci4gIFtZb3NoaW9rYSBUc3VuZW8gPHRzdW5lby55b3NoaW9rYSBmLXNlY3VyZS5jb20+XQoKICAqKSBTRUNVUklUWSBbVlUjMzc5ODI4XSBQcmV2ZW50IHRoZSBzZXJ2ZXIgZnJvbSBjcmFzaGluZyB3aGVuIGVudGVyaW5nCiAgICAgaW5maW5pdGUgbG9vcHMuIFRoZSBuZXcgTGltaXRJbnRlcm5hbFJlY3Vyc2lvbiBkaXJlY3RpdmUgY29uZmlndXJlcwogICAgIGxpbWl0cyBvZiBzdWJzZXF1ZW50IGludGVybmFsIHJlZGlyZWN0cyBhbmQgbmVzdGVkIHN1YnJlcXVlc3RzLCBhZnRlcgogICAgIHdoaWNoIHRoZSByZXF1ZXN0IHdpbGwgYmUgYWJvcnRlZC4gIFBSIDE5NzUzIChhbmQgcHJvYmFibHkgb3RoZXJzKS4KICAgICBbV2lsbGlhbSBSb3dlLCBKZWZmIFRyYXdpY2ssIEFuZHLpIE1hbG9dCgogICopIGNvcmVfb3V0cHV0X2ZpbHRlcjogZG9uJ3Qgc3BsaXQgdGhlIGJyaWdhZGUgYWZ0ZXIgYSBGTFVTSCBidWNrZXQgaWYKICAgICBpdCdzIHRoZSBsYXN0IGJ1Y2tldC4gIFRoaXMgcHJldmVudHMgY3JlYXRpbmcgdW5uZWNjZXNzYXJ5IGVtcHR5CiAgICAgYnJpZ2FkZXMgd2hpY2ggbWF5IG5vdCBiZSBkZXN0cm95ZWQgdW50aWwgdGhlIGVuZCBvZiBhIGtlZXBhbGl2ZQogICAgIGNvbm5lY3Rpb24uCiAgICAgW0p1YW4gUml2ZXJhIDxKdWFuLlJpdmVyYSBjaXRyaXguY29tPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yICJzdHJlYW15IiBQUk9QRklORCByZXNwb25zZXMuCiAgICAgW0JlbiBDb2xsaW5zLVN1c3NtYW4gPHN1c3NtYW4gY29sbGFiLm5ldD5dCgogICopIG1vZF9jZ2lkOiBFbGltaW5hdGUgYSBkb3VibGUtY2xvc2Ugb2YgYSBzb2NrZXQuICBUaGlzIHJlc29sdmVzCiAgICAgdmFyaW91cyBvcGVyYXRpb25hbCBwcm9ibGVtcyBpbiBhIHRocmVhZGVkIE1QTSwgc2luY2Ugb24gdGhlCiAgICAgc2Vjb25kIGF0dGVtcHQgdG8gY2xvc2UgdGhlIHNvY2tldCwgdGhlIHNhbWUgZGVzY3JpcHRvciB3YXMKICAgICBvZnRlbiBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIHRocmVhZCBmb3IgYW5vdGhlciBwdXJwb3NlLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIG1vZF9uZWdvdGlhdGlvbjogSW50cm9kdWNlICJwcmVmZXItbGFuZ3VhZ2UiIGVudmlyb25tZW50IHZhcmlhYmxlLAogICAgIHdoaWNoIGFsbG93cyB0byBpbmZsdWVuY2UgdGhlIG5lZ290aWF0aW9uIHByb2Nlc3Mgb24gcmVxdWVzdCBiYXNpcwogICAgIHRvIHByZWZlciBhIGNlcnRhaW4gbGFuZ3VhZ2UuICBbQW5kcukgTWFsb10KCiAgKikgTWFrZSBtb2RfZXhwaXJlcycgRXhwaXJlc0J5VHlwZSB3b3JrIHByb3Blcmx5LCBpbmNsdWRpbmcgZm9yCiAgICAgZHluYW1pY2FsbHktZ2VuZXJhdGVkIGRvY3VtZW50cy4gIFtLZW4gQ29hciwgQmlsbCBTdG9kZGFyZF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjQ2CgogICopIFNFQ1VSSVRZOiBDQU4tMjAwMy0wMjQ1IChjdmUubWl0cmUub3JnKQogICAgIEZpeGVkIGEgYnVnIGNhdXNpbmcgYXByX3B2c3ByaW50ZigpIHRvIGNyYXNoIGJ5IHNlbmRpbmcgYW4gb3Zlcmx5CiAgICAgbG9uZyBzdHJpbmcuICBUaGlzIGNhbiBiZSB0cmlnZ2VyZWQgcmVtb3RlbHkgdGhyb3VnaCBtb2RfZGF2LAogICAgIG1vZF9zc2wsIGFuZCBvdGhlciBtZWNoYW5pc21zLgogICAgIFJlcG9ydGVkIGJ5IERhdmlkIEVuZGxlciA8REVuZGxlciBpRGVmZW5zZS5jb20+LiAgW0pvZSBPcnRvbl0KCiAgKikgU0VDVVJJVFk6IENBTi0yMDAzLTAxODkgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4ZWQgYSBkZW5pYWwtb2Ytc2VydmljZSB2dWxuZXJhYmlsaXR5IGFmZmVjdGluZyBiYXNpYwogICAgIGF1dGhlbnRpY2F0aW9uIG9uIFVuaXggcGxhdGZvcm1zIHJlbGF0ZWQgdG8gdGhyZWFkLXNhZmV0eSBpbgogICAgIGFwcl9wYXNzd29yZF92YWxpZGF0ZSgpLgogICAgIFJlcG9ydGVkIGJ5IEpvaG4gSHVnaGVzIDxqb2huLmh1Z2hlcyBlbnRlZ3JpdHkuY29tPi4KCiAgKikgRml4IGZvciBtb2RfZGF2LiAgQ2FsbCB0aGUgJ2Nhbl9iZV9hY3Rpdml0eScgY2FsbGJhY2ssIGlmIHByb3ZpZGVkLAogICAgIHdoZW4gYSBNS0FDVElWSVRZIHJlcXVlc3QgY29tZXMgaW4uCiAgICAgW0JlbiBDb2xsaW5zLVN1c3NtYW4gPHN1c3NtYW4gY29sbGFiLm5ldD5dCgogICopIFBlcmZvcm0gcnVuLXRpbWUgcXVlcnkgaW4gYXB4cyBmb3IgYXByIGFuZCBhcHItdXRpbCdzIGluY2x1ZGVzLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgcnVuIGxpYnRvb2wgZnJvbSB0aGUgYXByIGluc3RhbGwgZGlyZWN0b3J5IChpbiBjYXNlIHRoYXQgaXMgZGlmZmVyZW50CiAgICAgZnJvbSB0aGUgYXBhY2hlIGluc3RhbGwgZGlyZWN0b3J5KSBbSmVmZiBUcmF3aWNrXQoKICAqKSBjb25maWd1cmUuaW46IFBsYXkgbmljZSB3aXRoIGxpYnRvb2wtMS41LiBbV2lsZnJlZG8gU2FuY2hlel0KCiAgKikgSWYgbW9kX21pbWVfbWFnaWMgZG9lcyBub3Qga25vdyB0aGUgY29udGVudC10eXBlLCBkbyBub3QgYXR0ZW1wdCB0bwogICAgIGd1ZXNzLiAgUFIgMTY5MDguICBbQW5kcmV3IEdhcG9uIDxhZ2Fwb24gdGVsY29yZGlhLmNvbT5dCgogICopIHNzbCBzZXNzaW9uIGNhY2hpbmcoc2htaHQpIDogRml4IGEgU0VHViBwcm9ibGVtIHdpdGggU0hNSFQgc2Vzc2lvbgogICAgIGNhY2hpbmcuIFBSIDE3ODY0LgogICAgIFtBbmRyZWFzIExlaW1iYWNoZXIgPGFuZHJlYXNsNjcgeWFob28uZGU+LCBNYWRodXN1ZGFuIE1hdGhpaGFsbGldCgogICopIEFkZCBhIGRlbGV0ZSBmbGFnIHRvIGh0cGFzc3dkLgogICAgIFtUaG9tIE1heV0KCiAgKikgRml4IG1vZF9yZXdyaXRlJ3MgaGFuZGxpbmcgb2YgYWJzb2x1dGUgVVJJcy4gVGhlIGVzY2FwaW5nIHJvdXRpbmVzCiAgICAgbm93IHdvcmsgc2NoZW1lIGRlcGVuZGVudCBhbmQgdGhlIHF1ZXJ5IHN0cmluZyB3aWxsIG9ubHkgYmUKICAgICBhcHBlbmRlZCBpZiBzdXBwb3J0ZWQgYnkgdGhlIHBhcnRpY3VsYXIgc2NoZW1lLiAgW0FuZHLpIE1hbG9dCgogICopIEFkZCBhbm90aGVyIGNoZWNrIGZvciBhbHJlYWR5IGNvbXByZXNzZWQgY29udGVudCBpbiBtb2RfZGVmbGF0ZS4KICAgICBQUiAxOTkxMy4gW1RzdXlvc2hpIFNBU0FNT1RPIDxuYXpvbmF6byBzdXBlci53aW4ubmUuanA+XQoKICAqKSBGaXhlcyBmb3IgVlBBVEggYnVpbGRzOyBjb3B5aW5nIHNwZWNpYWwubWsgYW5kIGFueSBmdXR1cmUgLm1rIGZpbGVzIAogICAgIGZyb20gdGhlIHNvdXJjZSB0cmVlIGFzIHdlbGwgYXMgdGhlIGJ1aWxkIHRyZWUgKG5vdyBjcmVhdGVzIGEgdXNhYmxlCiAgICAgY29uZmlndXJhdGlvbiBmb3IgYXB4cyksIGFuZCBlbGltaW5hdGVkIHJlZHVuZGFudCAtSSduY2x1ZGUgcGF0aHMuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQ29kZSBmaXhlcywgY29uc3RuZXNzIGNvcnJlY3Rpb25zIGFuZCBzc2xfdG9vbGtpdF9jb21wYXQuaCB1cGRhdGVzCiAgICAgZm9yIFNTTEMgYW5kIE9wZW5TU0wgdG9vbGtpdCBjb21wYXRpYmlsaXR5LiAgU3RpbGwgd29yayByZW1haW5zIHRvCiAgICAgYmUgZG9uZSB0byBjcmlwcGxlIGZlYXR1cmVzIGJhc2VkIG9uIHRoZSBsaW1pdGF0aW9ucyBvZiBSU0EncyBiaW5hcnkgCiAgICAgZGlzdHJpYnV0aW9uIG9mIHRoZWlyIFNTTC1DIHRvb2xraXQuCiAgICAgW1dpbGxpYW0gUm93ZSwgTWFkaHVzdWRhbiBNYXRoaWhhbGxpLCBKZWZmIFRyYXdpY2tdCgogICopIExpbnV4IDIuNCs6IElmIEFwYWNoZSBpcyBzdGFydGVkIGFzIHJvb3QgYW5kIHlvdSBjb2RlIAogICAgIENvcmVEdW1wRGlyZWN0b3J5LCBjb3JlZHVtcHMgYXJlIGVuYWJsZWQgdmlhIHRoZSBwcmN0bCgpIHN5c2NhbGwuCiAgICAgW0dyZWcgQW1lc10KCiAgKikgYXBfZ2V0X21pbWVfaGVhZGVyc19jb3JlOiBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHRyYWlsaW5nIG51bGwKICAgICB3aGVuIGZvbGRpbmcgaXMgaW4gZWZmZWN0LgogICAgIFBSIDE4MTcwIFtQZXRlciBNYXluZSA8UGV0ZXJNYXluZSBTUEFNX1NVWC5hcC5zcGhlcmlvbi5jb20+XQoKICAqKSBGaXggLS1lbmFibGUtbW9kcy1zaGFyZWQ9bW9zdCBhbmQgb3RoZXIgdmFyaWFudHMuICBbQWFyb24gQmFubmVydF0KCiAgKikgbW9kX2xvZ19jb25maWc6IEFkZCB0aGUgYWJpbGl0eSB0byBsb2cgdGhlIGlkIG9mIHRoZSB0aHJlYWQgCiAgICAgcHJvY2Vzc2luZyB0aGUgcmVxdWVzdCB2aWEgbmV3ICVQIGZvcm1hdHMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBVc2UgYXBwcm9wcmlhdGUgbGFuZ3VhZ2UgY29kZXMgZm9yIEN6ZWNoIChjcykgYW5kIFRyYWRpdGlvbmFsIENoaW5lc2UKICAgICAoemgtdHcpIGluIGRlZmF1bHQgY29uZmlnIGZpbGVzLiBQUiA5NDI3LiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9hdXRoX2xkYXA6IFVzZSBnZW5lcmljIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGNsYXNzIHdoZW4gcGFyc2luZwogICAgICJyZXF1aXJlIiBkaXJlY3RpdmVzLCBpbnN0ZWFkIG9mIGxpdGVyYWwgc3BhY2VzIG9ubHkuIFBSIDE3MTM1LgogICAgIFtBbmRy6SBNYWxvXQoKICAqKSBIb29rIG1vZF9yZXdyaXRlJ3MgdHlwZSBjaGVja2VyIGJlZm9yZSBtb2RfbWltZSdzIG9uZS4gVGhhdCB3YXkgdGhlCiAgICAgUmV3cml0ZVJ1bGUgW1Q9Li4uXSBGbGFnIHNob3VsZCB3b3JrIGFzIGV4cGVjdGVkIG5vdy4gUFIgMTk2MjYuCiAgICAgW0FuZHLpIE1hbG9dCgogICopIGh0cGFzc3dkOiBDaGVjayB0aGUgcHJvY2Vzc2VkIGZpbGUgb24gdmFsaWRpdHkuIElmIGEgbGluZSBpcyBub3QgZW1wdHkKICAgICBhbmQgbm90IGEgY29tbWVudCwgaXQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjb2xvbi4gT3RoZXJ3aXNlIGV4aXQKICAgICB3aXRoIGVycm9yIGNvZGUgNy4gW0tyaXMgVmVyYmVlY2sgPEtyaXMuVmVyYmVlY2sgdWJpemVuLmNvbT4sIFRob20gTWF5XQoKICAqKSBGaXggYSBwcm9ibGVtIHRoYXQgY2F1c2VkIGh0dHBkIHRvIGJlIGxpbmtlZCB3aXRoIGluY29ycmVjdCBmbGFncwogICAgIG9uIHNvbWUgcGxhdGZvcm1zIHdoZW4gbW9kX3NvIHdhcyBlbmFibGVkIGJ5IGRlZmF1bHQsIGJyZWFraW5nIAogICAgIERTT3Mgb24gQUlYLiAgUFIgMTkwMTIgIFtKZWZmIFRyYXdpY2tdCgogICopIEJ5IGRlZmF1bHQsIHVzZSB0aGUgc2FtZSBDQyBhbmQgQ1BQIHdpdGggd2hpY2ggQVBSIHdhcyBidWlsdC4KICAgICBUaGUgdXNlciBjYW4gb3ZlcnJpZGUgd2l0aCBDQyBhbmQgQ1BQIGVudmlyb25tZW50IHZhcmlhYmxlcy4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggYXBfY29uc3RydWN0X3VybCgpIHNvIHRoYXQgaXQgc3Vycm91bmRzIElQdjYgbGl0ZXJhbCBhZGRyZXNzCiAgICAgc3RyaW5ncyB3aXRoIFtdLiAgVGhpcyBmaXhlcyBjZXJ0YWluIHR5cGVzIG9mIHJlZGlyZWN0aW9uLgogICAgIFBSIDE5MjA3LiAgW0plZmYgVHJhd2lja10KCiAgKikgZm9yd2FyZCBwb3J0IG9mIGJ1ZmZlciBvdmVyZmxvdyBmaXhlcyBmb3IgaHRkaWdlc3QuIFtUaG9tIE1heV0KCiAgKikgQWRkZWQgQWxsb3dFbmNvZGVkU2xhc2hlcyBkaXJlY3RpdmUgdG8gcGVybWl0IGNvbnRyb2wgb2Ygd2hldGhlcgogICAgIHRoZSBzZXJ2ZXIgd2lsbCBhY2NlcHQgZW5jb2RlZCBzbGFzaGVzICgnJTJmJykgaW4gdGhlIFVSSSBwYXRoLgogICAgIERlZmF1bHQgY29uZGl0aW9uIGlzIG9mZiAodGhlIGhpc3RvcmljYWwgYmVoYXZpb3VyKS4gIFRoaXMgcGVybWl0cwogICAgIGVudmlyb25tZW50cyBpbiB3aGljaCB0aGUgcGF0aC1pbmZvIG5lZWRzIHRvIGNvbnRhaW4gZW5jb2RlZAogICAgIHNsYXNoZXMuICBQUiA1NDMsIDIzODksIDM1ODEsIDM1ODksIDU2ODcsIDcwNjYsIDc4NjUsIDE0NjM5LiAgW0tlbiBDb2FyXQoKICAqKSBXaGVuIHVzaW5nIFJlZGlyZWN0IGluIGRpcmVjdG9yeSBjb250ZXh0LCBhcHBlbmQgcmVxdWVzdGVkIHF1ZXJ5CiAgICAgc3RyaW5nIGlmIHRoZXJlJ3Mgbm8gb25lIHN1cHBsaWVkIGJ5IGNvbmZpZ3VyYXRpb24uIFBSIDEwOTYxLgogICAgIFtBbmRy6SBNYWxvXQoKICAqKSBVbmVzY2FwZSB0aGUgc3VwcGxpZWQgd2lsZGNhcmQgcGF0dGVybiBpbiBtb2RfYXV0b2luZGV4LiBPdGhlcndpc2UKICAgICB0aGUgcGF0dGVybiB3aWxsIG5vdCBhbHdheXMgbWF0Y2ggYXMgZGVzaXJlZC4gUFIgMTI1OTYuCiAgICAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9hdXRvaW5kZXggbm93IGVtaXRzIGFuZCBhY2NlcHRzIG1vZGVybiBxdWVyeSBzdHJpbmcgcGFyYW1ldGVyCiAgICAgZGVsaW1pdGVycyAoOykuIFRodXMgY29sdW1uIGhlYWRlcnMgbm8gbG9uZ2VyIGNvbnRhaW4gdW5lc2NhcGVkCiAgICAgYW1wZXJzYW5kcy4gUFIgMTA4ODAgIFtBbmRy6SBNYWxvXQoKICAqKSBFbmFibGUgYXBfc29ja19kaXNhYmxlX25hZ2xlIGZvciBXaW5kb3dzLiBUaGlzIGFsb25nIHdpdGggdGhlIAogICAgIGFkZGl0aW9uIG9mIEFQUl9UQ1BfTk9ERUxBWV9JTkhFUklURUQgdG8gYXByLmh3IHdpbGwgY2F1c2UgTmFnbGUgCiAgICAgdG8gYmUgZGlzYWJsZWQgZm9yIFdpbmRvd3MuIFtBbGxhbiBFZHdhcmRzXQoKICAqKSBDb3JyZWN0IGEgbWlzLWNvcnJlbGF0aW9uIGJldHdlZW4gbXBtX2NvbW1vbi5jIGFuZCBtcG1fY29tbW9uLmg7CiAgICAgVGhpcyBwYXRjaCByZXZlcnRzIHVzIHRvIHByZS0yLjAuNDYgYmVoYXZpb3IsIHVzaW5nIHRoZSAKICAgICBhcF9zb2NrX2Rpc2FibGVfbmFnbGUgbm9vcCBtYWNybywgYmVjYXVzZSBhcF9zb2NrX2Rpc2FibGVfbmFnbGUgCiAgICAgd2FzIG5ldmVyIGNvbXBpbGVkIG9uIFdpbjMyLiBbQWxsYW4gRWR3YXJkcywgV2lsbGlhbSBSb3dlXQoKICAqKSBGaXggYSBidWlsZCBwcm9ibGVtIHdpdGggcGFzc2luZyB1bnN1cHBvcnRlZCAtLWVuYWJsZS1sYXlvdXQKICAgICBhcmdzIHRvIGFwciBhbmQgYXByLXV0aWwuICBUaGlzIGJyb2tlIGJpbmJ1aWxkLnNoIGFzIHdlbGwgYXMKICAgICB1c2VyLXNwZWNpZmllZCBsYXlvdXQgcGFyYW1ldGVycy4gIFBSIDE4NjQ5IFtKdXN0aW4gRXJlbmtyYW50eiwKICAgICBKZWZmIFRyYXdpY2tdCgogICopIElmIGEgRGF0ZSByZXNwb25zZSBoZWFkZXIgd2FzIGFscmVhZHkgc2V0IGluIHRoZSBoZWFkZXJzIGFycmF5LAogICAgIHRoaXMgdmFsdWUgd2FzIGlnbm9yZWQgaW4gZmF2b3VyIG9mIHRoZSBjdXJyZW50IHRpbWUuIFRoaXMgbWVhbnQKICAgICB0aGF0IERhdGUgaGVhZGVycyBvbiBwcm94aWVkIHJlcXVlc3RzIHdoZXJlIHJld3JpdHRlbiB3aGVuIHRoZXkKICAgICBzaG91bGQgbm90IGhhdmUgYmVlbi4gUFI6IDE0Mzc2IFtHcmFoYW0gTGVnZ2V0dF0KCiAgKikgQWRkIGNvZGUgdG8gYnVpbGRjb25mIHRoYXQgcHJvZHVjZXMgYW4gaHR0cGQuc3BlYyBmaWxlIGZyb20KICAgICBodHRwZC5zcGVjLmluLCB1c2luZyBidWlsZC9nZXQtdmVyc2lvbi5zaCBmcm9tIEFQUi4KICAgICBbR3JhaGFtIExlZ2dldHRdCgogICopIEZpeGVkIGEgc2VnZmF1bHQgd2hlbiBtdWx0aXBsZSBQcm94eUJsb2NrIGRpcmVjdGl2ZXMgd2VyZSB1c2VkLgogICAgIFBSOiAxOTAyMyBbU2FtaSBUaWtrYSA8c2FtaS50aWtrYSBmLXNlY3VyZS5jb20+XQoKICAqKSBTRUNVUklUWTogQ0FOLTIwMDMtMDEzNCAoY3ZlLm1pdHJlLm9yZykKICAgICBPUzI6IEZpeCBhIERlbmlhbCBvZiBTZXJ2aWNlIHZ1bG5lcmFiaWxpdHkgaWRlbnRpZmllZCBhbmQKICAgICByZXBvcnRlZCBieSBSb2JlcnQgSG93YXJkIDxyaWhvd2FyZCByYXdidy5jb20+IHRoYXQgd2hlcmUgZGV2aWNlCiAgICAgbmFtZXMgZmF1bHRlZCB0aGUgcnVubmluZyBPUzIgd29ya2VyIHByb2Nlc3MuICBUaGUgZml4IGlzCiAgICAgYWN0dWFsbHkgaW4gQVBSIDAuOS40LiAgW0JyaWFuIEhhdmFyZF0KCiAgKikgRm9yd2FyZCBwb3J0OiBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIChlc3BlY2lhbGx5IGNvbnRyb2wKICAgICBjaGFyYWN0ZXJzKSBpbiBtb2RfbG9nX2NvbmZpZyB0byBtYWtlIGEgY2xlYXIgZGlzdGluY3Rpb24gYmV0d2VlbgogICAgIGNsaWVudC1zdXBwbGllZCBzdHJpbmdzICh3aXRoIHNwZWNpYWwgY2hhcmFjdGVycykgYW5kIHNlcnZlci1zaWRlCiAgICAgc3RyaW5ncy4gVGhpcyB3YXMgYWxyZWFkeSBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMS4zLjI1LgogICAgIFtBbmRy6SBNYWxvXQoKICAqKSBtb2RfZGVmbGF0ZTogQ2hlY2sgYWxzbyBlcnJfaGVhZGVyc19vdXQgZm9yIGFuIGFscmVhZHkgc2V0CiAgICAgQ29udGVudC1FbmNvZGluZzogZ3ppcCBoZWFkZXIuIFRoaXMgcHJldmVudHMgZ3ppcCBjb21wcmVzc2VkIGNvbnRlbnQKICAgICBmcm9tIGEgQ0dJIHNjcmlwdCBmcm9tIGJlaW5nIGNvbXByZXNzZWQgb25jZSBtb3JlLiBQUiAxNzc5Ny4KICAgICBbQW5kcukgTWFsb10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjQ1CgogICopIEZpeCBwb3NzaWJsZSBzZWdmYXVsdHMgdW5kZXIgb2JzY3VyZSBlcnJvciBjb25kaXRpb25zIHdpdGhpbiB0aGUKICAgICBjZ2lkIGRhZW1vbi4gIFtKZWZmIFRyYXdpY2ssIFdpbGxpYW0gUm93ZV0KCiAgKikgU0VDVVJJVFk6IENBTi0yMDAzLTAxMzIgKGN2ZS5taXRyZS5vcmcpCiAgICAgQ2xvc2UgYSBEZW5pYWwgb2YgU2VydmljZSB2dWxuZXJhYmlsaXR5IGlkZW50aWZpZWQgYnkgRGF2aWQKICAgICBFbmRsZXIgPERFbmRsZXIgaURlZmVuc2UuY29tPiBvbiBhbGwgcGxhdGZvcm1zLiAgQW4gdW5saW1pdGVkCiAgICAgc3RyZWFtIG9mIG5ld2xpbmVzIHdlcmUgYWNjZXB0YWJsZSBiZXR3ZWVuIHJlcXVlc3RzIHdoZXJlIGVhY2gKICAgICA8bGY+IHdvdWxkIGFsbG9jYXRlIGFuIDgwIGJ5dGUgYnVmZmVyLCBsZWFkaW5nIHZlcnkgcXVpY2tseSB0bwogICAgIG1lbW9yeSBleGFodXN0aW9uLiAgW0JyaWFuIFBhbmVdCgogICopIEFkZGVkIGFuIHJwbSBidWlsZCBzY3JpcHQuCiAgICAgW0dyYWhhbSBMZWdnZXR0LCBKb2UgT3J0b24gPGpvcnRvbiByZWRoYXQuY29tPl0KCiAgKikgU2ltcGxlciwgZmFzdGVyIGNvZGUgcGF0aCBmb3IgcmVxdWVzdCBoZWFkZXIgc2Nhbm5pbmcgIFtCcmlhbiBQYW5lXQoKICAqKSBTRUNVUklUWTogIEVsaW1pbmF0ZWQgbGVha3Mgb2Ygc2V2ZXJhbCBmaWxlIGRlc2NyaXB0b3JzIHRvIGNoaWxkCiAgICAgcHJvY2Vzc2VzLCBzdWNoIGFzIENHSSBzY3JpcHRzLiAgVGhpcyBmaXggZGVwZW5kcyBvbiB0aGUgQVBSIGxpYnJhcnkgCiAgICAgcmVsZWFzZSAwLjkuMiBvciBsYXRlciAoMC45LjMgd2FzIGRpc3RyaWJ1dGVkIHdpdGggdGhlIGh0dHBkIAogICAgIHNvdXJjZSB0YXJiYWxsIGZvciBBcGFjaGUgMi4wLjQ1LikgIFBSIDE3MjA2CiAgICAgW0NocmlzdGlhbiBLcmF0emVyIDxjayBja3NvZnQuZGU+LCBCam9lcm4gQS4gWmVlYiA8YnogemFiYmFkb3oubmV0Pl0KCiAgKikgRml4IHBhdGggaGFuZGxpbmcgb2YgbW9kX3Jld3JpdGUsIGVzcGVjaWFsbHkgb24gbm9uLXVuaXggc3lzdGVtcy4KICAgICBUaGVyZSB3YXMgc29tZSBjb25mdXNpb24gYmV0d2VlbiBsb2NhbCBwYXRocyBhbmQgVVJMIHBhdGhzLgogICAgIFBSIDEyOTAyLiAgW0FuZHLpIE1hbG9dCgogICopIFByZXZlbnQgZW5kbGVzcyBsb29wcyBvZiBpbnRlcm5hbCByZWRpcmVjdHMgaW4gbW9kX3Jld3JpdGUgYnkKICAgICBhYm9ydGluZyBhZnRlciBleGNlZWRpbmcgYSBsaW1pdCBvZiBpbnRlcm5hbCByZWRpcmVjdHMuIFRoZQogICAgIGxpbWl0IGRlZmF1bHRzIHRvIDEwIGFuZCBjYW4gYmUgY2hhbmdlZCB1c2luZyB0aGUgUmV3cml0ZU9wdGlvbnMKICAgICBkaXJlY3RpdmUuIFBSIDE3NDYyLiAgW0FuZHLpIE1hbG9dCgogICopIFdpbjMyOiBBdm9pZCBidXN5IHdhaXQgKGNvbnN1bWluZyBhbGwgdGhlIENQVSBpZGxlIGN5Y2xlcykgd2hlbgogICAgIGFsbCB3b3JrZXIgdGhyZWFkcyBhcmUgYnVzeS4gCiAgICAgW0lnb3IgTmF6YXJlbmtvIDxpZ29yX25hemFyZW5rbyBob3RtYWlsLmNvbT5dCgogICopIEtlZXAgdGhlIHN1YnJlcXVlc3QgZmlsdGVyIGluIHBsYWNlIHdoZW4gYSBzdWJyZXF1ZXN0IGlzIAogICAgIHJlZGlyZWN0ZWQuICBQUiAxNTQyMy4gIFtKZWZmIFRyYXdpY2tdCgogICopIHlvdSBjYW4gbm93IHNwZWNpZnkgdGhlIGNvbXByZXNzaW9uIGxldmVsIGZvciBtb2RfZGVmbGF0ZS4gCiAgICAgW0lhbiBIb2xzbWFuLCBTdGVwaGVuIFBpZXJ6Y2hhbGEgPHN0ZXBoZW4gcGllcnpjaGFsYS5jb20+LCAKICAgICBNaWNoYWVsIFNjaHJvZXBsIDxNaWNoYWVsLlNjaHJvZXBsIHRlbGVrdXJzLmRlPl0KCiAgKikgbW9kX2RlZmxhdGU6IEV4dGVuZCB0aGUgRGVmbGF0ZUZpbHRlck5vdGUgZGlyZWN0aXZlIHRvCiAgICAgYWxsb3cgYWNjdXJhdGUgbG9nZ2luZyBvZiB0aGUgZmlsdGVyJ3MgaW4tIGFuZCBvdXRzdHJlYW0uCiAgICAgW0FuZHLpIE1hbG9dCgogICopIEFsbG93IFNTTE11dGV4IHRvIHNlbGVjdC91c2UgdGhlIGZ1bGwgcmFuZ2Ugb2YgQVBSIGxvY2tpbmcKICAgICBtZWNoYW5pc21zIGF2YWlsYWJsZSB0byBpdC4gQWxzbywgZml4IHRoZSBidWcgdGhhdCBTU0xNdXRleCB1c2VzCiAgICAgQVBSX0xPQ0tfREVGQVVMVCBubyBtYXR0ZXIgd2hhdC4gIFBSIDgxMjIgIFtKaW0gSmFnaWVsc2tpLAogICAgIE1hcnRpbiBLdXRzY2hrZXIgPG1hcnRpbi50Lmt1dHNjaGtlciBibGFja2JveC5uZXQ+XQoKICAqKSBSZXN0b3JlIHRoZSBhYmlsaXR5IG9mIGh0ZGlnZXN0LmV4ZSB0byBjcmVhdGUgZmlsZXMgdGhhdCBjb250YWluCiAgICAgbW9yZSB0aGFuIG9uZSB1c2VyLiBQUiAxMjkxMC4gIFtBbmRy6SBNYWxvXQoKICAqKSBJbXByb3ZlIGJpbmFyeSBjb21wYXRpYmlsaXR5IG9mIHRoZSBjb3JlIGJldHdlZW4gZGVidWcgKGFrYQogICAgIG1haW50YWluZXItbW9kZSkgYW5kIGEgbm9uLWRlYnVnIGNvbXBpbGUuCiAgICAgW1NhbmRlciBTdHJpa2VyXQoKICAqKSBtb2RfdXNlcnRyYWNrOiBkb24ndCBzZXQgdGhlIGNvb2tpZSBpbiBzdWJyZXF1ZXN0cy4gVGhpcyB3b3JrcwogICAgIGFyb3VuZCB0aGUgcHJvYmxlbSB0aGF0IGNvb2tpZXMgd2VyZSBzZXQgdHdpY2UgZHVyaW5nIGZhc3QgaW50ZXJuYWwKICAgICByZWRpcmVjdHMuIFBSIDEzMjExLiAgW0FuZHLpIE1hbG9dCgogICopIG1vZF9hdXRvaW5kZXggbm8gbG9uZ2VyIGZvcmdldHMgb3V0cHV0IGZvcm1hdCBhbmQgZW5hYmxlZCB2ZXJzaW9uCiAgICAgc29ydCBpbiBsaW5rZWQgY29sdW1uIGhlYWRlcnMuICBbQW5kcukgTWFsb10KCiAgKikgVXNlIC5zdiBpbnN0ZWFkIG9mIC5zZSBhcyBleHRlbnNpb24gZm9yIFN3ZWRpc2ggZG9jdW1lbnRzIGluIHRoZQogICAgIGRlZmF1bHQgY29uZmlndXJhdGlvbi4gUFIgMTI4NzcuICBbQW5kcukgTWFsb10KCiAgKikgVXBkYXRlZCBtb2RfbGRhcCBhbmQgbW9kX2F1dGhfbGRhcCB0byBzdXBwb3J0IHRoZSBOb3ZlbGwgTERBUCBTREsgU1NMCiAgICAgYW5kIHN0YW5kYXJkaXplZCB0aGUgTERBUCBTU0wgc3VwcG9ydCBhY3Jvc3MgdGhlIHZhcmlvdXMgTERBUCBTREtzLiAgCiAgICAgSXNvbGF0ZWQgdGhlIFNTTCBmdW5jdGlvbmFsaXR5IHRvIG1vZF9sZGFwIHJhdGhlciB0aGFuIHNwZWFkaW5nIGl0IAogICAgIGFjcm9zcyBtb2RfYXV0aF9sZGFwIGFuZCBtb2RfbGRhcC4gIEFsc28gYWRkZWQgTERBUFRydXN0ZWRDQQogICAgIGFuZCBMREFQVHJ1c3RlZENBVHlwZSBkaXJlY3RpdmVzIHRvIG1vZF9sZGFwIHRvIGFsbG93IGZvciBhIG1vcmUgCiAgICAgY29tbW9uIG1ldGhvZCBvZiBzcGVjaWZ5aW5nIHRoZSBTU0wgY2VydGlmaWNhdGUuCiAgICAgW0RhdmUgV2FyZCwgQnJhZCBOaWNob2xlc10KCiAgKikgRml4ZWQgbW9kX3NzbCdzIFNTTENlcnRpZmljYXRlQ2hhaW4gaW5pdGlhbGl6YXRpb24gdG8gbm8gbG9uZ2VyIAogICAgIHNraXAgdGhlIGZpcnN0IGNlcnQgb2YgdGhlIGNoYWluIGJ5IGRlZmF1bHQuICBUaGlzIG1pc2JlaGF2aW9yIAogICAgIHdhcyBpbnRyb2R1Y2VkIGluIDIuMC4zNC4gIFBSIDE0NTYwICBbTWFkaHVzdWRhbiBNYXRoaWhhbGxpXQoKICAqKSBtb2RfY2dpLCBtb2RfY2dpZCwgbW9kX2V4dF9maWx0ZXI6IExvZyBlcnJvcnMgd2hlbiBzY3JpcHRzIGNhbm5vdAogICAgIGJlIHN0YXJ0ZWQgb24gVW5peCBiZWNhdXNlIG9mIHN1Y2ggcHJvYmxlbXMgYXMgYmFkIHBlcm1pc3Npb25zLAogICAgIGJhZCBzaGViYW5nIGxpbmUsIGV0Yy4gIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCA2NC1iaXQgcHJvYmxlbSBpbiBtb2Rfc3NsIGlucHV0IGxvZ2ljLiAgCiAgICAgW01hZGh1c3VkYW4gTWF0aGloYWxsaSA8bWFkaHVzdWRhbl9tYXRoaWhhbGxpIGhwLmNvbT5dCgogICopIEZpeCBwb3RlbnRpYWwgbWVtb3J5IGxlYWtzIGluIG1vZF9kZWZsYXRlIG9uIG1hbGZvcm1lZCBkYXRhLiAgUFIgMTYwNDYuCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBSZXdyaXRlIGFwX3htbF9wYXJzZV9pbnB1dCB0byB1c2UgYnVja2V0IGJyaWdhZGVzLiAgUFIgMTYxMzQuCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBGaXggc2VnZmF1bHQgd2hpY2ggb2NjdXJyZWQgd2hlbiBhIHNlY3Rpb24gaW4gYW4gaW5jbHVkZWQKICAgICBjb25maWd1cmF0aW9uIGZpbGUgd2FzIG5vdCBjbG9zZWQuIFBSIDE3MDkzLiAgW0FuZHLpIE1hbG9dCgogICopIEVuaGFuY2UgdGhlIGJlaGF2aW9yIG9mIG1vZF9pc2FwaSdzIFdyaXRlQ2xpZW50KCkgY2FsbGJhY2sgdG8KICAgICBwcm92aWRlIGJldHRlciBlbXVsYXRpb24gZm9yIGlzYXBpIG1vZHVsZXMgdGhhdCBwcmVzdW1lIHRoYXQgdGhlCiAgICAgZmlyc3QgV3JpdGVDbGllbnQoKSBjYWxsIG1heSBzZW5kIHN0YXR1cyBhbmQgaGVhZGVycy4gIEFuIGV4YW1wbGUKICAgICBvZiBXcml0ZUNsaWVudCgpIGFidXNlIGlzIHRoZSBmb3hpc2FwaSBtb2R1bGUsIHdoaWNoIHJlbGllcyBvbgogICAgIHRoYXQgYXNzdW1waW9uIGFuZCBub3cgd29ya3MuICBbV2lsbGlhbSBSb3dlLCBNaWxhbiBLb3NpbmFdCgogICopIENoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgYXBfcnVuX3ByZV9jb25uZWN0aW9uKCkuIFNvIGlmIHRoZQogICAgIHByZV9jb25uZWN0aW9uIHBoYXNlIGZhaWxzICh3aXRob3V0IHNldHRpbmcgYy0+YWJvcnRlZCkKICAgICBhcF9ydW5fcHJvY2Vzc19jb25uZWN0aW9uIGlzIG5vdCBleGVjdXRlZC4gW1N0YXMgQmVrbWFuXQoKICAqKSBGaXhlZCBhIHByb2JsZW0gd2l0aCBtb2RfbGRhcCB3aGljaCBjYXVzZWQgaXQgdG8gZmF1bHQgd2hlbiBjYWNoaW5nCiAgICAgd2FzIGRpc2FibGVkLiAgTmVlZGVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb2RlIGRpZCBub3QKICAgICBhdHRlbXB0IHRvIHVzZSB0aGUgY2FjaGUgaWYgaXQgZGlkbid0IGV4aXN0LiBBbHNvIGZpeGVkIHNvbWUgbWVtb3J5CiAgICAgbGVha3Mgd2hpY2ggd2VyZSBkdWUgdG8gbm90IHJlbGVhc2luZyBMREFQIHJlc291cmNlcyBvbiBlcnJvcgogICAgIGNvbmRpdGlvbnMuICBbQnJhZCBOaWNob2xlc10KICAgICAKICAqKSBIb29rIG1vZF9wcm94eSdzIGZpeHVwIGJlZm9yZSBtb2RfcmV3cml0ZSdzIGZpeHVwLCBzbyB0aGF0IGJ5CiAgICAgbW9kX3Jld3JpdGUgcHJveGllZCBVUkxzIHdpbGwgbm90IGJlIGVzY2FwZWQgYWNjaWRlbnRhbGx5IGJ5CiAgICAgbW9kX3Byb3h5J3MgZml4dXAuIFBSIDE2MzY4ICBbQW5kcukgTWFsb10KCiAgKikgV2hpbGUgcHJvY2Vzc2luZyBmaWx0ZXJzIG9uIGludGVybmFsIHJlZGlyZWN0cywgcmVtZW1iZXIgc2VlbiBFT1MKICAgICBidWNrZXRzIGFsc28gaW4gdGhlIHJlcXVlc3Qgc3RydWN0dXJlIG9mIHRoZSByZWRpcmVjdCBpc3N1ZXIocykuIFRoaXMKICAgICBwcmV2ZW50cyBmaWx0ZXJzIChzdWNoIGFzIG1vZF9kZWZsYXRlKSBmcm9tIGFkZGluZyBnYXJiYWdlIHRvIHRoZQogICAgIHJlc3BvbnNlLiBQUiAxNDQ1MS4gIFtBbmRy6SBNYWxvXQoKICAqKSBzdWV4ZWM6IEJlIG1vcmUgcGVkYW50aWMgd2hlbiBjbGVhbmluZyBlbnZpcm9ubWVudC4gQ2xlYW4gaXQKICAgICBpbW1lZGlhdGVseSBhZnRlciBzdGFydHVwLiBQUiAyNzkwLCAxMDQ0OS4KICAgICBbSmVmZiBTdGV3YXJ0IDxqd3MgcHVyZHVlLmVkdT4sIEFuZHLpIE1hbG9dCgogICopIEZpeCBhcHhzIHRvIGluc2VydCBMb2FkTW9kdWxlIGRpcmVjdGl2ZXMgb25seSBvdXRzaWRlIG9mIHNlY3Rpb25zLgogICAgIFBSIDg3MTIsIDkwMTIuICBbQW5kcukgTWFsb10KCiAgKikgRml4IHN1ZXhlYyBjb21waWxlIGVycm9yIHVuZGVyIFNVTk9TNCwgd2hlcmUgc3RyZXJyb3IoKSBkb2Vzbid0CiAgICAgZXhpc3QuIFBSIDU5MTMsIDk5NzcuCiAgICAgW0pvbmF0aGFuIFcgTWluZXIgPEpvbmF0aGFuLlcuTWluZXIgbG1jby5jb20+XQoKICAqKSBGaXggSWYgaGVhZGVyIHBhcnNpbmcgd2hlbiBhIG5vbi1tb2RfZGF2IGxvY2sgdG9rZW4gaXMgcGFzc2VkIHRvIGl0LgogICAgIFBSIDE2NDUyLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBtb2RfYXV0aF9kaWdlc3Qgbm8gbG9uZ2VyIHRyaWVzIHRvIGd1ZXNzIEF1dGhEaWdlc3REb21haW4sIGlmIGl0J3MKICAgICBub3Qgc3BlY2lmaWVkLiBOb3cgaXQgYXNzdW1lcyAiLyIgYXMgYWxyZWFkeSBkb2N1bWVudGVkLiBQUiAxNjkzNy4KICAgICBbQW5kcukgTWFsb10KCiAgKikgVHJ5IHRvIGxvZyBhbiBlcnJvciBpZiBhIHBpcGVkIGxvZyBwcm9ncmFtIGZhaWxzLiAgVHJ5IHRvCiAgICAgcmVzdGFydCBhIHBpcGVkIGxvZyBwcm9ncmFtIGluIG1vcmUgZmFpbHVyZSBzaXR1YXRpb25zLiAgRml4IGFuCiAgICAgZXhpc3RpbmcgcHJvYmxlbSB3aXRoIGVycm9yIGhhbmRsaW5nIGluIHBpcGVkX2xvZ19zcGF3bigpLiAgVXNlCiAgICAgbmV3IEFQUiBhcHJfcHJvY19jcmVhdGUoKSBmZWF0dXJlcyB0byBwcmV2ZW50IEFwYWNoZSBmcm9tIHN0YXJ0aW5nCiAgICAgb24gVW5peCogaW4gbW9zdCBjYXNlcyB3aGVyZSBhIHBpcGVkIGxvZyBwcm9ncmFtIGNhbiBiZSBzdGFydGVkLAogICAgIGFuZCBhZGQgbG9nIG1lc3NhZ2VzIGZvciB0aGUgb3RoZXIgc2l0dWF0aW9ucy4gICpPdGhlciBwbGF0Zm9ybXMKICAgICBhbHJlYWR5IGZhaWxlZCBBcGFjaGUgaW5pdGlhbGl6YXRpb24gaWYgYSBwaXBlZCBsb2cgcHJvZ3JhbQogICAgIGNvdWxkbid0IGJlIHN0YXJ0ZWQuICBQUiAxNTc2MSAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IG1vZF9jZXJuX21ldGEgdG8gbm90IGNyZWF0ZSBlbXB0eSBtZXRhZmlsZXMgd2hlbiB0aGUKICAgICBtZXRhZmlsZSBzZWFyY2hlZCBmb3IgZG9lcyBub3QgZXhpc3QuICBQUiAxMjM1MwogICAgIFtPd2VuIFJlZXMgPG93ZW5fcmVlcyBocC5jb20+XQoKICAqKSBJbnRyb2R1Y2UgZGVidWdnaW5nIHN5bWJvbHMgZm9yIFdpbjMyIHJlbGVhc2UgYnVpbGRzLCBib3RoIC5wZGIgCiAgICAgYW5kIC5kYmcgZmlsZXMgKG9sZGVyIGRlYnVnZ2VycyBhbmQgRHIuIFdhdHNvbi10eXBlIHV0aWxpdGllcyAKICAgICBvbiBXaW5OVCBvciBXaW45eCBkb24ndCBzdXBwb3J0IHRoZSBuZXdlciAucGRiIGZsYXZvci4pCiAgICAgW0FsbGVuIEVkd2FyZHMsIFdpbGxpYW0gUm93ZV0KIAogICopIEZpeCBidWcgd2hlcmUgJ1NhdGlzZnkgQW55JyB3aXRob3V0IGFuIEF1dGhUeXBlIGxvc3QgYWxsIE1JTUUKICAgICBpbmZvcm1hdGlvbiAoYW5kIG1vcmUpLiBSZWxhdGVkIHRvIFBSIDkwNzYuICBbQW5kcukgTWFsb10KCiAgKikgbW9kX2ZpbGVfY2FjaGU6IGZpeCBzZWdmYXVsdCBzZXJ2aW5nIG1tYXBlZCBjYWNoZWQgZmlsZXMuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIG1vZF9maWxlX2NhY2hlOiBmaXhlZCBhIHNlZ2ZhdWx0IHdoZW4gbXVsdGlwbGUgTU1hcEZpbGUgZGlyZWN0aXZlcwogICAgIHdlcmUgdXNlZC4gIFBSIDE2MzEzLiAgW0NsaWZmIFdvb2xsZXldCgogICopIEZpeCBhIG5hc3R5IHNlZ2ZhdWx0IGluIG1tYXBfYnVja2V0X3NldGFzaWRlKCkgY2F1c2VkIGJ5IHBhc3NpbmcKICAgICBhbiBpbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlIHRvIG1tYXBfYnVja2V0X2Rlc3Ryb3kodm9pZCopLgogICAgIFtHZXJhcmQgRXZpc3RvbiA8Z2V2aXN0b24gYmlncG9uZC5uZXQuYXU+XQoKICAqKSBFbmFibGUgdGhlIC1uIG5hbWUgcGFyYW1ldGVyIG9uIE5ldFdhcmUgdG8gYWxsb3cgdGhlCiAgICAgYWRtaW5pc3RyYXRvciB0byByZW5hbWUgdGhlIEFwYWNoZSBjb25zb2xlIHNjcmVlbgogICAgIFtCcmFkIE5pY2hvbGVzXQogICAgIAogICopIEZpeGVkIHBpcGVkIGFjY2VzcyBsb2dzIG9uIFdpbjMyIGJ5IGRpc2FibGluZyBPVEhFUl9DSElMRAogICAgIHN1cHBvcnQgYnkgZGVmYXVsdCBpbiBBUFIuICBNb3JlIGRldmVsb3BtZW50IGlzIHJlcXVpcmVkCiAgICAgdG8gZGVwbG95IE9USEVSX0NISUxEIG9uIFdpbjMyLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgVXNlIHNhbmVyIGRlZmF1bHQgY29uZmlnIHZhbHVlcyBmb3Igc3VleGVjLiBQUiAxNTcxMy4KICAgICBbVGhvbSBNYXkgPHRob20gcGxhbmV0YXJ5dHJhbXAubmV0Pl0KCiAgKikgbW9kX3Jld3JpdGU6IEFsbG93ICJSZXdyaXRlRW5naW5lIE9mZiIgZXZlbiBpZiBubyAiT3B0aW9ucyBGb2xsb3dTeW1saW5rcyIKICAgICAob3IgU3ltbGlua3NJZk93bmVybWF0Y2gpIGlzIHNldC4gUFIgMTIzOTUuICBbQW5kcukgTWFsb10KCiAgKikgYXB4czogSW5jbHVkZSBhbnkgc3BlY2lhbCBBUFIgbGQgZmxhZ3Mgd2hlbiBsaW5raW5nIHRoZSBEU08uCiAgICAgVGhpcyByZXNvbHZlcyBwcm9ibGVtcyBvbiBBSVggd2hlbiBidWlsZGluZyBhIERTTyB3aXRoIGFweHMrZ2NjLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZGVkIGNoYXJhY3RlciBzZXQgc3VwcG9ydCB0byBtb2RfYXV0aF9MREFQIHRvIGFsbG93IGl0IHRvIAogICAgIGNvbnZlcnQgZXh0ZW5kZWQgY2hhcmFjdGVycyB1c2VkIGluIHRoZSB1c2VyIElEIHRvIFVURi04IAogICAgIGJlZm9yZSBhdXRoZW50aWNhdGluZyBhZ2FpbnN0IHRoZSBMREFQIGRpcmVjdG9yeS4gVGhlIG5ldwogICAgIGRpcmVjdGl2ZSBBdXRoTERBUENoYXJzZXRDb25maWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb25maWcKICAgICBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGNoYXJhY3RlciBzZXQgY29udmVyc2lvbiB0YWJsZS4KICAgICBbQnJhZCBOaWNob2xlc10KCiAgKikgRG9uJ3QgcmVtb3ZlIHRoZSBDb250ZW50LUxlbmd0aCBmcm9tIHJlc3BvbnNlcyBpbiBtb2RfcHJveHkKICAgICBQUjogODY3NyBbQnJpYW4gUGFuZV0KCiAgKikgRW5zdXJlIExEQVAgdmVyc2lvbiBpcyBzZXQgdG8gdjMgb24gZXZlcnkgYmluZC4gUFIgMTQyMzUuCiAgICAgW1NlcmdleSBBLiBMaXBuZXZpY2ggPHNlcmdleWxpIHBpc2VtLm5ldD5dCgogICopIEZpeCBtb2RfbGRhcCB0byBvcGVuIGFuIGV4aXN0aW5nIHNoYXJlZCBtZW1vcnkgZmlsZSBzaG91bGQgb25lCiAgICAgYWxyZWFkeSBleGlzdC4gUFIgMTI3NTcuIFtTY29vdGVyIE1vcnJpcyA8c2Nvb3RlciBnZW5lLmNvbT4sCiAgICAgR3JhaGFtIExlZ2dldHRdCgogICopIEZpeCB0aGUgdWxpbWl0IGNvbW1hbmQgdXNlZCBieSBhcGFjaGVjdGwgb24gVHJ1NjQuICBQUiAxMzYwOS4KICAgICBbSm9zZXBoIFNlbnVsaXMgPEpvc2VwaC5TZW51bGlzIGRuci5zdGF0ZS53aS51cz4sIEplZmYgVHJhd2lja10KCiAgKikgQ2hhbmdlIHRoZSB1bGltaXQgY29tbWFuZCB1c2VkIGJ5IGFwYWNoZWN0bCBvbiBBSVggc28gdGhhdCBpdAogICAgIHdvcmtzIGluIGFsbCBsb2NhbGVzLiAgW0plZmYgVHJhd2lja10KCiAgKikgbW9kX2V4dF9maWx0ZXI6IEZpeCBhIHByb2JsZW0gYnVpbGRpbmcgYXJndW1lbnQgbGlzdHMgd2hpY2ggCiAgICAgb2NjYXNpb25hbGx5IGNhdXNlZCBleGVjIHRvIGZhaWwuICBQUiAxNTQ5MS4gIFtKZWZmIFRyYXdpY2tdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC40NAoKICAqKSBtb2RfYXV0b2luZGV4OiBCcmluZyBmb3J3YXJkIHRoZSBJbmRleE9wdGlvbnMgSWdub3JlQ2FzZSBvcHRpb24KICAgICBmcm9tIEFwYWNoZSAxLjMuICBQUiAxNDI3NgogICAgIFtEYXZpZCBTaGFuZSBIb2xkZW4gPGRwZWplc2ggeWFob28uY29tPiwgV2lsbGlhbSBSb3dlXQoKICAqKSBtb2RfbWltZTogV29ya2Fyb3VuZCB0byBwcmV2ZW50IGEgc2VnZmF1bHQgaWYgci0+ZmlsZW5hbWU9TlVMTAogICAgIFtCcmlhbiBQYW5lXQogCiAgKikgUmVvcmRlciB0aGUgZGVmaW5pdGlvbnMgZm9yIG1vZF9sZGFwIGFuZCBtb2RfYXV0aF9sZGFwIHdpdGhpbgogICAgIGNvbmZpZy5tNCB0byBtYWtlIHN1cmUgdGhlIHBhcmVudCBtb2RfbGRhcCBpcyBkZWZpbmVkIGZpcnN0LgogICAgIFRoaXMgZW5zdXJlcyB0aGF0IG1vZF9sZGFwIGNvbWVzIGJlZm9yZSBtb2RfYXV0aF9sZGFwIGluIHRoZQogICAgIGh0dHBkLmNvbmYgZmlsZSwgd2hpY2ggaXMgbmVjZXNzYXJ5IGZvciBtb2RfYXV0aF9sZGFwIHRvIGxvYWQuCiAgICAgUFIgMTQyNTYgIFtHcmFoYW0gTGVnZ2V0dF0KCiAgKikgRml4IHRoZSBidWlsZGluZyBvZiBjZ2kgY29tbWFuZCBsaW5lcyB3aGVuIHRoZSBxdWVyeSBzdHJpbmcKICAgICBjb250YWlucyAnPScuICBQUiAxMzkxNCAgW1ZpbGxlIFNreXR05CA8dmlsbGUuc2t5dHRhIGlraS5maT4sCiAgICAgSmVmZiBUcmF3aWNrXQoKICAqKSBSZW5hbWUgQ2FjaGVNYXhTdHJlYW1pbmdCdWZmZXIgdG8gTUNhY2hlTWF4U3RyZWFtaW5nQnVmZmVyLiBNb3ZlCiAgICAgaW1wbGVtZW50YXRpb24gb2YgTUNhY2hlTWF4U3RyZWFtaW5nQnVmZmVyIGZyb20gbW9kX2NhY2hlIHRvCiAgICAgbW9kX21lbV9jYWNoZS4gTUNhY2hlTWF4U3RyZWFtaW5nQnVmZmVyIG5vdyBkZWZhdWx0cyB0byB0aGUKICAgICBsZXNzZXIgb2YgMTAwLDAwMCBieXRlcyBvciBNQ2FjaGVNYXhDYWNoZU9iamVjdFNpemUuIFRoaXMgc2hvdWxkIAogICAgIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3IgZXhwbGljaXRseSBjb2RpbmcgTUNhY2hlTWF4U3RyZWFtaW5nQnVmZmVyCiAgICAgaW4gbW9zdCBjb25maWd1cmF0aW9ucy4gW0JpbGwgU3RvZGRhcmRdCgogICopIG1vZF9jYWNoZTogRml4IFBSIDE1MTEzLCBhIGNvcmUgZHVtcCBpbiBjYWNoZV9pbl9maWx0ZXIgd2hlbgogICAgIGEgcmVkaXJlY3Qgb2NjdXJzLiBUaGUgY29kZSB3YXMgcGFzc2luZyBhIGZvcm1hdCBzdHJpbmcgYW5kCiAgICAgaW50ZWdlciB0byBhcHJfcHN0cmNhdC4gQ2hhbmdlZCB0byBhcHJfcHNwcmludGYuCiAgICAgW1BhdWwgSi4gUmVkZXJdCgogICopIFJlcGxhY2UgQVBVX0hBU19MREFQU1NMX0NMSUVOVF9JTklUIHdpdGggQVBVX0hBU19MREFQX05FVFNDQVBFX1NTTAogICAgIGFzIHNldCBieSBhcHItdXRpbCBpbiB1dGlsX2xkYXAuYy4gVGhpcyBzaG91bGQgYWxsb3cgbW9kX2xkYXAKICAgICB0byB3b3JrIHdpdGggdGhlIE5ldHNjYXBlL01vemlsbGEgTERBUCBsaWJyYXJ5LiBb2Hl2aW4gU/htbWUKICAgICA8c29tbWUgb3Nsby53ZXN0ZXJuZ2Vjby5zbGIuY29tPiwgR3JhaGFtIExlZ2dldHRdCgogICopIEZpeCBjcml0aWNhbCBidWcgaW4gbmV3IC0tZW5hYmxlLXY0LW1hcHBlZCBjb25maWd1cmUgb3B0aW9uCiAgICAgaW1wbGVtZW50YXRpb24gd2hpY2ggYnJva2UgSVB2NCBsaXN0ZW5pbmcgc29ja2V0cyBvbiBzb21lCiAgICAgc3lzdGVtcy4gIFtoaXJveXVraSBoYW5haSA8aGFuYWkgaW1nc3JjLmNvLmpwPl0KCiAgKikgbW9kX3NldGVudmlmOiBGaXggQnJvd3Nlck1hdGNoTm9DYXNlIHN1cHBvcnQgZm9yIG5vbi1yZWdleAogICAgIHBhdHRlcm5zIFtBbmRy6SBNYWxvIDxuZCBwZXJsaWcuZGU+XQoKICAqKSBBZGQgdmVyc2lvbiBzdHJpbmcgdG8gcHJvdmlkZXIgQVBJLiAgW0p1c3RpbiBFcmVua3JhbnR6XQogCiAgKikgYnVpbGQ6ICcuL2NvbmZpZ3VyZSAmJiBtYWtlJyBub3cgd29ya3Mgd2l0aG91dCBhbiBpbi10cmVlCiAgICAgYXByIGFuZCBhcHItdXRpbC4gW1dpbGZyZWRvIFNhbmNoZXpdCgogICopIG1vZF9uZWdvdGlhdGlvbjogU2V0IHRoZSBhcHByb3ByaWF0ZSBtaW1lIHJlc3BvbnNlIGhlYWRlcnMKICAgICAoQ29udGVudC1UeXBlLCBjaGFyc2V0LCBDb250ZW50LUxhbmd1YWdlIGFuZCBDb250ZW50LUVuY29kaW5nKQogICAgIGZvciBuZWdvdGF0ZWQgdHlwZS1tYXAgIkJvZHk6IiByZXNwb25zZXMgKHN1Y2ggYXMgdGhlIGVycm9yCiAgICAgcGFnZXMuKSAgW0FuZHLpIE1hbG8gPG5kIHBlcmxpZy5kZT5dCgogICopIG1vZF9sb2dfY29uZmlnOiBBbGxvdyAnJSUnIGVzY2FwaW5nIGluIEN1c3RvbUxvZyBmb3JtYXQKICAgICBzdHJpbmdzIHRvIGluc2VydCBhIGxpdGVyYWwsIHNpbmdsZSAnJScuCiAgICAgW0FuZHLpIE1hbG8gPG5kIHBlcmxpZy5kZT5dCgogICopIG1vZF9hdXRvaW5kZXg6IEFkZERlc2NyaXB0aW9uIGRpcmVjdGl2ZXMgZm9yIGRpcmVjdG9yaWVzCiAgICAgbm93IHdvcmsgYXMgaW4gQXBhY2hlIDEuMywgd2hlcmUgbm8gdHJhaWxpbmcgJy8nIGlzCiAgICAgc3BlY2lmaWVkIG9uIHRoZSBkaXJlY3RvcnkgbmFtZS4gIFByZXZpb3VzbHksIHRoZSB0cmFpbGluZwogICAgICcvJyAqaGFkKiB0byBiZSBzcGVjaWZpZWQsIHdoaWNoIHdhcyBpbmNvbXBhdGlibGUgd2l0aAogICAgIEFwYWNoZSAxLjMuICBQUiA3OTkwICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggZm9yIFBSIDE0NTU2LiBUaGUgZXhwaXJ5IGNhbGN1bGF0aW9ucyBpbiBtb2RfY2FjaGUgd2VyZQogICAgIHRyeWluZyB0byBwZXJmb3JtICJub3cgKyAoKGRhdGUgLSBsYXN0bW9kKSAqIGZhY3RvcikiIHdoZXJlCiAgICAgZGF0ZSA9PSBsYXN0bW9kIHJlc3VsdGluZyBpbiAibm93ICsgMCIuIFRoZSBjb2RlIG5vdyBmb2xsb3dzCiAgICAgdGhlIGVsc2UgcGF0aCAodXNpbmcgdGhlIGRlZmF1bHQgZXhwaXJhdGlvbikgaWYgZGF0ZSBpcwogICAgIGVxdWFsIHRvIGxhc3Rtb2QuIFtTZXJnZXkgPHJ4IGFybXN0cmlrZS5jb20+LCBQYXVsIEouIFJlZGVyXQoKICAqKSBVc2UgQVBfREVDTEFSRSBpbiB0aGUgZGVidWcgdmVyc2lvbnMgb2YgYXBfc3RyWFhYIGluIGNhc2UgdGhlCiAgICAgZGVmYXVsdCBjYWxsaW5nIGNvbnZlbnRpb24gaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBvbmUgdXNlZCBieQogICAgIEFQX0RFQ0xBUkUuICBbSnVhbiBSaXZlcmEgPEp1YW4uUml2ZXJhIGNpdHJpeC5jb20+XQoKICAqKSBtb2RfY2FjaGU6IERvbid0IGNhY2hlIHJlc3BvbnNlIGhlYWRlciBmaWVsZHMgZGVzaWduYXRlZAogICAgIGFzIGhvcC1ieS1ob3AgaGVhZGVycyBpbiBIVFRQLzEuMSAoUkZDIDI2MTYgU2VjdGlvbiAxMy41LjEpLgogICAgIFtFc3RyYWRlIE1hdHRoaWV1IDxlc3RyYWRlLW0gaWZyYW5jZS5jb20+LCBCcmlhbiBQYW5lXQoKICAqKSBtb2RfY2dpZDogSGFuZGxlIGVudmlyb25tZW50IHZhcmlhYmxlcyBjb250YWluaW5nIG5ld2xpbmVzLgogICAgIFBSIDE0NTUwICBbUGlvdHIgQ3plamtvd3NraSA8YXBhY2hlIGN6YXJueS5ldS5vcmc+LCBKZWZmCiAgICAgVHJhd2lja10KCiAgKikgTW92ZSBtb2RfZXh0X2ZpbHRlciBvdXQgb2YgZXhwZXJpbWVudGFsIGFuZCBpbnRvIGZpbHRlcnMuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgRml4ZWQgYSBtZW1vcnkgbGVhayBpbiBtb2RfZGVmbGF0ZSB3aXRoIGR5bmFtaWMgY29udGVudC4KICAgICBQUiAxNDMyMSAgW0tlbiBGcmFua2VuIDxrZnJhbmtlbiBkZWNpc2lvbm1hcmsuY29tPl0KCiAgKikgQWRkIC0tW2VuYWJsZXxkaXNhYmxlXS12NC1tYXBwZWQgY29uZmlndXJlIG9wdGlvbiB0byBjb250cm9sCiAgICAgd2hldGhlciBvciBub3QgQXBhY2hlIGV4cGVjdHMgdG8gaGFuZGxlIElQdjQgY29ubmVjdGlvbnMKICAgICBvbiBJUHY2IGxpc3RlbmluZyBzb2NrZXRzLiAgRWl0aGVyIHNldHRpbmcgd2lsbCB3b3JrIG9uIAogICAgIHN5c3RlbXMgd2l0aCB0aGUgSVBWNl9WNk9OTFkgc29ja2V0IG9wdGlvbi4gIC0tZW5hYmxlLXY0LW1hcHBlZAogICAgIG11c3QgYmUgdXNlZCBvbiBzeXN0ZW1zIHRoYXQgYWx3YXlzIGFsbG93IElQdjQgY29ubmVjdGlvbnMgb24KICAgICBJUHY2IGxpc3RlbmluZyBzb2NrZXRzLiAgUFIgMTQwMzcgKEJ1Z3ppbGxhKSwgUFIgNzQ5MiAoR25hdHMpCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgVGhpcyBmaXhlcyBhIHByb2JsZW0gd2hlcmUgdGhlIHVuZGVybHlpbmcgY2FjaGUgY29kZQogICAgIGluZGljYXRlZCB0aGF0IHRoZXJlIHdhcyBvbmUgbW9yZSBlbGVtZW50IG9uIHRoZSBjYWNoZQogICAgIHRoYW4gdGhlcmUgYWN0dWFsbHkgd2FzLiBUaGlzIGhhcHBlbmVkIHNpbmNlIGVsZW1lbnQgMAogICAgIGV4aXN0cyBidXQgaXMgbm90IHVzZWQuIFRoaXMgY29kZSBhbGxvY2F0ZXMgdGhlIGNvcnJlY3QKICAgICBudW1iZXIgb2YgdXNlYWJsZSBlbGVtZW50cyBhbmQgcmVwb3J0cyB0aGUgbnVtYmVyIG9mCiAgICAgYWN0dWFsbHkgdXNlZCBlbGVtZW50cy4gVGhlIHByZXZpb3VzIGNvZGUgb25seSBhbGxvd2VkCiAgICAgTUNhY2hlTWF4T2JqZWN0Q291bnQtMSBvYmplY3RzIHRvIGJlIHN0b3JlZCBpbiB0aGUKICAgICBjYWNoZS4gW1BhdWwgSi4gUmVkZXJdCgogICopIG1vZF9zZXRlbnZpZjogQWRkIFNFUlZFUl9BRERSIHNwZWNpYWwga2V5d29yZCB0byBhbGxvdwogICAgIGVudmFyaWFibGUgc2V0dGluZyBhY2NvcmRpbmcgdG8gdGhlIHNlcnZlciBJUCBhZGRyZXNzCiAgICAgd2hpY2ggcmVjZWl2ZWQgdGhlIHJlcXVlc3QuICBbS2VuIENvYXJdCgogICopIG1vZF9jZ2lkOiBUZXJtaW5hdGUgQ0dJIHNjcmlwdHMgd2hlbiB0aGUgY2xpZW50IGNvbm5lY3Rpb24gCiAgICAgZHJvcHMuICBQUiA4Mzg4ICBbSmVmZiBUcmF3aWNrXQoKICAqKSBSZWFycmFuZ2UgT3BlblNTTCBlbmdpbmUgaW5pdGlhbGl6YXRpb24gdG8gc3VwcG9ydCBSQU5EIAogICAgIHJlZGlyZWN0aW9uIG9uIGNyeXB0byBhY2NlbGVyYXRvci4gCiAgICAgW0ZyZWRlcmljIERPTk5BVCA8ZnJlZGVyaWMuZG9ubmF0IHplbmNvZC5jb20+XQoKICAqKSBBbHdheXMgZW1pdCBWYXJ5IGhlYWRlciBpZiBtb2RfZGVmbGF0ZSBpcyBpbnZvbHZlZCBpbiB0aGUKICAgICByZXF1ZXN0LiAgW0FuZHJlIE1hbG8gPG5kIHBlcmxpZy5kZT5dCgogICopIG1vZF9pc2FwaTogU3RvcCB1bnNldHRpbmcgdGhlICdlbXB0eScgcXVlcnkgc3RyaW5nIHJlc3VsdCB3aXRoCiAgICAgYSBOVUxMIGFyZ3VtZW50IGluIGVjYi0+bHBzelF1ZXJ5U3RyaW5nLCBlbGltaW5hdGluZyBzZWdmYXVsdHMKICAgICBmb3Igc29tZSBJU0FQSSBtb2R1bGVzLiAgUFIgMTQzOTkKICAgICBbRGV0bGV2IFZlbmR0IDxkZXRsZXYudmVuZHQgYnJpbGxpdC5kZT5dCgogICopIG1vZF9pc2FwaTogRml4IGFuIGlzc3VlIHdoZXJlIHRoZSBIU0VfUkVRX0RPTkVfV0lUSF9TRVNTSU9OCiAgICAgbm90aWZpY2F0aW9uIGlzIHJlY2VpdmVkIGJlZm9yZSB0aGUgSHR0cEV4dGVuc2lvblByb2MoKSByZXR1cm5zIAogICAgIEhTRV9TVEFUVVNfUEVORElORy4gIFRoaXMgb25seSBhZmZlY3RlZCBpc2FwaSAuZGxsJ3MgY29uZmlndXJlZCAKICAgICB3aXRoIHRoZSBJU0FQSUZha2VBc3luYyBvbiBkaXJlY3RpdmUuICBQUiAxMTkxOAogICAgIFtKb2huIERlU2V0dG8gPGpkZXNldHRvIHJhZGlhbnRzeXN0ZW1zLmNvbT4sIFdpbGxpYW0gUm93ZV0KCiAgKikgbW9kX2lzYXBpOiBGaXggdGhlIGlzc3VlIHdoZXJlIGFsbCByZXN1bHRzIGZyb20gbW9kX2lzYXBpIHdvdWxkCiAgICAgcnVuIHRocm91Z2ggdGhlIGNvcmUgZGllIGhhbmRsZXIgcmVzdWx0aW5nIGluIGludmFsaWQgcmVzcG9uc2VzCiAgICAgb3IgYWNjZXNzIGxvZyBlbnRyaWVzLiAgUFIgMTAyMTYgW1dpbGxpYW0gUm93ZV0KCiAgKikgSW1wcm92ZXMgdGhlIHVzZXIgZnJpZW5kbGluZXNzIG9mIHRoZSBDYWNoZVJvb3QgcHJvY2Vzc2luZwogICAgIG92ZXIgbXkgbGFzdCBwYXNzLiBUaGlzIHZlcnNpb24gYXZvaWRzIHRoZSBwb29sIGFsbG9jYXRpb25zCiAgICAgYnV0IGRvZXNuJ3QgYXZvaWQgYWxsIG9mIHRoZSBydW50aW1lIGNoZWNrcy4gSXQgbm8gbG9uZ2VyCiAgICAgdGVybWluYXRlcyBkdXJpbmcgcG9zdC1jb25maWcgcHJvY2Vzc2luZy4gQW4gZXJyb3IgaXMgbG9nZ2VkCiAgICAgb25jZSBwZXIgd29ya2VyLCBpbmRpY2F0aW5nIHRoYXQgdGhlIENhY2hlUm9vdCBuZWVkcyB0byBiZSBzZXQuCiAgICAgW1BhdWwgSi4gUmVkZXJdCgogICopIEZpeCBhIGJ1ZyB3aGVyZSB3ZSBrZWVwIGZpbGVzIG9wZW4gdW50aWwgdGhlIGVuZCBvZiBhIAogICAgIGtlZXBhbGl2ZSBjb25uZWN0aW9uLCB3aGljaCBjYW4gcmVzdWx0IGluOgogICAgICgyNClUb28gbWFueSBvcGVuIGZpbGVzOiBmaWxlIHBlcm1pc3Npb25zIGRlbnkgc2VydmVyIGFjY2VzcwogICAgIGVzcGVjaWFsbHkgb24gdGhyZWFkZWQgc2VydmVycy4gIFtHcmVnIEFtZXMsIEplZmYgVHJhd2lja10KCiAgKikgRml4IGEgYnVnIGluIHdoaWNoIG1vZF9wcm94eSBzZW50IGFuIGludmFsaWQgQ29udGVudC1MZW5ndGgKICAgICB3aGVuIGEgcHJveGllZCBVUkwgd2FzIGludm9rZWQgYXMgYSBzZXJ2ZXItc2lkZSBpbmNsdWRlIHdpdGhpbgogICAgIGEgcGFnZSBnZW5lcmF0ZWQgaW4gcmVzcG9uc2UgdG8gYSBmb3JtIFBPU1QuICBbQnJpYW4gUGFuZV0KCiAgKikgQWRkZWQgY29kZSB0byBwcm9jZXNzIG1pbiBhbmQgbWF4IGZpbGUgc2l6ZSBkaXJlY3RpdmVzIGFuZCB0bwogICAgIGluaXQgdGhlIGV4cGlyeWNoayBmbGFnIGluIG1vZF9kaXNrX2NhY2hlLiBBZGRlZCBhIGNsYXJpZnlpbmcKICAgICBjb21tZW50IHRvIGNhY2hlX3V0aWwuICAgW1BhdWwgSi4gUmVkZXJdCgogICopIFRoZSB2YWx1ZSBlbWl0dGVkIGJ5IFNlcnZlclNpZ25hdHVyZSBub3cgbWltaWNzIHRoZSBTZXJ2ZXIgSFRUUAogICAgIGhlYWRlciBhcyBjb250cm9sbGVkIGJ5IFNlcnZlclRva2Vucy4gIFtGcmFuY2lzIERhbHkgPGRldmEgZGFvaW5lLm9yZz5dCgogICopIEdyYWNlZnVsbHkgaGFuZGx5IHJldHJ5IHNpdHVhdGlvbnMgaW4gdGhlIFNTTCBpbnB1dCBmaWx0ZXIsCiAgICAgYnkgZm9sbG93aW5nIHRoZSBTU0wgbGlicmFyaWVzJyByZXRyeSBzZW1hbnRpY3MuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgVGVybWluYXRlIENHSSBzY3JpcHRzIHdoZW4gdGhlIGNsaWVudCBjb25uZWN0aW9uIGRyb3BzLiAgVGhpcwogICAgIGZpeCBvbmx5IGFwcGxpZXMgdG8gc29tZSBub3JtYWwgcGF0aHMgaW4gbW9kX2NnaS4gIG1vZF9jZ2lkCiAgICAgaXMgc3RpbGwgYnVzdGVkLiAgUFIgODM4OCAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IGEgYnVnIHdoZXJlIDQxNiAiUmFuZ2Ugbm90IHNhdGlzZmlhYmxlIiB3YXMgYmVpbmcKICAgICByZXR1cm5lZCBmb3IgY29udGVudCB0aGF0IHNob3VsZCBoYXZlIGJlZW4gcmVkaXJlY3RlZC4KICAgICBbR3JlZyBBbWVzXQoKICAqKSBGaXggbWVtb3J5IGxlYWsgaW4gbW9kX3NzbCBmcm9tIGludGVybmFsIFNTTCBsaWJyYXJ5IGFsbG9jYXRpb25zCiAgICAgd2l0aGluIFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZSBhbmQgWDUwOV9nZXRfcHVia2V5LgogICAgIFtadmkgSGFyJ0VsIDxybCBtYXRoLnRlY2huaW9uLmFjLmlsPgogICAgICBNYWRodXN1ZGFuIE1hdGhpaGFsbGkgPG1hZGh1c3VkYW5fbWF0aGloYWxsaSBocC5jb20+XS4KCiAgKikgbW9kX3NzbCB1c2VzIGZyZWUoKSBpbmFwcHJvcHJpYXRlbHkgaW4gc2V2ZXJhbCBwbGFjZXMsIHRvIGZyZWUKICAgICBtZW1vcnkgd2hpY2ggaGFzIGJlZW4gcHJldmlvdXNseSBhbGxvY2F0ZWQgaW5zaWRlIE9wZW5TU0wuCiAgICAgU3VjaCBtZW1vcnkgc2hvdWxkIGJlIGZyZWVkIHdpdGggT1BFTlNTTF9mcmVlKCksIG5vdCB3aXRoIGZyZWUoKS4KICAgICBbTmFkYXYgSGFyJ0VsIDxueWggbWF0aC50ZWNobmlvbi5hYy5pbD4sCiAgICAgIE1hZGh1c3VkYW4gTWF0aGloYWxsaSA8bWFkaHVzdWRhbl9tYXRoaWhhbGxpIGhwLmNvbT5dLgoKICAqKSBFbWl0IGEgbWVzc2FnZSB0byB0aGUgZXJyb3IgbG9nIHdoZW4gd2UgcmV0dXJuIDQwNCBiZWNhdXNlCiAgICAgdGhlIFVSSSBjb250YWluZWQgJyUyZicuICAoVGhpcyB3YXMgcHJldmlvdXNseSBuYXN0aWx5IHNpbGVudAogICAgIGFuZCBkaWZmaWN1bHQgdG8gZGVidWcuKSAgW0tlbiBDb2FyXQoKICAqKSBGaXggc3RyZWFtaW5nIG91dHB1dCBmcm9tIGFuIG5waC0gQ0dJIHNjcmlwdC4gIENHSTpJUkMgbm93CiAgICAgd29ya3MuICBQUiA4NDgyICBbSmVmZiBUcmF3aWNrXQoKICAqKSBNb3JlIGFjY3VyYXRlIGxvZ2dpbmcgb2YgYnl0ZXMgc2VudCBpbiBtb2RfbG9naW8gd2hlbgogICAgIHRoZSBjbGllbnQgdGVybWluYXRlcyB0aGUgY29ubmVjdGlvbiBiZWZvcmUgdGhlIHJlc3BvbnNlCiAgICAgaXMgY29tcGxldGVseSBzZW50ICBbQm9qYW4gU21vanZlciA8Ym9qYW4gcmV4dXJzaXZlLmNvbT5dCgogICopIEZpeCBzb21lIHByb2JsZW1zIGluIHRoZSBwZXJjaGlsZCBNUE0uICAKICAgICBbSm9uYXMgRXJpa3Nzb24gPGpvbmFzIHdlYmtvbnN1bHRlcm5hLmNvbT5dCgogICopIENoYW5nZSB0aGUgQ2FjaGVSb290IHByb2Nlc3NpbmcgdG8gY2hlY2sgZm9yIGEgcmVxdWlyZWQKICAgICB2YWx1ZSBhdCBjb25maWcgdGltZS4gVGhpcyBzYXZlcyBhIGxvdCBvZiB3YXN0ZWQgcHJvY2Vzc2luZwogICAgIGlmIHRoZSBtb2RfZGlza19jYWNoZSBtb2R1bGUgaXMgbG9hZGVkIGJ1dCBubyBDYWNoZVJvb3QKICAgICB3YXMgcHJvdmlkZWQuIFRoaXMgZml4IGFsc28gYWRkcyBjb2RlIHRvIGxvZyBhbiBlcnJvcgogICAgIGFuZCBhdm9pZCB1c2VsZXNzIHBhbGxvY3MgYW5kIHByb2Nlc2luZyB3aGVuIHRoZSBjb21wdXRlZAogICAgIGNhY2hlIGZpbGUgbmFtZSBjYW5ub3QgYmUgb3BlbmVkLiBUaGlzIGFsc28gdXBkYXRlcyB0aGUKICAgICBkb2NzIGFjY29yZGluZ2x5LiAgW1BhdWwgSi4gUmVkZXJdCgogICopIEludHJvZHVjZSB0aGUgRW5hYmxlU2VuZGZpbGUgZGlyZWN0aXZlLCBhbGxvd2luZyB1c2VycyBvZiBORlMgCiAgICAgc2hhcmVzIHRvIGRpc2FibGUgc2VuZGZpbGUgbWVjaGFuaWNzIHdoZW4gdGhleSBlaXRoZXIgZmFpbAogICAgIG91dHJpZ2h0IG9yIHByb3ZpZGUgaW50ZXJtaXRhbnRseSBjb3JydXB0ZWQgZGF0YS4gIFBSIAogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIFJlc29sdmUgdGhlIGVycm9yICJBbiBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBzb21ldGhpbmcgCiAgICAgdGhhdCBpcyBub3QgYSBzb2NrZXQuICA6IHdpbm50X2FjY2VwdDogQWNjZXB0RXggZmFpbGVkLiAKICAgICBBdHRlbXB0aW5nIHRvIHJlY292ZXIuIiBmb3IgdXNlcnMgb2YgdmFyaW91cyBmaXJld2FsbCBhbmQKICAgICBhbnRpLXZpcnVzIHNvZnR3YXJlIG9uIFdpbmRvd3MuICBQUiA4MzI1ICBbV2lsbGlhbSBSb3dlXQoKICAqKSBBZGQgdGhlIFByb3h5QmFkSGVhZGVyIGRpcmVjdGl2ZSwgd2hpY2ggZ2l2ZXMgdGhlIGFkbWluIHNvbWUKICAgICBjb250cm9sIG9uIGhvdyBtb2RfcHJveHkgc2hvdWxkIGhhbmRsZSBib2d1cyBIVFRQIGhlYWRlcnMgZnJvbQogICAgIHByb3hpZWQgc2VydmVycy4gVGhpcyBhbGxvd3MgMi4wIHRvICJlbXVsYXRlIiAxLjMncyBiZWhhdmlvciBpZgogICAgIGRlc2lyZWQuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBDaGFuZ2UgdGhlIExEQVAgbW9kdWxlcyB0byBleHBvcnQgdGhlaXIgc3ltYm9scyBjb3JyZWN0bHkKICAgICBkdXJpbmcgYSBXaW5kb3dzIGJ1aWxkLiBBZGQgZHNwIGZpbGVzIGZvciBXaW5kb3dzLiBVcGRhdGUKICAgICBSRUFETUUubGRhcCBmaWxlIGZvciBXaW5kb3dzIGJ1aWxkIGluc3RydWN0aW9ucy4KICAgICBbQW5kcmUgU2NoaWxkIDxBLlNjaGlsZCBhYXJib2FyZC5jaD5dCgogICopIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBmb3IgdGhlIGNvZGUgdGhhdCBnZW5lcmF0ZXMgSFRUUAogICAgIHJlc3BvbnNlIGhlYWRlcnMgIFtCcmlhbiBQYW5lXQoKICAqKSBBZGQgLVMgYXMgYSBzeW5vbnltIGZvciAtdCAtRERVTVBfVkhPU1RTLgogICAgIFtUaG9tIE1heSA8dGhvbSBwbGFuZXRhcnl0cmFtcC5uZXQ+XQoKICAqKSBGaXggYSBidWcgd2l0aCBkYm0gcmV3cml0ZSBtYXBzIHdoaWNoIGNhdXNlZCB0aGUgd3JvbmcgdmFsdWUgdG8KICAgICBiZSB1c2VkIHdoZW4gdGhlIGtleSB3YXMgbm90IGZvdW5kIGluIHRoZSBkYm0uICBQUiAxMzIwNAogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBhIHByb2JsZW0gd2l0aCBzdHJlYW1pbmcgc2NyaXB0IG91dHB1dCBhbmQgbW9kX2NnaWQuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgQWRkIGFwX3JlZ2lzdGVyX3Byb3ZpZGVyL2FwX2xvb2t1cF9wcm92aWRlciBBUEkuCiAgICAgW0pvaG4gSy4gU3RlcmxpbmcgPGpvaG4gc3RlcmxzLmNvbT4sIEp1c3RpbiBFcmVua3JhbnR6XQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuNDMKCiAgKikgU0VDVVJJVFk6IENWRS0yMDAyLTA4NDAgKGN2ZS5taXRyZS5vcmcpCiAgICAgSFRNTC1lc2NhcGUgdGhlIGFkZHJlc3MgcHJvZHVjZWQgYnkgYXBfc2VydmVyX3NpZ25hdHVyZSgpIGFnYWluc3QKICAgICB0aGlzIGNyb3NzLXNpdGUgc2NyaXB0aW5nIHZ1bG5lcmFiaWxpdHkgZXhwb3NlZCBieSB0aGUgZGlyZWN0aXZlCiAgICAgJ1VzZUNhbm9uaWNhbE5hbWUgT2ZmJy4gIEFsc28gSFRNTC1lc2NhcGUgdGhlIFNFUlZFUl9OQU1FCiAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yIENHSSBhbmQgU1NJIHJlcXVlc3RzLiAgSXQncyBzYWZlIHRvCiAgICAgZXNjYXBlIGFzIG9ubHkgdGhlICc8JywgJz4nLCBhbmQgJyYnIGNoYXJhY3RlcnMgYXJlIGFmZmVjdGVkLAogICAgIHdoaWNoIHdvbid0IGFwcGVhciBpbiBhIHZhbGlkIGhvc3RuYW1lLiAgUmVwb3J0ZWQgYnkgTWF0dGhldwogICAgIE11cnBoeSA8bWF0dG11cnBoeSBrYy5yci5jb20+LiAgW0JyaWFuIFBhbmVdCgogICopIEZpeCBhIGNvcmUgZHVtcCBpbiBtb2RfY2FjaGUgd2hlbiBpdCBhdHRlbXRwZWQgdG8gc3RvcmUgdW5jb3B5YWJsZQogICAgIGJ1Y2tldHMuIFRoaXMgaGFwcGVuZWQsIGZvciBpbnN0YW5jZSwgd2hlbiBhIGZpbGUgdG8gYmUgY2FjaGVkCiAgICAgY29udGFpbmVkIFNTSSB0YWdzIHRvIGV4ZWN1dGUgYSBDR0kgc2NyaXB0IChwYXNzZWQgYXMgYSBwaXBlCiAgICAgYnVja2V0KS4gW1BhdWwgSi4gUmVkZXJdCgogICopIEVuc3VyZSB0aGF0IG91dHB1dCBhbHJlYWR5IGF2YWlsYWJsZSBpcyBmbHVzaGVkIHRvIHRoZSBuZXR3b3JrCiAgICAgd2hlbiB0aGUgY29udGVudC1sZW5ndGggZmlsdGVyIHJlYWxpemVzIHRoYXQgbm8gbmV3IG91dHB1dCB3aWxsCiAgICAgYmUgYXZhaWxhYmxlIGZvciBhIHdoaWxlLiAgVGhpcyBoZWxwcyBzb21lIHN0cmVhbWluZyBDR0lzIGFzCiAgICAgd2VsbCBhcyBzb21lIG90aGVyIGR5bmFtaWNhbGx5LWdlbmVyYXRlZCBjb250ZW50LiAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IGEgbXV0ZXggcHJvYmxlbSBpbiBtb2Rfc3NsIHNlc3Npb24gY2FjaGUgc3VwcG9ydCB3aGljaAogICAgIGNvdWxkIGxlYWQgdG8gYW4gaW5maW5pdGUgbG9vcC4gIFBSIDEyNzA1ICAKICAgICBbQW11bmQgRWxzdGFkIDxhbXVuZC5lbHN0YWQgZXJnby5ubz4sIEplZmYgVHJhd2lja10KCiAgKikgU0VDVVJJVFk6IENWRS0yMDAyLTExNTYgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4IHRoZSBleHBvc3VyZSBvZiBDR0kgc291cmNlIHdoZW4gYSBQT1NUIHJlcXVlc3QgaXMgc2VudCB0byAKICAgICBhIGxvY2F0aW9uIHdoZXJlIGJvdGggREFWIGFuZCBDR0kgYXJlIGVuYWJsZWQuIFtSeWFuIEJsb29tXQoKICAqKSBBbGxvdyB0aGUgVXNlckRpciBkaXJlY3RpdmUgdG8gYWNjZXB0IGEgbGlzdCBvZiBkaXJlY3Rvcmllcy4KICAgICBUaGlzIG1hdGNoZXMgd2hhdCBBcGFjaGUgMS4zIGRvZXMuICBBbHNvIGFkZCBkb2N1bWVudGF0aW9uIGZvcgogICAgIHRoaXMgZmVhdHVyZS4gW0pheSBCYWxsIDxqYXkgdmVnZ2llc3BhbS5jb20+XQoKICAqKSBOZXcgTW9kdWxlOiBtb2RfbG9naW8uIGFkZHMgdGhlIGFiaWxpdHkgdG8gbG9nIGJ5dGVzIHNlbnQgYW5kCiAgICAgcmVjZWl2ZWQuIFtCb2phbiBTbW9qdmVyIDxib2phbiByZXh1cnNpdmUuY29tPl0KCiAgKikgU3VFeGVjIG5lZWRzIHRvIHVzZSB0aGUgc2FtZSBkZWZhdWx0IGRpcmVjdG9yeSBhcyB0aGUgcmVzdCBvZgogICAgIHNlcnZlciwgbmFtZWx5IC91c3IvbG9jYWwvYXBhY2hlMi4gIAogICAgIFtTYW5nQmVvbSBoYW4gPHNiaGFuIG9zLmtvcmVhLmFjLmtyPl0KCiAgKikgR2V0IG1vZF9hdXRoX2xkYXAgdG8gcmV0cnkgY29ubmVjdGlvbnMgb24gTERBUF9TRVJWRVJfRE9XTi4KICAgICBbVGhvbWFzIEJlbm5ldHQgPHRob21hcy5iZW5uZXR0IGVkcy5jb20+LCBHcmFoYW0gTGVnZ2V0dF0KCiAgKikgTWFrZSBzdXJlIHRoZSBjb250ZW50cyBvZiB0aGUgV1dXLUF1dGhlbnRpY2F0ZSBoZWFkZXIgaXMKICAgICBwYXNzZWQgb24gYSA0eHggZXJyb3IgYnkgcHJveHkuIFByZXZpb3VzbHkgYWxsIGhlYWRlcnMKICAgICB3ZXJlIGRyb3BwZWQsIHJlc3VsdGluZyBpbiB0aGUgYnJvd3NlciBiZWluZyB1bmFibGUgdG8KICAgICBhdXRoZW50aWNhdGUuIFtEciBSaWNoYXJkIFJlaW5lciA8cnJlaW5lciBmc2NpbnRlcm5ldC5jb20+LAogICAgIFJpY2hhcmQgRGFuaWVsbGkgPHJkYW5pZWxsaSBmc2NpbnRlcm5ldC5jb20+LCBHcmFoYW0gV2lzZW1hbgogICAgIDxnd2lzZW1hbiBmc2NpbnRlcm5ldC5jb20+LCBEYXZpZCBIZW5kZXJzb24KICAgICA8ZGhlbmRlcnNvbiBmc2NpbnRlcm5ldC5jb20+XQoKICAqKSBNYWtlIG1vZF9jYWNoZSdzIENhY2hlTWF4U3RyZWFtaW5nQnVmZmVyIGRpcmVjdGl2ZSB3b3JrCiAgICAgcHJvcGVybHkgZm9yIHZpcnR1YWwgaG9zdHMgdGhhdCBvdmVycmlkZSBzZXJ2ZXItd2lkZSBtb2RfY2FjaGUKICAgICBzZXR0dGluZ3MuICBbTWF0dGhpZXUgRXN0cmFkZSA8ZXN0cmFkZS1tIGlmcmFuY2UuY29tPl0KCiAgKikgQWRkIC1wIG9wdGlvbiB0byBhcHhzIHRvIGFsbG93IHByb2dyYW1zIHRvIGJlIGNvbXBpbGVkIHdpdGggYXB4cy4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC40MgoKICAqKSBtb2RfZGF2OiBDaGVjayBmb3IgdmVyc2lvbmluZyBob29rcyBiZWZvcmUgdXNpbmcgdGhlbS4KICAgICBbR3JlZyBTdGVpbl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjQxCgogICopIFRoZSBwcm90b2NvbCB2ZXJzaW9uIChlZzogSFRUUC8xLjEpIGluIHRoZSByZXF1ZXN0IGxpbmUgcGFyc2luZwogICAgIGlzIG5vdyBjYXNlIGluc2Vuc2l0aXZlLiBbSmltIEphZ2llbHNraV0KCiAgKikgQWxsb3cgQWRkT3V0cHV0RmlsdGVyQnlUeXBlIHRvIGFkZCBtdWx0aXBsZSBmaWx0ZXJzIHBlciBkaXJlY3RpdmUuCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBSZW1vdmUgd2FybmluZ3Mgd2l0aCBTdW4ncyBGb3J0ZSBjb21waWxlci4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRml4ZWQgbW9kX2Rpc2tfY2FjaGUncyBnZW5lcmF0aW9uIG9mIDMwNHMKICAgICBbS3JpcyBWZXJiZWVjayA8S3Jpcy5WZXJiZWVjayB1Yml6ZW4uY29tPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHVzaW5nIGZubWF0Y2ggcGF0dGVybnMgaW4gdGhlIGZpbmFsIHBhdGgKICAgICBzZWdtZW50IG9mIGFuIEluY2x1ZGUgc3RhdGVtZW50IChlZy4uIGluY2x1ZGUgL2Zvby9iYXIvKi5jb25mKS4KICAgICBhbmQgcmVtb3ZlIHRoZSBub2lzZSBvbiBzdGRlcnIgZHVyaW5nIGNvbmZpZyBkaXIgcHJvY2Vzc2luZy4KICAgICBbSm9lIE9ydG9uIDxqb3J0b24gcmVkaGF0LmNvbT5dCgogICopIG1vZF9jYWNoZTogY2FjaGVfc3RvcmFnZS5jLiBBZGQgdGhlIGhvc3RuYW1lIGFuZCBhbnkgcmVxdWVzdAogICAgIGFyZ3MgdG8gdGhlIGtleSBnZW5lcmF0ZWQgZm9yIGNhY2hpbmcuIFRoaXMgcHJvdmlkZXMgYSB1bmlxdWUKICAgICBrZXkgZm9yIGVhY2ggdmlydHVhbCBob3N0IGFuZCBmb3IgZWFjaCByZXF1ZXN0IHdpdGggdW5pcXVlCiAgICAgYXJncy4gW1BhdWwgSi4gUmVkZXIsIGFyZ3MgY29kZSBwcm92aWRlZCBieSBLcmlzIFZlcmJlZWNrXQoKICAqKSBtb2RfY2FjaGU6IERvIG5vdCBjYWNoZSByZXNwb25zZXMgdG8gR0VUIHJlcXVlc3RzIHdpdGggcXVlcnkKICAgICBVUkxzIGlmIHRoZSBvcmlnaW4gc2VydmVyIGRvZXMgbm90IGV4cGxpY2l0bHkgcHJvdmlkZSBhbgogICAgIEV4cGlyZXMgaGVhZGVyIG9uIHRoZSByZXNwb25zZSAoUkZDIDI2MTYgU2VjdGlvbiAxMy45KQogICAgIFtLcmlzIFZlcmJlZWNrIDxrcmlzdiBiZS51Yml6ZW4uY29tPl0KCiAgKikgRml4IG1lbW9yeSBsZWFrIGluIGNvcmVfb3V0cHV0X2ZpbHRlci4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgVXBkYXRlIE9wZW5TU0wgZGV0ZWN0aW9uIHRvIHdvcmsgb24gRGFyd2luLgogICAgIFtTYW5kZXIgVGVtbWUgPHNjdGVtbWUgY292YWxlbnQubmV0Pl0KCiAgKikgVXBkYXRlIHRoZSB4c2x0IGFuZCBjc3MgdG8gZ2l2ZSB0aGUgZG9jdW1lbnRhdGlvbiBhIG1vcmUKICAgICBtb2Rlcm4gc3R5bGUuCiAgICAgW0FuZHLpIE1hbG8gPG5kIHBlcmxpZy5kZT4sIEdlcm5vdCBXaW5rbGVyIDxncmVoIG8zbWVkaWEuZGU+XQoKICAqKSBGaXggc29tZSBidWNrZXQgbWVtb3J5IGxlYWtzIGluIHRoZSBjaHVua2luZyBjb2RlCiAgICAgW0pvZSBTY2hhZWZlciA8am9lK2FwYWNoZSBzdW5zdGFyc3lzLmNvbT5dCgogICopIEFkZCBNb2RNaW1lVXNlUGF0aEluZm8gZGlyZWN0aXZlLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBtb2RfY2FjaGU6IGFkZGVkIHN1cHBvcnQgZm9yIGNhY2hpbmcgc3RyZWFtZWQgcmVzcG9uc2VzIChwcm94eSwKICAgICBDR0ksIGV0Yykgd2l0aCBvcHRpb25hbCBDYWNoZU1heFN0cmVhbWluZ0J1ZmZlciBzZXR0aW5nIFtCcmlhbiBQYW5lXQoKICAqKSBBZGQgaW1hZ2UveC1pY29uIHRvIGh0dHBkLmNvbmYgUFIgMTA5OTMuCiAgICAgW0lhbiBIb2xzbWFuLCBQZXRlciBCaWVyaW5nZXIgPHBiIGJpZXJpbmdlci5kZT5dCgogICopIEZpeCBGaWxlRVRhZ3Mgbm9uZSBvcGVyYXRpb24uICBQUiAxMjIwNy4KICAgICBbSnVzdGluIEVyZW5rcmFudHosIEFuZHJldyBIbyA8YW5kcmV3IHRlbGxtZS5jb20+XQoKICAqKSBSZXN0b3JlZCB0aGUgZXhwZXJpbWVudGFsIGxlYWRlci9mb2xsb3dlcnMgTVBNIHRvIHdvcmtpbmcKICAgICBjb25kaXRpb24gYW5kIGNvbnZlcnRlZCBpdHMgdGhyZWFkIHN5bmNocm9uaXphdGlvbiBmcm9tCiAgICAgbXV0ZXhlcyB0byBhdG9taWMgQ0FTLiAgW0JyaWFuIFBhbmVdCgogICopIEZpeCBMb2dpYyBvbiBub24taHRtbCBmaWxlIHJlbW92YWwgaW4gbW9kX2RlZmxhdGUKICAgICBbS3JpcyBWZXJiZWVjayA8S3Jpcy5WZXJiZWVjayB1Yml6ZW4uY29tPl0KCiAgKikgRml4ICJhYiAtZyIncyB0cnVuY2F0ZWQgeWVhcjogdGhlIGxhc3QgZGlnaXQgd2FzIGN1dCBvZmYuCiAgICAgW0xlb24gQnJvY2FyZCA8YWNtZSBhc3RyYXkuY29tPl0KCiAgKikgbW9kX3Jld3JpdGUgY2FuIG5vdyBzZXRzIGNvb2tpZXMgaW4gZXJyX2hlYWRlcnMsIHVzZXMgdGhlIGNvcnJlY3QKICAgICBleHBpcnkgZGF0ZSwgYW5kIGNhbiBub3cgc2V0IHRoZSBwYXRoIGFzIHdlbGwKICAgICBQUiAxMjEzMiwxMjE4MSwxMjE3Mi4KICAgICBbSWFuIEhvbHNtYW4gLyBSb2IgQ3JvbXdlbGwgPGFwYWNoZWNoYW5nZWxvZyByb2Jjcm9td2VsbC5jb20+XQoKICAqKSBUaGUgY29udGVudC1sZW5ndGggZmlsdGVyIG5vIGxvbmdlciB0cmllcyB0byBidWZmZXIgdXAKICAgICB0aGUgZW50aXJlIG91dHB1dCBvZiBhIGxvbmctcnVubmluZyByZXF1ZXN0IGJlZm9yZSBzZW5kaW5nCiAgICAgYW55dGhpbmcgdG8gdGhlIGNsaWVudC4gIFtCcmlhbiBQYW5lXQoKICAqKSBXaW4zMjogTG93ZXIgdGhlIGRlZmF1bHQgc3RhY2sgc2l6ZSBmcm9tIDFNQiB0byAyNTZLLiBUaGlzIHdpbGwKICAgICBhbGxvdyBhcm91bmQgODAwMCB0aHJlYWRzIHRvIGJlIHN0YXJ0ZWQgcGVyIGNoaWxkIHByb2Nlc3MuIAogICAgICdFRElUQklOIC9TVEFDSzpzaXplIGFwYWNoZS5leGUnIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGlzIAogICAgIHZhbHVlIGRpcmVjdGx5IGluIHRoZSBhcGFjaGUuZXhlIGV4ZWN1dGFibGUuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIFdpbjMyOiBJbXBsZW1lbnQgVGhyZWFkTGltaXQgZGlyZWN0aXZlIGluIHRoZSBXaW5kb3dzIE1QTS4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgUmVtb3ZlIENhY2hlT24gY29uZmlnIGRpcmVjdGl2ZSBzaW5jZSBpdCBpcyBzZXQgYnV0IG5ldmVyIGNoZWNrZWQuCiAgICAgTm8gc2Vuc2Ugd2FzdGluZyBjeWNsZXMgb24gdW51c2VkIGNvZGUuIEJlc2lkZXMsIHRoZSBvbmx5IHRydWx5CiAgICAgYnVnIGZyZWUgY29kZSBpcyBkZWxldGVkIGNvZGUuIDopICAgW1BhdWwgSi4gUmVkZXJdCgogICopIEJ1ZmZlckxvZ3MgYXJlIG5vdyBydW4tdGltZSBlbmFibGVkLCBhbmQgdGhlIGxvZ19jb25maWcgbm93IGhhcyAyIG5ldwogICAgIGNhbGxiYWNrcyB0byBhbGxvdyBhIDNyZCBwYXJ0eSBtb2R1bGUgdG8gYWN0dWFsbHkgZG8gdGhlIHdyaXRpbmcgb2YgdGhlCiAgICAgbG9nIGZpbGUgW0lhbiBIb2xzbWFuXQoKICAqKSBDb3JyZWN0IElTQVBJUmVhZEFoZWFkQnVmZmVyIHRvIGRlZmF1bHQgdG8gNDkxNTIsIHBlciBtb2RfaXNhcGkgZG9jcy4KICAgICBbQW5kcukgTWFsbywgQXN0cmlkIEtl32xlciA8a2VzcyBrZXNzLW5ldC5kZT5dCgogICopIEZpeCBTZWdmYXVsdCBpbiBtb2RfY2FjaGUuIFtLcmlzIFZlcmJlZWNrIDxLcmlzLlZlcmJlZWNrIHViaXplbi5jb20+XQoKICAqKSBGaXggYSBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2UgaW4gdGhlIG1lcmdlX2Vudl9kaXJfY29uZmlncwogICAgIGZ1bmN0aW9uIG9mIHRoZSBtb2RfZW52IG1vZHVsZS4gUFIgMTE3OTEKICAgICBbUGF1bCBKLiBSZWRlcl0KCiAgKikgTmV3IG9wdGlvbiB0byBTZXJ2ZXJUb2tlbnMgJ21haltvcl0nLiBPbmx5IHNob3cgdGhlIG1ham9yIHZlcnNpb24KICAgICBBbHNvIFN1cmZhY2VkIHRoaXMgZGlyZWN0aXZlIGluIHRoZSBzdGFuZGFyZCBjb25maWcgKGRlZmF1bHQgRlVMTCkKICAgICBbSWFuIEhvbHNtYW5dCgogICopIENoYW5nZSBtb2RfcmV3cml0ZSB0byB1c2UgYXByLXV0aWwncyBkYm0gc3VwcG9ydCBmb3IgZGJtIHJld3JpdGUKICAgICBtYXBzLiAgVGhlIGRibSB0eXBlIChlLmcuLCBuZGJtLCBnZGJtKSBjYW4gYmUgc3BlY2lmaWVkIG9uIHRoZQogICAgIFJld3JpdGVNYXAgZGlyZWN0aXZlLiAgUFIgMTA2NDQgIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeGVkIG1vZF9yZXdyaXRlJ3MgUmV3cml0ZU1hcCBwcmc6IHN1cHBvcnQgc28gdGhhdCByZXF1ZXN0L3Jlc3BvbnNlCiAgICAgcGFpcnMgd2lsbCBubyBsb25nZXIgZ2V0IG91dCBvZiBzeW5jIHdpdGggZWFjaCBvdGhlci4gIFBSIDk1MzQKICAgICBbQ2xpZmYgV29vbGxleV0KCiAgKikgRml4ZXMgcmVxdWlyZWQgdG8gZ2V0IHF1b3RlZCBhbmQgZXNjYXBlZCBjb21tYW5kIGFyZ3Mgd29ya2luZyBpbgogICAgIG1vZF9leHRfZmlsdGVyLiBQUiAxMTc5MyBbUGF1bCBKLiBSZWRlcl0KCiAgKikgbW9kLXByb3h5OiBoYW5kbGUgcHJveGllZCByZXNwb25zZXMgd2l0aCBubyBzdGF0dXMgbGluZXMKICAgICBbSkQgU2lsdmVzdGVyIDxqc2lsdmVzIHV3by5jYT4sIEJyZXR0IEh1dHRsZXkgPGJyZXR0IGh1dHRsZXkubmV0Pl0KCiAgKikgRml4IGJ1ZyB3aGVyZSBlbnZpcm9ubWVudCBvciBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGNvbnRhaW5pbmcgCiAgICAgbm9uLUFTQ0lJLTcgY2hhcmFjdGVycyB3b3VsZCBjYXVzZSB0aGUgV2luMzIgY2hpbGQgcHJvY2VzcyBjcmVhdGlvbgogICAgIHRvIGZhaWwuICBQUiAxMTg1NCAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQnVnICMxMTIxMy4uIG1ha2UgbW9kdWxlIGxvYWRpbmcgZXJyb3IgbWVzc2FnZXMgbW9yZSBpbmZvcm1hdGl2ZSAKICAgICBbSWFuIERhcndpbiA8SWFuNzc5IGRhcndpbnN5cy5jb20+XQoKICAqKSB0aHJlYWQgc2FmZXR5ICYgcHJveHktZnRwIFtBbGV4ZXkgUGFuY2hlbmtvIDxhbGV4ZXkgbGl3ZXN0LnJ1PiwgSWFuIEhvbHNtYW5dCgogICopIG1vZF9kaXNrX2NhY2hlIHdvcmtzIG11Y2ggYmV0dGVyLiBUaGlzIG1vZHVsZSBzaG91bGQgc3RpbGwKICAgICBiZSBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbC4gW0VyaWMgUHJ1ZCdob21tZWF1eF0KCiAgKikgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgZm9yIGtlZXBhbGl2ZSByZXF1ZXN0czogd2hlbiBzZXR0aW5nCiAgICAgYXNpZGUgYSBzbWFsbCBmaWxlIGZvciBwb3RlbnRpYWwgY29uY2F0ZW5hdGlvbiB3aXRoIHRoZSBuZXh0CiAgICAgcmVzcG9uc2Ugb24gdGhlIGNvbm5lY3Rpb24sIHNldCBhc2lkZSB0aGUgZmlsZSBkZXNjcmlwdG9yIHJhdGhlcgogICAgIHRoYW4gY29weWluZyB0aGUgZmlsZSBpbnRvIHRoZSBoZWFwLiAgW0JyaWFuIFBhbmVdCgogICopIE1vZGlmaWVkIHZlcnNpb24gY2hlY2sgb24gb3BlbnNzbCBzbyB0aGF0IGl0IGZpbmRzIHRoZSBleGVjdXRhYmxlCiAgICAgZmlyc3QgYW5kIHRoZW4gcGVyZm9ybXMgYSBjaGVjayBvZiB0aGUgdmVyc2lvbiwgb25seSB3YXJuaW5nIHRoZQogICAgIHVzZXIgaWYgdGhleSBjaG9zZSwgb3Igd2Ugc2VsZWN0ZWQsIGFuIG9sZCB2ZXJzaW9uIG9mIE9wZW5TU0wuCiAgICAgVGhpcyBjaGFuZ2UgYWxzbyBhbGxvd3MgdGhlIGNvZGUgdG8gd29yayBmb3Igbm9uLW9wZW5zc2wgbGlicmFyaWVzCiAgICAgc2VsZWN0ZWQgdmlhIHRoZSAtLXdpdGgtc3NsPWRpciBvcHRpb24sIHdoaWNoIGNhbiBvdmVycmlkZSB0aGUKICAgICBhdXRvbWF0ZWQgbGlicmFyeSBjaGVjayBpbiBhbnkgY2FzZS4gIFtSb3kgRmllbGRpbmddCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC40MAoKICAqKSBTRUNVUklUWTogQ0FOLTIwMDItMDY2MSAoY3ZlLm1pdHJlLm9yZykgCiAgICAgQ2xvc2UgYSB2ZXJ5IHNpZ25pZmljYW50IHNlY3VyaXR5IGhvbGUgdGhhdCAKICAgICBhcHBsaWVzIG9ubHkgdG8gdGhlIFdpbjMyLCBPUzIgYW5kIE5ldHdhcmUgcGxhdGZvcm1zLiAgVW5peCB3YXMgbm90IAogICAgIGFmZmVjdGVkLCBDeWd3aW4gbWF5IGJlIGFmZmVjdGVkLiAgQ2VydGFpbiBVUklzIHdpbGwgYnlwYXNzIHNlY3VyaXR5CiAgICAgYW5kIGFsbG93IHVzZXJzIHRvIGludm9rZSBvciBhY2Nlc3MgYW55IGZpbGUgZGVwZW5kaW5nIG9uIHRoZSBzeXN0ZW0gCiAgICAgY29uZmlndXJhdGlvbi4gIFdpdGhvdXQgdXBncmFkaW5nLCBhIHNpbmdsZSAuY29uZiBjaGFuZ2Ugd2lsbCBjbG9zZSAKICAgICB0aGUgdnVsbmVyYWJpbGl0eS4gIEFkZCB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZSBpbiB0aGUgZ2xvYmFsIHNlcnZlcgogICAgIGh0dHBkLmNvbmYgY29udGV4dCBiZWZvcmUgYW55IG90aGVyIEFsaWFzIG9yIFJlZGlyZWN0IGRpcmVjdGl2ZXM7CiAgICAgICAgIFJlZGlyZWN0TWF0Y2ggNDAwICJcXFwuXC4iCiAgICAgUmVwb3J0ZWQgYnkgQXVyaWVtbWEgTHVpZ2kgPGJ1Z3Rlc3Qgc2l0b3ZlcmRlLmNvbT4uCiAgICAgW0JyYWQgTmljaG9sZXNdCgogICopIFNFQ1VSSVRZOiBDQU4tMjAwMi0wNjU0IChjdmUubWl0cmUub3JnKQogICAgIENsb3NlIGEgcGF0aC1yZXZlYWxpbmcgZXhwb3N1cmUgaW4gbXVsdGl2aWV3IHR5cGUKICAgICBtYXAgbmVnb3RpYXRpb24gKHN1Y2ggYXMgdGhlIGRlZmF1bHQgZXJyb3IgZG9jdW1lbnRzKSB3aGVyZSB0aGUKICAgICBtb2R1bGUgd291bGQgcmVwb3J0IHRoZSBmdWxsIHBhdGggb2YgdGhlIHR5cGVtYXBwZWQgLnZhciBmaWxlIHdoZW4KICAgICBtdWx0aXBsZSBkb2N1bWVudHMgb3Igbm8gZG9jdW1lbnRzIGNvdWxkIGJlIHNlcnZlZCBiYXNlZCBvbiB0aGUgbWltZQogICAgIG5lZ290aWF0aW9uLiAgUmVwb3J0ZWQgYnkgQXVyaWVtbWEgTHVpZ2kgPGJ1Z3Rlc3Qgc2l0b3ZlcmRlLmNvbT4uCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgU0VDVVJJVFk6IENBTi0yMDAyLTA2NTQgKGN2ZS5taXRyZS5vcmcpCiAgICAgQ2xvc2UgYSBwYXRoLXJldmVhbGluZyBleHBvc3VyZSBpbiBjZ2kvY2dpZCB3aGVuIHdlIAogICAgIGZhaWwgdG8gaW52b2tlIGEgc2NyaXB0LiAgVGhlIG1vZHVsZXMgd291bGQgcmVwb3J0ICJjb3VsZG4ndCBjcmVhdGUgCiAgICAgY2hpbGQgcHJvY2VzcyAvcGF0aC10by1zY3JpcHQvc2NyaXB0LnBsIiByZXZlYWxpbmcgdGhlIGZ1bGwgcGF0aAogICAgIG9mIHRoZSBzY3JpcHQuICBSZXBvcnRlZCBieSBKaW0gUmFjZSA8anJhY2UgcXVhbHlzLmNvbT4uCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIFNldCBhc2lkZSB0aGUgYXByLWljb252IGFuZCBhcHJfeGxhdGUoKSBmZWF0dXJlcyBmb3IgdGhlIFdpbjMyCiAgICAgYnVpbGQgb2YgMi4wLjQwIHNvIGRldmVsb3BtZW50IGNhbiBiZSBjb21wbGV0ZWQuICBBIHBhdGNoLCBmcm9tCiAgICAgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2h0dHBkL3BhdGNoZXMvYXBwbHlfdG9fMi4wLjQwLz4KICAgICB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgdGhvc2UgdGhhdCB3aXNoIHRvIHdvcmsgd2l0aCBhcHItaWNvbnYuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRml4IHByb3h5IHNvIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gYWNjZXNzIGZ0cDogVVJMcyB2aWEgYSBwcm94eQogICAgIGNoYWluLiBbUGV0ZXIgVmFuIEJpZXNlbiA8cGV0ZXIudmFuYmllc2VuIHZsYWZvLmJlPl0KCiAgKikgbW9kLWRlZmxhdGUgbm93IGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCAnZ3ppcC1vbmx5LXRleHQvaHRtbCcgaXMKICAgICBzZXQgdG8gMSwgc28gd2UgY2FuIGV4Y2x1ZGUgdGhpbmdzIGZyb20gdGhlIGdlbmVyYWwgY2FzZSB3aXRoCiAgICAgYnJvd3Nlcm1hdGNoLiBbSWFuIEhvbHNtYW4sIEFuZHJlIFNjaGlsZCA8QS5TY2hpbGQgYWFyYm9hcmQuY2g+XQogIAogICopIEFjY2VwdCBtdWx0aXBsZSBsZWFkaW5nIC8ncyBmb3IgcmVxdWVzdHMgd2l0aGluIHRoZSBEb2N1bWVudFJvb3QuCiAgICAgUFIgMTA5NDYgIFtXaWxsaWFtIFJvd2UsIERhdmlkIFNoYW5lIEhvbGRlbiA8ZHBlamVzaCB5YWhvby5jb20+XQoKICAqKSBTb2x2ZWQgdGhlIHJlcG9ydHMgb2YgLnBkZiBieXRlcmFuZ2UgZmFpbHVyZXMgb24gV2luMzIgYWxvbmUuCiAgICAgQVBSJ3Mgc2VuZGZpbGUgZm9yIHRoZSB3aW4zMiBwbGF0Zm9ybSBjb2xsYXBzZXMgaGVhZGVyIGFuZCB0cmFpbGVyCiAgICAgYnVmZmVycyBpbnRvIGEgc2luZ2xlIGJ1ZmZlci4gIEhvd2V2ZXIsIHdlIGRlc3Ryb3llZCB0aGUgcG9pbnRlcnMKICAgICB0byB0aGUgaGVhZGVyIGJ1ZmZlciBpZiBhIHRyYWlsZXIgYnVmZmVyIHdhcyBwcmVzZW50LiAgUFIgMTA3ODEKICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBtb2RfZXh0X2ZpbHRlcjogQWRkIHRoZSBhYmlsaXR5IHRvIGVuYWJsZSBvciBkaXNhYmxlIGEgZmlsdGVyIHZpYQogICAgIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLiAgQWRkIHRoZSBhYmlsaXR5IHRvIHJlZ2lzdGVyIGEgZmlsdGVyIG9mCiAgICAgdHlwZSBvdGhlciB0aGFuIEFQX0ZUWVBFX1JFU09VUkNFLiAgW0plZmYgVHJhd2lja10KCiAgKikgUmVzdG9yZSB0aGUgYWJpbGl0eSB0byBzcGVjaWZ5IGhvc3QgbmFtZXMgb24gTGlzdGVuIGRpcmVjdGl2ZXMuCiAgICAgUFIgMTEwMzAuICBbSmVmZiBUcmF3aWNrLCBEYXZpZCBTaGFuZSBIb2xkZW4gPGRwZWplc2ggeWFob28uY29tPl0KCiAgKikgV2hlbiBkZWNpZGluZyBvbiB0aGUgZGVmYXVsdCBhZGRyZXNzIGZhbWlseSBmb3IgbGlzdGVuaW5nIHNvY2tldHMsIAogICAgIG1ha2Ugc3VyZSB3ZSBjYW4gYWN0dWFsbHkgYmluZCB0byBhbiBBRl9JTkVUNiBzb2NrZXQgYmVmb3JlCiAgICAgZGVjaWRpbmcgdGhhdCB3ZSBzaG91bGQgZGVmYXVsdCB0byBBRl9JTkVUNi4gIFRoaXMgZml4ZXMgYSBzdGFydHVwCiAgICAgcHJvYmxlbSBvbiBjZXJ0YWluIGxldmVscyBvZiBPcGVuVU5JWC4gIFBSIDEwMjM1LiAgW0plZmYgVHJhd2lja10KCiAgKikgUmVwbGFjZSB1c2FnZSBvZiBhdG9sKCkgdG8gcGFyc2Ugc3RyaW5ncyB3aGVuIHdlIG1pZ2h0IHdhbnQgYQogICAgIGxhcmdlci10aGFuLWxvbmcgdmFsdWUgd2l0aCBhcHJfYXRvbGwoKSwgd2hpY2ggcmV0dXJucyBsb25nIGxvbmcuCiAgICAgVGhpcyBhbGxvd3MgSFRUUEQgdG8gZGVhbCB3aXRoIGxhcmdlciBmaWxlcyBjb3JyZWN0bHkuCiAgICAgW1NoYW50b251IFNlbiA8c3NlbiBhcHBsZS5jb20+XQoKICAqKSBtb2RfZXh0X2ZpbHRlcjogSWdub3JlIGFueSBjb250ZW50LXR5cGUgcGFyYW1ldGVycyB3aGVuIGNoZWNraW5nIGlmCiAgICAgdGhlIHJlc3BvbnNlIHNob3VsZCBiZSBmaWx0ZXJlZC4gIFByZXZpb3VzbHksICJpbnR5cGU9dGV4dC9odG1sIgogICAgIHdvdWxkbid0IG1hdGNoIHNvbWV0aGluZyBsaWtlICJ0ZXh0L2h0bWw7Y2hhcnNldD04ODU5XzEiLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIG1vZF9leHRfZmlsdGVyOiBTZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBleHRlcm5hbCBwcm9ncmFtcy4KICAgICBbQ3JhaWcgU2ViZW5payA8Y3JhaWcgbmV0YXBwLmNvbT5dCgogICopIE1vZGlmaWVkIHRoZSBIVFRQX0lOIGZpbHRlciB0byBpbW1lZGlhdGVseSBhcHBlbmQgdGhlIEVPUyAoZW5kIG9mCiAgICAgc3RyZWFtKSBidWNrZXQgZm9yIEMtTCBQT1NUIGJvZGllcywgc2F2aW5nIGEgcm91bmR0cmlwIGFuZCBhbGxvd2luZwogICAgIHRoZSBjYWxsZXIgdG8gZGV0ZXJtaW5lIHRoYXQgbm8gY29udGVudCByZW1haW5zIHdpdGhvdXQgcHJlZmV0Y2hpbmcKICAgICBhZGRpdGlvbmFsIFBPU1QgYm9keS4gIFtXaWxsaWFtIFJvd2VdCgogICopIEdldCBwcm94eSBmdHAgdG8gd29yayBvdmVyIElQdjYuICBbU2hvaWNoaSBTYWthbmUgPHNha2FuZSBrYW1lLm5ldD5dCgogICopIExvb2sgZm9yIE9wZW5TU0wgbGlicmFyaWVzIGluIC91c3IvbGliNjQuICBbUGV0ZXIgUG9lbWwgPHBvZW1sIHN1c2UuZGU+XQoKICAqKSBVcGRhdGUgU3VTRSBsYXlvdXQuICBbUGV0ZXIgUG9lbWwgPHBvZW1sIHN1c2UuZGU+XQoKICAqKSBDaGFuZ2VzIHRvIHRoZSBpbnRlcm5hdGlvbmFsaXplZCBlcnJvciBkb2N1bWVudHM6CiAgICAgQ29tbWVudCB0aGVtIG91dCBpbiB0aGUgZGVmYXVsdCBjb25maWcgZmlsZSB0byBtYWtlIHRoZSBkZWZhdWx0CiAgICAgaW5zdGFsbCBhcyBzaW1wbGUgYXMgcG9zc2libGU7IENvcnJlY3QgdGhlIGVuZ2xpc2ggNTAwIGVycm9yIHRvCiAgICAgYmUgbW9yZSB1bmRlcnN0YW5kYWJsZTsgQWRkIGEgU3dlZGlzaCB0cmFuc2xhdGlvbi4KICAgICBbVGhvbWFzIFNqb2dyZW4gPHRob21hcyBub3J0aGVybnNlY3VyaXR5Lm5ldD4sIAogICAgICBFcmlrIEFiZWxlIDxlcmlrIGNvZGVmYWt0b3IuZGU+LCBSaWNoIEJvd2VuLCBKb3NodWEgU2xpdmVdCiAgICAgCiAgKikgSW5jcmVhc2UgdGhlIGxpbWl0IG9uIGZpbGUgZGVzY3JpcHRvcnMgcGVyIHByb2Nlc3MgaW4gYXBhY2hlY3RsLgogICAgIFtCcmlhbiBQYW5lXQoKICAqKSBGaXggYSBkZXBlbmRlbmN5IGVycm9yIHdoZW4gYnVpbGRpbmcgQXBhY2hlTW9uaXRvciwgc28gdGhhdCBXaW4zMgogICAgIGFuZCBNU1ZDIG5vdyB0cnVzdCB0aGF0IHRoZSBwcm9qZWN0IGlzIGN1cnJlbnQgKHdoZW4gaXQgaXMpLgogICAgIFtKYW1lcyBDb3ggPGltYWplcyBwaHAubmV0Pl0KCiAgKikgbW9kX2V4dF9maWx0ZXI6IGRvbid0IHNlZ2ZhdWx0IGlmIGNvbnRlbnQtdHlwZSBpcyBub3Qgc2V0LiAgUFIgMTA2MTcuCiAgICAgW0FydGh1ciBQLiBTbWl0aCA8YXBzbWl0aCBhcHMub3JnPiwgSmVmZiBUcmF3aWNrXQoKICAqKSBBUFItVXRpbCBSZW5hbWVzIHBlbmRpbmcgaGF2ZSBiZWVuIGNvbXBsZXRlZCBbVGhvbSBNYXldCgogICopIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBmb3IgdGhlIGNvZGUgdGhhdCByZWFkcyByZXF1ZXN0CiAgICAgaGVhZGVycyAoYXBfcmdldGxpbmVfY29yZSgpIGFuZCByZWxhdGVkIGZ1bmN0aW9ucykgIFtCcmlhbiBQYW5lXQoKICAqKSBBZGQgYSBuZXcgZGlyZWN0aXZlOiBNYXhNZW1GcmVlLiAgTWF4TWVtRnJlZSBtYWtlcyBpdCBwb3NzaWJsZQogICAgIHRvIGNvbmZpZ3VyZSB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHRoZSBhbGxvY2F0b3JzIHdpbGwKICAgICBob2xkIG9uIHRvIGZvciByZXVzZS4gIEFueXRoaW5nIG92ZXIgdGhlIE1heE1lbUZyZWUgdGhyZXNob2xkCiAgICAgd2lsbCBiZSBmcmVlKClkLiAgVGhpcyBkaXJlY3RpdmUgaXMgdXNlZnVsIHdoZW4gdW5jb21tb24gbGFyZ2UKICAgICBwZWFrcyBvY2N1ciBpbiBtZW1vcnkgdXNhZ2UuICBJdCBzaG91bGQgX25vdF8gYmUgdXNlZCB0byBtYXNrCiAgICAgZGVmZWN0aXZlIG1vZHVsZXMnIG1lbW9yeSB1c2UuICBbU2FuZGVyIFN0cmlrZXJdCgogICopIEZpeGVkIHRoZSBDb250ZW50LUxlbmd0aCBmaWx0ZXIgc28gdGhhdCBIVFRQLzEuMCByZXF1ZXN0cyB0byBDR0kKICAgICBzY3JpcHRzIHdvdWxkIG5vdCByZXN1bHQgaW4gYSB0cnVuY2F0ZWQgcmVzcG9uc2UuCiAgICAgW1J5YW4gQmxvb20sIEp1c3RpbiBFcmVua3JhbnR6LCBDbGlmZiBXb29sbGV5XQoKICAqKSBBZGQgYSBmaWx0ZXJfaW5pdCBwYXJhbWV0ZXIgdG8gdGhlIGZpbHRlciByZWdpc3RyYXRpb24gZnVuY3Rpb25zCiAgICAgc28gdGhhdCBhIGZpbHRlciBjYW4gZXhlY3V0ZSBhcmJpdHJhcnkgY29kZSBiZWZvcmUgdGhlIGhhbmRsZXJzCiAgICAgYXJlIGludm9rZWQuICBUaGlzIHJlc29sdmVzIGEgcHJvYmxlbSB3aGVyZSBtb2RfaW5jbHVkZSByZXF1ZXN0cwogICAgIHdvdWxkIGluY29ycmVjdGx5IHJldHVybiBhIDMwNC4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRml4IGEgbG9uZy1zdGFuZGluZyBidWcgaW4gMi4wLCBDR0kgc2NyaXB0cyB3ZXJlIGJlaW5nIGNhbGxlZAogICAgIHdpdGggcmVsYXRpdmUgcGF0aHMgaW5zdGVhZCBvZiBhYnNvbHV0ZSBwYXRocy4gIEFwYWNoZSAxLjMgdXNlZAogICAgIGFic29sdXRlIHBhdGhzIGZvciBldmVyeXRoaW5nIGV4Y2VwdCBmb3IgU3VFeGVjLCB0aGlzIGJyaW5ncyBiYWNrCiAgICAgdGhhdCBzdGFuZGFyZC4gIFtSeWFuIEJsb29tXQoKICAqKSBGaXggaW5maW5pdGUgbG9vcCBkdWUgdG8gdHdvIEhUVFBfSU4gZmlsdGVycyBiZWluZyBwcmVzZW50IGZvcgogICAgIGludGVybmFsbHkgcmVkaXJlY3RlZCByZXF1ZXN0cy4gIFBSIDEwMTQ2LiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBTd2l0Y2ggY29ubl9yZWMtPmtlZXBhbGl2ZSB0byBhbiBlbnVtZXJhdGlvbiByYXRoZXIgdGhhbiBhIGJpdGZpZWxkLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRml4IG1vZF9leHRfZmlsdGVyIHRvIGxvb2sgaW4gdGhlIG1haW4gc2VydmVyIGZvciBmaWx0ZXIgZGVmaW5pdGlvbnMKICAgICB3aGVuIHJ1bm5pbmcgaW4gYSB2aG9zdCBpZiB0aGUgZmlsdGVyIGRlZmluaXRpb24gaXMgbm90IGZvdW5kIGluCiAgICAgdGhlIHZob3N0LiAgUFIgMTAxNDcgIFtKZWZmIFRyYXdpY2tdCgogICopIFN1cHBvcnQgV2luTlQgQ0dJIGludm9jYXRpb24gdGhyb3VnaCBTY3JpcHRJbnRlcnByZXRlclNvdXJjZSAKICAgICAncmVnaXN0cnknIGZvciBzY3JpcHQgaW50ZXJwcmV0ZXIgcGF0aHMgYW5kIG5hbWVzIHdpdGggbm9uLWFzY2lpCiAgICAgY2hhcmFjdGVycyBpbiB0aGUgZXhlY3V0YWJsZSBmaWxlcGF0aC4gIFtXaWxsaWFtIFJvd2VdCgogICopIFN1cHBvcnQgdGhlIC13IGZsYWcgb24gdG8ga2VlcCB0aGUgV2luMzIgY29uc29sZSBvcGVuIG9uIGVycm9yLgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIE5vcm1hbGl6ZSB0aGUgaG9zdG5hbWUgdmFsdWUgaW4gdGhlIHJlcXVlc3RfcmVjIHRvIGFsbC1sb3dlcmNhc2UKICAgICBbUGVycnkgSGFycmluZ3RvbiA8cGVkd2FyZCB3ZWJjb20uY29tPl0KCiAgKikgRml4IFdpbk5UIGNnaSA1MDAgZXJyb3JzIHdoZW4gUVVFUllfQVJHUyBvciBvdGhlciBzdHJpbmdzIGluY2x1ZGUKICAgICBleHRlbmRlZCBjaGFyYWN0ZXJzIChub24gVVMtQVNDSUkpIGluIG5vbi11dGY4IGZvcm1hdC4gIFRoaXMgYnJpbmdzCiAgICAgV2luMzIgYmFjayBpbnRvIENHSS8xLjEgY29tcGxpYW5jZSwgYW5kIGxlYXZlcyBjaGFyc2V0IGRlY29kaW5nIHVwCiAgICAgdG8gdGhlIGNnaSBhcHBsaWNhdGlvbiBpdHNlbGYuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBNYWpvciBvdmVyaGF1bCBvZiBtb2RfZGF2LCBtb2RfZGF2X2ZzIGFuZCB0aGUgZXhwZXJpbWVudGFsL2NhY2hlCiAgICAgbW9kdWxlcyB0byBicmluZyB0aGVtIHVwIHRvIHRoZSBjdXJyZW50IGFwci9hcHItdXRpbCBBUElzLgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIEZpeCBzZWdmYXVsdCBpbiBtb2RfbWVtX2NhY2hlIG1vc3QgZnJlcXVlbnRseSBvYnNlcnZlZCB3aGVuCiAgICAgc2VydmluZyB0aGUgc2FtZSBmaWxlIHRvIG11bHRpcGxlIGNsaWVudHMgb24gYW4gTVAgbWFjaGluZS4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgbW9kX3Jld3JpdGUgY2FuIG5vdyBzZXQgY29va2llcyAgKFJld3JpdGVSdWxlICguKikgLSBbQ089bmFtZTokMTouZG9tYWluXSkKICAgICBbQnJpYW4gRGVnZW5oYXJkdCA8Ym1kIG1wMy5jb20+LCBJYW4gSG9sc21hbl0KCiAgKikgRml4IHBlcmNoaWxkIHRvIHdvcmsgd2l0aCBhcGFjaGVjdGwgYnkgYWRkaW5nIC1rIHN1cHBvcnQgdG8gcGVyY2hpbGQuCiAgICAgUFIgMTAwNzQgIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBhIHNpbGx5IGh0cGFzc3dkLmMgbG9naWMgZXJyb3IgdGhhdCBpbmNvcnJlY3RseSByZXBvcnRlZCB0aGF0CiAgICAgYm90aCAtYyBhbmQgLW4gaGFkIGJlZW4gdXNlZC4gIFBSIDk5ODkgIFtDbGlmZiBXb29sbGV5XQoKICAqKSBGaXhlZCBhIG1vZF9pbmNsdWRlIGVycm9yIGNhc2UgaW4gd2hpY2ggbm8gSFRUUCByZXNwb25zZSB3YXMgc2VudAogICAgIHRvIHRoZSBjbGllbnQgaWYgYW4gc2h0bWwgZG9jdW1lbnQgY29udGFpbmVkIGFuIHVudGVybWluYXRlZCBTU0kKICAgICBkaXJlY3RpdmUgW0JyaWFuIFBhbmVdCgogICopIEltcHJvdmUgYXBfZ2V0X2NsaWVudF9ibG9jayBpbXBsZW1lbnRhdGlvbiBieSB1c2luZyBBUFItdXRpbCBicmlnYWRlCiAgICAgaGVscGVyIGZ1bmN0aW9ucyBhbmQgcmVseWluZyBvbiBjdXJyZW50IGZpbHRlciBhc3N1bXB0aW9ucy4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4zOQoKICAqKSBGaXhlZCBhIGJ1aWxkIHByb2JsZW0gaW4gaHRwYXNzd2QuYyBvbiBXaW4zMi4KICAgICBbR3VlbnRlciBLbmF1ZiA8ZWZsYXNoIGdteC5uZXQ+LCBDbGlmZiBXb29sbGV5XQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMzgKCiAgKikgUmV3cml0ZSBodHBhc3N3ZCB0byB1c2UgQVBSLiAgVGhlIHJlbW92ZXMgdGhlIGFubm95aW5nIHdhcm5pbmcgYWJvdXQKICAgICB0bXBuYW0gYmVpbmcgdW5zYWZlLiAgIFtSeWFuIEJsb29tXQoKICAqKSBXZSBtdXN0IHNldCB0aGUgTUlNRS10eXBlIGZvciAuc2h0bWwgZmlsZXMgdG8gdGV4dC9odG1sIGlmIHdlIHdhbnQgdGhlbQogICAgIHRvIGJlIHBhcnNlZCBmb3IgU1NJIHRhZ3MuICBBZGQgdGhlIGNvbmZpZyBmb3IgdGhhdCB0byB0aGUgZGVmYXVsdCAKICAgICBjb25maWcgZmlsZSBzbyB0aGF0IGl0IGlzIGVhc2llciB0byBlbmFibGUgLnNodG1sIHBhcnNpbmcuCiAgICAgW0RhdmUgRHllciA8ZGR5ZXIgcmVhbC1tZS5uZXQ+XQoKICAqKSBGaXhlZCBhIHByb2JsZW0gd2l0aCAnbWFrZSBpbnN0YWxsJyBvbiBSZWxpYW50VW5peC4KICAgICBbSmVhbi1mcmVkZXJpYyBDbGVyZSA8amZyZWRlcmljLmNsZXJlIGZ1aml0c3Utc2llbWVucy5jb20+XQoKICAqKSBNYWtlIHRoZSBkZWZhdWx0X2hhbmRsZXIgY2F0Y2ggYWxsIHJlcXVlc3RzIHRoYXQgYXJlbid0IHNlcnZlZCBieQogICAgIGFub3RoZXIgaGFuZGxlci4gIFRoaXMgYWxzbyBnZXRzIHVzIHRvIHJldHVybiBhIDQwNCBpZiBhIGRpcmVjdG9yeQogICAgIGlzIHJlcXVlc3RlZCwgdGhlcmUgaXMgbm8gRGlyZWN0b3J5SW5kZXgsIGFuZCBtb2RfYXV0b2luZGV4IGlzbid0CiAgICAgbG9hZGVkLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBGaXhlZCB0aGUgaGFuZGxpbmcgb2YgbmVzdGVkIGlmLXN0YXRlbWVudHMgaW4gc2h0bWwgZmlsZXMuCiAgICAgUFIgOTg2NiAgW0JyaWFuIFBhbmVdCgogICopIEFsbG93ICdtYWtlIGluc3RhbGwgREVTVERJUj0vcGF0aCcuICBUaGlzIGFsbG93cyBwYWNrYWdlcnMgdG8gaW5zdGFsbAogICAgIGludG8gYSBkaXJlY3RvcnkgZGlmZmVyZW50IGZyb20gdGhlIG9uZSB0aGF0IHdhcyBjb25maWd1cmVkLiAgVGhpcyAKICAgICBhbHNvIG1pcnJvcnMgdGhlIHJvb3Q9IGZlYXR1cmUgZnJvbSAxLjMuICBXZSBjYW5ub3QgdXNlIHByZWZpeD0sCiAgICAgYmVjYXVzZSBib3RoIEFQUiBhbmQgQVBSLXV0aWwgcmVzb2x2ZSB0aGVpciBpbnN0YWxsYXRpb24gcGF0aHMgYXQgCiAgICAgY29uZmlndXJhdGlvbiB0aW1lLiAgVGhpcyBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIHZhcmlhYmxlIHByZWZpeCAKICAgICB0byByZXBsYWNlLiAgW0FuZHJlYXMgSGFzZW5hY2sgPGFuZHJlYXMgbmV0YmFuay5jb20uYnI+XQoKICAqKSBBSVggNC4zLjIgYW5kIGFib3ZlOiBEZWZpbmUgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBULgogICAgIFRoZXNlIGxldmVscyBvZiBBSVggZG9uJ3QgaGF2ZSBhIHRodW5kZXJpbmcgaGVyZCBwcm9ibGVtIHdpdGgKICAgICBhY2NlcHQoKS4gIFtKZWZmIFRyYXdpY2tdCgogICopIHByZWZvcmsgTVBNOiBJZ25vcmUgbXV0ZXggZXJyb3JzIGR1cmluZyBncmFjZWZ1bCByZXN0YXJ0LiAgRm9yCiAgICAgY2VydGFpbiB0eXBlcyBvZiBtdXRleGVzIChwYXJ0aWN1bGFybHkgU3lzViBzZW1hcGhvcmVzKSwgd2UKICAgICBzaG91bGQgZXhwZWN0IHRvIG9jY2FzaW9uYWxseSBmYWlsIHRvIG9idGFpbiBvciByZWxlYXNlIHRoZQogICAgIG11dGV4IGR1cmluZyByZXN0YXJ0IHByb2Nlc3NpbmcuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggaW5zdGFsbC1iaW5kaXN0LnNoIHNvIHRoYXQgaXQgZmluZHMgYW55IHBlcmwgaW5zdGVhZCBvZiBqdXN0CiAgICAgZWFybHkgcGVybCA1LnggdmVyc2lvbnMuICBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBhIGJ1aWxkL2luc3RhbGwKICAgICBmcm9tIHNvdXJjZSwgYW5kIGl0IGFsbG93cyB0aGUgcGVybCBzY3JpcHRzIGluc3RhbGxlZCBieSBhIGJpbmRpc3QgCiAgICAgdG8gd29yayBvbiBzeXN0ZW1zIHdpdGggcGVybCA1LjYuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggYXB4cyBzbyB0aGF0IHRoZSBtYWtlZmlsZSBjcmVhdGVkIGJ5ICJhcHhzIC1nIiB3b3JrcyBvbiBBSVggYW5kCiAgICAgVHJ1NjQgKGFuZCBwcm9iYWJseSBzb21lIG90aGVyIHBsYXRmb3JtcykuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBbGxvdyBDR0kgc2NyaXB0cyB0byByZXR1cm4gdGhlaXIgQ29udGVudC1MZW5ndGguICBUaGlzIGFsc28gZml4ZXMgYQogICAgIGhhbmcgb24gSEVBRCByZXF1ZXN0cyBzZWVuIG9uIGNlcnRhaW4gcGxhdGZvcm1zIChzdWNoIGFzIEZyZWVCU0QpLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgQWRkZWQgbG9nIHJvdGF0aW9uIGJhc2VkIG9uIGZpbGUgc2l6ZSB0byB0aGUgUm90YXRlTG9nIHN1cHBvcnQKICAgICB1dGlsaXR5LiBbQnJhZCBOaWNob2xlc10KCiAgKikgRml4IHNvbWUgY2FzdGluZyBpbiBtb2RfcmV3cml0ZSB3aGljaCBicm9rZSByYW5kb20gbWFwcy4KICAgICBQUiA5NzcwICBbQWxsYW4gRWR3YXJkcywgR3JlZyBBbWVzLCBKZWZmIFRyYXdpY2tdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4zNwoKICAqKSBhbGxvdyBQT1NUIG1ldGhvZCBvdmVyIFNTTCB3aGVuIHBlci1kaXJlY3RvcnkgY2xpZW50IGNlcnQKICAgICBhdXRoZW50aWNhdGlvbiBpcyB1c2VkIHdpdGggJ1NTTE9wdGlvbnMgK09wdFJlbmVnb3RpYXRlJyBlbmFibGVkCiAgICAgYW5kIGEgY2xpZW50IGNlcnQgd2FzIGZvdW5kIGluIHRoZSBzc2wgc2Vzc2lvbiBjYWNoZS4KCiAgKikgJ1NTTE9wdGlvbnMgK09wdFJlbmdvdGlhdGUnIHdpbGwgdXNlIGNsaWVudCBjZXJ0IGluIGZyb20gdGhlIHNzbAogICAgIHNlc3Npb24gY2FjaGUgd2hlbiB0aGVyZSBpcyBubyBjZXJ0IGNoYWluIGluIHRoZSBjYWNoZS4gIHByaW9yIHRvCiAgICAgdGhlIGZpeCB0aGlzIHNpdHVhdGlvbiB3b3VsZCByZXN1bHQgaW4gYSBGT1JCSURERU4gcmVzcG9uc2UgYW5kCiAgICAgZXJyb3IgbWVzc2FnZSAiQ2Fubm90IGZpbmQgcGVlciBjZXJ0aWZpY2F0ZSBjaGFpbiIKICAgICBbRG91ZyBNYWNFYWNoZXJuXQoKICAqKSBhcF9maW5hbGl6ZV9zdWJfcmVxX3Byb3RvY29sKCkgc2hvdWxkbid0IHNlbmQgYW4gRU9TIGJ1Y2tldCBpZgogICAgIG9uZSB3YXMgYWxyZWFkeSBzZW50LiAgUFIgOTY0NCAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IHRoZSBkaXNwbGF5IG9mIHRoZSBkZWZhdWx0IG5hbWUgZm9yIHRoZSBtaW1lIHR5cGVzIGNvbmZpZwogICAgIGZpbGUuICBQUiA5NzI5ICBbTWF0dGhldyBCcmVja25lbGwgPG1icmVja25lbGwgb3JjaGVzdHJlYW0uY29tPl0KCiAgKikgRml4IHRoZSB3b3JraW5nIGRpcmVjdG9yeSAqZm9yIFdpbk5ULzJLL1hQIHNlcnZpY2VzIG9ubHkqIHRvCiAgICAgY2hhbmdlIHRvIHRoZSBBcGFjaGUgZGlyZWN0b3J5IChvbmUgbGV2ZWwgYWJvdmUgdGhlIGxvY2F0aW9uIAogICAgIG9mIEFwYWNoZS5leGUsIGluIHRoZSBjYXNlIHRoYXQgQXBhY2hlLmV4ZSByZXNpZGVzIGluIGJpbi8uKQogICAgIFNvbHZlcyB0aGUgY2FzZSBvZiBTZXJ2ZXJSb290IC9mb28gcGF0aHMgd2hlcmUgL2ZvbyB3YXMgbm90CiAgICAgb24gdGhlIHNhbWUgZHJpdmUgYXMgL3dpbm50L3N5c3RlbTMyLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgTWFrZSAyLjAncyAiQWNjZXB0TXV0ZXgiIHN0YXJ0dXAgbWVzc2FnZSBub3cgImNvbXBsZXRlbHkiCiAgICAgbWF0Y2ggaG93IDEuMyBkb2VzIGl0LiBbSmltIEphZ2llbHNraV0KCiAgKikgSW1wbGVtZW50IGEgZml4ZWQgc2l6ZSBtZW1vcnkgY2FjaGUgdXNpbmcgYSBwcmlvcml0eSBxdWV1ZQogICAgIFtJYW4gSG9sc21hbl0KCiAgKikgRml4IGFweHMgdG8gYWxsb3cgImFweHMgLXEgaW5zdGFsbGJ1aWxkZGlyIiBhbmQgdG8gYWxsb3cKICAgICBxdWVyeWluZyBjZXJ0YWluIG90aGVyIHZhcmlhYmxlcyBmcm9tIGNvbmZpZ192YXJzLm1rLiAgUFIgOTMxNiAgCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgQWRkZWQgdGhlICJkZXRhY2hlZCIgYXR0cmlidXRlIHRvIHRoZSBjZ2lfZXhlY19pbmZvX3QgaW50ZXJuYWxzCiAgICAgc28gdGhhdCBXaW4zMiBhbmQgTmV0d2FyZSB3b24ndCBjcmVhdGUgYSBuZXcgd2luZG93IG9yIGNvbnNvbGUKICAgICBmb3IgZWFjaCBDR0kgaW52b2tlZC4gIFBSIDgzODcKICAgICBbQnJhZCBOaWNob2xlcywgV2lsbGlhbSBSb3dlXQoKICAqKSBDb25zb2xpZGF0ZWQgdGhlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFuZCBhdHRyaWJ1dGVzIHRoYXQgYXJlIAogICAgIG1hbmlwdWxhdGVkIGJ5IHRoZSBvcHRpb25hbCBmdW5jdGlvbiBhcF9jZ2lfYnVpbGRfY29tbWFuZCgpIGluCiAgICAgbW9kX2NnaSBpbnRvIGEgc2luZ2xlIHN0cnVjdHVyZS4KICAgICBbQnJhZCBOaWNob2xlc10KCiAgKikgR2V0IHJpZCBvZiB1bmluaXRpYWxpemVkIHZhbHVlIGVycm9ycyB3aXRoICJhcHhzIC1xIiBvbiBjZXJ0YWluCiAgICAgdmFyaWFibGVzLiAgW1N0YXMgQmVrbWFuIDxzdGFzIHN0YXNvbi5vcmc+XQoKICAqKSBGaXggYXB4cyB0byBhbGxvdyBpdCB0byB3b3JrIHdoZW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSBpcyBzb21ld2hlcmUKICAgICBiZXNpZGVzIHNlcnZlci1yb290L2J1aWxkLiAgUFIgODQ1MyAgCiAgICAgW0plZmYgVHJhd2ljayBhbmQgYSBob3N0IG9mIG90aGVyc10KCiAgKikgQWxsb3cgYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkgdG8gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGluIHRoZQogICAgIHNhbWUgcmVxdWVzdC4gIEVzc2VudGlhbGx5LCBhcF9odHRwX2ZpbHRlciBrZWVwcyB0cmFjayBvZiB3aGV0aGVyCiAgICAgaXQgaGFzIHNlbnQgYW4gRU9TIGJ1Y2tldCB1cCB0aGUgc3RhY2ssIGlmIHNvLCBpdCB3aWxsIG9ubHkgZXZlcgogICAgIHNlbmQgYW4gRU9TIGJ1Y2tldCBmb3IgdGhpcyByZXF1ZXN0LiAgCiAgICAgW1J5YW4gQmxvb20sIEp1c3RpbiBFcmVua3JhbnR6LCBHcmVnIFN0ZWluXQoKICAqKSBSZW1vdmUgYWxsIHNwZWNpYWwgbW9kX3NzbCBVUklzLiAgVGhpcyBhbHNvIGZpeGVzIHRoZSBidWcgd2hlcmUKICAgICByZWRpcmVjdGluZyAoLiopIHdpbGwgYWxsb3cgYW4gU1NMIHByb3RlY3RlZCBwYWdlIHRvIGJlIHZpZXdlZAogICAgIHdpdGhvdXQgU1NMLiAgW1J5YW4gQmxvb21dCgogICopIEZpeCB0aGUgYmluYXJ5IGJ1aWxkIGluc3RhbGwgc2NyaXB0IHNvIHRoYXQgdGhlIGJ1aWxkIGxvZ2ljCiAgICAgY3JlYXRlZCBieSAiYXB4cyAtZyIgd2lsbCB3b3JrIHdoZW4gdGhlIHVzZXIgaGFzIGEgYmluYXJ5CiAgICAgYnVpbGQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBbGxvdyBpbnN0ZHNvLnNoIHRvIHdvcmsgd2l0aCBmdWxsIHBhdGhzIHRvIHRoZSBzaGFyZWQgbW9kdWxlLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgTmV0V2FyZTogRW5hYmxlZCBDR0kgZnVuY3Rpb25hbGl0eSBhbmQgYWRkZWQgbW9kX2NnaSBhcyBhIGJ1aWx0CiAgICAgaW4gbW9kdWxlIGZvciBOZXRXYXJlICBbQnJhZCBOaWNob2xlc10KCiAgKikgQ2hhbmdlZCBjZ2kgYW5kIHBpcGVkIGxvZyBiZWhhdmlvciB0byBhY2NlcHQgNjU1MzYgY2hhcmFjdGVycwogICAgIG9uIFdpbjMyIChtYXRjaGluZyBMaW51eCkgYmVmb3JlIGRlYWRsb2NraW5nIGJldHdlZW4gb3V0cHV0aW5nCiAgICAgY2xpZW50IHN0ZGluLCBzbHVycGluZyB0aGUgb3V0cHV0IGZyb20gc3Rkb3V0IGFuZCB0aGVuIHRoZSBzdGRlcnIKICAgICBzdHJlYW0uICBQUiA4MTc5ICBbV2lsbGlhbSBSb3dlXQoKICAqKSBGaXhlZCBXaW4zMiB3aW50dHkuZXhlIHN1cHBvcnQgdG8gYXNzdXJlIHRoZSB3aW5kb3cgdGl0bGUgaXMgdmFsaWQuCiAgICAgRWxpbWlhdGVzIHBvc3NpYmxlIGdwZmF1bHQgb3IgZ2FyYmFnZSB0aXRsZSB3aXRob3V0IHRoZSAtdCBvcHRpb24uCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgUmV3cml0ZSBtb2RfY2dpLCBtb2RfY2dpZCwgYW5kIG1vZF9wcm94eSBpbnB1dCBoYW5kbGluZyB0byB1c2UKICAgICBicmlnYWRlcyBhbmQgaW5wdXQgZmlsdGVycy4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgQWxsb3cgYXBfaHR0cF9maWx0ZXIgKEhUVFBfSU4pIHRvIHJldHVybiBFT1Mgd2hlbiB0aGVyZSBpcyBubyByZXF1ZXN0CiAgICAgYm9keS4gIFtKdXN0aW4gRXJlbmtyYW50el0KICAgIAogICopIE5ldFdhcmU6IFBpcGluZyBsb2cgZW50cmllcyB0aHJvdWdoIFJvdGF0ZUxvZ3MgdXNpbmcgdGhlIAogICAgIEN1c3RvbUxvZ3MgZGlyZWN0aXZlIGlzIGZpbmFsbHkgc3VwcG9ydGVkIG5vdyB0aGF0IHdlIGhhdmUgCiAgICAgdGhlIHBpcGVzIGFuZCBzcGF3bmluZyBmdW5jdGlvbmFsaXR5IHdvcmtpbmcuCiAgICAgW0JyYWQgTmljaG9sZXNdCgogICopIFNFQ1VSSVRZOiBDVkUtMjAwMi0wMzkyIChjdmUubWl0cmUub3JnKSBbQ0VSVCBWVSM5NDQzMzVdCiAgICAgRGV0ZWN0IG92ZXJmbG93IHdoZW4gcmVhZGluZyB0aGUgaGV4IGJ5dGVzIGZvcm1pbmcgYSBjaHVuayBsaW5lLgogICAgIFtBYXJvbiBCYW5uZXJ0XQoKICAqKSBBbGxvdyBSZXdyaXRlTWFwIHByZzoncyB0byB0YWtlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuICBQUiA4NDY0LgogICAgIFtKYW1lcyBUYWl0IDxKVGFpdCB3eXJkZHJlYW1zLmRlbW9uLmNvLnVrPl0KCiAgKikgQ29ycmVjdGx5IHJldHVybiA0MTMgd2hlbiBhbiBpbnZhbGlkIGNodW5rIHNpemUgaXMgZ2l2ZW4gb24KICAgICBpbnB1dC4gIEFsc28gbW9kaWZ5IGFwX2Rpc2NhcmRfcmVxdWVzdF9ib2R5IHRvIG5vdCBkbyBhbnl0aGluZwogICAgIG9uIHN1Yi1yZXF1ZXN0cyBvciB3aGVuIHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgZHJvcHBlZC4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEZpeCB0aGUgVElNRV8qIFNTTCB2YXIgbG9va3VwcyB0byBiZSB0aHJlYWRzYWZlLiAgUFIgOTQ2OS4KICAgICBbQ2xpZmYgV29vbGxleV0KCiAgKikgRW5zdXJlIHRoYXQgYXByX2JyaWdhZGVfd3JpdGUoKSBmbHVzaGVzIGluIGFsbCBvZiB0aGUgY2FzZXMgdGhhdAogICAgIGl0IHNob3VsZCB0byBhdm9pZCBjb25kaXRpb25zIGluIHNvbWUgbW9kdWxlcyB0aGF0IGNvdWxkIGNhdXNlCiAgICAgbGFyZ2UgYW1vdW50cyBvZiBkYXRhIHRvIGJlIGJ1ZmZlcmVkLiAgW0NsaWZmIFdvb2xsZXldCgogICopIEZpeCBwcm9ibGVtIHdoZXJlIG1vZF9jYWNoZS9tb2RfZGlza19jYWNoZSB3YXMgaW5jb3JyZWN0bHkKICAgICBzdHJpcHBpbmcgdGhlIGNvbnRlbnRfdHlwZSBmcm9tIGNhY2hlZCByZXNwb25zZXMuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIGFwYWNoZWN0bCBwYXNzZXMgdGhyb3VnaCBhbnkgaHR0cGQgb3B0aW9ucy4gIE5vdGU6IGFwYWNoZWN0bAogICAgIHNob3VsZCBiZSB1c2VkIGluIHByZWZlcmVuY2UgdG8gaHR0cGQgc2luY2UgaXQgZW5zdXJlcyB0aGF0IGFueQogICAgIGFwcHJvcHJpYXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBoYXZlIGJlZW4gc2V0IHVwLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCB0aGUgY29tYmluYXRpb24gb2YgbW9kX2NnaWQsIG1vZF9zZXR1ZXhlYywgYW5kIG1vZF91c2VyZGlyLgogICAgIFBSIDc4MTAgIFtDb2xtIE1hY0NhcnRoYWlnaCA8Y29sbW1hY2MgcmVkYnJpY2suZGN1LmllPl0KCiAgKikgRml4IHN1ZXhlYyBleGVjdXRpb24gb2YgQ0dJIHNjcmlwdHMgZnJvbSBtb2RfaW5jbHVkZS4KICAgICBQUiA3NzkxLCA4MjkxICBbQ29sbSBNYWNDYXJ0aGFpZ2ggPGNvbG1tYWNjIHJlZGJyaWNrLmRjdS5pZT5dCgogICopIEZpeCBzZWdmYXVsdHMgYXQgc3RhcnR1cCBvbiBzb21lIHBsYXRmb3JtcyB3aGVuIG1vZF9hdXRoX2RpZ2VzdCwKICAgICBtb2Rfc3VleGVjLCBvciBtb2Rfc3NsIHdlcmUgdXNlZCBhcyBEU08ncyBkdWUgdG8gdGhlIHdheSB0aGV5CiAgICAgd2VyZSB0cmFja2luZyB0aGUgY3VycmVudCBpbml0IHBoYXNlIHNpbmNlIERTTydzIGdldCBjb21wbGV0ZWx5CiAgICAgdW5sb2FkZWQgYW5kIHJlbG9hZGVkIGJldHdlZW4gcGhhc2VzLiAgUFIgOTQxMy4KICAgICBbVHN1eW9zaGkgU2FzYW1vdG8gPG5hem9uYXpvIHN1cGVyLndpbi5uZS5qcD4sIEJyYWQgTmljaG9sZXNdCgogICopIEZpeCBtb2RfaW5jbHVkZSdzIGhhbmRsaW5nIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW4KICAgICAiPCEtLSNpZiIgZGlyZWN0aXZlcyBbSnVsaXVzIEdhd2xhcyA8anVsaXVzX2dhd2xhcyBocC5jb20+XQoKICAqKSBGaXggdGhlIHdvcmtlciBNUE0gZGVhZGxvY2sgcHJvYmxlbSAgW0JyaWFuIFBhbmVdCgogICopIE1vZGlmeSB0aGUgbW9kdWxlIGRvY3VtZW50YXRpb24gdG8gYWxsb3cgZm9yIHRyYW5zbGF0aW9ucy4KICAgICBbWW9zaGlraSBIYXlhc2hpLCBKb3NodWEgU2xpdmVdCgogICopIEZpeCBhIGZpbGUgcGVybWlzc2lvbnMgcHJvYmxlbSB3aGljaCBwcmV2ZW50ZWQgbW9kX2Rpc2tfY2FjaGUKICAgICBmcm9tIHdvcmtpbmcgb24gVW5peC4gIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZCAiLWsgc3RhcnR8cmVzdGFydHxncmFjZWZ1bHxzdG9wIiBzdXBwb3J0IHRvIGh0dHBkIGZvciB0aGUgVW5peCAKICAgICBNUE1zLiAgVGhlc2UgaGF2ZSBzZW1hbnRpY3MgdmVyeSBzaW1pbGFyIHRvIHRoZSBvbGQgYXBhY2hlY3RsIAogICAgIGNvbW1hbmRzIG9mIHRoZSBzYW1lIG5hbWUuICBbSnVzdGluIEVyZW5rcmFudHosIEplZmYgVHJhd2lja10KCiAgKikgTWFrZSBzdXJlIHRoYXQgdGhlIHJ1bnRpbWUgZGlyIGlzIGNyZWF0ZWQgYnkgbWFrZSBpbnN0YWxsLgogICAgIFBSIDkyMzMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggYW4gdW51c3VhbCBzZXQgb2YgLi9jb25maWd1cmUgYXJndW1lbnRzIHRoYXQgY291bGQgY2F1c2UKICAgICBtb2RfaHR0cCB0byBiZSBidWlsdCBhcyBhIERTTywgd2hpY2ggaXQgY3VycmVudGx5IGRvZXNuJ3QKICAgICBzdXBwb3J0LiAgUFIgOTI0NC4KICAgICBbQ2xpZmYgV29vbGxleSwgUm9iaW4gSm9obnNvbiA8cm9iYmF0MiBvcmJpcy10ZXJyYXJ1bS5uZXQ+XQoKICAqKSBXaW4zMjogRml4IGJ1ZyBpbiBhcHJfc2VuZGZpbGUoKSB0aGF0IGNhdXNlZCBpbmNvcnJlY3Qgb3BlcmF0aW9uCiAgICAgb2YgdGhlICVYLCAlYiBhbmQgJUIgbG9nZm9ybWF0IG9wdGlvbnMuIFBSIDgyNTMsIDg5OTYuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIElmIGNvbnRlbnQtZW5jb2RpbmcgaXMgYWxyZWFkeSBwcmVzZW50LCBkbyBub3QgcnVuIGRlZmxhdGUgKFBSIDkyMjIpCiAgICAgW0thenVoaXNhIEFTQURBIDxrYXogYXNhZGEuc3l0ZXMubmV0Pl0KCiAgKikgVGhlIEFQTE9HX05PRVJSTk8gZmxhZyB0byBhcF9sb2dfW3JdZXJyb3IoKSBpcyBub3cgZGVwcmVjYXRlZC4KICAgICBJdCBpcyBjdXJyZW50bHkgaWdub3JlZCBhbmQgaXQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UKICAgICBvZiBBcGFjaGUuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBSZW1vdmVkIGRvY3VtZW50YXRpb24gcmVmZXJlbmNlcyB0byB0aGUgbm8tbG9uZ2VyLXN1cHBvcnRlZAogICAgICJtYWtlIGNlcnRpZmljYXRlIiBmZWF0dXJlIG9mIG1vZF9zc2wgZm9yIEFwYWNoZSAxLjMueC4gIFRlc3QKICAgICBjZXJ0aWZpY2F0ZXMsIGlmIHRydWx5IGRlc2lyZWQsIGNhbiBiZSBnZW5lcmF0ZWQgdXNpbmcgb3BlbnNzbAogICAgIGNvbW1hbmRzLiAgUFIgODcyNC4gIFtDbGlmZiBXb29sbGV5XQoKICAqKSBSZW1vdmUgU1NMTG9nIGFuZCBTU0xMb2dMZXZlbCBkaXJlY3RpdmVzIGluIGZhdm9yIG9mIGhhdmluZwogICAgIG1vZF9zc2wgdXNlIHRoZSBzdGFuZGFyZCBFcnJvckxvZyBkaXJlY3RpdmVzLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBPUy8zOTA6IExJQlBBVEggbm8gbG9uZ2VyIGhhcyB0byBiZSBtYW51YWxseSB1bmNvbW1lbnRlZCBpbgogICAgIGVudnZhcnMgdG8gZ2V0IGFwYWNoZWN0bCB0byBzZXQgdXAgaHR0cGQgcHJvcGVybHkuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBtb2RfaXNhcGk6IEFsbCBtb2RfaXNhcGkgZGlyZWN0aXZlcywgZXhjbHVkaW5nIElTQVBJQ2FjaGVGaWxlLAogICAgIG1heSBub3cgYmUgc3BlY2lmaWVkIHRvIHRoZSA8RmlsZS9EaXJlY3RvcnkgPiBjb250YWluZXIsIHJhdGhlcgogICAgIHRoYW4gYnkgdmhvc3QuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBtb2RfaXNhcGk6IEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBmYXV4IGFzeW5jIHN1cHBvcnQgZm9yIElTQVBJCiAgICAgbW9kdWxlcy4gIFtXaWxsaWFtIFJvd2VdCgogICopIG1vZF9pc2FwaTogTWFqb3IgcmVmYWN0b3Jpbmcgb2YgdGhlIGNvZGUgdG8gcmVseSBvbiBhcHIgaW50ZXJuYWxzCiAgICAgcmF0aGVyIHRoYW4gTVMgQVBJcyAodXNpbmcgb3VyIG93biBtb2RfaXNhcGkuaCBoZWFkZXJzIGZvciBJU0FQSQogICAgIHN5bWJvbCBkZWZpbml0aW9ucy4pICBbV2lsbGlhbSBSb3dlXQoKICAqKSBtb2RfaXNhcGk6IEZpeGVkIHRoZSByZXR1cm4gc3RyaW5nIGxlbmd0aCBmcm9tIEdldFNlcnZlclZhcmlhYmxlCiAgICAgY2FsbGJhY2ssIGl0IHdhcyBub3QgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBudWxsIGluIHRoZSBjb25zdW1lZAogICAgIGJ1ZmZlciBzaXplLiAgVGhpcyB3YXMgcGFydGljdWxhcmx5IGJhZCBmb3IgRGVscGhpIDYuMCB1c2Vycy4KICAgICBQUiA4OTM0ICBbU2ViYXN0aWFuIEhhbnRzY2ggPHNlYmFzdGlhbi5oYW50c2NoIGdteC5kZT5dCgogICopIEZpeGVkIFdpbjMyIGJ1aWxkcyBmb3IgTWljcm9zb2Z0IFZpc3VhbFN0dWRpbyA3LjAgKC5uZXQpLgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIE1ha2UgYXB4cyBsb29rIGluIHRoZSBjb3JyZWN0IGRpcmVjdG9yeSBmb3IgZW52dmFycy4gIEl0IHdhcwogICAgIGJyb2tlbiB3aGVuIHNiaW5kaXIgIT0gYmluZGlyLiAgUFIgODg2OQogICAgIFtBbmRyZWFzIFN1bmRzdHL2bSA8c3Vua2FuIHphcHBhLmN4Pl0KICAKICAqKSBGaXggbW9kX2RlZmxhdGUgY29ycnVwdGlvbiB3aGVuIHVzaW5nIG11bHRpcGxlIGJ1Y2tldHMuICBQUiA5MDE0LgogICAgIFtBc2FkYSBLYXp1aGlzYSA8a2F6IGFzYWRhLnN5dGVzLm5ldD5dCgogICopIFBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cyBmb3IgYWNjZXNzIGxvZ2dlciB3aGVuIHVzaW5nCiAgICAgZGVmYXVsdCB0aW1lc3RhbXAgZm9ybWF0dGluZyAgW0JyaWFuIFBhbmVdCgogICopIEFkZGVkIEVuYWJsZU1NQVAgY29uZmlnIGRpcmVjdGl2ZSB0byBlbmFibGUgdGhlIHNlcnZlcgogICAgIGFkbWluaXN0cmF0b3IgdG8gZGlzYWJsZSBtZW1vcnktbWFwcGluZyBvZiBkZWxpdmVyZWQgZmlsZXMKICAgICBvbiBhIHBlci1kaXJlY3RvcnkgYmFzaXMuICBbQnJpYW4gUGFuZV0KCiAgKikgUGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzIGZvciBtb2Rfc2V0ZW52aWYgIFtCcmlhbiBQYW5lXQoKICAqKSBGaXggYSBtb2Rfc3NsIGJ1aWxkIHByb2JsZW0gb24gT1MvMzkwLiAgW0plZmYgVHJhd2lja10KCiAgKikgRml4ZWQgSWYtTW9kaWZpZWQtU2luY2Ugb24gV2luMzIsIHdoaWNoIHdvdWxkIGdpdmUgZmFsc2UgcG9zaXRpdmVzCiAgICAgYmVjYXVzZSBvZiB0aGUgc3ViLXNlY29uZCByZXNvbHV0aW9uIG9mIGZpbGUgdGltZXN0YW1wcyBvbiB0aGF0CiAgICAgcGxhdGZvcm0uICBbQ2xpZmYgV29vbGxleV0KCiAgKikgUmV2ZXJzZSB0aGUgaG9vayBvcmRlcmluZyBmb3IgbW9kX3VzZXJkaXIgYW5kIG1vZF9hbGlhcyBzbwogICAgIHRoYXQgQWxpYXMvU2NyaXB0QWxpYXMgd2lsbCBvdmVycmlkZSBVc2VyZGlyLiAgUFIgODg0MQogICAgIFtKb3NodWEgU2xpdmVdCgogICopIE1vdmUgbW9kX2RlZmxhdGUgb3V0IG9mIGV4cGVyaW1lbnRhbCBhbmQgaW50byBmaWx0ZXJzLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgR2V0IHByb3h5IENPTk5FQ1QgYmFzaWNhbGx5IHdvcmtpbmcuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggbW9kX3Jld3JpdGUgaGFuZyB3aGVuIEFQUiB1c2VzIFN5c1YgU2VtYXBob3JlcyBhbmQKICAgICBSZXdyaXRlTG9nTGV2ZWwgaXMgc2V0IHRvIGFueXRoaW5nIG90aGVyIHRoYW4gMC4gIFBSOiA4MTQzCiAgICAgW0Fhcm9uIEJhbm5lcnQsIENsaWZmIFdvb2xsZXldCgogICopIEZpeCBieXRlcmFuZ2UgcmVxdWVzdHMgZnJvbSByZXR1cm5pbmcgNDE2IHdoZW4gdXNpbmcgZHluYW1pYyBkYXRhCiAgICAgKHN1Y2ggYXMgZmlsdGVycyBsaWtlIG1vZF9pbmNsdWRlKS4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgQWxsb3cgbW9kX3Jld3JpdGUncyBzZXQgb2YgImludDoiIGludGVybmFsIFJld3JpdGVNYXAgZnVuY3Rpb25zCiAgICAgdG8gYmUgZXh0ZW5kZWQgYnkgdGhpcmQtcGFydHkgbW9kdWxlcyB2aWEgYW4gb3B0aW9uYWwgZnVuY3Rpb24uCiAgICAgW1RhaGlyeSBSYW1hbmFtYW1wYW5vaGFyYW5hIDxub21lbnRzb2EgaG90bWFpbC5jb20+LCBDbGlmZiBXb29sbGV5XQoKICAqKSBGaXggbW9kX2luY2x1ZGUgZXhwcmVzc2lvbiBwYXJzZXIncyBoYW5kbGluZyBvZiB1bnF1b3RlZCBzdHJpbmdzCiAgICAgZm9sbG93ZWQgaW1tZWRpYXRlbHkgYnkgYSBjbG9zaW5nIHBhcmVuLiAgUFIgODQ2Mi4gIFtCcmlhbiBQYW5lXQoKICAqKSBSZW1vdmUgYXV0b200dGUuY2FjaGUgaW4gJ21ha2UgZGlzdGNsZWFuJy4KICAgICBbVGhvbSBNYXkgPHRob20gcGxhbmV0YXJ5dHJhbXAubmV0Pl0KCiAgKikgRml4IGdlbmVyYXRlZCBodHRwZC5jb25mIHRvIHJlc3BlY3QgbGF5b3V0IGZvciBMb2FkTW9kdWxlIGxpbmVzLgogICAgIFBSIDgxNzAuICBbVGhvbSBNYXkgPHRob20gcGxhbmV0YXJ5dHJhbXAubmV0Pl0KCiAgKikgV2luMzI6IER1cmluZyBhIGdyYWNlZnVsIHJlc3RhcnQsIHRocmVhZHMgaW4gdGhlIG5ldyBwcm9jZXNzCiAgICAgd2VyZSBhY2Nlc3Npbmcgc2NvcmVib2FyZCBzbG90cyBzdGlsbCBpbiB1c2UgYnkgYWN0aXZlIHRocmVhZHMgaW4gCiAgICAgdGhlIG9sZCBwcm9jZXNzLiBbQmlsbCBTdG9kZGFyZF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjM2CgogICopIEZpeCBzb21lIG1pbm9yIGZvcm1hdHRpbmcgaXNzdWVzIHdpdGggYWIuIFBhcnQgb2YgdGhpcyBpcwogICAgIGluIHJlZmVyZW5jZSB0byBQUiA4NTQ0LCB0aGUgcmVzdCBJIG5vdGljZWQgd2hpbGUgdGVzdGluZwogICAgIHRoZSBQUiBmaXguIFtQYXVsIEouIFJlZGVyXQoKICAqKSBGaXggYSBjYXNlIHdoZXJlIGFuIGludmFsaWQgcGFzcyBwaHJhc2UgaXMgZW50ZXJlZCBhbmQgYW4KICAgICBlcnJvciBtZXNzYWdlIGlzIGdpdmVuLCBidXQgdGhlIHByb21wdCBpcyBub3Qgc2hvd24gYWdhaW4uCiAgICAgVGhpcyBsZWZ0IHRoZSB1c2VyIGluIGFuIGFtYmlndW91cyBzdGF0ZS4gUFIgODMyMCBbUGF1bCBKLiBSZWRlcl0KCiAgKikgQ2xvc2Ugc29ja2V0cyBvbiB3b3JrZXIgTVBNIHdoZW4gZG9pbmcgYSBncmFjZWxlc3MgcmVzdGFydC4KICAgICBbQWFyb24gQmFubmVydF0KCiAgKikgUmV2ZXJ0ZWQgYSBtaW5vciBvcHRpbWl6YXRpb24gaW4gbW9kX3NzbC5jIHRoYXQgdXNlZCB0aGUgdmhvc3QgSUQKICAgICBhcyB0aGUgc2Vzc2lvbiBpZCBjb250ZXh0IHJhdGhlciB0aGF0IGEgTUQ1IGhhc2ggb2YgdGhhdCB2aG9zdCBJRCwKICAgICBiZWNhdXNlIGl0IGNhdXNlZCB2ZXJ5IGxvbmcgdmhvc3QgaWQncyB0byBiZSB1bnVzYWJsZSB3aXRoIG1vZF9zc2wuCiAgICAgUFIgODU3Mi4gIFtDbGlmZiBXb29sbGV5XQoKICAqKSBGaXggdGhlIGxpbmsgdG8gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBDb3JlZHVtcERpcmVjdG9yeSAKICAgICBkaXJlY3RpdmUgaW4gdGhlIHNlcnZlci13aWRlIGRvY3VtZW50LiAgUFIgODY0My4gIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeGVkIFNITUNCIHNlc3Npb24gY2FjaGluZy4gIFtBYXJvbiBCYW5uZXJ0LCBDbGlmZiBXb29sbGV5XQoKICAqKSBTeW5jZWQgd2l0aCByZW1haW5pbmcgY2hhbmdlcyBmcm9tIG1vZF9zc2wgMi44LjgtMS4zLjI0OgogICAgIC0gQXZvaWQgU0lHQlVTIG9uIHNwYXJjIG1hY2hpbmVzIHdpdGggU0hNQ0Igc2Vzc2lvbiBjYWNoZXMKICAgICAtIEFsbG93IHdoaXRlc3BhY2UgYmV0d2VlbiB0aGUgcGlwZSBhbmQgdGhlIG5hbWUgb2YgdGhlCiAgICAgcHJvZ3JhbSBpbiBTU0xMb2cgInwgL3BhdGgvdG8vcHJvZ3JhbSIuICBbQ2xpZmYgV29vbGxleV0KCiAgKikgSW50cm9kdWNlIG1vZF9leHRfZmlsdGVyIGFuZCBtb2RfZGVmbGF0ZSBleHBlcmltZW50YWwgbW9kdWxlcwogICAgIHRvIHRoZSBXaW4zMiBidWlsZCAoemxpYiBzb3VyY2VzIG11c3QgYmUgaW4gc3JjbGliXHpsaWIuKQogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIENoYW5nZXMgdG8gdGhlIHdvcmtlciBNUE0ncyBxdWV1ZSBtYW5hZ2VtZW50IGFuZCB0aHJlYWQKICAgICBzeW5jaHJvbml6YXRpb24gY29kZSB0byByZWR1Y2UgbXV0ZXggY29udGVudGlvbiAgW0JyaWFuIFBhbmVdCgogICopIERvbid0IGluc3RhbGwgKi5pbiBjb25maWd1cmF0aW9uIGZpbGVzIHNpbmNlIHdlIGFscmVhZHkgaW5zdGFsbAogICAgICotc3RkLmNvbmYgZmlsZXMuICBbQWFyb24gQmFubmVydF0KCiAgKikgTWFueSBpbXByb3ZlbWVudHMgdG8gdGhlIHRocmVhZHBvb2wgTVBNLiAgW0Fhcm9uIEJhbm5lcnRdCgogICopIEZpeCBzdWJyZXFzIHRoYXQgYXJlIHByb21vdGVkIHZpYSBmYXN0X3JlZGlyZWN0IGZyb20gaGF2aW5nIGludmFsaWQKICAgICBmcmVjLT5yIHN0cnVjdHVyZXMuICBUaGlzIHdvdWxkIGNhdXNlIHN1YnRsZSBlcnJvcnMgbGF0ZXIgb24gaW4KICAgICByZXF1ZXN0IHByb2Nlc3Npbmcgc3VjaCBhcyBzZWVuIGluIFBSIDc5NjYuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIE1vcmUgZWZmaWNpZW50IHBvb2wgcmVjeWNsaW5nIGxvZ2ljIGZvciB0aGUgd29ya2VyIE1QTSBbQnJpYW4gUGFuZV0KCiAgKikgTW9kaWZ5IHRoZSB3b3JrZXIgTVBNIHRvIG5vdCBhY2NlcHQoKSBuZXcgY29ubmVjdGlvbnMgdW50aWwKICAgICB0aGVyZSBpcyBhbiBhdmFpbGFibGUgd29ya2VyIHRocmVhZC4gVGhpcyBwcmV2ZW50cyBxdWV1ZWQKICAgICBjb25uZWN0aW9ucyBmcm9tIHN0YXJ2aW5nIGZvciBwcm9jZXNzaW5nIHRpbWUgd2hpbGUgbG9uZy1ydW5uaW5nCiAgICAgY29ubmVjdGlvbnMgd2VyZSBob2dnaW5nIGFsbCB0aGUgYXZhaWxhYmxlIHRocmVhZHMuICBbQWFyb24gQmFubmVydF0KCiAgKikgQ29udmVydCB0aGUgd29ya2VyIE1QTSdzIGZkcXVldWUgZnJvbSBhIExJRk8gYmFjayBpbnRvIGEgRklGTy4KICAgICBbQWFyb24gQmFubmVydF0KCiAgKikgR2V0IGJhc2ljIEhUVFAgcHJveHkgd29ya2luZyBvbiBFQkNESUMgbWFjaGluZXMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBbGxvdyBtb2RfdW5pcXVlX2lkIHRvIHdvcmsgb24gc3lzdGVtcyB3aXRoIG5vIElQdjQgYWRkcmVzcwogICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlaXIgaG9zdCBuYW1lLiAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IHN1ZXhlYyBiZWhhdmlvciB3aXRoIHVzZXIgZGlyZWN0b3JpZXMuICBQUiA3ODEwLgogICAgIFtDb2xtIDxjb2xtbWFjYyByZWRicmljay5kY3UuaWU+XQoKICAqKSBSZWplY3QgYSBibGFuayBVc2VyRGlyIGRpcmVjdGl2ZSBzaW5jZSBpdCBpcyBhbWJpZ3VvdXMuICBQUiA4NDcyLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgTWFrZSBtb2RfbWltZSB1c2UgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZyB3aGVuIGV4YW1pbmluZwogICAgIGV4dGVuc2lvbnMgb24gYWxsIHBsYXRmb3Jtcy4gIFBSIDgyMjMuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEFkZCBhbiBpbnRlbGxpZ2VudCBlcnJvciBtZXNzYWdlIHNob3VsZCBubyBwcm94eSBzdWJtb2R1bGVzIGJlCiAgICAgdmFsaWQgdG8gaGFuZGxlIGEgcmVxdWVzdC4gUFIgODQwNyBbR3JhaGFtIExlZ2dldHRdCgogICopIE1ham9yIGltcHJvdmVtZW50cyBpbiBjb25jdXJyZW50IHByb2Nlc3NpbmcgZm9yIEFCIGJ5IGVuYWJsaW5nCiAgICAgbm9uLWJsb2NraW5nIGNvbm5lY3QoKXMgYW5kIHByZXZlbnRpbmcgQVBSIGZyb20gZG9pbmcgYmxvY2tpbmcKICAgICByZWFkKClzLiBBbHNvIGltcGxlbWVudCBmYXRhbCBlcnJvciBjaGVja2luZyBmb3IgYXByX3JlY3YoKS4KICAgICBbQWFyb24gQmFubmVydF0KCiAgKikgRml4IFdpbjMyIE5URlMgSnVuY3Rpb25zIChzeW1saW5rcykuICBQUiA4MDE0ICBbV2lsbGlhbSBSb3dlXQoKICAqKSBGaXggV2luMzIgJ3Nob3J0IG5hbWUnIGFsaWFzZXMgaW4gaHR0cGQuY29uZiBkaXJlY3RpdmVzLgogICAgIFBSIDgwMDkgIFtXaWxsaWFtIFJvd2VdCgogICopIEZpeCBnZW5lcmF0aW9uIG9mIGRlZmF1bHQgaHR0cGQuY29uZiB3aGVuIHRoZSBsYXlvdXQgcGF0aHMgYXJlCiAgICAgZGlzam9pbnQuICBQUiA3OTc5LCA4MjI3LiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBTd2FwIGRvd25ncmFkZS0xLjAgYW5kIGZvcmNlLXJlc3BvbnNlLTEuMCBjb25kaXRpb25hbCBjaGVja3Mgc28KICAgICB0aGF0IGRvd25ncmFkZWQgcmVzcG9uc2VzIGNhbiBoYXZlIGZvcmNlLXJlc3BvbnNlLiAgUFIgODM1Ny4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEZpeCBwZXJjaGlsZCBNUE0gc28gdGhhdCBpdCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIHRoZSBtb3ZlIHRvIHRoZQogICAgIGV4cGVyaW1lbnRhbCBkaXJlY3RvcnkuICBbU2NvdHQgTGFtYiA8c2xhbWIgc2xhbWIub3JnPl0KCiAgKikgRml4IHBlcmNoaWxkIE1QTSBzbyB0aGF0IGl0IHVzZXMgYXBfZ25hbWUyaWQgZm9yIGdyb3VwcyBpbnN0ZWFkIG9mCiAgICAgYXBfdW5hbWUyaWQuIFtTY290dCBMYW1iIDxzbGFtYiBzbGFtYi5vcmc+XQoKICAqKSBGaXggQWNjZXB0UGF0aEluZm8uIFBSIDgyMzQgIFtDbGlmZiBXb29sbGV5XQoKICAqKSBTRUNVUklUWTogQWRkZWQgdGhlIEFQTE9HX1RPQ0xJRU5UIGZsYWcgdG8gYXBfbG9nX3JlcnJvcigpIHRvCiAgICAgZXhwbGljaXRseSB0ZWxsIHRoZSBzZXJ2ZXIgdGhhdCB3YXJuaW5nIG1lc3NhZ2VzIHNob3VsZCBiZSBzZW50IAogICAgIHRvIHRoZSBjbGllbnQgaW4gYWRkaXRpb24gdG8gYmVpbmcgcmVjb3JkZWQgaW4gdGhlIGVycm9yIGxvZy4gCiAgICAgUHJpb3IgdG8gdGhpcyBjaGFuZ2UsIGFwX2xvZ19yZXJyb3IoKSBhbHdheXMgc2VudCB3YXJuaW5nIAogICAgIG1lc3NhZ2VzIHRvIHRoZSBjbGllbnQuIEluIG9uZSBjYXNlLCBhIGZhdWx0eSBDR0kgc2NyaXB0IGNhdXNlZAogICAgIHRoZSBzZXJ2ZXIgdG8gc2VuZCBhIHdhcm5pbmcgbWVzc2FnZSB0byB0aGUgY2xpZW50IHRoYXQgY29udGFpbmVkCiAgICAgdGhlIGZ1bGwgcGF0aCB0byB0aGUgQ0dJIHNjcmlwdC4gVGhpcyBjb3VsZCBiZSBjb25zaWRlcmVkIGEKICAgICBtaW5vciBzZWN1cml0eSBleHBvc3VyZS4gW0JpbGwgU3RvZGRhcmRdCgogICopIG1vZF9hdXRvaW5kZXggb3V0cHV0IHdoZW4gU3VwcHJlc3NSdWxlcyB3YXMgc3BlY2lmaWVkIHdvdWxkCiAgICAgb21pdCB0aGUgZmlyc3QgY2FycmlhZ2UgcmV0dXJuIHNvIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0CiAgICAgd291bGQgYXBwZWFyIHRvIHRoZSByaWdodCBvZiB0aGUgY29sdW1uIGhlYWRpbmdzIGluc3RlYWQgb2YKICAgICB1bmRlcm5lYXRoIHRoZW0uIFBSIDgwMTYgIFtEYXZpZCBTaGFuZSBIb2xkZW4gPGRwZWplc2ggeWFob28uY29tPl0KCiAgKikgTW92ZWQgdGhlIGNhbGwgdG8gYXByX21tYXBfZHVwIG91dHNpZGUgdGhlIGVycm9yIGJyYW5jaCBzbwogICAgIHRoYXQgaXQgd291bGQgYWN0dWFsbHkgZ2V0IGNhbGxlZC4gVGhpcyBmaXhlcyBhIGNvcmUgZHVtcAogICAgIGF0IGluaXQgZXZlcnl0aW1lIHlvdSB1c2UgdGhlIE1NYXBGaWxlIGRpcmVjdGl2ZS4gUFIgODMxNAogICAgIFtQYXVsIEouIFJlZGVyXQoKICAqKSBUcmlnZ2VyIGFuIGVycm9yIHdoZW4gYSBMb2FkTW9kdWxlIGRpcmVjdGl2ZSBhdHRlbXB0cyB0bwogICAgIGxvYWQgYSBtb2R1bGUgd2hpY2ggaXMgYnVpbHQtaW4uICBUaGlzIGlzIGEgY29tbW9uIGVycm9yIHdoZW4KICAgICBzd2l0Y2hpbmcgZnJvbSBhIERTTyBidWlsZCB0byBhIHN0YXRpYyBidWlsZC4gIFtKZWZmIFRyYXdpY2tdCgogICopIENoYW5nZSBpbnN0ZHNvLnNoIHRvIHVzZSBsaWJ0b29sIC0taW5zdGFsbCBldmVyeXdoZXJlIGFuZCB0aGVuCiAgICAgY2xlYW4gdXAgc29tZSBzdHJheSBmaWxlcyBhbmQgc3ltbGlua3MgdGhhdCBsaWJ0b29sIGxlYXZlcyBhcm91bmQKICAgICBvbiBzb21lIHBsYXRmb3Jtcy4gIFRoaXMgZ2V0cyBzdWJ2ZXJzaW9uIGJ1aWxkaW5nIHByb3Blcmx5IHNpbmNlCiAgICAgaXQgbmVlZGVkIGEgcmUtbGluayB0byBiZSBwZXJmb3JtZWQgYnkgbGlidG9vbCBhdCBpbnN0YWxsIHRpbWUsCiAgICAgYW5kIHRoZSBvbGQgaW5zdGRzby5zaCBsb2dpYyB0byBzaW1wbHkgY3AgdGhlIERTTyBkaWRuJ3QgaGFuZGxlCiAgICAgdGhhdCByZXF1aXJlbWVudC4gIFtTYW5kZXIgU3RyaWtlcl0KCiAgKikgQWxsb3cgVlBBVEggYnVpbGRzIHRvIHN1Y2NlZWQgd2hlbiBjb25maWd1cmVkIGZyb20gYW4gZW1wdHkKICAgICBkaXJlY3RvcnkuICBbVGhvbSBNYXkgPHRob20gcGxhbmV0YXJ5dHJhbXAubmV0Pl0KCiAgKikgRml4ICdjb250cm9sIHJlYWNoZXMgZW5kIG9mIG5vbi12b2lkIGZ1bmN0aW9uJyB3YXJuaW5nIGluCiAgICAgc2VydmVyL2xvZy5jLiAgW0JlbiBDb2xsaW5zLVN1c3NtYW4gPHN1c3NtYW4gY29sbGFiLm5ldD5dCgogICopIFBlcmNoaWxkIE1QTSBpcyBub3cgY29ycmVjdGx5IGRlZW1lZCBhcyBleHBlcmltZW50YWwgYW5kIGlzIG5vdwogICAgIGxvY2F0ZWQgaW4gc2VydmVyL21wbS9leHBlcmltZW50YWwuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEZpeCBzZWdmYXVsdCBpbiBtb2RfbWVtX2NhY2hlIHdoZW4gZ2FyYWJnZSBjb2xsZWN0aW5nIGFuIGV4cGlyZWQKICAgICBjYWNoZSBlbnRyeS4gIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBJbnRyb2R1Y2VkIC1FIHN0YXJ0dXBfbG9nZmlsZV9uYW1lIG9wdGlvbiB0byBodHRwZCB0byBhbGxvdyBhZG1pbnMKICAgICB0byBiZWdpbiBsb2dnaW5nIGVycm9ycyBpbW1lZGlhdGVseS4gIFRoaXMgcHJvdmlkZXMgV2luMzIgdXNlcnMgCiAgICAgYW4gYWx0ZXJuYXRpdmUgdG8gc2VuZGluZyBzdGFydHVwIGVycm9ycyB0byB0aGUgZXZlbnQgdmlld2VyLCBhbmQKICAgICBhbGxvd3Mgb3RoZXIgZGFlbW9uIHRvb2wgYXV0aG9ycyBhbiBhbHRlcm5hdGl2ZSB0byBsb2dnaW5nIHRvIHN0ZGVyci4KICAgICBbV2lsbGlhbSBSb3dlXSAKICAgICAKICAqKSBGaXggc3VicmVxcyB3aXRoIG5vbi1kZWZpbmVkIENvbnRlbnQtVHlwZXMgYmVpbmcgc2VydmVkIGltcHJvcGVybHkuCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBNZXJnZSBpbiBsYXRlc3QgR05VIGNvbmZpZy5ndWVzcyBhbmQgY29uZmlnLnN1YiBmaWxlcy4gIFBSIDc4MTguCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBNb3ZlIDEwMCAtIENvbnRpbnVlIHN1cHBvcnQgdG8gdGhlIEhUVFBfSU4gZmlsdGVyIHNvIHRoYXQgZmlsdGVycwogICAgIGFyZSBndWFyYW50ZWVkIHRvIHN1cHBvcnQgMTAwIC0gQ29udGludWUgbG9naWMgd2l0aG91dCBhbnkKICAgICBpbnRlcnZlbnRpb24uICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEFkZCBIVFRQIGNodW5rZWQgaW5wdXQgdHJhaWxlciBzdXBwb3J0LiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBSZW5hbWUgYW5kIGV4cG9ydCBnZXRfbWltZV9oZWFkZXJzIGFzIGFwX2dldF9taW1lX2hlYWRlcnMuCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBBbGxvdyBlbXB0eSBIb3N0OiBoZWFkZXIgYXJndW1lbnRzLiAgUFIgNzQ0MS4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgUHJvcGVybHkgc3Vic3RpdHV0ZSBzYmluZGlyIGFzIGh0dHBkJ3MgbG9jYXRpb24gaW4gYXBhY2hlY3RsLiAgUFIgNzg0MC4KICAgICBbQW5kcmVhcyBIYXNlbmFjayA8YW5kcmVhcyBuZXRiYW5rLmNvbS5icj5dCgogICopIEFsbG93IFdpbjMyIHNoZWJhbmcgc2NyaXB0cyB0byBmb2xsb3cgdGhlIHBhdGggKG9yIG9taXQgdGhlIC5leGUKICAgICBzdWZmaXggZnJvbSB0aGUgc2hlYmFuZyBjb21tYW5kKSwgYW5kIGFsbG93IFNjcmlwdEludGVycHJldGVyU291cmNlCiAgICAgUmVnaXN0cnkgb3IgUmVnaXN0cnlTdHJpY3QgdG8gb3ZlcnJpZGUgc2hlYmFuZyBsaW5lcywgYXMgMS4zIGRpZC4KICAgICBQUiA4MDA0ICBbV2lsbGlhbSBSb3dlXQoKICAqKSB3b3JrZXIgTVBNOiBGaXggYSBzaXR1YXRpb24gd2hlcmUgYSBjaGlsZCBleGl0ZWQgd2l0aG91dCByZWxlYXNpbmcKICAgICB0aGUgYWNjZXB0IG11dGV4LiAgRGVwZW5kaW5nIG9uIHRoZSBPUyBhbmQgbXV0ZXggbWVjaGFuaXNtIHRoaXMgCiAgICAgY291bGQgcmVzdWx0IGluIGEgaGFuZy4gIFtKZWZmIFRyYXdpY2tdCgogICopIFVwZGF0ZSB0aGUgaW5zdHJ1Y3Rpb25zIGZvciBob3cgdG8gZ2V0IHN0YXJ0ZWQgd2l0aCBtb2RfZXhhbXBsZS4KICAgICBbU3RhcyBCZWttYW5dCiAgCiAgKikgRml4IFBpZEZpbGUgdG8gZGVmYXVsdCB0byByZWxfcnVudGltZWRpciBpbnN0ZWFkIG9mCiAgICAgcmVsX2xvZ2ZpbGVkaXIuICBQUiA3ODQxLiAgW0FuZHJlYXMgSGFzZW5hY2sgPGFuZHJlYXMgbmV0YmFuay5jb20uYnI+XQoKICAqKSBXaW4zMjogRml4IHByb2JsZW0gdGhhdCBjYXVzZWQgcmFwaWQgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24KICAgICB3aGVuIG51bWJlciBvZiBjb25uZWN0aW5nIGNsaWVudHMgZXhjZWVkZWQgVGhyZWFkc1BlckNoaWxkLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXhlZCBhIHNlZ2ZhdWx0IHBhcnNpbmcgbGFyZ2UgU1NJcyBvbiBub24tbW1hcCBzeXN0ZW1zLgogICAgIFtCcmlhbiBIYXZhcmRdCgogICopIFByb3h5IHdhcyBib21iaW5nIG91dCBldmVyeSBzZWNvbmQga2VlcGFsaXZlIHJlcXVlc3QsIGNhdXNlZCBieSBhCiAgICAgc3RyYXkgQ1JMRiBiZWZvcmUgdGhlIHNlY29uZCByZXNwb25zZSdzIHN0YXR1cyBsaW5lLiBQcm94eSBub3cKICAgICB0cmllcyB0byByZWFkIG9uZSBtb3JlIGxpbmUgaWYgaXQgZW5jb3VudGVycyBhIENSTEYgd2hlcmUgaXQKICAgICBleHBlY3RlZCBhIHN0YXR1cy4gUFIgMTAwMTAgW0dyYWhhbSBMZWdnZXR0XQoKICAqKSBEZXByZWNhdGVkIHRoZSBhcHJfbG9jay5oIEFQSS4gUGxlYXNlIHNlZSB0aGUgZm9sbG93aW5nIGZpbGVzCiAgICAgZm9yIHRoZSBpbXByb3ZlZCB0aHJlYWQgYW5kIHByb2Nlc3MgbG9ja2luZyBhbmQgc2lnbmFsaW5nOiAKICAgICBhcHJfcHJvY19tdXRleC5oLCBhcHJfdGhyZWFkX211dGV4LmgsIGFwcl90aHJlYWRfcndsb2NrLmgsCiAgICAgYXByX3RocmVhZF9jb25kLmgsIGFuZCBhcHJfZ2xvYmFsX211dGV4LmguICBbQWFyb24gQmFubmVydF0KCiAgKikgQ2hhbmdlIG1vZF9zdGF0dXMgdG8gdXNlIHNjb3JlYm9hcmQgYWNjZXNzb3IgZnVuY3Rpb25zIHNvIGl0IGNhbgogICAgIGJlIHVzZWQgaW4gYW55IE1QTSB3aXRob3V0IGhhdmluZyB0byBiZSByZWNvbXBpbGVkLgogICAgIFtSeWFuIE1vcmdhbiA8cm1vcmdhbiBjb3ZhbGVudC5uZXQ+XQoKICAqKSBGaXggcGFyc2luZyBvZiBzb21lIEFQX0RFQ0xBUkVfREFUQSBkZWNsYXJhdGlvbnMgc28gdGhhdCB0aGUgZmlsdGVyCiAgICAgaGFuZGxlIGRlY2xhcmF0aW9ucyBhcmUgcmVjb2duaXplZC4gIFRoaXMgZml4ZXMgcHJvYmxlbXMgbG9hZGluZyAKICAgICBtb2RfYXV0b2luZGV4IG9uIHNvbWUgcGxhdGZvcm1zLiAgW0JyaWFuIEhhdmFyZF0KCiAgKikgYWRkIG9wdGlvbmFsIGZpeHVwIGhvb2sgdG8gcHJveHkgW0RhbmllbCBMb3BleiA8ZGFuaWVsIGNvdmFsZW50Lm5ldD5dCgogICopIFJlbWluZCB0aGUgYWRtaW4gYWJvdXQgdGhlIFVzZXIgYW5kIEdyb3VwIGRpcmVjdGl2ZXMgd2hlbiB3ZSBhcmUKICAgICB1bmFibGUgdG8gc2V0IHBlcm1pc3Npb25zIG9uIGEgc2VtYXBob3JlLiAgUFIgNzgxMiAgW0plZmYgVHJhd2lja10KCiAgKikgZml4IHBvc3NpYmxlIGNvbXBpbGF0aW9uIHByb2JsZW0gaW4gc3NsX2VuZ2luZV9rZXJuZWwuYy4gUFIgNzgwMgogICAgIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIGZpeCBwb3NzaWJsZSBpbmZpbml0ZSBsb29wIGluIG1vZF9zc2wgdHJpZ2dlcmVkIGJ5IGNlcnRhaW4KICAgICBuZXRzY2FwZSBjbGllbnRzIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIGZpeCBQcm94eVBhc3Mgd2hlbiBmcm9udGVuZCBpcyBodHRwcyBhbmQgYmFja2VuZCBpcyBodHRwCiAgICAgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgQWRkIERBU0wgc3VwcG9ydCB0byBtb2RfZGF2CiAgICAgW1N1bmcgS2ltIDxodW5raW0gY3NlLnVjc2MuZWR1Pl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjM1CgogICopIG1vZF9yZXdyaXRlOiB1cGRhdGVkIHRvIHVzZSB0aGUgbmV3IEFQUiBnbG9iYWwgbXV0ZXggdHlwZS4KICAgICBbQWFyb24gQmFubmVydF0KCiAgKikgRml4ZXMgZm9yIG1vZF9pbmNsdWRlIGVycm9ycyBvbiBib3VuZGFyeSBjb25kaXRpb25zIGluIHdoaWNoCiAgICAgIjwhLS0jIiBvY2N1cnMgYXQgdGhlIHZlcnkgZW5kIG9mIGEgYnVja2V0CiAgICAgW1BhdWwgUmVkZXIsIEJyaWFuIFBhbmVdCgogICopIHdvcmtlciwgcHJlZm9yaywgcGVyY2hpbGQsIGJlb3MgTVBNczogQWRkIC1ERk9SRUdST1VORCBzd2l0Y2ggdG8gCiAgICAgY2F1c2UgdGhlIEFwYWNoZSBwYXJlbnQgcHJvY2VzcyB0byBydW4gaW4gdGhlIGZvcmVncm91bmQgKHNpbWlsYXIgdG8KICAgICAtRE5PX0RFVEFDSCBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IHN3aXRjaCBzZXNzaW9uIGlkcykuICAKICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBZGRlZCBzdXBwb3J0IGZvciBQb3NpeCBzZW1hcGhvcmUgbXV0ZXggbG9ja2luZyAoQWNjZXB0TXV0ZXggcG9zaXhzZW0pCiAgICAgZm9yIHRob3NlIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgaXQuIElmIHVzaW5nIHRoZSBkZWZhdWx0CiAgICAgaW1wbGVtZW50YXRpb24sIHRoaXMgaXMgYmV0d2VlbiBwdGhyZWFkIGFuZCBzeXN2c2VtIGluIHByaW9yaXR5LgogICAgIFRoaXMgaW1wbGllcyBpdCdzIHRoZSBuZXcgZGVmYXVsdCBmb3IgRGFyd2luLiBbSmltIEphZ2llbHNraV0KCiAgKikgQUlYOiBGaXggdGhlIHN5bnRheCBmb3Igc2V0dGluZyB0aGUgTERSX0NOVFJMIGFuZCBBSVhUSFJFQURfU0NPUEUKICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW4gdGhlIGVudnZhcnMgZmlsZS4gIFtKZWZmIFRyYXdpY2tdCgogICopIHdvcmtlciBNUE06IERvbid0IGNyZWF0ZSBhIGxpc3RlbmVyIHRocmVhZCB1bnRpbCB3ZSBoYXZlIGEgd29ya2VyCiAgICAgdGhyZWFkLiAgT3RoZXJ3aXNlLCBpbiBzaXR1YXRpb25zIHdoZXJlIHdlJ2xsIGhhdmUgdG8gd2FpdCBhIHdoaWxlCiAgICAgdG8gdGFrZSBvdmVyIHNjb3JlYm9hcmQgc2xvdHMgZnJvbSBhIHByZXZpb3VzIGdlbmVyYXRpb24sIHdlJ2xsIGJlCiAgICAgYWNjZXB0aW5nIGNvbm5lY3Rpb25zIHdlIGNhbid0IHByb2Nlc3MgeWV0LiAgW0plZmYgVHJhd2lja10KCiAgKikgQWxsb3cgd29ya2VyIE1QTSB0byBidWlsZCBvbiBzeXN0ZW1zIHdpdGhvdXQgcHRocmVhZF9raWxsKCkuCiAgICAgW1BpZXIgRnVtYWdhbGxpLCBKZWZmIFRyYXdpY2tdCgogICopIFByZXZlbnQgYXBfYWRkX291dHB1dF9maWx0ZXJzX2J5X3R5cGUgZnJvbSBiZWluZyBjYWxsZWQgaW4KICAgICBhcF9zZXRfY29udGVudF90eXBlIGlmIHRoZSBjb250ZW50LXR5cGUgaGFzbid0IGNoYW5nZWQuCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBQZXJmb3JtYW5jZTogaW1wbGVtZW50ZWQgdGhlIGJ1Y2tldCBhbGxvY2F0b3IgbWFkZSBwb3NzaWJsZSBieSB0aGUKICAgICBBUEkgY2hhbmdlIGluIDIuMC4zNC4gIFtDbGlmZiBXb29sbGV5XQoKICAqKSBEb24ndCBhbGxvdyBpbml0aWFsaXphdGlvbiB0byBzdWNjZWVkIGlmIHdlIGNhbid0IGdldCBhIHNvY2tldAogICAgIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZSBMaXN0ZW4gc3RhdGVtZW50cy4gIFtKZWZmIFRyYXdpY2tdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4zNAoKICAqKSBBbGxvdyBhbGwgUGVyY2hpbGQgZGlyZWN0aXZlcyB0byBhY2NlcHQgZWl0aGVyIG51bWVyaWNhbCBVSUQvR0lECiAgICAgb3IgbG9naWNhbCB1c2VyL2dyb3VwIG5hbWVzLiAgW1Njb3R0IExhbWIgPHNsYW1iIHNsYW1iLm9yZz5dCgogICopIE1ha2UgUGVyY2hpbGQgY29tcGlsZSBjbGVhbmx5IGFuZCBzZXJ2ZSBwYWdlcyBhZ2Fpbi4gW1J5YW4gQmxvb21dCgogICopIGltcGxlbWVudCBzc2wgcHJveHkgdG8gc3VwcG9ydCBQcm94eVBhc3MgLyBodHRwczovLyBhbmQgdGhlCiAgICAgU1NMUHJveHkqIGRpcmVjdGl2ZXMgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgVXBkYXRlIG1vZF9jZ2lkIHRvIG5vdCBkbyBzaW5nbGUtYnl0ZSBzb2NrZXQgcmVhZHMgZm9yIENHSSBoZWFkZXJzCiAgICAgW0JyaWFuIFBhbmVdCgogICopIE1hZGUgQUIncyB1c2Ugb2YgdGhlIEhvc3Q6IGhlYWRlciByZmMyNjE2IGNvbXBsaWFudAogICAgIGJ5IFRhaXN1a2UgWWFtYWRhIDx0YWkgaWlqLmFkLmpwPiBbRGlyay1XaWxsZW0gdmFuIEd1bGlrXS4KCiAgKikgVGhlIG9sZCwgbGVnYWN5IChhbmQgdW51c2VkKSBjb2RlIGluIHdoaWNoIHRoZSBzY29yZWJvYXJkIHdhcyB0b3RhbGx5CiAgICAgYW5kIGNvbXBsZXRlbHkgY29udGFpbmVkIGluIGEgZmlsZSAoU0NPUkVCT0FSRF9GSUxFKSBoYXMgYmVlbgogICAgIHJlbW92ZWQuIFRoaXMgZG9lcyBub3QgYWZmZWN0IHNjb3JlYm9hcmRzIHdoaWNoIGFyZSAqbWFwcGVkKiB0bwogICAgIGZpbGVzIHVzaW5nIG5hbWVkLXNoYXJlZC1tZW1vcnkuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBDaGFuZ2UgYnVja2V0IGJyaWdhZGVzIEFQSSB0byBhbGxvdyBhICJidWNrZXQgYWxsb2NhdG9yIiB0byBiZQogICAgIHBhc3NlZCBpbiBhdCBjZXJ0YWluIHBvaW50cy4gIFRoaXMgYWxsb3dzIHVzIHRvIGltcGxlbWVudCBmcmVlbGlzdHMKICAgICBzbyB0aGF0IHdlIGNhbiBzdG9wIHVzaW5nIG1hbGxvYy9mcmVlIHNvIGZyZXF1ZW50bHkuCiAgICAgW0NsaWZmIFdvb2xsZXksIEJyaWFuIFBhbmVdCgogICopIEFkZCBzdXBwb3J0IGZvciBtYWNybyBleHBhbnNpb24gd2l0aGluIHRoZSB2YXJpYWJsZSBuYW1lcyBpbgogICAgIDwhLS0jZWNoby0tPiBhbmQgPCEtLSNzZXQtLT4gZGlyZWN0aXZlcyBbQnJpYW4gUGFuZV0KCiAgKikgRml4IHNvbWUgbW9kX2luY2x1ZGUgc2VnZmF1bHRzIFtDbGlmZiBXb29sbGV5LCBCcmlhbiBQYW5lLCBCcmFkIE5pY2hvbGVzXQoKICAqKSBVcGRhdGUgdGhlICJSZWRIYXQiIExheW91dCB0byBtYXRjaCBSZWQgSGF0IExpbnV4IHZlcnNpb24gNy4gUFIgQlotNzQyMgogICAgIFtKb2UgT3J0b25dIAoKICAqKSBhZGQgY29tcGF0IGxheWVyIHRvIHN1cHBvcnQgUlNBIFNTTEMgMS54IGFuZCAyLnggaW4gbW9kX3NzbAogICAgIFtKb24gVHJhdmlzLCBKb2huIEJhcmJlZSwgV2lsbGlhbSBSb3dlLCBSeWFuIEJsb29tLCBEb3VnIE1hY0VhY2hlcm5dCgogICopIEFkZCBhIG5ldyBwYXJhbWV0ZXIgdG8gdGhlIHF1aWNrX2hhbmRsZXIgaG9vayB0byBpbnN0cnVjdAogICAgIHF1aWNrIGhhbmRsZXJzIHRvIG9wdGlvbmFsbHkgZG8gYSBsb29rdXAgcmF0aGVyIHRoYW4gYWN0dWFsbHkgCiAgICAgc2VydmUgY29udGVudC4gVGhpcyBpcyB0aGUgZmlyc3Qgb2Ygc2V2ZXJhbCBjaGFuZ2VzIHJlcXVpcmVkIGZpeAogICAgIHNldmVyYWwgcHJvYmxlbXMgd2l0aCBob3cgcXVpY2sgaGFuZGxlcnMgd29yayB3aXRoIHN1YnJlcXVlc3RzLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSB3b3JrZXIgTVBNOiBHZXQgTWF4UmVxdWVzdHNQZXJDaGlsZCB0byB3b3JrIGFnYWluLiAgW0plZmYgVHJhd2lja10KCiAgKikgW0FQUi1yZWxhdGVkXSBUaGUgb3JkZXJpbmcgb2YgdGhlIGRlZmF1bHQgYWNjZXB0IG11dGV4IG1ldGhvZCBoYXMKICAgICBiZWVuIGNoYW5nZWQgdG8gYmV0dGVyIG1hdGNoIHdoYXQncyBkb25lIGluIEFwYWNoZSAxLjMuIFRoZSBvcmRlcmluZyAKICAgICBpcyBub3cgKGhpZ2hlc3QgdG8gbG93ZXN0KTogcHRocmVhZCAtPiBzeXN2c2VtIC0+IGZjbnRsIC0+IGZsb2NrLgogICAgIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBFbnN1cmUgdGhhdCB0aGUgYnVpbGQvIGRpcmVjdG9yeSBpcyBjcmVhdGVkIHdoZW4gdXNpbmcgVlBBVEguCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBBZGQgc29tZSBwb3B1bGFyIHR5cGVzIHRvIHRoZSBtaW1lIG1hZ2ljIGZpbGUuICBQUiA3NzMwLgogICAgIFtMaW51cyBXYWxsZWlqIDx0cmlhZCBkZi5sdGguc2U+LCBKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgUmVtb3ZlIHRoZSBzaW5nbGUtYnl0ZSBzb2NrZXQgcmVhZHMgZm9yIENHSSBoZWFkZXJzIFtCcmlhbiBQYW5lXQoKICAqKSBXaGVuIGEgcHJveGllZCBzaXRlIHdhcyBiZWluZyBzZXJ2ZWQsIEFwYWNoZSB3YXMgcmVwbGFjaW5nCiAgICAgdGhlIG9yaWdpbmFsIHNpdGUgU2VydmVyIGhlYWRlciB3aXRoIGl0J3Mgb3duLCB3aGljaCBpcyBub3QKICAgICBhbGxvd2VkIGJ5IFJGQzI2MTYuIEZpeGVkLiBbR3JhaGFtIExlZ2dldHRdCgogICopIEZpeCBhIG1vZF9jZ2lkIHByb2JsZW0gdGhhdCBsZWZ0IGRhZW1vbiBwcm9jZXNzZXMgc3RyYW5kZWQKICAgICBpbiBzb21lIHNlcnZlciByZXN0YXJ0IHNjZW5hcmlvcy4gIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZGVkIGV4cF9mb28gYW5kIHJlbF9mb28gdmFyaWFibGVzIHRvIGNvbmZpZ192YXJzLm1rIGZvcgogICAgIGFsbCBBcGFjaGUgYW5kIEF1dG9jb25mIHBhdGggdmFyaWFibGVzIChsaWtlIC0tc3lzY29uZmRpciwKICAgICAtLXNiaW5kaXIsIGV0YykuIGV4cF9mb28gaXMgdGhlICJleHBhbmRlZCIgdmVyc2lvbiwgd2hpY2ggbWVhbnMKICAgICB0aGF0IGFsbCBpbnRlcm5hbCB2YXJpYWJsZSByZWZlcmVuY2VzIGhhdmUgYmVlbiBpbnRlcnBvbGF0ZWQuCiAgICAgcmVsX2ZvbyBpcyB0aGUgc2FtZSBhcyAkZXhwX2Zvbywgb25seSByZWxhdGl2ZSB0byAkcHJlZml4IGlmIHRoZXkKICAgICBzaGFyZSBhIGNvbW1vbiBwYXRoLiAgW0Fhcm9uIEJhbm5lcnRdCgogICopIEZpeCBzb21lIHJlc3RhcnQvdGVybWluYXRlIHByb2JsZW1zIGluIHRoZSB3b3JrZXIgTVBNLiAgRG9uJ3QKICAgICBkcm9wIGNvbm5lY3Rpb25zIGR1cmluZyBncmFjZWZ1bCByZXN0YXJ0LiAgW0plZmYgVHJhd2lja10KCiAgKikgQ2hhbmdlIHRoZSBoZWFkZXIgbWVyZ2luZyBiZWhhdmlvdXIgaW4gcHJveHksIGFzIHNvbWUgaGVhZGVycwogICAgIChsaWtlIFNldC1Db29raWUpIGNhbm5vdCBiZSB1bm1lcmdlZCBkdWUgdG8gc3RyYXkgY29tbWFzIGluCiAgICAgZGF0ZXMuIFtHcmFoYW0gTGVnZ2V0dF0KCiAgKikgQmUgbW9yZSB2b2NhbCBhYm91dCB3aGF0IEFjY2VwdE11dGV4IHZhbHVlcyB3ZSBhbGxvdywgdG8gbWFrZQogICAgIHVzIGNsb3NlciB0byBob3cgMS4zIGRvZXMgaXQuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBHZXQgbnBoLSBDR0kgc2NyaXB0cyB3b3JraW5nIGFnYWluLiAgUFJzIDg5MDIsIDg5MDcsIDk5ODMKICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBVcGdyYWRlZCBQQ1JFIGxpYnJhcnkgdG8gbGF0ZXN0IHZlcnNpb24gMy45IFtCcmlhbiBQYW5lXQoKICAqKSBBZGQgYWNjZXNzb3IgZnVuY3Rpb24gdG8gc2V0IHItPmNvbnRlbnRfdHlwZS4gRnJvbSBub3cgb24sCiAgICAgYXBfcnNldF9jb250ZW50X3R5cGUoKSBzaG91bGQgYmUgdXNlZCB0byBzZXQgci0+Y29udGVudF90eXBlLgogICAgIFRoaXMgY2hhbmdlIGlzIHJlcXVpcmVkIHRvIHByb3Blcmx5IGltcGxlbWVudCB0aGUgCiAgICAgQWRkT3V0cHV0RmlsdGVyQnlUeXBlIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlLgogICAgIFtCaWxsIFN0b2RkYXJkLCBTYW5kZXIgU3RyaWtlciwgUnlhbiBCbG9vbV0KCiAgKikgQWRkIG5ldyBNX0ZPTyBzeW1ib2xzIGZvciB0aGUgV2ViREFWL0RlbHRhViBtZXRob2RzIHNwZWNpZmllZCBieQogICAgIFJGQyAzMjUzLiBJbXByb3ZlZCB0aGUgbWV0aG9kIG5hbWUvbnVtYmVyIG1hcHBpbmcgZnVuY3Rpb25zLgogICAgIFtHcmVnIFN0ZWluXQoKICAqKSByZW1vdmUgc29ja19lbmFibGVfbGluZ2VyIGZyb20gY29ubmVjdGlvbi5jIFtJYW4gSG9sc21hbl0KCiAgKikgRml4IGZvciB2aXJ0dWFsIGhvc3QgcHJvY2Vzc2luZyB3aGVyZSB0aGUgcmVxdWVzdGVkIGhvc3RuYW1lCiAgICAgaGFzIGEgJy4nIGF0IHRoZSBlbmQgKFBSIDkxODcpIFtSeWFuIENydXNlIDxyeWFuIGVzdGFyYS5jb20+XQoKICAqKSBtb2RfZGF2J3MgQVBJcyBmb3IgUkVQT1JUIHJlc3BvbnNlIGhhbmRsaW5nIHdhcyBjaGFuZ2VkIHNvIHRoYXQKICAgICBwcm92aWRlcnMgY2FuIGdlbmVyYXRlIHRoZSBjb250ZW50IGRpcmVjdGx5IGludG8gdGhlIG91dHB1dCBmaWx0ZXIKICAgICBzdGFjaywgcmF0aGVyIHRoYW4gYnVmZmVyaW5nIHRoZSByZXNwb25zZSBpbnRvIG1lbW9yeS4gW0dyZWcgU3RlaW5dCgogICopIEZpeCBhIGhhbmcgY29uZGl0aW9uIHdpdGggZ3JhY2VmdWwgcmVzdGFydCBhbmQgcHJlZm9yayBNUE0KICAgICBpbiB0aGUgc2l0dWF0aW9uIHdoZXJlIE1heENsaWVudHMgaXMgdmVyeSBoaWdoIGJ1dAogICAgIG11Y2ggZmV3ZXIgc2VydmVycyBhcmUgYWN0dWFsbHkgc3RhcnRlZCBhdCB0aGUgdGltZSBvZiB0aGUKICAgICByZXN0YXJ0LiAgW0plZmYgVHJhd2lja10KCiAgKikgU21hbGwgcGVyZm9ybWFuY2UgZml4ZXMgZm9yIG1vZF9pbmNsdWRlIFtCcmlhbiBQYW5lXQoKICAqKSBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBmb3IgdGhlIGVycm9yIGxvZ2dlciBbQnJpYW4gUGFuZV0KCiAgKikgQ2hhbmdlIGNvbmZpZ3VyZSBzbyB0aGF0IFNvbGFyaXMgOCBhbmQgYWJvdmUgaGF2ZSAKICAgICBTSU5HTEVfTElTVEVOX1VOU0VSSUFMSVpFRF9BQ0NFUFQgZGVmaW5lZCBieSBkZWZhdWx0LgogICAgIGFjY29yZGluZyB0byBzdW4gcGVvcGxlIHNvbGFyaXMgOCsgZG9lc24ndCBoYXZlIGEgdGh1bmRlcmluZwogICAgIGhlcmQgcHJvYmxlbSBbSWFuIEhvbHNtYW5dCgogICopIEFsbG93IFVSSXMgc3BlY2lmeWluZyBDR0kgc2NyaXB0cyB0byBpbmNsdWRlICcvJyBhdCB0aGUgZW5kCiAgICAgKGUuZy4sIC9jZ2ktYmluL3ByaW50ZW52Lykgb24gQUlYIGFuZCBTb2xhcmlzIChhbmQgb3RoZXIgT1NzCiAgICAgd2hpY2ggaWdub3JlICcvJyBhdCB0aGUgZW5kIG9mIHRoZSBuYW1lcyBvZiBub24tZGlyZWN0b3JpZXMpLgogICAgIFBSIDEwMTM4ICBbSmVmZiBUcmF3aWNrXQoKICAqKSBpbXBsZW1lbnQgU1NMU2Vzc2lvbkNhY2hlIHNobWh0IGFuZCBzaG1jYiBiYXNlZCBvbiBhcHJfcm1tIGFuZAogICAgIGFwcl9zaG0uICBbTWFkaHVzdWRhbiBNYXRoaWhhbGxpIDxtYWRodXN1ZGFuX21hdGhpaGFsbGkgaHAuY29tPl0KCiAgKikgRml4IGFweHMgLWcgaGFuZGxpbmcuICBNb3ZlIGNvbmZpZ192YXJzLm1rIGZyb20gdGhlIHRvcCBidWlsZAogICAgIGRpcmVjdG9yeSB0byB0aGUgYnVpbGQgZGlyZWN0b3J5LiAgUFIgMTAxNjMgIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBzb21lIG1vZF9pbmNsdWRlIHByb2JsZW1zIHdoaWNoIGJyb2tlIGV2YWx1YXRpb24gb2Ygc29tZQogICAgIGV4cHJlc3Npb25zLiAgUFIgMTAxMDggIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCB0aGUgY2FsY3VsYXRpb24gb2YgcmVxdWVzdCB0aW1lIGluIG1vZF9zdGF0dXMuICBbU3RhcyBCZWttYW5dCgogICopIEZpeCB0aGUgY2FsY3VsYXRpb24gb2YgdGhyZWFkX251bSBpbiB0aGUgd29ya2VyIHNjb3JlIHN0cnVjdHVyZS4KICAgICBbU3RhcyBCZWttYW5dCgogICopIFVzZSBhcHJfYXRvbWljIG9wZXJhdGlvbnMgaW4gbWFuYWdpbmcgdGhlIG1vZF9tZW1fY2FjaGUKICAgICBjYWNoZV9vYmplY3RzIGZvciBTTVAgc2NhbGFiaWxpdHkuIChzZWUgVVNFX0FUT01JQ1MKICAgICBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIGluIG1vZF9maWxlX2NhY2hlKQogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBBZGQgZmlsZWhhbmRsZSBjYWNoaW5nIHRvIG1vZF9tZW1fY2FjaGUuIChzZWUgQ0FDSEVfRkQKICAgICBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIGluIG1vZF9maWxlX2NhY2hlKQogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBJbXBsZW1lbnQgcHJvdG90eXBlIG1vZF9kaXNrX2NhY2hlIGZvciB1c2Ugd2l0aCBtb2RfY2FjaGUuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIEFkZCBhIG1pc3NpbmcgbWFudWFsZGlyIGVudHJ5IGluIHRoZSBEZWJpYW4gY29uZmlnLmxheW91dC4KICAgICBbVGhvbSBNYXkgPHRob20gcGxhbmV0YXJ5dHJhbXAubmV0Pl0KCiAgKikgU3RvcCBpbnN0YWxsaW5nIGxpYnRvb2wgZm9yIEFQUiBhbmQgdGVsbCBBUFIgd2hlcmUgaXQgc2hvdWxkIHBsYWNlCiAgICAgaXRzIGNvcHkgb2YgbGlidG9vbCAodmlhIG91ciBpbnN0YWxsYnVpbGRwYXRoIGxheW91dCB2YXJpYWJsZSkuCiAgICAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBOZXcgZGlyZWN0aXZlIFByb3h5SU9CdWZmZXJTaXplLiBTZXRzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdXNlZAogICAgIHdoZW4gcmVhZGluZyBmcm9tIGEgcmVtb3RlIEhUVFAgc2VydmVyIGluIHByb3h5LiBbR3JhaGFtIExlZ2dldHRdCgogICopIE1vZGlmeSByZWNlaXZlL3NlbmQgbG9vcCBpbiBwcm94eV9odHRwIGFuZCBwcm94eV9mdHAgc28gdGhhdAogICAgIHNob3VsZCBpdCBiZSBuZWNlc3NhcnksIHRoZSByZW1vdGUgc2VydmVyIHNvY2tldCBpcyBjbG9zZWQgYmVmb3JlCiAgICAgdHJhbnNtaXR0aW5nIHRoZSBsYXN0IGJ1ZmZlciAoc2V0IGJ5IFByb3h5SU9CdWZmZXJTaXplKSB0byB0aGUKICAgICBjbGllbnQuIFRoaXMgcHJldmVudHMgdGhlIGJhY2tlbmQgc2VydmVyIGZyb20gYmVpbmcgZm9yY2VkIHRvIGhhbmcKICAgICBhcm91bmQgd2hpbGUgdGhlIGxhc3QgZmV3IGJ5dGVzIGFyZSB0cmFuc21pdHRlZCB0byBhIHNsb3cgY2xpZW50LgogICAgIEZpeCB0aGUgY2FzZSB3aGVyZSBubyBlcnJvciBjaGVja2luZyB3YXMgcGVyZm9ybWVkIG9uIHRoZSBmaW5hbAogICAgIGJyaWdhZGUgaW4gdGhlIGxvb3AuIFtHcmFoYW0gTGVnZ2V0dF0KCiAgKikgU2NyYXAgQ2FjaGVNYXhFeHBpcmVNaW4gYW5kIENhY2hlRGVmYXVsdEV4cGlyZU1pbi4gQ2hhbmdlCiAgICAgQ2FjaGVNYXhFeHBpcmUgYW5kIENhY2hlRGVmYXVsdEV4cGlyZSB0byB1c2Ugc2Vjb25kcyByYXRoZXIgdGhhbgogICAgIGhvdXJzLiBbR3JhaGFtIExlZ2dldHQsIEJpbGwgU3RvZGRhcmRdCgogICopIE5ldyBEaXJlY3RpdmUgU1NJVW5kZWZpbmVkRWNoby4gdG8gY2hhbmdlIHRoZSAnKG5vbmUpJyBlY2hvZWQKICAgICBmb3IgYSB1bmRlZmluZWQgdmFyaWFibGUuIFtJYW4gSG9sc21hbl0KCiAgKikgUHJveHkgSFRUUCBhbmQgQ09OTkVDVDogS2VlcCB0cnlpbmcgb3RoZXIgYWRkcmVzc2VzIGZyb20gdGhlIEROUwogICAgIHdoZW4gd2UgY2FuJ3QgZ2V0IGEgc29ja2V0IGluIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBmYW1pbHkuICBXZSBtYXkKICAgICBoYXZlIGdvdHRlbiBiYWNrIGFuIElQdjYgYWRkcmVzcyBmaXJzdCBhbmQgeWV0IG91ciBzeXN0ZW0gaXMgbm90CiAgICAgY29uZmlndXJlZCB0byBhbGxvdyBJUHY2IHNvY2tldHMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBCZSBtb3JlIGNhcmVmdWwgYWJvdXQgcmVjdXJzaXZlbHkgcmVtb3ZpbmcgQ1ZTIGRpcmVjdG9yaWVzLiBNYWtlCiAgICAgc3VyZSB0aGF0IHdlIGFyZW4ndCBjZCdpbmcgdG8gdGhlaXIgaG9tZSBkaXJlY3RvcnkgZmlyc3QuIFBSOiA5OTkzCiAgICAgW0Fhcm9uIEJhbm5lcnQsIEphbWVzIExld2lzTW9zcyA8ZHJlcyBsZXdpc21vc3MubmV0Pl0KCiAgKikgQWRkIGEgbWlzc2luZyBlcnJvcmRpciBlbnRyeSBpbiB0aGUgRGViaWFuIGNvbmZpZy5sYXlvdXQuIFBSOiAxMDA2NwogICAgIFtEaXJrLUphbiBGYWJlciA8ZGlyay1qYW4gc2Vsd2VyZC5ubD4sIEFhcm9uIEJhbm5lcnQsCiAgICAgIFRob20gTWF5IDx0aG9tIHBsYW5ldGFyeXRyYW1wLm5ldD5dCgogICopIFJlbmFtZSB0aGUgZmlsdGVyIG9yZGVyaW5nIHByaW9yaXRpZXMuICBUaGUgcmVjZW50IGZpbHRlcmluZyBmaXhlcwogICAgIGhhdmUgc2hvd2Nhc2VkIHByb2JsZW1zIHdpdGggdGhlaXIgdXNhZ2UuICBUaGVyZWZvcmUsIHdlIG5lZWQgdG8KICAgICByZW5hbWUgdGhlbSB0byBpbmNyZWFzZSB0aGUgY2xhcml0eS4gIChDT05URU5ULT5SRVNPVVJDRSwKICAgICBIVFRQX0hFQURFUi0+Q09OVEVOVF9TRVQvUFJPVE9DT0wpICBbSnVzdGluIEVyZW5rcmFudHpdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4zMwoKICAqKSBGaXggYSBwcm9ibGVtIGluIHRoZSBuZXcgLS1lbmFibGUtbGF5b3V0IGZ1bmN0aW9uYWxpdHkgd2hlcmUKICAgICBpdCB3b3VsZG4ndCBhbGxvdyBvdmVycmlkZXMgZnJvbSB2YXJpYWJsZXMgbGlrZSAtLXByZWZpeCwKICAgICAtLWJpbmRpciwgZXRjLiAgW1Rob20gTWF5IDx0aG9tIHBsYW5ldGFyeXRyYW1wLm5ldD5dCgogICopIEZpeCBhIGJ1ZyBpbiB0aGUgY29yZSBpbnB1dCBmaWx0ZXIgZm9yIEFQX01PREVfRVhIQVVTVElWRS4gSXQKICAgICBubyBsb25nZXIgaGFuZ3MgYXJvdW5kIHdhaXRpbmcgZm9yIHRoZSBzb2NrZXQgdG8gY2xvc2UgYmVmb3JlCiAgICAgcmV0dXJuaW5nIGV4aGF1c3RpdmUgZGF0YS4gIFtBYXJvbiBCYW5uZXJ0XQoKICAqKSByZW5hbWUgYXByX2V4cGxvZGVkX3RpbWVfdCB0byBhcHJfdGltZV9leHBfdCAoYXMgcGVyIHJlbmFtZXMgcGVuZGluZykKICAgICBbVGhvbSBNYXkgPHRob20gcGxhbmV0YXJ5dHJhbXAubmV0Pl0KCiAgKikgQ2hhbmdlIG1vZF9zc2wgdG8gYWx3YXlzIGRvIGEgZnVsbCBzdGFydHVwL3RlYXJkb3duIG9uIHJlc3RhcnRzLgogICAgIHRoaXMgYWxsb3dzIG1vZF9zc2wgdG8gYmUgYWRkZWQgdG8gYSBzZXJ2ZXIgdGhhdCBpcyBhbHJlYWR5CiAgICAgcnVubmluZyBhbmQgbWFrZXMgaXQgcG9zc2libGUgdG8gYWRkL2NoYW5nZSBjZXJ0cy9rZXlzIGFmdGVyIHRoZQogICAgIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkLiAgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgSW50cm9kdWNlIFBhc3NQaHJhc2VEaWFsb2cgInwvcGF0aC90by9waXBlIiBtZWNoYW5pc20gdG8gbW9kX3NzbC4KICAgICBUaGlzIHBpcGUgbXVzdCBiZSBhIGJpZGlyZWN0aW9uYWwgJ2NvbnNvbGUnIHN0eWxlIHJlbGF5LCB3aGljaAogICAgIG1vZF9zc2wgcHJpbnRzIGFsbCBwcm9tcHRzIHRvIHRoZSBwaXBlJ3Mgc3RkaW4sIGFuZCByZWFkcyB0aGUKICAgICBwYXNzcGhyYXNlcyBmcm9tIHRoZSBwaXBlJ3Mgc3Rkb3V0LiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRml4IGJ1ZyB3aGVyZSAtLXN5c2NvbmZkaXIgYW5kIC0tbG9jYWxzdGF0ZWRpciB3ZXJlIGJlaW5nCiAgICAgaWdub3JlZC4gIFtUaG9tIE1heSA8dGhvbSBwbGFuZXRhcnl0cmFtcC5uZXQ+LCBBYXJvbiBCYW5uZXJ0XQogICAgIFBSIDk4ODgKCiAgKikgRml4IC0tZW5hYmxlLWxheW91dCB0byB3b3JrIGFnYWluLiBDYXV0aW9uOiBXaGVuIHNwZWNpZnlpbmcKICAgICAtLWVuYWJsZS1sYXlvdXQsIGNvbW1vbiBhcmd1bWVudHMgbGlrZSAtLXByZWZpeCwgLS1leGVjLXByZWZpeCwKICAgICBldGMuIHdpbGwgYmUgaWdub3JlZCBhbmQgdGhlIHNldHRpbmdzIGZyb20gdGhlIGxheW91dCB3aWxsIGJlCiAgICAgdXNlZCBpbnN0ZWFkLiAgW1Rob20gTWF5IDx0aG9tIHBsYW5ldGFyeXRyYW1wLm5ldD4sIEFhcm9uIEJhbm5lcnRdCiAgICAgUFIgOTEyNCwgOTg3MywgOTg4NQoKICAqKSBOZXcgRGlyZWN0aXZlIGZvciBtb2RfcHJveHk6IFByb3h5UmVtb3RlTWF0Y2guIFRoaXMgcHJvdmlkZXMKICAgICByZWdleCBwYXR0ZXJuIG1hdGNoaW5nIGZvciB0aGUgZGV0ZXJtaW5hdGlvbiBvZiB3aGljaCByZXF1ZXN0cwogICAgIHRvIHVzZSB0aGUgcmVtb3RlIHByb3h5IGZvci4gW0ppbSBKYWdpZWxza2ldCgogICopIEZpeCBDdXN0b21Mb2cgYnl0ZXMtc2VudCB3aXRoIEhUVFAgMC45LiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBQcmV2ZW50IEFwYWNoZSBmcm9tIGlnbm9yaW5nIFNJR0hVUCBkdWUgdG8gc29tZSBsaW5nZXJpbmcgMS4zCiAgICAgY3J1ZnQgaW4gcGlwZWQgbG9ncyBhbmQgcmV3cml0ZW1hcCBjaGlsZCBwcm9jZXNzZXMuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQWxsIGluc3RhbmNlcyBvZiBhcHJfbG9ja190IGhhdmUgYmVlbiByZW1vdmVkIGFuZCBjb252ZXJ0ZWQKICAgICB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyBuZXcgbG9jayBBUElzOiBhcHJfdGhyZWFkX211dGV4LmgsCiAgICAgYXByX3Byb2NfbXV0ZXguaCwgb3IgYXByX2dsb2JhbF9tdXRleC5oLiBObyBuZXcgY29kZSBzaG91bGQKICAgICB1c2UgdGhlIGFwcl9sb2NrLmggQVBJLCBhcyB0aGUgb2xkIEFQSSB3aWxsIHNvb24gYmUgZGVwcmVjYXRlZC4KICAgICBbQWFyb24gQmFubmVydF0KCiAgKikgTWVyZ2VkIGluIGNoYW5nZXMgdG8gbW9kX3NzbCB1cCB0aHJvdWdoIDIuOC43LTEuMy4yMy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgQ2xpZmYgV29vbGxleV0KCiAgKikgbW9kLWluY2x1ZGU6IG1ha2UgaXQgaGFuZGxlIGZsdXNoJ2VzIGFuZCBmaXggdGhlICdmYWxzZS1hbGFybScKICAgICBbSnVzdGluIEVyZW5rcmFudHosIEJyaWFuIFBhbmUsIElhbiBIb2xzbWFuXQoKICAqKSBhcF9nZXRfKl9maWx0ZXJfaGFuZGxlKCkgZnVuY3Rpb25zIHRvIGFsbG93IDNyZCBwYXJ0eSBtb2R1bGVzCiAgICAgdG8gbG9va3VwIGZpbHRlciBoYW5kbGVzIHNvIHRoZXkgY2FuIGJ5cGFzcyB0aGUgZmlsdGVyIG5hbWUKICAgICBsb29rdXAgd2hlbiBhZGRpbmcgZmlsdGVycyB0byBhIHJlcXVlc3QgKHZpYSBhcF9hZGRfKl9maWx0ZXJfaGFuZGxlKCkpCiAgICAgW1J5YW4gTW9yZ2FuIDxybW9yZ2FuIGNvdmFsZW50Lm5ldD5dCgogICopIEZpeCBmb3IgbXVsdGlwbGUgZmlsZSBidWNrZXRzIG9uIFdpbjMyLCB3aGVyZSB0aGUgZmlyc3QgZmlsZQogICAgIGJ1Y2tldCB3b3VsZCBjYXVzZSB0aGUgaW1tZWRpYXRlIGNsb3N1cmUgb2YgdGhlIHNvY2tldCBvbiBhbnkKICAgICBub24ta2VlcGFsaXZlIHJlcXVlc3RzLiAgW1J5YW4gTW9yZ2FuIDxybW9yZ2FuIGNvdmFsZW50Lm5ldD5dCgogICopIENvcnJlY3QgV2luMzIgZmFpbHVyZSBvZiBtbWFwIG9mIGEgc2VnbWVudCBiZXlvbmQgc3RhcnQgb2YgdGhlCiAgICAgZmlsZTsgZml4ZXMgbGFyZ2UgU1NMIGFuZCBzaW1pbGFyIHRyYW5zZmVycy4gIFtXaWxsaWFtIFJvd2VdCiAgICAgUFIgOTg5OAoKICAqKSBJbXBsZW1lbnQgYXByX3Byb2NfZGV0YWNoIGNoYW5nZXMgYW5kIGFsbG93IC1ETk9fREVUQUNIIGluIHRoZQogICAgIG11bHRpLXByb2Nlc3MgbW9kZSB0byBub3QgImRhZW1vbml6ZSIgd2hpbGUgZGV0YWNoaW5nIGZyb20gdGhlCiAgICAgY29udHJvbGxpbmcgdGVybWluYWwuIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBBcGFjaGUgdG8gd29yayB3aXRoCiAgICAgcHJvY2Vzcy1tYW5hZ2VtZW50IHRvb2xzIGxpa2UgQUlYJ3MgIlN5c3RlbSBSZXNvdXJjZSBDb250cm9sbGVyIgogICAgIGFzIHdlbGwgYXMgRGFuIEJlcm5zdGVpbidzICJkYWVtb250b29scyIuCiAgICAgW0pvcyBCYWNrdXMgPGpvc2IgY25jZHNsLmNvbT4sIEFhcm9uIEJhbm5lcnRdCgogICopIENvbnZlcnQgbW9kX2F1dGhfZGlnZXN0IHRvIHVzZSB0aGUgbmV3IGFwcl9nbG9iYWxfbXV0ZXhfdAogICAgIHR5cGUuICBbQWFyb24gQmFubmVydF0KCiAgKikgZml4IGJ1ZyBpbiBtb2QtaW5jbHVkZSB3aGVyZSBpdCB3b3VsZG4ndCBzZW5kIGEgdW5tYXRjaGVkCiAgICAgcGFydCBpZiBpdCB3YXMgYXQgdGhlIGVuZCBvZiBhIGJ1Y2tldCBbSWFuIEhvbHNtYW5dCgogICopIHdvcmtlciBNUE06IEltcHJvdmUgbG9nZ2luZyBvZiBlcnJvcnMgd2l0aCB0aGUgaW50ZXJmYWNlIGJldHdlZW4KICAgICB0aGUgbGlzdGVuZXIgdGhyZWFkIGFuZCB3b3JrZXIgdGhyZWFkcy4gIFtKZWZmIFRyYXdpY2tdCgogICopIFNvbWUgYnJvd3NlcnMgaWdub3JlIGNvb2tpZXMgdGhhdCBoYXZlIGJlZW4gbWVyZ2VkIGludG8gYQogICAgIHNpbmdsZSBTZXQtQ29va2llIGhlYWRlci4gU2V0LUNvb2tpZSBhbmQgU2V0LUNvb2tpZTIgaGVhZGVycwogICAgIGFyZSBub3cgdW5tZXJnZWQgaW4gdGhlIGh0dHAgcHJveHkgYmVmb3JlIGJlaW5nIHNlbnQgdG8gdGhlCiAgICAgY2xpZW50LiBbR3JhaGFtIExlZ2dldHRdCgogICopIEZpeCBhIHByb2JsZW0gd2l0aCBwcm94eSB3aGVyZSBlYWNoIGVudHJ5IG9mIGEgZHVwbGljYXRlZAogICAgIGhlYWRlciBzdWNoIGFzIFNldC1Db29raWUgd291bGQgb3ZlcndyaXRlIGFuZCBvYmxpdGVyYXRlIHRoZQogICAgIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBoZWFkZXIsIHJlc3VsdGluZyBpbiBtdWx0aXBsZSBoZWFkZXIKICAgICB2YWx1ZXMgKGxpa2UgY29va2llcykgZ29pbmcgbWlzc2luZy4KICAgICBbR3JhaGFtIExlZ2dldHQsIEpvc2h1YSBTbGl2ZV0KCiAgKikgQWRkIHRoZSBzZXJ2ZXItbGltaXQgYW5kIHRocmVhZC1saW1pdCB2YWx1ZXMgdG8gdGhlIHNjb3JlYm9hcmQKICAgICBmb3IgdGhlIHNha2Ugb2YgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zLgogICAgIFtBZGFtIFN1c3NtYW4gPG15ZGRyeW4gdmlzaG51LnZpZHlhLmNvbT5dCgogICopIEZpeCBzZWdmYXVsdCB3aGVuIHByb3h5IHJlY2lldmVzIGFuIGludmFsaWQgSFRUUCByZXNwb25zZSBbSWFuIEhvbHNtYW5dCgogICopIE9TLzM5MDogR2V0IG1ha2UgaW5zdGFsbCB0byBwcm9wZXJseSBjb3B5IERTTyBtb2R1bGVzLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIFdpbjMyOiBGaXggYnVnIGluIG1vZF9zdGF0dXMgd2l0aCBkaXNwbGF5aW5nICJSZXN0YXJ0IFRpbWUiCiAgICAgYW5kICJTZXJ2ZXIgdXB0aW1lIi4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgRml4IElQdjYgbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3RzLiAgW0plZmYgVHJhd2lja10KCiAgKikgSW50cm9kdWNlIEFkZE91dHB1dEZpbHRlckJ5VHlwZSBkaXJlY3RpdmUuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEZpeCBERUJVR19DR0kgc3VwcG9ydCBpbiBtb2RfY2dpLiAgUFIgOTY3MCwgOTY3MS4KICAgICBbRGF2aWQgTWFjS2VuemllIDxkam0gcGl4Lm5ldD5dCgogICopIEZpeCBpbmNvcnJlY3QgY2hlY2sgZm9yIHNjcmlwdF9pbiBpbiBtb2RfY2dpLiAgUFIgOTY2OS4KICAgICBbRGF2aWQgTWFjS2VuemllIDxkam0gcGl4Lm5ldD5dCgogICopIEZpeCBzZWdmYXVsdCBhbmQgZGlzcGxheSBlcnJvciB3aGVuIFNTTE11dGV4IGZpbGUgY2FuIG5vdCBiZQogICAgIGNyZWF0ZWQuICBbQWRhbSBTdXNzbWFuIDxteWRkcnluIHZpc2hudS52aWR5YS5jb20+XQoKICAqKSBBZGQgcmVmZXJlbmNlIGNvdW50aW5nIHRvIG1vZF9tZW1fY2FjaGUgY2FjaGUgb2JqZWN0cyB0bwogICAgIGJldHRlciBtYW5hZ2UgcmVtb3Zpbmcgb2JqZWN0cyBmcm9tIHRoZSBjYWNoZS4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgQ2hhbmdlIHRoZSB2ZXJiYWdlIG9uIHRoZSBTY29yZUJvYXJkRmlsZSBpbiBvdXIgZGVmYXVsdCBjb25maWdzLgogICAgIEFsc28gY2hhbmdlIHRoZSBkZWZhdWx0IHRvIGJlIGNvbW1lbnRlZCBvdXQgKHVuc3BlY2lmaWVkKSBzbyB3ZQogICAgIGdldCBhbm9ueW1vdXMgc2hhcmVkIG1lbW9yeSBieSBkZWZhdWx0LiAgW0Fhcm9uIEJhbm5lcnRdCgogICopIEltcGxlbWVudCBuZXcgU2NvcmVCb2FyZEZpbGUgZGlyZWN0aXZlIGxvZ2ljLiBUaGlzIGFmZmVjdHMgaG93CiAgICAgd2UgY3JlYXRlIHRoZSBzY29yZWJvYXJkJ3Mgc2hhcmVkIG1lbW9yeSBzZWdtZW50LiBJZiB0aGUgZGlyZWN0aXZlCiAgICAgaXMgcHJlc2VudCwgYSBuYW1lLWJhc2VkIHNlZ21lbnQgaXMgY3JlYXRlZC4gSWYgdGhlIGRpcmVjdGl2ZSBpcwogICAgIG5vdCBwcmVzZW50LCBmaXJzdCBhbiBhbm9ueW1vdXMgc2VnbWVudCBpcyBjcmVhdGVkLCBhbmQgaWYgdGhhdAogICAgIGZhaWxzLCBhIG5hbWUtYmFzZWQgc2VnbWVudCBpcyBjcmVhdGVkIGZyb20gYSBmaWxlIG9mIHRoZSBuYW1lCiAgICAgREVGQVVMVF9TQ09SRUJPQVJELiBUaGlzIGdpdmVzIHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucyB0aGUKICAgICBhYmlsaXR5IHRvIGFjY2VzcyBvdXIgc2NvcmVib2FyZC4gIFtBYXJvbiBCYW5uZXJ0XQoKICAqKSBBbGxvdyBtb2RfZGVmbGF0ZSB0byB3b3JrIHdpdGggbm9uLUdFVCByZXF1ZXN0cyBhbmQgcHJvcGVybHkgc2VuZAogICAgIENvbnRlbnQtTGVuZ3Rocy4gIFtTYW5kZXIgU3RyaWtlciA8c3RyaWtlciBhcGFjaGUub3JnPl0KCiAgKikgRml4IGFwX2RpcmVjdG9yeV9tZXJnZSgpIHRvIGNvcnJlY3RseSBtZXJnZSBjb25maWdzIHdoZW4gdGhlcmUgaXMKICAgICBubyA8RGlyZWN0b3J5IC8+IGJsb2NrLiAgW0p1c3RpbiBFcmVua3JhbnR6LCBXaWxsaWFtIFJvd2VdCgogICopIFJlbW92ZSBzcHVyaW91cyBkZWJ1ZyBtZXNzc2FnZXMgdGhhdCBhcmUgbm9ybWFsIHVuZGVyIEhUVFAKICAgICBrZWVwLWFsaXZlIGxvZ2ljLiAgW0plZmYgVHJhd2ljaywgSnVzdGluIEVyZW5rcmFudHpdCgogICopIEZpeCBhIGJ1ZyBpbiBtb2RfY2dpZCB0aGF0IHdvdWxkIHByZXZlbnQgcHJvcGVyIHNodXRkb3duIGRlYXRoCiAgICAgb2YgdGhlIGNnaWQgcHJvY2Vzcy4gIFtBYXJvbiBCYW5uZXJ0XQoKICAqKSBBZGQgc2lnbmFsIGhhbmRsaW5nIGJhY2sgaW4gdG8gdGhlIHdvcmtlciBNUE0gZm9yIHRoZSBvbmVfcHJvY2VzcwogICAgICgtWCwgLURERUJVRywgLURPTkVfUFJPQ0VTUykgY2FzZS4gIFtBYXJvbiBCYW5uZXJ0XQoKICAqKSBQZXJmb3JtYW5jZTogUmV1c2UgcGVyLWNvbm5lY3Rpb24gdHJhbnNhY3Rpb24gcG9vbHMgaW4gdGhlCiAgICAgd29ya2VyIE1QTSwgcmF0aGVyIHRoYW4gZGVzdHJveWluZyBhbmQgcmVjcmVhdGluZyB0aGVtLiAgW0JyaWFuIFBhbmVdCgogICopIFJlbW92ZSBhbGwgc2lnbmFscyBmcm9tIHRoZSB3b3JrZXIgTVBNJ3MgY2hpbGQgcHJvY2Vzcy4gIEluc3RlYWQsCiAgICAgdGhlIHBhcmVudCB1c2VzIHRoZSBQaXBlIG9mIERlYXRoIGZvciBhbGwgY29tbXVuaWNhdGlvbiB3aXRoIHRoZQogICAgIGNoaWxkIHByb2Nlc3Nlcy4gIFtSeWFuIEJsb29tXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMzIKCiAgKikgbW9kX25lZ290aWF0aW9uOiBGb3JjZUxhbmd1YWdlUHJpb3JpdHkgbm93IHVzZXMgJ1ByZWZlcicgYXMgdGhlCiAgICAgZGVmYXVsdCBpZiB0aGUgZGlyZWN0aXZlIGlzIG5vdCBzcGVjaWZpZWQuICBUaGlzIG1pcnJvcnMgb2xkZXIKICAgICBiZWhhdmlvciB3aXRob3V0IGNoYW5nZXMgdG8gdGhlIGh0dHBkLmNvbmYuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBXaW4zMjogc29sdmUgdGhlIHdpbjMyIHNlcnZpY2UgcHJvYmxlbXMgaW4gMi4wLjMxLWFscGhhLCBieSBmaXhpbmcKICAgICB0aGUgc2VydmljZSwgbXBtIGFuZCBsb2dnaW5nIGNvZGUsIGFuZCBidWdzIGluIGFwcl9maWxlX29wZW5fc3RkZXJyIAogICAgIGFuZCBhcHJfZmlsZV9kdXAyIGZ1bmN0aW9ucy4gIFdpbjJLL1hQIHNlcnZpY2VzIGhhdmUgbm8gaGFuZGxlcyAKICAgICBhc3NvY2lhdGVkIGZvciBzdGRpbi9vdXQvZXJyLCB3aGljaCBjYXVzZWQgdW5wcmVkaWN0YWJsZSBiZWhhdmlvcgogICAgIGluIHRoZSBwcmlvciByZWxlYXNlLiAgW1dpbGxpYW0gUm93ZSwgQmlsbCBTdG9kZGFyZF0KCiAgKikgV2luMzI6IHNpbXBsaWZ5IHRoZSBBcHBsaWNhdGlvbiBFdmVudCBMb2cgbWVzc2FnZXMsIHNpbmNlIHRoZXJlIGlzbid0CiAgICAgbGlrZWx5IHRvIGJlICdtb3JlIGluZm9ybWF0aW9uIGluIHRoZSBlcnJvciBsb2cnIGJlZm9yZSBhbiBlcnJvciBsb2cKICAgICBoYXMgYmVlbiBvcGVuZWQuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBXaW4zMjogc3Vic3RhbnRpYWwgY2xlYW51cCB0byB0aGUgbXBtX3dpbm50IGNvZGUgZm9yIGxlZ2liaWxpdHkgYW5kCiAgICAgdG8gZm9sbG93IHRoZSBwcm9ncmFtIGZsb3cgb2Ygb3RoZXIgTVBNcy4gIFtSeWFuIEJsb29tLCBXaWxsaWFtIFJvd2VdCgogICopIFdpbjMyOiBhcGFjaGUgLWsgc2h1dGRvd24gbm93IGJlaGF2ZXMgbGlrZSBhcGFjaGUgLWsgc3RvcC4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgRml4IHByZWZvcmsgdG8gbm90IGtpbGwgdGhlIHBhcmVudCBpZiBhIGNoaWxkIGhpdHMgYSByZXNvdXJjZSBzaG9ydGFnZQogICAgIG9uIGFjY2VwdCgpLiAgW0dyZWcgQW1lc10KCiAgKikgRml4IHNlZyBmYXVsdHMgdGhhdCBvY2N1ciB3aGVuIHdoYXQgc2hvdWxkIGJlIHRoZSBodHRwZCByZXF1ZXN0IGxpbmUKICAgICBzdGFydHMgd2l0aCBcclxuIGZvbGxvd2VkIGJ5IGdhcmJhZ2UuICBbR3JlZyBBbWVzXQoKICAqKSBBbGxvdyBzdGF0aWNhbGx5IGxpbmtlZCBzdXBwb3J0IGJpbmFyaWVzIHdpdGggdGhlIG5ldwogICAgIC0tZW5hYmxlLXN0YXRpYy1zdXBwb3J0IGZsYWcsIGFuZCBlbmFibGUgdGhpcyBiZWhhdmlvciBpbgogICAgIHRoZSBiaW5idWlsZCBzY3JpcHQuIEFsc28gYWRkIGEgbmV3IC0tZW5hYmxlLXN0YXRpYy1odGRibQogICAgIGZsYWcuICBbQWFyb24gQmFubmVydF0KCiAgKikgQWxsb3cgbW9kX2F1dG9pbmRleCB0byBzZXJ2ZSBzeW1saW5rcyBpZiBwZXJtaXR0ZWQgYW5kIGF0dGVtcHQgdG8KICAgICBkbyBvbmx5IG9uZSBzdGF0KCkgY2FsbCB3aGVuIGdlbmVyYXRpbmcgdGhlIGRpcmVjdG9yeSBsaXN0aW5ncy4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEZpeCByZXNvbHZlX3N5bWxpbmsgdG8gc2F2ZSB0aGUgb3JpZ2luYWwgc3ltbGluayBuYW1lIGlmIGtub3duLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgQmUgYSBiaXQgbW9yZSBzYW5lIHdpdGggcmVnYXJkIHRvIENhbm9uaWNhbE5hbWVzLiAgSWYgdGhlIHVzZXIgaGFzCiAgICAgc3BlY2lmaWVkIHRoZXkgd2FudCB0byB1c2UgdGhlIENhbm9uaWNhbE5hbWUsIGJ1dCB0aGV5IGhhdmUgbm90CiAgICAgY29uZmlndXJlZCBhIHBvcnQgd2l0aCB0aGUgU2VydmVyTmFtZSwgdGhlbiB1c2UgdGhlIHNhbWUgcG9ydCB0aGF0IAogICAgIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHVzZWQuIFtSeWFuIEJsb29tIGFuZCBLZW4gQ29hcl0KCiAgKikgSW4gY29yZV9pbnB1dF9maWx0ZXIsIGNoZWNrIGZvciBhbiBlbXB0eSBicmlnYWRlIGFmdGVyIAogICAgIEFQUl9CUklHQURFX05PUk1BTElaRSgpLiAgT3RoZXJ3aXNlLCB3ZSBjYW4gZ2V0IHNlZ2ZhdWx0cyBpZiBhCiAgICAgY2xpZW50IHNheXMgaXQgd2lsbCBwb3N0IHNvbWUgZGF0YSBidXQgd2UgZ2V0IEZJTiBiZWZvcmUgYW55CiAgICAgZGF0YSBhcnJpdmVzLiAgW0plZmYgVHJhd2lja10KCiAgKikgTm90IGJlaW5nIGFibGUgdG8gYmluZCB0byB0aGUgc29ja2V0IGlzIGEgZmF0YWwgZXJyb3IuICBXZSBzaG91bGQKICAgICBwcmludCBhbiBlcnJvciB0byB0aGUgY29uc29sZSwgYW5kIHJldHVybiBhIG5vbi16ZXJvIHN0YXR1cyBjb2RlLgogICAgIFdpdGggdGhlc2UgY2hhbmdlcywgYWxsIG9mIHRoZSBVbml4IE1QTXMgZG8gdGhhdCBjb3JyZWN0bHkuCiAgICAgW1J5YW4gQmxvb21dCgogICopIHN1ZXhlYzogQWxsb3cgSFRUUFMgYW5kIFNTTF8qIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSBwYXNzZWQKICAgICB0aHJvdWdoIHRvIENHSSBzY3JpcHRzLiBQUiA5MTYzCiAgICAgW0JyaWFuIFJlaWQgPGJyZWlkIGN1c3RvbWxvZ2ljLmNvbT4sIAogICAgICBadmkgSGFyJ0VsIDxybCBtYXRoLnRlY2huaW9uLmFjLmlsPl0KCiAgKikgYmluYnVpbGQuc2g6IE1ha2Ugc3VyZSB0aGF0IHdlIHVzZSB0aGUgZXhwYXQgZnJvbSBvdXIgc291cmNlCiAgICAgdHJlZSBzbyB0aGF0IHRoZXJlIGFyZW4ndCBhbnkgc3VycHJpc2VzIG9uIHRoZSB0YXJnZXQgbWFjaGluZS4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBtb2RfY2dpZDogQWRkIHJldHJ5IGxvZ2ljIGZvciB3aGVuIHRoZSBkYWVtb24gY2FuJ3QgZm9yayBmYXN0CiAgICAgZW5vdWdoIHRvIGtlZXAgdXAgd2l0aCBuZXcgcmVxdWVzdHMuICBTdGFydCB1c2luZyAKICAgICBIVFRQX1NFUlZFUl9VTkFWQUlMQUJMRSBpbnN0ZWFkIG9mIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SCiAgICAgd2hlbiB3ZSBjYW4ndCB0YWxrIHRvIHRoZSBkYWVtb24uICBbSmVmZiBUcmF3aWNrXQoKICAqKSBhcHhzOiBMVEZMQUdTIGVudnZhciBjYW4gb3ZlcnJpZGUgZGVmYXVsdCBsaWJ0b29sIG9wdGlvbnMuICBUcnkKICAgICAiTFRGTEFHUz0nICcgYXB4cyAtYyBtb2RfZm9vLmMiIHRvIHNlZSB3aGF0IGxpYnRvb2wgZG9lcyB1bmRlcgogICAgIHRoZSBjb3ZlcnMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBUaGUgTG9jYXRpb246IHJlc3BvbnNlIGhlYWRlciBmaWVsZCwgdXNlZCBmb3IgZXh0ZXJuYWwKICAgICByZWRpcmVjdCwgKm11c3QqIGJlIGFuIGFic29sdXRlVVJJLiAgVGhlIFJlZGlyZWN0IGRpcmVjdGl2ZQogICAgIHRlc3RlZCBmb3IgdGhhdCwgYnV0IFJlZGlyZWN0TWF0Y2ggZGlkbid0IC0tIGl0IHdvdWxkIGFsbG93CiAgICAgYWxtb3N0IGFueXRoaW5nIHRocm91Z2guICBOb3cgaXQgd2lsbCB0cnkgdG8gdHVybiBhbiBhYnNfcGF0aAogICAgIGludG8gYW4gYWJzb2x1dGVVUkksIGJ1dCBpdCB3aWxsIGNvcnJlY3RseSB2YXJmIGxpa2UgUmVkaXJlY3QKICAgICBpZiB0aGUgZmluYWwgcmVkaXJlY3Rpb24gdGFyZ2V0IGlzbid0IGFuIGFic29sdXRlVVJJLiAgW0tlbiBDb2FyXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMzEKCiAgKikgQ3JlYXRlIHRoZSBzY29yZWJvYXJkIChpbiB0aGUgcGFyZW50KSBpbiBhIGdsb2JhbCBwb29sIGNvbnRleHQsCiAgICAgc28gaXQgc3Vydml2ZXMgZ3JhY2VmdWwgcmVzdGFydHMuIFRoaXMgZml4ZXMgYSBTRUdWIGR1cmluZwogICAgIGdyYWNlZnVsIHJlc3RhcnRzLiAgW0Fhcm9uIEJhbm5lcnRdCgogICopIEFkZCBhIHRpbWVvdXQgb3B0aW9uIHRvIHRoZSBwcm94eSBjb2RlICdQcm94eVRpbWVvdXQnIAogICAgIFtJYW4gSG9sc21hbl0KCiAgKikgRlRQIGRpcmVjdG9yeSBsaXN0aW5ncyBhcmUgbm93IGFsd2F5cyByZXRyaWV2ZWQgaW4gQVNDSUkgbW9kZS4KICAgICBUaGUgRlRQIHByb3h5IHByb3Blcmx5IGVzY2FwZXMgVVJJJ3MgYW5kIEhUTUwgaW4gdGhlIGdlbmVyYXRlZAogICAgIGxpc3RpbmcsIGFuZCBlc2NhcGVzIHRoZSBwYXRoIGNvbXBvbmVudHMgd2hlbiB0YWxraW5nIHRvIHRoZSBGVFAKICAgICBzZXJ2ZXIuIEl0IGlzIG5vdyBwb3NzaWJsZSB0byBicm93c2UgdGhlIHJvb3QgZGlyZWN0b3J5IGJ5IHVzaW5nCiAgICAgYSB1cmwgbGlrZTogICBmdHA6Ly91c2VyQGhvc3QvJTJmLyAocG9ydGVkIGZyb20gYXBhY2hlXzEuMy4yNCkKICAgICBBbHNvLCB0aGUgbGFzdCBwYXRoIGNvbXBvbmVudCBtYXkgY29udGFpbiB3aWxkY2FyZCBjaGFyYWN0ZXJzCiAgICAgJyonIGFuZCAnPycsIGFuZCBpZiB0aGV5IGRvLCBhIGRpcmVjdG9yeSBsaXN0aW5nIGlzIGNyZWF0ZWQgaW5zdGVhZAogICAgIG9mIGEgZmlsZSByZXRyaWV2YWwuIEV4YW1wbGU6IGZ0cDovL3VzZXJAaG9zdC9odHRwZC9zZXJ2ZXIvKi5jCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBBZGRlZCBzaW5nbGUtbGlzdGVuZXIgdW5zZXJpYWxpemVkIGFjY2VwdCBzdXBwb3J0IHRvIHRoZQogICAgIHdvcmtlciBNUE0gW0JyaWFuIFBhbmVdCgogICopIE5ldyBEaXJlY3RpdmUgZm9yIG1vZF9wcm94eTogJ1Byb3h5UHJlc2VydmVIb3N0Jy4gVGhpcyBwYXNzZXMKICAgICB0aGUgaW5jb21pbmcgaG9zdCBoZWFkZXIgdGhyb3VnaCB0byB0aGUgcHJveGllZCBzZXJ2ZXIKICAgICBbR2VvZmYgPGcucnVzc2VsbCBpZWVlLm9yZz5dCgogICopIE5ldyBEaXJlY3RpdmUgT3B0aW9uIGZvciBQcm94eVBhc3MuIEl0IG5vdyBjYW4gYmxvY2sgYSBsb2NhdGlvbgogICAgIGZyb20gYmVpbmcgcHJveGllZCBbSnVra2EgUGlobCA8anVra2EucGlobCBlbnRpcmVtLmNvbT5dCgogICopIERvbid0IGxldCB0aGUgZGVmYXVsdCBoYW5kbGVyIHRyeSB0byBzZXJ2ZSBhIHJhdyBkaXJlY3RvcnkuICBBdAogICAgIGJlc3QgeW91IGdldCBnaWJiZXJpc2guICBNdWNoIHdvcnNlIHRoaW5ncyBjYW4gaGFwcGVuIGRlcGVuZGluZwogICAgIG9uIHRoZSBPUy4gIFtKZWZmIFRyYXdpY2tdCiAgICAgCiAgKikgQ2hhbmdlIHRoZSBwcmVfY29uZmlnIGhvb2sgdG8gcmV0dXJuIGEgdmFsdWUuIE1vZHVsZXMgY2FuIG5vdyBlbWl0CiAgICAgYW4gZXJyb3IgbWVzc2FnZSBhbmQgdGhlbiBjYXVzZSB0aGUgc2VydmVyIHRvIHF1aXQgZ3JhY2VmdWxseSBkdXJpbmcKICAgICBzdGFydHVwLiBUaGlzIHJlcXVpcmVkIGEgYnVtcCB0byB0aGUgTU1OLiAgW0Fhcm9uIEJhbm5lcnRdCgogICopIEZpeCBzb21lIHVuaXggc29ja2V0IGRlc2NyaXB0b3IgbGVha3MgaW4gdGhlIGhhbmRsZXIgc2lkZSBvZgogICAgIG1vZF9jZ2lkICh0aGUgcGFydCB0aGF0IHJ1bnMgaW4gdGhlIHNlcnZlciBwcm9jZXNzKS4gIFdoYWNrIGEKICAgICBzaWxseSAiY2xvc2UoLTEpIiBpbiB0aGUgaGFuZGxlciB0b28uICBbSmVmZiBUcmF3aWNrXQoKICAqKSBDaGFuZ2UgdGhlIHByZV9tcG0gaG9vayB0byByZXR1cm4gYSB2YWx1ZSwgc28gdGhhdCBzY29yZWJvYXJkCiAgICAgaW5pdCBlcnJvcnMgcGVyY29sYXRlIHVwIHRvIGNvZGUgdGhhdCBrbm93cyBob3cgdG8gZXhpdCAKICAgICBjbGVhbmx5LiAgVGhpcyByZXF1aXJlZCBhIGJ1bXAgdG8gdGhlIE1NTi4gIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZCB0aGUgc29ja2V0IGJhY2sgdG8gdGhlIGNvbm5fcmVjIGFuZCByZW1vdmUgdGhlIGNyZWF0ZV9jb25uZWN0aW9uCiAgICAgaG9vay4gVGhlIGNyZWF0ZV9jb25uZWN0aW9uIGhvb2sgaGFkIGEgZGVzaWduIGZsYXcgdGhhdCBkaWQgbm90IAogICAgIGFsbG93IGNyZWF0aW5nIGNvbm5lY3Rpb25zIGJhc2VkIG9uIHZob3N0IGluZm8uIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXhlZCBQQVRIX0lORk8gYW5kIFFVRVJZX1NUUklORyBmcm9tIG1vZF9uZWdvdGlhdGlvbiByZXN1bHRzLgogICAgIFJlc29sdmVzIHRoZSBjb21tb24gY2FzZSBvZiB1c2luZyBuZWdvdGF0aW9uIHRvIHJlc29sdmUgdGhlIHJlcXVlc3QKICAgICAvc2NyaXB0L2ZvbyBmb3IgL3NjcmlwdC5jZ2kvZm9vLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQWRkZWQgbmV3IGZ1bmN0aW9ucyBhcF9hZGRfKGlucHV0fG91dHB1dClfZmlsdGVyX2hhbmRsZSB0bwogICAgIGFsbG93IG1vZHVsZXMgdG8gYnlwYXNzIHRoZSB1c3VhbCBmaWx0ZXIgbmFtZSBsb29rdXAgd2hlbgogICAgIGFkZGluZyBoYXJkLWNvZGVkIGZpbHRlcnMgdG8gYSByZXF1ZXN0IFtCcmlhbiBQYW5lXQoKICAqKSBjYWNoaW5nIHNob3VsZCBub3cgd29yayBvbiBzdWJyZXF1ZXN0cyAoc3RpbGwgdmVyeSBleHBlcmltZW50YWwpCiAgICAgW0lhbiBIb2xzbWFuXQogIAogICopIFRoZSBXaW4zMiBtcG1fd2lubnQgbm93IGhhcyBhIHNoYXJlZCBzY29yZWJvYXJkLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQ2hhbmdlIGFwX2dldF9icmlnYWRlIHByb3RvdHlwZSB0byB1c2UgYXByX29mZl90IGluc3RlYWQgb2YgYXByX29mZl90Ki4KICAgICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIFJlZmFjdG9yIGFwX3JnZXRsaW5lIHNvIHRoYXQgaXQgZG9lcyBub3QgdXNlIGFuIGludGVybmFsIGJyaWdhZGUuCiAgICAgQ2hhbmdlIGFwX3JnZXRsaW5lJ3MgcHJvdG90eXBlIHRvIHJldHVybiBlcnJvcnMuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIFJlbW92ZSBtb2RfYXV0aF9kYi4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRG8gbm90IGluc3RhbGwgdW5uZWNlc3NhcnkgcGNyZSBoZWFkZXJzIGxpa2UgY29uZmlnLmggYW5kIGludGVybmFsLmguCiAgICAgW0pvZSBPcnRvbiA8am9lIG1hbnlmaXNoLmNvLnVrPl0KCiAgKikgQ2hhbmdlIGluIHF1aWNrX2hhbmxkZXIgYmVoYXZpb3IgZm9yIHN1YnJlcXVlc3RzLiBpdCBub3cgcGFzc2VzIERPTkUKICAgICAoYXMgaXQgZG9lcyBmb3IgYSBub3JtYWwgcmVxdWVzdCkuIHF1aWNrX2hhbmRsZWQgc3ViLXJlcXVlc3RzIG5vdyB3b3JrCiAgICAgaW4gbW9kLWluY2x1ZGUgW0lhbiBIb2xzbWFuXQoKICAqKSBDaGFuZ2UgU1VCUkVRX0NPUkUgc28gdGhhdCBpdCBpcyBhICdIVFRQX0hFQURFUicgZmlsdGVyIGluc3RlYWQgb2YKICAgICAnQ09OVEVOVCcgb25lLCBhcyBpdCBuZWVkcyB0byBydW4gQUZURVIgYWxsIGNvbnRlbnQgaGVhZGVycwoKICAqKSBSZW5hbWUgQmVPUyBNUE0gZGlyZWN0aXZlIFJlcXVlc3RzUGVyVGhyZWFkIHRvIE1heFJlcXVlc3RzUGVyVGhyZWFkLgogICAgIFtMYXJzIEVpbGVicmVjaHRdCgogICopIFNwbGl0IG91dCBibG9ja2luZyBmcm9tIHRoZSBtb2RlIGluIHRoZSBpbnB1dCBmaWx0ZXJzLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRml4IGEgc2VnZmF1bHQgaW4gbW9kX2luY2x1ZGUuICBbSnVzdGluIEVyZW5rcmFudHosIEplZmYgVHJhd2lja10KCiAgKikgQ2F1c2UgV2luMzIgdG8gY2FwdHVyZSBhbGwgY2hpbGQtd29ya2VyIHByb2Nlc3MgZXJyb3JzIGluCiAgICAgQXBhY2hlIHRvIHRoZSBtYWluIHNlcnZlciBlcnJvciBsb2csIHVudGlsIHRoZSBjaGlsZCBjYW4KICAgICBvcGVuIGl0cyBvd24gZXJyb3IgbG9ncy4gIFtXaWxsaWFtIFJvd2VdCgogICopIEhQVVggMTEuKjogRG8gbm90IGtpbGwgdGhlIGNoaWxkIHByb2Nlc3Mgd2hlbiBhY2NlcHQoKSAKICAgICByZXR1cm5zIEVOT0JVRlMgb24gSFBVWCAxMS4qLiAocG9ydGVkIGZyb20gdGggMS4zIHBhdGNoKQogICAgIFtNYWRodXN1ZGFuIE1hdGhpaGFsbGkgPG1hZGh1c3VkYW5fbWF0aGloYWxsaSBocC5jb20+LCBCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXggYSBwcm9ibGVtIGluIHRoZSBwYXJzaW5nIG9mIHRoZSA8UHJveHkgZm9vPiBkaXJlY3RpdmUuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgcmV3cml0ZSBvZiBtb2Rfc3NsIGlucHV0IGZpbHRlciBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIGFuZCBsZXNzCiAgICAgbWVtb3J5IHVzYWdlIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIGFsbG93IHF1aWNrX2hhbmRsZXIgdG8gYmUgcnVuIG9uIHN1YnJlcXVlc3RzLiBbSWFuIEhvbHNtYW5dCgogICopIG1vZF9kYXYgbm93IGFza3MgaXRzIHByb3ZpZGVyIHRvIHBsYWNlIGNvbnRlbnQgZGlyZWN0bHkgaW50byB0aGUKICAgICBmaWx0ZXIgc3RhY2sgd2hlbiBoYW5kbGluZyBhIEdFVCByZXF1ZXN0LiBUaGUgbW9kX2Rhdi9wcm92aWRlcgogICAgIEFQSSBoYXMgY2hhbmdlZCwgc28gcHJvdmlkZXJzIG5lZWQgdG8gYmUgdXBkYXRlZC4gW0dyZWcgU3RlaW5dCgogICopIENsZWFyIHRoZSBvdXRwdXQgc29ja2V0IGRlc2NyaXB0b3IgaW4gdW5peGRfYWNjZXB0KCkgdG8gbWFrZSBzdXJlCiAgICAgd2UgZG9uJ3Qgc3VwcGx5IGEgYm9ndXMgc29ja2V0IHRvIHRoZSBjYWxsZXIgaWYgdGhlIGFjY2VwdCBmYWlscy4KICAgICBUaGlzIGNhdXNlZCBwcm9ibGVtcyB3aXRoIHRoZSB3b3JrZXIgTVBNLCB3aGljaCB0cmllZCB0byBwcm9jZXNzCiAgICAgdGhlIHJldHVybmVkIHNvY2tldCBpZiBpdCB3YXMgbm9uLU5VTEwuICBbQnJpYW4gUGFuZV0KCiAgKikgTW92ZSBhIGNoZWNrIGZvciBhbiBlbXB0eSBicmlnYWRlIHRvIHRoZSBzdGFydCBvZiBjb3JlIGlucHV0IGZpbHRlcgogICAgIHRvIGF2b2lkIHNlZ2ZhdWx0cy4gIFtKdXN0aW4gRXJlbmtyYW50eiwgSmVmZiBUcmF3aWNrXQoKICAqKSBBZGQgRmlsZUVUYWcgZGlyZWN0aXZlIHRvIGFsbG93IGNvbmZpZ3VyYWJsZSBjb250cm9sIG9mIHdoYXQKICAgICBkYXRhIGFyZSB1c2VkIHRvIGZvcm0gRVRhZyB2YWx1ZXMgZm9yIGZpbGUtYmFzZWQgVVJJcy4gIE1NTgogICAgIGJ1bXBlZCB0byAyMDAyMDExMSBiZWNhdXNlIG9mIGZpZWxkcyBhZGRlZCB0byB0aGUgZW5kIG9mCiAgICAgdGhlIGNvcmVfZGlyX2NvbmZpZyBzdHJ1Y3R1cmUuICBbS2VuIENvYXJdCgogICopIEZpeCBhIHNlZ2ZhdWx0IGluIG1vZF9yZXdyaXRlJ3MgbG9nZ2luZyBjb2RlIGNhdXNlZCBieSBwYXNzaW5nIHRoZQogICAgIHdyb25nIGNvbmZpZyB0byBhcF9nZXRfcmVtb3RlX2hvc3QoKS4gIFtKZWZmIFRyYXdpY2tdCgogICopIEFsbG93IG1vZF9jZ2lkIHRvIHdvcmsgZnJvbSBhIGJpbmFyeSBkaXN0cmlidXRpb24gaW5zdGFsbCBieQogICAgIHVzaW5nIDc1NSBmb3IgdGhlIHBlcm1pc3Npb25zIG9uIHRoZSBsb2cgZGlyZWN0b3J5IGluc3RlYWQgb2YKICAgICA3NTAuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXhlZCBhIHNlZ2ZhdWx0IHRoYXQgaGFwcGVuZWQgZHVyaW5nIGdyYWNlZnVsIHNodXRkb3duIChvciB3aGVuCiAgICAgdGhlIGh0dHBkIHJhbiBvdXQgb2YgZmlsZSBkZXNjcmlwdG9ycykgd2l0aCB0aGUgd29ya2VyIE1QTSBbQnJpYW4gUGFuZV0KCiAgKikgU3BsaXQgYWxsIFdpbjMyIG1vZHVsZXMgW2V4Y2x1ZGluZyB0aGUgY29yZSBjb21wb25lbnRzIG1vZF9jb3JlLCAKICAgICBtb2Rfc28sIG1vZF93aW4zMiBhbmQgdGhlIHdpbm50IG1wbV0gaW50byBpbmRpdmlkdWFsIGxvYWRhYmxlCiAgICAgbW9kdWxlcywgc28gdGhlIGFkbWluaXN0cmF0b3IgbWF5IGluZGl2aWR1YWxseSBkaXNhYmxlIHRoZSBmb3JtZXIKICAgICBjb21waWxlZC1pbiBtb2R1bGVzIGJ5IHNpbXBseSBjb21tZW50aW5nIG91dCB0aGVpciBMb2FkTW9kdWxlCiAgICAgZGlyZWN0aXZlcy4gIFtXaWxsaWFtIFJvd2VdCgogICopIFNhdmVkIFdpbjMyIG1vZHVsZSBhdXRob3JzIGFuZCBwb3J0ZXJzIG1hbnkgZnV0dXJlIGhlYWRhY2hlcywgYnkKICAgICBkdXBsaWNhdGluZyB0aGUgYXBwcm9wcmlhdGUgLmggZmlsZXMgc3VjaCBhcyBvcy5oIGludG8gdGhlIGluY2x1ZGUKICAgICBkaXJlY3RvcnksIGluY2x1ZGluZyBpbiB0aGUgYnVpbGQgdHJlZS4gIFtXaWxsaWFtIFJvd2VdCgogICopIG1vZF9zc2wgYWRqdXN0bWVudHMgdG8gaGVscCB3aXRoIHVzaW5nIHRvb2xraXRzIG90aGVyIHRoYW4gT3BlblNTTDoKICAgICAgVXNlIFNTTCBmdW5jdGlvbnMvbWFjcm9zIGluc3RlYWQgb2YgZGlyZWN0bHkgZGVyZWZlcmVuY2luZyBTU0wKICAgICAgc3RydWN0dXJlcyB3aGVyZXZlciBwb3NzaWJsZS4KICAgICAgQWRkIHR5cGUtY2FzdHMgZm9yIHRoZSBjYXNlcyB3aGVyZSBmdW5jdGlvbnMgcmV0dXJuIGEgZ2VuZXJpYyBwb2ludGVyLgogICAgICBBZGQgJFNTTC9pbmNsdWRlIHRvIGNvbmZpZ3VyZSBzZWFyY2ggcGF0aC4KICAgICBbTWFkaHVzdWRhbiBNYXRoaWhhbGxpIDxtYWRodXN1ZGFuX21hdGhpaGFsbGkgaHAuY29tPl0KCiAgKikgTW92ZWQgc2V2ZXJhbCBwb2ludGVycyBvdXQgb2YgdGhlIHNoYXJlZCBTY29yZWJvYXJkIHNvIGl0IGlzCiAgICAgbW9yZSBwb3J0YWJsZSwgYW5kIHdpbGwgcHJlc2VudCB0aGUgdmhvc3QgbmFtZSBhY3Jvc3Mgc2VydmVyCiAgICAgZ2VuZXJhdGlvbiByZXN0YXJ0cy4gIFtXaWxsaWFtIFJvd2VdCgogICopIEZpeCBTU0xQYXNzUGhyYXNlRGlhbG9nIGV4ZWM6IGFuZCBTU0xSYW5kb21TZWVkIGV4ZWM6CiAgICAgW0RvdWcgTWFjRWFjaGVybl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjMwCgogICopIEZpeCB0aGUgbWFpbiBidWcgZm9yIEZyZWVCU0QgYW5kIHRocmVhZGVkIE1QTSdzLiBUaGVyZSBhcmUKICAgICBzdGlsbCBpc3N1ZXMgKHNlZSBTVEFUVVMpIGJ1dCBhdCBsZWFzdCB0aGUgc2VydmVyIHdpbGwgbm93CiAgICAgcnVuIHdpdGhvdXQgY3Jhc2hpbmcgdGhlIG1hY2hpbmUuCiAgICAgW0RhdmlkIFJlaWQsIEFhcm9uIEJhbm5lcnQsIEp1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBGaXggYSB0eXBvIGluIG1vZF9kZWZsYXRlJ3MgbTQgY29uZmlnIHNlY3Rpb24uCiAgICAgW2FsYmVydCBjaGluIDxjaGluYSB0aGV3cml0dGVud29yZC5jb20+XQoKICAqKSBGaXggYSBjb3VwbGUgb2YgbW9kX3Byb3h5IHByb2JsZW1zIGZvcndhcmRpbmcgSFRUUCBjb25uZWN0aW9ucwogICAgIGFuZCBoYW5kbGluZyBDT05ORUNUOgogICAgICgxKSBQUiAjOTE5MCAgUHJveHkgZmFpbGVkIHRvIGNvbm5lY3QgdG8gSVB2NiBob3N0cy4KICAgICAoMikgUHJveHkgZmFpbGVkIHRvIGNvbm5lY3Qgd2hlbiB0aGUgZmlyc3QgSVAgYWRkcmVzcyByZXR1cm5lZCBieSAKICAgICAgICAgdGhlIHJlc29sdmVyIHdhcyB1bnJlYWNoYWJsZSBidXQgYSBzZWNvbmRhcnkgSVAgYWRkcmVzcyB3YXMuICAKICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggdGhlIG1vZHVsZSBpZGVudGlmZXIgYXMgc2hvd24gaW4gdGhlIGRvY3MgZm9yIHZhcmlvdXMgY29yZQogICAgIG1vZHVsZXMgKGUuZy4sIHRoZSBpZGVudGlmZXIgZm9yIG1vZF9sb2dfY29uZmlnIHdhcyBwcmV2aW91c2x5CiAgICAgbGlzdGVkIGFzIGNvbmZpZ19sb2dfbW9kdWxlKS4gIFBSICM5MzM4CiAgICAgW0phbWVzIFdhdHNvbiA8YXAyYnVnIHNvd2VnYS5vcmc+XQoKICAqKSBGaXggTGltaXRSZXF1ZXN0Qm9keSBkaXJlY3RpdmUgYnkgcGxhY2luZyBpdCBpbiB0aGUgSFRUUAogICAgIGZpbHRlci4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRml4IG1vZF9wcm94eSBzZWcgZmF1bHQgd2hlbiB0aGUgcHJveGllZCBzZXJ2ZXIgcmV0dXJucyAKICAgICBhbiBIVFRQLzAuOSByZXNwb25zZSBvciBhIGJvZ3VzIHN0YXR1cyBsaW5lLgogICAgIFtBZGFtIFN1c3NtYW5dCgogICopIFByZXZlbnQgbW9kX3Byb3h5IGZyb20gdHJ1bmNhdGluZyBvbmUgY2hhcmFjdGVyIG9mZiB0aGUKICAgICBlbmQgb2YgdGhlIHN0YXR1cyBsaW5lIHJldHVybmVkIGZyb20gdGhlIHByb3hpZWQgc2VydmVyLgogICAgIFtBZGFtIFN1c3NtYW4sIEJpbGwgU3RvZGRhcmRdCgogICopIEVsaW1pbmF0ZSBsb29wIGluIGFwX3Byb3h5X3N0cmluZ19yZWFkKCkuCiAgICAgW0FkYW0gU3Vzc21hbiwgQmlsbCBTdG9kZGFyZF0KCiAgKikgUHJvdmlkZSAkMC4uJDkgcmVzdWx0cyBmcm9tIG1vZF9pbmNsdWRlIHJlZ2V4IHBhcnNpbmcuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQWxsb3cgbW9kLWluY2x1ZGUgdG8gbG9vayBmb3IgYWx0ZXJuYXRlIHN0YXJ0ICYgZW5kIHRhZ3MgW0lhbiBIb2xzbWFuXQoKICAqKSBJbnRyb2R1Y2VkIHRoZSBGb3JjZUxhbmd1YWdlUHJpb3JpdHkgZGlyZWN0aXZlLCB0byBwcmV2ZW50CiAgICAgcmV0dXJuaW5nIE1VTFRJUExFX0NIT0lDRVMgb3IgTk9ORV9BQ0NFUFRBQkxFIGluIHNvbWUgY2FzZXMsCiAgICAgd2hlbiB1c2luZyBNdWx0aXZpZXdzLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRml4IGEgcHJvYmxlbSB3aGljaCBwcmV2ZW50ZWQgbW9kX2NnaWQgYW5kIHN1ZXhlYyBmcm9tIHdvcmtpbmcKICAgICB0b2dldGhlciByZWxpYWJseSBbR3JlZyBBbWVzXQoKICAqKSBSZW1vdmUgdGhlIGNhbGwgdG8gZXhpdCgpIGZyb20gd2l0aGluIG1vZF9hdXRoX2RpZ2VzdCdzIHBvc3RfY29uZmlnCiAgICAgcGhhc2UuICBbQWFyb24gQmFubmVydF0KCiAgKikgRml4IGEgcHJvYmxlbSBpbiBtb2RfYXV0aF9kaWdlc3QgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBjYXVzZQogICAgIHByb2JsZW1zIHdpdGggaW5pdGlhbGl6ZWQgc3RhdGljIGRhdGEgb24gYSBzeXN0ZW0gdGhhdCB1c2VzIERTT3MuCiAgICAgW0Fhcm9uIEJhbm5lcnRdCgogICopIEZpeCBhIHNlZ2ZhdWx0IGluIHRoZSB3b3JrZXIgTVBNIHRoYXQgY291bGQgaGFwcGVuIGR1cmluZwogICAgIGNoaWxkIHByb2Nlc3MgZXhpdHMuICBbQnJpYW4gUGFuZSwgQWFyb24gQmFubmVydF0KCiAgKikgQWxsb3cgbW9kX2F1dGhfZGJtIHRvIGhhbmRsZSBtdWx0aXBsZSBEQk0gdHlwZXMgW0lhbiBIb2xzbWFuXQoKICAqKSBGaXggbWF0Y2hpbmcgb2Ygdmhvc3RzIGJ5IGlwIGFkZHJlc3Mgc28gd2UgZmluZCBJUHY0CiAgICAgdmhvc3QgYWRkcmVzcyB3aGVuIHRhcmdldCBhZGRyZXNzIGlzIHY0LW1hcHBlZCBmb3JtIG9mCiAgICAgdGhhdCBhZGRyZXNzLiAgW0plZmYgVHJhd2lja10KCiAgKikgTW9yZSBwZXJmb3JtYW5jZSB0d2Vha3MgdG8gdGhlIEJORE0gc3RyaW5nLXNlYXJjaCBhbGdvcml0aG0KICAgICB1c2VkIHRvIGZpbmQgIjwhLS0jIiB0b2tlbnMgaW4gbW9kX2luY2x1ZGUgW0JyaWFuIFBhbmVdCgogICopIE1pc2NlbGxhbmVvdXMgc21hbGwgcGVyZm9ybWFuY2UgZml4ZXM6IG9wdGltaXplZCBhd2F5IHZhcmlvdXMKICAgICBzdHJpbmcgY29weSBvcGVyYXRpb25zIGFuZCByZW1vdmVkIGxhcmdlIHRlbXAgYnVmZmVycyBmcm9tCiAgICAgdGhlIHN0YWNrIFtCcmlhbiBQYW5lXQoKICAqKSBGaXhlZCBzdGFydHVwIHNlZ2ZhdWx0IHRoYXQgb2NjdXJyZWQgd2hlbiBhIFZpcnR1YWxIb3N0CiAgICAgZGlyZWN0aXZlIGhhZCBhIHBvcnQgYnV0IG5vIGFkZHJlc3MgW0JyaWFuIFBhbmVdCgogICopIEFsbG93IGh0ZGJtIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBEQk0gdHlwZXMgW0lhbiBIb2xzbWFuXQoKICAqKSBXaW4zMjogTWFkZSBjaGFuZ2UgdG8gYXByX3NlbmRmaWxlKCkgdG8gcmV0dXJuIEFQUl9FTk9USU1QTAogICAgIGlmIG9zbGV2ZWwgPCBXSU5OVC4gIFRoaXMgc2hvdWxkIGZpeCBzZXZlcmFsIHByb2JsZW1zIHJlcG9ydGVkCiAgICAgQWdhaW5zdCAyLjAuMjggb24gV2luZG93cyA5OCBbQmlsbCBTdG9kZGFyZF0KCiAgKikgV2luMzI6IEZpeCBidWcgdGhhdCBjb3VsZCBjYXVzZSBDR0kgc2NyaXB0cyB3aXRoIFFVRVJZX1NUUklOR1MKICAgICB0byBmYWlsLiBbQmlsbCBTdG9kZGFyZF0KCiAgKikgQ2hhbmdlIGNvcmUgY29kZSB0byBhbGxvdyBhbiBNUE0gdG8gc2V0IGhhcmQgdGhyZWFkL3NlcnZlcgogICAgIGxpbWl0cyBhdCBzdGFydHVwLiAgcHJlZm9yaywgd29ya2VyLCBhbmQgcGVyY2hpbGQgTVBNcyBub3cgaGF2ZSAKICAgICBkaXJlY3RpdmVzIHRvIHNldCB0aGVzZSBsaW1pdHMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBXaW4zMjogVGhlIGFzeW5jIEFjY2VwdEV4KCkgZXZlbnQgc2hvdWxkIGJlIGF1dG9yZXNldCB1cG9uCiAgICAgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGEgd2FpdCAoV2FpdEZvclNpbmdsZU9iamVjdCkuIFRoaXMKICAgICBlbGltaW5hdGVzIGEgbnVtYmVyIG9mIHNwdXJpb3VzCiAgICAgc2V0c29ja29wdChTT19VUERBVEVfQUNDRVBUX0NPTlRFWFQpIGZhaWxlZC4iIG1lc3NhZ2VzLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBNb3ZlIGFueSBsb2FkIGxpYnJhcnkgcGF0aCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3V0IG9mIAogICAgIGFwYWNoZWN0bCBhbmQgaW50byBhIHNlcGFyYXRlIGVudmlyb25tZW50IHZhcmlhYmxlIGZpbGUgd2hpY2gKICAgICBjYW4gYmUgbW9yZSBlYXNpbHkgdGFpbG9yZWQgYnkgdGhlIGFkbWluLiAgVGhlIGVudmlyb25tZW50CiAgICAgdmFyaWFibGUgZmlsZSBhcyBidWlsdCBieSBBcGFjaGUgbWF5IGhhdmUgYWRkaXRpb25hbCBzeXN0ZW0tCiAgICAgc3BlY2lmaWMgc2V0dGluZ3MuICBGb3IgZXhhbXBsZSwgb24gT1MvMzkwIHdlIHRhaWxvciB0aGUgaGVhcAogICAgIHNldHRpbmdzIHRvIGFsbG93IGxvdHMgb2YgdGhyZWFkcy4gIFtKZWZmIFRyYXdpY2tdCiAgICAKICAqKSBVc2UgdGhlIG5ldyBBUFIgcG9vbCBjb2RlIHRvIHJlZHVjZSBwb29sLXJlbGF0ZWQgbG9jawogICAgIGNvbnRlbnRpb24gaW4gdGhlIHdvcmtlciBNUE0uICBbU2FuZGVyIFN0cmlrZXJdCgogICopIFRoZSBQT0Qgbm8gbG9uZ2VyIGFzc3VtZXMgdGhlIGNoaWxkIGlzIGxpc3RlbmluZyBvbiAxMjcuMC4wLjEKICAgICBhbmQgbm93IHB1bGxzIHRoZSBmaXJzdCBob3N0bmFtZSBpbiB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMgdG8KICAgICBwZXJmb3JtIHRoZSBkdW1teSBjb25uZWN0IG9uLiBUaGlzIGZpeGVzIGEgYnVnIHdoZW4gdGhlIHVzZXIKICAgICBoYWQgY29uZmlndXJlZCB0aGUgTGlzdGVuIGRpcmVjdGl2ZSBmb3IgYW4gSVAgb3RoZXIgdGhhbgogICAgIDEyNy4wLjAuMS4gVGhpcyB3b3VsZCByZXN1bHQgaW4gdW5kZWFkIGNoaWxkcmVuIGFuZCBlcnJvcgogICAgIG1lc3NhZ2VzIHN1Y2ggYXMgIkNvbm5lY3Rpb24gcmVmdXNlZDogY29ubmVjdCB0byBsaXN0ZW5lciIuCiAgICAgW0Fhcm9uIEJhbm5lcnRdCgogICopIFRoZSB3b3JrZXIgTVBNIG5vdyByZXNwZWN0cyB0aGUgTG9ja0ZpbGUgc2V0dGluZywgbmVlZGVkIHRvCiAgICAgYXZvaWQgbG9ja2luZyBwcm9ibGVtcyB3aXRoIE5GUy4gIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBzZWdmYXVsdCB3aGVuIHdvcmtlciBNUE0gcmVjZWl2ZXMgU0lHSFVQLgogICAgIFtJYW4gSG9sc21hbiwgQWFyb24gQmFubmVydCwgSnVzdGluIEVyZW5rcmFudHpdCgogICopIEZpeCBidWcgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBwcmV2ZW50IHRoZSBwZXJjaGlsZCBNUE0gZnJvbQogICAgIHdvcmtpbmcgd2l0aCBtb3JlIHRoYW4gb25lIHZob3N0L3VpZC4gIFtBYXJvbiBCYW5uZXJ0XQoKICAqKSBDaGFuZ2UgbWFrZSBpbnN0YWxsIGFuZCBhcHhzIC1pIHByb2Nlc3Npbmcgb2YgRFNPIG1vZHVsZXMgdG8gCiAgICAgcGVyZm9ybSBzcGVjaWFsIGhhbmRsaW5nIG9uIHBsYXRmb3JtcyB3aGVyZSBsaWJ0b29sIGRvZXNuJ3QgaW5zdGFsbCAKICAgICBtb2RfZm9vLnNvLiAgVGhpcyBmaXhlcyBzb21lIHdvbmtpbmVzcyBvbiBIUC1VWCwgVHJ1NjQsIGFuZCBBSVggCiAgICAgd2hpY2ggcHJldmVudGVkIHN0YW5kYXJkIExvYWRNb2R1bGUgc3RhdGVtZW50cyBmcm9tIHdvcmtpbmcuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgV2hlbmV2ZXIgbW9kX3NvIGlzIGVuYWJsZWQgKG5vdCBqdXN0IHdoZW4gdGhlcmUgYXJlIERTT3MgZm9yCiAgICAgb3VyIG1vZHVsZXMpLCBkbyB3aGF0ZXZlciBzcGVjaWFsIG1hZ2ljIGlzIHJlcXVpcmVkIGZvciBjb21waWxpbmcvCiAgICAgbG9hZGluZyB0aGlyZC1wYXJ0eSBtb2R1bGVzLiAgVGhpcyBhbGxvd3MgdGhpcmQtcGFydHkgRFNPcyB0bwogICAgIGJlIHVzZWQgb24gYW4gQUlYIGJ1aWxkIHdoZW4gdGhlcmUgd2VyZSBubyBidWlsdC1pbiBtb2R1bGVzCiAgICAgYnVpbHQgYXMgRFNPcy4gIChUaGlzIHNob3VsZCBoZWxwIG9uIE9TLzM5MCBhbmQgQmVPUyBhcyB3ZWxsLikKICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBbGxvdyBhcHhzIHRvIGJlIHVzZWQgdG8gYnVpbGQgRFNPcyBvbiBBSVggd2l0aG91dCByZXF1aXJpbmcgdGhlCiAgICAgdXNlciB0byBoYXJkLWNvZGUgdGhlIGxpc3Qgb2YgaW1wb3J0IGZpbGVzLiAgKFRoaXMgc2hvdWxkIGhlbHAKICAgICBvbiBPUy8zOTAgYW5kIEJlT1MgYXMgd2VsbC4pICBbSmVmZiBUcmF3aWNrXQogICAgIAogICopIFJlc29sdmVkIHNlZ2ZhdWx0IGluIG1vZF9pc2FwaSB3aGVuIGNvbmZpZ3VyaW5nIHdpdGggSVNBUElDYWNoZUZpbGUuCiAgICAgUFIgODU2MywgODkxOSAgW1dpbGxpYW0gUm93ZV0KICAKICAqKSBHZXQgYmluYXJ5IGJ1aWxkcyB3b3JraW5nIHdoZW4gbGliYXByIGFuZCBsaWJhcHJ1dGlsIGFyZSBidWlsdAogICAgIHNoYXJlZCBbR3JlZyBBbWVzXQoKICAqKSBHZXQgc2hhcmVkIGJ1aWxkcyBvZiBsaWJhcHIgYW5kIGxpYmFwcnV0aWwsIGFzIHdlbGwgYXMgQXBhY2hlIERTT3MsCiAgICAgd29ya2luZyBvbiBBSVguICBbQWFyb24gQmFubmVydCwgRGljayBEdW5iYXIgPFJMRHVuYmFyIHBhY2JlbGwubmV0PiwKICAgICBHYXJ5IEhvb2sgPGdob29rIHVzLmlibS5jb20+LCBWaWN0b3IgT3JsaWtvd3NraSwgSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggdGhlIGhhbmRsaW5nIG9mIFNTSSBkaXJlY3RpdmVzIGluIHdoaWNoIHRoZSAiPiIgb2YgdGhlCiAgICAgdGVybWluYXRpbmcgIi0tPiIgaXMgdGhlIGxhc3QgYnl0ZSBpbiBhIGZpbGUgW0JyaWFuIFBhbmVdCgogICopIEFkZCBiYWNrIGluIHRoZSAic3VFWEVDIG1lY2hhbmlzbSBlbmFibGVkICh3cmFwcGVyOiAvcGF0aC90by9zdWV4ZWMpIgogICAgIG1lc3NhZ2UgdGhhdCB3ZSBoYWQgYmFjayBpbiBhcGFjaGUtMS4zIGFuZCBzdGlsbCBoYXZlIHNjYXR0ZXJlZAogICAgIHRocm91Z2hvdXQgb3VyIGRvY3MuICBbQWFyb24gQmFubmVydF0KCiAgKikgUHJldmVudCB0aGUgV2luMzIgcG9ydCBmcm9tIGNvbnRpbnVpbmcgYWZ0ZXIgZW5jb3VudGVyaW5nIGFuCiAgICAgZXJyb3IgaW4gdGhlIGNvbW1hbmQgbGluZSBhcmdzIHRvIGFwYWNoZS4gIFtXaWxsaWFtIFJvd2VdCgogICopIE9uIGEgZXJyb3IgaW4gdGhlIHByb3h5LCBtYWtlIGl0IHdyaXRlIGEgbGluZSB0byB0aGUgZXJyb3IgbG9nCiAgICAgW0lhbiBIb2xzbWFuXQoKICAqKSBWYXJpb3VzIG1vZF9zc2wgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIFtEb3VnIE1hY0VhY2hlcm5dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4yOQoKICAqKSBBZGQgYnVmZmVyaW5nIGluIGNvcmVfb3V0cHV0X2ZpbHRlciB0byBlbnN1cmUgdGhhdCBsb25nCiAgICAgbGlzdHMgb2Ygc21hbGwgYnVja2V0cyBkb24ndCBjYXVzZSBzbWFsbCBwYWNrZXQgd3JpdGVzLgogICAgIFtCcmlhbiBQYW5lLCBSeWFuIEJsb29tXQoKICAqKSBGaXggdGhlIGluc3RhbGxhdGlvbiB0YXJnZXQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG1hbnVhbCBpcyAKICAgICBpbnN0YWxsZWQgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCiAgICAgW1lvc2hpZnVtaSBIaXJhbWF0c3UgPGhpcmFtYXR1IGJvcmVhcy5kdGkubmUuanA+IGFuZAogICAgICBHb21leiBIZW5yaSA8aGdvbWV6IHNsaWIuZnI+XQoKICAqKSBGaXggdGhlIGNtZCBjb21tYW5kIGZvciBtb2RfaW5jbHVkZS4gIFdoZW4gd2UgYXJlIHByb2Nlc3NpbmcKICAgICBhIGNtZCBjb21tYW5kLCB3ZSBkbyBub3Qgd2FudCB0byB1c2UgdGhlIHItPmZpbGVuYW1lIHRvIHNldAogICAgIHRoZSBjb21tYW5kIG5hbWUuICBUaGUgY29tbWFuZCBjb21lcyBmcm9tIHRoZSBTU0kgdGFnLiAgVG8gZG8gdGhpcywKICAgICBJIGFkZGVkIGEgdmFyaWFibGUgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgYnVpbGRzIHRoZSBjb21tYW5kIGxpbmUKICAgICBpbiBtb2RfY2dpLiAgVGhpcyBhbGxvd3MgdGhlIGluY2x1ZGVfY21kIGZ1bmN0aW9uIHRvIHNwZWNpZnkKICAgICB0aGUgY29tbWFuZCBsaW5lIGl0c2VsZi4gW1J5YW4gQmxvb21dCgogICopIENoYW5nZSBvcGVuX2xvZ3MgaG9vayB0byByZXR1cm4gYSB2YWx1ZSwgYWxsb3dpbmcgeW91CiAgICAgdG8gZmxhZyBhIGVycm9yIHdoaWxlIG9wZW5pbmcgbG9ncwogICAgIFtJYW4gSG9sc21hbiwgRG91ZyBNYWNFYWNoZXJuXQoKICAqKSBDaGFuZ2UgcG9zdF9jb25maWcgaG9vayB0byByZXR1cm4gYSB2YWx1ZSwgYWxsb3dpbmcgeW91CiAgICAgdG8gZmxhZyBhIGVycm9yIHBvc3QgY29uZmlnCiAgICAgW0lhbiBIb2xzbWFuLCBKZWZmIFRyYXdpY2tdCgogICopIEFsbG93IFNVRVhFQ19CSU4gKHRoZSBwYXRoIHRvIHRoZSBzdWV4ZWMgYmluYXJ5IHRoYXQgaXMKICAgICBoYXJkLWNvZGVkIGludG8gdGhlIHNlcnZlcikgdG8gYmUgc3BlY2lmaWVkIHRvIHRoZSBjb25maWd1cmUKICAgICBzY3JpcHQgYnkgdGhlIC0td2l0aC1zdWV4ZWMtYmluIHBhcmFtZXRlci4gIFtBYXJvbiBCYW5uZXJ0XQoKICAqKSBGaXggc2VndiBpbiB3b3JrZXIgTVBNIGZvbGxvd2luZyBhY2NlcHQgb24gcGlwZS1vZi1kZWF0aAogICAgIFtCcmlhbiBQYW5lXQoKICAqKSBBZGQgbW9kX2RlZmxhdGUgdG8gZXhwZXJpbWVudGFsLiAgCiAgICAgW0lhbiBIb2xzbWFuLCBKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgQmFpbCBvdXQgYXQgY29uZmlndXJlIHRpbWUgaWYgYW4gaW52YWxpZCBNUE0gd2FzIHNwZWNpZmllZC4KICAgICBbamVhbi1mcmVkZXJpYyBjbGVyZSA8amZyZWRlcmljLmNsZXJlIGZ1aml0c3Utc2llbWVucy5jb20+XQoKICAqKSBQcmV2ZW50IHNlZ3YgaW4gYXBfbm90ZV9iYXNpY19hdXRoX2ZhaWx1cmUoKSB3aGVuIG5vIEF1dGhOYW1lIGlzCiAgICAgY29uZmlndXJlZCBbSm9obiBTdGVybGluZyA8c3RlcmxpbmcgY292YWxlbnQubmV0Pl0KCiAgKikgRml4IGFweHMgdG8gdXNlIHNiaW5kaXIuICBbSGVucmkgR29tZXogPGhnb21leiBzbGliLmZyPl0KCiAgKikgRml4IGEgcHJvYmxlbSB3aXRoIElQdjYgdmhvc3RzLiAgUFIgIzgxMTggIFtKZWZmIFRyYXdpY2tdCgogICopIE9wdGltaXphdGlvbiBmb3IgdGhlIEJORE0gc3RyaW5nLXNlYXJjaCBmdW5jdGlvbiBpbgogICAgIG1vZF9pbmNsdWRlLiAgW0JyaWFuIFBhbmVdCgogICopIEZpeGVkIHRoZSBiZWhhdmlvciBvZiB0aGUgWEJpdEhhY2sgZGlyZWN0aXZlLgogICAgIFtUYWtldG8gS2FiZSA8a2FiZSBzcmEtdG9ob2t1LmNvLmpwPiwgQ2xpZmYgV29vbGxleV0gUFIjODgwNAoKICAqKSBUaGUgdGhyZWFkZWQgTVBNIGZvciBVbml4IGhhcyBiZWVuIHJlbW92ZWQuICBVc2UgdGhlIHdvcmtlcgogICAgIE1QTSBpbnN0ZWFkLiAgW3ZhcmlvdXNdCgogICopIEFQUi1pemUgdGhlIHJlc29sdmVyIGxvZ2ljIGluIG1vZF91bmlxdWVfaWQuICBUaGlzIGZpeGVzIGEgYnVnCiAgICAgaW4gbG9nZ2luZyB0aGUgZXJyb3IgZnJvbSBhIGZhaWxlZCBETlMgbG9va3VwLiAgW0plZmYgVHJhd2lja10KCiAgKikgQWRkZWQgdGhlIG1pc3NpbmcgbWFjcm9zIEFQX0lOSVRfVEFLRTEzIGFuZCBBUF9JTklUX1RBS0UxMjMuCiAgICAgW0NsaWZmIFdvb2xsZXldCgogICopIEdldCBtb2RfY2dpZCBraWxsZWQgd2hlbiBhIE1QTSBleGl0cyBkdWUgdG8gYSBmYXRhbCBlcnJvci4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggYSBmaWxlIGRlc2NyaXB0b3IgbGVhayBpbiBtb2RfaW5jbHVkZS4gIFdoZW4gd2UgaW5jbHVkZSBhCiAgICAgZmlsZSwgd2UgdXNlIGEgc3ViLXJlcXVlc3QsIGJ1dCB3ZSBkaWRuJ3QgZGVzdHJveSB0aGUgc3ViLXJlcXVlc3QKICAgICBpbW1lZGlhdGVseSwgaW5zdGVhZCB3ZSB3YWl0ZWQgdW50aWwgdGhlIG9yaWdpbmFsIHJlcXVlc3Qgd2FzCiAgICAgZG9uZS4gIFRoaXMgcGF0Y2ggY2xvc2VzIHRoZSBzdWItcmVxdWVzdCBhcyBzb29uIGFzIHRoZSBkYXRhIGlzCiAgICAgZG9uZSBiZWluZyBnZW5lcmF0ZWQuICBbQnJpYW4gUGFuZSA8YnBhbmUgcGFjYmVsbC5uZXQ+XQoKICAqKSBBbGxvdyBtb2R1bGVzIHRoYXQgYWRkIHNvY2tldHMgdG8gdGhlIGFwX2xpc3RlbmVycyBsaXN0IHRvCiAgICAgZGVmaW5lIHRoZSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGFjY2VwdCBvbiB0aGF0CiAgICAgc29ja2V0LiAgRWFjaCBNUE0gY2FuIGRlZmluZSB0aGVpciBvd24gZnVuY3Rpb24gdG8gdXNlIGZvcgogICAgIHRoZSBhY2NlcHQgZnVuY3Rpb24gd2l0aCB0aGUgTVBNX0FDQ0VQVF9GVU5DIG1hY3JvLiAgVGhpcwogICAgIGFsc28gYWJzdHJhY3RzIG91dCBhbGwgb2YgdGhlIFVuaXggYWNjZXB0IGVycm9yIGhhbmRsaW5nCiAgICAgbG9naWMsIHdoaWNoIGhhcyBiZWNvbWUgb3V0IG9mIHN5bmNoIGFjcm9zcyBVbml4IE1QTXMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEZpeCBhIGJ1ZyB3aGljaCB3b3VsZCBjYXVzZSB0aGUgcmVzcG9uc2UgaGVhZGVycyB0byBiZSBvbWl0dGVkCiAgICAgd2hlbiBzZW5kaW5nIGEgbmVnb3RpYXRlZCBFcnJvckRvY3VtZW50IGJlY2F1c2UgdGhlIHJlcXVpcmVkCiAgICAgZmlsdGVycyB3ZXJlIGF0dGFjaGVkIHRvIHRoZSB3cm9uZyByZXF1ZXN0X3JlYy4KICAgICBbSm9obiBTdGVybGluZyA8c3RlcmxpbmcgY292YWxlbnQubmV0Pl0KCiAgKikgUmVtb3ZlIGNvbW1hcyBmcm9tIHRoZSBlbmQgb2YgdGhlIG1hY3JvcyB0aGF0IGRlZmluZQogICAgIGRpcmVjdGl2ZXMgdGhhdCBhcmUgdXNlZCBieSBNUE1zLiAgUHJpb3IgdG8gdGhpcyBwYXRjaCwKICAgICB5b3Ugd291bGQgdXNlIHRoZXNlIG1hY3JvcyB3aXRob3V0IGNvbW1hcywgd2hpY2ggd2FzIHVubGlrZQogICAgIHRoZSBtYWNyb3MgZm9yIGFueSBvdGhlciBkaXJlY3RpdmVzLiAgTm93LCB0aGUgY2FsbGVyIHByb3ZpZGVzCiAgICAgdGhlIGNvbW1hIHJhdGhlciB0aGFuIHRoZSBtYWNybyBwcm92aWRpbmcgaXQuICBUaGlzIG1ha2VzCiAgICAgdGhlIG1hY3JvcyBsb29rIG1vcmUgbGlrZSB0aGUgcmVzdCBvZiB0aGUgZGlyZWN0aXZlcy4KICAgICBbUnlhbiBCbG9vbSBhbmQgQ2xpZmYgV29vbGxleV0KCiAgKikgQWRkICdyZWRpcmVjdC1jYXJlZnVsbHknIGVudmlyb25tZW50IG9wdGlvbiB0byBkaXNhYmxlIHNlbmRpbmcKICAgICByZWRpcmVjdHMgdW5kZXIgc3BlY2lhbCBjaXJjdW1zdGFuY2VzLiAgVGhpcyBpcyBoZWxwZnVsIGZvciAKICAgICBNaWNyb3NvZnQncyBXZWJGb2xkZXJzIHdoZW4gYWNjZXNzaW5nIGEgZGlyZWN0b3J5IHJlc291cmNlIHZpYQogICAgIERBViBtZXRob2RzLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBCZWdpbiB0byBhYnN0cmFjdCBvdXQgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGxheWVyLgogICAgIFRoZSBmaXJzdCBzdGVwIGlzIHRvIHJlbW92ZSB0aGUgc29ja2V0IGZyb20gdGhlIGNvbm5fcmVjLAogICAgIHRoZSBzZXJ2ZXIgbm93IGxpdmVzIGluIGEgY29udGV4dCB0aGF0IGlzIHBhc3NlZCB0byB0aGUKICAgICBjb3JlJ3MgaW5wdXQgYW5kIG91dHB1dCBmaWx0ZXJzLiBUaGlzIGZvcmNlcyB1cyB0byBiZSB2ZXJ5CiAgICAgY2FyZWZ1bCB3aGVuIGFkZGluZyBjYWxscyB0aGF0IHVzZSB0aGUgc29ja2V0IGRpcmVjdGx5LAogICAgIGJlY2F1c2UgdGhlIHNvY2tldCBpc24ndCBhdmFpbGFibGUgaW4gbW9zdCBsb2NhdGlvbnMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIFJlYWxseSByZXNldCB0aGUgTWF4Q2xpZW50cyB2YWx1ZSBpbiB3b3JrZXIgYW5kIHRocmVhZGVkCiAgICAgd2hlbiB0aGUgY29uZmlndXJlZCB2YWx1ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgbnVtYmVyIAogICAgIG9mIHRocmVhZHMgcGVyIGNoaWxkLiAgV2Ugc2FpZCB3ZSBkaWQgcHJldmlvdXNseSBidXQgd2UgCiAgICAgZm9yZ290IHRvLiBbSmVmZiBUcmF3aWNrXQoKICAqKSBBZGQgRGViaWFuIGxheW91dC4gIFtEYW5pZWwgU3RvbmUgPGRhbmllbCBzZmFyYy5uZXQ+XQoKICAqKSBJZiBzaGFyZWQgbW9kdWxlcyBhcmUgcmVxdWVzdGVkIGFuZCBtb2Rfc28gaXMgbm90IGF2YWlsYWJsZSwKICAgICBwcm9kdWNlIGEgZmF0YWwgY29uZmlnLXRpbWUgZXJyb3IuICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEltcHJvdmUgaHR0cDJlbnYncyBwZXJmb3JtYW5jZSBieSBjdXR0aW5nIHRoZSB3b3JrIGl0IGhhcyB0bwogICAgIGRvLiAgW0JyaWFuIFBhbmUgPGJwYW5lIHBhY2JlbGwubmV0Pl0KCiAgKikgdXNlIG5ldyAnYXByX2hhc2hfbWVyZ2UnIGZ1bmN0aW9uIGluIG1vZF9taW1lIChwZXJmb3JtYW5jZSBmaXgpCiAgICAgW0JyaWFuIFBhbmUgPGJwYW5lIHBhY2JlbGwubmV0Pl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjI4CgogICopIEZpeCBpbmZpbml0ZSBsb29wIGluIG1vZF9jZ2lkLmMuICAKICAgICBbRGFsZSBHaGVudCA8ZGFsZWcgZWxlbWVudGFsLm9yZz4sIEJyaWFuIFBhbmUgPGJwYW5lIHBhY2JlbGwubmV0Pl0KCiAgKikgV2hlbiBubyBwb3J0IGlzIGdpdmVuIGluIGEgIlNlcnZlck5hbWUgaG9zdCIgZGlyZWN0aXZlLCB0aGUKICAgICBzZXJ2ZXJfcmVjLT5wb3J0IGlzIG5vdyBzZXQgdG8gemVybywgbm90IDgwLiBUaGF0IGFsbG93cyBmb3IKICAgICBydW4tdGltZSBkZWR1Y3Rpb24gb2YgdGhlIGNvcnJlY3Qgc2VydmVyIHBvcnQgKGRlcGVuZGluZyBvbgogICAgIFNTTC9wbGFpbiwgYW5kIGRlcGVuZGluZyBhbHNvIG9uIHRoZSBjdXJyZW50IHNldHRpbmcgb2YKICAgICBVc2VDYW5vbmljYWxOYW1lKS4gVGhpcyBjaGFuZ2UgbWFrZXMgcmVkaXJlY3Rpb25zCiAgICAgd29yaywgZXZlbiB3aXRoIGh0dHBzOi8vIGNvbm5lY3Rpb25zLiBBcyBpbiBBcGFjaGUtMS4zLCB0aGUKICAgICBjb25uZWN0aW9uJ3MgYWN0dWFsIHBvcnQgbnVtYmVyIGlzIG5ldmVyIHVzZWQsIG9ubHkgdGhlIFNlcnZlck5hbWUKICAgICBzZXR0aW5nIG9yIHRoZSBjbGllbnQncyBIb3N0OiBzZXR0aW5nLiBEb2N1bWVudGF0aW9uIHVwZGF0ZWQKICAgICB0byByZWZsZWN0IHRoZSBjaGFuZ2UuIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgQWRkIGEgJyV7bm90ZS1uYW1lfWUnIGFyZ3VtZW50IHRvIG1vZC1oZWFkZXJzLCB3aGljaCB3b3JrcyBpbgogICAgIHRoZSBzYW1lIHdheSBhcyBtb2RfbG9nX2NvbmZnLiAgW0lhbiBIb2xzbWFuXQoKICAqKSBGaXggdGhlIHNwZWxsaW5nIG9mIHRoZSBBUF9NUE1RX01JTl9TUEFSRV9EQUVNT05TIGFuZAogICAgIEFQX01QTVFfTUFYX1JFUVVFU1RTX0RBRU1PTiBtYWNyb3MgaW4gYXBfbXBtLmggYW5kIGFsbCBzdGFuZGFyZAogICAgIE1QTXMuICBbQ2xpZmYgV29vbGxleV0KCiAgKikgSW50cm9kdWNlIGh0ZGJtLCBhIHVzZXIgbWFuYWdlbWVudCB1dGlsaXR5IGZvciBkYi9kYm0gYXV0aG9yaXphdGlvbgogICAgIGRhdGFiYXNlcy4gIFtNbGFkZW4gVHVyayA8bXR1cmsgbWFwcGluZ3NvZnQuY29tPl0KCiAgKikgT3B0aW1pemUgdXNhZ2Ugb2Ygc3RybGVuIGFuZCBzdHJjYXQgaW4gYXBfZGlyZWN0b3J5X3dhbGsuCiAgICAgW0JyaWFuIFBhbmUgPGJwYW5lIHBhY2JlbGwubmV0Pl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjI3CgogICopIEludHJvZHVjZSBhbiBBcGFjaGUgbW9kX3NzbCBpbml0aWFsIGNvbmZpZ3VyYXRpb24gdGVtcGxhdGUgCiAgICAgKHNzbC5jb25mLCBnZW5lcmF0ZWQgZnJvbSBzc2wtc3RkLmNvbmYpLiAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGdldGxpbmUgcGFyc2luZyBjb2RlIHRoYXQgY291bGQKICAgICBiZSB0cmlnZ2VyZWQgYnkgYXJiaXRyYXJpbHkgbGFyZ2UgaGVhZGVyIGxpbmVzLiBSZXF1ZXN0cwogICAgIGZyb20gdGhlIGNvcmUgaW5wdXQgZmlsdGVyIGZvciBzaW5nbGUgbGluZXMgYXJlIG5vdyBsaW1pdGVkCiAgICAgdG8gSFVHRV9TVFJJTkdfTEVOICg4MTkyIGJ5dGVzKS4gIFtBYXJvbiBCYW5uZXJ0XQoKICAqKSBGaXggYSB0cnVuY2F0aW9uIGJ1ZyBpbiBob3cgd2UgcHJpbnQgdGhlIHBvcnQgb24gdGhlIFZpYTogaGVhZGVyLiAKICAgICBUaGUgcm91dGluZSB0aGF0IHByaW50cyB0aGUgVmlhOiBoZWFkZXIgbm93IHRha2VzIGEgbGVuZ3RoIGZvcgogICAgIHRoZSBwb3J0IHN0cmluZy4gIFtadmkgSGFyJ0VsIDxybCBtYXRoLnRlY2huaW9uLmFjLmlsPl0KCiAgKikgU29tZSBzeW50YXggZXJyb3JzIGluIG1vZF9taW1lX21hZ2ljJ3MgbWFnaWMgZmlsZSBjYW4gcmVzdWx0CiAgICAgaW4gYSA1MDAgZXJyb3IsIHdoaWNoIHByZXZpb3VzbHkgd2FzIHVubG9nZ2VkLiAgTm93IHdlIGxvZyB0aGUKICAgICBlcnJvci4gIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZCB0aGUgc3VwcG9ydC9jaGVja2dpZCBoZWxwZXIgYXBwLCB3aGljaCBjaGVja3MgdGhlIHJ1bi10aW1lCiAgICAgdmFsaWRpdHkgb2YgZ3JvdXAgaWRlbnRpZmllcnMgdXNhYmxlIGluIHRoZSBHcm91cCBkaXJlY3RpdmUuCiAgICAgW0tlbiBDb2FyXQoKICAqKSBWYXJpb3VzIC0tZW5hYmxlLXNvIG9wdGlvbnMgaGF2ZSBiZWVuIGZpeGVkOiAtLWVuYWJsZS1zbyBpcwogICAgIHRyZWF0ZWQgYXMgInN0YXRpYyI7IGV4cGxpY2l0IC0tZW5hYmxlLXNvPXNoYXJlZCBpc3N1ZXMgYW4gZXJyb3I7CiAgICAgYW5kIGV4cGxpY2l0IC0tZW5hYmxlLXNvIGZhaWxzIHdpdGggZXJyb3Igb24gc3lzdGVtcyB3aXRob3V0CiAgICAgQVBSX0hBU19EU08uICBbQWFyb24gQmFubmVydF0KCiAgKikgRml4IGEgc2VnZmF1bHQgaW4gdGhlIGNvcmUgaW5wdXQgZmlsdGVyIHdoZW4gdGhlIGNsaWVudCBzb2NrZXQKICAgICBnZXRzIGRpc2Nvbm5lY3RlZCB1bmV4cGVjdGVkbHkuICBbQ2xpZmYgV29vbGxleV0KCiAgKikgRml4IHRoZSByZXBvcnRpbmcgZm9yIGNoaWxkIHByb2Nlc3NlcyB0aGF0IGRpZS4gIFRoaXMgcmVtb3ZlcwogICAgIGFsbCBvZiB0aGUgbm9uLXBvcnRhYmxlIFcqIG1hY3JvcyBmcm9tIEFwYWNoZS4gCiAgICAgW0plZmYgVHJhd2ljayBhbmQgUnlhbiBCbG9vbV0KCiAgKikgV2luMzI6IFRyYWNrIGFuZCBkaXNwbGF5ICJQYXJlbnQgU2VydmVyIEdlbmVyYXRpb246IiBpbgogICAgIG1vZF9zdGF0dXMgb3V0cHV0LiBUaGUgZ2VuZXJhdGlvbiB3aWxsIGJlIGJ1bXBlZCBhdAogICAgIHNlcnZlciBncmFjZWZ1bCByZXN0YXJ0LCB3aGVuIHRoZSBjaGlsZCBwcm9jZXNzIGV4aXRzCiAgICAgYnkgaGl0dGluZyBNYXhSZXF1ZXN0c1BlckNoaWxkIG9yIGlmIHRoZSBjaGlsZCAKICAgICBwcm9jZXNzIGV4aXRzIGFibm9ybWFsbHkuIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBXaW4zMjogRml4IHByb2JsZW0gd2hlcmUgTWF4UmVxdWVzdHNQZXJDaGlsZCBkaXJlY3RpdmUgd2FzCiAgICAgbm90IGJlaW5nIHBpY2tlZCB1cCBpbiBmYXZvciBvZiB0aGUgZGVmYXVsdC4gRW5hYmxlCiAgICAgdGhlIHBhcmVudCB0byBzdGFydCB1cCBhIG5ldyBjaGlsZCBwcm9jZXNzIGltbWVkaWF0ZWx5IHVwb24KICAgICB0aGUgb2xkIGNoaWxkIHN0YXJ0aW5nIHNodXRkb3duLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXggc29tZSBidW5nbGluZyBvZiB0aGUgcmVtb3RlIHBvcnQgaW4gcmZjMTQxMy5jIHNvIHRoYXQgCiAgICAgSWRlbnRpdHlDaGVjayByZXRyaWV2ZXMgdGhlIHByb3BlciB1c2VyIGlkIGluc3RlYWQgb2YgZmFpbGluZwogICAgIGFuZCB0aHVzIGFsd2F5cyByZXR1cm5pbmcgIm5vYm9keS4iICAKICAgICBbRGljayBTdHJlZWZsYW5kIDxEaWNrLlN0cmVlZmxhbmQgeHM0YWxsLm5sPl0KCiAgKikgSW50cm9kdWNlZCB0aHJlYWQgc2FmdGV5IGZvciBtb2RfcmV3cml0ZSdzIGludGVybmFsIGNhY2hlLgogICAgIFtCcmlhbiBQYW5lIDxicGFuZSBwYWNiZWxsLm5ldD5dCgogICopIFNpbXBsaWZpZWQgbW9kX2VudidzIGRpcmVjdGl2ZXMgdG8gYmVoYXZlIGFzIG1vc3QgZGlyZWN0aXZlcyBhcmUKICAgICBleHBlY3RlZCwgaW4gdGhhdCBVbnNldEVudiB3aWxsIG5vdCB1bnNldCBhIFNldEVudiBhbmQgUGFzc0VudiAKICAgICBkaXJlY3RpdmUgZm9sbG93aW5nIHRoYXQgVW5zZXRFbnYgd2l0aGluIHRoZSBzYW1lIGNvbnRhaW5lci4KICAgICBBbHNvIHByb3ZpZGVzIGEgcnVudGltZSBzdGFydHVwIHdhcm5pbmcgaWYgYSBQYXNzRW52IGNvbmZpZ3VyZWQgCiAgICAgZW52aXJvbm1lbnQgdmFsdWUgaXMgdW5kZWZpbmVkLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgVGhlIHdvcmtlciBNUE0gaXMgbm93IGNvbXBsZXRlbHkgcG9ydGVkIHRvIEFQUidzIG5ldyBsb2NrIEFQSS4gSXQKICAgICB1c2VzIG5hdGl2ZSBBUFIgdHlwZXMgZm9yIHRocmVhZCBtdXRleGVzLCBjcm9zcy1wcm9jZXNzIG11dGV4ZXMsCiAgICAgYW5kIGNvbmRpdGlvbiB2YXJpYWJsZXMuICBbQWFyb24gQmFubmVydF0KCiAgKikgU3luYyB1cCBkb2N1bWVudGF0aW9uIHRvIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgbm93IGRlcHJlY2F0ZWQKICAgICBQb3J0IGRpcmVjdGl2ZS4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgTW92ZWQgYWxsIGxkYXAgbW9kdWxlcyBmcm9tIHRoZSBjb3JlIHRvIGh0dHBkLWxkYXAgc3ViLXByb2plY3QKICAgICBbUnlhbiBCbG9vbV0KCiAgKikgRXhpdCB3aGVuIHdlIGNhbid0IGxpc3RlbiBvbiBhbnkgb2YgdGhlIGNvbmZpZ3VyZWQgcG9ydHMuICBUaGlzCiAgICAgaXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgMS4zLCBhbmQgaXQgYXZvaWRzIGhhdmluZyB0aGUgTVBNcyB0bwogICAgIGRlYWwgd2l0aCBib2d1cyBhcF9saXN0ZW5fcmVjIHN0cnVjdHVyZXMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBDbGVhbnVwIHRoZSBwcm94eSBjb2RlIHRoYXQgY3JlYXRlcyBhIHJlcXVlc3QgdG8gdGhlIG9yaWdpbgogICAgIHNlcnZlci4gIFRoaXMgY2hhbmdlIGFkZHMgYW4gb3B0aW9uYWwgaG9vaywgd2hpY2ggYWxsb3dzIG1vZHVsZXMKICAgICB0byBnYWluIGNvbnRyb2wgd2hpbGUgdGhlIHJlcXVlc3QgaXMgY3JlYXRlZCBpZiB0aGUgcHJveHkgbW9kdWxlCiAgICAgaXMgbG9hZGVkLiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBob29rIGlzIHRvIGFsbG93IG1vZHVsZXMgdG8gYWRkCiAgICAgaW5wdXQgYW5kL29yIG91dHB1dCBmaWx0ZXJzIHRvIHRoZSByZXF1ZXN0IHRvIHRoZSBvcmlnaW4uICBXaGlsZQogICAgIEkgd2FzIGF0IGl0LCBJIG1hZGUgdGhlIGNvcmUgdXNlIHRoaXMgaG9vaywgc28gdGhhdCBwcm94eSByZXF1ZXN0CiAgICAgY3JlYXRpb24gdXNlcyBzb21lIG9mIHRoZSBjb2RlIGZyb20gdGhlIGNvcmUuICBUaGlzIGNhbiBzdGlsbCBiZQogICAgIGdyZWF0bHkgaW1wcm92ZWQsIGJ1dCB0aGlzIGlzIGEgZ29vZCBzdGFydC4gIFtSeWFuIEJsb29tXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMjYKCiAgKikgUG9ydCB0aGUgTWF4Q2xpZW50cyBjaGFuZ2VzIGZyb20gdGhlIHdvcmtlciBNUE0gdG8gdGhlIHRocmVhZGVkCiAgICAgTVBNLiAgW1J5YW4gQmxvb21dCgogICopIEZpeCBtb2RfcHJveHkgc28gdGhhdCBpdCBoYW5kbGVzIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcgYW5kIHdvcmtzCiAgICAgd2l0aCB0aGUgbmV3IGlucHV0IGZpbHRlcmluZyBzeXN0ZW0uICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIEludHJvZHVjZSB0aGUgTXVsdGl2aWV3c01hdGNoIGRpcmVjdGl2ZSwgdG8gYWxsb3cgdGhlIG9wZXJhdG9yCiAgICAgdG8gYmUgZmxleGlibGUgaW4gcmVjb2duaXppbmcgSGFuZGxlcnMgYW5kIEZpbHRlcnMgZmlsZW5hbWUKICAgICBleHRlbnNpb25zIGFzIHBhcnQgb2YgdGhlIE11bHRpdmlld3MgbWF0Y2hpbmcgbG9naWMsIHN0cmljdCB3aXRoCiAgICAgTXVsdGl2aWV3c01hdGNoIE5lZ290aWF0ZWRPbmx5IHRvIGFjY2VwdCBvbmx5IGZpbGVuYW1lIGV4dGVudGlvbnMgCiAgICAgdGhhdCBkZXNpZ25hdGUgbmVnb3RpYXRlZCBwYXJhbWV0ZXJzLCAoY29udGVudCB0eXBlLCBjaGFyc2V0LCBldGMuKQogICAgIG9yIE11bHRpdmlld3NBbGwgZm9yIHRoZSAxLjMgYmVoYXZpb3Igb2YgbWF0Y2hpbmcgYW55IGZpbGVzLCBldmVuCiAgICAgaWYgdGhleSBoYXZlIHVucmVnaXN0ZXJlZCBleHRlbnNpb25zLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYWRkIGEgTG9hZE1vZHVsZSBkaXJlY3RpdmUgdG8KICAgICB0aGUgZGVmYXVsdCBodHRwZC5jb25mIGZvciBhbnkgbW9kdWxlIHRoYXQgd2FzIGNvbXBpbGVkCiAgICAgYXMgYSBEU08uICBbQWFyb24gQmFubmVydCA8YWFyb24gY2xvdmUub3JnPl0KCiAgKikgcmV3cml0ZSBtb2Rfc3NsIGlucHV0IGZpbHRlcmluZyB0byB3b3JrIHdpdGggdGhlIG5ldyBpbnB1dCBmaWx0ZXJpbmcKICAgICBzeXN0ZW0uICBbSnVzdGluIEVyZW5rcmFudHpdCgogICopIHByZWZvcms6IERvbid0IHNlZ2ZhdWx0IHdoZW4gd2UgYXJlIGFibGUgdG8gbGlzdGVuIG9uIHNvbWUgYnV0CiAgICAgbm90IGFsbCBvZiB0aGUgY29uZmlndXJlZCBwb3J0cy4gIFtKZWZmIFRyYXdpY2tdCgogICopIEJ1aWxkIG1vZF9zbyBldmVuIGlmIG5vIGNvcmUgbW9kdWxlcyBhcmUgYnVpbHQgc2hhcmVkLgogICAgIFtBYXJvbiBCYW5uZXJ0IDxhYXJvbiBjbG92ZS5vcmc+XQoKICAqKSBJbnRyb2R1Y2UgYXBfZGlyZWN0b3J5X3dhbGsgcmV3cml0ZSAod2l0aCBmdXJ0aGVyIG9wdGltaXphdGlvbnMKICAgICByZXF1aXJlZCkgdG8gYWRhcHQgdG8gdGhlIGFwX3Byb2Nlc3NfcmVxdWVzdF9pbnRlcm5hbCgpIGNoYW5nZXMuCiAgICAgT3B0aW1pemVkIHNvIHN1YnJlcXVlc3RzIGFuZCByZWRpcmVjdHMgbm93IHJldXNlIHByZXZpb3VzIHNlY3Rpb24gCiAgICAgbWVyZ2VzLCB1bnRpbCB3ZSBtaXNtYXRjaCB3aXRoIHRoZSBvcmlnaW5hbCBkaXJlY3Rvcnlfd2FsaywgYW5kCiAgICAgcHJlY29tcHV0ZWQgci0+ZmluZm8gcmVzdWx0cyB3aWxsIGNhdXNlIGRpcmVjdG9yeV93YWxrIHRvIHNraXAKICAgICB0aGUgbW9zdCBleHBlbnNpdmUgcGhhc2VzIG9mIHRoZSBmdW5jdGlvbi4gIFtXaWxsaWFtIFJvd2VdCgogICopIEFsbG93IEFwYWNoZU1vbml0b3IgdG8gY29ubmVjdCB0byBhbmQgY29udHJvbCBBcGFjaGUgb24gb3RoZXIgCiAgICAgV2luTlQvMksgbWFjaGluZXMuICAgW01sYWRlbiBUdXJrIDxtdHVyayBtYXBwaW5nc29mdC5jb20+XQoKICAqKSBSZW1vdmUgdGhlIFBvcnQgZGlyZWN0aXZlLiAgSW4gaXQncyBwbGFjZSwgdGhlIExpc3RlbiBkaXJlY3RpdmUKICAgICBpcyBub3cgYSByZXF1aXJlZCBkaXJlY3RpdmUsIHdoaWNoIHRlbGxzIEFwYWNoZSB3aGF0IHBvcnQgdG8KICAgICBsaXN0ZW4gb24uICBUaGUgU2VydmVyTmFtZSBkaXJlY3RpdmUgaGFzIGFsc28gYmVlbiBleHRlbmRlZAogICAgIHRvIGFjY2VwdCBhbiBvcHRpb25hbCBwb3J0LiAgSWYgdGhlIHBvcnQgaXMgc3BlY2lmaWVkIHRvIHRoZQogICAgIFNlcnZlck5hbWUsIHRoZSBzZXJ2ZXIgd2lsbCByZXBvcnQgdGhhdCBwb3J0IHdoZW5ldmVyIGl0CiAgICAgcmVwb3J0cyB0aGUgcG9ydCB0aGF0IGl0IGlzIGxpc3RlbmluZyBvbi4gIFRoaXMgY2hhbmdlIHdhcwogICAgIG1hZGUgdG8gZWFzZSBjb25maWd1cmF0aW9uIGVycm9ycyB0aGF0IHN0ZW0gZnJvbSBoYXZpbmcgYSBQb3J0CiAgICAgZGlyZWN0aXZlLCBhbmQgYSBMaXN0ZW4gZGlyZWN0aXZlLiAgSW4gdGhhdCBzaXR1YXRpb24sIHRoZSBzZXJ2ZXIKICAgICB3b3VsZCBvbmx5IGxpc3RlbiB0byB0aGUgcG9ydCBzcGVjaWZpZWQgYnkgdGhlIExpc3RlbiBjb21tYW5kLAogICAgIHdoaWNoIGNhdXNlZCBhIGxvdCBvZiBjb25mdXNpb24gdG8gdXNlcnMuICBbUnlhbiBCbG9vbV0KCiAgKikgQWRkZWQgbW9kX21pbWVfbWFnaWMsIG1vZF91bmlxdWVfaWQgYW5kIG1vZF92aG9zdF9hbGlhcyB0byB0aGUgV2luMzIKICAgICBidWlsZCwgYXMgbG9hZGFibGUgbW9kdWxlcy4gIFtXaWxsaWFtIFJvd2VdCgogICopIEZpeCAtLWVuYWJsZS1tb2RzLXNoYXJlZCBwcm9jZXNzaW5nLiAgSWYgbW9zdCBpcyBzcGVjaWZpZWQsCiAgICAgdGhlbiBhbGwgbW9kdWxlcyB0aGF0IGNhbiBiZSBjb21waWxlZCBhcyBzaGFyZWQgbW9kdWxlcyBhcmUuCiAgICAgW0Fhcm9uIEJhbm5lcnQgPGFhcm9uIGNsb3ZlLm9yZz5dCgogICopIFVwZGF0ZSB0aGUgbWltZS50eXBlcyBmaWxlIHRvIG1hcCB2aWRlby92bmQubXBlZ3VybCB0byBteHUKICAgICBhbmQgYWRkIGNvbW1vbmx5IHVzZWQgYXVkaW8veC1tcGVndXJsIGZvciBtM3UgZXh0ZW5zaW9ucy4gICAgICAgIAogICAgIFtIZWlrbyBSZWNrdGVud2FsZCA8dXpzMTA2IHVuaS1ib25uLmRlPiwgTGFycyBFaWxlYnJlY2h0XQoKICAqKSBFbGltaW5hdGUgdGhlIGRlcHJlY2lhdGVkIHItPmNvbnRlbnRfbGFuZ3VhZ2UsIGluIGZhdm9yIG9mIHRoZSBhcnJheQogICAgIHItPmNvbnRlbnRfbGFuZ3VhZ2VzIGludHJvZHVjZWQgbWFueSB5ZWFycyBhZ28uICBNb2R1bGUgYXV0aG9ycyBtdXN0CiAgICAgc3Vic3RhbnRpYWxseSBvdmVyaGF1bCB0aGVpciBtb2R1bGVzLCBzbyB0aGlzIG5lZWRzIHRvIGJlIHVwZ3JhZGVkCiAgICAgaWYgdGhlIG1vZHVsZSBzdGlsbCByZWxpZWQgb24gYmFja3dhcmRzLWJyb2tlbmVzcy4gIFtXaWxsaWFtIFJvd2VdCgogICopIEFsbG93IGNvbmZpZ3VyZSBoZWxwIHN0cmluZ3MgdG8gd29yayB3aXRoIGF1dG9jb25mIDIuNTArIGFuZCAyLjEzLgogICAgIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgUmV3cml0ZSB0aGUgaW5wdXQgZmlsdGVyaW5nIG1lY2hhbmlzbXMgdG8gY29uc29saWRhdGUgYW5kIHJlb3JnYW5pemUKICAgICBjb2RlLiAgSW4gc2hvcnQsIGNvcmVfaW5wdXRfZmlsdGVyIGRvZXMgc29tZXRoaW5nIG5vdyBhbmQKICAgICBhcF9odHRwX2ZpbHRlciBpcyBub3cgb25seSBjb25jZXJuZWQgd2l0aCBIVFRQLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBVcGRhdGUgdGhlIFdpbjMyIGJ1aWxkIHRvIHJlLWFic29yYiBtb2RfcHJveHkgYW5kIGZhbWlseS4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBSZXNvbHZlZCB0aGUgYnVpbGQgZmFpbHVyZSBvbiBXaW4zMiB1c2luZyBNU1ZDIDUuMCAod2l0aG91dCB0aGUKICAgICBjdXJyZW50IFNESy4pICBbV2lsbGlhbSBSb3dlXQoKICAqKSBTb21lIHN0eWxlIGNoYW5nZXMgdG8gdGhlIGNvZGUgdGhhdCBkb2VzIFByb3h5RXJyb3JPdmVycmlkZS4gRml4ZWQKICAgICBjb25maWcgbWVyZ2UgYmVoYXZpb3VyLiBbR3JhaGFtIExlZ2dldHRdCgogICopIEFsbG93IHN1cHBvcnQgcHJvZ3JhbXMgdG8gYmUgY29tcGlsZWQgYWdhaW5zdCBhIHN0YXRpYyB2ZXJzaW9uCiAgICAgb2YgbGliYXByLiAgVGhpcyBhbGxvd3MgdGhlIHNtYWxsZXIgc3VwcG9ydCBwcm9ncmFtcyB0byBiZSAKICAgICByZWxvY2F0ZWQuICBbQWFyb24gQmFubmVydCA8YWFyb24gY2xvdmUub3JnPl0KCiAgKikgVXBkYXRlIHRoZSBtaW1lLnR5cGVzIGZpbGUgdG8gdGhlIHJlZ2lzdGVyZWQgbWVkaWEgdHlwZXMgYXMKICAgICBvZiAyMDAxLTA5LTI1LCBhbmQgYWRkIG1hcHBpbmcgZm9yIHhzbCBleHRlbnNpb24gW01hcmsgQ294XQoKICAqKSBGaXggTWF4Q2xpZW50cyBpbiB0aGUgV29ya2VyIE1QTSwgc28gdGhhdCBpdCBzcGVjaWZpZXMgdGhlIG1heGltdW0KICAgICBudW1iZXIgb2YgY2xpZW50cyB0aGF0IGNhbiBjb25uZWN0IGF0IHRoZSBzYW1lIHRpbWUsIGluc3RlYWQgb2YKICAgICBzcGVjaWZ5aW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGlsZCBwcm9jZXNzZXMuCiAgICAgW0Fhcm9uIEJhbm5lcnQgPGFhcm9uIGNsb3ZlLm9yZz5dCgogICopIFN3aXRjaCBwcm9jX3B0aHJlYWQgQWNjZXB0TXV0ZXggY29uZmlndXJhdGlvbiBkaXJlY3RpdmUgdG8gcHRocmVhZCB0byAKICAgICBiZSBjb25zaXN0ZW50IHdpdGggMS4zLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBDYWNoZSBhcHJfZXhwbG9kZV9sb2NhbHRpbWUoKSB2YWx1ZSBmb3IgMTUgc2Vjb25kcy4KICAgICBbQnJpYW4gUGFuZSA8YnBhbmUgcGFjYmVsbC5uZXQ+XQoKICAqKSBGaXggbW9kX2luY2x1ZGUgdG8gbm90IHJldHVybiBFVGFnIG9yIExhc3QtTW9kaWZpZWQgaGVhZGVycy4KICAgICBbSWFuIEhvbHNtYW4gPGlhbmggY25ldC5jb20+XQoKICAqKSBGaXggd29ya2VyIE1QTSdzIHNjb3JlYm9hcmQgbG9naWMuICBbQWFyb24gQmFubmVydCA8YWFyb24gY2xvdmUub3JnPl0KCiAgKikgRWxpbWluYXRlIHRoZSB3YXN0ZWZ1bCBydW4tdGltZSBjb252ZXJzaW9uIG9mIG1ldGhvZCBuYW1lcyBmcm9tIHN0cmluZ3MgCiAgICAgdG8gbnVtYmVycyBpbiBwbGFjZXMgd2hlcmUgdGhlIG1ldGhvZHMgYXJlIGtub3duIGF0IGNvbXBpbGUgdGltZS4gIAogICAgIFtCcmlhbiBQYW5lIDxicGFuZSBwYWNiZWxsLm5ldD5dCgogICopIFR1cm4gdGhlIHdvcmtlciBNUE0ncyBxdWV1ZSBpbnRvIGEgTElGTy4gIFRoaXMgbWF5CiAgICAgaW1wcm92ZSBjYWNoZS1oaXQgcGVyZm9ybWFuY2UgdW5kZXIgc29tZSBjb25kaXRpb25zLgogICAgIFtBYXJvbiBCYW5uZXJ0IDxhYXJvbiBjbG92ZS5vcmc+XQoKICAqKSBTd2l0Y2ggYmFjayB0byBTSUdVU1IxIGZvciBncmFjZWZ1bCByZXN0YXJ0cyBvbiBhbGwgcGxhdGZvcm1zIHRoYXQKICAgICBzdXBwb3J0IGl0LiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBDbGVhbnVwIHRoZSB3b3JrZXIgTVBNLiAgV2Ugbm8gbG9uZ2VyIHJlLXVzZSB0cmFuc2FjdGlvbgogICAgIHBvb2xzLiAgVGhpcyBpbmN1cnMgbGVzcyBvdmVyaGVhZCB0aGFuIHNodWZmbGluZyB0aGUgcG9vbHMKICAgICBhcm91bmQgc28gdGhhdCB0aGV5IGNhbiBiZSByZS11c2VkLiAgUmVtb3ZlIG9uZSBvZiB0aGUKICAgICBxdWV1ZSdzIGNvbmRpdGlvbiB2YXJpYWJsZXMuICBXZSBqdXN0IHJlZGVmaW5lZCB0aGUgQVBJIHRvCiAgICAgc3RhdGUgdGhhdCB5b3UgY2FuJ3QgdHJ5IHRvIGFkZCBtb3JlIHN0dWZmIHRoYW4geW91IGFsbG9jYXRlZAogICAgIHNlZ21lbnRzIGZvci4gIFtBYXJvbiBCYW5uZXJ0IDxhYXJvbiBjbG92ZS5vcmc+XQoKICAqKSBGaXggU1NMIFZQQVRIIGJ1aWxkcyBbQ29keSBTaGVyciA8Y3NoZXJyIGNvdmFsZW50Lm5ldD5dCgogICopIEZpeGVkIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgd2hlbiBhIHJlcXVlc3QgY29udGFpbnMgYSBib2R5LgogICAgIFtHcmVnIFN0ZWluXQoKICAqKSBtb2RfZGF2IHVzZXMgYSBuZXcgQVBJIHRvIHNwZWFrIHRvIHRoZSBiYWNrZW5kIHByb3ZpZGVyIGZvciBkZWFkCiAgICAgcHJvcGVydHkgbWFuYWdlbWVudC4gW0dyZWcgU3RlaW5dCgogICopIFJlbW92ZSB0aGUgV2luMzIgc2NyaXB0LXByb2Nlc3NpbmcgZXhjZXB0aW9uIGZyb20gbW9kX2NnaSwgYW5kCiAgICAgcm9sbCBidWlsZF9jb21tYW5kX2xpbmUvYnVpbGRfYXJndl9saXN0IGludG8gYSB1bmlmaWVkLCBvdmVycmlkZWFibGUKICAgICBhcF9jZ2lfYnVpbGRfY29tbWFuZCBvcHRpb25hbCBmdW5jdGlvbi4gIFtXaWxsaWFtIFJvd2VdCgogICopIFJld3JpdGUgZmluZF9zdGFydF9zZXF1ZW5jZSB0byB1c2UgYSBiZXR0ZXIgc2VhcmNoIGFsZ29yaXRobQogICAgIHRvIGZpbmQgdGhlIHN0YXJ0IHRhZy4gIFtKdXN0aW4gRXJlbmtyYW50el0KCiAgKikgRml4IGEgc2VnIGZhdWx0IGluIG1vZF9pbmNsdWRlLiAgV2hlbiB3ZSBhcmUgZ2VuZXJhdGluZyBhbgogICAgIGludGVybmFsIHJlZGlyZWN0LCB3ZSBtdXN0IHNldCByLT51cmkgdG8gIiIsIG5vdCBhIGJvZ3VzCiAgICAgc3RyaW5nLCBhbmQgbm90IE5VTEwuICBbUnlhbiBCbG9vbV0KCiAgKikgT3B0aW1pemVkIGxvY2F0aW9uX3dhbGssIHNvIHN1YnJlcXVlc3RzLCByZWRpcmVjdHMgYW5kIHNlY29uZCBwYXNzZXMKICAgICBub3cgcmV1c2UgcHJldmlvdXMgc2VjdGlvbiBtZXJnZXMgb24gYSA8TG9jYXRpb24gPiBieSA8TG9jYXRpb24gPgogICAgIGJhc2lzLCB1bnRpbCB3ZSBtaXNtYXRjaCB3aXRoIHRoZSBvcmlnaW5hbCBsb2NhdGlvbl93YWxrLiAKICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBCYWNrIG91dCB0aGUgMS40NSBjaGFuZ2UgdG8gdXRpbF9zY3JpcHQuYy4gIFRoaXMgY2hhbmdlIG1hZGUKICAgICB1cyBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFJFUVVFU1RfVVJJIHRvIHRoZSByZWRpcmVjdGVkCiAgICAgVVJJLCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbGx5IHJlcXVlc3RlZCBVUkkuCiAgICAgW1Rha2V0byBLYWJlIDxrYWJlIHNyYS10b2hva3UuY28uanA+XQoKICAqKSBNYWtlIG1vZF9pbmNsdWRlIGRvIGxhenkgZXZhbHVhdGlvbiBvZiBwb3RlbnRpYWxseSBleHBlbnNpdmUgdG8KICAgICBjb21wdXRlIHZhcmlhYmxlcy4gIFtCcmlhbiBQYW5lIDxicGFuZSBwYWNiZWxsLm5ldD5dCgogICopIEZpeCBsb2dnaW5nIG9mIGJ5dGVzIHNlbnQgZm9yIEhFQUQgcmVxdWVzdHMuICAlYiBhbmQgJUIgc2hvdWxkCiAgICAgbG9nIGVpdGhlciAtIG9yIDAsIGJlZm9yZSB0aGlzIHBhdGNoLCB0aGV5IHdlcmUgYm90aCBsb2dnaW5nCiAgICAgdGhlIGZpbGUgc2l6ZS4gIFtUYWtldG8gS2FiZSA8a2FiZSBzcmEtdG9ob2t1LmNvLmpwPl0KCiAgKikgTWFrZSBtb2RfaW5jbHVkZSBjaGVjayBmb3IgQllURV9DSEVDS19USFJFU0hPTEQgcGVyIGJ1Y2tldCByYXRoZXIgCiAgICAgdGhhbiBwZXIgY2hhcmFjdGVyLiAgW0JyaWFuIFBhbmUgPGJwYW5lIHBhY2JlbGwubmV0Pl0KCiAgKikgTm9ybWFsaXplIHRoZSBwcmltYXJ5IHJlcXVlc3QsIHJlZGlyZWN0cyBhbmQgc3ViLXJlcXVlc3RzIHRvCiAgICAgcnVuIHRoZSBzYW1lIGFwX3Byb2Nlc3NfcmVxdWVzdF9pbnRlcm5hbCBmb3IgY29uc2lzdGVuY3kgaW4KICAgICByb2J1c3RuZXNzLCBiZWhhdmlvciBhbmQgc2VjdXJpdHkuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBGaXggYSBzZWdmYXVsdCB3aXRoIG1vZF9pbmNsdWRlIHdoZW4gci0+cGF0aF9pbmZvIGlzIG5vdCBzZXQKICAgICAod2hpY2ggaXMgdGhlIGNhc2Ugd2l0aCBtb2RfcHJveHkpLiAgW0lhbiBIb2xzbWFuIDxpYW5oIGNuZXQuY29tPl0KCiAgKikgQWRkIC1YIGZ1bmN0aW9uYWxpdHkgYmFjay4gIFRoaXMgaW5kaWNhdGVzIHRvIGFsbCBNUE1zIGFuZCBhbnkgb3RoZXIKICAgICBwYXJ0IG9mIEFwYWNoZSB0aGF0IGl0IHNob3VsZCBydW4gaW4gImRlYnVnIiBtb2RlLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBTb21lIGluaXRpYWwgc3VwcG9ydCBmb3IgdGhlIGN5Z3dpbiBwbGF0Zm9ybSBbcHJlZm9yayBvbmx5XS4KICAgICBUaGlzIGlzIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIHN1cHBvcnQgZm9yIHRoZSBXaW5OVC9XaW4zMgogICAgIHBsYXRmb3JtLCB3aGljaCBpcyB0aGUgcmVjb21tZW5kZWQgY29uZmlndXJhdGlvbiBmb3IgbmF0aXZlCiAgICAgV2luMzIgdXNlcnMuICBUaGUgY3lnd2luIHBsYXRmb3JtIHN1cHBvcnQgaXMgcmVjb21tZW5kZWQgZm9yCiAgICAgY3lnd2luIHBsYXRmb3JtIHVzZXJzLiBbU3RpcGUgVG9saiA8dG9saiB3YXBtZS1zeXN0ZW1zLmRlPl0KCiAgKikgQ2hhbmdlZCBzeW50YXggb2YgU2V0e0lucHV0fE91dHB1dH1GaWx0ZXIuICBUaGUgbGlzdCBvZiBmaWx0ZXJzCiAgICAgbXVzdCBiZSBzZW1pY29sb24gZGVsaW1pdGVkIChpZiBtb3JlIHRoYW4gb25lIGZpbHRlciBpcyBnaXZlbi4pCiAgICAgVGhlIFNldHtJbnB1dHxPdXRwdXR9RmlsdGVyIGRpcmVjdGl2ZSBub3cgb3ZlcnJpZGVzIGEgcGFyZW50CiAgICAgY29udGFpbmVyJ3MgZGlyZWN0aXZlIChlLmcuIFNldElucHV0RmlsdGVyIGluIDxEaXJlY3RvcnkgL3dlYi9mb28+CiAgICAgd2lsbCBvdmVycmlkZSBhbnkgU2V0SW5wdXRGaWx0ZXIgZGlyZWN0aXZlIGluIDxEaXJlY3RvcnkgL3dlYj4uKQogICAgIFRoaXMgbmV3IHN5bnRheCBpcyBtb3JlIGNvbnNpc3RlbnQgd2l0aCBBZGR7SW5wdXR8T3V0cHV0fUZpbHRlcgogICAgIGRpcmVjdGl2ZXMgZGVmaW5lZCBpbiBtb2RfbWltZS4gIEFsc28gY3VyZXMgYSBidWcgaW4gcHJpb3IgcmVsZWFzZXMKICAgICB3aGVyZSB0aGUgU2V0e0lucHV0fE91dHB1dH1GaWx0ZXIgZGlyZWN0aXZlIHdvdWxkIGNvcnJ1cHQgdGhlIAogICAgIGdsb2JhbCBjb25maWd1cmF0aW9uIGlmIHRoZSBtdWx0aXBsZSBkaXJlY3RpdmVzIHdlcmUgbmVzdGVkLgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIEN1cmVkIHdoYXQncyBhaWxlZCBtaW1lIGZvciBxdWl0ZSBzb21lIHRpbWUuICBJZiBhbiBBZGRTb21ldGhpbmcKICAgICB3YXMgZ2l2ZW4gaW4gdGhlIGNvbmZpZ3VyYXRpb24gKExhbmd1YWdlLCBDaGFyc2V0LCBIYW5kbGVyIG9yCiAgICAgRW5jb2RpbmcpIEFwYWNoZSB3b3VsZCBzZXQgdGhlIGNvbnRlbnQgdHlwZSBhcyBnaXZlbiBieSBBZGRUeXBlLCAKICAgICBidXQgcmVmdXNlZCB0byBjaGVjayB0aGUgbWltZS50eXBlcyBmaWxlIGlmIEFkZFR5cGUgd2Fzbid0IGdpdmVuIAogICAgIGZvciB0aGF0IHNwZWNpZmljIGV4dGVuc2lvbi4gIFNldHRpbmcgdGhlIEFkZEhhbmRsZXIgZm9yIC5odG1sIAogICAgIHdpdGhvdXQgc2V0dGluZyB0aGUgQWRkVHlwZSB0ZXh0L2h0bWwgaHRtbCB3b3VsZCBjYXVzZSBBcGFjaGUgdG8gCiAgICAgdXNlIHRoZSBkZWZhdWx0IGNvbnRlbnQgdHlwZS4gIFtXaWxsaWFtIFJvd2VdCgogICopIEFkZGVkIHNvbWUgYnVsbGV0cHJvb2ZpbmcgdG8gbWVtb3J5IGFsbG9jYXRpb24gaW4gdGhlIExEQVAgY2FjaGUKICAgICBjb2RlLiBbR3JhaGFtIExlZ2dldHRdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4yNQoKICAqKSBNb3ZlIHRoZSBpbnN0YWxsZWQgL21hbnVhbCBkaXJlY3Rvcnkgb3V0IG9mIHRoZSAvaHRkb2NzLyB0cmVlLCBzbwogICAgIHRoYXQgaXQgY2FuIGJlIGtlcHQgbW9yZSBpbmRlcGVuZGVudGx5IGZyb20gdGhlIHJlbWFpbmluZyBkb2N1bWVudAogICAgIHJvb3QuIFRoZSAiQWxpYXMgL21hbnVhbCAuLi4iIGFscmVhZHkgYWxsb3dlZCBmb3IgZWFzeSBwcm9qZWN0aW9uCiAgICAgaW50byBleGlzdGluZyBwcml2YXRlIGRvY3VtZW50IHRyZWVzLiBbTWFydGluIEtyYWVtZXJdCgogICopIEFkZCBzcGVjaWZpZWQgdXNlciBhdHRyaWJ1dGVzIHRvIHRoZSBlbnZpcm9ubWVudCB3aGVuIHVzaW5nCiAgICAgbW9kX2F1dGhfbGRhcC4gVGhpcyBhbGxvd3MgeW91IHRvIHVzZSBtb2RfaW5jbHVkZSB0byBlbWJlZCBzcGVjaWZpZWQKICAgICB1c2VyIGF0dHJpYnV0ZXMgaW4gYSBwYWdlIGxpa2Ugc286CiAgICAgSGVsbG8gPCEtLSNlY2hvIHZhcj0iQVVUSEVOVElDQVRFX0NOIi0tPiwgaG93IGFyZSB5b3U/CiAgICAgW0dyYWhhbSBMZWdnZXR0XQoKICAqKSBGaXggYSBwZXJmb3JtYW5jZSBwcm9ibGVtIHdpdGggdGhlIHdvcmtlciBNUE0uICBXZSBub3cgY3JlYXRlCiAgICAgdHJhbnNhY3Rpb24gcG9vbHMgb25jZSwgYW5kIHJlLXVzZSB0aGVtIGZvciBlYWNoIGNvbm5lY3Rpb24uCiAgICAgW0Fhcm9uIEJhbm5lcnQgPGFhcm9uIGNsb3ZlLm9yZz5dCgogICopIE1vZGZpZWQgbW9kX21pbWUgdG8gcHJldmVudCBtb2RfbmVnb3RhdGlvbiBmcm9tIHNlcnZpbmcgYSBtdWx0aXZpZXcKICAgICBvZiBhICdoYW5kbGVyJyBvciAnZmlsdGVyJywgc28gdGhhdCBhbnkgZmlsZW5hbWUgZXh0ZW5zaW9uIHRoYXQgZG9lcyAKICAgICBub3QgY29udHJpYnV0ZSB0byB0aGUgbmVnb3RpYXRlZCBtZXRhZGF0YSBjYW4ndCBiZSBzZXJ2ZWQgd2l0aG91dAogICAgIGFuIGV4cGxpY2l0IHJlcXVlc3QuICBFLmcuLCBpZiB0aGUgLlogZXh0ZW5zaW9uIGlzIGFzc29jaWF0ZWQgd2l0aAogICAgIGFuIHVuemlwIGZpbHRlciwgdGhlIHVzZXIgcmVxdWVzdCBzb21lZmlsZS5aLmh0bWwsIG1vZF9uZWdvdGlhdGlvbgogICAgIHdvbid0IHNlcnZlIGl0LiAgSXQgY2FuIHNlcnZlIHNvbWVmaWxlLlouaHRtbCB3aGVuIHNvbWVmaWxlLlogaXMKICAgICByZXF1ZXN0ZWQsIHNpbmNlIHRoZSAuWiBleHRlbnNpb24gaXMgZXhwbGljdGx5IHJlcXVlc3RlZCwgaWYgdGhlCiAgICAgLmh0bWwgZXh0ZW5zaW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBDb250ZW50VHlwZSB0ZXh0L2h0bWwuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgSW50cm9kdWNlIHRoZSBBZGRJbnB1dEZpbHRlciBmaWx0ZXJbO2ZpbHRlci4uLl0gZXh0IFtleHQuLi5dCiAgICAgYW5kIGNvcnJlc3BvbmRpbmcgQWRkT3V0cHV0RmlsdGVyIHN5bnRheCwgdG8gaW5zZXJ0IG9uZSBvciBtb3JlIAogICAgIGZpbHRlcnMgYnkgbW9kX21pbWUgZmlsZW5hbWUgZXh0ZW5zaW9uIHByb2Nlc3NpbmcuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRml4IGEgZ3Jvd2luZyBjb25uZWN0aW9uIHBvb2wgaW4gY29yZV9vdXRwdXRfZmlsdGVyKCkgZm9yIAogICAgIGtlZXBhbGl2ZSByZXF1ZXN0cy4gIFtKZWZmIFRyYXdpY2tdCgogICopIE1vdmVkIHNwbGl0X2FuZF9wYXNzX3ByZXRhZ19idWNrZXRzIGJhY2sgdG8gYmVpbmcgYQogICAgIG1hY3JvIGF0IFJ5YW5zJ3MgcmVxdWVzdC4gUmVtb3ZlZCB0aGUgcmV0dXJuIGZyb20gaXQKICAgICBieSBzZXR0aW5nIGFuZCByZXR1cm5pbmcgYSByZXR1cm4gY29kZSBpbnN0ZWFkLiBVcGRhdGVkCiAgICAgdGhlIGNvZGUgdG8gY2hlY2sgdGhlIHJldHVybiBjb2RlIGZyb20gdGhlIG1hY3JvIGFuZAogICAgIGRvIHRoZSByaWdodCB0aGluZy4gW1BhdWwgSi4gUmVkZXJdCgogICopIEZpeCBhIHNlZ2ZhdWx0IHdoZW4gYSBudW1lcmljIHZhbHVlIHdhcyByZWNlaXZlZCBmb3IgSG9zdDouCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgQWRkIGEgZnVuY3Rpb24gYXBfcmVtb3ZlX2lucHV0X2ZpbHRlci4gIFRoaXMgaXMgdG8gbWF0Y2gKICAgICB1cCB3aXRoIGFwX3JlbW92ZV9vdXRwdXRfZmlsdGVyLiAgW1J5YW4gQmxvb21dCgogICopIENsZWFuIHVwIGxvY2F0aW9uX3dhbGssIHNvIHRoYXQgdGhpcyBzdGVwIHBlcmZvcm1zIGEgbWluaW11bQogICAgIGFtb3VudCBvZiByZWR1bmRhbnQgZWZmb3J0IChpdCBtdXN0IGJlIHJ1biB0d2ljZSwgYnV0IGl0IHdpbGwgbm8KICAgICBsb25nZXIgcmVwYXJzZSBhbGwgPExvY2F0aW9uID4gYmxvY2tzIHdoZW4gdGhlIHJlcXVlc3QgdXJpCiAgICAgaGFkbid0IGNoYW5nZWQuKSAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRWxpbWluYXRlIHByb3h5OiAoYW5kIGFsbCBvdGhlciAnc3BlY2lhbCcpIHByb2Nlc3NpbmcgZnJvbSB0aGUKICAgICBhcF9kaXJlY3Rvcnlfd2FsaygpIHBoYXNlLiAgTW9kdWxlcyB0aGF0IHdhbnQgdG8gdXNlIHNwZWNpYWwKICAgICB3YWxrIGxvZ2ljIHNob3VsZCByZWZlciB0byB0aGUgbW9kX3Byb3h5IG1hcF90b19sb2NhdGlvbiBleGFtcGxlLAogICAgIHdpdGggaXQncyBwcm94eV93YWxrIGFuZCBwcm94eXNlY3Rpb24gaW1wbGVtZW50YXRpb24uICBUaGlzIG1ha2VzCiAgICAgZWl0aGVyIGRpcmVjdG9yeV93YWxrIGZsYXZvciBtdWNoIG1vcmUgbGVnaWJsZSwgc2luY2UgdGhhdCBwaGFzZQogICAgIG9ubHkgcnVucyBhZ2FpbnN0IHJlYWwgPERpcmVjdG9yeSA+IGJsb2Nrcy4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBTRUNVUklUWTogRml4IGEgc2VjdXJpdHkgcHJvYmxlbSBpbiBtb2RfaW5jbHVkZSB3aGljaCB3b3VsZCBhbGxvdwogICAgIGFuIFNTSSBkb2N1bWVudCB0byBiZSBwYXNzZWQgdG8gdGhlIGNsaWVudCB1bnBhcnNlZC4KICAgICBbQ2xpZmYgV29vbGxleSwgQnJpYW4gUGFuZV0KCiAgKikgSW50cm9kdWNlIHRoZSBtYXBfdG9fc3RvcmFnZSBob29rLCB3aGljaCBhbGxvd3MgbW9kdWxlcyB0byBieXBhc3MKICAgICB0aGUgZGlyZWN0b3J5X3dhbGsgYW5kIGZpbGVfd2FsayBmb3Igbm9uLWZpbGUgcmVxdWVzdHMuICBUUkFDRQogICAgIHNob3J0Y3V0IG1vdmVkIHRvIGh0dHBfcHJvdG9jb2wuYyBhcyBBUFJfSE9PS19NSURETEUsIGFuZCB0aGUKICAgICBkaXJlY3Rvcnlfd2Fsay9maWxlX3dhbGsgaGFwcGVuIGFzIEFQUl9IT09LX1ZFUllfTEFTVCBpbiBjb3JlLmMuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQWRkIHRoZSBhYmlsaXR5IGZvciBtb2RfaW5jbHVkZSB0byBhZGQgdGhlIElOQ0xVREVTIGZpbHRlcgogICAgIGlmIHRoZSBmaWxlIGlzIGNvbmZpZ3VyZWQgZm9yIHRoZSBzZXJ2ZXItcGFyc2VkIGhhbmRsZXIuCiAgICAgVGhpcyBtYWtlcyB0aGUgY29uZmlndXJhdGlvbiBmb3IgLnNodG1sIGZpbGVzIG11Y2ggZWFzaWVyCiAgICAgdG8gdW5kZXJzdGFuZCwgYW5kIGFsbG93cyBtb2RfaW5jbHVkZSB0byBob25vciBBcGFjaGUgMS4zCiAgICAgY29uZmlnIGZpbGVzLiAgIEJhc2VkIG9uIERvdWcgTWFjRWFjaGVybidzIHBhdGNoIHRvIFBIUAogICAgIHRvIGRvIHRoZSBzYW1lIHRoaW5nLiAgW1J5YW4gQmxvb21dCgogICopIGZvcmNlIE9wZW5TU0wgdG8gaWdub3JlIHByb2Nlc3MgbG9jYWwtY2FjaGluZyBhbmQgdG8gYWx3YXlzCiAgICAgZ2V0L3NldC9kZWxldGUgc2Vzc2lvbnMgdXNpbmcgbW9kX3NzbCdzIGNhbGxiYWNrcwogICAgIFtNYWRodXN1ZGFuIE1hdGhpaGFsbGkgPG1hZGh1c3VkYW5fbWF0aGloYWxsaSBocC5jb20+LAogICAgICBHZW9mZiBUaG9ycGUgPGdlb2ZmIGdlb2ZmdGhvcnBlLm5ldD5dCgogICopIE1ha2UgdGhlIHdvcmtlciBNUE0gc2h1dGRvd24gYW5kIHJlc3RhcnQgY2xlYW5seS4gIFRoaXMgYWxzbwogICAgIGNsZWFucyB1cCBzb21lIHJhY2UgY29uZGl0aW9ucywgYW5kIGdldHMgdGhlIHdvcmtlciB1c2luZwogICAgIHBvb2xzIG1vcmUgY2xlYW5seS4gIFtBYXJvbiBCYW5uZXJ0IDxhYXJvbiBjbG92ZS5vcmc+XQoKICAqKSBJbXBsZW1lbnQgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKCkgaW4gdGVybXMgb2YgYXByX2xvY2sKICAgICBmb3IgbW9kX3NzbAogICAgIFtNYWRodXN1ZGFuIE1hdGhpaGFsbGkgPG1hZGh1c3VkYW5fbWF0aGloYWxsaSBocC5jb20+XQoKICAqKSBGaXggZm9yIG1vZF9pbmNsdWRlLiBSeWFuJ3MgcGF0Y2ggdG8gY2hlY2sgZXJyb3IKICAgICBjb2RlcyBwdXQgYSByZXR1cm4gaW4gdGhlIHdyb25nIHBsYWNlLiBBbHNvLCB0aGUKICAgICBpbmNsdWRlIGhhbmRsZXIgcmV0dXJuIGNvZGUgd2Fzbid0IGJlaW5nIGNoZWNrZWQuCiAgICAgSSBkb24ndCBsaWtlIG1hY3JvcyB3aXRoIHJldHVybnMsIHNvIEkgY29udmVydGVkCiAgICAgU1BMSVRfQU5EX1BBU1NfUFJFVEFHX0JVQ0tFVFMgaW50byBhIGZ1bmN0aW9uLgogICAgIFtQYXVsIEouIFJlZGVyIDxyZWRlcnBqIHJhbGVpZ2guaWJtLmNvbT5dCgogICopIGZpeCBzZWd2IGluIG1vZF9taW1lIGlmIG5vIEFkZFR5cGVzIGFyZSBjb25maWd1cmVkCiAgICAgW0pvaG4gU3RlcmxpbmcgPHN0ZXJsaW5nIGNvdmFsZW50Lm5ldD5dCgogICopIEVuYWJsZSBzc2wgY2xpZW50IGF1dGhlbnRpY2F0aW9uIGF0IFNTTF9hY2NlcHQgdGltZQogICAgIFtNYWRodXN1ZGFuIE1hdGhpaGFsbGkgPG1hZGh1c3VkYW5fbWF0aGloYWxsaSBocC5jb20+XQoKICAqKSBGaXggYSBzZWdmYXVsdCBpbiBtb2RfaW5jbHVkZSB3aGVuIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGhhcyBubwogICAgIGFzc29jaWF0ZWQgZmlsZW5hbWUgKGUuZy4sIHdlJ3JlIGZpbHRlcmluZyB0aGUgZXJyb3IgZG9jdW1lbnQgZm9yCiAgICAgYSBiYWQgVVJJKS4gIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBhIHN0b3JhZ2UgbGVhayAoYSBzdHJkdXAoKSBjYWxsKSBpbiBtb2RfbWltZV9tYWdpYy4gIFtKZWZmIFRyYXdpY2tdCgogICopIFRoZSBwcmVmb3JrIGFuZCBPUy8yIE1QTXMgYXJlIG92ZXJ3cml0aW5nIHRoZSBwaWQgZmlsZSB3aGVuIGEgc2Vjb25kIGNvcHkKICAgICBvZiBodHRwZCBpcyBzdGFydGVkIGFuZCBzaHV0cyBkb3duIGR1ZSB0byBzb2NrZXQgY29uZmxpY3QuIE1vdmluZyB0aGUKICAgICBjYWxsIHRvIGFwX2xvZ19waWQgc29sdmVzIHRoZSBwcm9ibGVtLgoKICAqKSBDaGFuZ2VkIHRoZSBsYXRlLTEuMyBsb2dfY29uZmlnIHN1YnN0aXR1dGlvbiAlYyB0byAlWCwgdG8gbG9nIHRoZQogICAgIHN0YXR1cyBvZiB0aGUgY2xvc2VkIGNvbm5lY3Rpb24sIGFzIGl0IGNvbmZsaWN0cyB3aXRoIHRoZSBmYXIgbW9yZQogICAgIGNvbW1vbiwgaGlzdG9yaWNhbCBzc2wgbG9nZ2luZyBkaXJlY3RpdmUgJS4uLnt2YXJ9Yy4gIFtXaWxsaWFtIFJvd2VdCgogICopIEFkZGVkIHRoZSBjb21tb24gZXJyb3IvIHRyZWUgdG8gdGhlIGJ1aWxkL2luc3RhbGwgdGFyZ2V0cyAKICAgICAoc2ltaWxhciB0byB0aGUgY29tbW9uIGljb25zLyB0cmVlKSBmb3IgdGhlIG11bHRpLWxhbmd1YWdlIGVycm9yIAogICAgIG1lc3NhZ2VzIHRoYXQgTGFycyBjb21taXR0ZWQgZWFybGllci4gIFtXaWxsaWFtIFJvd2VdCgogICopIEFkZGVkIGEgbXVsdGkgcHJvY2VzcywgbXVsdGkgdGhyZWFkZWQgT1MvMiBNUE0gbXBtdF9vczIuICBbQnJpYW4gSGF2YXJkXQoKICAqKSBBZGRlZCBhIGRlZmF1bHQgY29tbWVudGVkLW91dCBtb2RfbGRhcCBhbmQgbW9kX2F1dGhfbGRhcAogICAgIGNvbmZpZ3VyYXRpb24gdG8gaHR0cGQtc3RkLmNvbmYgYW5kIGh0dHBkLXdpbi5jb25mCiAgICAgW0dyYWhhbSBMZWdnZXR0XQoKICAqKSBBZGRlZCBkb2N1bWVudGF0aW9uIGZvciBtb2RfbGRhcCBhbmQgbW9kX2F1dGhfbGRhcC4KICAgICBbR3JhaGFtIExlZ2dldHRdCgogICopIEVuYWJsZWQgbmVnYXRpdmUgY2FjaGluZyBvbiBhdHRyaWJ1dGUgY29tcGFyaXNvbnMgaW4gdGhlIExEQVAgY2FjaGUuCiAgICAgRml4ZWQgYSBwcm9ibGVtIHdoZXJlIHRoZSBkZWZhdWx0IGNhY2hlIFRUTCB3YXMgc2V0IGluIG1pbGxpc2Vjb25kcwogICAgIG5vdCBtaWNyb3NlY29uZHMgY2F1c2luZyB0aGUgY2FjaGUgdG8gdGltZSBvdXQgYWxtb3N0IGltbWVkaWF0ZWx5LgogICAgIFtHcmFoYW0gTGVnZ2V0dF0KCiAgKikgRml4ZWQgYWxsIHRoZSAjaWYgQVBSX0hBU19TSEFSRURfTUVNT1JZIGNoZWNrcyB3aXRoaW4gdGhlIExEQVAKICAgICBtb2R1bGUgY29kZSB0byBmb2xsb3cgQVBSLiBbR3JhaGFtIExlZ2dldHRdCgogICopIEZpeGVkIExEQVAgY2xlYW51cCBvbiBncmFjZWZ1bCByZXN0YXJ0cy4gTERBUCBjb25uZWN0aW9ucyBhcmUgbm93CiAgICAgY2xlYW5lZCB1cCB3aGVuIHRoZSBjb25uZWN0aW9uIHBvb2wgcG9vbCBpcyBjbGVhbmVkIHVwLgogICAgIFtHcmFoYW0gTGVnZ2V0dF0KCiAgKikgRml4IGEgbWlub3IgaXNzdWUgd2l0aCBKZWZmIFRyYXdpY2sncyBtb2RfaW5jbHVkZQogICAgIHBhdGNoLiBXaXRob3V0IHRoaXMgcGF0Y2gsIHRoZSBjb2RlIHdpbGwganVzdCBhbGxvY2F0ZQogICAgIG1vcmUgYnl0ZXMgaW4gZ2V0X2NvbWJpbmVkX2RpcmVjdGl2ZSB0aGFuIGFyZSBuZWVkZWQuCiAgICAgW1BhdWwgUmVkZXJdCgogICopIEFkZGVkIHRoZSBMREFQIGF1dGhlbnRpY2F0aW9uIG1vZHVsZSBtb2RfYXV0aF9sZGFwLgogICAgIFtEYXZlIENhcnJpZ2FuIDxkYXZlIHJ1ZGVkb2cub3JnPiwgR3JhaGFtIExlZ2dldHRdCgogICopIEFkZGVkIHRoZSBMREFQIGNhY2hlIGFuZCBjb25uZWN0aW9uIHBvb2xpbmcgbW9kdWxlIG1vZF9sZGFwLgogICAgIFtEYXZlIENhcnJpZ2FuIDxkYXZlIHJ1ZGVkb2cub3JnPiwgR3JhaGFtIExlZ2dldHRdCgogICopIEZpeCAtLWVuYWJsZS1tb2R1bGVzPWFsbCBicmVha2FnZSB3aXRoIG1vZF9hdXRoX2RiIGFuZCBtb2RfYXV0aF9kaWdlc3QKICAgICBieSBhbGxvd2luZyBhIG1vZHVsZSB0byBkaXNhYmxlIGl0c2VsZiBpZiBpdHMgcHJlcmVxdWlzaXRlcyBhcmUgbm90CiAgICAgbWV0LiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMjQKCiAgKikgRml4IGEgY291cGxlIG9mIGlzc3VlcyBpbiBtb2RfaW5jbHVkZSB3aGVuIHRoZSB0YWcgYXBwZWFyZWQgYXQKICAgICBvZmZzZXRzIG5lYXIgODE5MiBpbiB0aGUgZmlsZSBiZWluZyBwYXJzZWQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggYW4gYXNzZXJ0aW9uIGZhaWx1cmUgaW4gbW9kX3NzbCB3aGVuIHRoZSBrZWVwYWxpdmUgdGltZW91dCBpcyAgCiAgICAgcmVhY2hlZC4gIFtKZWZmIFRyYXdpY2tdCgogICopIE51bWVyb3VzIGltcHJvdmVtZW50cyB0byB0aGUgV2luMzIgYnVpbGQgc3lzdGVtLiAgSW50cm9kdWNlZCBjb21tYW5kIGxpbmUKICAgICBidWlsZHMgd2l0aG91dCByZXF1aXJpbmcgLm1hayBmaWxlcyBmb3IgTVNWQyA2LjAgYW5kIGxhdGVyIHZlcnNpb25zLgogICAgIEltcHJvdmVkIC5kc3AgZmlsZSBjb21wYXRpYmlsaXR5IGZvciBib3RoIFZpc3VhbCBTdHVkaW8gNS4wIGFuZCA2LjAgdXNlcnMuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQXNzb3J0ZWQgY29ycmVjdGlvbnMgYW5kIGltcHJvdmVtZW50cyB0byB0aGUgd2lubnRfbXBtIHN0YXJ0dXAgY29kZS4gIEJldHRlcgogICAgIHJlcG9ydGluZyBvZiB1bmluc3RhbGxlZCBzZXJ2aWNlcyBhbmQgb3RoZXIgZXJyb3IgY29uZGl0aW9ucywgYW5kIGNoYW5nZWQgdGhlIAogICAgIGRlZmF1bHQgc2VydmljZSBuYW1lIHRvIEFwYWNoZTIuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBOdW1lcm91cyBpbXByb3ZlbWVudHMgdG8gdGhlIFdpbjMyIEFwYWNoZU1vbml0b3IgdXRpbGl0eSwgaW5jbHVkaW5nIHdpbm50X21wbSAKICAgICBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgQXBhY2hlIDEuMyBXaW4zMiBBcGFjaGUgbWFuYWdlbWVudCB1dGlsaXRlcy4gIAogICAgIFtNbGFkZW4gVHVyayA8bXR1cmsgbWFwcGluZ3NvZnQuY29tPiwgV2lsbGlhbSBSb3dlXQoKICAqKSBGaXhlZCB0aGUgc2VnZmF1bHRzIGluIG1vZF9taW1lIGludHJvZHVjZWQgYnkgaGFzaCB0YWJsZXMgaW4gMi4wLjIwLgogICAgIFtXaWxsaWFtIFJvd2UsIEdyZWcgQW1lc10KCiAgKikgUm91bmRlZCBvdXQgdGhlIG1vZF9taW1lIEFkZC9SZW1vdmUgcGFpcnMgYnkgYWRkaW5nIFJlbW92ZUxhbmd1YWdlCiAgICAgYW5kIFJlbW92ZUNoYXJzZXQgZGlyZWN0aXZlcy4gIFtXaWxsaWFtIFJvd2VdCgogICopIFRoZSBVbml4IE1QTXMgb3RoZXIgdGhhbiBwZXJjaGlsZCBub3cgYWxsb3cgY2hpbGQgc2VydmVyIAogICAgIHByb2Nlc3NlcyB0byB1c2UgdGhlIGFjY2VwdCBtdXRleCB3aGVuIHN0YXJ0aW5nIGFzIHJvb3QgYW5kIAogICAgIHVzaW5nIFN5c1Ygc2VtcyBmb3IgdGhlIGFjY2VwdCBtdXRleC4gIFByZXZpb3VzbHksIHRoaXMgCiAgICAgY29tYmluYXRpb24gd291bGQgbGVhZCB0byBmYXRhbCBlcnJvcnMgaW4gdGhlIGNoaWxkIHNlcnZlciAKICAgICBwcm9jZXNzZXMuICBwZXJjaGlsZCBjYW4ndCB1c2UgU3lzViBzZW1zIGJlY2F1c2Ugb2Ygc2VjdXJpdHkKICAgICBpc3N1ZXMuICBbSmVmZiBUcmF3aWNrLCBHcmVnIEFtZXNdCgogICopIEFkZGVkIFdpbjMyIHJldmlzaW9uIHN0YW1wIHJlc291cmNlcyB0byBhbGwgaHR0cCBiaW5hcmllcwogICAgIChpbmNsdWRpbmcgbW9kdWxlcy8gYW5kIHN1cHBvcnQvIHRvb2xzLikgIFBSNzMyMiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRml4IGFwX3J2cHJpbnRmIHRvIHN1cHBvcnQgbW9yZSB0aGFuIDRLIG9mIGRhdGEgYXQgb25lIHRpbWUuCiAgICAgW0NvZHkgU2hlcnIgPGNzaGVyciBjb3ZhbGVudC5uZXQ+XQoKICAqKSBXZSBoYXZlIGFsd2F5cyB1c2VkIHRoZSBvYnNvbGV0ZS9kZXByZWNhdGVkIE5ldHNjYXBlIHN5bnRheAogICAgIGZvciBvdXIgdHJhY2tpbmcgY29va2llczsgbm93IHRoZSBDb29raWVTdHlsZSBkaXJlY3RpdmUKICAgICBhbGxvd3MgdGhlIFdlYm1hc3RlciB0byBjaG9vc2UgdGhlIE5ldHNjYXBlLCBSRkMyMTA5LCBvcgogICAgIFJGQzI5NjUgZm9ybWF0LiAgVGhlIG5ldyBDb29raWVEb21haW4gZGlyZWN0aXZlIGFsbG93cyB0aGUKICAgICBzZXR0aW5nIG9mIHRoZSBjb29raWUncyBEb21haW49IGF0dHJpYnV0ZSwgdG9vLiAgUFIgI3MgNTAwNiwKICAgICA1MDIzLCA1OTIwLCA2MTQwIFtLZW4gQ29hcl0KCiAgKikgVHdlYWsgc2VydmVyL01ha2VmaWxlIHNvIHRoYXQgdGhlIHJ1bGVzIGZvciBnZW5lcmF0aW5nIGV4cG9ydHMuYwogICAgIGFyZSBjb21wYXRpYmxlIHdpdGggbWFrZSB1dGlsaXRpZXMgd2hpY2ggZG9uJ3QgZXhwYW5kIHdpbGRjYXJkcwogICAgIGluIGEgZGVwZW5kZW5jeSBsaXN0IChlLmcuLCBPUy8zOTAgbWFrZSwgY2VydGFpbiBsZXZlbHMgb2YgR05VCiAgICAgbWFrZSkuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBJbnN0YWxsIHRoZSBTU0wgaGVhZGVycy4gIFtKb2huIFN0ZXJsaW5nIDxzdGVybGluZyBjb3ZhbGVudC5uZXQ+XQoKICAqKSBCZWdpbiB0byBzYW5pdGl6ZSB0aGUgTVBNIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4gIE5vdywgYWxsCiAgICAgTVBNcyB1c2UgdGhlIHNhbWUgZnVuY3Rpb25zIGZvciBhbGwgY29tbW9uIE1QTSBkaXJlY3RpdmVzLiAgVGhpcwogICAgIHNob3VsZCBtYWtlIGl0IGVhc2llciB0byBjYXRjaCBhbGwgYnVncyBpbiB0aGVzZSBkaXJlY3RpdmVzIG9uY2UuCiAgICAgW0NvZHkgU2hlcnIgPGNzaGVyciBjb3ZhbGVudC5uZXQ+XQoKICAqKSBDbG9zZSBhIG1ham9yIHJlc291cmNlIGxlYWsuICBFdmVyeSB0aW1lIHdlIGhhZCBpc3N1ZWQgYQogICAgIGdyYWNlZnVsIHJlc3RhcnQsIHdlIGxlYWtlZCBhIHNvY2tldCBkZXNjcmlwdG9yLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBGaXggYSBwcm9ibGVtIHdpdGggdGhlIG5ldyBtZXRob2QgY29kZS4gIFdlIG5lZWQgdG8gY2FzdAogICAgIHRoZSAxIHRvIGFuIGFwcl9pbnQ2NF90IG9yIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIDMyLWJpdAogICAgIGludGVnZXIsIGFuZCBpdCB3aWxsIHdyYXAgYWZ0ZXIgYmVpbmcgc2hpZnRlZCAzMiB0aW1lcy4KICAgICBbQ29keSBTaGVyciA8Y3NoZXJyIGNvdmFsZW50Lm5ldD4gYW5kIFJ5YW4gTW9yZ2FuIDxybW9yZ2FuIGNvdmFsZW50Lm5ldD5dCgogICopIEZpeCBhIGJ1ZyBpbiBtb2RfZXhwaXJlcy4gIFByZXZpb3VzIHRvIHRoaXMgcGF0Y2gsIGlmIHlvdQogICAgIHRvbGQgbW9kX2V4cGlyZXMgdG8gYWRkIDYwNDgwMCBzZWNvbmRzIHRvIHRoZSBsYXN0LW1vZGlmaWVkCiAgICAgdGltZSwgaXQgYWN0dWFsbHkgYWRkZWQgNjA0ODAwIHVzZWMncyB0byB0aGUgbGFzdC1tb2RpZmllZCB0aW1lLAogICAgIHNvIHRoYXQgd2hlbiBsb29raW5nIGF0IHRoZSByZXNwb25zZSBpdCBsb29rZWQgbGlrZSBub3RoaW5nCiAgICAgaGFkIGJlZW4gZG9uZS4gIFRoZSByb290IG9mIHRoZSBwcm9ibGVtIHdhcyB0aGF0IHdlIGFsd2F5cyBjb21wdXRlCiAgICAgdGltZSBpbiB1c2VjJ3MsIGJ1dCB3ZSBhc2sgdXNlcnMgdG8gaW5wdXQgc2VjJ3MuICBUaGlzIG1lYW5zIHdlCiAgICAgbmVlZCB0byBjb252ZXJ0IHRvIHVzZWMncyBiZWZvcmUgdXNpbmcgdGhvc2UgdmFsdWVzLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBUaGUgd29ya2VyIE1QTSBub3cgaGFuZGxlcyBzaHV0ZG93biBhbmQgcmVzdGFydCByZXF1ZXN0cy4gIEl0CiAgICAgZGVmaW5pdGVseSBpc24ndCBwZXJmZWN0LCBidXQgd2UgZG8gc3RvcCB0aGUgc2VydmVycyBjb3JyZWN0bHkuCiAgICAgVGhlIGJpZ2dlc3QgcHJvYmxlbSByaWdodCBub3cgaXMgdGhhdCBTSUdIVVAgY2F1c2VzIHRoZSBzZXJ2ZXIgdG8KICAgICBqdXN0IGRpZS4gIFtSeWFuIEJsb29tXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMjMKCiAgKikgVXNlIHRoZSBwcmVmb3JrIE1QTSBieSBkZWZhdWx0IG9uIFVuaXguICBbdmFyaW91c10KCiAgKikgQWRkZWQgYSBzeXN0cmF5IGljb24gbW9uaXRvciBhcHBsaWNhdGlvbiBmb3IgV2luMzIuCiAgICAgW01sYWRlbiBUdXJrIDxtdHVyayBtYXBwaW5nc29mdC5jb20+XQoKICAqKSBtb2RfcmV3cml0ZTogRml4IHRoZSBsaW5lIGVuZGluZyBvbiBzb21lIG5vbi1Vbml4IHN5c3RlbXMgZm9yIAogICAgIG1lc3NhZ2VzIHdyaXR0ZW4gdG8gdGhlIHJld3JpdGUgbG9nLiAgCiAgICAgW1JpY2hhcmQgTGFiZW5uZXR0IDxybGFiZW5uIHVzLmlibS5jb20+XQoKICAqKSBBbGwgbW9kX2F1dG9pbmRleCBxdWVyeSBwYXJzaW5nIGlzIG5vdyBxdWlldGx5IHF1YXNoZWQgd2l0aCB0aGUgCiAgICAgSW5kZXhPcHRpb24gSWdub3JlQ2xpZW50LiAgVGhlIEluZGV4T3B0aW9uIFN1cHByZXNzQ29sdW1uU29ydGluZyAKICAgICBzdGlsbCBkcm9wcyB0aGUgY29sdW1uIHNvcnQgPGEgaHJlZj4ncyBmb3IgdGhlIGNvbHVtbiBoZWFkZXJzLCBidXQgCiAgICAgSWdub3JlQ2xpZW50IGlzIHJlcXVpcmVkIHRvIGlnbm9yZSB0aGVzZSBRdWVyeSBvcHRpb25zIGVudGlyZWx5LiAgCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgSW50cm9kdWNlZCBuZXcgbW9kX2F1dG9pbmRleCBxdWVyeSBhcmd1bWVudCBwYXJzaW5nIGZvciBGPVswfDF8Ml0KICAgICB0byBhbGxvdyB0aGUgY2xpZW50IHRvIHNlbGVjdCBwbGFpbiwgRmFuY3lJbmRleGluZyBvciBIVE1MVGFibGUKICAgICBmb3JtYXR0aW5nLCBWPVswfDFdIHRvIGluaGliaXQgb3IgZW5hYmxlIHZlcnNpb24gc29ydGluZywgYW5kIAogICAgIFA9cGF0dGVybiB0byByZXR1cm4gb25seSBzcGVjaWZpYyBmaWxlcy4gIFRoZSBvbGQgUXVlcnkgQXJndW1lbnRzCiAgICAgd2VyZSByZW9yZ2FuaXplZCBhcyBDPWYgZm9yIHNvcnRpbmcgY29sdW1uICdmJyAoc2FtZSBOLCBELCBTLCBvciBNCiAgICAgYXMgYmVmb3JlKSwgYW5kIE89QXxEIGZvciBvcmRlcmluZyBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZy4gIAogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIEZpeGVkIGFuIGVycm9yIGluIG1vZF9pbmNsdWRlJ3MgZGlyZWN0aXZlIHBhcnNpbmcgcm91dGluZXMgd2hpY2gKICAgICBjYXVzZWQgI2lmLCAjZWxpZiwgYW5kICNlbHNlIGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgYmFja3NsYXNoZXMKICAgICB0byBiZSBpbXByb3Blcmx5IGV2YWx1YXRlZC4gIFtDbGlmZiBXb29sbGV5XQoKICAqKSBJbnRyb2R1Y2VkIG5ldyBtb2RfYXV0b2luZGV4IEluZGV4T3B0aW9ucyBmbGFnczogU3VwcHJlc3NJY29uIHRvIAogICAgIGRyb3AgdGhlIGljb24gY29sdW1uLCBTdXBwcmVzc1J1bGVzIHRvIGRyb3AgdGhlIDxocj4gZWxlbWVudHMsIAogICAgIGFuZCBIVE1MVGFibGUgdG8gY3JlYXRlIHJ1ZGltZW50YXJ5IEhUTUwgdGFibGUgbGlzdGluZ3MgKGltcGxpZXMgCiAgICAgRmFuY3lJbmRleGluZykuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBSZS1pbnRyb2R1Y2VkIHRoZSBtb2RfYXV0b2luZGV4IEluZGV4T3B0aW9ucyBmbGFnIFRyYWNrTW9kaWZpZWQKICAgICBmcm9tIEFwYWNoZSAxLjMuMTUuICBUaGlzIGlzIG5lZWRlZCBmb3IgdHdvIHJlYXNvbnMsIGZpcnN0LCBnaXZlbgogICAgIG11bHRpcGxlIG1hY2hpbmVzIHdpdGhpbiBhIHNlcnZlciBmYXJtLCBFVGFncyBhbmQgTGFzdC1Nb2RpZmllZCAKICAgICBzdGFtcHMgd29uJ3QgY29ycmVzcG9uZCBmcm9tIG1hY2hpbmUgdG8gbWFjaGluZSwgYW5kIHNlY29uZCwgbWFueSAKICAgICBVbml4ZXMgZG9uJ3QgY2FwdHVyZSBjaGFuZ2VzIHRvIHRoZSBkYXRlIG9yIHRpbWUgc3RhbXAgb2YgZXhpc3RpbmcgCiAgICAgZmlsZXMsIHNpbmNlIHRoZXNlIGRvbid0IG1vZGlmeSB0aGUgZGlyZW50IGl0c2VsZi4gIFtXaWxsaWFtIFJvd2VdCgogICopIFJlLWludHJvZHVjZWQgdGhlIG1vZF9hdXRvaW5kZXggSW5kZXhPcHRpb25zIGZsYWcgRm9sZGVyc0ZpcnN0IAogICAgIGFuZCBEaXJlY3RvcnlXaWR0aCBvcHRpb25zIGZyb20gQXBhY2hlIDEuMy4xMC4gCiAgICAgW1dpbGxpYW0gUm93ZSwgS2VuIENvYXJdCgogICopIEVsaW1pbmF0ZWQgRmFuY3lJbmRleGluZyBkaXJlY3RpdmUsIGRlcHJlY2F0ZWQgZWFybHkgaW4gQXBhY2hlCiAgICAgMS4zIGJ5IHRoZSBJbmRleE9wdGlvbnMgRmFuY3lJbmRleGluZyBzeW50YXguICBbV2lsbGlhbSBSb3dlXQoKICAqKSBtb2RfYXV0b2luZGV4IG5vdyBleGNsdWRlcyBhbnkgZmlsZSBuYW1lcyB0aGF0IHdvdWxkIHJlc3VsdCBpbgogICAgIGFuIGVycm9yLCBvdGhlciB0aGFuIGEgc3VjY2VzcyBvciByZWRpcmVjdC4gIEFsc28gb3B0aW1pemVkCiAgICAgdGhlIHBhcmVudCBkaXJlY3RvcnksIGFsd2F5cyBpbmNsdWRlZCBleGNlcHQgaW4gdGhlIFVSSSAnLycuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgUmVmYWN0b3JlZCBtb2RfbmVnb3RpYXRpb24gYW5kIG1vZF9taW1lIHRvIGhlbHAgbW9kX2RpciBhY2NlcHQKICAgICBuZWdvdGlhdGVkIGluZGV4IHBhZ2VzLCBhbmQgcHJldmVudCB0aGUgc2VydmVyIGZyb20gZGVmYXVsdGluZwogICAgIHRvIGFuIGF1dG9pbmRleCBvZiB0aGUgZGlyZWN0b3J5LiAgbW9kX25lZ290aWF0aW9uIHdpbGwgbm93IGRpZQogICAgIHdpdGggYSA1MDAgSW50ZXJuYWwgRXJyb3IgaWYgaXQgY291bGQgbWF0Y2ggc29tZSBmaWxlbmFtZXMgCiAgICAgKGUuZy4gZm9yIG1vZF9kaXIpIGJ1dCBub25lIGNhbiBiZSBzZXJ2ZWQuICBtb2RfbmVnb3RhdGlvbiBub3cKICAgICByZWZ1c2VzIHRvIHNlcnZlIGFueSBmaWxlIHdpdGggYW4gZXh0ZW50aW9uIHRoYXQgbW9kX21pbWUgZG9lc24ndAogICAgIHJlY29nbml6ZSwgYW5kIHdhc24ndCBwYXJ0IG9mIHRoZSByZXF1ZXN0LiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRWxpbWluYXRlIG1vZF9jZ2kncyBoYW5kbGluZyBvZiAuZXhlIGZpbGVzIHdpdGhvdXQgdGhlIC5leGUgZmlsZQogICAgIGV4dGVuc2lvbi4gIFRoaXMgaXMgYWxyZWFkeSBoYW5kbGVkIGJ5IG11bHRpdmlld3MsIGlmIHRoZSBhZG1pbgogICAgIHdpc2hlcyB0byBBZGRIYW5kbGVyIC5leGUgb3IgZGVmaW5lIGEgY29udGVudCB0eXBlIGhhbmRsZXIgYW5kIAogICAgIGFzc29jaWF0ZSAuZXhlIGZpbGVzIHdpdGggdGhhdCBjb250ZW50IHR5cGUuICBNdWx0aXZpZXdzIG11c3QgYmUKICAgICBlbmFibGVkIHRvIGFsbG93IHRoZXNlIHRvIGJlIHNlcnZlZC4gIFtXaWxsaWFtIFJvd2VdCgogICopIFNwZWVkIHVwIHRoZSBzZXJ2ZXIncyByZXNwb25zZSB0byBhIHNwaWtlIGluIGluY29taW5nIHdvcmtsb2FkCiAgICAgb3IgcmVzdGFydHMgYnkgYXNzaWduaW5nIGVtcHR5IHNjb3JlYm9hcmQgc2xvdHMgdG8gbmV3IHByb2Nlc3NlcwogICAgIHdoZW4gdGhleSBhcmUgYXZhaWxhYmxlLiAgW0dyZWcgQW1lc10KCiAgKikgQWRkIGEgaGFuZGxlciB0byBtb2RfaW5jbHVkZXMuYy4gIFRoaXMgaGFuZGxlciBpcyBkZXNpZ25lZCB0bwogICAgIGltcGxlbWVudCB0aGUgWGJpdEhhY2sgZGlyZWN0aXZlLiAgVGhpcyBjYW4ndCBiZSBkb25lIHdpdGggYQogICAgIGZpeHVwLCBiZWNhdXNlIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGNvbnRlbnQtdHlwZSwgd2hpY2ggaXMKICAgICBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgaGFuZGxlciBwaGFzZS4gIFtSeWFuIEJsb29tXQoKICAqKSBNYWtlIHRoZSBpbmNsdWRlcyBmaWx0ZXIgY2hlY2sgcmV0dXJuIGNvZGVzIGZyb20gZmlsdGVycyBsb3dlciBpbgogICAgIHRoZSBmaWx0ZXIgY2hhaW4uICBJZiBhIGxvd2VyIGxldmVsIGZpbHRlciByZXR1cm5zIGFuIGVycm9yLCB0aGVuCiAgICAgdGhlIHJlcXVlc3QgbmVlZHMgdG8gc3RvcCBpbW1lZGlhdGVseS4gIFRoaXMgYWxsb3dzIG1vZF9pbmNsdWRlIHRvCiAgICAgc3RvcCBwYXJzaW5nIGRhdGEgb25jZSBhIGxvd2VyIGZpbHRlciByZWNvZ25pemVzIGFuIGVycm9yLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBZGQgdGhlIGFiaWxpdHkgdG8gZXh0ZW5kIHRoZSBtZXRob2RzIHRoYXQgQXBhY2hlIHVuZGVyc3RhbmRzCiAgICAgYW5kIGhhdmUgdGhvc2UgbWV0aG9kcyA8bGltaXQ+YWJsZSBpbiB0aGUgaHR0cGQuY29uZi4gSXQgdXNlcyAKICAgICB0aGUgc2FtZSBiaXQgbWFzay9zaGlmdGVkIG9mZnNldCBhcyB0aGUgb3JpZ2luYWwgSFRUUCBtZXRob2RzIAogICAgIHN1Y2ggYXMgTV9HRVQgb3IgTV9QT1NULCBidXQgZXhwYW5kcyB0aGUgdG90YWwgYml0cyBmcm9tIGFuIGludCB0byAKICAgICBhbiBhcF9pbnQ2NF90IHRvIGhhbmRsZSBtb3JlIGJpdHMgZm9yIG5ldyByZXF1ZXN0IG1ldGhvZHMgdGhhbiAKICAgICBhbiBpbnQgcHJvdmlkZXMuICBbQ29keSBTaGVyciA8Y3NoZXJyIGNvdmFsZW50Lm5ldD5dCgogICopIEZpeCBicm9rZW4gbW9kX21pbWUgYmVoYXZpb3IgaW4gbWVyZ2luZyBpdHMgYXJndW1lbnRzLiAgUG9zc2libGUKICAgICBjYXVzZSBvZiB1bmV4cGxpY2FibGUgY3Jhc2hlcyBpbnRyb2R1Y2VkIGluIDIuMC4yMC4gIFtXaWxsaWFtIFJvd2VdCgogICopIFNvbHZlIG1hbnkgbW9kX3NzbCBwb3J0aW5nIGlzc3VlcyAodG9vIG1hbnkgdG8gZGV0YWlsKSB3aXRoIAogICAgIGhlbHAgZnJvbSB0aGUgd2hvbGUgdGVhbSwgYnV0IG1vc3Qgbm90YWJseSBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgCiAgICAgTWFkaHVzdWRhbiBNYXRoaWhhbGxpIDxtYWRodXN1ZGFuX21hdGhpaGFsbGkgaHAuY29tPiwgCiAgICAgRG91ZyBNYWNFYWNoZXJuLCBXaWxsaWFtIFJvd2UsIENsaWZmIFdvb2xsZXldCgogICopIE1vcmUgc3RhbGwgZml4ZXMgZm9yIHRoZSB0aHJlYWRlZCAmIHdvcmtlciBtcG0ncy4KICAgICBNYWtlIG1vZF9zdGF0dXMgb3V0cHV0IG1vcmUgYWNjdXJhdGUuICBEb24ndAogICAgIGNvdW50IHdvcmtlcnMgaW4gcHJvY2Vzc2VzIHdoaWNoIGFyZW4ndCBhY3RpdmVseQogICAgIHNlcnZpbmcgcmVxdWVzdHMuIFtHcmVnIEFtZXNdCiAgICAgCiAgKikgV2luMzI6IEdldCBTU0kgZXhlYyBjZ2kgdGFnIHdvcmtpbmcuIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBBZGQgYSBzaW5nbGUgbGlzdGVuZXIvbXVsdGlwbGUgd29ya2VyIE1QTS4gIFRoaXMgTVBNIGlzCiAgICAgZGVmaW5hdGVseSBub3QgZnVsbHkgY29ycmVjdCwgYnV0IGl0IGFsbG93cyB1cyB0byBzb2x2ZSBtYW55CiAgICAgb2YgdGhlIHByb2JsZW1zIHRoYXQgZXhpc3QgaW4gdGhlIHRocmVhZGVkIE1QTS4gIFRoaXMgaXMgYSAKICAgICBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB0aHJlYWRlZCBNUE0uICBbUnlhbiBCbG9vbV0KCiAgKikgSW1wcm92ZSBjb250ZW50IGdlbmVyYXRpb24gdGhyb3VnaG91dCBBcGFjaGUsIHByb3ZpZGluZyBjbG9zZXIKICAgICBjb21wbGlhbmNlIHdpdGggSFRNTCAzLjIsIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwgYW5kIFhIVE1MIDEuMAogICAgIFRyYW5zaXRpb25hbCBzcGVjaWZpY2F0aW9ucy4gIFtXaWxsaWFtIFJvd2VdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4yMgogIAogICopIEZpeCBhIHByb2JsZW0gd2hlcmUgdGhlIHRocmVhZGVkIE1QTSBzdGFsbHMgYWZ0ZXIgcmVzdGFydHMgb3IKICAgICBzZWdmYXVsdHMuICBBbHNvIHByZXZlbnQgbXVsdGlwbGUgYWN0aXZlIHByb2Nlc3NlcyBmcm9tIHVzaW5nCiAgICAgdGhlIHNhbWUgc2NvcmVib2FyZCBzbG90LiAgW0dyZWcgQW1lc10KCiAgKikgQXBhY2hlL1dpbjMyIG5vdyBmaWxscyBpbiB0aGUgc2VydmljZSBkZXNjcmlwdGlvbiB3aXRoIEFwYWNoZSdzCiAgICAgc2VydmVyIHZlcnNpb24gc3RyaW5nLCBpbmNsdWRpbmcgbG9hZGVkIGFuZCBhZHZlcnRpc2VkIG1vZHVsZXMuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgSW1wcm92ZWQgc3VwcG9ydCBmb3IgdGhlIFdpbjMyIGJ1aWxkLCB0byByZWNvdmVyIGdyYWNlZnVsbHkgZnJvbQogICAgIG1pc3NpbmcgYXByIG9yIGFwci11dGlsIGRpcmVjdG9yaWVzIG9yIHRoZSBhd2sgaW50ZXJwcmV0ZXIsIAogICAgIGNyZWF0ZSB0aGUgcHJvcGVyIGNnaS1iaW4gZXhhbXBsZXMsIGluY2x1ZGluZyBhIHRlc3QtY2dpLmJhdCwgYW5kIAogICAgIGZpeCB0aGUgcGVybCBzaGViYW5nIGxpbmUgZm9yIHByaW50ZW52LnBsLCB3aGVuIGluc3RhbGxpbmcgZnJvbSAKICAgICB0aGUgYnVpbGQgZW52aXJvbm1lbnQuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBGaXggYSBzZWdmYXVsdCBpbiB0aHJlYWRlZC5jIGNhdXNlZCBieSBwYXNzaW5nIHVuaW5pdGlhbGl6ZWQKICAgICBhcHJfdGhyZWFkX3QgKiB0byBhcHJfdGhyZWFkX2pvaW4oKS4gIFtKZWZmIFRyYXdpY2tdCgogICopIFVzZSBuZXcgQVBSIG51bWJlciBjb252ZXJzaW9uIGZ1bmN0aW9ucyB0byByZWR1Y2UgQ1BVIGNvbnN1bXB0aW9uIAogICAgIHdoZW4gc2V0dGluZyB0aGUgY29udGVudCBsZW5ndGgsIGFuZCBpbiBtb2RfbG9nX2NvbmZpZy4KICAgICBbQnJpYW4gUGFuZV0KICAgICAKICAqKSBGaXggcHJvYmxlbSByZXBvcnRlZCBieSBUYWtldG8gS2FiZSA8a2FiZSBzcmEtdG9ob2t1LmNvLmpwPgogICAgIHdoZXJlIEhFQUQgcmVzcG9uc2UgaGVhZGVycyB3ZXJlIGJlaW5nIHJlcGVhdGVkIHR3aWNlIGZvcgogICAgIGZpbGVzIGdyZWF0ZXIgdGhhbiAzMksgYnl0ZXMgKDQqQVBfTUlOX0JZVEVTX1RPX1dSSVRFKS4gVGhpcwogICAgIHByb2JsZW0gaW4gdGhlIGh0dHBfaGVhZGVyIGZpbHRlciB3YXMgZXhwb3NlZCBieSB0aGUgcmVjZW50IHJld3JpdGUKICAgICBvZiB0aGUgY29udGVudF9sZW5ndGggZmlsdGVyLiBbVGFrZXRvIEthYmUsIEJpbGwgU3RvZGRhcmRdCgogICopIEZpeCBzZWcgZmF1bHRzIGluIG1vZF9zdGF0dXMgd2l0aCBFeHRlbmRlZFN0YXR1cyBlbmFibGVkLCBhZnRlcgogICAgIHJlc3RhcnRzLiAgQSBnYXJiYWdlIHBvaW50ZXIgdG8gYSB2aG9zdCdzIHNlcnZlcl9yZWMgZnJvbSB0aGUKICAgICBwcmV2aW91cyBnZW5lcmF0aW9uIHdhcyBiZWluZyBsZWZ0IGFyb3VuZCB1bmRlciBjZXJ0YWluCiAgICAgY29uZGl0aW9ucy4gW0dyZWcgQW1lc10KCiAgKikgRml4IGEgY29zbWV0aWMgcHJvYmxlbSB3aXRoIG1vZF9pbmNsdWRlLiAgTm9uLWV4aXN0YW50IFNTSSB2YXJzCiAgICAgdXNlZCB0byBhcHBlYXIgYXMgJyhub25lJywgd2l0aG91dCB0aGUgY2xvc2luZyBwYXJlbi4KICAgICBbR/xudGVyIEtuYXVmIDxlZmxhc2ggZ214Lm5ldD5dCgogICopIEltcHJvdmUgdGhlIGV4cG9ydHMgZ2VuZXJhdGluZyBhd2sgc2NyaXB0LiAgSW4gdGhlIHBhc3QsIHdlIGhhZAogICAgIHdvcmsgYXJvdW5kIHByb2JsZW1zIGluIHRoZSBhd2sgc2NyaXB0IGJ5IGF2b2lkaW5nIHNvbWUgI2lmIGFuZAogICAgICNpZmRlZnMuICBUaGlzIGhhcyBiaXR0ZW4gdXMgbWFueSB0aW1lcyBpbiBnZW5lcmF0aW5nIHRoZSBleHBvcnRzLmMKICAgICBmaWxlLiAgVGhpcyBpbXByb3ZlbWVudCBhbGxvd3MgY29ycmVjdHMgdGhlIGhlYWRlciBmaWxlIHBhcnNpbmcuCiAgICAgW1NhbmRlciBTdHJpa2VyIDxzdHJpa2VyIGFwYWNoZS5vcmc+XQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMjEKCiAgKikgUmVzb2x2ZSB0aGUgV2luMzIgaHRwYXNzd2QgYnVnLCB3aGVyZSBhIGZpbGUgdGhhdCBleGlzdGVkIHdvdWxkIGJlCiAgICAgb3ZlcndyaXR0ZW4sIHJlZ2FyZGxlc3Mgb2YgdGhlIC1jIGZsYWcuCiAgICAgW1dpbGxpYW0gUm93ZSwgTWxhZGVuIFR1cmsgPG1sYWRlbi50dXJrIG1haWwuaW5ldC5ocj5dCgogICopIEludHJvZHVjZSBjb25uZWN0aW9uIHN1Yi1wb29scyBpbnRvIGFiLiAgVHJ1bmNhdGluZyB0aGUgbGlmZXRpbWUKICAgICBvZiB0aGVzZSBhbGxvY2F0aW9ucyBtZWFucyB0aGF0IGFiIG5vIGxvbmdlciBwZXJwZXR1YWxseSBncm93cwogICAgIGl0cyB3b3JraW5nIHNldCwgcnVubmluZyBvdXQgb2YgbWVtb3J5IG9uIGxhcmdlIHJlcXVlc3QgYXR0ZW1wdHMuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgTWFrZSBzY29yZWJvYXJkIGNyZWF0aW9uIGEgaG9vay4gIFRoaXMgYWxsb3dzIG1hbmFnZW1lbnQKICAgICBtb2R1bGVzIHRvIGhhdmUgYWNjZXNzIHRvIHRoZSBzY29yZWJvYXJkIGF0IHRoZSB0aW1lIHRoYXQgaXQgaXMKICAgICBjcmVhdGVkLCBhbmQgYXQgZXZlcnkgcmVzdGFydCByZXF1ZXN0LiAgCiAgICAgW0NvZHkgU2hlcnIgPGNzaGVyciBjb3ZhbGVudC5uZXQ+XQoKICAqKSBDaGFuZ2VkIEFQX01QTVFfTUFYX0RBRU1PTlMgdG8gcmVmZXIgdG8gTWF4Q2xpZW50cyBhbmQKICAgICBhZGRlZCBhbiBBUF9NUE1RX01BWF9EQUVNT05fVVNFRCB0byByZWZlciB0byB0aGUgaGlnaGVzdAogICAgIGRhZW1vbiBpbmRleCBhY3R1YWxseSB1c2VkIGluIHRoZSBzY29yZWJvYXJkLiBJIGFsc28KICAgICB1cGRhdGVkIHRoZSBwZXJ0aW5lbnQgY2FsbHMuIFtQYXVsIEouIFJlZGVyXQoKICAqKSBXaW4zMjogUHJldmVudCBsaXN0ZW5pbmcgc29ja2V0cyBmcm9tIGJlaW5nIGluaGVyaXRlZCBieQogICAgIHRoZSBBcGFjaGUgY2hpbGQgcHJvY2VzcywgQ0dJIHNjcmlwdHMsIHJvdGF0ZWxvZyBwcm9jZXNzCiAgICAgZXRjLiAgSWYgdGhlIEFwYWNoZSBjaGlsZCBwcm9jZXNzIHNlZ2ZhdWx0cywgYW55IHByb2Nlc3NlcyAKICAgICB0aGF0IHRoZSBjaGlsZCBzdGFydGVkIGFyZSBub3QgcmVhcGVkLiBQcmlvciB0byB0aGlzIGZpeCwKICAgICB0aGVzZSBwcm9jZXNzZXMgaW5oZXJpdGVkIHRoZSBsaXN0ZW5pbmcgc29ja2V0cyB3aGljaCBzb21ldGltZXMKICAgICBwcmV2ZW50ZWQgdGhlIHJlc3RhcnRlZCBBcGFjaGUgY2hpbGQgcHJvY2VzcyBmcm9tIGFjY2VwdGluZwogICAgIGNvbm5lY3Rpb25zIChpZSwgdGhlIHNlcnZlciB3b3VsZCBoYW5nKS4gCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIFByb3ZpZGUgdmhvc3QgYW5kIHJlcXVlc3Qgc3RyaW5ncyB3aGVuIEV4dGVuZGVkU3RhdHVzIGlzIG9uLgogICAgIFtHcmVnIEFtZXNdCgogICopIEZpeCBzb21lIGlzc3VlcyB3aXRoIHRoZSBwb2QgYW5kIHByZWZvcms6IGNoZWNrIHRoZSBwb2QgKmFmdGVyKgogICAgIHByb2Nlc3NpbmcgYSBjb25uZWN0aW9uIHNvIHRoYXQgYSBzZXJ2ZXIgcHJvY2Vzc2luZyBhIHRpbWUtCiAgICAgY29uc3VtaW5nIHJlcXVlc3QgYmFpbHMgb3V0IGFzIHNvb24gYXMgcHJhY3RpY2FsOyB3aGVuIHRoZQogICAgIHBhcmVudCBwcm9jZXNzIHdha2VzIHVwIGEgc2VydmVyIHByb2Nlc3MgdmlhIGNvbm5lY3QoKSwgdXNlIGFuCiAgICAgQVBSIHRpbWVvdXQgb24gdGhlIGNvbm5lY3QoKSBzbyB0aGF0IHdlIGRvbid0IGhhbmcgZm9yIGEgbG9uZwogICAgIHRpbWUgaWYgdGhlcmUgYXJlbid0IHNlcnZlciBwcm9jZXNzZXMgYXJvdW5kIHRvIGRvIGFjY2VwdCgpLgogICAgIFtKZWZmIFRyYXdpY2ssIEdyZWcgQW1lc10KCiAgKikgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgdG8gbW9kX21pbWUuYy4gZmluZF9jdCgpIGluIG1vZF9taW1lLCAKICAgICBzcGVuZHMgYSBsb3Qgb2YgdGltZSBpbiBhcHJfdGFibGVfZ2V0IGNhbGxzLiAgVXNpbmcgdGhlIGRlZmF1bHQgCiAgICAgaHR0cGQuY29uZiwgdGhlIHRhYmxlcyBmb3IgbGFuZ3VhZ2VzIGFuZCBjaGFyc2V0cyBhcmUgc29tZXdoYXQKICAgICBsYXJnZSwgc28gdGhlIHRpbWUgc3BlbnQgc2Nhbm5pbmcgdGhlbSBvbiBlYWNoIHJlcXVlc3QgaXMKICAgICBzaWduaWZpY2FudC4gUmVwbGFjaW5nIHRoZSB0YWJsZXMgd2l0aCBoYXNoIHRhYmxlcyBwcm92aWRlcwogICAgIGEgbmljZSBzcGVlZHVwLiBbQnJpYW4gUGFuZSA8YnBhbmUgcGFjYmVsbC5uZXQ+XQoKICAqKSBBZGQgdHdvIGZ1bmN0aW9ucyB0byBhbGxvdyBtb2R1bGVzIHRvIGFjY2VzcyByYW5kb20gcGFydHMgb2YgdGhlCiAgICAgc2NvcmVib2FyZC4gIFRoaXMgYWxsb3dzIG1vZHVsZXMgY29tcGlsZWQgZm9yIG9uZSBNUE0gdG8gYWNjZXNzIHRoZQogICAgIHNjb3JlYm9hcmQsIGV2ZW4gaWYgaXQgdGhlIHNlcnZlciB3YXMgY29tcGlsZWQgZm9yIGFub3RoZXIgTVBNLgogICAgIFtIYXJyaWUgSGF6ZXdpbmtlbCA8aGFycmllIGNvdmFsZW50Lm5ldD5dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4yMAoKICAqKSBGaXggcHJvYmxlbSBpbiBjb250ZW50LWxlbmd0aCBmaWx0ZXIgd2hlcmUgdGhlIGZpbHRlciB3b3VsZAogICAgIGJ1ZmZlciBhbGwgdGhlIG91dHB1dCBmcm9tIGEgQ0dJIGJlZm9yZSBzZW5kaW5nIGFueSBieXRlcwogICAgIGRvd24gdGhlIGZpbHRlciBzdGFjayB0byB0aGUgbmV0d29yay4gVGhpcyBwcm9ibGVtIHdvdWxkIGNhdXNlCiAgICAgc2lnbmlmaWNhbnQgbWVtb3J5IGNvbnN1bXB0aW9uIGlmIHRoZSBDR0lzIGdlbmVyYXRlZAogICAgIGxvdHMgb2YgYnl0ZXMuIFtCaWxsIFN0b2RkYXJkXQogIAogICopIEdldCBub24tYmxvY2tpbmcgQ0dJIHBpcGUgcmVhZHMgd29ya2luZyB3aXRoIHRoZSBidWNrZXQgYnJpZ2FkZXMuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIEZpeCBzZWcgZmF1bHQgb24gV2luZG93cyB3aGVuIHNlcnZpbmcgZmlsZXMgY2FjaGVkIHdpdGggbW9kX2ZpbGVfY2FjaGUuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIEZpeCBhIGJ1ZyBpbiB0aGUgdGhyZWFkZWQgTVBNIHRoYXQgd291bGQgY2F1c2UgaXQgdG8ga2lsbCBvZmYgYWxsCiAgICAgd29ya2VycyBpbW1lZGlhdGVseSBhZnRlciBzdGFydGluZyBpZiB0aGUgbnVtYmVyIG9mIHdvcmtlcnMgc3RhcnRlZAogICAgIHdhcyBhYm92ZSBhIGNlcnRhaW4gdGhyZXNob2xkLiAgW1J5YW4gQmxvb20sIEJpbGwgU3RvZGRhcmRdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4xOQoKICAqKSBGaXggcHJvYmxlbSB3aXRoIHRocmVhZGVkIE1QTS4gIFRoZSBwcm9ibGVtIHdhcyB0aGF0IGlmIGVhY2ggY2hpbGQKICAgICBwcm9jZXNzIHdhcyBidXN5IHNlcnZpbmcgYSBzaW5nbGUgbG9uZy1saXZlZCByZXF1ZXN0IGFuZCB0aGUgc2VydmVyCiAgICAgd2FzIHNlbnQgYSBncmFjZWZ1bCByZXN0YXJ0IHNpZ25hbCwgdGhlIHNlcnZlciB3b3VsZCBzdG9wIHNlcnZpbmcKICAgICByZXF1ZXN0cy4gIFRoaXMgd291bGQgaGFwcGVuIGJlY2F1c2UgZWFjaCBjaGlsZCBwcm9jZXNzIHdvdWxkIHdhaXQgdG8KICAgICBkaWUgdW50aWwgdGhlIGxhc3QgdGhyZWFkIHdhcyBkb25lLCBhbmQgdGhlIHBhcmVudCB3b3VsZG4ndCBzcGF3biBhbnkKICAgICBuZXcgY2hpbGRyZW4gdW50aWwgYSBwcm9jZXNzIGRpZWQuICBOb3csIHRoZSBwYXJlbnQgbG9va3MgYXQgdGhlIGZhY3QKICAgICB0aGF0IHRoZSBjaGlsZHJlbiBhcmUgZHlpbmcgZ3JhY2VmdWxseSwgYW5kIHN0YXJ0cyBuZXcgY2hpbGRyZW4uCiAgICAgVGhvc2UgbmV3IGNoaWxkcmVuIG9ubHkgc3RhcnQgZW5vdWdoIHRocmVhZHMgdG8gY29tcGxpbWVudCB0aGUgbnVtYmVyCiAgICAgb2YgdGhyZWFkcyBpbiB0aGUgb3RoZXIgY2hpbGQgcHJvY2VzcyB0aGF0IHNoYXJlcyB0aGUgc2FtZSBzcG90IGluCiAgICAgdGhlIHNjb3JlYm9hcmQuICBJbiB0aGlzIHdheSwgd2UgbWFrZSBzdXJlIHRvIG5ldmVyIGdvIG92ZXIKICAgICBNYXhDbGllbnRzLiAgW1J5YW4gQmxvb21dCgogICopIG1vZGlmaWVkIG1vZF9uZWdvdGlhdGlvbiBhbmQgbW9kX2F1dG9pbmRleCB0byBzcGVlZCB1cCBieSBhbG1vc3QgYQogICAgIGZhY3RvciBvZiB0d28gb24gYXByX2Rpcl9yZWFkKCktZW5oYW5jZWQgcGxhdGZvcm1zLCBzdWNoIGFzIFdpbjMyCiAgICAgYW5kIE9TMiwgYnkgY2FsbGluZyBhcF9zdWJfcmVxdWVzdF9sb29rdXBfZGlyZW50KCkgd2l0aCB0aGUgcmVzdWx0cwogICAgIGFscmVhZHkgcHJvdmlkZWQgYnkgYXByX2Rpcl9yZWFkKCkuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBtb2RfZmlsZV9jYWNoZSBpcyBub3cgbW9yZSByb2J1c3QgdG8gZmlsdGVyaW5nIGFuZCBzZXJ2ZXMgcmVxdWVzdHMKICAgICBzbGlnaHRseSBtb3JlIGVmZmljaWVudGx5LiAgW0NsaWZmIFdvb2xsZXldCgogICopIEZpeCBwcm9ibGVtIGhhbmRsaW5nIEZMVVNIIGJ1Y2tldCBpbiB0aGUgY2h1bmtlZCBlbmNvZGluZyBmaWx0ZXIuCiAgICAgTW9kdWxlIHdhcyBjYWxsaW5nIGFwX3J3cml0ZSgpIGZvbGxvd2VkIGJ5IGFwX3JmbHVzaCgpIGJ1dCB0aGUgCiAgICAgc2VydmVkIGNvbnRlbnQgd2FzIG5vdCBiZWluZyBkaXNwbGF5ZWQgaW4gdGhlIGJyb3dzZXIuIEluc3BlY3Rpb24KICAgICBvZiB0aGUgb3V0cHV0IHN0cmVhbSByZXZlYWxlZCB0aGF0IHRoZSBmaXJzdCBkYXRhIGNodW5rIHdhcwogICAgIG1pc3NpbmcgdGhlIHRyYWlsaW5nIENSTEYgcmVxdWlyZWQgYnkgdGhlIFJGQy4gIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBhcHhzIG5vIGxvbmdlciBnZW5lcmF0ZXMgYXBfc2VuZF9odHRwX2hlYWRlcigpIGluIHRoZSBleGFtcGxlIGhhbmRsZXIKCiAgKikgRml4IGFuIGFiIHByb2JsZW0gd2hpY2ggY291bGQgY2F1c2UgYSBkaXZpZGUtYnktemVybyBleGNlcHRpb24KICAgICB3aXRoIGNlcnRhaW4gaW52b2NhdGlvbnMgKGUuZy4sIGFiIC1rIC1jIDYgLW4gMTAwIGxvY2FsaG9zdC8pLgogICAgIFtJYW4gSG9sc21hbiA8aWFuaCBjbmV0LmNvbT5dCgogICopIFNvbHZlIGNhc2UtaW5zZW5zaXRpdmUgcGxhdGZvcm1zJyBjb25mdXNpb24gYWJvdXQgbmVnb3RpYXRlZAogICAgIGZpbGVuYW1lcywgYWxsb3dpbmcgZmlsZXMgb2YgZGlmZmVybnQgY2FzZSB0byBtYXRjaCBpbiBjaG9vc2luZwogICAgIHRoZSBkb2N1bWVudCB0byBzZXJ2ZS4gIFtXaWxsaWFtIFJvd2VdCgogICopIEZpeCBicm9rZW5uZXNzIHdoZW4gVGhyZWFkc1BlckNoaWxkIGlzIGhpZ2hlciB0aGFuIHRoZSBidWlsdC1pbgogICAgIGxpbWl0LiAgV2UgbGVmdCBhcF90aHJlYWRzX3Blcl9jaGlsZCBhdCB0aGUgaGlnaGVyIHZhbHVlIHdoaWNoCiAgICAgbGVkIHRvIHNlZ2ZhdWx0cyB3aGVuIGRvaW5nIGNlcnRhaW4gc2NvcmVib2FyZCBvcGVyYXRpb25zLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBzZWcgZmF1bHRzIGFuZC9vciBtaXNzaW5nIG91dHB1dCBmcm9tIG1vZF9pbmNsdWRlLiAgVGhlCiAgICAgZGVmYXVsdF9oYW5kbGVyIHdhcyB1c2luZyB0aGUgc3VicmVxdWVzdCBwb29sIGZvciBmaWxlcyBhbmQKICAgICBNTUFQcywgZXZlbiB0aG91Z2ggdGhlIGFzc29jaWF0ZWQgQVBSIHN0cnVjdHVyZXMgdHlwaWNhbGx5IAogICAgIGxpdmUgbG9uZ2VyIHRoYW4gdGhlIHN1YnJlcXVlc3QuIFtHcmVnIEFtZXNdCiAgCiAgKikgRXh0ZW5kIG1vZF9zZXRlbnZpZiB0byBzdXBwb3J0IHNwZWNpZnlpbmcgcmVndWxhciBleHByZXNzaW9ucwogICAgIG9uIHRoZSBTZXRFbnZJZiAoYW5kIFNldEVudklmTm9DYXNlKSBkaXJlY3RpdmUgYXR0cmlidXRlIGZpZWxkLgogICAgIEV4YW1wbGU6ICBTZXRFbnZJZiBeVFMqICBbYS16XS4qIEhBVkVfVFMgCiAgICAgd2lsbCBjYXVzZSBIQVZFX1RTIHRvIGJlIHNldCBpZiBhbnkgb2YgdGhlIHJlcXVlc3QgaGVhZGVycyBiZWdpbnMgCiAgICAgd2l0aCAiVFMiIGFuZCBoYXMgYSB2YWx1ZSB0aGF0IGJlZ2lucyB3aXRoIGFueSBjaGFyYWN0ZXIgaW4gdGhlCiAgICAgc2V0IFthLXpdLiBbQmlsbCBTdG9kZGFyZF0KCiAgKikgaHR0cGQgY2hpbGRyZW4gbm93IHJlLWJpbmQgdGhlbXNlbHZlcyB0byBhIHJhbmRvbSBDUFUgb24KICAgICBtdWx0aXByb2Nlc3NvciBzeXN0ZW1zIG9uIEFJWCB2aWEgYmluZHByb2Nlc3NvcigpIGluIDIuMC4KICAgICBbVmljdG9yIEouIE9ybGlrb3dza2ldCgogICopIEZpeCBodGRpZ2VzdC4gSXQgd291bGQgZ28gaW50byBhIGxvb3AgaW4gZ2V0bGluZSB3aGVuIGFkZGluZyAKICAgICBhIHNlY29uZCB1c2VyLiBbQmlsbCBTdG9kZGFyZF0KCiAgKikgV2luMzIgcGxhdGZvcm1zIG5vdyBmdWxseSBzdXBwb3J0IG1vZF91c2VyZGlyIG9wdGlvbnMuICBbV2lsbCBSb3dlXQoKICAqKSBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGh0dHBkLmV4cCBmb3IgQUlYLgogICAgIERTT3Mgbm93IHdvcmsgYWdhaW4gb24gQUlYIGluIDIuMAogICAgIFtWaWN0b3IgSi4gT3JsaWtvd3NraV0KCiAgKikgQWRkIGEgbmV3IHJlcXVlc3QgaG9vaywgZXJyb3JfbG9nLiAgVGhpcyBwaGFzZSBhbGxvd3MgbW9kdWxlcwogICAgIHRvIGFjdCBvbiB0aGUgZXJyb3IgbG9nIHN0cmluZyBfYWZ0ZXJfIGl0IGhhcyBiZWVuIHdyaXR0ZW4KICAgICB0byB0aGUgZXJyb3IgbG9nLiAgVGhlIGdvYWwgZm9yIHRoaXMgaG9vayBpcyB0byBhbGxvdyBtb25pdG9yaW5nCiAgICAgbW9kdWxlcyB0byBzZW5kIHRoZSBlcnJvciBzdHJpbmcgdG8gdGhlIG1vbml0b3JpbmcgYWdlbnQuCiAgICAgW1J5YW4gQmxvb21dCgogICopIE1vZGlmeSBtb2RfZWNobyB0byBtYWtlIGl0IHVzZSBmaWx0ZXJzIGZvciBpbnB1dCBhbmQgb3V0cHV0LgogICAgIFtSeWFuIE1vcmdhbiA8cm1vcmdhbiBjb3ZhbGVudC5uZXQ+XQoKICAqKSBFeHRlbmQgbW9kX2hlYWRlcnMgdG8gc3VwcG9ydCBjb25kaXRpb25hbCBkcml2ZW4gSGVhZGVyIAogICAgIGFkZCwgYXBwZW5kIGFuZCBzZXQuIFVzZSBTZXRFbnZJZiB0byBzZXQgYW4gZW52YXIgYW5kIGNvbmRpdGlvbmFsbHkKICAgICBhZGQvYXBwZW5kL3NldCBoZWFkZXJzIGJhc2VkIG9uIHRoaXMgZW52YXIgdGh1c2x5OgoKICAgICBTZXRFbnZJZiBUU015SGVhZGVyIHZhbHVlIEhBVkVfVFNNeUhlYWRlcgogICAgIEhlYWRlciBhZGQgTXlIZWFkZXIgIiV0ICVEIiBlbnY9SEFWRV9UU015SGVhZGVyCgogICAgIElmIHRoZSByZXF1ZXN0IGNvbnRhaW5zIGhlYWRlciAiVFNNeUhlYWRlcjogdmFsdWUiIHRoZW4gaGVhZGVyCiAgICAgTXlIZWFkZXI6ICJ0PXh4eHh4eHh4eHggRD15eXl5IiB3aWxsIGJlIHNlbnQgb24gdGhlIHJlc3BvbnNlLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBFeHRlbmQgbW9kX2hlYWRlcnMgdG8gc3VwcG9ydCB1c2luZyBmb3JtYXQgc3BlY2lmaWVycyBvbiBIZWFkZXIKICAgICBhZGQsIGFwcGVuZCBhbmQgc2V0IGhlYWRlciB2YWx1ZXMuIFR3byBmb3JtYXQgc3BlY2lmaWVycyBhcmUgc3VwcG9ydGVkOgoKICAgICAldCAtIHJlcG9ydHMsIGluIFVUQyBtaWNyb3NlY29uZHMgc2luY2UgdGhlIGVwb2NoLCB3aGVuIHRoZQogICAgICAgICAgcmVxdWVzdCB3YXMgcmVjZWl2ZWQuCgogICAgICVEIC0gcmVwb3J0cyB0aGUgdGltZSwgaW4gbWljcm9zZWNvbmRzLCBiZXR3ZWVuIHdoZW4gdGhlIHJlcXVlc3Qgd2FzIAogICAgICAgICAgcmVjZWl2ZWQgYW5kIHRoZSByZXNwb25zZSBzZW50LiAKCiAgICAgRXhhbXBsZXM6CiAgICAgSGVhZGVyIGFkZCBNeUhlYWRlciAiVGhpcyByZXF1ZXN0IHNlcnZlZCBpbiAlRCBtaWNyb3NlY29uZHMuICV0IgoKICAgICByZXN1bHRzIGluIGEgaGVhZGVyIGJlaW5nIGFkZGVkIHRvIHRoZSByZXNwb25zZSB0aGF0IGxvb2tzIGxpa2UgdGhpczoKICAgICAKICAgICBNeUhlYWRlcjogVGhpcyByZXF1ZXN0IHNlcnZlZCBpbiBEPTU0MzggbWljcm9zZWNvbmRzLiB0PTk5MTQyNDcwNDQ0NzI1NgoKICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgRml4IHJlc2V0X2ZpbHRlcigpLiAgV2UgbmVlZCB0byBiZSBjYXJlZnVsIGhvdyB3ZSByZW1vdmUgZmlsdGVycy4KICAgICBJZiB3ZSBzZXQgci0+b3V0cHV0X2ZpbHRlcnMgdG8gTlVMTCwgd2UgYWxzbyBoYXZlIHRvIHJlc2V0IHRoZQogICAgIGNvbm5lY3Rpb24ncyBmaWx0ZXJzLiAgW0pvaG4gU3RlcmxpbmddCgogICopIE9wdGltaXNlIHJlc2V0X2ZpbHRlcigpIGluIGh0dHBfcHJvdG9jb2wuYy4gW0dyZWcgU3RlaW5dCgogICopIEFkZCBhIGNoZWNrIHRvIGFwX2RpZSgpIHRvIG1ha2Ugc3VyZSB0aGUgZmlsdGVyIHN0YWNrIGlzIHNhbmUgYW5kCiAgICAgY29udGFpbnMgdGhlIGNvcnJlY3QgYmFzaWMgZmlsdGVycyB3aGVuIGFuIGVycm9yIG9jY3Vycy4gVGhpcyBmaXhlcwogICAgIGEgcHJvYmxlbSB3aGVyZSBoZWFkZXJzIGFyZSBub3QgYmVpbmcgc2VudCBvbiBlcnJvci4gW0pvaG4gU3RlcmxpbmddCgogICopIE5ldyBIZWFkZXIgZGlyZWN0aXZlICdlY2hvJyBvcHRpb24uICJIZWFkZXIgZWNobyByZWdleCIgd2lsbAogICAgIGNhdXNlIGFueSBoZWFkZXJzIHJlY2VpdmVkIG9uIHRoZSByZXF1ZXN0IHRoYXQgbWF0Y2ggcmVnZXggdG8gYmUKICAgICBlY2hvZWQgdG8gKGluY2x1ZGVkIGluKSB0aGUgcmVzcG9uc2UgaGVhZGVycy4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgaW5jbHVkZS9hcF9jb21wYXQuaCB0ZXN0ZWQgYW5kIHNldCBBUFJfQ09NUEFUX0ggaW5zdGVhZCBvZiBBUF9DT01QQVRfSC4KICAgICBUaGlzIHByZXZlbnRlZCB0aGUgaW5jbHVzaW9uIG9mIGFwcl9jb21wYXQuaC4gIFBSICM3NzczCiAgICAgW09sZWcgQnJveXRtYW5uIDxwaGQgcGhkLnBwLnJ1Pl0KCiAgKikgTW92ZWQgdXRpbF91cmkgdG8gdGhlIGFwci11dGlsIGxpYnJhcnkuICBUaGlzIHJlcXVpcmVkIGEgYnVuY2ggb2YKICAgICBhcHJfbmFtZSBjaGFuZ2VzIGZvciB0aGUgdXJpIHV0aWxpdHkgZnVuY3Rpb25zLiAgW0p1c3RpbiBFcmVua3JhbnR6XQoKICAqKSBNb3ZlIHRoZSBhZGRpdGlvbiBvZiBkZWZhdWx0IEFQX0hUVFBfSFRUUF9IRUFERVIgZmlsdGVycyB0byB0aGUKICAgICBpbnNlcnRfZmlsdGVyIHBoYXNlIHNvIHRoYXQgb3RoZXIgZmlsdGVycyBhcmUgbm90IGJ5cGFzc2VkIGJ5IGRlZmF1bHQuCiAgICAgW0dyYWhhbSBMZWdnZXR0XQoKICAqKSBSZWltcGxlbWVudCBtb2RfaGVhZGVycyBhcyBhbiBvdXRwdXQgZmlsdGVyLiBtb2RfaGVhZGVycyBjYW4gbm93CiAgICAgYWRkIGN1c3RvbSBoZWFkZXJzIHRvIGluYm91bmQgcmVxdWVzdHMgdXNpbmcgdGhlIFJlcXVlc3RIZWFkZXIgZGlyZWN0aXZlCiAgICAgYW5kIHRvIHJlc3BvbnNlcyB1c2luZyB0aGUgc2FtZSBvbGQgSGVhZGVyIGRpcmVjdGl2ZS4gIFtHcmFoYW0gTGVnZ2V0dF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjE4CgogICopIEZpeCBjb21tYW5kLWxpbmUgcHJvY2Vzc2luZyBzbyB0aGF0IGlmIGEgYmFkIGFyZ3VtZW50IGlzIHNwZWNpZmllZAogICAgIEFwYWNoZSB3aWxsIGV4aXQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBDaGFuZ2UgdGhlIG1ha2UgdGFyZ2V0cyBhbmQgcnVsZXMgdG8gYmUgY29uc2lzdGVudCBpbiBhbGwgb2YgdGhlCiAgICAgQXBhY2hlLW93bmVkIHNvdXJjZSB0cmVlcy4gIFtSb3kgRmllbGRpbmddCiAgICAgCiAgKikgRml4IHByb2Nlc3Npbmcgb2YgdGhlIFRSQUNFIG1ldGhvZC4gIFByZXZpb3VzbHkgd2UgcGFzc2VkIGJvZ3VzCiAgICAgcGFybXMgdG8gZm9ybV9oZWFkZXJfZmllbGQoKSBhbmQgaXQgb3ZlcmxhaWQgc29tZSB2aG9zdCBzdHJ1Y3R1cmVzLAogICAgIHJlc3VsdGluZyBpbiBhIHNlZ2ZhdWx0IGluIGNoZWNrX2hvc3RhbGlhcygpLiAKICAgICBbR3JlZyBBbWVzLCBKZWZmIFRyYXdpY2tdCgogICopIFdpbjMyOiBBZGQgc3VwcG9ydCBmb3IgcmVsaWFibGUgcGlwZWQgbG9ncy4gSWYgdGhlIGxvZ2dpbmcgcHJvY2VzcwogICAgIGdvZXMgZG93biwgQXBhY2hlIHdpbGwgYXV0b21hdGljYWxseSByZXN0YXJ0IGl0LiBUaGlzIGZ1bmN0aW9uIGhhcyAKICAgICBiZWVuIHBhcnQgb2YgQXBhY2hlIG9uIFVuaXgvTGludXgvQlNEIHNpbmNlIHRoZSBlYXJseSB2MS4zIHJlbGVhc2VzLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBEbyBub3Qgc3RhcnQgcGlwZWQgbG9nIHByb2Nlc3NlcyBkdXJpbmcgdGhlIGNvbmZpZyBmaWxlIAogICAgIHByZWZsaWdodC4gIFRoaXMgY2hhbmdlIGFsc28gY2lyY3VtdmVudHMgYSBwcm9ibGVtIG9uIAogICAgIFdpbmRvd3Mgd2hlcmUgdGhlIHJvdGF0ZWxvZyBwcm9jZXNzZXMgY3JlYXRlZCBkdXJpbmcgcHJlZmxpZ2h0CiAgICAgd2FzIG5vdCBnZXR0aW5nIGNsZWFuZWQgdXAgcHJvcGVybHkuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIGFkZCAiUmVxdWVzdCBQaGFzZSBQYXJ0aWNpcGF0aW9uIiBpbmZvIHRvIG1vZF9pbmZvCiAgICAgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgTWFrZSBmaXJzdCBwaGFzZSBjaGFuZ2VzIHRvIHRoZSBzY29yZWJvYXJkIGRhdGEgc3RydWN0dXJlcyBpbgogICAgIHByZXBhcmF0aW9uIGZvciB0aGUgcmV3cml0aW5nIG9mIHRoZSBzY29yZWJvYXJkIHBlciBteSBwb3N0ZWQKICAgICBkZXNpZ24gbm90ZXMuIFtQYXVsIEouIFJlZGVyXQoKICAqKSBGaXggaHR0cGQncyBkZWZpbml0aW9uIG9mIExURkxBR1MgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoYXQgb2YgYXByCiAgICAgYW5kIGFwci11dGlsLCBhbGxvdyBpdCB0byBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjb25maWd1cmUgY29tbWFuZC1saW5lCiAgICAgKGRlZmF1bHQ9Ii0tc2lsZW50IikgYW5kIGludHJvZHVjZSBMVF9MREZMQUdTIHRvIHJlcGxhY2Ugd2hhdCB3ZSB3ZXJlCiAgICAgZm9ybWVybHkgYWJ1c2luZyBhcyBMVEZMQUdTLiAgW1JveSBGaWVsZGluZ10KCiAgKikgQ2xlYW4gdXAgdGhlIHJlcG9ydGluZyBvZiBpbmNvcnJlY3QgY2xvc2luZyBjb250YWluZXIgdGFncy4KICAgICBbQmFycmllIFNsYXltYWtlciA8YmFycmllcyBzbGF5c3lzLmNvbT5dCgogICopIFNpbXBsaWZ5IHRoZSBjb25maWd1cmUgcHJvY2VzcyBieSBtb3ZpbmcgYWxsIGxpYnRvb2wgc3R1ZmYgdG8gQVBSCiAgICAgYW5kIG1vdmluZyBoaW50cy5tNCBpbmxpbmUuICBbUm95IEZpZWxkaW5nXQoKICAqKSBBZGQgdGhlIEFQX0RFQ0xBUkUoKS9BUF9DT1JFX0RFQ0xBUkUgbWFjcm9zIG9uIHRoZSByZXR1cm4gdHlwZXMKICAgICBvZiBmdW5jdGlvbnMgdXNlZCBieSBtb2RfcHJveHkgZm9yIGV4cG9ydCBpbiB0aGUgRExMIAogICAgIFtJYW4gSG9sc21hbiA8SWFuSCBjbmV0LmNvbT5dCgogICopIFByZXZlbnQgYSBoYW5nIHdoZW4gYSBjZ2kgaGFuZGxlZCBieSBtb2RfY2dpZCB0cmllcyB0byByZWFkIGEKICAgICByZXF1ZXN0IGJvZHkgZnJvbSBpdHMgc3RkaW4gYnV0IG5vIHJlcWVzdCBib2R5IGlzIGJlaW5nIHdyaXR0ZW4gdG8gCiAgICAgdGhlIGNnaS4gIFtKZWZmIFRyYXdpY2tdCgogICopIG1vZF9sb2dfY29uZmlnOiAlYyBjb25uZWN0aW9uIHN0YXR1cyBpbmNvcnJlY3RseSBsb2dnZWQKICAgICBhcyAiLSIgKG5vbi1rZWVwYWxpdmUpIHdoZW4gTWF4S2VlcEFsaXZlUmVxdWVzdHMgaXMgc2V0IHRvIDAuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIEdldCBtb2RfY2Vybl9tZXRhIHdvcmtpbmcgdW5kZXIgV2luZG93cwogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBDcmVhdGUgRmlsZXMsIGFuZCB0aHVzIE1NQVBzLCBvdXQgb2YgdGhlIHJlcXVlc3QgcG9vbCwgbm90IHRoZQogICAgIGNvbm5lY3Rpb24gcG9vbC4gIFRoaXMgc29sdmVzIGEgc21hbGwgcmVzb3VyY2UgbGVhayB0aGF0IGhhZCB1cwogICAgIG5vdCBjbG9zaW5nIGZpbGVzIHVudGlsIGEgY29ubmVjdGlvbiB3YXMgY2xvc2VkLiAgSW4gb3JkZXIgdG8gZG8KICAgICB0aGlzLCBhdCB0aGUgZW5kIG9mIHRoZSBjb3JlX291dHB1dF9maWx0ZXIsIHdlIGxvb3AgdGhyb3VnaCB0aGUKICAgICBicmlnYWRlIGFuZCBjb252ZXJ0IGFueSBkYXRhIHdlIGhhdmUgaW50byBhIHNpbmdsZSBIRUFQIGJ1Y2tldAogICAgIHRoYXQgd2Uga25vdyB3aWxsIHN1cnZpdmUgY2xlYXJpbmcgdGhlIHJlcXVlc3RfcmVjLgogICAgIFtSeWFuIEJsb29tLCBKdXN0aW4gRXJlbmtyYW50eiA8amVyZW5rcmFudHogZWJ1aWx0LmNvbT4sCiAgICAgIENsaWZmIFdvb2xsZXldCgogICopIENvbXBsZXRlbHkgcmV2YW1wIGNvbmZpZ3VyZSBzbyB0aGF0IGl0IHByZXNlcnZlcyB0aGUgc3RhbmRhcmQgbWFrZQogICAgIHZhcmlhYmxlcyBDUFBGTEFHUywgQ0ZMQUdTLCBDWFhGTEFHUywgTERGTEFHUyBhbmQgTElCUyBieSBtb3ZpbmcKICAgICB0aGUgY29uZmlndXJlIGFkZGl0aW9ucyB0byBFWFRSQV8qIHZhcmlhYmxlcy4gIEFsc28sIGFsbG93IHRoZSB1c2VyCiAgICAgdG8gc3BlY2lmeSBOT1RFU1RfKiB2YWx1ZXMgZm9yIGFsbCBvZiB0aGUgYWJvdmUsIHdoaWNoIGVsaW1pbmF0ZXMgdGhlCiAgICAgbmVlZCBmb3IgVEhSRUFEX0NQUEZMQUdTLCBUSFJFQURfQ0ZMQUdTLCBhbmQgT1BUSU0uICBGaXggdGhlIHNldHRpbmcKICAgICBvZiBJTkNMVURFUyBhbmQgRVhUUkFfSU5DTFVERVMuICBDaGVjayBmbGFncyBhcyB0aGV5IGFyZSBhZGRlZCB0bwogICAgIGF2b2lkIHBvaW50bGVzcyBkdXBsaWNhdGlvbnMuICBGaXggdGhlIG9yZGVyIGluIHdoaWNoIGZsYWdzIGFyZSBnaXZlbgogICAgIG9uIHRoZSBjb21waWxlIGFuZCBsaW5rIGxpbmVzLiAgUmVtb3ZlIG9ic29sZXRlIG1hY3JvcyBBUFJfRE9FWFRSQSwKICAgICBBQ19BRERfTElCUkFSWSwgQUNfQ0hFQ0tfREVGSU5FLCBBUEFDSEVfUEFTU1RIUlUsIGFuZCBBUEFDSEVfT05DRS4KICAgICBBZGRlZCBBUFJfU0FWRV9USEVfRU5WSVJPTk1FTlQgYW5kIEFQUl9SRVNUT1JFX1RIRV9FTlZJUk9OTUVOVCBtYWNyb3MuCiAgICAgUmVuYW1lZCBBQ19UWVBFX1JMSU1fVCBtYWNybyB0byBBUEFDSEVfVFlQRV9STElNX1QuICBbUm95IEZpZWxkaW5nXQoKICAqKSBHZXQgbW9kX3RscyB0byBjb21waWxlL3dvcmsgYmV0dGVyIG9uIFdpbmRvd3MuICBQUiAjNzYxMgogICAgIFtCZXJuaGFyZCBTY2hyZW5rIDxiLnNjaHJlbmsgaW1wcm94LmNvbT5dCgogICopIEZpeCBzaHV0ZG93bi9yZXN0YXJ0IGhhbmdzIGluIHRoZSB0aHJlYWRlZCBNUE0uCiAgICAgW0plZmYgVHJhd2ljaywgR3JlZyBBbWVzLCBSeWFuIEJsb29tXQogIAogICopIFJlbW92ZWQgdGhlIGtlcHRhbGl2ZSBib29sZWFuIGZyb20gY29ubl9yZWMgYmVjYXVzZSBpdCBpcyBub3cgb25seQogICAgIHVzZWQgYnkgYSBzaW5nbGUgcm91dGluZSBhbmQgY2FuIGJlIHJlcGxhY2VkIGJ5IGEgbG9jYWwgdmFyaWFibGUuCiAgICAgW0dyZWcgU3RlaW4sIFJ5YW4gQmxvb20sIFJveSBGaWVsZGluZ10KCiAgKikgUGF0Y2ggcHJlZm9yayB0byBwdXQgZW5vdWdoIG9mIHRoZSBzaWduYWwgcHJvY2Vzc2luZyBiYWNrIGluIHNvIHRoYXQKICAgICBzaWduYWxzIGFyZSBhbGwgaGFuZGxlZCBwcm9wZXJseSBub3cuIFRoZSBwcmV2aW91cyBwYXRjaCBmaXhlZCB0aGUKICAgICBkZWFkbG9jayByYWNlIGNvbmRpdGlvbiwgYnV0IGJyb2tlIHRoZSB1c2VyIGRpcmVjdGVkIHNpZ25hbCBoYW5kbGluZy4KICAgICBUaGlzIGZpeGVzIGl0IHRvIHdvcmsgdGhlIHdheSBpdCBkaWQgYmVmb3JlIG15IHByZXZpb3VzIHByZWZvcmsgcGF0Y2gKICAgICAocHJpbWFyaWx5LCBTSUdURVJNIGlzIG5vdyB3b3JraW5nKS4KIAogICopIENoYW5nZSBob3cgaW5wdXQgZmlsdGVycyBkZWNpZGUgaG93IG11Y2ggZGF0YSBpcyByZXR1cm5lZCB0byB0aGUKICAgICBoaWdoZXIgZmlsdGVyLiAgV2UgdXNlZCB0byB1c2UgYSBmaWVsZCBpbiB0aGUgY29ubl9yZWMsIHdpdGggdGhpcwogICAgIGNoYW5nZSwgd2UgdXNlIGFuIGFyZ3VtZW50IHRvIGFwX2dldF9icmlnYWRlIHRvIGRldGVybWluZSBob3cgbXVjaAogICAgIGRhdGEgaXMgcmV0cmlldmVkLiBbUnlhbiBCbG9vbV0KCiAgKikgRml4IHNlZyBmYXVsdCBhdCBzdGFydC11cCBpbnRyb2R1Y2VkIGJ5IFJ5YW4ncyBjaGFuZ2UgdG8gZW5hYmxlCiAgICAgbW9kdWxlcyB0byBzcGVjaWZ5IHRoZWlyIG93biBsb2dnaW5nIHRhZ3MuIG1vZF9sb2dfY29uZmlnCiAgICAgcmVnaXN0ZXJzIGFuIG9wdGlvbmFsIGZ1bmN0aW9uLCBhcF9yZWdpc3Rlcl9sb2dfaGFuZGxlcigpLgogICAgIGFwX3JlZ2lzdGVyX2xvZ19oYW5kbGVyKCkgd2FzIGJlaW5nIGNhbGxlZCBieSBodHRwX2NvcmUgYmVmb3JlCiAgICAgdGhlIGRpcmVjdGl2ZSBoYXNoIHRhYmxlIHdhcyBjcmVhdGVkLiBUaGlzIHBhdGNoIGNyZWF0ZXMgdGhlCiAgICAgZGlyZWN0aXZlIGhhc2ggdGFibGUgYmVmb3JlIGFwX3JlZ2lzdGVyX2xvZ19oYW5kbGVyKCkgaXMKICAgICByZWdpc3RlcmVkIGFzIGFuIG9wdGlvbmFsIGZ1bmN0aW9uLgogICAgIFtqZWFuLWZyZWRlcmljIGNsZXJlIDxqZnJlZGVyaWMuY2xlcmUgZnVqaXRzdS1zaWVtZW5zLmNvbT5dCgogICopIEFkZCBhcF9zZXRfaW50X3Nsb3QoKSBmdW5jdGlvbgogICAgIFtKb2huIEsuIFN0ZXJsaW5nIDxzdGVybGluZyBjb3ZhbGVudC5uZXQ+XQoKICAqKSBVbmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIEFwYWNoZSBkaWQgbm90IHN1cHBseSB0aGUKICAgICByaWdodCByZXNwb25zZSBoZWFkZXJzIHdoZW4gcmVxdWlyaW5nIGF1dGhlbnRpY2F0aW9uLgogICAgIFtHZXJ0amFuIHZhbiBXaW5nZXJkZSA8R2VydGphbi52YW4uV2luZ2VyZGUgY21nLm5sPl0gUFIjNzExNAogICAgIChUaGlzIGlzIGEgcG9ydCBvZiB0aGUgY2hhbmdlIHRoYXQgd2VudCBpbnRvIEFwYWNoZSAxLjMuMTkuKQoKICAqKSBBbGxvdyBtb2R1bGVzIHRvIHNwZWNpZnkgdGhlaXIgb3duIGxvZ2dpbmcgdGFncy4gIFRoaXMgYmFzaWNhbGx5CiAgICAgYWxsb3dzIGEgbW9kdWxlIHRvIHRlbGwgbW9kX2xvZ19jb25maWcgdGhhdCB3aGVuICV4IGlzIGVuY291bnRlcmVkCiAgICAgYSBzcGVjaWZpYyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkLiAgQ3VycmVudGx5LCB4IGNhbiBiZSBhbnkgc2luZ2xlCiAgICAgY2hhcmFjdGVyLiAgSXQgbWF5IGJlIG1vcmUgdXNlZnVsIHRvIG1ha2UgdGhpcyBhIHN0cmluZyBhdCBzb21lIHBvaW50LgogICAgIFtSeWFuIEJsb29tXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMTcKCiAgKikgSWYgYSBoaWdoZXItbGV2ZWwgZmlsdGVyIGhhbmRsZXMgdGhlIGJ5dGVyYW5nZSBhc3BlY3RzIG9mIGEKICAgICByZXF1ZXN0LCB0aGVuIHRoZSBieXRlcmFuZ2UgZmlsdGVyIHNob3VsZCBub3QgdHJ5IHRvIHJlZG8gdGhlCiAgICAgd29yay4gIFRoZSBtb3N0IGNvbW1vbiBjYXNlIG9mIHRoaXMgaGFwcGVuaW5nLCBpcyBhIGJ5dGVyYW5nZQogICAgIHJlcXVlc3QgZ29pbmcgdGhyb3VnaCB0aGUgcHJveHksIGFuZCB0aGUgb3JpZ2luIHNlcnZlciBoYW5kbGVzCiAgICAgdGhlIGJ5dGVyYW5nZSByZXF1ZXN0LiAgVGhlIHByb3h5IHNob3VsZCBpZ25vcmUgaXQuCiAgICAgW0dyYWhhbSBMZWdnZXR0IDxtaW5mcmluIHNoYXJwLmZtPl0KCiAgKikgQ2hhbmdlZCB0aGUgdGhyZWFkZWQgbXBtIHRvIGhhdmUgY2hpbGRfbWFpbiBqb2luIHRvIGVhY2ggb2YgdGhlCiAgICAgd29ya2VyIHRocmVhZHMgdG8gbWFrZSBzdXJlIHRoZSBraWRzIGFyZSBhbGwgZ29uZSBiZWZvcmUgY2hpbGRfbWFpbgogICAgIGV4aXRzIGFmdGVyIGEgc2lnbmFsIChjbGVhbnVwIGZyb20gcGVyZm9ybV9pZGxlX3NlcnZlcl9tYWludGVuYW5jZSkuCiAgICAgVGhpcyBpcyBhbiBleHRlbnNpb24gb2YgUnlhbnMgcmVjZW50IGNvbW1pdCB0byBtYWtlIHRoZSBjaGlsZF9tYWluCiAgICAgdGhlIHNpZ25hbCB0aHJlYWQuCgogICopIEFkZCBtb3JlIG9wdGlvbnMgdG8gdGhlIGFwX21wbV9xdWVyeSBmdW5jdGlvbi4gIFRoaXMgYWxzbyBhbGxvd3MgTVBNcyB0bwogICAgIHJlcG9ydCBpZiB0aGVpciB0aHJlYWRzIGFyZSBkeW5hbWljIG9yIHN0YXRpYy4gIEZpbmFsbHksIHRoaXMgYWxzbwogICAgIGltcGxlbWVudHMgYSBuZXcgQVBJLCBhcF9zaG93X21wbSwgd2hpY2ggcmV0dXJucyB0aGUgTVBNIHRoYXQgd2FzCiAgICAgcmVxdWlyZWQgaW50byB0aGUgY29yZS4gW0hhcnJpZSBIYXpld2lua2VsIDxoYXJyaWUgY292YWxlbnQubmV0Pl0KCiAgKikgRG8gbm90IGluc3RhbGwgdGhlIGJpbmFyaWVzIGZyb20gdGhlIHN1cHBvcnQgZGlyZWN0b3J5IHR3aWNlLgogICAgIFtqdW4taWNoaXJvIGhhZ2lubyA8aXRvanVuIGlpamxhYi5uZXQ+XQoKICAqKSBUaGUgYXBfZiogZnVuY3Rpb25zIHNob3VsZCBmbHVzaCBkYXRhIHRvIHRoZSBmaWx0ZXIgdGhhdCBpcyBwYXNzZWQKICAgICBpbiwgbm90IHRoZSBmaWx0ZXIgYWZ0ZXIgdGhlIG9uZSBwYXNzZWQgaW4uCiAgICAgW1J5YW4gTW9yZ2FuIDxybW9yZ2FuIGNvdmFsZW50Lm5ldD5dCgogICopIE1ha2UgYWIgd29yayBhZ2FpbiBieSBjaGFuZ2luZyBpdHMgbmF0aXZlIHR5cGVzIHRvIGFwciB0eXBlcyBhbmQgZm9ybWF0cy4KICAgICBbSnVzdGluIEVyZW5rcmFudHogPGplcmVua3JhbnR6IGVidWlsdC5jb20+XQoKICAqKSBNb3ZlIHRoZSBieXRlcmFuZ2UgZmlsdGVyIGFuZCBhbGwgb2YgdGhlIHN1cHBvcnRpbmcgZnVuY3Rpb25zIGJhY2sKICAgICB0byB0aGUgSFRUUCBtb2R1bGUuICBUaGUgYnl0ZXJhbmdlIGZpbHRlciB0dXJuZWQgb3V0IHRvIGJlIHZlcnkKICAgICBIVFRQIHNwZWNpZmljLCBhbmQgaXQgYmVsb25ncyBpbiB0aGUgSFRUUCBtb2R1bGUuICBbR3JlZyBTdGVpbl0KCiAgKikgTWFrZSBjbGVhbiwgZGlzdGNsZWFuLCBhbmQgZXh0cmFjbGVhbiBjb25zaXN0ZW50bHkgYWNjb3JkaW5nIHRvIHRoZQogICAgIEdudSBtYWtlZmlsZSBndWlkZWxpbmVzLiAgW0p1c3RpbiBFcmVua3JhbnR6IDxqZXJlbmtyYW50eiBlYnVpbHQuY29tPl0KCiAgKikgRml4IGVycm9ycyBpbiB0aGUgcmVuYW1pbmcgb2YgdGhlIGFwcl90aHJlYWRhdHRyX2RldGFjaF94eHggZnVuY3Rpb25zLgogICAgIFRoaXMgbWF5IGhhdmUgYmVlbiBjYXVzaW5nIHByb2JsZW1zIHN0b3BwaW5nIHByb2Nlc3NlcyBpbiB0aGUgdGhyZWFkZWQKICAgICBtcG0ncy4gW0dyZWcgQW1lc10KCiAgKikgRml4IGNvbnRlbnQtbGVuZ3RoIGluIG1vZF9uZWdvdGlhdGlvbiB0byBhIGxvbmcgaW50IHJlcHJlc2VudGF0aW9uLgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIFJlbW92ZSBCaW5kQWRkcmVzcyBmcm9tIHRoZSBkZWZhdWx0IGNvbmZpZyBmaWxlLgogICAgIFs8Z2lsZXMgbmVtZXRvbi5jb20uYXU+XQoKICAqKSBBbGxvdyBtb2R1bGUgYXV0aG9ycyB0byBhZGQgYSBtb2R1bGUgdG8gdGhlaXIgQXBhY2hlIGJ1aWxkIHVzaW5nCiAgICAgLS13aXRoLW1vZHVsZSwgd2l0aG91dCByZS1ydW5uaW5nIGJ1aWxkY29uZi4gIFRoZSBzeW50YXggaXM6CiAgICAgICAgIC0td2l0aC1tb2R1bGU9bW9kdWxlX3R5cGU6L3BhdGgvdG8vbW9kdWxlLmMKICAgICBUaGUgY29uZmlndXJlIHNjcmlwdCB3aWxsIGNvcHkgdGhlIG1vZHVsZS5jIGZpbGUgdG8gCiAgICAgbW9kdWxlcy9tb2R1bGVfdHlwZSwgYW5kIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlbGV2YW50IE1ha2VmaWxlcy4KICAgICBjdXJyZW50bHksIHRoaXMgb25seSB3b3JrcyBmb3Igc3RhdGljIG1vZHVsZXMuICBbUnlhbiBCbG9vbV0KCiAgKikgQ2hhbmdlcyByZXF1aXJlZCB0byBtYWtlIHByZWZvcmsgY2xlYW4gdXAgaWRsZSBjaGlsZHJlbiBwcm9wZXJseS4KICAgICBUaGVyZSB3YXMgYSB3aW5kb3cgZHVyaW5nIHdoaWNoIGEgc3RhcnRpbmcgd29ya2VyIGRlYWRsb2NrcyB3aGVuCiAgICAgYW4gaWRsZSBjbGVhbnVwIGFycml2ZXMgYmVmb3JlIGl0IGNvbXBsZXRlcyBpbml0LiBBcGFjaGUgdGhlbiBrZWVwcwogICAgIHRyeWluZyB0byBjbGVhbnVwIHRoZSBzYW1lIGRlYWRsb2NrZWQgd29ya2VyIGZvcmV2ZXIgKHVudGlsIGhpZ2hlcgogICAgIHBpZHMgY29tZSBhbG9uZywgYnV0IGl0IHN0aWxsIHdpbGwgbmV2ZXIgcmVkdWNlIGJlbG93IHRoZSBkZWFkbG9ja2VkCiAgICAgcGlkKS4gVGh1cyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHdvdWxkIG5vdCByZWR1Y2UgdG8gdGhlIGNvcnJlY3QKICAgICBpZGxlIGxldmVsLiBbUGF1bCBKLiBSZWRlcl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjE2CgogICopIENoYW5nZSB0aGUgZGVmYXVsdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHRvIC91c3IvbG9jYWwvYXBhY2hlMiwKICAgICBhcyBub3cgZGVmaW5lZCBieSB0aGUgIkFwYWNoZSIgbGF5b3V0IGluIGNvbmZpZy5sYXlvdXQuIFtNYXJjIFNsZW1rb10KCiAgKikgT1MvMjogQWRkZWQgc3VwcG9ydCBmb3IgYnVpbGRpbmcgbG9hZGFibGUgbW9kdWxlcyBhcyBPUy8yIERMTHMuIAogICAgIFtCcmlhbiBIYXZhcmRdCgogICopIEdldCBNYXhSZXF1ZXN0c1BlckNoaWxkIHdvcmtpbmcgd2l0aCB0aGUgV2luZG93cyBNUE0uCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIE1ha2UgZ2VuZXJpYyBob29rcyB0byB3b3JrLCB3aXRoIG1vZF9nZW5lcmljX2hvb2tfaW1wb3J0L2V4cG9ydAogICAgIGV4cGVyaW1lbnRhbCBtb2R1bGVzLiAgW0JlbiBMYXVyaWUsIFdpbGwgUm93ZV0KCiAgKikgRml4IHNlZ2ZhdWx0cyBmb3IgY29uZmlndXJhdGlvbiBmaWxlIHN5bnRheCBlcnJvcnMgc3VjaCBhcwogICAgICI8RGlyZWN0b3J5PiIgZm9sbG93ZWQgYnkgIjwvRGlyZWN0b3J5IiBhbmQKICAgICAiPERpcmVjdG9yeT4iIGZvbGxvd2VkIGJ5ICI8L0RpcmVjdG9yeXo+Ii4gIFtKZWZmIFRyYXdpY2tdCgogICopIENsZWFudXAgdGhlIC0tZW5hYmxlLWxheW91dCBvcHRpb24gb2YgY29uZmlndXJlLiAgVGhpcyBtYWtlcwogICAgIHVzIHVzZSBhIGNvbnNpc3RlbnQgbG9jYXRpb24gZm9yIHRoZSBjb25maWcubGF5b3V0IGZpbGUsIGFuZCBpdAogICAgIG1ha2VzIGNvbmZpZ3VyZSBtb3JlIHBvcnRhYmxlLgogICAgIFtqdW4taWNoaXJvIGhhZ2lubyA8aXRvanVuIGlpamxhYi5uZXQ+XQoKICAqKSBDaGFuZ2VzIHRvICdhYic7IGZpeGVkIGludCBvdmVycnVuJ3MsIGFkZGVkIHN0YXRpc3RpY3MsIG91dHB1dCBpbgogICAgIGNzdi9nbnVwbG90IGZvcm1hdCwgcnVkaW1lbnRhcnkgc3NsIHN1cHBvcnQgYW5kIHZhcmlvdXMgb3RoZXIgdHdlYWtzCiAgICAgdG8gbWFrZSByZXN1bHRzIG1vcmUgdHJ1ZSB0byB3aGF0IGlzIG1lYXN1cmVkLiBUaGUgdXBzaG90IG9mIHRoaXMgaXQKICAgICB0dXJucyBvdXQgdGhhdCAnYWInIGhhcyBvZnRlbiB1bmRlcnJlcG9ydGVkIHRoZSB0cnVlIHBlcmZvcm1hbmNlIG9mCiAgICAgYXBhY2hlLiBPZnRlbiBieSBhIG9yZGVyIG9mIG1hZ25pdHVkZSA6LSkgU2VlIHRhbGsvcGFwZXIgb2YgU2FuZGVyIAogICAgIFRlbW1lIGF0IEFwcmlsIEFwYWNoZUNvbiAyMDAxIGZvciBkZXRhaWxzLgogICAgIFtEaXJrLVdpbGxlbSB2YW4gR3VsaWtdCgogICopIENsZWFuIHVwIG1vZF9jZ2lkJ3MgdGVtcG9yYXJ5IHJlcXVlc3QgcG9vbC4gIEJlc2lkZXMgZml4aW5nIGEKICAgICBzdG9yYWdlIGxlYWsgdGhpcyBlbnN1cmVzIHRoYXQgc29tZSB1bm5lY2Vzc2FyeSBwaXBlcyBhcmUgY2xvc2VkLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIFBlcmZvcm1hbmNlOiBBZGQgcXVpY2tfaGFuZGxlciBob29rLiBUaGlzIGhvb2sgaXMgY2FsbGVkIGF0IHRoZQogICAgIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgYmVmb3JlIGxvY2F0aW9uX3dhbGssCiAgICAgdHJhbnNsYXRlX25hbWUsIGV0Yy4gIFRoaXMgaG9vayBpcyB1c2VmdWwgZm9yIFVSSSBrZXllZCBjb250ZW50CiAgICAgY2FjaGVzIGxpa2UgTWlrZSBBYmJvdHQncyBRdWljayBTaG9ydGN1dCBDYWNoZS4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgdG9wX21vZHVsZSBnbG9iYWwgdmFyaWFibGUgcmVuYW1lZCB0byBhcF90b3BfbW9kdWxlIFtQZXJsXQoKICAqKSBNb3ZlIGFwX3NldF9sYXN0X21vZGlmaWVkIHRvIHRoZSBjb3JlLiAgVGhpcyBpcyBhIHBvdGVudGlhbGx5IAogICAgIGNvbnRyb3ZlcnNpYWwgY2hhbmdlLCBiZWNhdXNlIHRoaXMgaXMga2luZCBvZiBIVFRQIHNwZWNpZmljLiAgSG93ZXZlcgogICAgIG1hbnkgcHJvdG9jb2xzIHNob3VsZCBiZSBhYmxlIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoaXMga2luZCBvZgogICAgIGluZm9ybWF0aW9uLiAgSSBleHBlY3QgdGhhdCBoZWFkZXJzIHdpbGwgbmVlZCBvbmUgbW9yZSBsYXllciBvZgogICAgIGluZGlyZWN0aW9uIGZvciBtdWx0aS1wcm90b2NvbCB3b3JrLCBidXQgdGhpcyBpcyBhIHNtYWxsIHN0ZXAgaW4KICAgICB0aGUgcmlnaHQgZGlyZWN0aW9uLiAgW1J5YW4gQmxvb21dCgogICopIEVuYWJsZSBtb2Rfc3RhdHVzIGJ5IGRlZmF1bHQuICBUaGlzIG1hdGNoZXMgd2hhdCBBcGFjaGUgMS4zIGRvZXMuCiAgICAgW0VkIEtvcnRob2ZdCgogICopIEFkZCBhIFNjcmlwdFNvY2sgZGlyZWN0aXZlIHRvIHRoZSBkZWZhdWx0IGNvbmZpZyBmaWxlLiAgVGhpcyBpcwogICAgIG9ubHkgZW5hYmxlZCB3aGVuIG1vZF9jZ2lkIGlzIHVzZWQuICAKICAgICBbVGFrZXRvIEthYmUgPGthYmUgc3JhLXRvaG9rdS5jby5qcD5dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4xNQoKICAqKSBVbnRhbmdsZWQgdGhlIGJ1aWxkY29uZiBzY3JpcHQgYW5kIGVsaW1pbmF0ZWQgdGhlIG5lZWQgZm9yIGJ1aWxkJ3MKICAgICBhY2xvY2FsLm00LCBnZW5lcmF0ZWRfbGlzdHMsIGJ1aWxkLm1rLCBidWlsZDIubWssIGFuZCBhIGhvc3Qgb2Ygb3RoZXIKICAgICBsaWJ0b29sIG11Y2sgdGhhdCBpcyBub3cgdW5kZXIgc3JjbGliL2Fwci9idWlsZC4gIFtSb3kgRmllbGRpbmddCgogICopIFdpbjMyOiBEb24ndCBhY2NlcHQgbW9yZSBjb25uZWN0aW9ucyB0aGFuIHdlIGhhdmUgd29ya2VyIHRocmVhZHMKICAgICB0byBoYW5kbGUuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIEZpeCBidWcgaW4gdGhlIFVuaXggdGhyZWFkZWQuYyBNUE0gdGhhdCBhbGxvd2VkIGNoaWxkIHByb2Nlc3NlcwogICAgIHRvIGZvcmsoKSBuZXcgY2hpbGQgcHJvY2Vzc2VzLiAKICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgU0VDVVJJVFk6IEZpeCBhIG1ham9yIHNlY3VyaXR5IHByb2JsZW0gd2l0aCBkb3VibGUtcmV2ZXJzZSBsb29rdXAgCiAgICAgY2hlY2tpbmcuICBQcmV2aW91c2x5LCBhIGNsaWVudCBjb25uZWN0aW5nIG92ZXIgSVB2NCB3b3VsZCBub3QgYmUgCiAgICAgbWF0Y2hlZCBwcm9wZXJseSB3aGVuIHRoZSBzZXJ2ZXIgaGFkIGFuIElQdjYgbGlzdGVuaW5nIHNvY2tldC4gIAogICAgIFBSICM3NDA3ICAgW1Rha2V0byBLYWJlIDxraWFiZSBzcmEtdG9ob2t1LmNvLmpwPl0KCiAgKikgQ2hhbmdlIHRoZSB3YXkgdGhlIGJlb3MgTVBNIGhhbmRsZXMgcG9sbGluZyB0byBhbGxvdyBpdCB0byBzdG9wIGFuZAogICAgIHJlc3RhcnQuICBQcm9ibGVtIHdhcyB0aGUgc29ja2V0cyBiZWluZyBwb2xsZWQgd2VyZSBiZWluZyByZXNldCBieQogICAgIHRoZSBzZWxlY3QgY2FsbCwgc28gb25jZSBpdCBoYWQgYWNjZXB0ZWQgYSBjb25uZWN0aW9uIGl0IHdhcyBubwogICAgIGxvbmdlciBsaXN0ZW5pbmcgb24gdGhlIFVEUCBzb2NrZXQgd2UgdXNlIGZvciBzaHV0ZG93biBpbnN0cnVjdGlvbnMuCiAgICAgQVBSIG5lZWRzIHRvIGJlIGFsdGVyZWQsIHBhdGNoIG9uIGl0J3Mgd2F5LiBbRGF2aWQgUmVpZF0KCiAgKikgRW1wdHkgb3V0IHRoZSBicmlnYWRlIHNoYXJlZCBieSBhcF9nZXRsaW5lKCkvYXBfZ2V0X2NsaWVudF9ibG9jaygpCiAgICAgb24gZXJyb3IgZXhpdCBmcm9tIGFwX2dldGxpbmUoKS4gIFNvbWUgb3RoZXIgY29kZSBnb3QgdXBzZXQgYmVjYXVzZQogICAgIHRoZSB3cm9uZyBkYXRhIHdhcyBpbiB0aGUgYnJpZ2FkZS4gIFtHcmVnIEFtZXMsIEplZmYgVHJhd2lja10KCiAgKikgSGFuZGxlIGFwX2Rpc2NhcmRfcmVxdWVzdF9ib2R5KCkgYmVpbmcgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgogICAgIFtHcmVnIEFtZXMsIEplZmYgVHJhd2lja10KCiAgKikgR2V0IHJpZCBvZiBhbiBpbmFkdmVydGVudCBjbG9zZSBvZiBmaWxlIGRlc2NyaXB0b3IgMiBpbgogICAgIG1vZF9taW1lX21hZ2ljLiAgW0dyZWcgQW1lcywgSmVmZiBUcmF3aWNrXQoKICAqKSBBZGQgYSBob29rLCBjcmVhdGVfcmVxdWVzdC4gIFRoaXMgaG9vayBhbGxvd3MgbW9kdWxlcyB0byBtb2RpZnkKICAgICBhIHJlcXVlc3Qgd2hpbGUgaXQgaXMgYmVpbmcgY3JlYXRlZC4gIFRoaXMgaG9vayBpcyBjYWxsZWQgZm9yIGFsbAogICAgIHJlcXVlc3RfcmVjJ3MsIG1haW4gcmVxdWVzdCwgc3ViIHJlcXVlc3QsIGFuZCBpbnRlcm5hbCByZWRpcmVjdC4KICAgICBXaGVuIHRoaXMgaG9vayBpcyBjYWxsZWQsIHRoZSByLT5tYWluLCByLT5wcmV2LCByLT5uZXh0CiAgICAgcG9pbnRlcnMgaGF2ZSBiZWVuIHNldCwgc28gbW9kdWxlcyBjYW4gZGV0ZXJtaW5lIHdoYXQga2luZCBvZgogICAgIHJlcXVlc3QgdGhpcyBpcy4gIFtSeWFuIEJsb29tXQoKICAqKSBDbGVhbnVwIHRoZSBidWlsZCBwcm9jZXNzIGEgYml0IG1vcmUuICBUaGUgQXBhY2hlIGNvbmZpZ3VyZQogICAgIHNjcmlwdCBubyBsb25nZXIgY3JlYXRlcyBpdHMgb3duIGhlbHBlciBzY3JpcHRzLCBpdCBqdXN0CiAgICAgdXNlcyBBUFIncy4gIAogICAgIFtqZWFuLWZyZWRlcmljIGNsZXJlIDxqZnJlZGVyaWMuY2xlcmUgZnVqaXRzdS1zaWVtZW5zLmNvbT5dCgogICopIFN0b3AgdGhlIGZvcmNlZCBkb3duZ3JhZGUgb2YgdGhlIGNvbm5lY3Rpb24gdG8gSFRUUC8xLjAgZm9yCiAgICAgcHJveHkgcmVxdWVzdHMuICBbR3JhaGFtIExlZ2dldHRdCgogICopIEF2b2lkIHVzaW5nIHNzY2FuZiB0byBkZXRlcm1pbmUgdGhlIEhUVFAgcHJvdG9jb2wgbnVtYmVyIGluCiAgICAgdGhlIGNvbW1vbiBjYXNlIGJlY2F1c2Ugc3NjYW5mIGlzIGEgcGVyZm9ybWFuY2UgaG9nLiBGcm9tCiAgICAgTWlrZSBBYmJvdCdzIEFjY2VsZXJhdGluZyBBcGFjaGUgcGF0Y2ggbnVtYmVyIDYuCiAgICAgW01pa2UgQWJib3QgPG1qYSB0cnVkZ2UuZW5nci5zZ2kuY29tPiwgQmlsbCBTdG9kZGFyZF0KCiAgKikgU0VDVVJJVFk6IEZpeCBhIHNlY3VyaXR5IGV4cG9zdXJlIGluIG1vZF9hY2Nlc3MuICBQcmV2aW91c2x5IHdoZW4gCiAgICAgSVB2NiBsaXN0ZW5pbmcgc29ja2V0cyB3ZXJlIHVzZWQsIGFsbG93L2RlbnktZnJvbS1JUHY0LWFkZHJlc3MgcnVsZXMgCiAgICAgd2VyZSBub3QgZXZhbHVhdGVkIHByb3Blcmx5IChQUiAjNzQwNykuICBBbHNvLCBhZGQgdGhlIGFiaWxpdHkgdG8gCiAgICAgc3BlY2lmeSBJUHY2IGFkZHJlc3Mgc3RyaW5ncyB3aXRoIG9wdGlvbmFsIHByZWZpeCBsZW5ndGggb24gQWxsb3cgCiAgICAgYW5kIERlbnkuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBFbmhhbmNlIHJvdGF0ZWxvZ3Mgc28gdGhhdCBhIFVUQyBvZmZzZXQgY2FuIGJlIHNwZWNpZmllZCwgYW5kCiAgICAgdGhlIGxvZ2ZpbGUgbmFtZSBjYW4gYmUgZm9ybWF0dGVkIHVzaW5nIHN0cmZ0aW1lKDMpLiAgKEJyb3VnaHQKICAgICBmb3J3YXJkIGZyb20gMS4zLikgIFtLZW4gQ29hcl0KCiAgKikgUmVpbXBsZW1lbnQgdGhlIFdpbmRvd3MgTVBNIChtcG1fd2lubnQuYykgdG8gZWxpbWluYXRlIGNhbGxpbmcgCiAgICAgRHVwbGljYXRlSGFuZGxlIG9uIGFuIElPQ29tcGxldGlvblBvcnQgKGEgcHJhY3RpY2Ugd2hpY2gKICAgICBNUyAiZGlzY291cmFnZXMiKS4gVGhlIG5ldyBtb2RlbCBkb2VzIG5vdCByZWx5IG9uIGFzc29jaWF0aW5nCiAgICAgdGhlIGNvbXBsZXRpb24gcG9ydCB3aXRoIHRoZSBsaXN0ZW5pbmcgc29ja2V0cywgdGh1cyB0aGUKICAgICBjb21wbGV0aW9uIHBvcnQgY2FuIGJlIGNvbXBsZXRlbHkgbWFuYWdlZCB3aXRoaW4gdGhlIGNoaWxkIAogICAgIHByb2Nlc3MuICBBIGRlZGljYXRlZCB0aHJlYWQgYWNjZXB0cyBjb25uZWN0aW9ucyBvZmYgdGhlIG5ldHdvcmssCiAgICAgdGhlbiBjYWxscyBQb3N0UXVldWVkQ29tcGxldGlvblN0YXR1cygpIHRvIHdha2UgdXAgd29ya2VyCiAgICAgdGhyZWFkcyBibG9ja2VkIG9uIHRoZSBjb21wbGV0aW9uIHBvcnQuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIEJyaW5nIGZvcndhcmQgdGhlIC0tc3VleGVjLXVtYXNrIG9wdGlvbiB3aGljaCBhbGxvd3MgdGhlCiAgICAgYnVpbGRlciB0byBwcmVzZXQgdGhlIHVtYXNrIGZvciBzdWV4ZWMgcHJvY2Vzc2VzLiAgW0tlbiBDb2FyXQoKICAqKSBBZGQgYSAtViBmbGFnIHRvIHN1ZXhlYywgd2hpY2ggY2F1c2VzIGl0IHRvIGRpc3BsYXkgdGhlCiAgICAgY29tcGlsZS10aW1lIHNldHRpbmdzIHdpdGggd2hpY2ggaXQgd2FzIGJ1aWx0LiAgKE9ubHkKICAgICB1c2FibGUgYnkgcm9vdCBvciB0aGUgQVBfSFRUUERfVVNFUiB1c2VybmFtZS4pICBbS2VuIENvYXJdCgogICopIE1vZF9pbmNsdWRlIHNob3VsZCBhbHdheXMgdW5zZXQgdGhlIGNvbnRlbnQtbGVuZ3RoIGlmIHRoZSBmaWxlIGlzCiAgICAgZ29pbmcgdG8gYmUgcGFzc2VkIHRocm91Z2ggc2VuZF9wYXJzZWRfY29udGVudC4gIFRoZXJlIGlzIG5vIHRvCiAgICAgZGV0ZXJtaW5lIGlmIHRoZSBjb250ZW50IHdpbGwgY2hhbmdlIGJlZm9yZSBhY3R1YWxseSBzY2FubmluZyB0aGUKICAgICBlbnRpcmUgY29udGVudC4gIEl0IGlzIGZhciBzYWZlciB0byBqdXN0IHJlbW92ZSB0aGUgQy1MIGFzIGxvbmcKICAgICBhcyB3ZSBhcmUgc2Nhbm5pbmcgaXQuICBbUnlhbiBCbG9vbV0KCiAgKikgTWFrZSBzdXJlIEFwYWNoZSBzZW5kcyBXV1ctQXV0aGVudGljYXRlIGR1cmluZyBhIHJldmVyc2UgcHJveHkKICAgICByZXF1ZXN0IGFuZCBub3QgUHJveHktQXV0aGVudGljYXRlLgogICAgIFtHcmFoYW0gTGVnZ2V0dCA8bWluZnJpbiBzaGFycC5mbT5dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4xNAoKICAqKSBGaXggY29udGVudC1sZW5ndGggY29tcHV0YXRpb24uICBXZSBPTkxZIGNvbXB1dGUgYSBjb250ZW50LWxlbmd0aCBpZgogICAgIFdlIGFyZSBub3QgaW4gYSAxLjEgcmVxdWVzdCBhbmQgd2UgY2Fubm90IGNodW5rLCBhbmQgdGhpcyBpcyBhIGtlZXBhbGl2ZQogICAgIG9yIHdlIGFscmVhZHkgaGF2ZSBhbGwgdGhlIGRhdGEuICBbUnlhbiBCbG9vbV0KCiAgKikgUmVwb3J0IHVuYm91bmRlZCBjb250YWluZXJzIGluIHRoZSBjb25maWcgZmlsZS4gIFByZXZpb3VzbHksIGEgdHlwbwogICAgIGluIHRoZSA8L2NvbnRhaW5lcj4gZGlyZWN0aXZlIGNvdWxkIHJlc3VsdCBpbiB0aGUgcmVzdCBvZiB0aGUgY29uZmlnCiAgICAgZmlsZSBiZWluZyBzaWxlbnRseSBpZ25vcmVkLCB3aXRoIHVuZGVzaXJlZCBkZWZhdWx0cyB1c2VkLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIE1ha2UgdGhlIG9sZF93cml0ZSBmaWx0ZXIgdXNlIHRoZSBhcF9mKiBmdW5jdGlvbnMgZm9yIHRoZSBidWZmZXJpbmcuCiAgICAgW1J5YW4gQmxvb21dCgogICopIE1vdmUgbW9yZSBjb2RlIGZyb20gdGhlIGh0dHAgbW9kdWxlIGludG8gdGhlIGNvcmUgc2VydmVyLiAgVGhpcwogICAgIGlzIGNvcmUgY29kZSwgYmFzaWNhbGx5IHRoZSBkZWZhdWx0IGhhbmRsZXIsIHRoZSBkZWZhdWx0IGlucHV0CiAgICAgYW5kIG91dHB1dCBmaWx0ZXJzLCBhbmQgYWxsIG9mIHRoZSBjb3JlIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4KICAgICBBbGwgb2YgdGhpcyBjb2RlIGlzIHJlcXVpcmVkIGluIG9yZGVyIGZvciB0aGUgc2VydmVyIHRvIHdvcmssIHdpdGggb3IKICAgICB3aXRob3V0IEhUVFAuICBUaGUgc2VydmVyIGlzIGNsb3NlciB0byB3b3JraW5nIHdpdGhvdXQgdGhlIEhUVFAKICAgICBtb2R1bGUsIGFsdGhvdWdoIHRoZXJlIGlzIHN0aWxsIG1vcmUgdG8gZG8uICBbUnlhbiBCbG9vbV0KCiAgKikgRml4IGEgbnVtYmVyIG9mIFNHSSBjb21waWxlIHdhcm5pbmdzIHRocm91Z2hvdXQgdGhlIHNlcnZlci4gIEZpeCBzb21lCiAgICAgYmFkIHBhcmFtZXRlcnMgdG8gYXByX2J1Y2tldF9yZWFkKCkuICBGaXggYSBiYWQgc3RhdGVtZW50IGluIAogICAgIGFwX21ldGhvZF9pbl9saXN0KCkuICBGb3IgdGhlIG1vZF9yZXdyaXRlIGNhY2hlIHVzZSBhcHJfdGltZV90IAogICAgIGNvbnNpc3RlbnRseTsgd2Ugd2VyZSBtaXhpbmcgYXByX3RpbWVfdCBhbmQgdGltZV90IGluIGludmFsaWQgd2F5cyAKICAgICBiZWZvcmUuICBJbiBsb2FkX2ZpbGUoKSwgY2FsbCBhcHJfZHNvX2Vycm9yKCkgaW5zdGVhZCBvZiAKICAgICBhcHJfc3RyZXJyb3IoKSBzbyB0aGF0IHdlIGdldCBhIG1vcmUgc3BlY2lmaWMgc3RyaW5nIG9uIHNvbWUgcGxhdGZvcm1zLgogICAgIFBSICM2OTgwICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBbGxvdyBtb2R1bGVzIHRvIHF1ZXJ5IHRoZSBNUE0gYWJvdXQgaXQncyBleGVjdXRpb24gcHJvZmlsZS4gIFRoaXMKICAgICBxdWVyeSBBUEkgY2FuIGFuZCBzaG91bGQgYmUgZXh0ZW5kZWQgaW4gdGhlIGZ1dHVyZSwgYnV0IGZvciBub3csCiAgICAgbWF4X2RhZW1vbnMsIGFuZCB0aHJlYWRpbmcgb3IgZm9ya2luZyBpcyBhIHZlcnkgZ29vZCBzdGFydC4KICAgICBbSm9uIFRyYXZpcyA8anRyYXZpcyBjb3ZhbGVudC5uZXQ+XQoKICAqKSBNb2RpZnkgbW9kX2luY2x1ZGUgdG8gc2VuZCBibG9ja3Mgb2YgZGF0YSBubyBsYXJnZXIgdGhhbiA5ay4KICAgICBXaXRob3V0IHRoaXMsIG1vZF9pbmNsdWRlIHdpbGwgd2FpdCB1bnRpbCB0aGUgd2hvbGUgZmlsZSBpcyBwYXJzZWQsCiAgICAgb3IgdGhlIGZpcnN0IHRhZyBpcyBmb3VuZCB0byBzZW5kIGFueSBkYXRhIHRvIHRoZSBjbGllbnQuCiAgICAgW1BhdWwgSi4gUmVkZXIgPHJlZGVycGogcmFsZWlnaC5pYm0uY29tPl0KCiAgKikgRml4IG1vZF9pbmZvLCBzbyB0aGF0IDxEaXJlY3Rvcnk+IGFuZCA8TG9jYXRpb24+IGRpcmVjdGl2ZXMgYXJlCiAgICAgbm90IGRpc3BsYXllZCB0d2ljZSB3aGVuIGRpc3BsYXlpbmcgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KICAgICBbUnlhbiBNb3JnYW4gPHJtb3JnYW4gY292YWxlbnQubmV0Pl0KCiAgKikgQWRkIGNvbmZpZyBkaXJlY3RpdmVzIHRvIG92ZXJyaWRlIERFRkFVTFRfRVJST1JfTVNHIGFuZAogICAgIERFRkFVTFRfVElNRV9GT1JNQVQuICBUaGlzIHdhcyBzZW50IGluIGFzIFBSIDYxOTMuCiAgICAgW0RhbiBSZW5jaCA8ZHJlbmNoIHhuZXQuY29tPl0KCiAgKikgR2V0IG1vZF9pbmZvIGJ1aWxkaW5nIGFuZCBsb2FkaW5nIG9uIFdpbjMyLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQmVnaW4gdG8gbW92ZSBwcm90b2NvbCBpbmRlcGVuZGFudCBmdW5jdGlvbnMgb3V0IG9mIG1vZF9odHRwLiAgVGhlIGdvYWwKICAgICBpcyB0byBoYXZlIG9ubHkgZnVuY3Rpb25zIHRoYXQgYXJlIEhUVFAgc3BlY2lmaWMgaW4gdGhlIGh0dHAgZGlyZWN0b3J5LgogICAgIFtSeWFuIEJsb29tXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjAuMTMKCiAgKikgRG9uJ3QgYXNzdW1lIHRoYXQgdGhlcmUgd2lsbCBhbHdheXMgYmUgbXVsdGlwbGUgY2FsbHMgdG8gdGhlIGJ5dGVyYW5nZSAKICAgICBmaWx0ZXIuICBJdCBpcyBwb3NzaWJsZSB0aGF0IHdlIHdpbGwgbmVlZCB0byBkbyBieXRlcmFuZ2VzIHdpdGggb25seQogICAgIG9uZSBjYWxsIHRvIHRoZSBmaWx0ZXIuICBbUnlhbiBNb3JnYW4gPHJtb3JnYW4gY292YWxlbnQubmV0Pl0KCiAgKikgTW92ZSB0aGUgZXJyb3JfYnVja2V0IGRlZmluaXRpb24gZnJvbSB0aGUgaHR0cCBtb2R1bGUgdG8gdGhlCiAgICAgY29yZSBzZXJ2ZXIuICBFdmVyeSBwcm90b2NvbCB3aWxsIG5lZWQgdGhpcyBhYmlsaXR5LCBub3QganVzdAogICAgIEhUVFAuICBbUnlhbiBCbG9vbV0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wLjEyCgogICopIE1vZGlmeSBtb2RfZmlsZV9jYWNoZSB0byBzYXZlIHByZS1mb3JtYXR0ZWQgc3RyaW5ncyBmb3IgCiAgICAgY29udGVudC1sZW5ndGggYW5kIGxhc3QtbW9kaWZpZWQgaGVhZGVycyBmb3IgcGVyZm9ybWFuY2UuIAogICAgIFtNaWtlIEFiYm90IDxtamEgdHJ1ZGdlLmVuZ3Iuc2dpLmNvbT5dCgogICopIE5hbWVzcGFjZSBwcm90ZWN0IElPQlVGU0laIHNpbmNlIGl0IGlzIGV4cG9zZWQgaW4gdGhlIEFQSS4KICAgICBbSm9uIFRyYXZpcyA8anRyYXZpcyBjb3ZhbGVudC5uZXQ+XQoKICAqKSBVc2UgIkJhc2ljIiBhdXRoZW50aWNhdGlvbiBpbnN0ZWFkIG9mICJiYXNpYyIgaW4gYWIsIGFzIHRoZSBzcGVjCiAgICAgc2F5cyB3ZSBzaG91bGQuICBbQW5kcmUgQnJlaWxlciA8YW5kcmUuYnJlaWxlciByZC5iYmMuY28udWs+XQoKICAqKSBGaXggYSBzZWcgZmF1bHQgaW4gbW9kX3VzZXJkaXIuYy4gIFdlIHVzZWQgdG8gdXNlIHRoZSBwdyBzdHJ1Y3R1cmUKICAgICB3aXRob3V0IGV2ZXIgZmlsbGluZyBpdCBvdXQuICBUaGlzIGZpeGVzIFBSIDcyNzEuCiAgICAgW1Rha2V0byBLYWJlIDxrYWJlIHNyYS10b2hva3UuY28uanA+IGFuZCAKICAgICAgQ2xpZmYgV29vbGxleSA8Y2xpZmZ3b29sbGV5IHlhaG9vLmNvbT5dCgogICopIEFkZCBhIGNvdXBsZSBvZiBHQ0MgYXR0cmlidXRlIHRhZ3MgdG8gcHJpbnRmIHN0eWxlIGZ1bmN0aW9ucy4KICAgICBbSm9uIFRyYXZpcyA8anRyYXZpcyBjb3ZhbGVudC5uZXQ+XQoKICAqKSBBZGQgdGhlIGNvcnJlY3QgbGFuZ3VhZ2UgdGFnIGZvciBpbnRlcm9wZXJhdGlvbiB3aXRoIHRoZSBUYWl3YW5lc2UKICAgICB2ZXJzaW9ucyBvZiBNU0lFIGFuZCBOZXRzY2FwZS4gW0NsaXZlIExpbiA8Y2xpdmUgQ2lyWC5PUkc+XSBQUiM3MTQyCgogICopIE1pZ3JhdGUgdGhlIHBlcmNoaWxkIE1QTSB0byB1c2UgdGhlIG5ldyBhcHIgc2lnbmFsIGNoaWxkLCBhbmQgCiAgICAgQVBSIHRocmVhZCBmdW5jdGlvbnMuICBbUnlhbiBCbG9vbV0KCiAgKikgQ2xvc2Ugb25lIGNvcHkgb2YgdGhlIENHSSdzIHN0ZG91dCBiZWZvcmUgY3JlYXRpbmcgdGhlIG5ldyBwcm9jZXNzLgogICAgIFRoZSBDR0kgd2lsbCBzdGlsbCBoYXZlIHN0ZG91dCwgYmVjYXVzZSB3ZSBoYXZlIGFscmVhZHkgZHVwJ2VkIGl0LgogICAgIFRoaXMga2VlcHMgQXBhY2hlIGZyb20gd2FpdGluZyBmb3JldmVyIHRvIHNlbmQgdGhlIHJlc3VsdHMgb2YgYSBDR0kKICAgICBwcm9jZXNzIHRoYXQgaGFzIGZvcmtlZCBhIGxvbmctbGl2ZWQgY2hpbGQgcHJvY2Vzcy4KICAgICBbVGFrZXRvIEthYmUgPGthYmUgc3JhLXRvaG9rdS5jby5qcD5dCgogICopIFJlbW92ZSB0aGUgcmVzdCBvZiB0aGUgcHRocmVhZHMgZnVuY3Rpb25zIGZyb20gdGhlIHRocmVhZGVkIE1QTS4KICAgICBUaGlzIHJlcXVpcmVzIHRoZSBBUFIgc3VwcG9ydCBmb3IgYSBzaWduYWwgdGhyZWFkIHRoYXQgd2FzIGp1c3QKICAgICBhZGRlZC4gIFtSeWFuIEJsb29tXQoKICAqKSBNYWtlIG1vZF9kaXIgdXNlIGEgZml4dXAgZm9yIHNlbmRpbmcgYSByZWRpcmVjdCB0byB0aGUgYnJvd3Nlci4KICAgICBCZWZvcmUgdGhpcywgd2Ugd2VyZSB1c2luZyBhIGhhbmRsZXIsIHdoaWNoIGRvZXNuJ3QgbWFrZSBtdWNoCiAgICAgc2Vuc2UsIGJlY2F1c2UgdGhlIGhhbmRsZXIgd2Fzbid0IGdlbmVyYXRpbmcgYW55IGRhdGEsIGl0IHdvdWxkCiAgICAgZWl0aGVyIHJldHVybiBhIHJlZGlyZWN0IGVycm9yIGNvZGUsIG9yIERFQ0xJTkVELiAgVGhpcyBmaXRzIHRoZQogICAgIGN1cnJlbnQgaG9va3MgYmV0dGVyLiAgW1J5YW4gTW9yZ2FuIDxybW9yZ2FuIGNvdmFsZW50Lm5ldD5dCgogICopIE1ha2UgdGhlIHRocmVhZGVkIE1QTSB1c2UgQVBSIHRocmVhZHMgaW5zdGVhZCBvZiBwdGhyZWFkcy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgR2V0IG1vZF90bHMgdG8gdGhlIHBvaW50IHdoZXJlIGl0IGFjdHVhbGx5IGFwcGVhcnMgdG8gd29yayBpbiBhbGwgY2FzZXMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIGltcGxlbWVudCAtLWVuYWJsZS1tb2R1bGVzIGFuZCAtLWVuYWJsZS1tb2RzLXNoYXJlZCBmb3IgImFsbCIgYW5kCiAgICAgIm1vc3QiLiAgW0dyZWcgU3RlaW5dCgogICopIE1vdmUgdGhlIHRocmVhZGVkIE1QTSB0byB1c2UgQVBSIGxvY2tzIGluc3RlYWQgb2YgcHRocmVhZCBsb2Nrcy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgUmVuYW1lIG1wbXRfcHRocmVhZCB0byB0aHJlYWRlZC4gIFRoaXMgaXMgbW9yZSBpbiBsaW5lIHdpdGggdGhlCiAgICAgZmFjdCB0aGF0IG1wbXRfcHRocmVhZCBzaG91bGRuJ3QgYmUgdXNpbmcgcHRocmVhZHMgZGlyZWN0bHksIGFuZAogICAgIGl0IGlzIGEgc21hbGxlciBuYW1lIHRoYXQgZG9lc24ndCB0aWUgaW50byBhbnl0aGluZy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgUmVuYW1lIHRoZSBtb2R1bGUgc3RydWN0dXJlcyBzbyB0aGF0IHRoZSBleHBvcnRlZCBzeW1ib2wgbWF0Y2hlcwogICAgIHRoZSBmaWxlIG5hbWUsIGFuZCBpdCBpcyBlYXNpZXIgdG8gYXV0b21hdGUgdGhlIGluc3RhbGxhdGlvbgogICAgIHByb2Nlc3MgKGdlbmVyYXRpbmcgTG9hZE1vZHVsZSBkaXJlY3RpdmVzIGZyb20gdGhlIG1vZHVsZSBmaWxlbmFtZXMpLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgUmVtb3ZlIHRoZSBjb2FsZXNjZSBmaWx0ZXIuICBXaXRoIHRoZSBhcF9mKiBmdW5jdGlvbnMsIHRoaXMgZmlsdGVyCiAgICAgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gW1J5YW4gQmxvb21dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMC4xMQoKICAqKSBSZW1vdmUgdGhlIGRleHRlciBNUE0uICBQZXJjaGlsZCBpcyB0aGUgc2FtZSBiYXNpYyBpZGVhLCBidXQgaXQgaGFzIHRoZQogICAgIGFkZGVkIGZlYXR1cmUgb2YgYWxsb3dpbmcgYSB1aWQvZ2lkIHBlciBjaGlsZCBwcm9jZXNzLiAgSWYgbm8KICAgICB1aWQvZ2lkIGlzIHNwZWNpZmllZCwgdGhlbiBQZXJjaGlsZCBiZWhhdmVzIGV4YWN0bHkgbGlrZSBkZXh0ZXIuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEdldCBwZXJjaGlsZCBidWlsZGluZyBhZ2Fpbi4gW1J5YW4gQmxvb21dCgogICopIERvbid0IGRpc2FibGUgdGhyZWFkcyBqdXN0IGJlY2F1c2Ugd2UgYXJlIHVzaW5nIHRoZSBwcmVmb3JrIE1QTS4KICAgICBJZiBzb21lYm9keSB3YW50cyB0byBjb21waWxlIHdpdGhvdXQgdGhyZWFkcywgdGhleSBtdXN0IG5vdyBhZGQKICAgICAtLWRpc2FibGUtdGhyZWFkcyB0byB0aGUgY29uZmlndXJlIGNvbW1hbmQgbGluZS4gIFtSeWFuIEJsb29tXQoKICAqKSBCZWdpbiB0byBtb3ZlIHRoZSBjYWxscyB0byB1cGRhdGVfY2hpbGRfc3RhdHVzIGludG8gY29tbW9uIGNvZGUsIHNvCiAgICAgdGhhdCBlYWNoIGluZGl2aWR1YWwgTVBNIGRvZXMgbm90IG5lZWQgdG8gdXBkYXRlIHRoZSBzY29yZWJvYXJkIGl0c2VsZi4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQWxsb3cgbW9kX3RscyB0byBjb21waWxlIHVuZGVyIFVuaXggYm94ZXMgd2hlcmUgb3BlbnNzbCBoYXMgYmVlbgogICAgIGluc3RhbGxlZCB0byB0aGUgc3lzdGVtIGluY2x1ZGUgZmlsZXMuCiAgICAgW0dvbWV6IEhlbnJpIDxuZXctaHR0cGQgc2xpYi5mcj5dCgogICopIENsZWFudXAgdGhlIG1vZF90bHMgY29uZmlndXJlIHByb2Nlc3MuICBUaGlzIHNob3VsZCByZW1vdmUgYW55IG5lZWQKICAgICB0byBoYW5kLWVkaXQgYW55IGZpbGVzLiAgV2UgcmVxdWlyZSBPcGVuU1NMIDAuOS42IG9yIGxhdGVyLCBidXQgCiAgICAgY29uZmlndXJlIGRvZXNuJ3QgY2hlY2sgdGhhdCB5ZXQuICBbUnlhbiBCbG9vbV0KCiAgKikgQWRkIGEgdmVyeSBlYXJseSBwcm90b3R5cGUgb2YgU1NMIHN1cHBvcnQgKGluIG1vZF90bHMuYykuIEl0IGlzCiAgICAgdml0YWwgdGhhdCB5b3UgcmVhZCBtb2R1bGVzL3Rscy9SRUFETUUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gYnVpbGQKICAgICBpdC4gW0JlbiBMYXVyaWVdCgogICopIEZpeCBhIHBvdGVudGlhbCBzZWcgZmF1bHQgb24gYWxsIHBsYXRmb3Jtcy4gIERhdmlkIFJlaWQgZml4ZWQgdGhpcwogICAgIG9uIEJFT1MsIGJ1dCB0aGUgcHJvYmxlbSBjb3VsZCBoYXBwZW4gYW55d2hlcmUsIHNvIHdlIGRvbid0IHdhbnQKICAgICB0byAjaWZkZWYgaXQuIFtDbGlmZiBXb29sbGV5IDxjbGlmZndvb2xsZXkgeWFob28uY29tPl0KIAogICopIEFkZCBuZXcgTG9nRm9ybWF0IGRpcmVjdGl2ZSwgJUQsIHRvIGxvZyB0aW1lIGl0IHRha2VzIHRvIHNlcnZlIGEKICAgICByZXF1ZXN0IGluIG1pY3Jvc2Vjb25kcy4gW0JpbGwgU3RvZGRhcmRdCgogICopIENoYW5nZSBBZGRJbnB1dEZpbHRlciBhbmQgQWRkT3V0cHV0RmlsdGVyIHRvIFNldElucHV0RmlsdGVyIGFuZAogICAgIFNldE91dHB1dEZpbHRlci4gIFRoaXMgY29ycmVzcG9uZHMgbmljZWx5IHdpdGggdGhlIG90aGVyIFNldCAKICAgICBkaXJlY3RpdmVzLCB3aGljaCBvcGVyYXRlIG9uIGNvbnRhaW5lcnMgd2hpbGUgdGhlIEFkZCogZGlyZWN0aXZlcwogICAgIHRlbmQgdG8gd29yayBkaXJlY3RseSBvbiBleHRlbnNpb25zLiAgW1J5YW4gQmxvb21dCgogICopIENsZWFudXAgdGhlIGhlYWRlciBoYW5kbGluZyBhIGJpdC4gIFRoaXMgdXNlcyB0aGUgYXByX2JyaWdhZGVfKgogICAgIGZ1bmN0aW9ucyBmb3IgdGhlIGJ1ZmZlcmluZyBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gY29tcHV0ZQogICAgIHRoZSBsZW5ndGggb2YgdGhlIGhlYWRlcnMgYmVmb3JlIHdlIGFjdHVhbGx5IGNyZWF0ZSB0aGUgaGVhZGVyCiAgICAgYnVmZmVyLiAgW1J5YW4gQmxvb21dCgogICopIEFsbG93IGZpbHRlcnMgdG8gYnVmZmVyIGRhdGEgdXNpbmcgdGhlIGFwX2YqIGZ1bmN0aW9ucy4gIFRoZXNlIGhhdmUKICAgICBiZWNvbWUgbWFjcm9zIHRoYXQgcmVzb2x2ZSBkaXJlY3RseSB0byBhcHJfYnJpZ2FkZV8qLiAgCiAgICAgW1J5YW4gQmxvb21dCgogICopIEdldCB0aGUgVW5peCBNUE0ncyB0byBkbyBhIGdyYWNlZnVsIHJlc3RhcnQgYWdhaW4uICBJZiB3ZSBhcmUgZ29pbmcKICAgICB0byByZWdpc3RlciBhIGNsZWFudXAgd2l0aCBhcF9jbGVhbnVwX3Njb3JlYm9hcmQsIHRoZW4gd2UgaGF2ZSB0bwogICAgIGtpbGwgdGhlIGNsZWFudXAgd2l0aCB0aGUgc2FtZSBmdW5jdGlvbiwgIGFuZCB0aGF0IGZ1bmN0aW9uIGNhbid0IGJlCiAgICAgc3RhdGljLiAgW1J5YW4gQmxvb21dCgogICopIEluc3RhbGwgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcy4gIFdpdGhvdXQgdGhlc2UsIGl0IHdhcyBub3QKICAgICBwb3NzaWJsZSB0byBjb21waWxlIHNvbWUgbW9kdWxlcyBvdXRzaWRlIG9mIHRoZSBzZXJ2ZXIuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEZpeCB0aGUgQWxpYXNNYXRjaCBkaXJlY3RpdmUgaW4gQXBhY2hlIDIuMC4gIFdoZW4gd2UgYnJvdWdodCBhIHBhdGNoCiAgICAgZm9yd2FyZCBmcm9tIDEuMyB0byAyLjAsIHdlIG1pc3NlZCBhIHNpbmdsZSBsaW5lLCB3aGljaCBicm9rZSByZWdleAogICAgIGFsaWFzZXMuICBbUnlhbiBCbG9vbV0KCiAgKikgV2UgaGF2ZSBhIHBvb3IgYWJzdHJhY3Rpb24gaW4gdGhlIHByb3RvY29sLiAgVGhpcyBpcyBhIHRlbXBvcmFyeQogICAgIGhhY2sgdG8gZml4IHRoZSBidWcsIGJ1dCBpdCB3aWxsIG5lZWQgdG8gYmUgZml4ZWQgZm9yIHJlYWwuICBJZgogICAgIHdlIGZpbmQgYW4gZXJyb3Igd2hpbGUgc2VuZGluZyBvdXQgYSBjdXN0b20gZXJyb3IgcmVzcG9uc2UsIHdlIGJhY2sKICAgICB1cCB0byB0aGUgZmlyc3Qgbm9uLU9LIHJlcXVlc3QgYW5kIHNlbmQgdGhlIGRhdGEuICBUaGVuLCB3aGVuIHdlIHNlbmQKICAgICB0aGUgRU9TIGZyb20gZmluYWxpemVfcmVxdWVzdF9wcm90b2NvbCwgd2UgZ28gdG8gdGhlIGxhc3QgcmVxdWVzdCwKICAgICB0byBlbnN1cmUgdGhhdCB3ZSBhcmVuJ3Qgc2VuZGluZyBhbiBFT1MgdG8gYSByZXF1ZXN0IHRoYXQgaGFzIGFscmVhZHkKICAgICByZWNlaXZlZCBvbmUuICBCZWNhdXNlIHRoZSBkYXRhIGlzIHNlbnQgb24gYSBkaWZmZXJlbnQgcmVxdWVzdCB0aGFuCiAgICAgdGhlIEVPUywgdGhlIGVycm9yIHRleHQgbmV2ZXIgZ2V0cyBzZW50IGRvd24gdGhlIGZpbHRlciBzdGFjay4gIFRoaXMKICAgICBmaXhlcyB0aGUgcHJvYmxlbSBieSBmaW5kaW5nIHRoZSBsYXN0IHJlcXVlc3QsIGFuZCBzZW5kaW5nIHRoZSBkYXRhCiAgICAgd2l0aCB0aGF0IHJlcXVlc3QuICBbUnlhbiBCbG9vbV0KCiAgKikgTWFrZSB0aGUgc2VydmVyIHN0YXR1cyBwYWdlIHNob3cgdGhlIGNvcnJlY3QgcmVzdGFydCB0aW1lLCBhbmQKICAgICB0aHVzIHRoZSBwcm9wZXIgdXB0aW1lLiBbUnlhbiBCbG9vbV0KCiAgKikgTW92ZSB0aGUgQ0dJIGNyZWF0aW9uIGxvZ2ljIGZyb20gbW9kX2luY2x1ZGUgdG8gbW9kX2NnaShkKS4gIFRoaXMKICAgICBzaG91bGQgcmVkdWNlIHRoZSBhbW91bnQgb2YgZHVwbGljYXRlIGNvZGUgdGhhdCBpcyByZXF1aXJlZCB0bwogICAgIGNyZWF0ZSBDR0kgcHJvY2Vzc2VzLgogICAgIFtQYXVsIEouIFJlZGVyIDxyZWRlcnBqIHJhbGVpZ2guaWJtLmNvbT5dCgogICopIGFwX25ld19jb25uZWN0aW9uKCkgY2xvc2VzIHRoZSBzb2NrZXQgYW5kIHJldHVybnMgTlVMTCBpZiBhIHNvY2tldAogICAgIGNhbGwgZmFpbHMuICBVc3VhbGx5IHRoaXMgaXMgZHVlIHRvIGEgY29ubmVjdGlvbiB3aGljaCBoYXMgYmVlbiAKICAgICByZXNldC4gIFtKZWZmIFRyYXdpY2tdCgogICopIE1vdmUgdGhlIEFwYWNoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIG91dCBvZiBodHRwZC5oIGFuZCBpbnRvIHJlbGVhc2UuaC4KICAgICBUaGlzIGlzIGluIHByZXBhcmF0aW9uIGZvciB0aGUgZmlyc3QgdGFnIHdpdGggdGhlIG5ldyB0YWcgYW5kIHJlbGVhc2UKICAgICBzeXN0ZW0uICBbUnlhbiBCbG9vbV0KCiAgKikgQmVnaW4gcmVzdHJ1Y3R1cmluZyBzY29yZWJvYXJkIGNvZGUgdG8gZW5hYmxlIGFkZGluZyBiYWNrIGluCiAgICAgdGhlIGFiaWxpdHkgdG8gdXNlIElQQyBvdGhlciB0aGFuIHNoYXJlZCBtZW1vcnkuCiAgICAgR2V0IG1vZF9zdGF0dXMgd29ya2luZyBvbiBXaW5kb3dzIGFnYWluLiBbQmlsbCBTdG9kZGFyZF0KCiAgKikgTWFrZSBtb2Rfc3RhdHVzIHdvcmsgd2l0aCAyLjAuICBUaGlzIHdpbGwgd29yayBmb3IgcHJlZm9yaywKICAgICBtcG10X3B0aHJlYWQsIGFuZCBkZXh0ZXIuICBbUnlhbiBCbG9vbV0KCiAgKikgQ29ycmVjdCBhIHR5cG8gaW4gaHR0cGQuY29uZi4KICAgICBbS3VuaWhpcm8gVGFuYWthIDx0YW5ha2EgYXBhY2hlLm9yLmpwPl0gUFIjNzE1NCAKCiAgKikgUmVhbGx5IGZpeCBtb2RfcmV3cml0ZSBtYXAgbG9va3VwcyB0aGlzIHRpbWUuIFtUb255IEZpbmNoXQoKICAqKSBHZXQgdGhlIGNvcnJlY3QgSVAgYWRkcmVzcyBpZiBTZXJ2ZXJOYW1lIGlzbid0IHNldCBhbmQgd2UgY2FuJ3QKICAgICBmaW5kIGEgZnVsbHktcXVhbGlmaWVkIGRvbWFpbiBuYW1lIGF0IHN0YXJ0dXAuCiAgICAgUFIjNzE3MCBbRGFuZWsgRHV2YWxsIDxkZHV2YWxsIGVuZy5zdW4uY29tPl0KCiAgKikgTWFrZSBtb2RfY2dpZCB3b3JrIHdpdGggU3VFeGVjLiAgW1J5YW4gQmxvb21dCgogICopIEFkb3B0IGFwciB1c2VyL2dyb3VwIG5hbWUgZmVhdHVyZXMgZm9yIG1vZF9yZXdyaXRlLiAgRWxpbWluYXRlcyBzb21lCiAgICAgJ2V4dHJhJyBzdGF0J3MgZm9yIHVzZXIvZ3JvdXAgc2luY2UgdGhleSBzaG91bGQgbmV2ZXIgb2NjdXIsIGFuZCBub3cKICAgICByZXNvbHZlcyB0aGUgU0NSSVBUX1VTRVIgYW5kIFNDUklQVF9HUk9VUCwgaW5jbHVkaW5nIG9uIFdpbk5UIE5URlMKICAgICB2b2x1bWVzLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQWRvcHQgYXByIGZlYXR1cmVzIHRvIHNpbXBsaWZ5IG1vZF9pbmNsdWRlcy4gIFRoaXMgY2hhbmdlcyB0aGUKICAgICBiZWhhdmlvciBvZiB0aGUgVVNFUl9OQU1FIHZhcmlhYmxlLCB1bmtub3duIHVpZCdzIGFyZSBub3cgcmVwb3J0ZWQKICAgICBhcyBVU0VSX05BTUU9Ijx1bmtub3duPiIgcmF0aGVyIHRoYW4gdGhlIG9sZCB1c2VyIzAwMCByZXN1bHQuCiAgICAgV2luTlQgbm93IHJlc29sdmVzIFVTRVJfTkFNRSBvbiBOVEZTIHZvbHVtZXMuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBBZG9wdCBhcHIgZmVhdHVyZXMgZm9yIHNpbXBsaWZpbmcgbW9kX3VzZXJkaXIsIGFuZCBhY2NlcHQgdGhlIG5ldwogICAgIFdpbjMyL09TMiBleGNlcHRpb25zIHdpdGhvdXQgaGljY3VwaW5nLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgUmVwbGFjZSBjb25maWd1cmUgLS13aXRoLW9wdGltIG9wdGlvbiBieSB1c2luZyBhbmQgc2F2aW5nIHRoZQogICAgIGVudmlyb25tZW50IHZhcmlhYmxlIE9QVElNIGluc3RlYWQuICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGNvbmZpZ3VyZQogICAgIG9wdGlvbnMgZG8gbm90IHN1cHBvcnQgbXVsdGlwbGUgZmxhZ3Mgc2VwYXJhdGVkIGJ5IHNwYWNlcy4KICAgICBbUm95IEZpZWxkaW5nXQoKICAqKSBGaXggc29tZSBieXRlcmFuZ2UgaGFuZGxpbmcuICBJZiB3ZSBnZXQgYSBieXRlIHJhbmdlIHRoYXQgbG9va3MgbGlrZQogICAgICItOTk5OTk5IiB3aGVyZSB0aGF0IGlzIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZSwgd2Ugc2hvdWxkIHJldHVybiAKICAgICBhIFBBUlRJQUwgQ09OVEVOVCBzdGF0dXMgY29kZSwgYW5kIHJldHVybiB0aGUgd2hvbGUgZmlsZSBhcyBvbmUgYmlnCiAgICAgYnl0ZXJhbmdlLiAgVGhpcyBtYXRjaGVzIHRoZSAxLjMgaGFuZGxpbmcgbm93LiAgW1J5YW4gQmxvb21dCgogICopIE1ha2UgdGhlIGVycm9yIGJ1Y2tldCBhIHJlYWwgbWV0YS1kYXRhIGJ1Y2tldC4gIFRoaXMgbWVhbnMgdGhhdCB0aGUKICAgICBidWNrZXQgbGVuZ3RoIGlzIDAsIGFuZCBhIHJlYWQgcmV0dXJucyBOVUxMIGRhdGEuICBJZiBvbmUgb2YgdGhlc2UKICAgICBidWNrZXRzIGlzIHBhc3NlZCBkb3duIGFmdGVyIHRoZSBoZWFkZXJzIGFyZSBzZW50LCB0aGlzIGRhdGEgd2lsbAogICAgIGp1c3QgYmUgaWdub3JlZC4gIFtHcmVnIFN0ZWluXQoKICAqKSBUaGUgcHJlZm9yayBNUE0gd2Fzbid0IGtpbGxpbmcgY2hpbGQgcHJvY2Vzc2VzIGNvcnJlY3RseSBpZiBhIHJlc3RhcnQKICAgICBzaWduYWwgd2FzIHJlY2VpdmVkIHdoaWxlIHRoZSBwcm9jZXNzIHdhcyBzZXJ2aW5nIGEgcmVxdWVzdC4gIFRoZSBjaGlsZAogICAgIHByb2Nlc3Mgd291bGQgYmVjb21lIHRoZSBlcXVpdmFsZW50IG9mIGEgc2Vjb25kIHBhcmVudCBwcm9jZXNzLiAgSWYKICAgICB3ZSBicmVhayBvdXQgb2YgdGhlIGFjY2VwdCBsb29wLCB0aGVuIHdlIG5lZWQgdG8gZG8gZGllIGFmdGVyIGNsZWFuaW5nCiAgICAgdXAgYWZ0ZXIgb3Vyc2VsdmVzLiAgW1J5YW4gQmxvb21dCgogICopIENoYW5nZSB0aGUgUHJlZm9yayBNUE0gdG8gdXNlIFNJR1dJTkNIIGluc3RlYWQgb2YgU0lHVVNSMSBmb3IgZ3JhY2VmdWwKICAgICByZXN0YXJ0cy4gIFtSeWFuIEJsb29tXQoKICAqKSBNb2RpZnkgdGhlIGFwcl9zdGF0L2xzdGF0L2dldGZpbGVpbmZvIGNhbGxzIHdpdGhpbiBhcGFjaGUgdG8gdXNlCiAgICAgdGhlIG1vc3Qgb3B0aW1hbCBBUFJfRklORk9fd2FudGVkIGJpdHMuICBUaGlzIHNwYXJlcyBXaW4zMiBmcm9tCiAgICAgcGVyZm9ybWluZyB2ZXJ5IGV4cGVuc2l2ZSBvd25lciwgZ3JvdXAgYW5kIHBlcm1pc3Npb24gbG9va3VwcwogICAgIGFuZCBhbGxvd3MgdGhlIHNlcnZlciB0byBmdW5jdGlvbiB1bnRpbCB0aGVzZSBhcHJfZmluZm9fdCBmaWVsZHMKICAgICBhcmUgaW1wbGVtZW50ZWQgdW5kZXIgV2luMzIuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBTdXBwb3J0IGZvciB0eXBlZHNhZmUgb3B0aW9uYWwgZnVuY3Rpb25zIC0gdGhhdCBpcyBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkKICAgICBvcHRpb25hbCBtb2R1bGVzLCB3aGljaCwgdGhlcmVmb3JlLCBtYXkgb3IgbWF5IG5vdCBiZSBwcmVzZW50LCBkZXBlbmRpbmcKICAgICBvbiBjb25maWd1cmF0aW9uLiBTZWUgdGhlIGV4cGVyaW1lbnRhbCBtb2R1bGVzIG1vZF9vcHRpb25hbF9mbl97ZXgsaW19cG9ydAogICAgIGZvciBzYW1wbGUgY29kZS4gW0JlbiBMYXVyaWVdCgogICopIGZpbHRlcnMgY2FuIG5vdyByZXBvcnQgYW4gSFRUUCBlcnJvciB0byB0aGUgc2VydmVyLiAgVGhpcyBpcyBkb25lCiAgICAgYnkgc2VuZGluZyBhIGJyaWdhZGUgd2hlcmUgdGhlIGZpcnN0IGJ1Y2tldCBpcyBhbiBlcnJvcl9idWNrZXQuCiAgICAgVGhpcyBidWNrZXQgaXMgYSBzaW1wbGUgYnVja2V0IHRoYXQgc3RvcmVzIGFuIEhUVFAgZXJyb3IgYW5kCiAgICAgYSBzdHJpbmcuICBDdXJyZW50bHkgdGhlIHN0cmluZyBpcyBub3QgdXNlZCwgYnV0IGl0IG1heSBiZSBuZWVkZWQKICAgICB0byBvdXRwdXQgYW4gZXJyb3IgbG9nLiAgVGhlIGh0dHBfaGVhZGVyX2ZpbHRlciB3aWxsIGZpbmQgdGhpcwogICAgIGJ1Y2tldCwgYW5kIG91dHB1dCB0aGUgZXJyb3IgdGV4dCwgYW5kIHRoZW4gcmV0dXJuIAogICAgIEFQX0ZJTFRFUl9FUlJPUiwgd2hpY2ggaW5mb3JtcyB0aGUgc2VydmVyIHRoYXQgdGhlIGVycm9yIHdlYiBwYWdlCiAgICAgaGFzIGFscmVhZHkgYmVlbiBzZW50LiAgW1J5YW4gQmxvb21dCgogICopIElmIHdlIGdldCBhbiBlcnJvciwgdGhlbiB3ZSBzaG91bGQgcmVtb3ZlIGFsbCBmaWx0ZXJzIGV4Y2VwdCBmb3IKICAgICB0aG9zZSBjcml0aWNhbCB0byBzZXJ2aW5nIGEgd2ViIHBhZ2UuICBUaGlzIGZpeGVzIGEgYnVnLCB3aGVyZQogICAgIGVycm9yIHBhZ2VzIHdlcmUgZ29pbmcgdGhyb3VnaCB0aGUgYnl0ZXJhbmdlIGZpbHRlciwgZXZlbiB0aG91Z2gKICAgICB0aGF0IG1hZGUgbm8gc2Vuc2UuICBbUnlhbiBCbG9vbV0KCiAgKikgUmVsYXggdGhlIHN5bnRheCBjaGVja2luZyBvZiBIb3N0OiBoZWFkZXJzIGluIG9yZGVyIHRvIHN1cHBvcnQKICAgICBpRE5TLiBQUiM2NjM1IFtUb255IEZpbmNoXQoKICAqKSBDbGVhbnVwIHRoZSBieXRlcmFuZ2UgZmlsdGVyIHRvIHVzZSB0aGUgYXByX2JyaWdhZGVfcGFydGl0aW9uCiAgICAgYW5kIGFwcl9idWNrZXRfY29weSBmdW5jdGlvbnMuICBUaGlzIHJlbW92ZXMgYSBsb3Qgb2YgdmVyeSBtZXNzeQogICAgIGNvZGUsIGFuZCBob3BlZnVsbHkgbWFrZXMgdGhpcyBmaWx0ZXIgbW9yZSBzdGFibGUuCiAgICAgW1J5YW4gQmxvb21dCgogICopIFJlbW92ZSBBZGRNb2R1bGUgYW5kIENsZWFyTW9kdWxlTGlzdCBkaXJlY3RpdmVzLiAgQm90aCBvZiB0aGVzZQogICAgIGRpcmVjdGl2ZXMgd2VyZSB1c2VkIHRvIGVuc3VyZSB0aGF0IG1vZHVsZXMgY291bGQgYmUgZW5hYmxlZAogICAgIGluIHRoZSBjb3JyZWN0IG9yZGVyLiAgVGhhdCByZXF1aXJlbWVudCBpcyBub3cgZ29uZSwgYmVjYXVzZQogICAgIHdlIHVzZSBob29rcyB0byBlbnN1cmUgdGhhdCBtb2R1bGVzIGFyZSBpbiB0aGUgY29ycmVjdCBvcmRlci4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgV2hlbiBTdUV4ZWMgaXMgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIGFkZCBpdCB0byB0aGUgbGlzdCBvZgogICAgIHRhcmdldHMgdG8gYmUgYnVpbHQuICBJZiB3ZSBkb24ndCwgdGhlbiBhbnkgY2hhbmdlcyB0byB0aGUKICAgICBjb25maWd1cmF0aW9uIHdvbid0IGFmZmVjdCBTdUV4ZWMsIHVubGVzcyAnbWFrZSBzdWV4ZWMnIGlzCiAgICAgc3BlY2lmaWNhbGx5IHJ1bi4gIFtSeWFuIEJsb29tXQoKICAqKSBDbGVhbmVkIG91dCBvcGVuX2ZpbGUgZnJvbSBtb2RfZmlsZV9jYWNoZSwgYXMgYXByIG5vdyBhY2NlcHRzCiAgICAgdGhlIEFQUl9YVEhSRUFEIGFyZ3VtZW50IHRvIG9wZW4gYSBmaWxlIGZvciBjb25zdW1wdGlvbiBieQogICAgIHBhcmFsbGVsIHRocmVhZHMgb24gd2luMzIuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBDb3JyZWN0IGEgYnVnIGluIGRldGVybWluaW5nIHdoZW4gd2UgZm9sbG93IHN5bWxpbmtzLiAgVGhlIGNvZGUKICAgICBleHBlY3RlZCBhIHN0YXQgLTEgcmVzdWx0LCBub3QgYW4gYXByX3N0YXR1c190IHBvc2l0aXZlIGVycm9yLgogICAgIEFsc28gY2hlY2sgaWYgdGhlIEFQUl9GSU5GT19VU0VSIGZpZWxkcyBhcmUgdmFsaWQgYmVmb3JlIHdlCiAgICAgZm9sbG93IHRoZSBsaW5rLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgTW92ZSBpbml0Z3JvdXBncywgYXBfdW5hbWUyaWQgYW5kIGFwX2duYW1lMmlkIGZyb20gdXRpbC5jIHRvCiAgICAgbXBtX2NvbW1vbi5jLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IHZhbGlkIG9uIHNvbWUgcGxhdGZvcm1zLAogICAgIHNvIHRoZXkgc2hvdWxkIG5vdCBiZSBpbiB0aGUgbWFpbi1saW5lIGNvZGUuIFtSeWFuIEJsb29tXQoKICAqKSBSZW1vdmUgYXBfY2hkaXJfZmlsZSgpLiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgdGhyZWFkLXNhZmUsCiAgICAgYW5kIG5vYm9keSBpcyBjdXJyZW50bHkgdXNpbmcgaXQuICBbUnlhbiBCbG9vbV0KCiAgKikgRG8gbm90IHRyeSB0byBydW4gbWFrZSBkZXBlbmQgaWYgdGhlcmUgYXJlIG5vIC5jIGZpbGVzIGluIHRoZQogICAgIGN1cnJlbnQgZGlyZWN0b3J5LCBkb2luZyBzbyBtYWtlcyBgbWFrZSBkZXBlbmRgIGZhaWwuCiAgICAgW1J5YW4gQmxvb21dCgogICAqKSBVcGRhdGUgaGlnaHBlcmZvcm1hbmNlLmNvbmYgdG8gd29yayB3aXRoIGVpdGhlciBwcmVmb3JrIG9yCiAgICAgIHB0aHJlYWRzIG1wbXMuICBbR3JlZyBBbWVzXSAKCiAgKikgU3RvcCBjaGVja2luZyB0byBzZWUgaWYgdGhpcyBpcyBhIHBpcGVsaW5lZCByZXF1ZXN0IGlmIHdlIGtub3cKICAgICBmb3IgYSBmYWN0IHRoYXQgaXQgaXNuJ3QuICBCYXNpY2FsbHksIGlmIHItPmNvbm5lY3Rpb24tPmtlZXBhbGl2ZSA9PSAwLgogICAgIFRoaXMga2VlcHMgdXMgZnJvbSBtYWtpbmcgYW4gZXh0cmEgcmVhZCBjYWxsIHdoZW4gc2VydmluZyBhIDEuMAogICAgIHJlcXVlc3QuICBbUnlhbiBCbG9vbSBhbmQgR3JlZyBTdGVpbl0KCiAgKikgRml4IHRoZSBoYW5kbGluZyBvZiB2YXJpYWJsZSBleHBhbnNpb24gbG9vay1haGVhZCBpbiBtb2RfcmV3cml0ZSwKICAgICBpLmUuIHN5bnRheCBsaWtlICV7TEEtVTpSRU1PVEVfVVNFUn0sIGFuZCBhbHNvIGZpeCB0aGUgcGFyc2luZyBvZgogICAgIG1vcmUgY29tcGxpY2F0ZWQgbmVzdGVkIFJld3JpdGVNYXAgbG9va3Vwcy4gUFIjNzA4NyBbVG9ueSBGaW5jaF0KCiAgKikgRml4IHRoZSBSRkMgbnVtYmVyIG1lbnRpb25lZCB3aGVuIGNvbXBsYWluaW5nIGFib3V0IGEgbWlzc2luZwogICAgIEhvc3Q6IGhlYWRlci4gUFIjNzA3OSBbQWxleGV5IFRvcHR5Z2luIDxhbGV4ZXl0IHdhbS51bWQuZWR1Pl0KCiAgKikgRml4IGFuIGVuZGxlc3MgbG9vcCBpbiBhYiB3aGljaCBvY2N1cnJlZCB3aGVuIGFiIHdhcyBwb3N0aW5nCiAgICAgYW5kIHRoZSBzZXJ2ZXIgZHJvcHBlZCB0aGUgY29ubmVjdGlvbiB1bmV4cGVjdGVkbHkuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IGEgc2VnZmF1bHQgd2hpbGUgaGFuZGxpbmcgcmVxdWVzdCBib2RpZXMgaW4gYXBfaHR0cF9maWx0ZXIoKS4gIAogICAgIFRoaXMgcHJvYmxlbSBoYXMgYmVlbiBzZWVuIHdpdGggbW9kX2RhdiB1c2FnZSBhcyB3ZWxsIGFzIHdpdGggCiAgICAgcmVxdWVzdHMgd2hlcmUgdGhlIGJvZHkgd2FzIGp1c3QgYmVpbmcgZGlzY2FyZGVkLiAgW0plZmYgVHJhd2lja10KCiAgKikgU29tZSBhZGp1c3RtZW50IG9uIHRoZSBoYW5kbGluZyBhbmQgYXV0b21hdGljIHNldHRpbmcgKHZpYQogICAgIGhpbnRzLm00KSBvZiB2YXJpb3VzIGNvbXBpbGF0aW9uIGZsYWdzIChlZzogQ0ZMQUdTKS4gQWxzbywKICAgICBhZGQgdGhlIGNhcGFiaWxpdHkgdG8gc3BlY2lmeSBmbGFncyAoTk9URVNUX0NGTEFHUyBhbmQKICAgICBOT1RFU1RfTERGTEFHUykgd2hpY2ggYXJlIHVzZWQgdG8gY29tcGlsZSBBcGFjaGUsIGJ1dAogICAgIG5vdCB1c2VkIGR1cmluZyB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzLiBVc2VmdWwgZm9yCiAgICAgZmxhZ3MgbGlrZSAiLVdlcnJvciIuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBTdG9wIHVzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBmb3JjZSBkZWJ1ZyBtb2RlIG9yCiAgICAgbm8gZGV0YWNoLiAgV2Ugbm93IHVzZSB0aGUgLUQgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHRvIAogICAgIHNwZWNpZnkgdGhlIGNvcnJlY3QgbW9kZS4gIC1ET05FX1BST0NFU1MgYW5kIC1ETk9fREVUQUNILgogICAgIFtHcmVnIFN0ZWluLCBSeWFuIEJsb29tXQoKICAqKSBDaGFuZ2UgaGFuZGxlcnMgdG8gdXNlIGhvb2tzLiBbQmVuIExhdXJpZV0KCiAgKikgU3RvcCByZXR1cm5pbmcgY29waWVzIG9mIGZpbGVuYW1lcyBmcm9tIGJvdGggYXByX2ZpbGVfdCBhbmQKICAgICBhcHJfZGlyX3QuICBXZSBwc3RyZHVwIHRoZSBmaWxlbmFtZXMgdGhhdCB3ZSBzdG9yZSBpbiB0aGUKICAgICBhY3R1YWwgc3RydWN0dXJlcywgc28gd2UgZG9uJ3QgbmVlZCB0byBwc3RyZHVwIHRoZSBzdHJpbmdzIGFnYWluLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBtb2RfY2dpOiBGaXggc29tZSBwcm9ibGVtcyB3aGVyZSB0aGUgd3JvbmcgZXJyb3IgdmFsdWUgd2FzIGJlaW5nCiAgICAgdHJhY2VkLiAgW0plZmYgVHJhd2lja10KCiAgKikgRUJDRElDOiBGaXggc29tZSBtaXNzaW5nIEFTQ0lJIGNvbnZlcnNpb24gb24gc29tZSBwcm90b2NvbCBkYXRhLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZCBnZW5lcmljIGhvb2tzLiBbQmVuIExhdXJpZV0KCiAgKikgVXNlIGEgcmVhbCBwb29sIHRvIGR1cCB0aGUgZXJyb3IgbG9nIGRlc2NyaXB0b3IuICBbUnlhbiBCbG9vbV0KCiAgKikgRml4IGEgc2VnZmF1bHQgY2F1c2VkIGJ5IG1vZF9leHRfZmlsdGVyIHdoZW4gdGhlIGV4dGVybmFsIGZpbHRlciAKICAgICBwcm9ncmFtIGRvZXMgbm90IGV4aXN0LiBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggYW4gb3V0cHV0IHRydW5jYXRpb24gZXJyb3Igd2hlbiBvbiBhbiBIVFRQID49IDEuMCByZXF1ZXN0IGFuCiAgICAgb2JqZWN0IG9mIHNpemUgYmV0d2VlbiBERUZBVUxUX0JVQ0tFVF9TSVpFIGFuZCBBUF9NSU5fQllURVNfVE9fV1JJVEUgCiAgICAgd2FzIHNlcnZlZCB0aHJvdWdoIG1vZF9jaGFyc2V0X2xpdGUgKG9yIGFueXRoaW5nIGVsc2UgdGhhdCB3b3VsZAogICAgIGNyZWF0ZSBhIHRyYW5zaWVudCBidWNrZXQgaW4gdGhpcyBzaXplIHJhbmdlKS4gIGFwX2J1Y2tldF9tYWtlX2hlYXAoKQogICAgIHNpbGVudGx5IGZhaWxlZCAoZml4ZWQpLCB0cmFuc2llbnRfc2V0YXNpZGUoKSBkaXNjb3ZlcmVkIGl0LCBidXQKICAgICBhcF9zYXZlX2JyaWdhZGUoKSBpZ25vcmVkIGl0IChmaXhlZCkuIFtKZWZmIFRyYXdpY2tdCiAgICAgCiAgKikgSWdub3JlIFxyXG4gb3IgXG4gd2hlbiB1c2luZyBQRUVLIG1vZGUgZm9yIGlucHV0IGZpbHRlcnMuICBUaGUgcHJvYmxlbQogICAgIGlzIHRoYXQgc29tZSBicm93c2VycyBzZW5kIGV4dHJhIGxpbmVzIGF0IHRoZSBlbmQgb2YgUE9TVCByZXF1ZXN0cywgYW5kCiAgICAgd2UgZG9uJ3Qgd2FudCB0byBkZWxheSBzZW5kaW5nIGRhdGEgYmFjayB0byB0aGUgdXNlciBqdXN0IGJlY2F1c2UgdGhlCiAgICAgYnJvd3NlciBpc24ndCB3ZWxsIGJlaGF2ZWQuIFtSeWFuIEJsb29tXQoKICAqKSBHZXQgU3VFWEVDIHdvcmtpbmcgYWdhaW4uICBXZSBjYW4ndCBzZW5kIGFic29sdXRlIHBhdGhzIHRvIHN1RXhlYwogICAgIGJlY2F1c2UgaXQgcmVmdXNlcyB0byBleGVjdXRlIHRob3NlIHByb2dyYW1zLiAgU3VFWEVDIGFsc28gd2Fzbid0CiAgICAgYWx3YXlzIHJlY29nbml6aW5nIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBtYWRlIHVzaW5nIHRoZSBhdXRvY29uZgogICAgIHNldHVwLiAgW1J5YW4gQmxvb21dCgogICopIEFsbG93IHRoZSBidWlsZGNvbmYgcHJvY2VzcyB0byBmaW5kIHRoZSBjb25maWcubTQgZmlsZXMgaW4gdGhlIGNvcnJlY3QKICAgICBvcmRlci4gIEJhc2ljYWxseSwgd2UgY2FuIG5vdyBuYW1lIGNvbmZpZy5tNCBmaWxlcyBhcyBjb25maWdcZFxkLm00LAogICAgIGFuZCB3ZSB3aWxsIHNvcnQgdGhlbSBjb3JyZWN0bHkgd2hlbiBpbnNlcnRpbmcgdGhlbSBpbnRvIHRoZSBidWlsZAogICAgIHByb2Nlc3MuICBbUnlhbiBCbG9vbV0KCiAgKikgR2V0IG1vZF9jZ2lkIHRvIHVzZSBhcHIgY2FsbHMgZm9yIGNyZWF0aW5nIHRoZSBhY3R1YWwgQ0dJIHByb2Nlc3MuCiAgICAgVGhpcyBhbHNvIGFsbG93cyBtb2RfY2dpZCB0byB1c2UgYXBfb3NfY3JlYXRlX3ByaXZpbGVkZ2VkX3Byb2Nlc3MsCiAgICAgdGh1cyBhbGxvd2luZyBmb3IgU3VFeGVjIGV4ZWN1dGlvbiBmcm9tIG1vZF9jZ2lkLiAgQ3VycmVudGx5LCB3ZSBkbwogICAgIG5vdCBzdXBwb3J0IGV2ZXJ5dGhpbmcgdGhhdCBzdGFuZGFyZCBTdUV4ZWMgc3VwcG9ydHMsIGJ1dCBhdCBsZWFzdAogICAgIGl0IHdvcmtzIG1pbmltYWxseSBub3cuIFtSeWFuIEJsb29tXQoKICAqKSBBbGxvdyBTdUV4ZWMgdG8gYmUgY29uZmlndXJlZCBmcm9tIHRoZSAuL2NvbmZpZ3VyZSBjb21tYW5kIGxpbmUuCiAgICAgW1J5YW4gQmxvb21dCgogICopIFVwZGF0ZSBzb21lIG9mIHRoZSBkb2NzIGluIFJFQURNRSBhbmQgSU5TVEFMTCB0byByZWZsZWN0IHNvbWUgb2YKICAgICB0aGUgY2hhbmdlcyBpbiBBcGFjaGUgMi4wIFtDbGlmZiBXb29sbGV5IDxjbGlmZndvb2xsZXkgeWFob28uY29tPl0KCiAgKikgSWYgd2UgZ2V0IEVBR0FJTiByZXR1cm5lZCBmcm9tIHRoZSBjYWxsIHRvIGFwcl9zZW5kZmlsZSwgdGhlbiB3ZQogICAgIG5lZWQgdG8gY2FsbCBzZW5kZmlsZSBhZ2Fpbi4gIFRoaXMgZ2V0cyB1cyBzZXJ2aW5nIGxhcmdlIGZpbGVzCiAgICAgc3VjaCBhcyBhcGFjaGVfMi4wYTkudGFyLmd6IG9uIEZyZWVCU0QgYWdhaW4uIFtSeWFuIEJsb29tXQoKICAqKSBHZXQgdGhlIHN1cHBvcnQgcHJvZ3JhbXMgYnVpbGRpbmcgY2xlYW5seSBhZ2Fpbi4KICAgICBbQ2xpZmYgV29vbGxleSA8Y2xpZmZ3b29sbGV5IHlhaG9vLmNvbT5dCgogICopIFRoZSBBcGFjaGUvV2luMzIgQXBhY2hlLmV4ZSBhbmQgZGxsJ3Mgbm93IGxpdmUgaW4gYmluLiAgVGhlIAogICAgIGN1cnJlbnQgZGlyZWN0b3J5IGxvZ2ljIG5vdyBiYWNrcyB1cCBvdmVyIGJpbi8gdG8gZGV0ZXJtaW5lIHRoZQogICAgIHNlcnZlciByb290IGZyb20gdGhlIEFwYWNoZS5leGUgcGF0aC4KCiAgKikgQXBhY2hlL1dpbjMyIG5vdyBmb2xsb3dzIHRoZSBzdGFuZGFyZCBjb252ZW50aW9ucyBvZiBtb2RfZm9vLnNvCiAgICAgbG9hZGFibGUgbW9kdWxlcywgZHluYW1pYyBsaWJzIGFyZSBhbGwgbmFtZWQgbGliZm9vLmRsbCwgYW5kIHRoZQogICAgIG1ha2VmaWxlLndpbiBwb3B1bGF0ZXMgdGhlIGluY2x1ZGUsIGxpYiBhbmQgbGliZXhlYyBkaXJlY3Rvcmllcy4KCiAgKikgQXBhY2hlIGlzIG5vdyBJUHY2LWNhcGFibGUuICBPbiBzeXN0ZW1zIHdoZXJlIEFQUiBzdXBwb3J0cyBJUHY2LAogICAgIEFwYWNoZSBnZXRzIElQdjYgbGlzdGVuaW5nIHNvY2tldHMgYnkgZGVmYXVsdC4gIEFkZGl0aW9uYWxseSwgdGhlCiAgICAgTGlzdGVuLCBOYW1lVmlydHVhbEhvc3QsIGFuZCA8VmlydHVhbEhvc3Q+IGRpcmVjdGl2ZXMgc3VwcG9ydCBJUHY2CiAgICAgbnVtZXJpYyBhZGRyZXNzIHN0cmluZ3MgKGUuZy4sICJMaXN0ZW4gW2ZlODA6OjFdOjgwODAiKS4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBNb2RpZnkgdGhlIGluc3RhbGwgZGlyZWN0b3J5IGxheW91dC4gIE1vZHVsZXMgYXJlIG5vdyBpbnN0YWxsZWQgaW4KICAgICBtb2R1bGVzLy4gIFNoYXJlZCBsaWJyYXJpZXMgc2hvdWxkIGJlIGluc3RhbGxlZCBpbiBsaWJyYXJpZXMvLCBidXQKICAgICB3ZSBkb24ndCBoYXZlIGFueSBvZiB0aG9zZSBvbiBVbml4IHlldC4gIEFsbCBpbnN0YWxsIGRpcmVjdG9yaWVzCiAgICAgYXJlIG1vZGlmeWFibGUgYXQgY29uZmlndXJlIHRpbWUuIFtSeWFuIEJsb29tXQoKICAqKSBJbnN0YWxsIGFsbCBoZWFkZXIgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IG9uIFVuaXguIFtSeWFuIEJsb29tXQoKICAqKSBHZXQgdGhlIGZ1bmN0aW9ucyBpbiBzZXJ2ZXIvbGlua2VkIGludG8gdGhlIHNlcnZlciwgcmVnYXJkbGVzcyBvZgogICAgIHdoaWNoIG1vZHVsZXMgbGlua2VkIGludG8gdGhlIHNlcnZlci4gIFRoaXMgdXNlcyB0aGUgc2FtZSBoYWNrIAogICAgIGZvciBBcGFjaGUgdGhhdCB3ZSB1c2UgZm9yIEFQUiBhbmQgYXByLXV0aWwgdG8gZW5zdXJlIGFsbCBvZiB0aGUKICAgICBuZWNlc3NhcnkgZnVuY3Rpb25zIGFyZSBsaW5rZWQuICBBcyBhIHBhcnQgb2YgdGhpc2UsIHRoZSBDSEFSU0VUX0VCQ0RJQwogICAgIHdhcyByZW5hbWVkIHRvIEFQX0NIQVJTRVRfRUJDRElDIGZvciBuYW1lc3BhY2UgcHJvdGVjdGlvbiwgYW5kIHRvIG1ha2UKICAgICB0aGUgc2NyaXB0cyBhIGJpdCBlYXNpZXIuCiAgICAgW1J5YW4gQmxvb21dCgogICopIFJld29yayB0aGUgUkZDMTQxMyBoYW5kbGluZyB0byBtYWtlIGl0IHRocmVhZC1zYWZlLCB1c2UgYSB0aW1lb3V0CiAgICAgb24gdGhlIHF1ZXJ5LCBhbmQgcmVtb3ZlIElQdjQgZGVwZW5kZW5jaWVzLiAgW0plZmYgVHJhd2lja10KCiAgKikgR2V0IGFsbCBvZiB0aGUgYXV0aCBtb2R1bGVzIHRvIHRoZSBwb2ludCB0aGF0IHRoZXkgd2lsbCBpbnN0YWxsIGFuZAogICAgIGJlIGxvYWRhYmxlIGludG8gdGhlIHNlcnZlci4gIE91ciBuZXcgYnVpbGQvaW5zdGFsbCBtZWNoYW5pc20gZXhwZWN0cwogICAgIHRoYXQgYWxsIG1vZHVsZXMgd2lsbCBoYXZlIGEgY29tbW9uIG5hbWUgZm9ybWF0LiAgVGhlIGF1dGggbW9kdWxlcyAKICAgICBkaWRuJ3QgdXNlIHRoYXQgZm9ybWF0LCBzbyB3ZSBkaWRuJ3QgaW5zdGFsbCB0aGVtIHByb3Blcmx5LgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBUEkgcm91dGluZXMgYXBfcGdldGhvc3RieW5hbWUoKSBhbmQgYXBfcGR1cGhvc3RlbnQoKSBhcmUgbm8gbG9uZ2VyCiAgICAgYXZhaWxhYmxlLiAgVXNlIGFwcl9nZXRhZGRyaW5mbygpIGluc3RlYWQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBHZXQgIk5hbWVWaXJ0dWFsSG9zdCAqIiB3b3JraW5nIGluIDIuMC4gIFtSeWFuIEJsb29tXQoKICAqKSBSZXR1cm4gSFRUUF9SQU5HRV9OT1RfU0FUSVNGSUFCTEUgaWYgdGhlIGV2ZXJ5IHJhbmdlIHJlcXVlc3RlZCBzdGFydHMKICAgICBhZnRlciB0aGUgZW5kIG9mIHRoZSByZXNwb25zZS4gW1J5YW4gQmxvb21dCgogICopIEdldCBieXRlcmFuZ2UgcmVxdWVzdHMgd29ya2luZyB3aXRoIHJlc3BvbnNlcyB0aGF0IGRvIG5vdCBoYXZlIGEKICAgICBjb250ZW50LWxlbmd0aC4gIEJlY2F1c2Ugb2YgdGhlIHdheSBieXRlcmFuZ2UgcmVxdWVzdHMgd29yaywgd2UgaGF2ZSB0bwogICAgIGhhdmUgYWxsIG9mIHRoZSBkYXRhIGJlZm9yZSB3ZSBjYW4gYWN0dWFsbHkgZG8gdGhlIGJ5dGVyYW5nZSwgc28gd2UKICAgICBjYW4gY29tcHV0ZSB0aGUgY29udGVudC1sZW5ndGggaW4gdGhlIGJ5dGVyYW5nZSBmaWx0ZXIuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEdldCBleGUgQ0dJJ3Mgd29ya2luZyBhZ2FpbiBvbiBXaW5kb3dzLgogICAgIFtBbGxhbiBFZHdhcmRzXQoKICAqKSBHZXQgbW9kX2NnaWQgYW5kIG1vZF9yZXdyaXRlIHRvIHdvcmsgYXMgRFNPcyBieSBjaGFuZ2luZyB0aGUgd2F5CiAgICAgdGhleSBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IHRoZWlyICBwb3N0IGNvbmZpZyBob29rIGhhcyBiZWVuCiAgICAgY2FsbGVkIGJlZm9yZS4gIEluc3RlYWQgb2YgYSBzdGF0aWMgdmFyaWFibGUgKHdoaWNoIGlzIHJlcGxhY2VkIHdoZW4gCiAgICAgdGhlIERTTyBpcyBsb2FkZWQgYSBzZWNvbmQgdGltZSksIHVzZSB1c2VyZGF0YSBpbiB0aGUgcHJvY2VzcyBwb29sLgogICAgIFtKZWZmIFRyYXdpY2tdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMGE5CgogICopIFdpbjMyIG5vdyByZXF1aXJlcyBwZXJsIHRvIGNvbXBsZXRlIHRoZSBmaW5hbCBpbnN0YWxsIHN0ZXAgZm9yIHVzZXJzCiAgICAgdG8gYnVpbGQgKyBpbnN0YWxsIG9uIFdpbjMyLiAgTWFrZWZpbGUud2luIG5vdyByZXdyaXRlcyBAQFNlcnZlclJvb3RACiAgICAgYW5kIGluc3RhbGxzIHRoZSBjb25mLCBodGRvY3MgYW5kIGh0ZG9jcy9tYW51YWwgZGlyZWN0b3JpZXMuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgTWFrZSBtb2RfaW5jbHVkZSB1c2UgYSBoYXNoIHRhYmxlIHRvIGFzc29jaWF0ZSBkaXJlY3RpdmUgdGFncyB3aXRoCiAgICAgZnVuY3Rpb25zLiAgVGhpcyBhbGxvd3MgbW9kdWxlcyB0byBpbXBsZW1lbnQgdGhlaXIgb3duIFNTSSB0YWdzIGVhc2lseS4KICAgICBUaGUgaWRlYSBpcyBzaW1wbGUgZW5vdWdoLCBhIG1vZHVsZSBjYW4gaW5zZXJ0IGl0J3Mgb3duIHRhZyBhbmQgZnVuY3Rpb24KICAgICBjb21iaW5hdGlvbiBpbnRvIGEgaGFzaCB0YWJsZSBwcm92aWRlZCBieSBtb2RfaW5jbHVkZS4gIFdoaWxlIG1vZF9pbmNsdWRlCiAgICAgcGFyc2VzIGFuIFNTSSBmaWxlLCB3aGVuIGl0IGVuY291bnRlcnMgYSB0YWcgaW4gdGhlIGZpbGUsIGl0IGRvZXMgYQogICAgIGhhc2ggbG9va3VwIHRvIGZpbmQgdGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyB0aGF0IHRhZywgYW5kIHBhc3NlcwogICAgIGFsbCBvZiB0aGUgcmVsZXZhbnQgZGF0YSB0byB0aGUgZnVuY3Rpb24uICBUaGF0IGZ1bmN0aW9uIGlzIHRoZW4KICAgICByZXNwb25zaWJsZSBmb3IgcHJvY2Vzc2luZyB0aGUgdGFnIGFuZCBoYW5kaW5nIHRoZSByZW1haW5pbmcgZGF0YSBiYWNrCiAgICAgdG8gbW9kX2luY2x1ZGUgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KICAgICBbUGF1bCBKLiBSZWRlciA8cmVkZXJwaiByYWxlaWdoLmlibS5jb20+XQoKICAqKSBHZXQgcmlkIG9mIGFwX25ld19hcHJfY29ubmVjdGlvbigpLiAgYXBfbmV3X2Nvbm5lY3Rpb24oKSBub3cgaGFzIAogICAgIGZld2VyIHBhcmFtZXRlcnM6IHRoZSBsb2NhbCBhbmQgcmVtb3RlIHNvY2tldCBhZGRyZXNzZXMgd2VyZSByZW1vdmVkCiAgICAgZnJvbSB0aGUgcGFyYW1ldGVyIGxpc3QgYmVjYXVzZSBhbGwgcmVxdWlyZWQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlCiAgICAgdmlhIHRoZSBBUFIgc29ja2V0LiAgW0plZmYgVHJhd2lja10KCiAgKikgRGlzdHJpYnV0aW9uIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgcmVvcmdhbml6ZWQgdG8gcmVmbGVjdCBhCiAgICAgbm9ybWFsIHNvdXJjZSBkaXN0cmlidXRpb24gd2l0aCBleHRlcm5hbCBpbnN0YWxsIHRhcmdldHMuCiAgICAgW1JveSBGaWVsZGluZ10KCiAgKikgVGhlIE1QTXMgdGhhdCBuZWVkIG11bHRpcGxlIHNlZ21lbnRzIG9mIHNoYXJlZCBtZW1vcnkgbm93IGNyZWF0ZQogICAgIHR3byBhcHJfc2htZW1fdCB2YXJpYWJsZXMsIG9uZSBmb3IgZWFjaCBzaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24uCiAgICAgdGhlIHByb2JsZW0gaXMgdGhhdCB3ZSBjYW4ndCBkZXRlcm1pbmUgaG93IG11Y2ggbWVtb3J5IHdpbGwgYmUgcmVxdWlyZWQKICAgICBmb3Igc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9ucyBvbmNlIHdlIHRyeSB0byBhbGxvY2F0ZSBtb3JlIHRoYW4gb25lCiAgICAgdmFyaWFibGUuICBUaGUgTU0gY29kZSBhdXRvbWF0aWNhbGx5IGFsaWducyB0aGUgc2hhcmVkIG1lbW9yeSBhbGxvY2F0aW9ucywKICAgICBzbyB3ZSBlbmQgdXAgbmVlZGluZyB0byBwYWQgdGhlIGFtb3VudCBvZiBzaGFyZWQgbWVtb3J5IHdlIHdhbnQgYmFzZWQKICAgICBvbiBob3cgbWFueSB2YXJpYWJsZXMgd2lsbCBiZSBhbGxvY2F0ZWQgb3V0IG9mIHRoZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQuCiAgICAgSXQgaXMganVzdCBlYXNpZXIgdG8gY3JlYXRlIGEgc2Vjb25kIGFwcl9zaG1lbV90IHZhcmlhYmxlLCBhbmQgdHdvCiAgICAgc2htZW0gbWVtb3J5IGJsb2Nrcy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQ2xlYW51cCB0aGUgZXhwb3J0IGxpc3QgYSBiaXQuICBUaGlzIGNyZWF0ZXMgYSBzaW5nbGUgdW5pZmllZCBsaXN0IG9mCiAgICAgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IEFQUi4gIFRoZSBleHBvcnQgbGlzdCBpcyBnZW5lcmF0ZWQgYXQgY29uZmlndXJlCiAgICAgdGltZSwgYW5kIHRoYXQgbGlzdCBpcyB0aGVuIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGV4cG9ydHMuYyBmaWxlLgogICAgIEJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgZXhwb3J0IGxpc3QgaXMgZ2VuZXJhdGVkLCB3ZSBvbmx5IGV4cG9ydCB0aG9zZQogICAgIGZ1bmN0aW9ucyB0aGF0IGFyZSB2YWxpZCBvbiB0aGUgcGxhdGZvcm0gd2UgYXJlIGJ1aWxkaW5nIG9uLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBFbmFibGUgbG9nZ2luZyB0aGUgY29va2llIHdpdGggbW9kX2xvZ19jb25maWcKICAgICBbU2FuZGVyIHZhbiBab2VzdCA8c2FuZGVyIGNvdmFsZW50Lm5ldD5dCgogICopIEZpeCBhIHNlZ2ZhdWx0IGluIG1vZF9pbmZvIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBjb25maWd1cmF0aW9uLgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZGVkIGxpYi9hcHV0aWwvIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHV0aWxpdHkgZnVuY3Rpb25zIHdoaWNoIGFyZSBub3QKICAgICBzcGVjaWZpYyB0byB0aGUgQXBhY2hlIEhUVFAgU2VydmVyIChidXQgZG8gbm90IG1ha2Ugc2Vuc2Ugd2l0aCBBUFIpLgogICAgIFRoZSBmaXJzdCB1dGlsaXR5IGlzICJhcHVfZGJtIjogYSBzZXQgb2YgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aCBEQk0KICAgICBmaWxlcy4gVGhpcyBmaXJzdCB2ZXJzaW9uIGNhbiBiZSBjb21waWxlZCBmb3IgU0RCTSBvciBHREJNIGRhdGFiYXNlcy4KICAgICBbR3JlZyBTdGVpbl0KCiAgKikgQ29tcGxldGUgcmUtd3JpdGUgb2YgbW9kX2luY2x1ZGUuICBUaGlzIG1ha2VzIG1vZF9pbmNsdWRlIGEgZmlsdGVyIHRoYXQKICAgICB1c2VzIGJ1Y2tldHMgZGlyZWN0bHkuICBUaGlzIGhhcyBub3cgc2VydmVkIHRoZSBGQVEgY29ycmVjdGx5LgogICAgIFtQYXVsIFJlZGVyIDxyZWRlcnBqIHJhbGVpZ2guaWJtLmNvbT5dCgogICopIEFsbG93IG1vZHVsZXMgdG8gc3BlY2lmeSB0aGUgZmlyc3QgZmlsdGVyIGluIGEgc3ViX3JlcXVlc3Qgd2hlbgogICAgIG1ha2luZyB0aGUgc3ViX3JlcXVlc3QuICBUaGlzIGtlZXBzIG1vZHVsZXMgZnJvbSBoYXZpbmcgdG8gY2hhbmdlIHRoZQogICAgIG91dHB1dF9maWx0ZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgY3JlYXRpbmcgdGhlIHN1Yi1yZXF1ZXN0LCBhbmQgdGhlcmVmb3JlCiAgICAgc2tpcCB0aGUgc3ViX3JlcV9vdXRwdXRfZmlsdGVyLiAgW1J5YW4gQmxvb21dCgogICopIFVwZGF0ZSBhYiB0byBhY2NlcHQgVVJMcyB3aXRoIElQdjYgbGl0ZXJhbCBhZGRyZXNzIHN0cmluZ3MgKGluIHRoZQogICAgIGZvcm1hdCBkZXNjcmliZWQgaW4gUkZDIDI3MzIpLCBhbmQgdG8gYnVpbGQgSG9zdCBoZWFkZXIgZmllbGRzIGluCiAgICAgdGhlIHNhbWUgZm9ybWF0LiAgVGhpcyBhbGxvd3MgSVB2NiBsaXRlcmFsIGFkZHJlc3Mgc3RyaW5ncyB0byBiZQogICAgIHVzZWQgd2l0aCBhYi4gIFRoaXMgc3VwcG9ydCBoYXMgYmVlbiB0ZXN0ZWQgYWdhaW5zdCBBcGFjaGUgMS4zIHdpdGggCiAgICAgdGhlIEtBTUUgcGF0Y2gsIGJ1dCBBcGFjaGUgMi4wIGRvZXMgbm90IHlldCB3b3JrIHdpdGggdGhpcyBmb3JtYXQKICAgICBvZiB0aGUgSG9zdCBoZWFkZXIgZmllbGQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBY2NvbW9kYXRlIGFuIG91dC1vZi1zcGFjZSBjb25kaXRpb24gaW4gdGhlIHBpcGVkIGxvZ3MgYW5kIHRoZQogICAgIHJvdGF0ZWxvZ3MuYyBjb2RlLCBhbmQgbm8gbG9uZ2VyIGNodXJuIGxvZyBwcm9jZXNzZXMgZm9yIHRoaXMKICAgICBjb25kaXRpb24uICBbVmljdG9yIEouIE9ybGlrb3dza2ldCgogICopIEFkZCBzdXBwb3J0IGZvciBwYXJ0aWFsIHdyaXRlcyB3aXRoIGFwcl9zZW5kZmlsZSgpIHRvIGNvcmVfb3V0cHV0X2ZpbHRlci4KICAgICBbR3JlZyBBbWVzXSAKCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wYTgKCiAgKikgQWRkIGEgZGlyZWN0aXZlIHRvIG1vZF9taW1lIHNvIHRoYXQgZmlsdGVycyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoCiAgICAgYSBnaXZlbiBtaW1lLXR5cGUuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEdldCBtdWx0aS12aWV3cyB3b3JraW5nIGFnYWluLiAgV2Ugd2VyZSBzZXR0aW5nIHRoZSBwYXRoX2luZm8KICAgICBmaWVsZCBpbmNvcnJlY3RseSBpZiB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBzcGVjaWZpZWQgZmlsZS4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgRml4IDMwNCBwcm9jZXNzaW5nLiAgVGhlIGNvcmUgc2hvdWxkIG5ldmVyIHRyeSB0byBzZW5kIHRoZSBoZWFkZXJzCiAgICAgZG93biB0aGUgZmlsdGVyIHN0YWNrLiAgQWx3YXlzLCBqdXN0IHNldHVwIHRoZSB0YWJsZSBpbiB0aGUgcmVxdWVzdAogICAgIHJlY29yZCwgYW5kIGxldCB0aGUgaGVhZGVyIGZpbHRlciBjb252ZXJ0IGl0IHRvIGRhdGEgdGhhdCBpcyByZWFkeQogICAgIGZvciB0aGUgbmV0d29yay4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgTW9yZSBmaXhlcyBmb3IgdGhlIHByb3h5LiAgVGhlcmUgYXJlIHN0aWxsIGJ1Z3MgaW4gdGhlIHByb3h5IGNvZGUsCiAgICAgYnV0IHRoaXMgaGFzIG5vdyBwcm94aWVkIHd3dy55YWhvby5jb20gYW5kIHd3dy5udHJuZXQubmV0IChteSBJU1ApCiAgICAgc3VjY2Vzc2Z1bGx5LgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBGaXggcGFyYW1zIGZvciBhcHJfZ2V0YWRkcmluZm8oKSBjYWxsIGluIGNvbm5lY3QgcHJveHkgaGFuZGxlci4KICAgICBbQ2h1Y2sgTXVyY2tvXQoKICAqKSBBUFI6IEFkZCBuZXcgYXByX2dldG9wdF9sb25nIGZ1bmN0aW9uIHRvIGhhbmRsZSBsb25nIG9wdGlvbnMuCiAgICAgW0IuIFcuIEZpdHpwYXRyaWNrIDxmaXR6IHJlZC1iZWFuLmNvbT5dCgogICopIEFQUjogQ2hhbmdlIGFwcl9jb25uZWN0KCkgdG8gdGFrZSBhcHJfc29ja2FkZHJfdCBpbnN0ZWFkIG9mIGhvc3RuYW1lLgogICAgIEFkZCBnZW5lcmljIGFwcl9jcmVhdGVfc29ja2V0KCkuICBBZGQgYXByX2dldGFkZHJpbmZvKCkgZm9yIGRvaW5nCiAgICAgaG9zdG5hbWUgcmVzb2x1dGlvbi9hZGRyZXNzIHN0cmluZyBwYXJzaW5nIGFuZCBidWlsZGluZwogICAgIGFwcl9zb2NrYWRkcl90LiAgQWRkIGFwcl9nZXRfc29ja2FkZHIoKSBmb3IgZ2V0dGluZyB0aGUgYWRkcmVzcwogICAgIG9mIG9uZSBvZiB0aGUgYXByX3NvY2thZGRyX3Qgc3RydWN0dXJlcyBmb3IgYSBzb2NrZXQuICBDaGFuZ2UKICAgICBhcHJfYmluZCgpIHRvIHRha2UgYXByX3NvY2thZGRyX3QuICBbRGF2aWQgUmVpZCBhbmQgSmVmZiBUcmF3aWNrXQoKICAqKSBSZW1vdmUgdGhlIEJVRkYgZnJvbSB0aGUgSFRUUCBwcm94eS4gIFRoaXMgaXMgc3RpbGwgYSBiaXQgdWdseSwgYnV0CiAgICAgSSBoYXZlIHByb3hpZWQgcGFnZXMgd2l0aCBpdCwgY2xlYW51cCB3aWxsIGNvbW1lbmNlIHNvb24uCiAgICAgW1J5YW4gQmxvb21dCgogICopIE1ha2UgdGhlIHByb3h5IHdvcmsgd2l0aCBmaWx0ZXJzLiAgVGhpcyBpc24ndCBwZXJmZWN0LCBiZWNhdXNlIHdlCiAgICAgYXJlbid0IGRlYWxpbmcgd2l0aCB0aGUgaGVhZGVycyBwcm9wZXJseS4gIFtSeWFuIEJsb29tXQoKICAqKSBEbyBub3Qgc2VuZCBhIGNvbnRlbnQtbGVuZ3RoIGlmZiB0aGUgQy1MIGlzIDAgYW5kIHRoaXMgaXMgYSBoZWFkCiAgICAgcmVxdWVzdC4gIFtSeWFuIEJsb29tXQoKICAqKSBNYWtlIGNnaS1iaW4gd29yayBhcyBhIHJlZ3VsYXIgZGlyZWN0b3J5IHdoZW4gdXNpbmcgbW9kX3Zob3N0X2FsaWFzCiAgICAgd2l0aCBubyBWaXJ0dWFsU2NyaXB0QWxpYXMgZGlyZWN0aXZlcy4gUFIjNjgyOSBbVG9ueSBGaW5jaF0KCiAgKikgUmVtb3ZlIEJVRkYgZnJvbSB0aGUgUFJPWFkgY29ubmVjdCBoYW5kbGluZy4gW1J5YW4gQmxvb21dCgogICopIEdldCB0aGUgZGVmYXVsdF9oYW5kbGVyIHRvIHN0b3AgdHJ5aW5nIHRvIGRlYWwgd2l0aCBIRUFEIHJlcXVlc3RzLgogICAgIFRoZSBpZGVhIGlzIHRvIGxldCB0aGUgY29udGVudC1sZW5ndGggZmlsdGVyIGNvbXB1dGUgdGhlIEMtTCBiZWZvcmUKICAgICB3ZSB0cnkgdG8gc2VuZCB0aGUgZGF0YS4gIElmIHdlIGNhbiBnZXQgdGhlIEMtTCBjb3JyZWN0bHksIHRoZW4gd2UKICAgICBzaG91bGQgc2VuZCBpdCBpbiB0aGUgSEVBRCByZXNwb25zZS4KICAgICBbUnlhbiBCbG9vbV0KICAgICAKICAqKSBUaGUgSGVhZGVyIGZpbHRlciBjYW4gbm93IGRldGVybWluZSBpZiBhIGJvZHkgc2hvdWxkIGJlIHNlbnQgYmFzZWQKICAgICBvbiByLT5oZWFkZXJfb25seS4gIFRoZSBnZW5lcmFsIGlkZWEgb2YgdGhpcyBpcyB0aGF0IGlmIHdlIGRlbGF5CiAgICAgZGVjaWRpbmcgdG8gc2VuZCB0aGUgYm9keSwgdGhlbiB3ZSBtaWdodCBiZSBhYmxlIHRvIGNvbXB1dGUgdGhlCiAgICAgY29udGVudC1sZW5ndGggY29ycmVjdGx5LCB3aGljaCB3aWxsIGhlbHAgY2FjaGluZyBwcm94aWVzIHRvIGNhY2hlCiAgICAgb3VyIGRhdGEgYmV0dGVyLiAgQW55IGhhbmRsZXIgdGhhdCBkb2Vzbid0IHdhbnQgdG8gdHJ5IHRvIGNvbXB1dGUKICAgICB0aGUgY29udGVudC1sZW5ndGggY2FuIGp1c3Qgc2VuZCBhbiBFT1MgYnVja2V0IHdpdGhvdXQgZGF0YSBhbmQKICAgICBldmVyeXRoaW5nIHdpbGwganVzdCB3b3JrLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBZGQgdGhlIHJlZmVyZXIgdG8gdGhlIGVycm9yIGxvZyBpZiBvbmUgaXMgYXZhaWxhYmxlLgogICAgIFtNYXJrdXMgR3lnZXIgPG1neWdlciBpdHIuY2g+XQoKICAqKSBNb2RfaW5mby5jIGhhcyBub3cgYmVlbiBwb3J0ZWQgdG8gQXBhY2hlIDIuMC4gIEFzIGEgcGFydCBvZiB0aGlzCiAgICAgY2hhbmdlLCB0aGUgcm9vdCBvZiB0aGUgY29uZmlndXJhdGlvbiB0cmVlIGhhcyBiZWVuIGV4cG9zZWQgdG8gbW9kdWxlcwogICAgIGFzIGFwX2NvbmZ0cmVlLgogICAgIFtSeWFuIE1vcmdhbiA8cm1vcmdhbiBjb3ZhbGVudC5uZXQ+XQoKICAqKSBHZXQgdGhlIGNvcmVfb3V0cHV0X2ZpbHRlciB0byB1c2UgdGhlIGJ1Y2tldCBpbnRlcmZhY2UgZGlyZWN0bHkuCiAgICAgVGhpcyBrZWVwcyB1cyBmcm9tIGNhbGxpbmcgdGhlIGNvbnRlbnQtbGVuZ3RoIGZpbHRlciBtdWx0aXBsZSB0aW1lcwogICAgIGZvciBhIHNpbXBsZSBzdGF0aWMgcmVxdWVzdC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgV2UgYXJlIHNlbmRpbmcgdGhlIGNvbnRlbnQtdHlwZSBjb3JyZWN0bHkgbm93LgogICAgIFtSeWFuIEJsb29tIGFuZCBXaWxsIFJvd2VdCgogICopIEFQUiBvbiBGcmVlQlNEOiBGaXggYSBidWcgaW4gYXByX3NlbmRmaWxlKCkgd2hpY2ggY2F1c2VkIHVzIHRvIHJlcG9ydAogICAgIGEgYm9ndXMgYnl0ZXMtc2VudCB2YWx1ZSB3aGVuIHRoZSBvbmx5IHRoaW5nIGJlaW5nIHNlbnQgd2FzIHRyYWlsZXJzCiAgICAgYW5kIHdyaXRldigpIHJldHVybmVkIGFuIGVycm9yIChvciBFQUdBSU4pLiAgW0plZmYgVHJhd2lja10KCiAgKikgR2V0IFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVCB3b3JraW5nIGFnYWluLiAgVGhpcyB1c2VzIHRoZQogICAgIGhpbnRzIGZpbGUgdG8gZGV0ZXJtaW5lIHdoaWNoIHBsYXRmb3JtcyBkZWZpbmUgCiAgICAgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBULgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBUFI6IGFkZCBhcHJfZ2V0X2hvbWVfZGlyZWN0b3J5KCkgIFtKZWZmIFRyYXdpY2tdCgogICopIEluaXRpYWwgaW1wb3J0IG9mIDEuMy1jdXJyZW50IG1vZF9wcm94eS4gW0NodWNrIE11cmNrb10KCiAgKikgTm90IGFsbCBwbGF0Zm9ybXMgaGF2ZSBJTkFERFJfTk9ORSBkZWZpbmVkIGJ5IGRlZmF1bHQuICBBcGFjaGUKICAgICB1c2VkIHRvIG1ha2UgdGhpcyBjaGVjayBhbmQgZGVmaW5lIElOQUREUl9OT05FIGlmIGFwcHJvcHJpYXRlLAogICAgIGJ1dCBBUFIgbmVlZHMgdGhlIGNoZWNrIHRvbywgYW5kIEkgc3VzcGVjdCBvdGhlciBhcHBsaWNhdGlvbnMgd2lsbAogICAgIGFzIHdlbGwuICBBUFIgbm93IGRlZmluZXMgQVBSX0lOQUREUl9OT05FLCB3aGljaCBpcyBhbHdheXMgYSB2YWxpZAogICAgIHZhbHVlIG9uIGFsbCBwbGF0Zm9ybXMuCiAgICAgW0JyYW5rbyDIaWJlaiA8YnJhbmUgeGJjLm51Pl0KCiAgKikgRGVzdHJveSB0aGUgcHRocmVhZCBtdXRleCBpbiBsb2NrX2ludHJhX2NsZWFudXAoKSBmb3IgUFIjNjgyNC4KICAgICBbU2h1aWNoaSBLaXRhZ3VjaGkgPGtpIGhoLmlpajR1Lm9yLmpwPl0gCgogICopIFJlbGF4IHRoZSBzeW50YXggY2hlY2tpbmcgb2YgSG9zdDogaGVhZGVycyBpbiBvcmRlciB0byBzdXBwb3J0CiAgICAgaUROUy4gUFIjNjYzNSBbVG9ueSBGaW5jaF0KCiAgKikgV2hlbiByZWFkaW5nIGZyb20gZmlsZSBidWNrZXRzIHdlIGNvbnZlcnQgdG8gYW4gTU1BUCBpZiBpdCBtYWtlcwogICAgIHNlbnNlLiAgVGhpcyBhbHNvIHNpbXBsaWZpZXMgdGhlIGRlZmF1bHQgaGFuZGxlciBiZWNhdXNlIHRoZQogICAgIGRlZmF1bHQgaGFuZGxlciBubyBsb25nZXIgbmVlZHMgdG8gdHJ5IHRvIGNyZWF0ZSBNTUFQcy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQlVGRiBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIG1haW4gc2VydmVyLiAgVGhlIEJVRkYgY29kZSB3aWxsIHJlbWFpbgogICAgIGluIHRoZSBjb2RlIHVudGlsIGl0IGhhcyBiZWVuIHB1cmdlZCBmcm9tIHRoZSBwcm94eSBtb2R1bGUgYXMgd2VsbC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQnl0ZXJhbmdlcyBoYXZlIGJlZW4gY29tcGxldGVseSByZS13cml0dGVuIHRvIGJlIGEgZmlsdGVyLiAgVGhpcwogICAgIGhhcyBiZWVuIHRlc3RlZCwgYW5kIEkgYmVsaWV2ZSBpdCBpcyB3b3JraW5nIGNvcnJlY3RseSwgYnV0IGl0IGNvdWxkCiAgICAgZG9lc24ndCB3b3JrIGZvciB0aGUgQWRvYmUgQWNyb2JhdCBwbHVnLWluLiAgVGhlIG91dHB1dCBhbG1vc3QgbWF0Y2hlcwogICAgIHRoZSBvdXRwdXQgZnJvbSAxLjMsIHRoZSBvbmx5IGRpZmZlcmVuY2UgYmVpbmcgdGhhdCAxLjMgaW5jbHVkZXMKICAgICBhIGNvbnRlbnQtbGVuZ3RoIGluIHRoZSByZXNwb25zZSwgYW5kIHRoaXMgZG9lcyBub3QuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEFQUiByZWFkL3dyaXRlIGZ1bmN0aW9ucyBhbmQgYnVja2V0IHJlYWQgZnVuY3Rpb25zIG5vdyBvcGVyYXRlCiAgICAgb24gdW5zaWduZWQgaW50ZWdlcnMsIGluc3RlYWQgb2Ygc2lnbmVkIG9uZXMuICBJdCBkb2Vzbid0IG1ha2UKICAgICBhbnkgc2Vuc2UgdG8gdXNlIHNpZ25lZCBpbnRzLCBiZWNhdXNlIHdlIHJldHVybiB0aGUgZXJyb3IgY29kZXMsCiAgICAgc28gaWYgd2UgaGF2ZSBhbiBlcnJvciB3ZSBzaG91bGQgcmVwb3J0IDAgYnl0ZXMgcmVhZCBvciB3cml0dGVuLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBbHdheXMgY29tcHV0ZSB0aGUgY29udGVudCBsZW5ndGgsIHdoZXRoZXIgaXQgaXMgc2VudCBvciBub3QuCiAgICAgVGhlIHJlYXNvbiBmb3IgdGhpcywgaXMgdGhhdCBpdCBhbGxvd3MgdXMgdG8gY29ycmVjdGx5IHJlcG9ydAogICAgIHRoZSBieXRlc19zZW50IHdoZW4gbG9nZ2luZyB0aGUgcmVxdWVzdC4gIFRoaXMgYWxzbyBzaW1wbGlmaWVzCiAgICAgY29udGVudC1sZW5ndGggZmlsdGVyIGEgYml0LCBhbmQgZml4ZXMgdGhlIGFjdHVhbCBieXRlLXJlcG9yaW5nCiAgICAgY29kZSBpbiBtb2RfbG9nX2NvbmZpZy5jCiAgICAgW1J5YW4gQmxvb21dCgogICopIFJlbW92ZSBBUF9FTkRfT0ZfQlJJR0FERSBkZWZpbml0aW9uLiAgVGhpcyBkb2VzIG5vdCBzaWduaWZ5IHdoYXQKICAgICBpdCBzYXlzLCBiZWNhdXNlIGl0IHdhcyBvbmx5IHVzZWQgYnkgRU9TIGFuZCBGTFVTSCBidWNrZXRzLiAgU2luY2UKICAgICBuZWl0aGVyIG9mIHRob3NlIGFyZSByZXF1aXJlZCBhdCB0aGUgZW5kIG9mIGEgYnJpZ2FkZSwgdGhpcyB3YXMKICAgICByZWFsbHkgc2lnbmlmeWluZyBGTFVTSF9USEVfREFUQSwgYnV0IHRoYXQgY2FuIGJlIGRldGVybWluZWQgYmV0dGVyCiAgICAgYnkgY2hlY2tpbmcgQVBfQlVDS0VUX0lTX0VPUygpIG9yIEFQX0JVQ0tFVF9JU19GTFVTSC4gIEVPUyBhbmQgRkxVU0gKICAgICBidWNrZXRzIG5vdyByZXR1cm4gYSBsZW5ndGggb2YgMCwgd2hpY2ggaXMgYWN0dWFsbHkgdGhlIGFtb3VudCBvZiBkYXRhCiAgICAgcmVhZCwgc28gdGhleSBtYWtlIG1vcmUgc2Vuc2UuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEFsbG93IHRoZSBjb3JlX291dHB1dF9maWx0ZXIgdG8gc2F2ZSBzb21lIGRhdGEgcGFzdCB0aGUgZW5kIG9mIGEKICAgICByZXF1ZXN0LiAgSWYgd2UgZ2V0IGFuIEVPUyBidWNrZXQsIHdlIG9ubHkgc2VuZCB0aGUgZGF0YSBpZiBpdCAKICAgICBtYWtlcyBzZW5zZSB0byBzZW5kIGl0LiAgVGhpcyBhbGxvd3MgdXMgdG8gcGlwZWxpbmUgcmVxdWVzdAogICAgIHJlc3BvbnNlcy4gIEFzIGEgcGFydCBvZiB0aGlzLCB3ZSBhbHNvIG5lZWQgdG8gYWxsb2NhdGUgbW1hcAogICAgIGJ1Y2tldHMgb3V0IG9mIHRoZSBjb25uZWN0aW9uIHBvb2wsIG5vdCB0aGUgcmVxdWVzdCBwb29sLiAgVGhpcwogICAgIGFsbG93cyB0aGUgbW1hcCB0byBvdXRsaXZlIHRoZSByZXF1ZXN0LgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBNYWtlIGJsb2NraW5nIGFuZCBub24tYmxvY2tpbmcgYnVja2V0IHJlYWRzIHdvcmsgY29ycmVjdGx5IGZvcgogICAgIHNvY2tldHMgYW5kIHBpcGVzLiAgVGhlc2UgYXJlIHRoZSBvbmx5IGJ1Y2tldCB0eXBlcyB0aGF0IHNob3VsZAogICAgIGhhdmUgbm9uLWJsb2NraW5nIHJlYWRzLCBiZWNhdXNlIHRoZSBvdGhlciBidWNrZXQgdHlwZXMgc2hvdWxkCiAgICAgQUxXQVlTIGJlIGFibGUgdG8gcmV0dXJuIHNvbWV0aGluZyBpbW1lZGlhdGVseS4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgSW4gdGhlIEFwYWNoZS9XaW4zMiBjb25zb2xlIHdpbmRvdywgYWNjZXB0IEN0cmwrQyB0byBzdG9wIHRoZSAKICAgICBzZXJ2ZXIsIGJ1dCB1c2UgQ3RybCtCcmVhayB0byBpbml0aWF0ZSBhIGdyYWNlZnVsIHJlc3RhcnQgCiAgICAgaW5zdGVhZCBvZiBkdXBsaWNhdGluZyBiZWhhdmlvci4gW0pvaG4gU3RlcmxpbmddCgogICopIFBhdGNoIG1vZF9hdXRvaW5kZXggdG8gc2V0IHRoZSBMYXN0LU1vZGlmaWVkIGhlYWRlciBiYXNlZCBvbgogICAgIHRoZSBkaXJlY3RvcnkncyBtdGltZSwgYW5kIGFkZCB0aGUgRVRhZyBoZWFkZXIuICBbV2lsbGlhbSBSb3dlXQoKICAqKSBNZXJnZSB0aGUgMS4zIHBhdGNoIHRvIGFkZCBzdXBwb3J0IGZvciBsb2dnaW5nIHF1ZXJ5IHN0cmluZyBpbiAKICAgICBzdWNoIGEgd2F5IHRoYXQgIiVtICVVJXEgJUgiIGlzIHRoZSBzYW1lIGFzICIlciIuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIFBvcnQgdGhyZWUgbG9nIG1ldGhvZHMgZnJvbSBtb2RfbG9nX2NvbmZpZyAxLjMgdG8gMi4wOiAKICAgICBDTEYgY29tcGxpYW50ICctJyBieXRlIGNvdW50LCBtZXRob2QgYW5kIHByb3RvY29sLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBBZGQgYSBuZXcgTG9nRm9ybWF0IGRpcmVjdGl2ZSwgJWMsIHRoYXQgd2lsbCBsb2cgY29ubmVjdGlvbgogICAgIHN0YXR1cyBhdCB0aGUgZW5kIG9mIHRoZSByZXNwb25zZSBhcyBmb2xsb3dzOgogICAgICdYJyAtIGNvbm5lY3Rpb24gYWJvcnRlZCBiZWZvcmUgdGhlIHJlc3BvbnNlIGNvbXBsZXRlZC4KICAgICAnKycgLSBjb25uZWN0aW9uIG1heSBiZSBrZXB0LWFsaXZlIGJ5IHRoZSBzZXJ2ZXIuCiAgICAgJy0nIC0gY29ubmVjdGlvbiB3aWxsIGJlIGNsb3NlZCBieSB0aGUgc2VydmVyLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBFeHBhbmQgQVBSIGZvciBXaW5OVCB0byBmdWxseSBhY2NlcHQgYW5kIHJldHVybiB1dGYtOCBlbmNvZGVkCiAgICAgVW5pY29kZSBmaWxlIG5hbWVzIGFuZCBwYXRocyBmb3IgV2luMzIsIGFuZCB0YWcgdGhlIENvbnRlbnQtVHlwZSAKICAgICBmcm9tIG1vZF9hdXRvaW5kZXggdG8gcmVmbGVjdCB0aGF0IGNoYXJzZXQgaWYgdGhlIGZlYXR1cmUKICAgICBtYWNybyBBUFJfSEFTX1VOSUNPREVfRlMgaXMgdHJ1ZS4gIFtXaWxsaWFtIFJvd2VdCgogICopIENvbXB1dGUgdGhlIGNvbnRlbnQgbGVuZ3RoIChhbmQgYWRkIGFwcHJvcHJpYXRlIGhlYWRlciBmaWVsZCkgZm9yCiAgICAgdGhlIHJlc3BvbnNlIHdoZW4gbm8gY29udGVudCBsZW5ndGggaXMgYXZhaWxhYmxlIGFuZCB3ZSBjYW4ndCB1c2UgCiAgICAgY2h1bmtlZCBlbmNvZGluZy4gIFtKZWZmIFRyYXdpY2tdCgogICopIENoYW5nZWQgYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkoKSB0byB1c2UgUkVRVUVTVF9DSFVOS0VEX0RFQ0hVTkssCiAgICAgc28gdGhhdCBjb250ZW50IGlucHV0IGZpbHRlcnMgZ2V0IGRlY2h1bmtlZCBkYXRhIHdoZW4gdXNpbmcKICAgICB0aGUgZGVmYXVsdCBoYW5kbGVyLiBBbHNvIHJlbW92ZWQgUkVRVUVTVF9DSFVOS0VEX1BBU1MuCiAgICAgW1Nhc2NoYSBTY2h1bWFubl0KICAgICAKICAqKSBBZGQgbW9kX2V4dF9maWx0ZXIgYXMgYW4gZXhwZXJpbWVudGFsIG1vZHVsZS4gIFRoaXMgbW9kdWxlIGFsbG93cwogICAgIHRoZSBhZG1pbmlzdHJhdG9yIHRvIHVzZSBleHRlcm5hbCBwcm9ncmFtcyBhcyBmaWx0ZXJzLiAgQ3VycmVudGx5LAogICAgIG9ubHkgZmlsdGVyaW5nIG9mIG91dHB1dCBpcyBzdXBwb3J0ZWQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBNb3N0IEFwYWNoZSBmdW5jdGlvbnMgd29yayBvbiBFQkNESUMgbWFjaGluZXMgYWdhaW4sIGFzIHByb3RvY29sCiAgICAgZGF0YSBpcyBub3cgdHJhbnNsYXRlZCAoYWdhaW4pLiAgW0plZmYgVHJhd2lja10KCiAgKikgSW50cm9kdWNlIGFwX3hsYXRlX3Byb3RvX3t0b3xmcm9tfV9hc2NpaSgpIHRvIGNsZWFuIHVwIHNvbWUgb2YKICAgICB0aGUgRUJDRElDIHN1cHBvcnQuICBUaGV5IGFyZSBub29wcyBvbiBBU0NJSSBtYWNoaW5lcywgc28gdGhpcwogICAgIHR5cGUgb2YgdHJhbnNsYXRpb24gZG9lc24ndCBoYXZlIHRvIGJlIHN1cnJvdW5kZWQgYnkgI2lmZGVmCiAgICAgQ0hBUlNFVF9FQkNESUMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggbW9kX2luY2x1ZGUuICB0YWcgY29tbWFuZHMgd29yayBhZ2FpbiwgYW5kIHRoZSBzZXJ2ZXIgd2lsbAogICAgIHNlbmQgdGhlIEZBUSBhZ2Fpbi4gIFRoaXMgYWxzbyBhbGxvd3MgbW9kX2luY2x1ZGUgdG8gc2V0IGFzaWRlCiAgICAgYnVja2V0cyB0aGF0IGluY2x1ZGUgcGFydGlhbCBidWNrZXRzLgogICAgIFtSeWFuIEJsb29tIGFuZCBEYXZpZCBSZWlkXQoKICAqKSBBZGQgc3VleGVjIHN1cHBvcnQgYmFjay4gIFtNYW5vaiBLYXNpY2hhaW51bGFdCgogICopIExpbmdlcmluZyBjbG9zZSBub3cgdXNlcyB0aGUgc29ja2V0IGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcKICAgICBCVUZGLiAgVGhpcyBoYXMgYmVlbiB0ZXN0ZWQsIGJ1dCBzaW5jZSBhbGwgd2UgY2FuIHRlbGwgaXMgdGhhdCBpdAogICAgIGRvZXNuJ3QgZmFpbCwgdGhpcyBuZWVkcyB0byBiZSByZWFsbHkgaGFja2VkIG9uLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBbGxvdyBmaWx0ZXJzIHRvIG1vZGlmeSBoZWFkZXJzIGFuZCBoYXZlIHRob3NlIGhlYWRlcnMgYmUgc2VudCB0bwogICAgIHRoZSBjbGllbnQuICBUaGUgaWRlYSBpcyB0aGF0IHdlIGhhdmUgYW4gaHR0cF9oZWFkZXIgZmlsdGVyIHRoYXQKICAgICBhY3R1YWxseSBzZW5kcyB0aGUgaGVhZGVycyB0byB0aGUgbmV0d29yay4gIFRoaXMgcmVtb3ZlcyB0aGUgbmVlZAogICAgIGZvciB0aGUgQlVGRiB0byBzZW5kIGhlYWRlcnMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIENoYXJzZXQgdHJhbnNsYXRpb246IG1vZF9jaGFyc2V0X2xpdGUgaGFuZGxlcyB0cmFuc2xhdGlvbiBvZgogICAgIHJlcXVlc3QgYm9kaWVzLiAgR2V0IHJpZCBvZiB0aGUgeGxhdGUgdmVyc2lvbiBvZiBhcF9tZDVfZGlnZXN0KCkKICAgICBzaW5jZSB3ZSBkb24ndCBjb21wdXRlIGRpZ2VzdHMgb2YgZmlsdGVyZWQgKGUuZy4sIHRyYW5zbGF0ZWQpIAogICAgIHJlc3BvbnNlIGJvZGllcyB0aGlzIHdheSBhbnltb3JlLiAgKE5vdGUgdGhhdCB3ZSBkb24ndCBkbyBpdCBhdAogICAgIGFsbCBhdCB0aGUgcHJlc2VudDsgc29tZWJvZHkgbmVlZHMgdG8gd3JpdGUgYSBmaWx0ZXIgdG8gZG8gc28uKQogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIElucHV0IGZpbHRlcnMgYW5kIGFwX2dldF9icmlnYWRlKCkgbm93IGhhdmUgYSBpbnB1dCBtb2RlIHBhcmFtZXRlciAKICAgICAoYmxvY2tpbmcsIG5vbi1ibG9ja2luZywgcGVlaykgaW5zdGVhZCBvZiBhIGxlbmd0aCBwYXJhbWV0ZXIuCiAgICAgW2hhY2thdGhvbl0KCiAgKikgVXBkYXRlIHRoZSBtaW1lLnR5cGVzIGZpbGUgdG8gdGhlIHJlZ2lzdGVyZWQgbWVkaWEgdHlwZXMgYXMKICAgICBvZiAyMDAwLTEwLTE5LiBQUiM2NjEzIFtDYXJzdGVuIEtsYXBwIDxjYXJzdGVuLmtsYXBwIGhvbWUubmV0PiwKICAgICBUb255IEZpbmNoXQoKICAqKSBOYW1lc3BhY2UgcHJvdGVjdCBzb21lIG1hY3JvcyBkZWNsYXJlZCBpbiBhcF9jb25maWcuaAogICAgIFtSeWFuIEJsb29tXQoKICAqKSBTdXBwb3J0IEhUVFAgaGVhZGVyIGxpbmUgZm9sZGluZyB3aXRoIGlucHV0IGZpbHRlcmluZy4KICAgICBbR3JlZyBBbWVzXQoKICAqKSBNb2RfaW5jbHVkZSB3b3JrcyBhZ2Fpbi4gIFRoaXMgc2hvdWxkIHN0aWxsIGJlIHJlLXdyaXR0ZW4sIGJ1dCBhdAogICAgIGxlYXN0IG5vdyB3ZSBjYW4gc2VydmUgYW4gU0hUTUwgcGFnZSBhZ2Fpbi4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQmVnaW4gdG8gcmVtb3ZlIEJVRkYgZnJvbSB0aGUgY29yZS4gIEN1cnJlbnRseSwgd2Uga2VlcCBhIHBvaW50ZXIKICAgICB0byBib3RoIHRoZSBCVUZGIGFuZCB0aGUgc29ja2V0IGluIHRoZSBjb25uX3JlYy4gIEZ1bmN0aW9ucyB0aGF0CiAgICAgd2FudCB0byB1c2UgdGhlIEJVRkYgY2FuLCBmdW5jdGlvbnMgdGhhdCB3YW50IHRvIHVzZSB0aGUgc29ja2V0LAogICAgIGNhbi4gIFRoZXkgcG9pbnQgdG8gdGhlIHNhbWUgcGxhY2UuCiAgICAgW1J5YW4gQmxvb21dCgogICopIGFwcl9wc3ByaW50ZiBkb2Vzbid0IHVuZGVyc3RhbmQgJWxsZCBhcyBhIGZvcm1hdC4gIE1ha2UgaXQgJWxkLgogICAgIFtUb21hcyAi1mdyZW4iIDxzdHJpYyBpbmcudW11LnNlPl0KCiAgKikgQVBSIHBpcGVzIG9uIFVuaXggYW5kIFdpbjMyIGFyZSBub3cgY2xlYW5lZCB1cCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIAogICAgIGFzc29jaWF0ZWQgcG9vbCBnb2VzIGF3YXkuICAoQVBSIHBpcGVzIG9uIE9TLzIgd2VyZSBhbHJlYWR5IGhhZCB0aGlzCiAgICAgbG9naWMuKSAgVGhpcyByZXNvbHZzIGEgZmF0YWwgZmlsZSBkZXNjcmlwdG9yIGxlYWsgd2l0aCBDR0lzLiAgCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgVGhlIGZpbmFsIGxpbmUgb2YgdGhlIGNvbmZpZyBmaWxlIHdhcyBub3QgYmVpbmcgcmVhZCBpZiB0aGVyZSB3YXMKICAgICBubyBcbiBhdCB0aGUgZW5kIG9mIGl0LiAgVGhpcyB3YXMgY2F1c2VkIGJ5IGFwcl9mZ2V0cyByZXR1cm5pbmcgCiAgICAgQVBSX0VPRiBldmVuIHRob3VnaCB3ZSBoYWQgcmVhZCB2YWxpZCBkYXRhLiAgVGhpcyBpcyBzb2x2ZWQgYnkKICAgICBtYWtpbmcgY2ZnX2dldGxpbmUgY2hlY2sgdGhlIGJ1ZmYgdGhhdCB3YXMgcmV0dXJuZWQgZnJvbSBhcHJfZmdldHMuCiAgICAgSWYgYXByX2ZnZXRzIHJldHVybiBBUFJfRU9GLCBidXQgdGhlcmUgd2FzIGRhdGEgaW4gdGhlIGJ1ZiwgdGhlbiB3ZQogICAgIHJldHVybiB0aGUgYnVmLCBvdGhlcndpc2Ugd2UgcmV0dXJuIE5VTEwuCiAgICAgW1J5YW4gQmxvb21dCgogICopIFBpcGVkIGxvZ3Mgd29yayBhZ2FpbiBpbiB0aGUgMi4wIHNlcmllcy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgUmVzdG9yZSBmdW5jdGlvbmFsaXR5IGJyb2tlbiBieSB0aGUgbW9kX3Jld3JpdGUgc2VjdXJpdHkgZml4OgogICAgIHJld3JpdGUgbWFwIGxvb2t1cCBrZXlzIGFuZCBkZWZhdWx0IHZhbHVlcyBhcmUgbm93IGV4cGFuZGVkCiAgICAgc28gdGhhdCB0aGUgbG9va3VwIGNhbiBkZXBlbmQgb24gdGhlIHJlcXVlc3RlZCBVUkkgZXRjLgogICAgIFBSICM2NjcxIFtUb255IEZpbmNoXQoKICAqKSBTRUNVUklUWTogVGlnaHRlbiB1cCB0aGUgc3ludGF4IGNoZWNraW5nIG9mIEhvc3Q6IGhlYWRlcnMgdG8gZml4IGEKICAgICBzZWN1cml0eSBidWcgaW4gc29tZSBtYXNzIHZpcnR1YWwgaG9zdGluZyBjb25maWd1cmF0aW9ucwogICAgIHRoYXQgY2FuIGFsbG93IGEgcmVtb3RlIGF0dGFja2VyIHRvIHJldHJpZXZlIHNvbWUgZmlsZXMKICAgICBvbiB0aGUgc3lzdGVtIHRoYXQgc2hvdWxkIGJlIGluYWNjZXNzaWJsZS4gW1RvbnkgRmluY2hdCgogICopIEFkZCBhIHBvb2wgYnVja2V0IHR5cGUuICBUaGlzIGJ1Y2tldCBpcyB1c2VkIGZvciBkYXRhIGFsbG9jYXRlZCBvdXQKICAgICBvZiBhIHBvb2wuICBJZiB0aGUgcG9vbCBpcyBjbGVhbmVkIGJlZm9yZSB0aGUgYnVja2V0IGlzIGRlc3Ryb3llZCwgdGhlbgogICAgIHRoZSBkYXRhIGlzIGNvbnZlcnRlZCB0byBhIGhlYXAgYnVja2V0LCBhbGxvd2luZyBpdCB0byBzdXJ2aXZlIHRoZQogICAgIGRlYXRoIG9mIHRoZSBwb29sLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBZGQgYSBmbHVzaCBidWNrZXQuICBUaGlzIGFsbG93cyBtb2R1bGVzIHRvIHNpZ25hbCB0aGF0IHRoZSBmaWx0ZXJzCiAgICAgc2hvdWxkIGFsbCBmbHVzaCB3aGF0ZXZlciBkYXRhIHRoZXkgY3VycmVudGx5IGhhdmUuICBUaGVyZSBpcyBubyB3YXkKICAgICB0byBhY3R1YWxseSBmb3JjZSB0aGVtIHRvIGRvIHRoaXMsIHNvIGlmIGEgZmlsdGVyIGlnbm9yZXMgdGhpcyBidWNrZXQsCiAgICAgdGhhdCdzIGxpZmUsIGJ1dCBhdCBsZWFzdCB3ZSBjYW4gdHJ5IHdpdGggdGhpcy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQWRkIGFuIG91dHB1dCBmaWx0ZXIgZm9yIHN1Yi1yZXF1ZXN0cy4gIFRoaXMgZmlsdGVyIGp1c3Qgc3RyaXBzIHRoZQogICAgIEVPUyBidWNrZXQgc28gdGhhdCB3ZSBkb24ndCBjb25mdXNlIHRoZSBtYWluIHJlcXVlc3QncyBjb3JlIG91dHB1dAogICAgIGZpbHRlciBieSBzZW5kaW5nIG11bHRpcGxlIEVPUyBidWNrZXRzLiAgVGhpcyBjaGFuZ2UgYWxzbyBtYWtlcyBzdWIKICAgICByZXF1ZXN0cyBzdGFydCB0byBzZW5kIEVPUyBidWNrZXRzIHdoZW4gdGhleSBhcmUgZmluaXNoZWQuCiAgICAgW1J5YW4gQmxvb21dCgogICopIE1ha2UgYXBfYnVja2V0XyhyZWFkfGRlc3Ryb3l8c3BsaXR8c2V0YXNpZGUpIGludG8gbWFjcm9zLiAgQWxzbwogICAgIG1ha2VzIGFwX2J1Y2tldF9kZXN0cm95IGEgcmV0dXJuIHZvaWQsIHdoaWNoIGlzIG9rYXkgYmVjYXVzZSBpdAogICAgIHVzZWQgdG8gYWx3YXlzIHJldHVybiBBUFJfU1VDQ0VTUywgYW5kIG5vYm9keSBldmVyIGNoZWNrZWQgaXRzCiAgICAgcmV0dXJuIHZhbHVlIGFueXdheS4KICAgICBbQ2xpZmYgV29vbGxleSA8Y2xpZmZ3b29sbGV5IHlhaG9vLmNvbT5dCgogICopIFJlbW92ZSB0aGUgaW5kZXggaW50byB0aGUgYnVja2V0LXR5cGUgdGFibGUgZnJvbSB0aGUgYnVja2V0cwogICAgIHN0cnVjdHVyZS4gIFRoaXMgaGFzIG5vdyBiZWVuIHJlcGxhY2VkIHdpdGggYSBwb2ludGVyIHRvIHRoZQogICAgIGJ1Y2tldF90eXBlLiAgQWxzbyBhZGQgc29tZSBtYWNyb3MgdG8gdGVzdCB0aGUgYnVja2V0LXR5cGUuCiAgICAgW1J5YW4gQmxvb21dCgogICopIFJlbmFtZWQgYWxsIE1PRFVMRV9FWFBPUlQgc3ltYm9scyB0byBBUF9NT0RVTEVfREVDTEFSRSBhbmQgYWxsIHN5bWJvbHMKICAgICBmb3IgQ09SRV9FWFBPUlQgdG8gQVBfQ09SRV9ERUNMQVJFIChuYW1lc3BhY2UgcHJvdGVjdGluZyB0aGUgd3JhcHBlcikKICAgICBhbmQgcmV0aXRsZWQgQVBJX0VYUE9SVCBhcyBBUF9ERUNMQVJFIGFuZCBBUFJfRVhQT1JUIGFzIEFQUl9ERUNMQVJFLgogICAgIEFsbCBfVkFSXyBmbGF2b3JzIGNoYW5nZXMgdG8gX0RBVEEgdG8gYmUgYWJzb2x1dGVseSBjbGVhci4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgLywgLy8sIC8vc2VydmVybmFtZSBhbmQgLy9zZXJ2ZXIvc2hhcmVuYW1lIAogICAgIHBhcnNpbmcgb2YgPERpcmVjdG9yeT4gYmxvY2tzIHVuZGVyIFdpbjMyIGFuZCBPUzIuCiAgICAgW1RpbSBDb3N0ZWxsbywgV2lsbGlhbSBSb3dlLCBCcmlhbiBIYXJ2YXJkXQoKICAqKSBSZW1vdmUgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIGZyb20gdGhlIGFwX2J1Y2tldCB0eXBlLiAgVGhleSBoYXZlIGJlZW4KICAgICByZXBsYWNlZCB3aXRoIGEgZ2xvYmFsIHRhYmxlLiAgTW9kdWxlcyBhcmUgYWxsb3dlZCB0byByZWdpc3RlciBidWNrZXQKICAgICB0eXBlcyBhbmQgdXNlIHRoZW4gdXNlIHRob3NlIGJ1Y2tldHMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIG1vZF9jZ2lkOiBJbiB0aGUgaGFuZGxlciwgc2h1dCBkb3duIHRoZSBVbml4IHNvY2tldCAob25seSBmb3Igd3JpdGUpIAogICAgIG9uY2Ugd2UgZmluaXNoIHdyaXRpbmcgdGhlIHJlcXVlc3QgYm9keSB0byB0aGUgY2dpIGNoaWxkIHByb2Nlc3M7IAogICAgIG90aGVyd2lzZSwgdGhlIGNsaWVudCBkb2Vzbid0IGhpdCBFT0Ygb24gc3RkaW4uICBTbWFsbCByZXF1ZXN0IGJvZGllcyAKICAgICB3b3JrZWQgd2l0aG91dCB0aGlzIGNoYW5nZSAoZm9yIHJlYXNvbnMgSSBkb24ndCB1bmRlcnN0YW5kKSwgYnV0IGxhcmdlIAogICAgIG9uZXMgZGlkbid0LiAgW0plZmYgVHJhd2lja10KCiAgKikgUmVtb3ZlIGZpbGUgYnVja2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20gdGhlIGFwX2J1Y2tldCB0eXBlLgogICAgIFRoaXMgaGFzIGJlZW4gbW92ZWQgdG8gYSBmaWxlX2J1Y2tldCBzcGVjaWZpYyB0eXBlIHRoYXQgaGFuZ3Mgb2ZmCiAgICAgdGhlIGRhdGEgcG9pbnRlciBpbiB0aGUgYXBfYnVja2V0IHR5cGUuCiAgICAgW1J5YW4gQmxvb21dCgogICopIElucHV0IGZpbHRlcmluZyBub3cgaGFzIGEgdGhpcmQgYXJndW1lbnQuICBUaGlzIGlzIHRoZSBhbW91bnQgb2YgZGF0YQogICAgIHRvIHJlYWQgZnJvbSBsb3dlciBmaWx0ZXJzLiAgVGhpcyBhcmd1bWVudCBjYW4gYmUgLTEsIDAsIG9yIGEgcG9zaXRpdmUKICAgICBudW1iZXIuICAtMSBtZWFucyBnaXZlIG1lIGFsbCB0aGUgZGF0YSB5b3UgaGF2ZSwgSSdsbCBkZWFsIHdpdGggaXQgYW5kCiAgICAgbGV0IHlvdSBrbm93IGlmIEkgbmVlZCBtb3JlLiAgMCBtZWFucyBnaXZlIG1lIG9uZSBsaW5lIGFuZCBvbmUgbGluZQogICAgIG9ubHkuICBBIHBvc2l0aXZlIG51bWJlciBtZWFucyBJIHdhbnQgbm8gbW9yZSB0aGFuIHRoaXMgbXVjaCBkYXRhLgoKICAgICBDdXJyZW50bHksIG9ubHkgMCBhbmQgYSBwb3NpdGl2ZSBudW1iZXIgYXJlIGltcGxlbWVudGVkLiAgVGhpcyBhbGxvd3MKICAgICB1cyB0byByZW1vdmUgdGhlIHJlbWFpbmluZyBmaWVsZCBmcm9tIHRoZSBjb25uX3JlYyBzdHJ1Y3R1cmUsIHdoaWNoCiAgICAgaGFzIGFsc28gYmVlbiBkb25lLgogICAgIFtSeWFuIEJsb29tXSAKICAgIAogICopIEJpZyBjbGVhbnVwIG9mIHRoZSBpbnB1dCBmaWx0ZXJpbmcuICBUaGUgZ29hbCBpcyB0aGF0IGh0dHBfZmlsdGVyCiAgICAgdW5kZXJzdGFuZHMgdHdvIGNvbmRpdGlvbnMsIGhlYWRlcnMgYW5kIGJvZHkuICBJdCBrbm93cyB3aGVyZSBpdCBpcwogICAgIGJhc2VkIG9uIGMtPnJlbWFpbmluZy4gIElmIGMtPnJlbWFpbmluZyBpcyAwLCB0aGVuIHdlIGFyZSBpbiBoZWFkZXJzLAogICAgIGFuZCBodHRwX2ZpbHRlciByZXR1cm5zIGEgbGluZSBhdCBhIHRpbWUuICBJZiBpdCBpcyBub3QgMCwgdGhlbiB3ZSBhcmUKICAgICBpbiBib2R5LCBhbmQgaHR0cF9maWx0ZXIgcmV0dXJucyByYXcgZGF0YSwgYnV0IG9ubHkgdXAgdG8gYy0+cmVtYWluaW5nCiAgICAgYnl0ZXMuICBJdCBjYW4gcmV0dXJuIGxlc3MsIGJ1dCBuZXZlciBtb3JlLgogICAgIFtHcmVnIEFtZXMsIFJ5YW4gQmxvb20sIEplZmYgVHJhd2lja10KCiAgKikgbW9kX2NnaTogV3JpdGUgYWxsIG9mIHRoZSByZXF1ZXN0IGJvZHkgdG8gdGhlIGNoaWxkLCBub3QganVzdCB3aGF0CiAgICAgdGhlIGtlcm5lbCB3b3VsZCBhY2NlcHQgb24gdGhlIGZpcnN0IHdyaXRlLiAgW0plZmYgVHJhd2lja10KCiAgKikgQmFjayBvdXQgdGhlIGNoYW5nZSB0aGF0IG1vdmVkIHRoZSBicmlnYWRlIGZyb20gdGhlIGNvcmVfb3V0cHV0X2ZpbHRlcnMKICAgICBjdHggdG8gdGhlIGNvbm5fcmVjLiAgU2luY2UgYWxsIHJlcXVlc3RzIG92ZXIgYSBnaXZlbiBjb25uZWN0aW9uCiAgICAgZ28gdGhyb3VnaCB0aGUgc2FtZSBjb3JlX291dHB1dF9maWx0ZXIsIHRoZSBjdHggcG9pbnRlciBoYXMgdGhlCiAgICAgY29ycmVjdCBsaWZldGltZS4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgRml4IGFub3RoZXIgYnVnIGluIHRoZSBzZW5kX3RoZV9maWxlKCkgcmVhZC93cml0ZSBsb29wLiBBIHBhcnRpYWwKICAgICBzZW5kIGJ5IGFwcl9zZW5kIHdvdWxkIGNhdXNlIHVuc2VudCBkYXRhIGluIHRoZSByZWFkIGJ1ZmZlciB0bwogICAgIGdldCBjbG9iYmVyZWQuIENvbXBsZXRlIG1ha2luZyBzZW5kX3RoZV9maWxlIGhhbmRsZSBwYXJ0aWFsCiAgICAgd3JpdGVzIHRvIHRoZSBuZXR3b3JrLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXggYSBjb3VwbGUgb2YgdHlwZSBmaXhlcyB0byBhbGxvdyBjb21waWxhdGlvbiBvbiBBSVggYWdhaW4KICAgICBbVmljdG9yIEouIE9ybGlrb3dza2kgPHYuai5vcmxpa293c2tpIGd0ZS5uZXQ+XQoKICAqKSBGaXggYnVnIGluIHNlbmRfdGhlX2ZpbGUoKSB3aGljaCBjYXVzZXMgb2Zmc2V0IHRvIGJlIGlnbm9yZWQKICAgICBpZiB0aGVyZSBhcmUgbm8gaGVhZGVycyB0byBzZW5kLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBIYW5kbGUgQVBSX0VOT1RJTVBMIHJldHVybmVkIGZyb20gYXByX3NlbmRmaWxlIGluIHRoZSBjb3JlCiAgICAgZmlsdGVyLiBVc2VmdWwgZm9yIHN1cHBvcnRpbmcgV2luZG93cyA5KiB3aXRoIGEgYmluYXJ5CiAgICAgY29tcGlsZWQgb24gV2luZG93cyBOVC4KICAgICBbQmlsbCBTdG9kZGFyZF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wYTcKCiAgKikgUmVpbXBsZW1lbnQgY29yZV9vdXRwdXRfZmlsdGVyIHRvIGJ1ZmZlci9zYXZlIGJ1Y2tldCBicmlnYWRlcwogICAgIGFjcm9zcyBtdWx0aXBsZSBjYWxscyB0byB0aGUgY29yZV9maWx0ZXIuIFRoZSBicmlnYWRlIHdpbGwgYmUKICAgICBzZW50IHdoZW4gZWl0aGVyIE1JTl9CWVRFU19UT19TRU5EIG9yIE1BWF9JT1ZFQ19UT19XUklURQogICAgIHRocmVzaG9sZHMgYXJlIGhpdCBvciB0aGUgRU9TIGJ1Y2tldCBpcyByZWNlaXZlZC4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgQ3JlYXRlIGV4cGVyaW1lbnRhbCBmaWx0ZXIgKGJ1ZmZlcl9maWx0ZXIpIHRoYXQgY29hbGVzY2VzIGJ5dGVzIAogICAgIGludG8gb25lIGxhcmdlIGJ1ZmZlciBiZWZvcmUgaW52b2tpbmcgdGhlIG5leHQgZmlsdGVyIGluIHRoZQogICAgIGNoYWluLiBUaGlzIGZpbHRlciBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdpdGggdGhlIGN1cnJlbnQgCiAgICAgaW1wbGVtZW50YXRpb24gb2YgbW9kX2F1dG9pbmRleCB3aGVuIGl0IGluc2VydGVkIGFib3ZlIHRoZQogICAgIGNodW5rX2ZpbHRlci4gbW9kX2F1dG9pbmRleCBnZW5lcmF0ZXMgYSBsb3Qgb2YgYnJpZ2FkZXMgdGhhdAogICAgIGNvbnRhaW5pbmcgYnVja2V0cyBob2xkaW5nIGp1c3QgYSBmZXcgYnl0ZXMgZWFjaC4gVGhlCiAgICAgYnVmZmVyX2ZpbHRlciBjb2FsZXNjZXMgdGhlc2UgYnVja2V0cyBpbnRvIGEgc2luZ2xlIGxhcmdlIGJ1Y2tldC4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgQWRkIGFwcl9zZW5kZmlsZSgpIHN1cHBvcnQgaW50byB0aGUgY29yZV9vdXRwdXRfZmlsdGVyLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBBZGQgYXByX3NlbmR2KCkgc3VwcG9ydCBpbnRvIHRoZSBjb3JlX291dHB1dF9maWx0ZXIuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIEZpeCBtb2RfbG9nX2NvbmZpZyBzbyB0aGF0IGl0IGNvbXBpbGVzIGNsZWFubHkgd2l0aCBCVUZGRVJFRF9MT0dTCiAgICAgW01pa2UgQWJib3R0IDxtamEgc2dpLmNvbT5dCgogICopIFJlbW92ZSBhcF9zZW5kX2ZiLiAgVGhpcyBpcyBubyBsb25nZXIgdXNlZCBpbiBBcGFjaGUsIGFuZCBpdCBkb2Vzbid0CiAgICAgbWFrZSBtdWNoIHNlbnNlLCBiZWNhdXNlIEFwYWNoZSB1c2VzIGJ1Y2tldHMgaW5zdGVhZCBvZiBCVUZGcyBub3cuCiAgICAgW1J5YW4gQmxvb21dCgogICopIHNlbmRfdGhlX2ZpbGUgbm93IGZhbGxzIGJhY2sgdG8gYSByZWFkL3dyaXRlIGxvb3Agb24gcGxhdGZvcm1zIHRoYXQKICAgICBkbyBub3QgaGF2ZSBzZW5kZmlsZS4KICAgICBbUnlhbiBCbG9vbSBhbmQgQnJpYW4gSGF2YXJkXQoKICAqKSBJbnN0YWxsIGFwYWNoZWN0bCBjb3JyZWN0bHksIGFuZCBzdWJzdGl0dXRlIHRoZSBwcm9wZXIgdmFsdWVzIHNvCiAgICAgdGhhdCBpdCB3b3JrcyBhZ2Fpbi4gIFtSeWFuIEJsb29tXQoKICAqKSBCZXR0ZXIoPz8pIGhhbmRsZSBwbGF0Zm9ybXMgdGhhdCBsYWNrIHNlbmRmaWxlKCkuCiAgICAgW0ppbSBKYWdpZWxza2ldCgogICopIEFQUiBub3cgaGFzIFVVSUQgZ2VuZXJhdGlvbi9mb3JtYXR0aW5nL3BhcnNpbmcgc3VwcG9ydC4KICAgICBbR3JlZyBTdGVpbl0KCiAgKikgQmVnaW4gdGhlIGh0dHBfZmlsdGVyLiAgVGhpcyBpcyBhbiBpbnB1dCBmaWx0ZXIgdGhhdCB1bmRlcnN0YW5kcwogICAgIHRoZSBhYnNvbHV0ZSBiYXNpYyBhbW91bnQgcmVxdWlyZWQgdG8gcGFyc2UgYW4gSFRUUCBSZXF1ZXN0LiAgVGhlCiAgICAgZ29hbCBpcyB0byBiZSBhYmxlIHRvIHNwbGl0IGhlYWRlcnMgZnJvbSByZXF1ZXN0IGJvZHkgYmVmb3JlIHBhc3NpbmcKICAgICB0aGUgZGF0YSBiYWNrIHRvIHRoZSBvdGhlciBmaWx0ZXJzLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBCcmluZyBmb3J3YXJkIGZyb20gMS4zLjEzIHRoZSBjb25maWcgZGlyZWN0b3J5IGltcGxlbWVudGF0aW9uCiAgICAgW0ppbSBKYWdpZWxza2ldCgogICopIGluc3RhbGwgYXB4cyBpZiBpdCBpcyBjcmVhdGVkCiAgICAgW1J5YW4gQmxvb21dCgogICopIEFkZGVkIEFQUl9JU19TVEFUVVNfY29uZGl0aW9uIHRlc3QgbWFjcm9zIHRvIGVsaW1pbmF0ZSBjYW5vbmljYWwgZXJyb3IKICAgICBjb252ZXJzaW9ucy4gIFtXaWxsaWFtIFJvd2VdCgogICopIE5vdyB0aGF0IHdlIGhhdmUgYXBfYWRkX2lucHV0X2ZpbHRlcigpLCByZW5hbWUgYXBfYWRkX2ZpbHRlcigpIHRvIAogICAgIGFwX2FkZF9vdXRwdXRfZmlsdGVyKCkuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBNdWx0aXBsZSBidWlsZCBhbmQgY29uZmlndXJhdGlvbiBmaXhlcwogICAgQnVpbGQgcHJvY2VzczoKCiAgICAgIC1hZGQgZGF0YWRpciBhbmQgbG9jYWxzdGF0ZWRpciBzdWJzdGl0dXRpb25zCiAgICAgIC1maXggbGF5b3V0IG5hbWUKICAgICAgLWZpeCBsb2dmaWxlbmFtZSBtaXNzcGVsbGluZwogICAgICAtZml4IGV2YWx1YXRpb24gb2YgaW5zdGFsbGF0aW9uIGRpciB2YXJpYWJsZXMgYW5kCiAgICAgIC1yZXBsYWNlICRmb29iYXIgYnkgJChmb29iYXIpIHRvIGJlIHVzZWZ1bGwgaW4gdGhlIG1ha2VmaWxlCiAgICAKICAgIENyb3NzIGNvbXBpbGU6CiAgICAKICAgICAgLWFkZCBydWxlcyBmb3IgY3Jvc3MtY29tcGlsaW5nIGluIHJ1bGVzLm1rLiBPa2F5LCBydWxlIHRvIGNoZWNrIGZvcgogICAgICAgJENDX0ZPUl9CVUlMRCBpcyBzdGlsbCBtaXNzaW5nCiAgICAgIC11c2UgQ0hFQ0tfVE9PTCBpbnN0ZWFkIG9mIENIRUNLX1BST0cgZm9yIHJhbmxpYgogICAgICAtYWRkIG1pc3NpbmcgIkFSPUBBUkAiIHRvIHNldmVyYWx5IE1ha2VmaWxlLmluJ3MKICAgICAgLWNhY2hlIHJlc3VsdCBmb3IgInN0cnVjdCBybGltaXQiCiAgICAgIC1jb21waWxlIGFsbCBoZWxwZXIgcHJvZ3JhbXMgd2l0aCBuYXRpdmUgYW5kIGNyb3NzIGNvbXBpbGVyCiAgICAgICBhbmQgdXNlIHRoZSBuYXRpdmUgdmVyc2lvbiB0byBnZW5lcmF0ZSBoZWFkZXIgZmlsZQogICAgIFsiUvxkaWdlciIgS3VobG1hbm4gPFRhZHUgZ214LmRlPl0KCiAgKikgUHJlcGFyZSBvdXIgYXV0b2NvbmYgc2V0dXAgZm9yIGF1dG9jb25mIDIuMTRhIGFuZCBmb3IgY3Jvc3MtCiAgICAgY29tcGlsaW5nLgogICAgIFsiUvxkaWdlciIgS3VobG1hbm4gPFRhZHUgZ214LmRlPl0KCiAgKikgRml4IGEgYnVnIHdoZXJlIGEgY2xpZW50IHdoaWNoIG9ubHkgc2VuZHMgXG4gdG8gZGVsaW1pdCBoZWFkZXIKICAgICBsaW5lcyAobmV0Y2F0KSBnZXRzIGEgc3RyYW5nZSBsb29raW5nIEhUVFBfTk9UX0lNUExFTUVOVEVEIAogICAgIG1lc3NhZ2UuICBTdGFydCB3b3JraW5nIG9uIGViY2RpYyBjby1leGlzdGFuY2Ugd2l0aCBpbnB1dCAKICAgICBmaWx0ZXJpbmcuCiAgICAgW1dpbGxpYW0gUm93ZSwgR3JlZyBBbWVzXQoKICAqKSBJZiBtb2Rfc28gaXMgZW5hYmxlZCBpbiB0aGUgc2VydmVyIGFsd2F5cyBjcmVhdGUgbGliZXhlYywgZXZlbgogICAgIGlmIHRoZXJlIGFyZSBubyBtb2R1bGVzIGluc3RhbGxlZCBpbiB0aGlzIGRpcmVjdG9yeS4gIFRoaXMgaXMgYQogICAgIHJlcXVpcmVtZW50IGZvciBBUFhTIHRvIHdvcmsgY29ycmVjdGx5LgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBDb25uZWN0aW9uIG9yaWVudGVkIG91dHB1dCBmaWx0ZXJzIGFyZSBub3cgc3RvcmVkIGluIHRoZSAKICAgICBjb25uX3JlYyBpbnN0ZWFkIG9mIHRoZSByZXF1ZXN0X3JlYy4gIFRoaXMgYWxsb3dzIHVzIHRvIGFkZCB0aGUKICAgICBvdXRwdXQgZmlsdGVyIGluIHRoZSBwcmUtY29ubmVjdGlvbiBwaGFzZSBpbnN0ZWFkIG9mIHRoZQogICAgIHBvc3RfcmVhZF9yZXF1ZXN0IHBoYXNlLCB3aGljaCBrZWVwcyB1cyBmcm9tIHRyeWluZyB0byB3cml0ZSBhbgogICAgIGVycm9yIHBhZ2UgYmVmb3JlIHdlIGhhdmUgYSBmaWx0ZXIgdG8gd3JpdGUgdG8gdGhlIG5ldHdvcmsuCiAgICAgW1J5YW4gQmxvb20sIEplZmYgVHJhd2ljaywgYW5kIEdyZWcgQW1lc10KCiAgKikgQ2xlYW5pbmcgdXAgYW4gbW1hcCBidWNrZXQgbm8gbG9uZ2VyIGRlbGV0ZXMgdGhlIG1tYXAuICBBbgogICAgIG1tYXAgY2FuIGJlIHVzZWQgYWNyb3NzIG11bHRpcGxlIGJ1Y2tldHMgKGRlZmF1bHRfaGFuZGxlciB3aXRoCiAgICAgYnl0ZSByYW5nZXMsIG1vZF9maWxlX2NhY2hlLCBtb2RfbW1hcF9zdGF0aWMpLCBzbyBjbGVhbnVwIG9mCiAgICAgdGhlIG1tYXAgaXRzZWxmIGNhbid0IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVja2V0LgogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZCAuZGxsIGNhY2hpbmcgZGlyZWN0aXZlIElTQVBJQ2FjaGVGaWxlIHRvIG1vZF9pc2FwaS4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBSYWRpY2FsIHN1cmdlcnkgdG8gaW1wcm92ZSBtb2RfaXNhcGkgc3VwcG9ydCB1bmRlciBXaW4zMi4KICAgICBJbmNsdWRlcyBhIG51bWJlciBvZiBuZXdlciBTZXJ2ZXJTdXBwb3J0RnVuY3Rpb24gY2FsbHMsIHN1cHBvcnQKICAgICBmb3IgUmVhZENsaWVudCAoaW4gb3JkZXIgdG8gcmV0cmlldmUgUE9TVHMgZ3JlYXRlciB0aGFuIDQ4S0IpLAogICAgIGFuZCBnZW5lcmFsIGJ1ZyBmaXhlcyB0byBtb3JlIHJlbGlhYmx5IGxvYWQgSVNBUEkgLmRsbCdzIGFuZAogICAgIHByZXZlbnQgbGVha2luZyBoYW5kbGUgcmVzb3VyY2VzLiAgTm90ZTogVGhlcmUgYXJlIHN0aWxsIAogICAgIGRpc2NyZXBhbmNpZXMgYmV0d2VlbiBJSVMncyBhbmQgQXBhY2hlJ3MgU2VydmVyVmFyaWFibGVzLCBhbmQKICAgICBhc3luYyBjYWxscyBhcmUgc3RpbGwgbm90IHN1cHBvcnRlZC4gIEFkZGl0aW9uYWwgd2FybmluZ3MgYXJlCiAgICAgbG9nZ2VkIHRvIGZhY2lsaXRhdGUgZGVidWdnaW5nIG9mIHVuc3VwcG9ydGVkIElTQVBJIGNhbGxzLgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIEFkZCBpbnB1dCBmaWx0ZXJpbmcgdG8gQXBhY2hlLiAgVGhlIGJhc2ljIGlkZWEgZm9yIHRoZSBpbnB1dAogICAgIGZpbHRlcnMgaXMgdGhlIHNhbWUgYXMgdGhlIGlkZWFzIGZvciBvdXRwdXQgZmlsdGVycy4gIFRoZSBiaWdnZXN0CiAgICAgZGlmZmVyZW5jZSBpcyB0aGF0IGluc3RlYWQgb2YgY2FsbGluZyBhcF9wYXNzX2JyaWdhZGUsIGFwX2dldF9icmlnYWRlCiAgICAgc2hvdWxkIGJlIGNhbGxlZCwgYW5kIHRoZSBvcmRlciBvZiBleGVjdXRpb24gZm9yIHRoZSBmaWx0ZXIgaXRzZWxmIGlzCiAgICAgZGlmZmVyZW50LiAgV2hlbiB3cml0aW5nIGFuIG91dHB1dCBmaWx0ZXIsIGEgYnJpZ2FkZSBpcyBwYXNzZWQgaW4sCiAgICAgYW5kIGZpbHRlcnMgb3BlcmF0ZSBkaXJlY3RseSBvbiB0aGF0IGJyaWdhZGUsIHdoZW4gZG9uZSwgdGhleSBjYWxsCiAgICAgYXBfcGFzc19icmlnYWRlLiAgSW5wdXQgZmlsdGVycyBhcmUgdGhlIGV4YWN0IG9wcG9zaXRlLiAgQmVjYXVzZSBpbnB1dAogICAgIGlzIG5vdCBhIHB1c2ggb3BlcmF0aW9uLCBmaWx0ZXJzIGZpcnN0IGNhbGwgYXBfZ2V0X2JyaWdhZGUuICBXaGVuIHRoaXMKICAgICBmdW5jdGlvbiByZXR1cm5zLCB0aGUgaW5wdXQgZmlsdGVyIHdpbGwgYmUgbGVmdCB3aXRoIGEgdmFsaWQgYnJpZ2FkZS4KICAgICBUaGUgaW5wdXQgZmlsdGVyIHNob3VsZCB0aGVuIG9wZXJhdGUgb24gdGhlIGJyaWdhZGUsIGFuZCByZXR1cm4uCiAgICAgW1J5YW4gQmxvb21dCgogICopIEZpeCBidWlsZGluZyBvbiBCU0QvT1MgdXNpbmcgaXRzIG5hdGl2ZSBtYWtlLiBUaGUgYnVpbGQgc3lzdGVtCiAgICAgZmFsbHMgYmFjayB0byB0aGUgQlNEIC5pbmNsdWRlIGRpcmVjdGl2ZSBvbiB0aGF0IGhvc3QgcGxhdGZvcm0uCiAgICAgW1Nhc2NoYSBTY2h1bWFubl0KCiAgKikgRXhwYW5kIGRibW1hbmFnZSB0byBhbGxvdyAtZCAtbSAtcyAtcCBvcHRpb25zIGZvciBDcnlwdCwgTUQ1LAogICAgIFNIQTEgYW5kIHBsYWludGV4dCBwYXNzd29yZCBlbmNvZGluZ3MuICBNYWtlIGZlYXR1cmUgdGVzdHMgYQogICAgIGJpdCBtb3JlIGZsZXhpYmxlLiAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQ2hhcnNldCB0cmFuc2xhdGlvbjogbW9kX2NoYXJzZXRfbGl0ZSBoYW5kbGVzIG91dHB1dCBjb250ZW50IAogICAgIHRyYW5zbGF0aW9uIGluIGEgZmlsdGVyLiAgbW9kX2NoYXJzZXRfbGl0ZSBubyBsb25nZXIgaWdub3JlcyAKICAgICBzdWJyZXF1ZXN0cy4gIEEgYnVuY2ggb2YgY3J1ZnQgcmVsYXRlZCB0byBCVUZGJ3Mgc3VwcG9ydCBmb3IKICAgICB0cmFuc2xhdGluZyByZXF1ZXN0IGFuZCByZXNwb25zZSBib2RpZXMgd2FzIHJlbW92ZWQuICAKICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBNb3ZlIHRoZSBhZGRpdGlvbiBvZiB0aGUgQ09SRSBmaWx0ZXIgdG8gdGhlIHBvc3RfcmVhZF9yZXF1ZXN0CiAgICAgaG9vayBpbiBodHRwX2NvcmUuYy4gIFRoaXMgcmVtb3ZlcyB0aGUgbmVlZCB0byBhZGQgdGhlIGZpbHRlciBpbgogICAgIG11bHRpcGxlIHBsYWNlcyBhbmQgYWxsb3dzIGZvciBhbiBTU0wgbW9kdWxlIHRvIGJlIGFkZGVkIG11Y2gKICAgICBzaW1wbGVyLiBbUnlhbiBCbG9vbV0KCiAgKikgU0VDVVJJVFk6IENWRS0yMDAwLTA5MTMgKGN2ZS5taXRyZS5vcmcpCiAgICAgRml4IGEgc2VjdXJpdHkgcHJvYmxlbSB0aGF0IGFmZmVjdHMgY2VydGFpbiBjb25maWd1cmF0aW9ucyBvZgogICAgIG1vZF9yZXdyaXRlLiBJZiB0aGUgcmVzdWx0IG9mIGEgUmV3cml0ZVJ1bGUgaXMgYSBmaWxlbmFtZSB0aGF0CiAgICAgY29udGFpbnMgZXhwYW5zaW9uIHNwZWNpZmllcnMsIGVzcGVjaWFsbHkgcmVnZXhwIGJhY2tyZWZlcmVuY2VzCiAgICAgJDAuLiQ5IGFuZCAlMC4uJTksIHRoZW4gaXQgbWF5IGJlIHBvc3NpYmxlIGZvciBhbiBhdHRhY2tlciB0bwogICAgIGFjY2VzcyBhbnkgZmlsZSBvbiB0aGUgd2ViIHNlcnZlci4gW1RvbnkgRmluY2hdCgogICopIEZpeCBhIGJ1ZyB3aGVyZSBlcnJvcnMgdGhhdCBhcmUgZGV0ZWN0ZWQgZHVyaW5nIGVhcmx5IHJlcXVlc3QgcGFyc2luZwogICAgIGRvbid0IHByb2R1Y2UgdmlzaWJsZSBIVFRQIGVycm9yIG1lc3NhZ2VzIGF0IHRoZSBicm93c2VyLCBiZWNhdXNlCiAgICAgdGhlIGNvcmVfZmlsdGVyIHdhc24ndCBwcmVzZW50LiAgW0dyZWcgQW1lc10KCiAgKikgUHJvdmlkZSBhcHJfc29ja2xlbl90IGFzIGEgcG9ydGFiaWxpdHkgYWlkLiAKICAgICBbVmljdG9yICBKLiBPcmxpa293c2tpXQoKICAqKSBPdmVyaGF1bCBvZiBkYm1tYW5hZ2UgdG8gYWxsb3cgYSBncm91cHMgYXJnIChhcyBpbiBBcGFjaGUgMS4yKQogICAgIGFzIHdlbGwgYXMgYSBjb21tZW50IGFyZyB0byB0aGUgYWRkLCBhZGR1c2VyIGFuZCB1cGRhdGUgY21kcy4KICAgICB1cGRhdGUgYWxsb3dzIHRoZSB1c2VyIHRvIGNsZWFyIG9yIHByZXNlcnZlIHB3L2dyb3Vwcy9jb21tZW50LgogICAgIEZpeGVkIGEgYnVnIGluIGRibW1hbmFnZSB0aGF0IHByZXZlbnRlZCB0aGUgY2hlY2sgb3B0aW9uIGZyb20gCiAgICAgcGFyc2luZyBhIHBhc3N3b3JkIGZvbGxvd2VkIGJ5IDpncm91cC4uLiB0ZXh0LiAgQ29ycmVjdGVkIHRoZQogICAgIHNlZWQgY2FsY3VhbGF0aW9uIGZvciBXaW4zMiBzeXN0ZW1zLCBhbmQgYWRkZWQgLWxzZGJtIHN1cHBvcnQuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQ29uZmlndXJlZCBtb2RfYXV0aF9kYm0gdG8gY29tcGlsZSB3aXRoIHNkYm1saWIgdW5kZXIgV2luMzIuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgQXZvaWQgYSBzZWdmYXVsdCB3aGVuIHBhcnNpbmcgLmh0YWNjZXNzIGZpbGVzLiAgQW4gCiAgICAgdW5pbml0aWFsaXplZCB0cmVlIHBvaW50ZXIgd2FzIHBhc3NlZCB0byBhcF9idWlsZF9jb25maWcoKS4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBDaGFuZ2UgdGhlIHdheSB0aGF0IGluZXRfYWRkciAmIGluZXRfbmV0d29yayBhcmUgY2hlY2tlZCBmb3IKICAgICBpbiBBUFIncyBjb25maWd1cmUgcHJvY2VzcyB0byBhbGxvdyBCZU9TIEJPTkUgdG8gY29ycmVjdGx5CiAgICAgZmluZCB0aGVtLiBXaXRoIHRoaXMgY2hhbmdlIEJlT1MgQk9ORSBub3cgYnVpbGRzIGZyb20gc291cmNlCiAgICAgd2l0aCBubyBwcm9ibGVtcy4gIFtEYXZpZCBSZWlkXQoKICAqKSBGaXggYSBidWcgaW4gYXByX2NyZWF0ZV9wcm9jZXNzKCkgZm9yIFVuaXguICBUaGUgTlVMTCBzaWduaWZ5aW5nCiAgICAgdGhlIGVuZCBvZiB0aGUgcGFyYW1ldGVycyB0byBleGVjdmUoKSB3YXMgc3RvcmVkIGluIHRoZSB3cm9uZwogICAgIGxvY2F0aW9uLCBvdmVybGF5aW5nIHRoZSBzdG9yYWdlIGJleW9uZCB0aGUgbmV3YXJnc1tdIGFycmF5IGFuZCAKICAgICBhbHNvIHBhc3NpbmcgdW5pbml0aWFsaXplZCBzdG9yYWdlIHRvIGV4ZWN2ZSgpLCB3aGljaCB3b3VsZCAKICAgICBzb21ldGltZXMgZmFpbCB3aXRoIEVGQVVMVC4gIFtKZWZmIFRyYXdpY2tdCgogICopIEZpeCBhIGJ1ZyBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZSBjb250YWluZXJzLiAgV2l0aCBhIHNlcXVlbmNlCiAgICAgbGlrZSB0aGlzIGluIHRoZSBjb25maWcgZmlsZQoKICAgICAgIDxJZk1vZHVsZSBtb2Rfa2lscm95LmM+CiAgICAgICBhbnkgc3R1ZmYKICAgICAgIDwvSWZNb2R1bGU+CiAgICAgICA8SWZNb2R1bGUgbW9kX2xvdmVqb3kuYz4KICAgICAgIChibGFuayBsaW5lKQogICAgICAgYW55IHN0dWZmCiAgICAgICA8L0lmTW9kdWxlPgoKICAgICB0aGUgc2Vjb25kIGNvbnRhaW5lciB3b3VsZCBiZSB0ZXJtaW5hdGVkIGF0IHRoZSBibGFuayBsaW5lIGR1ZSB0bwogICAgIHNlZGltZW50IGluIHRoZSBidWZmZXIgZnJvbSByZWFkaW5nIHRoZSBwcmlvciA8L0lmTW9kdWxlPiBhbmQgYW4gCiAgICAgZXJyb3IgbWVzc2FnZSB3b3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoZSByZWFsIDwvSWZNb2R1bGU+IGZvciB0aGUKICAgICBzZWNvbmQgY29udGFpbmVyLiAgQWxzbyBkdWUgdG8gdGhpcyBwcm9ibGVtLCBhbnkgdHdvIGNoYXJhY3RlcnMgCiAgICAgY291bGQgYmUgdXNlZCBmb3IgIjwvIiBpbiB0aGUgY2xvc2Ugb2YgYSBjb250YWluZXIuICAKICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBhcF9hZGRfZmlsdGVyIHByb3RvdHlwZSBjaGFuZ2VkIHRvIHJlbW92ZSB0aGUgY3R4IHBvaW50ZXIuICBUaGUKICAgICBwb2ludGVyIHN0aWxsIHJlbWFpbnMgaW4gdGhlIGZpbHRlciBzdHJ1Y3R1cmUsIGJ1dCBpdCBjYW4gbm90IGJlCiAgICAgYSBwYXJ0IG9mIHRoZSBhcF9hZGRfZmlsdGVyIHByb3RvdHlwZS4gIFRoZSByZWFzb24gaXMgdGhhdCB3aGVuCiAgICAgdGhlIGNvcmUgdXNlcyBBZGRGaWx0ZXIgdG8gYWRkIGEgZmlsdGVyIHRvIHRoZSBzdGFjayBpdCBkb2Vzbid0CiAgICAga25vdyBob3cgdG8gYWxsb2NhdGUgdGhlIGN0eCBwb2ludGVyLCBvciBldmVuIGhvdyBtdWNoIG1lbW9yeSBzaG91bGQKICAgICBiZSBhbGxvY2F0ZWQuICBUaGUgZmlsdGVycyB3aWxsIGhhdmUgdG8gYmUgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcKICAgICB0aGUgY3R4IG1lbW9yeSB3aGVuIHRoZXkgbmVlZCBpdC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQWRkIGFuIEFkZEZpbHRlciBkaXJlY3RpdmUuICBUaGlzIGRpcmVjdGl2ZSB0YWtlcyBhIGxpc3Qgb2YgZmlsdGVycwogICAgIHRoYXQgc2hvdWxkIGJlIGFjdGl2YXRlZCBmb3IgdGhlIHJlcXVlc3RlZCByZXNvdXJjZS4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgYXByX3NucHJpbnRmKCk6IEdldCBxdWFkIGZvcm1hdCBzdHJpbmdzIHdvcmtpbmcgb24gT1MvMzkwIChhbmQgcGVyaGFwcwogICAgIHNvbWUgb3RoZXIgcGxhdGZvcm1zKS4gIFtKZWZmIFRyYXdpY2tdCgogICopIE1vZGlmeSBtb2RfaW5jbHVkZSB0byBiZSBhIGZpbHRlci4gIEN1cnJlbnRseSwgaXQgaGFzIG9ubHkgYmVlbiB0ZXN0ZWQKICAgICBvbiBhY3R1YWwgZmlsZXMsIGJ1dCBpdCBzaG91bGQgd29yayBmb3IgQ0dJIHNjcmlwdHMgdG9vLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBhcHJfcHV0YygpLCBhcHJfcHV0cygpIGZvciBVbml4OiBoYW5kbGUgYnVmZmVyZWQgZmlsZXMgYW5kIGludGVycnVwdGVkCiAgICAgd3JpdGVzLiAgYXByX2ZsdXNoKCkgZm9yIFVuaXg6IGhhbmRsZSBpbnRlcnJ1cHRlZCB3cml0ZXMuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgTmFtZVZpcnR1YWxIb3N0IGNhbiBub3cgdGFrZSAiKiIgYXMgYW4gYXJndW1lbnQgaW5zdGVhZCBvZgogICAgIGFuIElQIGFkZHJlc3MuIFRoaXMgYWxsb3dzIHlvdSB0byBjcmVhdGUgYSBwdXJlbHkgbmFtZS1iYXNlZAogICAgIHZpcnR1YWwgaG9zdGluZyBzZXJ2ZXIgdGhhdCBkb2VzIG5vdCBoYXZlIGFueSBJUCBhZGRyZXNzZXMgaW4KICAgICB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGFuZCB3aGljaCBpZ25vcmVzIHRoZSBsb2NhbCBhZGRyZXNzCiAgICAgb2YgYW55IGNvbm5lY3Rpb25zLiBQUiAjNTU5NSwgUFIgIzQ0NTUgW1RvbnkgRmluY2hdCgogICopIEZpeCBzb21lIGNvbXBpbGUgd2FybmluZ3MgaW4gbW9kX21tYXBfc3RhdGljLmMKICAgICBbTWlrZSBBYmJvdHQgPG1qYSBzZ2kuY29tPl0KCiAgKikgRml4IGNodW5raW5nIHByb2JsZW0gd2l0aCBDR0kgc2NyaXB0cy4gIFRoZSBnZW5lcmFsIHByb2JsZW0gd2FzIHRoYXQKICAgICB0aGUgQ0dJIG1vZHVsZXMgd2VyZSBhZGRpbmcgYW4gRU9TIGJ1Y2tldCBhbmQgdGhlbiB0aGUgY29yZSBhZGRlZCBhbgogICAgIEVPUyBidWNrZXQuICBUaGUgY2h1bmtpbmcgZmlsdGVyIGZpbmFsaXplcyB0aGUgY2h1bmtlZCByZXNwb25zZSB3aGVuIGl0CiAgICAgZW5jb3VudGVycyBhbiBFT1MgYnVja2V0LiAgQmVjYXVzZSB0d28gRU9TIGJ1Y2tldHMgd2VyZSBzZW50LCB3ZQogICAgIGZpbmFsaXplZCB0aGUgcmVzcG9uc2UgdHdpY2UuICBUaGUgZml4IGlzIHRvIG1ha2Ugc3VyZSB3ZSBvbmx5IHNlbmQgb25lCiAgICAgRU9TLCBieSB1dGlsaXppbmcgYSBmbGFnIGluIHRoZSByZXF1ZXN0X3JlYy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgYXByX3B1dF9vc19maWxlKCkgbm93IHNldHMgdXAgdGhlIHVuZ2V0IGJ5dGUgYXBwcm9wcmlhdGVseSBvbiBVbml4CiAgICAgYW5kIFdpbjMyLiAgUHJldmlvdXNseSwgdGhlIGZpcnN0IHJlYWQgZnJvbSBhbiBhcHJfZmlsZV90IHNldCB1cCB2aWEKICAgICBhcHJfcHV0X29zX2ZpbGUoKSB3b3VsZCByZXR1cm4gYSAnXDAnLiAgW0plZmYgVHJhd2lja10KCiAgKikgTW9kX2NnaWQgbm93IGNyZWF0ZXMgYSBzaW5nbGUgZWxlbWVudCBidWNrZXQgYnJpZ2FkZSwgd2l0aCBhIHBpcGUKICAgICBidWNrZXQsIGluc3RlYWQgb2YgdXNpbmcgQlVGRidzIGFuZCBhcF9yKi4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQVBSVkFSUy5pbiBubyBsb25nZXIgb3ZlcndyaXRlcyB0aGUgRVhUUkFfTElCUyB2YXJpYWJsZS4KICAgICBbTWlrZSBBYmJvdHQgPG1qYSBzZ2kuY29tPl0KCiAgKikgUmVtb3ZlIGFwX2JvcGVuZiBmcm9tIGJ1ZmYgY29kZS4gIFRoaXMgcmVxdWlyZWQgbW9kaWZ5aW5nIHRoZSBmaWxlX2NhY2hlCiAgICAgY29kZSB0byB1c2UgQVBSIGZpbGUncyBkaXJlY3RseSBpbnN0ZWFkIG9mIGdvaW5nIHRocm91Z2ggQlVGRnMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEZpeCBjb21waWxlIGJyZWFrIG9uIHNvbWUgcGxhdGZvcm1zIGZvciBtb2RfbWltZV9tYWdpYy5jCiAgICAgW0pvaG4gSy4gU3RlcmxpbmcgPHN0ZXJsaW5nIGNvdmFsZW50Lm5ldD5dCgogICopIEZpeCBtZXJnaW5nIG9mIEFkZERlZmF1bHRDaGFyc2V0IGRpcmVjdGl2ZS4KICAgICBQUiAjNTg3MiAoMS4zKSBbSnVuIEt1cml5YW1hIDxrdXJpeWFtYSBpbWdzcmMuY28uanA+XQoKICAqKSBNaW5vciByZXZhbXAgb2YgdGhlIHJsaW1pdCBzZWN0aW9ucyBvZiBjb2RlLiBXZSBub3cgdGVzdAogICAgIGV4cGxpY2l0bHkgZm9yIHNldHJsaW1pdCBhbmQgZ2V0cmxpbWl0LiBBbHNvLCB1bml4ZF9zZXRfcmxpbWl0KCkKICAgICBpcyBub3cgImF2YWlsYWJsZSIgZXZlbiBpZiB0aGUgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0CiAgICAgdGhlIHJsaW1pdCBmYW1pbHkgKGl0J3MganVzdCBhIG5vb3AgdGhvdWdoKS4gW0ppbSBKYWdpZWxza2ldCgogICopIE1pZ3JhdGUgdGhlIHByZS1zZWxlY3Rpb24gb2Ygd2hpY2ggTVBNIHRvIHVzZSBmb3Igc3BlY2lmaWMKICAgICBwbGF0Zm9ybXMgdG8gaGludHMubTQsIHdoaWNoIGNvbnRhaW5zIChvciBzaG91bGQgY29udGFpbikKICAgICBhbGwgcGxhdGZvcm0gc3BlY2lmaWMgImhpbnRzIi4gW0ppbSBKYWdpZWxza2ldCgogICopIFJlbW92ZSBJT0xzIGZyb20gQXBhY2hlLiAgV2l0aCBmaWx0ZXJpbmcsIElPTHMgYXJlIG5vIGxvbmdlciBuZWNlc3NhcnkKICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQWRkIHRhYmxlcyB3aXRoIG5vbi1zdHJpbmcvYmluYXJ5IHZhbHVlcyB0byBBUFIuCiAgICAgW0tlbiBDb2FyXQoKICAqKSBGaXggc29tZSBiYWQgY2FsbHMgdG8gYXBfbG9nX3JlcnJvcigpIGluIG1vZF9yZXdyaXRlLiAKICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBVcGRhdGUgUENSRSB0byB2ZXJzaW9uIDMuMi4gIFtSeWFuIEJsb29tXQoKICAqKSBDaGFuZ2UgdGhlIHdheSBidWNrZXRzJyBkZXN0cm95IGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHNvIHRoYXQKICAgICB0aGV5IGNhbiBiZSBtb3JlIGRpcmVjdGx5IHVzZWQgd2hlbiBjaGFuZ2luZyB0aGUgdHlwZSBvZiBhCiAgICAgYnVja2V0IGluIHBsYWNlLiBbVG9ueSBGaW5jaF0KCiAgKikgQWRkIGdlbmVyaWMgc3VwcG9ydCBmb3IgcmVmZXJlbmNlLWNvdW50aW5nIHRoZSByZXNvdXJjZXMgdXNlZCBieQogICAgIGJ1Y2tldHMsIGFuZCBhbHRlciB0aGUgSEVBUCBhbmQgTU1BUCBidWNrZXRzIHRvIHVzZSBpdC4gQ2hhbmdlCiAgICAgdGhlIHdheSBidWNrZXRzIGFyZSBpbml0aWFsaXNlZCB0byBzdXBwb3J0IGNoYW5naW5nIHRoZSB0eXBlIG9mCiAgICAgYnVja2V0cyBpbiBwbGFjZSwgYW5kIHVzZSBpdCB3aGVuIHNldHRpbmcgYXNpZGUgVFJBTlNJRU5UIGJ1Y2tldHMuCiAgICAgQ2hhbmdlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBUUkFOU0lFTlQgYnVja2V0cyBzbyB0aGF0IGl0IGNhbiBiZQogICAgIG1vc3RseSBzaGFyZWQgd2l0aCBJTU1PUlRBTCBidWNrZXRzLCB3aGljaCBhcmUgbm93IGltcGxlbWVudGVkLgogICAgIFtUb255IEZpbmNoXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjBhNgoKICAqKSBBZGQgc3VwcG9ydCB0byBBcGFjaGUgYW5kIEFQUiBmb3IgZHNvcyBvbiBPUy8zOTAuICBbR3JlZyBBbWVzXQoKICAqKSBBZGQgYSBjaHVua2luZyBmaWx0ZXIgdG8gQXBhY2hlLiAgVGhpcyBicmluZ3MgdXMgb25lIHN0ZXAgY2xvc2VyCiAgICAgdG8gcmVtb3ZpbmcgQlVGRi4gW1J5YW4gQmxvb21dCgogICopIGFwX2FkZF9maWx0ZXIgbm93IGFkZHMgZmlsdGVycyBpbiBhIExJRk8gZmFzaGlvbi4gIFRoZSBmaXJzdCBmaWx0ZXIKICAgICBhZGRlZCB0byB0aGUgc3RhY2sgaXMgdGhlIGxhc3QgZmlsdGVyIHRvIGJlIGNhbGxlZC4gIFtSeWFuIEJsb29tXQoKICAqKSBBcGFjaGUgMi4wIGhhcyBiZWVuIGNvbXBsZXRlbHkgZG9jdW1lbnRlZCB1c2luZyBTY2FuZG9jLiAgVGhlCiAgICAgZG9jcyBjYW4gYmUgZ2VuZXJhdGVkIGJ5IHJ1bm5pbmcgJ21ha2UgZG9jcycuICBbUnlhbiBCbG9vbV0KCiAgKikgQWRkIGZpbHRlcmVkIEkvTyB0byBBcGFjaGUuICBUaGlzIGlzIGJhc2VkIG9uIGJ1Y2tldCBicmlnYWRlcywKICAgICBDdXJyZW50bHkgdGhlIGJ1Y2tldHMgc3RpbGwgdXNlIEJVRkYgdW5kZXIgdGhlIGNvdmVycywgYnV0IHRoYXQKICAgICBzaG91bGQgY2hhbmdlIHF1aWNrbHkuICBUaGUgb25seSBjdXJyZW50bHkgd3JpdHRlbiBmaWx0ZXIgaXMgdGhlCiAgICAgY29yZSBmaWx0ZXIgd2hpY2gganVzdCBjYWxscyBhcF9id3JpdGUuICBbVGhlIEFwYWNoZSBHcm91cF0KCiAgKikgQVBSIGxvY2tzIG9uIFVuaXg6IExldCBBUFJfTE9DS0FMTCBsb2NrcyB3b3JrIHdoZW4gQVBSIGlzbid0CiAgICAgYnVpbHQgd2l0aCB0aHJlYWQgc3VwcG9ydC4gIFtKZWZmIFRyYXdpY2tdCgogICopIEFib3J0IGNvbmZpZ3VyYXRpb24gaWYgLS13aXRoLWxheW91dCB3YXMgc3BlY2lmaWVkIGFuZCB0aGVyZSdzCiAgICAgbm8gbGF5b3V0IGRlZmluaXRpb24gZmlsZS4gIFtLZW4gQ29hcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yICctLXdpdGgtcG9ydD1uJyBvcHRpb24gdG8gY29uZmlndXJlLiAgW0tlbiBDb2FyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgZXh0ZW5zaW9uIG1ldGhvZHMgZm9yIHRoZSBBbGxvdyByZXNwb25zZSBoZWFkZXIKICAgICBmaWVsZCwgYW5kIGFuIEFQSSByb3V0aW5lIGZvciBhY2Nlc3Npbmcgci0+YWxsb3dlZCBhbmQgdGhlCiAgICAgbGlzdCBvZiBleHRlbnNpb24gbWV0aG9kcyBpbiBhIHVuaWZpZWQgbWFubmVyLiAgW0tlbiBDb2FyXQoKICAqKSBtb2RfY2Vybl9tZXRhOiBmaXggYnJva2VuIGZpbGUgcmVhZGluZyBsb29wIGluIHNjYW5fbWV0YV9maWxlKCkuCiAgICAgW1JvYiBTaW1vbnNvbiA8c2ltbyB1cy5pYm0uY29tPl0KCiAgKikgR2V0IHhsYXRlIGJ1aWxkcyB3b3JraW5nIGFnYWluLiAgVGhlIGFwciByZW5hbWluZyBpbiAyLjBhNSBicm9rZQogICAgIEFQQUNIRV9YTEFURSBidWlsZHMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzaW5nIHByb2JsZW0gd2FzIGZpeGVkLiAgV2hlbiB0aGUgCiAgICAgY29uZmlndXJhdGlvbiBmaWxlIHN0YXJ0ZWQgd2l0aCBhbiBJZk1vZHVsZS9JZkRlZmluZSBjb250YWluZXIsIAogICAgIG9ubHkgdGhlIGxhc3Qgc3RhdGVtZW50IGluIHRoZSBjb250YWluZXIgd291bGQgYmUgcmV0YWluZWQuICAKICAgICBbSmVmZiBUcmF3aWNrXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAyLjBhNQoKICAqKSBQZXJjaGlsZCBpcyBzZXJ2aW5nIHBhZ2VzIGFmdGVyIHBhc3NpbmcgdGhlbSB0byBkaWZmZXJlbnQgY2hpbGQKICAgICBwcm9jZXNzZXMuICBUaGVyZSBhcmUgc3RpbGwgYSBsb3Qgb2YgYnVncywgYnV0IHRoaXMgZG9lcyB3b3JrLiAgSQogICAgIGhhdmUgbWFkZSByZXF1ZXN0cyBhZ2FpbnN0IHRoZSBzYW1lIGluc3RhbGxhdGlvbiBvZiBBcGFjaGUsIGFuZCBoYWQKICAgICBkaWZmZXJlbnQgc2VydmVycyB1c2UgZGlmZmVyZW50IHVzZXIgSURzIHRvIHNlcnZlIHRoZSByZXNwb25zZXMuCiAgICAgVGhpcyBjaGFuZ2UgbW92ZXMgdG8gdXNpbmcgc29ja2V0cGFpciBpbnN0ZWFkIG9mIGFuIEFGX1VOSVggc29ja2V0LgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBQZXJjaGlsZCBNUE0gc3RpbGwgZG9lc24ndCB3b3JrIHBlcmZlY3RseSwgYnV0IGl0IGlzIHNlcnZpbmcgcGFnZXMuCiAgICAgSXQgY2FuJ3Qgc2VlbSB0byBwYXNzIGJldHdlZW4gY2hpbGQgcHJvY2Vzc2VzIHlldCwgYnV0IEkgdGhpbmsgd2UKICAgICBhcmUgY2xvc2VyIG5vdyB0aGFuIGJlZm9yZS4gIFRoaXMgbW92ZXMgdXMgYmFjayB0byB1c2luZyBVbml4CiAgICAgRG9tYWluIFNvY2tldHMuICBbUnlhbiBCbG9vbV0KCiAgKikgbGliYXByIGZ1bmN0aW9ucyBhbmQgdHlwZXMgcmVuYW1lZCB3aXRoIGFwcl8gcHJlZml4LgogICAgICNpbmNsdWRlICJhcHJfY29tcGF0LmgiIGZvciAxLjMueCBiYWNrd2FyZHMgY29tcGF0CiAgICAgW1BlcmxdCgogICopIEZpeCBwcm9ibGVtcyB3aXRoIEFQUiBzb2NrYWRkciBoYW5kbGluZyBvbiBXaW4zMi4gIEl0IGRpZG4ndCBhbHdheXMKICAgICByZXR1cm4gdGhlIHJpZ2h0IGluZm9ybWF0aW9uIG9uIHRoZSBsb2NhbCBzb2NrZXQgYWRkcmVzcy4KICAgICBbR3JlZ29yeSBOaWNob2xscyA8Z25pY2hvbGxzIGxldmVsOC5jb20+XQoKICAqKSBhcF9yZWN2KCkgb24gV2luMzI6IFNldCBieXRlcy1yZWFkIHRvIDAgb24gZXJyb3IuICAKICAgICBbR3JlZ29yeSBOaWNob2xscyA8Z25pY2hvbGxzIGxldmVsOC5jb20+XQoKICAqKSBBZGQgYW4gb3B0aW9uIHRvIG5vdCBkZXRhY2ggZnJvbSB0aGUgY29udHJvbGxpbmcgdGVybWluYWwgd2l0aG91dAogICAgIGdvaW5nIGludG8gc2luZ2xlIHByb2Nlc3MgbW9kZS4gIFRoaXMgYWxsb3dzIGZvciBtdWNoIGVhc2llcgogICAgIGRlYnVnZ2luZyBvZiB0aGUgcHJvY2VzcyBzdGFydHVwIGNvZGUuIFtSeWFuIEJsb29tXQoKICAqKSBhYjogZG9uJ3QgdXNlIHBlcnJvcigpIHRvIHJlcG9ydCB0aGUgZmFpbHVyZSBvZiBhbiBBUFIgZnVuY3Rpb24uCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgTWFrZSBkZXh0ZXIsIG1wbXRfcHRocmVhZCwgYW5kIHBlcmNoaWxkIE1QTXMgbm90IGRlc3Ryb3kgdGhlCiAgICAgc2NvcmVib2FyZCBvbiBncmFjZWZ1bCByZXN0YXJ0cy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgRml4IHNlZ2ZhdWx0L1NJR1NFR1Ygd2hlbiBydW5uaW5nIGd6aXAgZnJvbSBtb2RfbWltZV9tYWdpYy5jLgogICAgIEFuIGludmFsaWQgYXBfcHJvY190IHdhcyBwYXNzZWQgdG8gYXBfY3JlYXRlX3Byb2Nlc3MoKS4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBbGxvdyBtb2R1bGVzIHRvIHJlZ2lzdGVyIGZpbHRlcnMuICBUaG9zZSBmaWx0ZXJzIGFyZSBzdGlsbAogICAgIG5ldmVyIGNhbGxlZCwgYnV0IHRoaXMgaXMgYSBzdGVwIGluIHRoZSByaWdodCBkaXJlY3Rpb24uCiAgICAgW1J5YW4gQmxvb20gYW5kIEdyZWcgU3RlaW5dCgogICopIFJlZ2lzdGVyIHRoZSBtb2RfY2dpZCBkYWVtb24gcHJvY2VzcyBmb3IgY2xlYW51cCBzbyB0aGF0IGl0IGlzCiAgICAga2lsbGVkIGF0IHRlcm1pbmF0aW9uIGlmIGl0IGRvZXMgbm90IGRpZSB3aGVuIHRoZSBwYXJlbnQgZ2V0cwogICAgIFNJR1RFUk0uICBUaGlzIGNoYW5nZSBpcyB0byBmaXggb2NjYXNpb25hbCBwcm9ibGVtcyB3aGVyZSB0aGUKICAgICBwcm9jZXNzIHN0YXlzIGFyb3VuZC4gIEJ1Z3MgaW4gc2ltaWxhciBsb2dpYyBpbiBtb2RfcmV3cml0ZSBhbmQKICAgICBtb2RfaW5jbHVkZSB3ZXJlIGFsc28gZml4ZWQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggYSBidWcgaW4gdGhlIHRpbWUgaGFuZGxpbmcuICBCYXNpY2FsbHksIHdlIHdlcmUgaW1wbG9kaW5nIGEgdGltZQogICAgIGluIGFwX3BhcnNlSFRUUGRhdGUsIGJ1dCBpdCBoYWQgYm9ndXMgZGF0YSBpbiB0aGUgZXhwbG9kZWQgdGltZSBmb3JtYXQuCiAgICAgTmFtZWx5LCB0bV91c2VjIGFuZCB0bV9nbXRvZmYgd2VyZSBub3QgZmlsbGVkIG91dC4gIGFwX2ltcGxvZGVfdGltZQogICAgIHVzZXMgdGhvc2UgdHdvIGZpZWxkcyB0byBhZGp1c3QgdGhlIHRpbWUgdmFsdWUuICBCZWNhdXNlIG9mIHRoZSBIVFRQCiAgICAgc3BlYywgYm90aCBvZiB0aG9zZSB2YWx1ZXMgY2FuIGJlIHplcm8nZWQgb3V0IHNhZmVseS4gIFRoaXMgZml4ZXMKICAgICB0aGUgYnVnIGNvcnJlY3RseS4gIFtSeWFuIEJsb29tXQoKICAqKSBGaXggYSBjb3VwbGUgb2YgcGxhY2UgaW4gdGhlIFdpbmRvd3MgY29kZSB3aGVyZSB0aGUgd3JvbmcgZXJyb3IKICAgICBjb2RlIHdhcyBiZWluZyByZXR1cm5lZC4gW0dyZWdvcnkgTmljaG9sbHMgPGduaWNob2xscyBsZXZlbDguY29tPl0KCiAgKikgRml4IFBPT0xfREVCVUcgKGF0IGxlYXN0IGZvciBwcmVmb3JrIG1wbSkuIFtEZWFuIEdhdWRldF0KCiAgKikgQWRkZWQgdGhlIEFQUl9FT0xfU1RSIG1hY3JvIGZvciBwbGF0Zm9ybSBkZXBlbmRlbnQgZGlmZmVyZW5jZXMgaW4gCiAgICAgbG9nZmlsZXMgYW5kIG90aGVyIHJhdyB0ZXh0IChzdWNoIGFzIGFsbCBBUFIgZmlsZXMpLiAgRml4ZXMgbG9nZmlsZXMKICAgICBub3QgdGVybWluYXRlZCB3aXRoIGNyL2xmIHNlcXVlbmNlcyBpbiBXaW4zMi4gIFtXaWxsaWFtIFJvd2VdCgogICopIE1vdmUgYWxsIHN0cmluZ3MgZnVuY3Rpb25zIGluIEFQUiB0byBzcmMvbGliL2Fwci9zdHJpbmdzIGFuZCBjcmVhdGUKICAgICBhcHJfc3RyaW5ncy5oIGZvciB0aGUgcHJvdG90eXBlcy4gW1J5YW4gQmxvb21dCgogICopIEFQUiBsb2NrIGZpeGVzOiB3aGVuIHVzaW5nIFN5c1Ygc2VtcywgZmxvY2soKSwgb3IgZmNudGwoKSwgYmUgc3VyZQogICAgIHRvIHJlcGVhdCB0aGUgc3lzY2FsbCB1bnRpbCB3ZSBzdG9wIGdldHRpbmcgRUlOVFIuICBJIG5vdGljZWQgYQogICAgIHJlbGF0ZWQgcHJvYmxlbSBhdCB0ZXJtaW5hdGlvbiAoU0lHVEVSTSkgb24gRnJlZUJTRCB3aGVuIHVzaW5nCiAgICAgZmNudGwoKS4gIEFwYWNoZSAxLjMgaGFkIHRoZXNlIG5ldyBsb29wcyB0b28uICBBbHNvLCBtYWtlIHRoZSBmbG9jaygpIAogICAgIGltcGxlbWVudGF0aW9uIHdvcmsgcHJvcGVybHkgd2l0aCBjaGlsZCBpbml0LiAgUHJldmlvdXNseSwgYXBfbG9jaygpCiAgICAgd2FzIGVzc2VudGlhbGx5IGEgbm8tb3AgYmVjYXVzZSBhbGwgY2hpbGRyZW4gd2VyZSB1c2luZyBkaWZmZXJlbnQKICAgICBsb2NrcyBhbmQgdGh1cyBub2JvZHkgZXZlciBibG9ja2VkLiAgW0plZmYgVHJhd2lja10KCiAgKikgVGhlIGh0ZG9jcy8gdHJlZSBoYXMgYmVlbiBtb3ZlZCBvdXQgb2YgdGhlIENWUyBzb3VyY2UgdHJlZSBpbnRvCiAgICAgYSBzZXBhcmF0ZSBhcmVhIGZvciBlYXNpZXIgZGV2ZWxvcG1lbnQuICBUaGlzIGhhcyBOTyBFRkZFQ1Qgb24KICAgICBlbmQtdXNlcnMgb3IgQXBhY2hlIGluc3RhbGxhdGlvbnMuICBbS2VuIENvYXJdCgogICopIEludGVncmF0ZSB0aGUgbW9kX2RhdiBtb2R1bGUgZm9yIFdlYkRBViBwcm90b2NvbCBoYW5kbGluZy4gVGhpcwogICAgIGFkZHMgdGhlIGRhdiBhbmQgZGF2X2ZzIG1vZHVsZXMsIHRoZSBTREJNIGxpYnJhcnksIGFuZCBhZGRpdGlvbmFsCiAgICAgWE1MIGhhbmRsaW5nIHV0aWxpdGllcy4gW0dyZWcgU3RlaW5dCgogICopIENsZWFuIG91dCBvYnNvbGV0ZSBuYW1lcyAoZnJvbSBodHRwZC5oKSBmb3IgdGhlIEhUVFAgU3RhdHVzIENvZGVzCiAgICAgW0dyZWcgU3RlaW5dCgogICopIFVwZGF0ZSB0aGUgbGliL2V4cGF0LWxpdGUvIGxpYnJhcnkgKGJyaW5nIGZvcndhcmQgY2hhbmdlcyBmcm9tCiAgICAgdGhlIEFwYWNoZSAxLjMgcmVwb3NpdG9yeSkuIFtHcmVnIFN0ZWluXQoKICAqKSBJZiBzaXplb2YobG9uZyBsb25nKSA9PSBzaXplb2YobG9uZyksIHRoZW4gcHJlZmVyIGxvbmcgaW4gQVBSCiAgICAgY29uZmlndXJlLmluLiAgW0RhdmUgSGlsbCA8ZGRoaWxsIHprMy5kZWMuY29tPl0KCiAgKikgQWRkIGFwX3NlbmRmaWxlIGZvciBUcnU2NCBVbml4LiAgQWxzbywgYWRkIGFuIGVycm9yIG1lc3NhZ2UgZm9yCiAgICAgbWFjaGluZXMgd2hlcmUgc2VuZGZpbGUgaXMgZGV0ZWN0ZWQsIGJ1dCBub2JvZHkgaGFzIHdyaXR0ZW4gYXBfc2VuZGZpbGUuCiAgICAgW0RhdmUgSGlsbCA8ZGRoaWxsIHprMy5kZWMuY29tPl0KCiAgKikgQ29tcGlsZSBmaXhlcyBpbiBtb2RfbW1hcF9zdGF0aWMuICBbVmljdG9yIEouIE9ybGlrb3dza2ldCgogICopIGFiIHdvdWxkIHN0YXJ0IHVwIG1vcmUgY29ubmVjdGlvbnMgdGhhbiBuZWVkZWQsIHRoZW4gcXVpdCB3aGVuIHRoZQogICAgIGRlc2lyZWQgbnVtYmVyIHdlcmUgZmluaXNoZWQuIEFsc28gZml4ZWQgYSBsb2dpYyBlcnJvciBpbnZvbHZpbmcKICAgICBhYiBrZWVwYWxpdmVzLiAgW1ZpY3RvciBKLiBPcmxpa293c2tpXQoKICAqKSBXaW5OVDogSW1wbGVtZW50IG5vbi1ibG9ja2luZyBwaXBlcyB3aXRoIHRpbWVvdXRzIHRvIGNvbW11bmljYXRlCiAgICAgd2l0aCBDR0lzLiBBcGFjaGUgMi4wYTQgaGFkIG5vbi1ibG9ja2luZyBwaXBlcyBidXQgd2l0aG91dCAKICAgICB0aW1lb3V0cyAoaS5lLCBpZiBhIHRpbWVvdXQgd2FzIHNwZWNpZmllZCwgdGhlIHBpcGUgcmV2ZXJ0ZWQgdG8KICAgICBhIGZ1bGwgYmxvY2tpbmcgcGlwZSkuIE5vdyB0aGUgYmVoYXZpb3VyIGlzIG1vcmUgaW4gbGluZSB3aXRoCiAgICAgVW5peCBub24tYmxvY2tpbmcgcGlwZXMuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIFdpbk5UOiBJbXBsZW1lbnQgYWNjZXB0IHNvY2tldCByZXVzZS4gVXNpbmcgbW9kX2ZpbGVfY2FjaGUgdG8KICAgICBjYWNoZSBvcGVuIGZpbGUgaGFuZGxlcyBhbG9uZyB3aXRoIGFjY2VwdCBzb2NrZXQgcmV1c2UgZW5hYmxlcwogICAgIEFwYWNoZSAyLjAgdG8gc2VydmUgbm9uLWtlZXBhbGl2ZSByZXF1ZXN0cyBmb3Igc3RhdGljIGZpbGVzIGF0CiAgICAgM3ggdGhlIHJhdGUgb2YgQXBhY2hlIDEuMy4oZS5nLCBBcGFjaGUgMS4zIHdpbGwgc2VydmUgNDAwIHJwcwogICAgIGFuZCBBcGFjaGUgMi4wIHdpbGwgc2VydmUgYWxtb3N0IDEyMDAgcnBzIG9uIG15IHN5c3RlbSkuCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIE1lcmdlIG1vZF9tbWFwX3N0YXRpYyBmdW5jdGlvbiBpbnRvIG1vZF9maWxlX2NhY2hlLiBtb2RfZmlsZV9jYWNoZQogICAgIHN1cHBvcnRzIHR3byBjb25maWcgZGlyZWN0aXZlcywgbW1hcGZpbGUgKHNhbWUgYmVoYXZpb3VzIGFzCiAgICAgbW9kX21tYXBfc3RhdGljKSBhbmQgY2FjaGVmaWxlLiBVc2UgdGhlIGNhY2hlZmlsZSBkaXJlY3RpdmUKICAgICB0byBjYWNoZSBvcGVuIGZpbGUgaGFuZGxlcy4gVGhpcyBkaXJlY3RpdmUgb25seSB3b3JrcyBvbiBzeXN0ZW1zCiAgICAgdGhhdCBoYXZlIGltcGxlbWVudGVkIHRoZSBhcF9zZW5kZmlsZSBBUEkuIGNhY2hlZmlsZSB3b3JrcyB0b2RheQogICAgIG9uIFdpbmRvd3MgTlQsIGJ1dCBoYXMgbm90IGJlZW4gdGVzdGVkIG9uIGFueSBmbGF2b3JzIG9mIFVuaXguCiAgICAgW0JpbGwgU3RvZGRhcmRdCgogICopIENsZWFudXAgdGhlIGNvbmZpZ3VyYXRpb24uICBXaXRoIHRoZSBsYXN0IGZldyBjaGFuZ2VzIHRoZQogICAgIGNvbmZpZ3VyYXRpb24gcHJvY2VzcyBhdXRvbWF0aWNhbGx5OgogICAgICAgICBpbmhlcml0cyBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gYnVpbGQgZnJvbSBBUFIuICBBbGxvd2luZwogICAgICAgICBBUFIgdG8gaW5mb3JtIEFwYWNoZSB0aGF0IGl0IHNob3VsZCBvciBzaG91bGQgbm90IHVzZSAtbGRsCiAgICAgICAgCiAgICAgICAgIERldGVjdHMgd2hpY2ggbW9kX2NnaSBzaG91bGQgYmUgdXNlZCBtb2RfY2dpIG9yIG1vZF9jZ2lkLAogICAgICAgICBiYXNlZCBvbiB0aGUgdGhyZWFkaW5nIG1vZGVsCgogICAgICAgICBBcGFjaGUgY2FsbHMgQVBSJ3MgY29uZmlndXJlIHByb2Nlc3MgYmVmb3JlIGZpbmlzaGluZyBpdCdzCiAgICAgICAgIGNvbmZpZ3VyYXRpb24gcHJvY2Vzc2luZywgYWxsb3dpbmcgZm9yIG1vcmUgaW5mb3JtYXRpb24gZmxvdwogICAgICAgICBiZXR3ZWVuIHRoZSB0d28uCiAgICAgW1J5YW4gQmxvb21dCiAgICAgICAgIAoKICAqKSBDaGFuZ2UgVW5peCBhbmQgV2luMzIgYXBfc2V0c29ja29wdCgpIHNvIHRoYXQgQVBSX1NPX05PTkJMT0NLCiAgICAgd2l0aCBub24temVybyBhcmd1bWVudCBtYWtlcyB0aGUgc29ja2V0IG5vbi1ibG9ja2luZy4gIEJlT1MgYW5kCiAgICAgT1MvMiBhbHJlYWR5IHdvcmtlZCB0aGlzIHdheS4gIFtKZWZmIFRyYXdpY2tdCgogICopIGFwX2Nsb3NlKCkgbm93IGNhbGxzIGFwX2ZsdXNoKCkgZm9yIGJ1ZmZlcmVkIGZpbGVzLCBzbyB3cml0ZQogICAgIG9wZXJhdGlvbnMgd29yayBhIHdob2xlIGxvdCBiZXR0ZXIgb24gYnVmZmVyZWQgZmlsZXMuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IGVycm9yIG1lc3NhZ2VzIGlzc3VlZCBmcm9tIE1QTXMgd2hpY2ggZXhwbGFpbiB3aGVyZSB0byBjaGFuZ2UKICAgICBjb21waWxlZC1pbiBsaW1pdHMgKGUuZy4sIFRocmVhZHNQZXJDaGlsZCwgTWF4Q2xpZW50cywgU3RhcnRUcmVhZHMpLgogICAgIFtHcmVnIEFtZXNdCgogICopIGFwX2NyZWF0ZV9waXBlKCkgbm93IGxlYXZlcyBwaXBlcyBpbiBibG9ja2luZyBzdGF0ZS4gIChUaGlzIGhlbHBzIAogICAgIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHN5c2NhbGxzIG9uIFVuaXguKSAgYXBfc2V0X3BpcGVfdGltZW91dCgpIGlzCiAgICAgbm93IHRoZSB3YXkgdGhhdCB0aGUgYmxvY2tpbmcgc3RhdGUgb2YgYSBwaXBlIGlzIG1hbmlwdWxhdGVkLgogICAgIGFwX2Jsb2NrX3BpcGUoKSBpcyBnb25lLiAgW0plZmYgVHJhd2lja10KCiAgKikgQ29ycmVjdCB0aGUgcHJvYmxlbSB3aGVyZSB0aGUgb25seSBsb2NhbCBob3N0IG5hbWUgdGhhdCB0aGUgSVAgc3RhY2sKICAgICBjYW4gZGlzY292ZXIgYXJlICd1bmRvdHRlZCcgcHJpdmF0ZSBuYW1lcy4gIElmIG5vIGZ1bGx5IHF1YWxpZmllZAogICAgIGRvbWFpbiBuYW1lIGNhbiBiZSBpZGVudGlmaWVkLCB0aGUgZGVmYXVsdCBTZXJ2ZXJOYW1lIHdpbGwgYmUgc2V0IHRvCiAgICAgdGhlIG1hY2hpbmUncyBJUCBhZGRyZXNzIHN0cmluZy4gQSB3YXJuaW5nIGlzIGFsd2F5cyBwcm92aWRlZCBpZiB0aGUKICAgICBTZXJ2ZXJOYW1lIG5vdCBzcGVjaWZpZWQsIGJ1dCBhc3N1bWVkLiAgU29sdmVzIFBSNjIxNSBbV2lsbGlhbSBSb3dlXQoKICAqKSBSZXBhaXIgcHJvYmxlbXMgd2l0aCBjb25maWcgZmlsZSBwcm9jZXNzaW5nIHdoaWNoIGNhdXNlZCBzZWdmYXVsdAogICAgIGF0IGluaXQgd2hlbiB2aXJ0dWFsIGhvc3RzIHdlcmUgZGVmaW5lZCBhbmQgd2hpY2ggY2F1c2VkIFNlcnZlck5hbWUgdG8KICAgICBiZSBpZ25vcmVkIHdoZW4gdGhlcmUgd2FzIG5vIHZhbGlkIEROUyBzZXR1cC4gIFtKZWZmIFRyYXdpY2tdCgogICopIFJlbW92ZWQgcG9pbnRsZXNzIGFwX2lzX2Fib3J0ZWQgbWFjcm8gZnVuY3Rpb24uIFtSb3kgRmllbGRpbmddCgogICopIEFkZCBhcF9zZW5kZmlsZSBpbXBsZW1lbnRhdGlvbiBmb3IgQUlYCiAgICAgW1ZpY3RvciBKLiBPcmxpa293c2tpXQoKICAqKSBSZXBhaXIgQysrIGNvbXBhdGliaWxpdHkgaW4gYXBfY29uZmlnLmgsIGFwcl9maWxlX2lvLmgsIAogICAgIGFwcl9uZXR3b3JrX2lvLmgsIGFuZCBhcHJfdGhyZWFkX3Byb2MuaC4gIAogICAgIFtUeWxlciBKLiBCcm9va3MgPHR5bGVyamJyb29rcyBob21lLmNvbT4sIEplZmYgVHJhd2lja10KCiAgKikgQnJpbmcgdGhlIGFsbG9jYXRpb24gYW5kIHBvb2wgZGVidWdnaW5nIGNvZGUgYmFjayBpbnRvIGEgd29ya2luZwogICAgIHN0YXRlLiAgVGhpcyB3aWxsIG5lZWQgdG8gYmUgdGVzdGVkIGFzIHNvIGZhciBpdCdzIG9ubHkgYmVlbiB1c2VkIG9uCiAgICAgQmVPUy4gW0RhdmlkIFJlaWRdCgogICopIENoYW5nZSBjb25maWd1cmF0aW9uIGNvbW1hbmQgc2V0dXAgdG8gYmUgcHJvcGVybHkgdHlwZXNhZmUgd2hlbiBpbgogICAgIG1haW50YWluZXIgbW9kZS4gTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgYSBjb21waWxlciB0aGF0IGNhbiBpbml0aWFsaXNlCiAgICAgdW5pb25zLiBbQmVuIExhdXJpZV0KCiAgKikgVHVybiBvbiBidWZmZXJpbmcgZm9yIGNvbmZpZyBmaWxlIHJlYWRzLiAgUGFydCBvZiB0aGlzIHdhcyB0bwogICAgIHJlcGFpciBidWZmZXJlZCBJL08gc3VwcG9ydCBpbiBVbml4IGFuZCBpbXBsZW1lbnQgYnVmZmVyZWQKICAgICBhcF9mZ2V0cygpIGZvciBhbGwgcGxhdGZvcm1zLiAgW0JyaWFuIEhhdmFyZCwgSmVmZiBUcmF3aWNrXQoKICAqKSBXaW4zMjogRml4IHByb2JsZW0gd2hlcmUgVVRDIG9mZnNldCB3YXMgbm90IGJlaW5nIHNldCBjb3JyZWN0bHkKICAgICBpbiB0aGUgYWNjZXNzIGxvZy4gUHJvYmxlbSByZXBvcnRlZCBvbiBuZXdzIGdyb3VwIGJ5IEplcnJ5IEJha2VyLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXggc2VnZmF1bHQgd2hlbiByZXBvcnRpbmcgdGhpcyB0eXBlIG9mIHN5bnRheCBlcnJvcjoKICAgICAiPC9jb250YWluZXI+IHdpdGhvdXQgbWF0Y2hpbmcgPGNvbnRhaW5lcj4gc2VjdGlvbiIsIHdoZXJlCiAgICAgY29udGFpbmVyIGlzIFZpcnR1YWxIb3N0IG9yIERpcmVjdG9yeSBvciB3aGF0ZXZlci4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBTRUNVUklUWTogQ0FOLTIwMDAtMTIwNCAoY3ZlLm1pdHJlLm9yZykKICAgICBQcmV2ZW50IHRoZSBzb3VyY2UgY29kZSBmb3IgQ0dJcyBmcm9tIGJlaW5nIHJldmVhbGVkIHdoZW4gCiAgICAgdXNpbmcgbW9kX3Zob3N0X2FsaWFzIGFuZCB0aGUgQ0dJIGRpcmVjdG9yeSBpcyB1bmRlciB0aGUgZG9jdW1lbnQgcm9vdAogICAgIGFuZCBhIHVzZXIgbWFrZXMgYSByZXF1ZXN0IGxpa2UgaHR0cDovL3d3dy5leGFtcGxlLmNvbS8vY2dpLWJpbi9jZ2kKICAgICBhcyByZXBvcnRlZCBpbiA8bmV3czo5NjA5OTkxMDUuMzQ0MzIxIGVybmFuaS5sb2dpY2EuY28udWs+CiAgICAgW1RvbnkgRmluY2hdCgogICopIEFkZCBzdXBwb3J0IGZvciB0aGUgbmV3IEJlb3MgTmV0d09ya2luZyBFbnZpcm9ubWVudCAoQk9ORSkKICAgICBbRGF2aWQgUmVpZF0KCiAgKikgeGxhdGU6IGFwX3hsYXRlX2NvbnZfYnVmZmVyKCkgbm93IHRlbGxzIHRoZSBjYWxsZXIgd2hlbiB0aGUKICAgICBmaW5hbCBpbnB1dCBjaGFyIGlzIGluY29tcGxldGU7IGFwX2J3cml0ZV94bGF0ZSgpIG5vdyBoYW5kbGVzCiAgICAgaW5jb21wbGV0ZSBmaW5hbCBpbnB1dCBjaGFycy4gIFtKZWZmIFRyYXdpY2tdCgogICopIFlldCBhbm90aGVyIHVwZGF0ZSB0byBzYWZlcmVhZC9oYWxmZHVwbGV4IHN0dWZmIC0tIG5lZWQgdG8gZW5zdXJlCiAgICAgdGhhdCBhIGJoYWxmZHVwbGV4IGNhbGwgb2NjdXJzIGJlZm9yZSBsb2dnaW5nIG9yIGVsc2UgRE5TIGFuZAogICAgIHN1Y2ggY2FuIGRlbGF5IHRoZSBsYXN0IHBhY2tldCBvZiB0aGUgcmVzcG9uc2UuICBbRGVhbiBHYXVkZXRdCgogICopIFNvbWUgc3lzY2FsbCByZWR1Y3Rpb24gaW4gQVBSIG9uIHVuaXggLS0gZG9uJ3Qgc2VlayB3aGVuIHNldHRpbmcKICAgICB1cCBhbiBtbWFwOyBhbmQgZG9uJ3QgZmNudGwoKSBtb3JlIHRoYW4gb25jZSBwZXIgc29ja2V0LgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgV2hlbiBtb2RfY2dpZCBpcyBzdGFydGVkIGFzIHJvb3QsIHRoZSBjZ2kgZGFlbW9uIG5vdyBzd2l0Y2hlcyAKICAgICB0byB0aGUgY29uZmlndXJlZCBVc2VyL0dyb3VwIChsaWtlIG90aGVyIGh0dHBkIHByb2Nlc3NlcykgCiAgICAgaW5zdGVhZCBvZiBjb250aW51aW5nIGFzIHJvb3QuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBUaGUgcHJlZm9yayBNUE0gbm93IHVzZXMgYW4gQVBSIGxvY2sgZm9yIHRoZSBhY2NlcHQoKSBtdXRleC4KICAgICBJdCBoYXMgbm90IGJlZW4gZ2V0dGluZyBhIGxvY2sgYXQgYWxsIHJlY2VudGx5LiAgaHR0cGQgLVYgbm93IAogICAgIGRpc3BsYXlzIEFQUidzIHNlbGVjdGlvbiBvZiB0aGUgbG9jayBtZWNoYW5pc20gaW5zdGVhZCBvZiB0aGUgCiAgICAgc3ltYm9scyBwcmV2aW91c2x5IHJlc3BlY3RlZCBieSBwcmVmb3JrLiAgW0plZmYgVHJhd2lja10KCiAgKikgQ2hhbmdlIHRoZSBtbWFwKCkgZmVhdHVyZSB0ZXN0IHRvIGNoZWNrIG9ubHkgZm9yIGV4aXN0ZW5jZS4KICAgICBUaGUgcHJldmlvdXMgY2hlY2sgcmVxdWlyZWQgZmVhdHVyZXMgbm90IHVzZWQgYnkgQXBhY2hlLgogICAgIFtHcmVnIEFtZXNdCgogICopIEZpeCBhIGNvdXBsZSBvZiBidWdzIGluIG1vZF9jZ2lkOiAgVGhlIGNnaSBhcmd1bWVudHMgd2VyZQogICAgIHNvbWV0aW1lcyBtYW5nbGVkLiAgVGhlIGxlbiBwYXJtIHRvIGFjY2VwdCgpIHdhcyBub3QgCiAgICAgaW5pdGlhbGl6ZWQsIGxlYWRpbmcgc29tZXRpbWVzIHRvIGFuIGVuZGxlc3MgbG9vcCBvZiBmYWlsZWQKICAgICBhY2NlcHQoKSBjYWxscyBvbiBPUy8zOTAgYW5kIGFueXdoZXJlIGVsc2UgdGhhdCBmYWlsZWQgdGhlIGNhbGwKICAgICBpZiB0aGUgbGVuIHdhcyBuZWdhdGl2ZS4gIFVzZSA8c3lzL3VuLmg+IGZvciBzdHJ1Y3Qgc29ja2FkZHJfdW4KICAgICBpbnN0ZWFkIG9mIGRlY2xhcmluZyBpdCBvdXJzZWx2ZXMgdG8gZml4IGEgY29tcGlsYXRpb24gcHJvYmxlbQogICAgIG9uIFNvbGFyaXMuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBBZGQgUmVzb3VyY2UgbGltaXRpbmcgY29kZSBiYWNrIGludG8gQXBhY2hlIDIuMC4gW1J5YW4gQmxvb21dCgogICopIEZpeCB6b21iaWUgcHJvY2VzcyBwcm9ibGVtIHdpdGggbW9kX2NnaS4gIFtKZWZmIFRyYXdpY2tdCgogICopIFBvcnQgbW9kX21tYXBfc3RhdGljIHRvIDIuMC4gIE1ha2UgaXQgZ28gZmFzdGVyLiAgW0dyZWcgQW1lc10KCiAgKikgRml4IHN0b3JhZ2Ugb3ZlcmxheSB3aGVuIGxvYWRpbmcgZHNvcy4gIFN5bXB0b206IEFwYWNoZSBkaWVzIGF0CiAgICAgaW5pdGlhbGl6YXRpb24gaWYgQUxMT0NfREVCVUcgaXMgZGVmaW5lZDsgbm8ga25vd24gc3ltcHRvbSAKICAgICBvdGhlcndpc2UuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggdHlwbyBpbiBjb25maWd1cmUgc2NyaXB0IHdoZW4gY2hlY2tpbmcgZm9yIG1vZF9zby4gIGJhc2gKICAgICBkb2Vzbid0IHNlZW0gdG8gaGF2ZSBhIHByb2JsZW0gYnV0IC9iaW4vc2ggb24gU29sYXJpcyBkb2VzLgogICAgIFN5bXB0b206ICIuL2NvbmZpZ3VyZTogdGVzdDogdW5rbm93biBvcGVyYXRvciA9PSIKICAgICBbSmVmZiBUcmF3aWNrXQogICAKICAqKSBSZWJpbmQgdGhlIFdpbjMyIE5UIGFuZCA5eCBzZXJ2aWNlcyBjb250cm9sIGludG8gdGhlIE1QTS4gIAogICAgIEFsbCBjb25zb2xlLCBXaW5OVCBTQ00gYW5kIFdpbjl4IHBzZXVkby1zZXJ2aWNlIGNvbnRyb2wgY29kZSBpcwogICAgIG5vdyB3cmFwcGVkIHdpdGhpbiB0aGUgV2luTlQgTVBNLgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIE1ha2UgYSBjb3B5IG9mIGdldGVudigiUEFUSCIpIGJlZm9yZSBzdG9yaW5nIGZvciBsYXRlciB1c2UuICBTb21lCiAgICAgZ2V0ZW52KCkgaW1wbGVtZW50YXRpb25zIHVzZSB0aGUgc2FtZSBzdG9yYWdlIGZvciBzdWNjZXNzaXZlIGNhbGxzLgogICAgIENHSXMgb24gT1MvMzkwIGhhZCBhIGJhZCBQQVRIIGR1ZSB0byB0aGlzLiAgW0plZmYgVHJhd2lja10KCiAgKikgU2VydmVyIFRva2VucyB3b3JrIGluIDIuMCBhZ2Fpbi4gIFRoaXMgYWxzbyBwcm9wb2dhdGVzIHRoZSBjaGFuZ2UKICAgICB0byBhbGxvdyBqdXN0IHRoZSBwcm9kdWN0IG5hbWUgaW4gdGhlIHNlcnZlciBzdHJpbmcgdXNpbmcKICAgICBQUk9EVUNUX09OTFkuCiAgICAgW1J5YW4gQmxvb21dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDIuMGE0CgogICopIEVCQ0RJQzogUmVhcnJhbmdlIGNhbGxzIHRvIGFwX2NoZWNrY29udigpIHNvIHRoYXQgbW9zdCBoYW5kbGVycwogICAgIHdvbid0IG5lZWQgdG8gY2FsbCBpdC4gIFtHcmVnIEFtZXMsIEplZmYgVHJhd2lja10KCiAgKikgTW92ZSBwcmVfY29uZmlnIGhvb2sgY2FsbCB0byBiZXR3ZWVuIGNvbmZpZ3VyYXRpb24gcmVhZCBhbmQgY29uZmlnCiAgICAgdHJlZSB3YWxrLiAgVGhpcyBhbGxvd3MgYWxsIG1vZHVsZXMgdG8gaW1wbGVtZW50IHByZV9jb25maWcgaG9va3MKICAgICBhbmQga25vdyB0aGF0IHRoZXkgd2lsbCBiZSBjYWxsZWQgYXQgYW4gYXBwcm9wcmlhdGUgdGltZS4KICAgICBbUnlhbiBCbG9vbV0gCgogICopIG1vZF9jZ2ksIG1vZF9jZ2lkOiBNYWtlIFNjcmlwdExvZyBkaXJlY3RpdmUgd29yayBhZ2Fpbi4gIAogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZCBwcmUtY29uZmlnIGhvb2tzIGJhY2sgdG8gYWxsIG1vZHVsZXMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEZpeCBhIFNJR1NFR1YgaW4gYXBfbWQ1ZGlnZXN0KCksIHdoaWNoIGlzIHVzZWQgd2hlbiB5b3UgaGF2ZQogICAgIENvbnRlbnREaWdlc3QgZW5hYmxlZCBhbmQgd2UgY2FuJ3QvZG9uJ3QgbW1hcCB0aGUgZmlsZS4gCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgV2Ugbm93IHJlcG9ydCB0aGUgY29ycmVjdCBsaW5lIG51bWJlciBmb3Igc3ludGF4IGVycm9ycyBpbiBjb25maWcKICAgICBmaWxlcy4gIFtSeWFuIEJsb29tLCBHcmVnIFN0ZWluLCBKZWZmIFRyYXdpY2tdCgogICopIEJyb3VnaHQgbW9kX2F1dGhfZGlnZXN0IHVwIHRvIHN5bmNoIHdpdGggMS4zLCBmaXhlZCBhcF90aW1lX3QtCiAgICAgcmVsYXRlZCBidWdzLCBhbmQgY2hhbmdlZCBzaG1lbS9sb2NraW5nIHRvIHVzZSBhcHIgQVBJLiBTaGFyZWQtbWVtCiAgICAgaXMgY3VycmVudGx5IGRpc2FibGVkLCBob3dldmVyLCBiZWNhdXNlIG9mIHByb2JsZW1zIHdpdGggZ3JhY2VmdWwKICAgICByZXN0YXJ0cy4gW1JvbmFsZCBUc2NoYWzkcl0KCiAgKikgRml4IGNvcnJ1cHRpb24gb2YgSUZTIHZhcmlhYmxlIGluIC0td2l0aC1tb2R1bGU9IGhhbmRsaW5nLiAgCiAgICAgRGVwZW5kaW5nIG9uIHRoZSB1c2VyJ3Mgc2hlbGwgb3IgY3VzdG9taXphdGlvbiB0aGVyZW9mLCB0aGVyZSAKICAgICB3b3VsZCBiZSBlcnJvcnMgZ2VuZXJhdGluZyBhcF9jb25maWdfYXV0by5oIGxhdGVyIGluIHRoZSBjb25maWd1cmUKICAgICBwcm9jZWR1cmUuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBtb2RfY2dpOiBSZXN0b3JlIGxvZ2dpbmcgb2Ygc3RkZXJyIGZyb20gY2hpbGQgcHJvY2VzcyB3aGVuIFNjcmlwdExvZyAKICAgICBpc24ndCB1c2VkIChhcyBpbiAxLjMpLCBleGNlcHQgdGhhdCBvbiBVbml4IGl0IGlzIG5vdyBsb2dnZWQgdmlhIAogICAgIGFwX2xvZ19yZXJyb3IoKSBpbnN0ZWFkIG9mIGJ5IHRoZSBjaGlsZCBoYXZpbmcgU1RERVJSX0ZJTEVOTyByZWZlcgogICAgIHRvIHRoZSBlcnJvciBsb2cuICBbR3JlZyBBbWVzLCBKZWZmIFRyYXdpY2tdCgogICopIEFkZCAnLUQnIGFyZ3VtZW50IHByb2Nlc3NpbmcgZm9yIHJ1biB0aW1lIGNvbmZpZ3VyYXRpb24gZGVmaW5lcy4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBPcmdhbml6ZSBodHRwX21haW4uYyBhcyBpbmRlcGVuZGVudCBjb2RlLCBzdWNoIHRoYXQgbm8gY29kZSBvcgogICAgIGdsb2JhbCBkYXRhIGlzIGV4cG9ydGVkIGZyb20gaXQuICBXSU4zMiB3aWxsIGR5bmFtaWNhbGx5IGxpbmsgaXQKICAgICB0byB0aGUgc2VydmVyIGNvcmUsIHNvIHRoaXMgd2lsbCBwcmV2ZW50IG11dHVhbCBkZXBlbmRlbmN5LgogICAgIFtXaWxsaWFtIFJvd2VdCgogICopIEFkZCBzZXBhcmF0ZSBkeW5hbWljIGxpbmthZ2UgdGFncyBBUFJfRVhQT1JUKCksIEFQUl9FWFBPUlRfTk9OU1REKCkKICAgICBhbmQgQVBSX1ZBUl9FWFBPUlQgdG8gY29ycmVjdGx5IHJlc29sdmUgYXByIGZ1bmN0aW9ucyBhbmQgZ2xvYmFscy4KICAgICBbV2lsbGlhbSBSb3dlXQoKICAqKSBBZGQgV2luOXggc2VydmljZSBleGVjdXRpb24gYW5kIEN0cmwrQy9DdHJsK0JyZWFrL1NodXRkb3duIGhhbmRsZXJzLgogICAgIFtXaWxsaWFtIFJvd2UsIEphbiBKdXN0IEtlaWpzZXIgPEtFSUpTRVJKSiBsb2dpY2EuY29tPl0KCiAgKikgQWRkIG1vZF9jaGFyc2V0X2xpdGUgZm9yIGNvbmZpZ3VyaW5nIGNoYXJhY3RlciBzZXQgdHJhbnNsYXRpb24uCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgQWRkICctbicgb3B0aW9uIHRvIGh0cGFzc3dkIHRvIG1ha2UgaXQgcHJpbnQgaXRzIHVzZXI6cHcgcmVjb3JkCiAgICAgb24gc3Rkb3V0IHJhdGhlciB0aGFuIGhhdmluZyB0byBmcm9iIGEgdGV4dCBmaWxlLiAgW0tlbiBDb2FyXQoKICAqKSBGaXggc2FmZXJlYWQuICBCYXNpY2FsbHksIHdlIGZsdXNoIHRoZSBvdXRwdXQgYnVmZmVyIGlmIGEgcmVhZCBvbiB0aGUKICAgICBpbnB1dCB3aWxsIGJsb2NrLgogICAgIFtSeWFuIEJsb29tXQogCiAgKikgQVBSOiBBZGQgYXBfeGxhdGVfZ2V0X3NiKCkgc28gdGhhdCBhbiBhcHAgY2FuIGZpbmQgb3V0IHdoZXRoZXIgb3Igbm90CiAgICAgYSBjb252ZXJzaW9uIGlzIHNpbmdsZS1ieXRlIG9ubHkuIFtKZWZmIFRyYXdpY2tdCgogICopIEJFT1M6IGFwX3NodXRkb3duIHNob3VsZCByZXR1cm4gQVBSX1NVQ0NFU1Mgb3IgZXJybm8uIE5vdGUgdGhhdAogICAgIHRoZSBCZU9TIDUuMCBkb2N1bWVudGF0aW9uIHNheXMgdGhhdCBzaHV0ZG93biBkb2Vzbid0IHdvcmsgeWV0LgogICAgIFtSb3kgRmllbGRpbmddCgogICopIEZpeCBzb21lIG1pbm9yIGVycm9ycyB3aGVyZSBwaWQgd2FzIGJlaW5nIG1hbmlwdWxhdGVkIGFzIGFuIGludAogICAgIGluc3RlYWQgb2YgdGhlIHBvcnRhYmxlIHBpZF90LiAgW1JveSBGaWVsZGluZ10KCiAgKikgRml4IHNvbWUgZXJyb3IgbG9nIHByaW50cyB0aGF0IHdlcmUgcHJpbnRpbmcgdGhlIHBvaW50ZXIgdG8gYQogICAgIHN0cnVjdHVyZSByYXRoZXIgdGhhbiB0aGUgcGlkIHdpdGhpbiB0aGUgc3RydWN0dXJlLgogICAgIFtKZWZmIFRyYXdpY2ssIFJveSBGaWVsZGluZ10KCiAgKikgYWI6IEZpeCBhIGNvbW1hbmQtbGluZSBwcm9jZXNzaW5nIGJ1ZzsgdHJhY2sgYmFkIGhlYWRlcnMgaW4gCiAgICAgZXJyX3Jlc3BvbnNlOyBzdXBwb3J0IHJlYWRpbmcgaGVhZGVycyB1cCB0byAySy4gCiAgICAgW0FzayBCam9lcm4gSGFuc2VuIDxhc2sgdmFsdWVjbGljay5jb20+XQoKICAqKSBGaXggYXBfcmVzb2x2ZV9lbnYoKSBzbyB0aGF0IGl0IGhhbmRsZXMgbmV3IGZ1bmN0aW9uIGFkZGVkIGluIGEgcHJpb3IKICAgICBhbHBoYSAoc2VlICJBZGRlZCB0aGUgY2FwYWJpbGl0eSB0byBkbyAke0VOVlZBUn0gY29uc3RydWN0cyBpbiB0aGUKICAgICBjb25maWcgZmlsZS4iKSBhcyB3ZWxsIGFzIHRoZSBjb25zdHJ1Y3RzIHVzZWQgYnkgbW9kX3Jld3JpdGUuCiAgICAgW1BhdWwgUmVkZXIgPHJlZGVycGogcmFsZWlnaC5pYm0uY29tPl0KCiAgKikgQXBhY2hlIDIuMCBidWlsZHMgYW5kIHJ1bnMgb24gT1MvMzkwLiBbSmVmZiBUcmF3aWNrLCBHcmVnIEFtZXNdCgogICopIENoYW5nZSB0aGUgRUJDRElDIHN1cHBvcnQgaW4gZnVuY3Rpb25zIGZvciBNRDUsIFNIQTEsIGFuZCBiYXNlIDY0IHRvIHVzZQogICAgIEFQUiB0byBwZXJmb3JtIHRyYW5zbGF0aW9uLCBpbnN0ZWFkIG9mIGFjY2Vzc2luZyB0aGUgaGFyZC1jb2RlZCB0YWJsZXMKICAgICBpbiAxLjMncyBlYmNkaWMuYy4gW0plZmYgVHJhd2lja10KCiAgKikgRml4IHNvbWUgYnVncyAobW9zdGx5IGxvc3QgMS4zIGNvZGUpIGluIGFiJ3MgY29tbWFuZC1saW5lIHByb2Nlc3NpbmcuIAogICAgIFtKZWZmIFRyYXdpY2tdCgogICopIEFkZCB0aGUgYWJpbGl0eSB0byBob29rIGludG8gdGhlIGNvbmZpZyBmaWxlIHJlYWRpbmcgcGhhc2UuICBCYXNpY2FsbHkKICAgICBpZiBhIGRpcmVjdGl2ZSBpcyBzcGVjaWZpZWQgRVhFQ19PTl9SRUFELCB0aGVuIHdoZW4gdGhhdCBkaXJlY3RpdmUgaXMKICAgICByZWFkIGZyb20gdGhlIGNvbmZpZyBmaWxlLCB0aGUgYXNzb2NhaXRlZCBmdW5jdGlvbiBpcyBleGVjdXRlZC4gIFRoaXMKICAgICBzaG91bGQgb25seSBiZSB1c2VkIGZvciB0aG9zZSBkaXJlY3RpdmVzIHRoYXQgbXVzdCBtdWNrIHdpdGggSE9XIHRoZQogICAgIHNlcnZlciBJTlRFUlBSRVRTIHRoZSBjb25maWcuICBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgZGlyZWN0aXZlcwogICAgIHRoYXQgcmUtb3JkZXIgb3IgcmVwbGFjZSBpdGVtcyBpbiB0aGUgY29uZmlnIHRyZWUuICBUaG9zZSBjaGFuZ2VzIHNob3VsZAogICAgIGJlIG1hZGUgaW4gdGhlIHByZS1jb25maWcgc3RlcC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgQWRkIG1vZF9leGFtcGxlIHRvIHRoZSBidWlsZCBzeXN0ZW0uCiAgICAgW1RvbnkgRmluY2hdCgogICopIEFQUjogQWRkIGFwX3hsYXRlX2NvbnZfYnl0ZSgpIHRvIGNvbnZlcnQgb25lIGNoYXIgYmV0d2VlbiBzaW5nbGUtCiAgICAgYnl0ZSBjaGFyYWN0ZXIgc2V0cy4gW0plZmYgVHJhd2lja10KCiAgKikgUGljayB1cCB2YXJpb3VzIEVCQ0RJQyBmaXhlcyBmcm9tIDEuMyAoZnJvbSBNYXJ0aW4KICAgICBLcmFlbWVyIGFuZCBPbGl2ZXIgUmVoIG9yaWdpbmFsbHkgYWNjb3JkaW5nIHRvIHRoZSBjaGFuZ2UgbG9nKS4KICAgICBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggYSBjb3VwbGUgb2YgcHJvYmxlbXMgaW4gUkZDMTQxMyBzdXBwb3J0IChjb250cm9sbGVkIGJ5IHRoZQogICAgIElkZW50aXR5Q2hlY2sgZGlyZWN0aXZlKS4gIEFwYWNoZSBkaWQgbm90IGJ1aWxkIHRoZSByZXF1ZXN0IHN0cmluZwogICAgIHByb3Blcmx5IGFuZCBtb3JlIGltcG9ydGFudGx5IEFwYWNoZSB3b3VsZCBsb29wIGZvcmV2ZXIgaWYgdGhlIAogICAgIHdvdWxkLWJlIGlkZW50IHNlcnZlciBkcm9wcGVkIHRoZSBjb25uZWN0aW9uIGJlZm9yZSBzZW5kaW5nIGEKICAgICBwcm9wZXJseSB0ZXJtaW5hdGVkIHJlc3BvbnNlLiBbSmVmZiBUcmF3aWNrXQoKICAqKSBhcHhzIHdvcmtzIGluIDIuMC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgUmVsaWFibGUgcGlwZWQgbG9ncyB3b3JrIGluIDIuMC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgSW50cm9kdWNlIGEgaGFzaCB0YWJsZSBpbXBsZW1lbnRhdGlvbiBpbnRvIEFQUiB0byBiZSB1c2VkIGZvcgogICAgIHJlcGxhY2luZyB0YWJsZXMgYW5kIG90aGVyIHJhbmRvbSBkYXRhIHN0cnVjdHVyZXMgaW4gQXBhY2hlLgogICAgIFtUb255IEZpbmNoXQoKICAqKSBBZGQgc29tZSBtb3JlIGVycm9yIHJlcG9ydGluZyB0byBodHBhc3N3ZCBpbiB0aGUgY2FzZSBvZiBwcm9ibGVtcwogICAgIGdlbmVyYXRpbmcgb3IgYWNjZXNzaW5nIHRoZSB0ZW1wb3JhcnkgZmlsZS4gIEFsc28sIHBhc3MgaW4gYQogICAgIGJ1ZmZlciBpZiB0aGUgaW1wbGVtZW50YXRpb24ga25vd3MgaG93IHRvIHVzZSBpdCAoaS5lLiwgaWYgTF90bXBuYW0KICAgICBpcyBkZWZpbmVkKS4gIFtLZW4gQ29hcl0KCiAgKikgQ29uZmlndXJlIGNyZWF0ZXMgY29uZmlnLm5pY2Ugbm93IGNvbnRhaW5pbmcgeW91ciBjb25maWd1cmUKICAgICBvcHRpb25zLiBTeW50YXg6IC4vY29uZmlnLm5pY2UgWy0tbW9yZS1vcHRpb25zXQogICAgIFtTYXNjaGEgU2NodW1hbm5dCgogICopIEZpeCB2YXJpb3VzIHJldHVybiBjb2RlIHByb2JsZW1zIGluIEFQUiBvbiBXaW4zMi4gIEZvciBtb3N0IG9mCiAgICAgdGhlc2UsIEFQUiB3YXMgcmV0dXJuaW5nIEFQUl9FRVhJU1QgaW5zdGVhZCBvZiBHZXRMYXN0RXJyb3IoKS8KICAgICBXU0FHZXRMYXN0RXJyb3IoKS4gIFtKZWZmIFRyYXdpY2tdCgogICopIE1ha2UgcGlwZWQgbG9ncyB3b3JrIGFnYWluIGluIHZlcnNpb24gMi4wCiAgICAgW1J5YW4gQmxvb21dCgogICopIEFkZCBWUEFUSCBzdXBwb3J0IHRvIFVOSVggYnVpbGQgc3lzdGVtIG9mIEFwYWNoZSBhbmQgQVBSLgogICAgIFtTYXNjaGEgU2NodW1hbm5dCgogICopIEZpeCBhcF90b2tlbml6ZV90b19hcmd2IHRvIHJlc3BlY3QgdGhlIGNvbnN0IGFyZ3VtZW50cyB0aGF0IGFyZQogICAgIHBhc3NlZCB0byBpdC4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgRml4IG1tJ3MgbWVtY3B5L21lbXNldCBtYWNyb3MsIHBvaW50ZXIgYXJpdGhtZXRpYyB3YXMgYnJva2VuLgogICAgIFBhdGNoIHN1Ym1pdHRlZCB0byBhdXRob3IuCiAgICAgW1Nhc2NoYSBTY2h1bWFubl0KCiAgKikgRml4IG1tIGNvbmZpZ3VyYXRpb24gb24gU29sYXJpcyA4IHg4NiBhbmQgT1MvMzkwLiAgRG9uJ3QgcmVxdWlyZQogICAgIC9zYmluIGluIFBBVEggb24gRnJlZUJTRCAoYWxsIHN1Ym1pdHRlZCB0byByc2UgcHJldmlvdXNseSkgCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgRml4IGJ1aWxkaW5nIFB0aHJlYWQtYmFzZWQgTVBNcyBvbiBPcGVuQlNECiAgICAgW1Nhc2NoYSBTY2h1bWFubl0gUFIjMjYKCiAgKikgRml4IGFwX3JlYWRkaXIoKSBwcm9ibGVtIG9uIHN5c3RlbXMgd2hlcmUgZF9uYW1lW10gZmllbGQgaW4KICAgICBzdHJ1Y3QgZGlyZW50IGlzIGRlY2xhcmVkIHdpdGggb25seSBvbmUgYnl0ZS4gIChUaGlzIHByb2JsZW0gb25seSAKICAgICBhZmZlY3RlZCBtdWx0aXRocmVhZGVkIGJ1aWxkcy4pICBUaGlzIGNhdXNlZCBhIHNlZ2ZhdWx0IGR1cmluZwogICAgIHBvb2wgY2xlYW51cCB3aXRoIG1vZF9hdXRvaW5kZXggb24gU29sYXJpcyAoU29sYXJpcyA4IHg4NiwgYXQgCiAgICAgbGVhc3QpLiBbSmVmZiBUcmF3aWNrXQoKICAqKSBGaXggc29tZSBtYWtlLXBvcnRhYmlsaXR5IHByb2JsZW1zIG9uIGF0IGxlYXN0IFRydTY0LCBJcml4CiAgICAgYW5kIFVuaXhXYXJlLgogICAgIFtTYXNjaGEgU2NodW1hbm5dIFBSIzE4LCBQUiMzOQoKICAqKSBBZGQgYXBfc2lnd2FpdCgpIHRvIHN1cHBvcnQgb2xkLXN0eWxlIHNpZ3dhaXQoKSBvbiBzeXN0ZW1zCiAgICAgbGlrZSBPUy8zOTAgYW5kIFVuaXhXYXJlLgogICAgIFtTYXNjaGEgU2NodW1hbm5dIAoKICAqKSBBZGQgUE9TSVgtdGhyZWFkIGZsYWdzIGZvciBtb3JlIHBsYXRmb3Jtcy4KICAgICBbU2FzY2hhIFNjaHVtYW5uXQoKICAqKSBGaXggc29tZSBtaW5vciBidWdzIGluIGFwX3N0cmVycm9yKCkuICBUZWFjaCBhcF9zdHJlcnJvcigpCiAgICAgKG9uIFVuaXgsIGF0IGxlYXN0KSB0byBoYW5kbGUgcmVzb2x2ZXIgZXJyb3JzLiAgRml4IGEgYnVnIGluCiAgICAgdGhlIGRlZmluaXRpb24gb2YgQVBSX0VOT01FTSBzbyB0aGF0IGFwX3N0cmVycm9yKCkgY2FuIHNwaXQKICAgICBvdXQgdGhlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZSBmb3IgaXQuCiAgICAgW0plZmYgVHJhd2lja10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wYTMKCiAgKikgbW9kX3NvIHJlcG9ydHMgYXBfb3NfZHNvX2Vycm9yKCkgaWYgYXBfZHNvX2xvYWQoKSBmYWlscwogICAgIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIEFQSTogKkhPT0sqIG1hY3JvcyBub3cgaGF2ZSBhbiBBUF8gcHJlZml4CiAgICAgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgV2luMzI6IEVsaW1pbmF0ZSByZWR1bmRhbnQgY2FsbHMgdG8gaW5pdGlhbGl6ZSB3aW5zb2NrLgogICAgIFtUaW0gQ29zdGVsbG8gPHRpbWNvc3RlbGxvIG96ZW1haWwuY29tLmF1Pl0KCiAgKikgRml4IGJ1Z3MgaW5pdGlhbGl6aW5nIHVuZ2V0Y2hhciBmb3IgcGlwZXMuIAogICAgIFtDaGlhLWxpYW5nIEthbyA8Y2xrYW8gQ2lyWC5PUkc+XQoKICAqKSBUaGUgYWIgcHJvZ3JhbSBpbiB0aGUgc3JjL3N1cHBvcnQgZGlyZWN0b3J5IGlzIG5vdyBwb3J0YWJsZSB1c2luZwogICAgIEFQUi4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgU3VwcG9ydCBkaXJlY3RvcnkgaXMgYmVpbmcgY29tcGlsZWQgd2hlbiB0aGUgc2VydmVyIGlzIGJ1aWx0CiAgICAgW1J5YW4gQmxvb21dCgogICopIFRoZSBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1wcm9ncmFtLW5hbWUgaGFzIGJlZW4gYWRkZWQgdG8gYWxsb3cKICAgICBkZXZlbG9wZXJzIHRvIHJlbmFtZSB0aGUgZXhlY3V0YWJsZSBhdCBjb25maWd1cmUgdGltZS4gIFRoaXMgYWxzbwogICAgIGNoYW5nZXMgdGhlIG5hbWUgb2YgdGhlIGNvbmZpZyBmaWxlcyB0byBtYXRjaCB0aGUgZXhlY3V0YWJsZSdzIG5hbWUuCiAgICAgW1J5YW4gQmxvb21dCgogICopIG1vZF9hdXRvaW5kZXg6IEFkZCBgSW5kZXhPcHRpb25zICtWZXJzaW9uU29ydCcsIHRvIG5pY2VseSBzb3J0IGZpbGVuYW1lcwogICAgIGNvbnRhaW5pbmcgdmVyc2lvbiBudW1iZXJzLiBbTWFydGluIFBvb2xdCgogICopIGFwX29wZW4oLi4sQVBSX09TX0RFRkFVTFQsLi4pIHVzZXMgcGVybXMgMDY2NiBpbnN0ZWFkIG9mIDA3Nzcgb24KICAgICBVbml4OyBhY2Nlc3NfbG9nIGFuZCBlcnJvcl9sb2cgbm93IGNyZWF0ZWQgd2l0aCB0aGVzZSBwZXJtczsgbm9uLQogICAgIFVuaXggaXMgdW5hZmZlY3RlZCBbSmVmZiBUcmF3aWNrXQogICAgIAogICopIEZpbmlzaGVkIG1vdmUgb2YgYXBfbWQ1IHJvdXRpbmVzIHRvIGFwcl9tZDUuICBSZW1vdmVkIGFwX21kNS5oLgogICAgIFJlcGxhY2VkIG1vcmUgbWFnaWMgbnVtYmVycyB3aXRoIE1ENV9ESUdFU1RTSVpFLgogICAgIFtXaWxsaWFtIFJvd2UsIFJveSBGaWVsZGluZ10KCiAgKikgV2luMzI6IEdldCBtb2RfYXV0aF9kaWdlc3QgY29tcGlsaW5nIGFuZCBhZGRlZCB0byB0aGUgV2luZG93cwogICAgIGJ1aWxkIGVudmlyb25tZW50LiBOb3QgdGVzdGVkIGFuZCBJJ2QgYmUgc3VwcmlzZWQgaWYgaXQgCiAgICAgYWN0dWFsbHkgd29ya3MuIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBSZXZhbXAgdGhlIFdpbjMyIG1ha2UgZW52aXJvbm1lbnQuIE1ha2VmaWxlcyBoYXZlIGJlZW4gcmVtb3ZlZCBhbmQKICAgICBBcGFjaGUuZHN3IGNyZWF0ZWQgdG8gYnJpbmcgdG9nZXRoZXIgYWxsIHRoZSBwaWVjZXMuIENyZWF0ZSBuZXcgZmlsZQogICAgIG9zL3dpbjMyL0Jhc2VBZGRyLnJlZiB0byBkZWZpbmUgbW9kdWxlIGJhc2UgYWRkcmVzc2VzICh0byBwcmV2ZW50CiAgICAgZGxsIHJlbG9jYXRpb24gYXQgc3RhcnQtdXApLgogICAgIFtXaWxsaWFtIFJvd2UsIEdyZWcgTWFyciwgVGltIENvc3RlbGxvLCBCaWxsIFN0b2RkYXJkXQoKICAqKSBbRUJDRElDXSBQb3J0IFBhdWwgR2lsbWFydGluJ3MgQ1JMRiBwYXRjaCBmcm9tIDEuMy4gIFRoaXMgcmVwbGFjZXMgbW9zdAogICAgIG9mIHRoZSBcMDE1LCBcMDEyLCBhbmQgXDAxNVwwMTIgY29uc3RhbnRzIHdpdGggbWFjcm9zLgogICAgIFtHcmVnIEFtZXNdCiAgICAgCiAgKikgQWRkIGFwX3hsYXRlX29wZW4oKSBldCBhbCBmb3IgdHJhbnNsYXRpb24gb2YgdGV4dCBiZXR3ZWVuIGRpZmZlcmVudCAKICAgICBjaGFyYWN0ZXIgc2V0cy4gIFRoZSBpbml0aWFsIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIGljb252KCkuCiAgICAgW0plZmYgVHJhd2lja10KCiAgKikgTW9yZSBGQVFzIGFuZCBhbnN3ZXJzIGZyb20gY29tcC5pbmZvc3lzdGVtcy53d3cuc2VydmVycy51bml4LgogICAgIFtKb3NodWEgU2xpdmUgPHNsaXZlIGZpbmFuY2UuY29tbWVyY2UudWJjLmNhPl0KCiAgKikgQ0dJIG91dHB1dCBpcyBiZWluZyB0aW1lZCBvdXQgbm93LgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBGaXggdGhlIHByb2JsZW0gd2l0aCBkaWVpbmcgcXVpZXRseS4gIGR1cGZpbGUgbm93IHRha2VzIGEgcG9vbCB3aGljaAogICAgIGlzIHVzZWQgYnkgdGhlIG5ldyBhcHIgZmlsZS4gIFRoZXJlIGlzIG5vIHJlYXNvbiB0byBjcmVhdGUgYSBuZXcgZmlsZQogICAgIHdpdGggdGhlIHNhbWUgbGlmZXRpbWUgYXMgdGhlIG9yaWdpbmFsIGZpbGUuCiAgICAgW1J5YW4gQmxvb21dIAoKICAqKSBXaW4zMjogQXR0ZW1wdCB0byBlbGltaW5hdGUgZGxsIHJlbG9jYXRpb24gYXQgc3RhcnQtdXAgYnkgc3BlY2lmeWluZwogICAgIG1vZHVsZSBiYXNlIGFkZHJlc3Nlcy4gVGhpcyB3aWxsIGhlbHAgc2hvb3Rpbmcgc2VnIGZhdWx0cwogICAgIGluIHRoZSBmaWVsZC4gW1dpbGxpYW0gUm93ZSA8d3Jvd2UgbG5kLmNvbT5dCgogICopIFVwZGF0ZSBBcGFjaGUgb24gV2luZG93cyBkb2N1bWVudGF0aW9uLiBBZGQgbmV3IGRvY3VtZW50CiAgICAgZGVzY3JpYmluZyBob3cgdG8gY29tcGlsZSBBcGFjaGUgb24gV2luZG93cy4KICAgICBbV2lsbGlhbSBSb3dlIDx3cm93ZSBsbmQuY29tPl0KCiAgKikgYXBfc2V0X3BpcGVfdGltZW91dCgpLCBhcF9wb2xsKCksIGFuZCBBUFJfU09fVElNRU9VVCBub3cgdGFrZSAKICAgICBtaWNyb3NlY29uZHMgaW5zdGVhZCBvZiBzZWNvbmRzLiAgU29tZSBzdG9yYWdlIGxlYWtzIGFuZCBvdGhlcgogICAgIG1pbm9yIGJ1Z3MgaW4gcmVsYXRlZCBjb2RlIHdlcmUgZml4ZWQuICBbSmVmZiBUcmF3aWNrXQoKICAqKSBXaW4zMjogRmlyc3QgY3V0IGF0IGdldHRpbmcgbW9kX2lzYXBpIHdvcmtpbmcgdW5kZXIgMi4wCiAgICAgW1dpbGxpYW0gUm93ZSA8d3Jvd2UgbG5kLmNvbT5dCgogICopIEZpcnN0IHN0YWIgYXQgZ2V0dGluZyBtb2RfYXV0aF9kaWdlc3Qgd29ya2luZyB1bmRlciAyLjAKICAgICBxdWljayBjaGFuZ2Ugc3VtbWFyeToKICAgICAtIG1vdmVkIHRoZSByYW5kb20gYnl0ZSBnZW5lcmF0aW9uIChhcF9nZW5lcmF0ZV9yYW5kb21fYnl0ZXMpIGludG8gQVBSCiAgICAgLSBub3cgdXNlcyBhcF90aW1lX3QKICAgICAtIGNvbXBpbGVzIGFuZCBydW5zIG9uIGxpbnV4CiAgICAgLSB0ZXN0ZWQgd2l0aCBhbWF5YQogICAgIFtCcmlhbiBNYXJ0aW4gPGJtYXJ0aW4gcGVuZ3VpbmNvbXB1dGluZy5jb20+XQoKICAqKSBXaW4zMjogTW92ZSB0aGUgc3BhY2Ugc3RyaXBwaW5nIG9mIHBoeXNpY2FsIHNlcnZpY2UgbmFtZXMKICAgICBmaXggdXAgZnJvbSBBcGFjaGUgMS4zLiAjaW5jbHVkZSdpbmcgImFwX21wbS5oIiBmaXhlcyB1cCBhbgogICAgIHVucmVzb2x2ZWQgc3ltYm9sLiBBZGQgZGVwZW5kZW5jeSBjaGVja2luZyB0byB0aGUKICAgICBDcmVhdGVTZXJ2aWNlIGNhbGwgdG8gZW5zdXJlIFRDUElQIGFuZCBBRlAgKHdpbnNvY2spIGlzIHN0YXJ0ZWQKICAgICBiZWZvcmUgQXBhY2hlLgogICAgIFtXaWxsaWFtIFJvd2UgPHdyb3dlIGxuZC5jb20+XQoKICAqKSBXaW4zMjogQWRkIGNvZGUgdG8gcGVyZm9ybSBsYXRlYmluZGluZyBvbiBmdW5jdGlvbnMgdGhhdCBtYXkKICAgICBub3QgZXhpc3Qgb24gYWxsIGxldmVscyBvZiBXaW5kb3dzIHdoZXJlIEFwYWNoZSBydW5zLiBUaGlzCiAgICAgaXMgbmVlZGVkIHRvIGFsbG93IEFwYWNoZSB0byBzdGFydC11cCBvbiBXaW45NS85OC4gQWxsIGNhbGxzCiAgICAgdG8gbm9uIHBvcnRhYmxlIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHJvdGVjdGVkIHdpdGgKICAgICBhcF9vc2xldmVsIGNoZWNrcyB0byBwcmV2ZW50IHJ1bnRpbWUgc2VnZmF1bHRzLiAKICAgICBbV2lsbGlhbSBSb3dlIDx3cm93ZSBsbmQuY29tPl0KCiAgKikgRml4IGZhbGxiYWNrIGRlZmF1bHQgdmFsdWVzIGZvciBTSE1fUiBhbmQgU0hNX1cgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBHZXQgbGluZ2VyaW5nX2Nsb3NlKCkgd29ya2luZyBhZ2Fpbi4gW0RlYW4gR2F1ZGV0LCBKZWZmIFRyYXdpY2tdCgogICopIFdpbjMyOiBHZXQgbm9uLWJsb2NraW5nIENHSSBwaXBlIHJlYWRzIHdvcmtpbmcgdW5kZXIgV2luZG93cyBOVC4KICAgICBUaGlzIGFkZHJlc3NlcyBQUiAxNjIzLiBTdGlsbCBuZWVkIHRvIGFkZHJlc3MgdGltaW5nIG91dCBydW5hd2F5CiAgICAgQ0dJIHNjcmlwdHMuIFtCaWxsIFN0b2RkYXJkXQogCiAgKikgV2luMzI6IE1ha2UgYXBfc3RhdCBXaW5kb3dzIDk1Lzk4IGZyaWVuZGx5CiAgICAgW1dpbGxpYW0gUm93ZSA8d3Jvd2UgbG5kLmNvbT5dICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgKikgV2luMzI6IEZpeCBhIGJ1ZyBpbiBhcF9nZXRfb3NsZXZlbCB3aGljaCBjYXVzZXMgR2V0VmVyc2lvbkV4KCkgdG8gCiAgICAgYWx3YXlzIGZhaWwuIE5lZWQgdG8gaW5pdGlhbGlzZSB0aGUgZHdPU1ZlcnNpb25JbmZvU2l6ZSBtZW1iZXIgb2YgdGhlIAogICAgIE9TVkVSU0lPTklORk8gc3RydWN0IGJlZm9yZSBjYWxsaW5nIEdldFZlcnNpb25FeCwgc28gR2V0VmVyc2lvbkV4IAogICAgIGFsd2F5cyBmYWlscy4gCgogICAgIFRoZSBwYXRjaCBhbHNvIGVuaGFuY2VzIGFwX2dldF9vc2xldmVsIChhbmQgdGhlIGFzc29jaWF0ZWQgZW51bSkgdG8gCiAgICAgaGFuZGxlIHNlbGVjdGVkIHNlcnZpY2UgcGFja3MgZm9yIE5UNCwgYW5kIGFkZHMgcmVjb2duaXRpb24gZm9yIAogICAgIFdpbmRvd3MgMjAwMC4gVGhpcyBpcyB1c2VmdWwsIGVnLiBpZiB3ZSBjYW4gcmVjb2duaXNlIE5UNCBTUDIgdGhlbiAKICAgICB3ZSBjYW4gdXNlIFJlYWRGaWxlU2NhdHRlciBhbmQgV3JpdGVGaWxlR2F0aGVyIGluIHJlYWR3cml0ZS5jLiAKICAgICBbVGltIENvc3RlbGxvIDxUaW0uQ29zdGVsbG8gQlRGaW5hbmNpYWxncm91cC5jb20+XQoKICAqKSBHZXQgbW9kX3Jld3JpdGUgYnVpbGRpbmcgYW5kIHJ1bm5pbmcsIGFuZCBtb2Rfc3RhdHVzIGJ1aWxkaW5nIGZvciBXaW4gTlQKICAgICBbQWxsYW4gRWR3YXJkcyA8YWtlIHJhbGVpZ2guaWJtLmNvbT5dCgogICopIFBhdGNoIHRvIHBvcnQgbW9kX2F1dGhfZGIgdG8gdGhlIDIuMCBhcGkgYW5kIGFsc28gdG8gc3VwcG9ydCAKICAgICBCZXJsZWtleSBEQiAzLjAuIEl0IHdvcmtzIGZvciBtZSB3aXRoIGJvdGggQmVya2VsZXkgREIgMy4wLjU1IGFuZCAKICAgICAyLjcuNy4gIEl0IHNob3VsZCB3b3JrIHdpdGggdmVyc2lvbiAxIGFzIHdlbGwgYnV0IEkgaGF2ZW4ndCB0ZXN0ZWQgaXQuICAKICAgICBbQnJpYW4gTWFydGluIDxibWFydGluIHBlbmd1aW5jb21wdXRpbmcuY29tPl0KCiAgKikgR2V0IEFQUiBEU08gY29kZSB3b3JraW5nIHVuZGVyIFdpbmRvd3MuIEluY2x1ZGVzIGNyb3NzIHBsYXRmb3JtCiAgICAgZml4ZXMgdG8gbW9kX3NvLmMuCiAgICAgWzxUaW0uQ29zdGVsbG8gQlRGaW5hbmNpYWxncm91cC5jb20+XQoKICAqKSBGaXggc29tZSBvZiB0aGUgV2luZG93cyBBUFIgdGltZSBmdW5jdGlvbnMuCiAgICAgW1dpbGxpYW0gUm93ZV0KCiAgKikgRkFRIGNoYW5nZXMgcmVsYXRlZCB0byB0aWR5aW5nIHVwIGhpc3RvcmljYWwgZG9jdW1lbnRzIG9uIHRoZSB3ZWIgc2l0ZS4KICAgICBbSm9zaHVhIFNsaXZlIDxzbGl2ZSBmaW5hbmNlLmNvbW1lcmNlLnViYy5jYT5dCgogICopIE1vdmUgV2luZG93cyBEU08gY29kZSBpbnRvIEFQUi4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgRWxpbWluYXRlIGFwcl93aW4uaCBhbmQgYXByX3dpbmNvbmZpZy5oIChhbmQgdGhlIHVnbHkgI2lmZGVmcyB0aGV5IGNhdXNlKS4KICAgICBOb3csIGFwci5oIGFuZCBhcHJfY29uZmlnLmggYXJlIGdlbmVyYXRlZCBmcm9tIGFwci5odyBhbmQgYXByX2NvbmZpZy5odwogICAgIGF0IGJ1aWxkIHRpbWUuIEF0IHRoaXMgcG9pbnQsIHRoZSBzZXJ2ZXIgd2lsbCBub3QgY29tcGlsZSBvbiBXaW5kb3dzIGJlY2F1c2UKICAgICBvZiB0aGUgcmVjZW50IERTTyBjb21taXRzLiBGaXhpbmcgdGhvc2UgbmV4dC4KICAgICBbQmlsbCBSb3dlICYgQmlsbCBTdG9kZGFyZF0KCiAgKikgQWRkZWQgZXJyb3IgY2hlY2tpbmcgZm9yIGZpbGUgSS9PIEFQUiByb3V0aW5lcy4KICAgICBbSm9uIFRyYXZpcyA8anRyYXZpcyBjb3ZhbGVudC5uZXQ+XQoKICAqKSBBUFI6IERvbid0IHVzZSB0aGUgdmFsdWVzIG9mIHJlc29sdmVyIGVycm9yIGNvZGVzIGZvciB0aGUgCiAgICAgY29ycmVzcG9uZGluZyBBUFIgZXJyb3IgY29kZXMuICBPbiBVbml4IGFuZCBXaW4zMiwgcmV0dXJuIHRoZSAKICAgICBwcm9wZXIgQVBSIGVycm9yIGNvZGUgYWZ0ZXIgYSByZXNvbHZlciBlcnJvci4gW0plZmYgVHJhd2lja10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wYTIKCiAgKikgUmVuYW1lZCB0aGUgZXhlY3V0YWJsZSBiYWNrIHRvIGh0dHBkIG9uIGFsbCBwbGF0Zm9ybXMgb3RoZXIgCiAgICAgdGhhbiBXaW4zMgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBBbGxvdyBCZU9TIHRvIHN1cnZpdmUgcmVzdGFydHMsIGxvZyBwcm9wZXJseSBhbmQgYSBmZXcKICAgICBzbWFsbCB0aGluZ3MgaXQgaGFkIHByb2JsZW1zIHdpdGggZHVlIHRvIHRoZSB3YXkgaXQgc2V0dXAKICAgICB1c2VycyBhbmQgZ3JvdXBzLiBbRGF2aWQgUmVpZF0KCiAgKikgR2V0IG1vZF9yZXdyaXRlIHdvcmtpbmcgd2l0aCBBUFIgbG9ja3MKICAgICBbUGF1bCBSZWRlciA8cmVkZXJwaiByYWxlaWdoLmlibS5jb20+XQoKICAqKSBBY3R1YWxseSByZW1vdmUgdGhlIHNlbXBhaG9yZSB3aGVuIHRoZSBsb2NrIGNsZWFudXAgcm91dGluZQogICAgIGlzIGNhbGxlZCBvbiBCZU9TLiBbRGF2aWQgUmVpZF0KCiAgKikgQ2xlYXIgaG9vayByZWdpc3RyYXRpb25zIGJldHdlZW4gcmVhZHMgb2YgdGhlIGNvbmZpZyBmaWxlLgogICAgIFdoZW4gRFNPcyBhcmUgdW5sb2FkZWQgYW5kIHJlLWxvYWRlZCB0aGUgb2xkIGhvb2sgcG9pbnRlcnMgbWF5CiAgICAgbm8gbG9uZ2VyIGJlIHZhbGlkLiBUaGlzIGZpeCBlbGltaW5hdGVzIHBvdGVudGlhbCBzZWdmYXVsdHMuCiAgICAgW0FsbGFuIEVkd2FyZHMgPGFrZSByYWxlaWdoLmlibS5jb20+XQoKICAqKSBGaXggYSBwcm9ibGVtIHdpdGggU2lnZnVuYyBub3QgYmVpbmcgZGVmaW5lZCBvciBieXBhc3NlZAogICAgIGlmIHNpZ2FjdGlvbigpIHdhc24ndCBmb3VuZC4gW0ppbSBKYWdpZWxza2ldCgogICopIEZpeCB0aGUgbG9ja2luZyBtZWNoYW5pc20gb24gQlNEIHZhcmlhbnRzLiAgVGhleSBub3cgdXNlIGZjbnRsCiAgICAgbG9ja3MuICBUaGlzIGFsbG93cyB0aGUgc2VydmVyIHRvIHN0YXJ0IGFuZCBzZXJ2ZSBwYWdlcy4KICAgICBbUnlhbiBCbG9vbV0KCiAgKikgRmlyc3QgY3V0IGF0IGdldHRpbmcgdGhlIFdpbjMyIGluc3RhbGxlciB0byB3b3JrCiAgICAgW1dpbGxpYW0gUm93ZSA8d3Jvd2UgbG5kLmNvbT5dCgogICopIEdldCBodHBhc3N3ZCBjb21waWxpbmcgdW5kZXIgV2luZG93cwogICAgIFtXaWxsaWFtIFJvd2UgPHdyb3dlIGxuZC5jb20+XQoKICAqKSBDaGFuZ2UgdGhlIGxvZyBtZXNzYWdlIGZvciBhIGJpbmQoKSBmYWlsdXJlIHRvIHNob3cgdGhlCiAgICAgaW50ZXJmYWNlIGFuZCBwb3J0IG51bWJlci4gW0plZmYgVHJhd2lja10KCiAgKikgSW1wb3J0IHRoZSBkb2N1bWVudGF0aW9uIGZyb20gMS4zLjEyIGFuZCBicmluZyBwYXJ0cyBvZiBpdAogICAgIHVwLXRvLWRhdGUgd2l0aCByZXNwZWN0IHRvIHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBvY2N1cnJlZAogICAgIGluIDIuMC4KICAgICBbVG9ueSBGaW5jaF0KCiAgKikgQmVPUyBNUE0gdXBkYXRlZC4gIENHSSBidWcgb24gQmVPUyBmaXhlZC4gIElQIGFkZHJlc3NlcwogICAgIG5vdyBsb2dnZWQgY29ycmVjdGx5IG9uIEJlT1MuCiAgICAgW0RhdmlkIFJlaWRdCgogICopIENyZWF0ZSBvbmUgbWFrZWZpbGUgZm9yIGFsbCBXaW4zMiBkaXN0cmlidXRpb25zIChOVC8yMDAwLzk1Lzk4KS4KICAgICBNYWtlZmlsZS53aW4gaW5jbHVkZXMgdGhlIHNhbWUgdXNlciBpbnRlcmZhY2UgYXMgdGhlIG9sZCAKICAgICBNYWtlZmlsZS5udCAKICAgICBbV2lsbGlhbSBSb3dlIDx3cm93ZSBsbmQuY29tPiwgSmVmZiBUcmF3aWNrIDx0cmF3aWNrIHVzLmlibS5jb20+XQoKICAqKSBXaW4zMiBleGVjIG5vdyB1c2VzIENPTVNQRUMgZW52aXJvbm1lbnQgc3RyaW5nIGZvciBjb21tYW5kIAogICAgIHNoZWxsIHBhdGggcmVzb2x1dGlvbi4KICAgICBbV2lsbGlhbSBSb3dlIDx3cm93ZSBsbmQuY29tPl0gUFIjMzcxNQoKICAqKSBXaW4zMjogYXBfY29ubmVjdCgpIHdhcyBub3QgcmV0dXJuaW5nIGNvcnJlY3QgZXJyb3IgY29uZGl0aW9uCiAgICAgUFI1ODY2CiAgICAgW0FsbGVuIFByZXNjb3R0IDxhbGxlbiBjbGFucHJlc2NvdHQuY29tPl0KCiAgKikgV2luMzI6IGFwX29wZW4oKSB3YXMgYnJva2VuIG9uIFdpbjl4IGJlY2F1c2UgYW4gTlQtc3BlY2lmaWMKICAgICBmbGFnIHdhcyBwYXNzZWQgdG8gQ3JlYXRlRmlsZS4gIGFwX3B1dHMoKSBhZGRlZCBhbiB1bm5lY2Vzc2FyeQogICAgICdcbicuCiAgICAgW0plZmYgVHJhd2ljayA8dHJhd2ljayB1cy5pYm0uY29tPl0KCiAgKikgUHV0IGluIEtvcmVhbiBhbmQgTm9yd2VnaWFuIGluZGV4Lmh0bWwgcGFnZXMgKDIuMCBhbmQgMS4zKQogICAgIHdoaWNoIHdoZXJlIGRvbmF0ZWQgYnkgTGVlIEt1ayBIeXVuIGFuZCBMb3JhbnQgQ3phcmFuLiAnRml4ZWQnCiAgICAgY29uZnVzaW5nIGVlL2V0IG5hbWUgYW5kIG1hZGUgYWxsIGV4dGVuc2lvbnMgbGFuZ3VhZ2UvZGlhbGVjdAogICAgIHJhdGhlciB0aGFuIGNvdW50cnkgcmVmbGVjdGluZy4gQ2hhbmdlZCBleGFtcGxlIGZpbGVzIHRvCiAgICAgZXhwbGljaXQgcmVmbGVjdCB0aGUgSVNPIGNoYXJzZXQgYW5kIGFkZGVkIGEgZmV3IGNvbW1vbiAKICAgICBvbmVzIHRvIHRoZSBleGFtcGxlIGNvbmZpZyBbZGlya3hdCgogICopIEV4dGVuZCBleHRlcm5hbCBtb2R1bGUgY2FwYWJpbGl0eS4gIFRvIHVzZSB0aGlzLCB5b3UgY2FsbAogICAgIGNvbmZpZ3VyZSB3aXRoIC0td2l0aC1tb2R1bGU9cGF0aC90by9tb2QxLHBhdGgvdG8vbW9kMixldGMuCiAgICAgW1J5YW4gQmxvb21dCgogICopIEJhY2twb3J0ZWQgdGhlIHZhcmlvdXMgImRlZmF1bHQgY2hhcnNldCIgZml4ZXMgZnJvbSAxLjMuMTIsCiAgICAgaW5jbHVkaW5nIHRoZSBBZGREZWZhdWx0Q2hhcnNldCBkaXJlY3RpdmUuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBBZGRlZCB0aGUgY2FwYWJpbGl0eSB0byBkbyAke0VOVlZBUn0gY29uc3RydWN0cyBpbiB0aGUKICAgICBjb25maWcgZmlsZS4gRS5nLiAnU2VydmVyQWRtaW4gJHtQT1NUTUFTVEVSfScuIEFzIGNvbW1pdGVkCiAgICAgaXQgZG9lcyB0aGlzIG9uIGEgbGluZSBieSBsaW5lIGJhc2lzOyBpLmUuIGlmIHRoZSBlbnZ2YXIKICAgICBleHBhbmRzIHRvIHNvbWV0aGluZyB3aXRoIHNwYWNlcyB5b3UgaGF2ZSB0byBwcm90ZWN0IGl0CiAgICAgYnkgYWRkaW5nIHF1b3RlcyBhcm91bmQgaXQgKFVubGVzcyBvZiBjb3Vyc2UgeW91IGV4cGVjdCBpdAogICAgIHRvIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQuIEFsdGVybmF0aXZlbHkgeW91CiAgICAgY2FuIGNvbXBpbGUgaXQgb24gYSBwZXIgdG9rZW4gYmFzaXM7IHdoaWNoIGlzIHdoYXQgcGVvcGxlCiAgICAgdXN1YWxseSBleHBlY3QgYnkgc2V0dGluZyBSRVNPTFZFX0VOVl9QRVJfVE9LRU4uIEJ1dCB0aGlzCiAgICAgaGFtcGVycyBmYW5jaWVyIGhhY2tzLgogICAgIFtEaXJrLVdpbGxlbSB2YW4gR3VsaWtdCgogICopIENoYW5nZWQgdGhlICdFcnJvckRvY3VtZW50JyBzeW50YXggaW4gdGhhdCBpdCBOTyBsb25nZXIKICAgICBzdXBwb3J0cyB0aGUgYXN5bWV0cmljCgogICAgICAgICAgICAgICAgRXJyb3JEb2N1bWVudCAzMDEgIlNvbWUgbWVzc2FnZQoKICAgICBOb3RlIHRoZSBvcGVuaW5nICIgcXVvdGUsIHdpdGhvdXQgYSBjbG9zaW5nIHF1b3RlLiBJdCBub3cKICAgICBoYXMgZWl0aGVyIHRoZSBmb2xsb3dpbmcgc3ludGF4ZXMKCiAgICAgICAgICAgICAgICBFcnJvckRvY3VtZW50IFhYWCAvbG9jYWwvdXJpCiAgICAgICAgICAgICAgICBFcnJvckRvY3VtZW50IFhYWCBodHRwOi8vdmFsaWQvdXJsCiAgICAgICAgICAgICAgICBFcnJvckRvY3VtZW50IFhYWCAiU29tZSBNZXNzYWdlIgoKICAgICBUaGUgcmVjb2duaXRpb24gaGV1cmlzdGljIGlzOiBpZiBpdCBoYXMgYSBzcGFjZSBpdAogICAgIGlzIGEgbWVzc2FnZS4gSWYgaXQgaGFzIG5vIHNwYWNlcyBhbmQgc3RhcnRzIHdpdGggYSAvCiAgICAgb3IgaXMgYSB2YWxpZCBVUkwgdGhlbiB0cmVhdCBpdCB0aGF0IHdheS4gT3RoZXJ3aXNlIGl0CiAgICAgaXMgYXNzdW1lZCB0byBiZSBhIG1lc3NhZ2UuCgogICAgIFRoaXMgYnJlYWtzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYnV0IG1ha2VzIGxpdmUgYSBoZWxsCiAgICAgb2YgYSBsb3QgZWFzaWVyIGZvciBHVUkncyBhbmQgY29uZmlnIGZpbGUgcGFyc2Vycy4KICAgICBbRGlyay1XaWxsZW0gdmFuIEd1bGlrXQoKICAqKSBDaGFuZ2VkICdDYWNoZU5lZ290aWF0ZWREb2NzJyBmcm9tIGl0cyBwcmVzZW50L25vdC1wcmVzZW50CiAgICAgc3ludGF4IGludG8gYSAnb24nIG9yICdvZmYnIHN5bnRheC4gQXMgaXQgY3VycmVudGx5IGlzIHRoZQogICAgIG9ubHkgbm9uIG5lc3RpbmcgdG9rZW4gd2hpY2ggdXNlcyBOT19BUkdTIGFuZCB0aHVzIGlzIGFuCiAgICAgYWJzb2x1dGUgcGFpbiBmb3IgYW55IGNvbmZpZyBpbnRlcmZhY2UgYXV0b21hdGlvbi4gVGhpcwogICAgIGJyZWFrcyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBbRGlyay1XaWxsZW0gdmFuIEd1bGlrXQoKICAqKSBBZGQgYWJpbGl0eSB0byBhZGQgZXh0ZXJuYWwgbW9kdWxlcyB0byB0aGUgYnVpbGQgcHJvY2Vzcy4gIFRoaXMgaXMKICAgICBkb25lIHdpdGggLS13aXRoLW1vZHVsZT0vcGF0aC90by9tb2R1bGUuICBNb2R1bGVzIGNhbiBvbmx5IGJlIGFkZGVkCiAgICAgYXMgc3RhdGljIG1vZHVsZXMgYXQgdGhpcyBwb2ludC4KICAgICBbUnlhbiBCbG9vbV0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMi4wYTEKCiAgKikgRml4IEZyZWVCU0QgMy4zIGNvcmUgZHVtcC4KICAgICBCYXNpY2FsbHksIGFwX2luaXRpYWxpemUoKSBuZWVkcyB0byBnZXQgY2FsbGVkIGJlZm9yZSAKICAgICBjcmVhdGVfcHJvY2VzcygpLCBzaW5jZSBjcmVhdGVfcHJvY2VzcygpIHBhc3NlcyBvcF9vbiBzdHJ1Y3R1cmUKICAgICB0byBzZW1vcCgpIHRvIGdldCBhIGxvY2ssIGJ1dCBvcF9vbiBpc24ndCBpbml0aWFsaXplZCB1bnRpbCAKICAgICBhcF9pbml0aWFsaXplKCkgY2FsbHMgc2V0dXBfbG9jaygpLiAgSGVyZSBpcyBhIHNsaWdodAogICAgIHJlYXJyYW5nZW1lbnQgdG8gbWFpbigpIHdoaWNoIGNhbGxzIGFwX2luaXRpYWxpemUoKSBlYXJsaWVyLi4uCiAgICAgW0plZmYgVHJhd2ljayA8dHJhd2ljayB1cy5pYm0uY29tPl0KCiAgKikgRW5hYmxlIEFwYWNoZSB0byB1c2Ugc2VuZGZpbGUvVHJhbnNtaXRGaWxlIEFQSQogICAgIFtCaWxsIFN0b2RkYXJkLCBEYXZpZCBSZWlkLCBQYXVsIFJlZGVyXQoKICAqKSBSZS1JbXBsZW1lbnQgV2luMzIgQVBSIG5ldHdvcmsgSS9PIEFQSXMgYW5kIG1vc3Qgb2YgdGhlIGZpbGUgSS9PCiAgICAgQVBJcy4KICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgTWFrZSBmaWxlIEkvTyBhbmQgbmV0d29yayBJL08gd3JpdGV2L3NlbmR2IEFQSXMgY29uc2lzdGVudC4KICAgICBFbGltaW5hdGUgdXNlIG9mIGFwX2lvdmVjX3QgYW5kIHVzZSBQb3NpeCBzdHJ1Y3QgaW92ZWMuCiAgICAgVXNlIHNlcGVyYXRlIHZhcmlhYmxlIG9uIGFwX3dyaXRldiB0byBzZXQgdGhlIG51bWJlciBvZiBpb3ZlY3MKICAgICBwYXNzZWQgaW4gYW5kIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBBZGFwdCBmaWxlIGlvbCB0byB1c2UgQVBSIGZ1bmN0aW9ucy4gUmVwbGFjZWQgYXBfb3Blbl9maWxlKCkgCiAgICAgd2l0aCBhcF9jcmVhdGVfZmlsZV9pb2woKS4gYXBfY3JlYXRlX2ZpbGVfaW9sKCkgcmVxdWlyZXMgdGhhdCAKICAgICB0aGUgZmlsZSBiZSBvcGVuZWQgcHJpb3IgdG8gdGhlIGNhbGwgdXNpbmcgYXBfb3BlbigpLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBQb3J0IG1vZF9pbmNsdWRlIGFuZCBtb2RfY2dpIHRvIDIuMAogICAgIFtQYXVsIFJlZGVyLCBCaWxsIFN0b2RkYXJkXQoKICAqKSBhcF9zZW5keyx2fSwgYXBfcmVjdiwgYXBfc2VuZGZpbGUgQVBJIGNsYXJpZmljYXRpb24gLS0KICAgICBieXRlc19yZWFkL2J5dGVzX3dyaXR0ZW4gaXMgYWx3YXlzIHZhbGlkIChuZXZlciAtMSkuICBQbHVzCiAgICAgc29tZSBmaXhlcyB0byBidWZmLmMgdG8gY29ycmVjdCBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IHRoZQogICAgIGVycm5vID0+IGFwX3N0YXR1c190IGNoYW5nZXMgYSB3aGlsZSBiYWNrLiAgUGx1cyBhIGZpeCB0bwogICAgIGNodW5rZWQgZW5jb2RpbmcgaW50cm9kdWNlZCByaWdodCBhdCB0aGUgYmVnaW5uaW5nIG9mIDIuMC4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIFJldmFtcGVkIFVOSVggYnVpbGQgc3lzdGVtIHRvIHVzZSBhdXRvY29uZiBhbmQgbGlidG9vbC4KICAgICBbTWFub2ogS2FzaWNoYWludWxhLCBTYXNjaGEgU2NodW1hbm5dCgogICopIHBvcnQgbW9kX3Jld3JpdGUgdG8gMi4wLiBbUGF1bCBKLiBSZWRlciA8cmVkZXJwaiByYWxlaWdoLmlibS5jb20+XQoKICAqKSBTRUNVUklUWTogTW9yZSByaWdvcm91cyBjaGVja2luZyBvZiBIb3N0OiBoZWFkZXJzIHRvIGZpeCBzZWN1cml0eSAKICAgICBwcm9ibGVtcyB3aXRoIG1hc3MgbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3RpbmcgKHdoZXRoZXIgdXNpbmcgbW9kX3Jld3JpdGUKICAgICBvciBtb2Rfdmhvc3RfYWxpYXMpLgogICAgIFtCZW4gSHlkZSwgVG9ueSBGaW5jaF0KICAKICAqKSBBZGQgYmFjayBzdXBwb3J0IGZvciBVc2VDYW5vbmljYWxOYW1lIGluIDxEaXJlY3Rvcnk+IGNvbnRhaW5lcnMuCiAgICAgW01hbm9qIEthc2ljaGFpbnVsYV0KCiAgKikgQWRkZWQgQVBMT0dfU1RBUlRVUCBsb2cgdHlwZS4gIFRoaXMgYWxsb3dzIHVzIHRvIHdyaXRlIGFuIGVycm9yCiAgICAgbWVzc2FnZSB3aXRob3V0IGFueSBvZiB0aGUgZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gIEFzIGEgcGFydAogICAgIG9mIHRoaXMgY2hhbmdlLCBJIGFsc28gcmVtb3ZlZCBhbGwgb2YgdGhlIGNhbGxzIHRvIGZwcmludGYoc3RkZXJyCiAgICAgYW5kIHJlcGxhY2VkIHRoZW0gd2l0aCBjYWxscyB0byBhcF9sb2dfZXJyb3IgdXNpbmcgQVBMT0dfU1RBUlRVUAogICAgIHdyaXRpbmcgdG8gc3RkZXJyIGlzIG5vIGxvbmdlciBwb3J0YWJsZSwgYmVjYXVzZSB3ZSBkb24ndCBkaXJlY3QgCiAgICAgc3RkZXJyIHRvIHRoZSBlcnJvciBsb2cgb24gYWxsIHBsYXRmb3Jtcy4KICAgICBbUnlhbiBCbG9vbV0gCiAKICAqKSBDb252ZXJ0IGVycm9yIGxvZ2dpbmcgZnVuY3Rpb25zIHRvIHRha2UgZXJybm8gYXMgYW4gYXJndW1lbnQuCiAgICAgVGhpcyBtYWtlcyBvdXIgZXJyb3IgbG9ncyBtb3JlIHBvcnRhYmxlLCBiZWNhdXNlIHNvbWUgV2luZG93cyBBUEkncyAKICAgICBkb24ndCBzZXQgZXJybm8uICBUaGlzIGNoYW5nZSBhbGxvd3MgdXMgdG8gc3RpbGwgb3V0cHV0IGEgdmFsaWQKICAgICBtZXNzYWdlIG9uIGFsbCBvZiBvdXIgcGxhdGZvcm1zLgogICAgIFtSeWFuIEJsb29tXQoKICAqKSBtb2RfbWltZV9tYWdpYyBydW5zIGluIDIuMC1kZXYgbm93LgogICAgIFtQYXVsIFJlZGVyIDxyZWRlcnBqIHJhbGVpZ2guaWJtLmNvbT5dCgogICopIHNlbmRmaWxlIGhhcyBiZWVuIGFkZGVkIHRvIEFQUi4KICAgICBbSm9obiBaZWRsZXdza2kgPHplZGx3c2tpIFByaW5jZXRvbi5FRFU+XQoKICAqKSBidWZmLmMgaGFzIGJlZW4gY29udmVydGVkIHRvIG5vIGxvbmdlciB1c2UgZXJybm8uCiAgICAgW01hbm9qIEthc2ljaGFpbnVsYV0KCiAgKikgbW9kX3NwZWxpbmcgcnVucyBpbiAyLjAtZGV2IG5vdzogYSBidWcgaW4gcmVhZGRpcl9yIGhhbmRsaW5nIGFuZAogICAgIGludGVyZmFjZSBhZGFwdGlvbiB0byBBUFIgZnVuY3Rpb25zIGRpZCBpdC4gW01hcnRpbiBLcmFlbWVyXQoKICAqKSBTdXBwb3J0IERTT3MgcHJvcGVybHkgb24gMzItYml0IEhQLVVYIDExLjAKICAgICBbRGlsaXAgS2hhbmRla2FyIDxkaWxpcCBjdXAuaHAuY29tPl0KCiAgKikgVXBkYXRlZCBNTSBpbiBBUFIgc291cmNlIHRyZWUgZnJvbSB2ZXJzaW9uIDEuMC44IHRvIDEuMC4xMQogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBDbGVhbmVkIEFQUiBidWlsZCBlbnZpcm9ubWVudCBpbnRlZ3JhdGlvbiBhbmQgYm9vdHN0cmFwIEFQUiAKICAgICBhdXRvbWF0aWNhbGx5IGZvciBkZXZlbG9wZXJzIGZyb20gc3JjL0NvbmZpZ3VyZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4ZWQgYnVpbGRpbmcgb2Ygc3JjL3N1cHBvcnQvaHRwYXNzd2QuYwogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBXaGVuIGdlbmVyYXRpbmcgdGhlIExvY2F0aW9uOiBoZWFkZXIsIG1vZF9zcGVsaW5nIGZvcmdvdAogICAgIHRvIGVzY2FwZSB0aGUgc3BlbGxpbmctZml4ZWQgdXJpLiAoRm9ydy1Qb3J0IGZyb20gMS4zKQogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgTW92ZWQgbW9kX2F1dGhfZGlnZXN0LmMgZnJvbSBleHBlcmltZW50YWwgdG8gc3RhbmRhcmQuIFtSb3kgRmllbGRpbmddCgogICopIENoYW5nZSBhbGwgcG9vbHMgdG8gQVBSIGNvbnRleHRzLiAgVGhpcyBpcyB0aGUgZmlyc3Qgc3RlcCB0bwogICAgIGluY29ycG9yYXRpbmcgQVBSIGludG8gQXBhY2hlLiBbUnlhbiBCbG9vbV0KCiAgKikgTW92ZSAiaGFuZGxlciBub3QgZm91bmQiIHdhcm5pbmcgbWVzc2FnZSB0byBiZWxvdyB0aGUgY2hlY2sKICAgICBmb3IgYSB3aWxkY2FyZCBoYW5kbGVyLiAgW0RpcmsgPGRpcmttIHRlbGVwb3J0LmNvbT4sIFJveSBGaWVsZGluZ10KICAgICBQUiMyNTg0LCBQUiMyNzUxLCBQUiMzMzQ5LCBQUiMzNDM2LCBQUiMzNTQ4LCBQUiM0Mzg0LCBQUiM0Nzk1LCBQUiM0ODA3CgogICopIFN1cHBvcnQgbGluZS1jb250aW51YXRpb24gZmVhdHVyZSBpbiBjb25maWcub3B0aW9uIGZpbGUgYW5kCiAgICAgYWxsb3cgdGhlIGxvYWRpbmcgb2YgbXVsdGlwbGUgb3B0aW9uIHNlY3Rpb25zIGF0IG9uY2UgdmlhCiAgICAgYGAtLXdpdGgtb3B0aW9uPTxzZWN0aW9uMT4sPHNlY3Rpb24yPiwuLi4nJwogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZWJ1aWx0IENWUyByZXBvc2l0b3J5IHdpdGggQXBhY2hlIDEuMy45IGFzIGJhc2lzLiAgW1JveSBGaWVsZGluZ10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgTVBNCgogICopIFVzZSBhc3luY2hyb25vdXMgQWNjZXB0RXgoKSBhbmQgYSBjb21wbGV0aW9uIHBvcnQgdG8gYWNjZXB0IGFuZAogICAgIGRpc3BhdGNoIGNvbm5lY3Rpb25zIHRvIHRocmVhZHMgaW4gV2luZG93cyBOVC8yMDAwLiAKICAgICBbQmlsbCBTdG9kZGFyZF0KCiAgKikgSW1wbGVtZW50IFdJTk5UIFdpbjMyIE1QTSBmcm9tIG9yaWdpbmFsIFdpbjMyIGNvZGUgaW4gaHR0cF9tYWluLmMKICAgICBbQmlsbCBTdG9kZGFyZF0gIAoKICAqKSBJbXBsZW1lbnQgdGhlIEFQQUNJIC0td2l0aC1vcHRpb24gZmFjaWxpdHkgCiAgICAgKHBlciBkZWZhdWx0IHVzZWQgdGhlIGNvbmZpZy5vcHRpb24gZmlsZSkuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1QTSBCRU9TIHBvcnQuICBbRGF2aWQgUmVpZCA8YWJiMzcgZGlhbC5waXBleC5jb20+XQoKICAqKSBTdGFydCB0byBpbXBsZW1lbnQgbW9kdWxlLWRlZmluZWQgaG9va3MgdGhhdCBhcmUgYSkgZmFzdCBhbmQgYikgdHlwZXNhZmUuCiAgICAgUmVwbGFjZSBwcmVfY29ubmVjdGlvbiBtb2R1bGUgY2FsbCB3aXRoIGEgcmVnaXN0ZXJfaG9vayBjYWxsIGFuZAogICAgIGltcGxlbWVudCBwcmVfY29ubmVjdGlvbiBhcyBhIGhvb2suIFRoZSBpbnRlbnQgaXMgdGhhdCB0aGVzZSBob29rcyB3aWxsCiAgICAgYmUgZXh0ZW5kZWQgdG8gYWxsb3cgQXBhY2hlIHRvIGJlIG11bHRpLXByb3RvY29sLCBhbmQgYWxzbyB0byBhbGxvdyB0aGUKICAgICBjYWxsaW5nIG9yZGVyIHRvIGJlIHNwZWNpZmllZCBvbiBhIHBlci1ob29rL3Blci1tb2R1bGUgYmFzaXMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEltcGxlbWVudCBtcG1fKiBtZXRob2RzIGFzICJtb2R1bGVzIi4gRWFjaCBtZXRob2QgZ2V0cyBpdHMgb3duCiAgICAgc3ViZGlyIGluIHNyYy9tb2R1bGVzIChlZzogc3JjL21vZHVsZXMvcHJlZm9yaykuIFNlbGVjdGlvbgogICAgIG9mIG1ldGhvZCB1c2VzIFJ1bGUgTVBNX01FVEhPRC4gIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBQb3J0IHRoZSBoeWJyaWQgc2VydmVyIGZyb20gdGhlIGFwYWNoZS1hcHIgcmVwb3NpdG9yeSBhcwogICAgIG1wbV9tcG10X3B0aHJlYWQuICBbTWFub2ogS2FzaWNoYWludWxhXQoKICAqKSBvcy91bml4L3VuaXhkLltjaF06IGRldGFjaCwgc2V0dWlkLCBzZXRnaWQsIHN0dWZmIHdoaWNoIHdpbGwgYmUgY29tbW9uCiAgICAgYW1vbmdzdCB0aGUgdW5peCBNUE1zLgoKICAqKSBtcG1fcHJlZm9yazogdGhyb3cgYXdheSBhbGwgdGhlIGFsYXJtL3RpbWVvdXQgY3J1ZDsgYW5kIGNsZWFuIHVwIHRoZQogICAgIHNpZ25hbCBoYW5kbGluZyBmb3IgdGhlIG5ldyB3b3JsZCBvcmRlci4gIFtEZWFuIEdhdWRldF0KCiAgKikgQ3J1ZGUgYXBfdGhyZWFkX211dGV4IGFic3RyYWN0aW9uIHNvIHRoYXQgd2UgZ2V0IHRoZSBwdGhyZWFkIHN0dWZmIG91dAogICAgIG9mIGFsbG9jLmMgZm9yIG5vdy4gIFtEZWFuIEdhdWRldF0KCiAgKikgSGFuZGxlIHBhcnRpYWwgbGFyZ2Ugd3JpdGVzIGNvcnJlY3RseS4gIFtCZW4gTGF1cmllXQoKICAqKSBFbGltaW5hdGUgY29ubl9yZWMncyBwb2ludGVyIHRvIHNlcnZlci4gQWxsIGl0IGtub3dzIGlzIHRoZSBiYXNlIHNlcnZlcgogICAgIGJhc2VkIG9uIElQL3BvcnQuICBbQmVuIExhdXJpZV0KCiAgKikgUG9ydCBhIGJ1bmNoIG9mIG1vZHVsZXMgdG8gdGhlIG5ldyBtb2R1bGUgc3RydWN0dXJlLgogICAgIFsiTWljaGFlbCBILiBWb2FzZSIgPG12b2FzZSBtaWRjb2FzdC5jb20uYXU+XQoKICAqKSBJL08gbGF5ZXJpbmcgYW5kIEJVRkYgcmV2YW1wLiAgU2VlIGRvY3MvYnVmZi50eHQuICBbRGVhbiBHYXVkZXRdCgogICopIEJhc2ljIHJlc3RydWN0dXJpbmcgdG8gaW50cm9kdWNlIHRoZSBNUE0gY29uY2VwdDsgaW5jbHVkZXMgdmFyaW91cwogICAgIGNoYW5nZXMgdG8gdGhlIG1vZHVsZSBBUEkuLi4gYmV0dGVyIGRlc2NyaWJlZCBieQogICAgIGRvY3MvaW5pdGlhbF9ibHVyYi50eHQuICBbRGVhbiBHYXVkZXRdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIHB0aHJlYWRzCgogICopIE5ldyBidWZmIG9wdGlvbiBhZGRlZDogQk9fVElNRU9VVC4gSXQgZGVzY3JpYmVzIHRoZSB0aW1lb3V0IGZvcgogICAgIGJ1ZmYgb3BlcmF0aW9ucyAoZ2VuZXJhbGx5IG92ZXIgYSBuZXR3b3JrKS4KICAgICBbRGVhbiBHYXVkZXQsIFJ5YW4gQmxvb20sIE1hbm9qIEthc2ljaGFpbnVsYV0KCiAgKikgQ3JlYXRlZCBodHRwX2FjY2VwdCBhYnN0cmFjdGlvbi4gQWRkZWQgNCBuZXcgZnVuY3Rpb25zIChub3QgZXhwb3J0ZWQpOgogICAgIGluaXRfYWNjZXB0KCksIGJlZ2luX2FjY2VwdGluZ19yZXF1ZXN0cygpLCBnZXRfcmVxdWVzdCgpLCAKICAgICBzdG9wX2FjY2VwdGluZ19yZXF1ZXN0cygpIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXggdG8gYXBfcnByaW50ZiBjYWxsIHRoYXQgYWxsb3dzIG1vZF9pbmZvIHRvIHdvcmsgcHJvcGVybHkuCiAgICAgW0phbWVzIE1vcnJpcyA8am1vcnJpcyBpbnRlcmNvZGUuY29tLmF1Pl0KCiAgKikgdXNlciBhbmQgYXBfYXV0aF90eXBlIGZpZWxkcyB3ZXJlIG1vdmVkIGZyb20gY29ubmVjdGlvbl9yZWMgdG8gCiAgICAgcmVxdWVzdF9yZWMuIFtSeWFuIEJsb29tXSAKCiAgKikgUmVtb3ZlZCB0aGUgYXBfYmxvY2tfYWxhcm1zIGFuZCBhcF91bmJsb2NrX2FsYXJtIGNhbGxzLiAgVGhlc2UgYXJlbid0CiAgICAgbmVlZGVkIGluIGEgdGhyZWFkZWQgc2VydmVyLgoKICAqKSBJbml0aWFsIHB0aHJlYWQgaW1wbGVtZW50YXRpb24gZnJvbSBmcm9tIERlYW4ncyBhcGFjaGUtbnNwciBjb2RlLgogICAgIFtCaWxsIFN0b2RkYXJkLCBSeWFuIEJsb29tXQoKCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjkKCiAgKikgUmVtb3ZlIGJvZ3VzIGVycm9yIG1lc3NhZ2Ugd2hlbiBhIHJlZGlyZWN0IGRvZXNuJ3Qgc2V0IExvY2F0aW9uLgogICAgIEluc3RlYWQsIHVzZSBhbiBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgY29yZWR1bXAgaWYgdGhlIGVycm9yIG1lc3NhZ2UKICAgICB3YXMgc3VwcG9zZWQgdG8gaW5jbHVkZSBhIGxvY2F0aW9uLiAgW1JveSBGaWVsZGluZ10KCiAgKikgRG9uJ3QgYWxsb3cgY29uZmlndXJlIHRvIGluY2x1ZGUgbW9kX2F1dGhfZGlnZXN0IHVubGVzcyBpdCBpcwogICAgIGV4cGxpY2l0bHkgcmVxdWVzdGVkLCBldmVuIGlmIHRoZSB1c2VyIGFza2VkIGZvciBhbGwgbW9kdWxlcy4KICAgICBbUm95IEZpZWxkaW5nXQoKICAqKSBUcmFuc2xhdGUgbW9kdWxlIG5hbWVzIHRvIGRsbCBuYW1lcyBmb3IgT1MvMiBzbyB0aGF0IHRoZXkgYXJlIG5vIG1vcmUKICAgICB0aGFuIDggY2hhcmFjdGVycyBsb25nIGFuZCBoYXZlIGFuIGV4dGVuc2lvbiBvZiAiZGxsIiBpbnN0ZWFkIG9mICJzbyIuCiAgICAgW0JyaWFuIEhhdmFyZF0KCiAgKikgUHJpbnQgb3V0IHBvaW50ZXIgdG8gUnVsZSBERVZfUkFORE9NIHdoZW4gdHJ1ZXJhbmQgbGliIG5vdCBmb3VuZC4KICAgICBGaXggdGVzdC1jb21waWxlIGNoZWNrIHRvIGNoZWNrIGZvciByYW5kYnl0ZSBpbnN0ZWFkIG9mIHRyYW5kMzIuCiAgICAgVXNlIGFwX2Jhc2U2NGVuY29kZV9iaW5hcnkvZGVjb2RlIGluc3RlYWQgb2YgY29weSBpbiBtb2RfYXV0aF9kaWdlc3QuYwogICAgIGFuZCB0d2VhayB0byBtYWtlIEFtYXlhIGhhcHBpZXIuICBbUm9uYWxkIFRzY2hhbORyXQoKICAqKSBFbnN1cmUgdGhhdCB0aGUgaW5zdGFsbGVkIGV4cGF0IGluY2x1ZGUgZmlsZXMgYXJlIHdvcmxkIHJlYWRhYmxlLAogICAgIGp1c3QgbGlrZSB0aGUgb3RoZXIgaGVhZGVyIGZpbGVzLiAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBGaXhlZCBnZW5lcmF0ZWQgQWRkTW9kdWxlIGFkanVzdG1lbnRzIGluIEFQQUNJJ3MgYGNvbmZpZ3VyZScgc2NyaXB0CiAgICAgaW4gb3JkZXIgdG8gYWxsb3cgKG5ldykgbW9kdWxlcyBsaWtlIG1vZF92aG9zdF9hbGlhcyB0byBiZSBoYW5kbGVkCiAgICAgY29ycmVjdGx5ICh3aGljaCB3YXMgdG91Y2hlZCBieSB0aGUgYWRqdXN0bWVudHMgZm9yIG1vZF9hbGlhcykuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZvciBiaW5hcnkgYnVpbGRzLCBhZGQgLVIgZmxhZyB0byBhcGFjaGVjdGwgdG8gd29yayBhcm91bmQgdGhlIGxhY2sgb2YKICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSAuL2xpYmV4ZWMgZGlyZWN0b3J5IHdoZXJlIHRoZSBsaWJodHRwLmVwIGZpbGUKICAgICBpcyBuZWVkZWQgZm9yIFNIQVJFRF9DT1JFIGFyY2hpdGVjdHVyZXMuICBbUmFuZHkgVGVyYnVzaF0KCiAgKikgV0lOMzI6IENyZWF0ZSB0aGUgQ0dJIHNjcmlwdCBwcm9jZXNzIGFzIERFVEFDSEVELiAgVGhpcyBtYXkgc29sdmUgdGhlCiAgICAgcHJvYmxlbSBvYnNlcnZlZCBieSBzb21lIFdpbjk1Lzk4IHVzZXJzIHdoZXJlIHRoZXkgZ2V0IENHSSBzY3JpcHQKICAgICBvdXRwdXQgc2VudCB0byB0aGUgY29uc29sZS4gIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBGaXggKHJlKW5hbWluZyBpbiB0aGUgdXVlbmNvZGUvZGVjb2RlIHNlY3Rpb24uIFRoZSBhcC9hcF8KICAgICByb3V0aW5lcyBhcmUgbm93IGNhbGxlZCBhcF9iYXNlNjQqIGFuZCBhcmUgJ3BsYWluJyAoaS5lLiwgbm8gCiAgICAgcG9vbCBhY2Nlc3Mgb3IgYW55dGhpbmcgY2xldmVyKS4gSW5zaWRlIHV0aWwuYyB0aGUgcm91dGluZXMgYWN0aW5nCiAgICAgbGlrZSBwc3RyZHVwIGFyZSBjYWxsZWQgYXBfcGJhc2U2NGVuY29kZSgpIGFuZCBhcF9wYmFzZTY0ZGVjb2RlKCkuCiAgICAgVGhlIG9kZGx5IG5hbWVkIGFwX3V1ZW5jb2RlKCksIGFwX3V1ZGVjb2RlKCkgYXJlIGtlcHQgYXJvdW5kIGZvcgogICAgIG5vdyBidXQgZGVwcmVjYXRlZC4gIFtkaXJreF0KCiAgKikgQ2xlYW4gdXAgdGhlIGJhc2U2NCBhbmQgU0hBMSBhZGRpdGlvbnMgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZQogICAgIHJlcHJlc2VudGVkIGluIHRoZSBBcGFjaGVDb3JlLmRlZiwgQXBhY2hlQ29yZU9TMi5kZWYsIGFuZCBodHRwZC5leHAKICAgICBmaWxlcy4gIFtSb3kgRmllbGRpbmddCgogICopIFdJTjMyOiBNaWdyYXRlIHRvIEluc3RhbGxTaGllbGQgNS41IGFuZCBwcm92aWRlIGEgYml0IG1vcmUgZXJyb3IKICAgICBjaGVja2luZy4gIEFsbG93IGNvbXBpbGluZyBvbiBWUyA2LjAuICBbUmFuZHkgVGVyYnVzaF0KCiAgKikgRml4ZWQgYXNzdW1wdGlvbiBvZiBhYnNvbHV0ZSBwYXRocyBpbiBiaW5idWlsZC5zaC4gIFtUb255IEZpbmNoXQoKICAqKSBVc2UgVGVzdENvbXBpbGUgdG8gc2VhcmNoIGZvciB0aGUgdHJ1ZXJhbmQgbGlicmFyeSAocmF0aGVyIHRoYW4gYmxpbmRseQogICAgIGFzc3VtaW5nIGl0cyBleGlzdGVuY2UpLiBJZiBpdCBpcyBub3QgZm91bmQsIGNvbXBsYWluIChidXQgZG8gbm90CiAgICAgZXhpdCAtIHlldCkuICBbTWFydGluIEtyYWVtZXJdCgogICopIFdlIGZvcmdvdCB0byBhZGQgdGhlIG5ldyBleHBvcnRlZCBmdW5jdGlvbiBuYW1lcyB0bwogICAgIHNyYy9zdXBwb3J0L2h0dHBkLmV4cC4gIFtCaWxsIFN0b2RkYXJkLCBSYW5keSBUZXJidXNoXQoKICAqKSBBZGQgZGVzY3JpcHRpb24gb2YgLVQgY29tbWFuZC1saW5lIG9wdGlvbiB0byB1c2FnZSgpLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGb3IgInNvbWUiIHBsYXRmb3JtcyAobm90YWJseSwgRUJDRElDIGJhc2VkIG9uZXMpLCBsaWJvcyBuZWVkcyB0byBiZQogICAgIHNlYXJjaGVkIG9ubHkgQUZURVIgbGliYXAgaGFzIGJlZW4gc2VhcmNoZWQsIGJlY2F1c2UgbGliYXAgbmVlZHMKICAgICBzb21lIHN5bWJvbHMgZnJvbSBsaWJvcy4gIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgRml4IGNvbmZsaWN0IHdpdGggb3JpZ2luYWwgbW9kX2RpZ2VzdCByZWxhdGVkIHRvIHRoZSBzeW1ib2wgb2YgdGhlCiAgICAgbW9kdWxlIGRpc3BhdGNoIGxpc3QgKHdoaWNoIGhhcyB0byBiZSB1bmlxdWUgZm9yIERTTyBhbmQgZm9sbG93IHRoZQogICAgIHVzdWFsIGNvbnZlbnRpb25zIGZvciB0aGUgaW5zdGFsbGF0aW9uIHByb2NlZHVyZSkuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZCBhIGRibS1saWJyYXJ5IGNoZWNrIGZvciB0aGUgInVzdWFsIHBsYWNlcyIgKC1sZGJtLCAtbG5kYm0sIC1sZGIpCiAgICAgZm9yIG90aGVyIHBsYXRmb3JtcyBhcyB3ZWxsLiAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBNYWtlIGFwX3NoYTEuYyBjb21waWxlIGZvciBFQkNESUMgcGxhdGZvcm1zOiByZXBsYWNlIHJlbWFpbmluZyBMT05HCiAgICAgdHlwZXMgYnkgQVBfTE9ORyBhbmQgcmVwbGFjZSByZWZlcmVuY2UgdG8gcmVuYW1lZCB2YXJpYWJsZSAndWJ1ZicKICAgICBieSAnYnVmZmVyJy4gIFtNYXJ0aW4gS3JhZW1lcl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjggW25vdCByZWxlYXNlZF0KCiAgKikgRmx1c2ggdGhlIG91dHB1dCBidWZmZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgc2VuZGluZyBhbiBlcnJvciBvciByZWRpcmVjdAogICAgIHJlc3BvbnNlLCBzaW5jZSB0aGUgcmVzdWx0IG1heSBiZSBuZWVkZWQgYnkgdGhlIGNsaWVudCB0byBhYm9ydCBhCiAgICAgbG9uZyBkYXRhIHRyYW5zZmVyIG9yIHJlc3RhcnQgYSBzZXJpZXMgb2YgcGlwZWxpbmVkIHJlcXVlc3RzLgogICAgIFtUb20gVmF1Z2hhbiA8dHZhdWdoYW4gYXZlbnRhaWwuY29tPiwgUm95IEZpZWxkaW5nXQoKICAqKSBQT1JUOiBJbXByb3ZlZCBjb21waWxhdGlvbiBhbmQgRFNPIHN1cHBvcnQgb24gU2VxdWVudCBEWU5JWC9wdHguCiAgICAgW0lhbiBUdXJuZXIgPGlhbnQgc2VxdWVudC5jb20+XSBQUiM0NzM1CgogICopIExvY2FsIHN0cnVjdCBtbWFwIGluIGh0dHBfY29yZS5jIGNvbmZsaWN0ZWQgd2l0aCBzeXN0ZW0gc3RydWN0dXJlCiAgICAgbmFtZSBvbiBEWU5JWCAtLSBjaGFuZ2VkIHRvIG1tYXBfcmVjLiAgW1JveSBGaWVsZGluZ10gUFIjNDczNQoKICAqKSBBZGRlZCB1cGRhdGVkIG1vZF9kaWdlc3QgYXMgbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX2F1dGhfZGlnZXN0LgogICAgIFtSb25hbGQgVHNjaGFs5HIgPHJvbmFsZCBpbm5vdmF0aW9uLmNoPl0KCiAgKikgRml4IGEgbWVtb3J5IGxlYWsgd2hlcmUgdGhlIG1vZHVsZSBjb3VudHMgd2VyZSBnZXR0aW5nIG1lc3NlZAogICAgIHVwIGFjcm9zcyByZXN0YXJ0cy4gIFtEYXZpZCBIYXJyaXMgPGRoYXJyaXMgZHJoLm5ldD5dCgogICopIENJRFIgYWRkcmVzc2VzIHN1Y2ggYXMgYS5iLmMuZC8yNCB3aGVyZSBkICE9IDAgd2VyZW4ndCBoYW5kbGVkCiAgICAgcHJvcGVybHkgaW4gbW9kX2FjY2Vzcy4KICAgICBbIlBhdWwgSi4gUmVkZXIiIDxyZWRlcnBqIHJhbGVpZ2guaWJtLmNvbT5dIFBSIzQ3NzAKCiAgKikgUmV3cml0ZUxvY2svUmV3cml0ZU1hcCBkaWRuJ3Qgd29yayBwcm9wZXJseSB3aXRoIHZpcnR1YWwgaG9zdHMuCiAgICAgW0RtaXRyeSBLaHJ1c3RhbGV2IDxkaW1hIGJvZy5tc3Uuc3U+XSBQUiMzODc0CgogICopIFBPUlQ6IFN1cHBvcnQgZm9yIGNvbXBhcS90YW5kZW0vY29tLgogICAgIFtNaWNoYWVsIE90dGF0aSA8bWljaGFlbC5vdHRhdGkgY29tcGFxLmNvbT4sIGRpcmt4XQoKICAqKSBBZGRlZCBTSEExIHBhc3N3b3JkIGVuY3J5cHRpb24gc3VwcG9ydCB0byBlYXN5IG1pZ3JhdGlvbiBmcm9tIAogICAgIE5ldHNjYXBlIHNlcnZlcnMuIFNlZSBzdXBwb3J0L1NIQTEgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgQ2F1c2VkIHRoZSBzZXBhcmF0aW9uIG9mIGFwX21kNS5jIGludG8gbWQ1LCBzaGExIGFuZCBhIGdlbmVyYWwKICAgICBhcF9jaGVja3Bhc3MuYyB3aXRoIGp1c3QgYSB2YWxpZGF0ZV9wYXNzd2Qgcm91dGluZS4gQWRkZWQgYQogICAgIGNvdXBsZSBvZiBmbGFncyB0byBzdXBwb3J0L2h0cGFzc3dkLiBTb21lIHJldXNlIG9mIHRoZSB0bzY0KCkKICAgICBmdW5jdGlvbjsgaGVuY2UgcmVuYW1lZCB0byBhcF90bzY0KCkuCiAgICAgW0RpcmstV2lsbGVtIHZhbiBHdWxpaywgQ2xpbnRvbiBXb25nIDxjbGludGR3IG5ldGNvbS5jb20+XQoKICAqKSBDaGFuZ2UgZm9yIEVCQ0RJQyBwbGF0Zm9ybXMgKFRQRiBhbmQgQlMyMDAwKSB0byBjb3JyZWN0bHkgZGVhbAogICAgIHdpdGggQVNDSUkvRUJDRElDIGNvbnZlcnNpb25zIGluICJpZGVudCIgcXVlcnkuCiAgICAgW0RhdmlkIE1jQ3JlZWR5IDxNY0NyZWVkeSB1cy5pYm0uY29tPl0KCiAgKikgR2V0IHJpZCBvZiByZWRlZmluaXRpb24gd2FybmluZyBvbiBNQUNfT1NfWF9TRVJWRVIgcGxhdGZvcm0uCiAgICAgQ2hhbmdlICJQb3dlciBNYWNpbnRvc2giIHRvIFBvd2VyKiBzbyBpZiB1bmFtZSBwcmludHMgIlBvd2VyIEJvb2siCiAgICAgd2UncmUgc3RpbGwgaGFwcHkgb24gUmhhcHNvZHkgcGxhdGZvcm1zLiAgW1dpbGZyZWRvIFNhbmNoZXpdCgogICopIEZpeCBTSUdTRUdWIG9uIHNvbWUgc3lzdGVtcyBiZWNhdXNlIHRoZSBWYXJ5IGZpeCBiZWxvdyBpbmNsdWRlZAogICAgIGEgY2FsbCB0byB0YWJsZV9kbyB3aXRoIGEgdmFyaWFibGUgYXJndW1lbnQgbGlzdCB0aGF0IHdhcyBub3QKICAgICBOVUxMIHRlcm1pbmF0ZWQuICBSZXBsYWNlZCB3aXRoIGJldHRlciBpbXBsZW1lbnRhdGlvbi4gW1JveSBGaWVsZGluZ10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjcgW25vdCByZWxlYXNlZF0KCiAgKikgVGhlICJWYXJ5IiByZXNwb25zZSBoZWFkZXIgZmllbGQgaXMgbm93IHNhbml0aXNlZCByaWdodCBiZWZvcmUKICAgICB0aGUgaGVhZGVyIGlzIHNlbnQgYmFjayB0byB0aGUgY2xpZW50LiAgTXVsdGlwbGUgIlZhcnkiIGZpZWxkcwogICAgIGFyZSBjb21iaW5lZCwgYW5kIGR1cGxpY2F0ZSB0b2tlbnMgKGUuZy4sICJWYXJ5OiBob3N0LCBob3N0IiBvcgogICAgICJWYXJ5OiBob3N0LCBuZWdvdGlhdGUsIGhvc3QsIGFjY2VwdC1sYW5ndWFnZSIpIGFyZSByZWR1Y2VkIHRvCiAgICAgc2luZ2xlIGluc3RhbmNlcy4gIFRoaXMgaXMgYSBiZXR0ZXIgc29sdXRpb24gdGhhbiB0aGUgZm9yY2Utbm8tdmFyeQogICAgIG9uZSAod2hpY2ggaXMgc3RpbGwgdmFsaWQgZm9yIGNsaWVudHMgdGhhdCBjYW4ndCBjb3BlIHdpdGggVmFyeQogICAgIGF0IGFsbCkuICBQUiMzMTE4IFtEZWFuIEdhdWRldCwgUm95IEZpZWxkaW5nLCBLZW4gQ29hcl0KCiAgKikgUG9ydGFiaWxpdHkgY2hhbmdlcyBmb3IgQmVPUy4gW0RhdmlkIFJlaWQgPGFiYjM3IGRpYWwucGlwZXguY29tPl0KCiAgKikgTGluayBEU08ncyB3aXRoICJnY2MgLXNoYXJlZCIgaW5zdGVhZCBvZiAibGQgLUJzaGFyZWFibGUiIGF0IAogICAgIGxlYXN0IG9uIExpbnV4IGFuZCBGcmVlQlNEIGZvciBub3cuICAKICAgICBbUmFzbXVzIExlcmRvcmZdCgogICopIFdpbjMyOiBNb3JlIGFwYWNoZSAtayByZXN0YXJ0IHdvcmsuIFJlc3RhcnRzIGFyZSBub3cgaG9ub3JlZAogICAgIGltbWVkaWF0ZWx5IGFuZCBjb25uZWN0aW9ucyBpbiB0aGUgbGlzdGVuIHF1ZXVlIGFyZSAtbm90LSBsb3N0LgogICAgIFRoaXMgaXMgbWFkZSBwb3NzaWJsZSBieSB0aGUgdXNlIG9mIHRoZSBXU0FEdXBsaWNhdGVTb2NrZXQoKQogICAgIGNhbGwuICBUaGUgbGlzdGVuZXJzIGFyZSBvcGVuZWQgaW4gdGhlIHBhcmVudCwgZHVwbGljYXRlZCwgdGhlbgogICAgIHRoZSBkdXBsaWNhdGVzIGFyZSBwYXNzZWQgdG8gdGhlIGNoaWxkLiBUaGUgb3JpZ2luYWwgbGlzdGVuIHNvY2tldHMgCiAgICAgYXJlIG5vdCBjbG9zZWQgYnkgdGhlIHBhcmVudCBhY3Jvc3MgYSByZXN0YXJ0LCB0aHVzIHRoZSBsaXN0ZW4gcXVldWUgCiAgICAgaXMgcHJlc2VydmVkLgogICAgIFtCaWxsIFN0b2RkYXJkIDxzdG9kZGFyZCByYWxlaWdoLmlibS5jb20+XQoKICAqKSBGaXggaGFuZGxpbmcgb2YgY2FzZSB3aGVuIGEgY2xpZW50IGhhcyBzZW50ICJFeHBlY3Q6IDEwMC1jb250aW51ZSIKICAgICBhbmQgd2UgYXJlIGdvaW5nIHRvIHJlc3BvbmQgd2l0aCBhbiBlcnJvciwgYnV0IGdldCBzdHVjayB3YWl0aW5nIHRvCiAgICAgZGlzY2FyZCB0aGUgYm9keSBpbiB0aGUgcG9pbnRsZXNzIGhvcGUgb2YgcHJlc2VydmluZyB0aGUgY29ubmVjdGlvbi4KICAgICBbUm95IEZpZWxkaW5nLCBKb2UgT3J0b24gPGplbzEwMSB5b3JrLmFjLnVrPl0gUFIjNDQ5OSwgUFIjMzgwNgoKICAqKSBGaXggJ2NvbmZpZ3VyZScgdG8gd29yayBjb3JyZWN0bHkgd2l0aCBTeXNWLWJhc2VkIHZlcnNpb25zIG9mCiAgICAgJ3RyJyAoY29uc2lzdGVudCB3aXRoIENvbmZpZ3VyZSdzIHVzZSBhcyB3ZWxsKS4gW0ppbSBKYWdpZWxza2ldCgogICopIGFweHM6IEFkZCAiLVMgdmFyPXZhbCIgb3B0aW9uIHdoaWNoIGFsbG93cyBmb3Igb3ZlcnJpZGUgb2YgQ0ZHXyoKICAgICBidWlsdC1pbiB2YWx1ZXMuIEFkZCAiLWUiIG9wdGlvbiB3aGljaCB3b3JrcyBsaWtlIC1pIGJ1dCBkb2Vzbid0CiAgICAgaW5zdGFsbCB0aGUgRFNPOyB1c2VmdWwgZm9yIGVkaXRpbmcgaHR0cGQuY29uZiB3aXRoIGFweHMuIEZpeAogICAgIGVkaXRpbmcgY29kZSBzbyB0aGF0IG11bHRpcGxlIGludm9jYXRpb25zIG9mIGFweHMgLWEgd2lsbCBub3QKICAgICBjcmVhdGUgZHVwbGljYXRlIExvYWRNb2R1bGUvQWRkTW9kdWxlIGVudHJpZXM7IGFweHMgY2FuIG5vdyBiZQogICAgIHVzZWQgdG8gcmUtIGVuYWJsZS9kaXNhYmxlIGEgbW9kdWxlLiAgW1dpbGZyZWRvIFNhbmNoZXpdCgogICopIFdpbjMyOiBVcGRhdGUgdGhlIHNlcnZlciB0byB1c2UgV2luc29jayAyLiBTcGVjaWZpY2FsbHksIGxpbmsgd2l0aAogICAgIHdzMl8zMi5saWIgcmF0aGVyIHRoYW4gd3NvY2szMi5saWIuICBUaGlzIGdpdmVzIHVzIGFjY2VzcyB0byAKICAgICBXU0FEdXBsY2F0ZVNvY2tldCgpIGluIGFkZGl0aW9uIHRvIHNvbWUgb3RoZXIgZW5oYW5jZWQgY29tbSBBUElzLgogICAgIFdpbiA5NSB1c2VycyBtYXkgbmVlZCB0byB1cGRhdGUgdGhlaXIgVENQL0lQIHN0YWNrIHRvIHBpY2sgdXAKICAgICBXaW5zb2NrIDIuIChTZWUgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3dpbmRvd3M5NS9kb3dubG9hZHMvKQogICAgIFtCaWxsIFN0b2RkYXJkIDxzdG9kZGFyZCByYWxlaWdoLmlibS5jb20+XQoKICAqKSBXaW4zMjogUmVkaXJlY3QgQ0dJIHNjcmlwdCBzdGRlcnIgKHNjcmlwdCBkZWJ1ZyBpbmZvKSBpbnRvIHRoZSAKICAgICBlcnJvci5sb2cgd2hlbiBDR0kgc2NyaXB0cyBmYWlsLiBUaGlzIG1ha2VzIEFwYWNoZSBvbiBXaW4zMiAKICAgICBiZWhhdmUgbW9yZSBsaWtlIFVuaXguICAgICAgCiAgICAgW0JpbGwgU3RvZGRhcmQgPHN0b2RkYXJkIHJhbGVpZ2guaWJtLmNvbT5dCgogICopIEZpeGVkIGBodHRwZCcgdXNhZ2UgZGlzcGxheTogLUQgd2FzIG1pc3NpbmcuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzQ2MTQKCiAgKikgRml4IGBtYWtlIHInIHRlc3QgcHJvY2VkdXJlIGluIHNyYy9yZWdleC86IGFwX2lzcHJpbnQgd2FzIG5vdCBmb3VuZC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjNDU2MSwgUFIjNDU2MgoKICAqKSBPUy8yOiBGaXggcHJvYmxlbSB3aXRoIGFjY2VwdCBsb2NrIHNlbWFwaG9yZXMgd2hlcmUgc2VydmVyIHdvdWxkIGRpZSB3aXRoCiAgICAgIk9TMlNFTTogRXJyb3IgMTA1IGdldHRpbmcgYWNjZXB0IGxvY2suIEV4aXRpbmchIiAKICAgICBbQnJpYW4gSGF2YXJkXSBQUiM0NTA1CgogICopIEFkZCBEU08gc3VwcG9ydCBmb3IgREdVWCA0LnggdXNpbmcgZ2NjLiBUZXN0ZWQgb24geDg2IHBsYXRmb3Jtcy4KICAgICBbUmFuZHkgVGVyYnVzaCA8cmFuZHkgY292YWxlbnQubmV0Pl0KIAogICopIEFkZCB0aGUgbmV3IG1hc3Mtdmhvc3QgbW9kdWxlIChtb2Rfdmhvc3RfYWxpYXMuYykgZGV2ZWxvcGVkIGFuZAogICAgIHVzZWQgYnkgRGVtb24gSW50ZXJuZXQsIEx0ZC4gW1RvbnkgRmluY2ggPGZhbmYgZGVtb24ubmV0Pl0KCiAgKikgQmV0dGVyIEdDQyBkZXRlY3Rpb24gZm9yIERTTyBmbGFncyB1bmRlciBTb2xhcmlzIDIgd2hlcmUgdGhlIGBjYycgCiAgICAgY29tbWFuZCBwb3RlbnRpYWxseSBfaXNfIEdDQy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCBhcHhzIGJ1aWxkIGlzc3VlcyBvbiBBSVggCiAgICAgW1Jhc211cyBMZXJkb3JmIDxyYXNtdXMgcmFsZWlnaC5pYm0uY29tPl0KCiAgKikgRG9jdW1lbnRSb290IENoZWNraW5nOiBVbmRlciBwcmV2aW91cyB2ZXJzaW9ucywgd2hlbiBBcGFjaGUKICAgICBmaXJzdCBzdGFydGVkIHVwLCBpdCB1c2VkIHRvIGRvIGEgc3RhdCBvZiBlYWNoIERvY3VtZW50Um9vdCB0bwogICAgIHNlZSBpZiBpdCBleGlzdGVkIGFuZCB3YXMgYSBkaXJlY3RvcnkuIElmIG5vdCwgdGhlbiBhbiBlcnJvcgogICAgIG1lc3NhZ2Ugd2FzIHByaW50ZWQuIFRISVMgSEFTIEJFRU4gRElTQUJMRUQuIElmIERvY3VtZW50Um9vdAogICAgIGRvZXMgbm90IGV4aXN0LCB5b3Ugd2lsbCBnZXQgZXJyb3IgbWVzc2FnZXMgaW4gZXJyb3JfbG9nLiBJZgogICAgIHRoZSAnLXQnIGNvbW1hbmQgbGluZSBvcHRpb24gaXMgdXNlZCAodG8gY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24pCiAgICAgdGhlIGNoZWNrIG9mIERvY3VtZW50Um9vdCBJUyBwZXJmb3JtZWQuIEFuIGFkZGl0aW9uYWwgY29tbWFuZAogICAgIGxpbmUgb3B0aW9uLCAnLVQnLCBoYXMgYmVlbiBhZGRlZCBpZiB5b3Ugd2FudCB0byBhdm9pZCB0aGUKICAgICBEb2N1bWVudFJvb3QgY2hlY2sgZXZlbiB3aGVuIGNoZWNraW5nIHRoZSBjb25maWd1cmF0aW9uLgogICAgIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBXaW4zMjogVGhlIHF1ZXJ5IHN3aXRjaCAiYXBhY2hlIC1TIiBkaWRuJ3QgZXhpdCBhZnRlciBzaG93aW5nIHRoZQogICAgIHZob3N0IHNldHRpbmdzLiBUaGF0IHdhcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgb3RoZXIgcXVlcnkgZnVuY3Rpb25zLgogICAgIFtCaWxsIFN0b2RkYXJkIC0gRml4ZWQgYnkgTWFydGluIG9uIFVuaXggaW4gMS4zLjRdCgogICopIFdpbjMyOiBDaGFuZ2VkIGJlaGF2aW91ciBvZiBhcGFjaGUgLWsgcmVzdGFydC4gCiAgICAgUHJldmlvdXNseSwgdGhlIHNlcnZlciB3b3VsZCBkcmFpbiBhbGwgY29ubmVjdGlvbnMgaW4gdGhlIHN0YWNrJ3MKICAgICBsaXN0ZW4gcXVldWUgYmVmb3JlIGhvbm9yaW5nIHRoZSByZXN0YXJ0LiBPbiBhIGJ1c3kgc2VydmVyLCB0aGlzCiAgICAgY291bGQgdGFrZSBob3Vycy4gIE5vdywgYSByZXN0YXJ0IGlzIGhvbm9yZWQgYWxtb3N0IGltbWVkaWF0ZWx5LiAKICAgICBBbGwgY29ubmVjdGlvbnMgaW4gQXBhY2hlJ3MgcXVldWVzIGFyZSBoYW5kbGVkIGJ1dCBjb25uZWN0aW9ucyBpbiAKICAgICB0aGUgc3RhY2sncyBsaXN0ZW4gcXVldWUgYXJlIGRpc2NhcmRlZC4gUmVzdGFydCB0cmlnZ2VyZWQgYnkgCiAgICAgTWF4UmVxdWVzdFBlckNoaWxkIGlzIHVuY2hhbmdlZC4KICAgICBbQmlsbCBTdG9kZGFyZCA8c3RvZGRhcmQgcmFsZWlnaC5pYm0uY29tPl0KCiAgKikgV2luMzI6IEVsaW1pbmF0ZWQgdW5uZWNlc3NhcnkgY2FsbCB0byB3YWl0X2Zvcl9tdWx0aXBsZV9vYmplY3RzIGluCiAgICAgdGhlIGFjY2VwdCBsb29wLiBHb29kIGZvciBhIDUlIHBlcmZvcm1hbmNlIGJvb3N0LiBDbGVhbmVkIHVwIAogICAgIHBhcmVudC9jaGlsZCBwcm9jZXNzIG1hbmFnZW1lbnQgY29kZS4gCiAgICAgW0JpbGwgU3RvZGRhcmQgPHN0b2RkYXJkIHJhbGVpZ2guaWJtLmNvbT5dCgogICopIEFkZGVkIGNlaWxpbmcgb24gZmlsZSBzaXplIGZvciBtZW1vcnkgbWFwcGVkIGZpbGVzLgogICAgIFtKb2huIEdpYW5uYW5kcmVhIDxqZyBtZWVyLm5ldD5dIFBSIzQxMjIKCiAgKikgRml4IG5kYm0uaCBpbmNsdWRlIHByb2JsZW1zIHdpdGggYnJhaW4tZGVhZCBnbGliYyA+PSAyLjEgd2hpY2ggCiAgICAgaGFzIG5kYm0uaCBpbiBhIG5vbi1zdGFuZGFyZCBkYjEvIHN1YmRpci4gUFIjNDQzMSwgUFIjNDUyOAogICAgIFtIZW5yaSBHb21leiA8Z29tZXogc2xpYi5mcj4sIFJhbGYgUy4gRW5nZWxzY2hhbGxdIAoKICAqKSBEZXRlcm1pbmUgQVBfQllURV9PUkRFUiBmb3IgYXBfY29uZmlnX2F1dG8uaCBhbmQgYWxyZWFkeQogICAgIHVzZSB0aGlzIGF0IGxlYXN0IGZvciBFeHBhdC4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFsbG93IC5tb2R1bGUgZmlsZXMgdG8gc3BlY2lmeSBsaWJyYXJpZXMgd2l0aCBMaWI6LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBbGxvdyBTZXRFbnZJZltOb0Nhc2VdIHRvIHRlc3QgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHdlbGwKICAgICBhcyBoZWFkZXIgZmllbGRzIGFuZCByZXF1ZXN0IGF0dHJpYnV0ZXMuICBbS2VuIENvYXJdCgogICopIEZpeCBtb2RfYXV0b2luZGV4J3MgaGFuZGxpbmcgb2YgU2NhbkhUTUxUaXRsZXMgd2hlbiBmaWxlCiAgICAgY29udGVudC10eXBlcyBhcmUgInRleHQvaHRtbDtwYXJhbWV0ZXJzIi4gIFBSIzQ1MjQgIFtLZW4gQ29hcl0KCiAgKikgUmVtb3ZlICJteGIiIHN1cHBvcnQgZnJvbSBtb2RfbmVnb3RpYXRpb24gLS0gaXQgd2FzIGEgZHJhZnQgZmVhdHVyZQogICAgIG5ldmVyIGFjY2VwdGVkIGludG8gYW55IHN0YW5kYXJkLCBhbmQgaXQgb3BlbnMgdXAgY2VydGFpbiBEb1MKICAgICBhdHRhY2tzLiAgW0tvZW4gSG9sdG1hbiA8S29lbi5Ib2x0bWFuIGNlcm4uY2g+XQoKICAqKSBUZXN0Q29tcGlsZSB1cGRhdGVkLiBXZSBjYW4gbm93IHJ1biBwcm9ncmFtcyBhbmQgb3V0cHV0IHRoZQogICAgIHJlc3VsdHMgZHVyaW5nIHRoZSBDb25maWd1cmUgcHJvY2Vzcy4gWyBKaW0gSmFnaWVsc2tpXQoKICAqKSBUaGUgc291cmNlIGlzIG5vdyBxdWFkIChsb25nIGxvbmcpIGF3YXJlIGFzIG5lZWRlZC4gU3BlY2lmaWNhbGx5LAogICAgIHRoZSBDb25maWd1cmUgcHJvY2VzcyBkZXRlcm1pbmVzIHRoZSBjb3JyZWN0IHNpemUgb2Ygb2ZmX3QgYW5kCiAgICAgKnZvaWQuIFdoZW4gdGhlIE9TL3BsYXRmb3JtL2NvbXBpbGVyIHN1cHBvcnRzIHF1YWRzLCBhcF9zbnByaW50ZigpCiAgICAgcHJvdmlkZXMgZm9yIHRoZSAncScgZm9ybWF0IHF1YWxpZmllciAoaWYgcXVhZHMgYXJlIG5vdCBhdmFpbGFibGUsCiAgICAgJ3EnIGlzIHNpbGVudGx5ICJkZW1vdGVkIiB0byBsb25nKS4gW0ppbSBKYWdpZWxza2ldCgogICopIFdoZW4gdGhlIHVzZXJuYW1lIG9yIHBhc3N3b3JkIGZlZCB0byBodHBhc3N3ZCBpcyB0b28gbG9uZywgaW5jbHVkZSB0aGUKICAgICBzaXplIGxpbWl0IGluIHRoZSBlcnJvciBtZXNzYWdlLiAgQWxzbyByZXBvcnQgaWxsZWdhbCBjaGFyYWN0ZXJzCiAgICAgKGN1cnJlbnRseSBvbmx5ICc6JykgaW4gdGhlIHVzZXJuYW1lLiAgQWRkIHRoZSBzaXplIHJlc3RyaWN0aW9ucwogICAgIHRvIHRoZSBtYW4gcGFnZS4gIFtLZW4gQ29hcl0KCiAgKikgRml4ZWQgdGhlIGNvbmZpZ3VyZSAtLXdpdGhvdXQtc3VwcG9ydCBvcHRpb24gc28gaXQgZG9lc24ndCByZXN1bHQgaW4KICAgICBhbiBpbmZpbml0ZSBsb29wLiAgW01hcmMgU2xlbWtvXQoKICAqKSBQaXBlZCBlcnJvciBsb2dzIGNvdWxkIGNhdXNlIGEgc2VnZmF1bHQgaWYgYW4gZXJyb3Igb2NjdXJlZAogICAgIGR1cmluZyBjb25maWd1cmF0aW9uIGFmdGVyIGEgcmVzdGFydC4KICAgICBbQWlkYW4gQ3VsbHkgPGFpZGFuIHBhbml4LmNvbT5dIFBSIzQ0NTYKCiAgKikgSWYgYSAiTG9jYXRpb24iIGZpZWxkIHdhcyBzdG9yZWQgaW4gci0+ZXJyX2hlYWRlcnNfb3V0IHJhdGhlcgogICAgIHRoYW4gci0+aGVhZGVyc19vdXQsIHJlZGlyZWN0IHByb2Nlc3Npbmcgd291bGRuJ3QgZmluZCBpdCBhbmQKICAgICB0aGUgc2VydmVyIHdvdWxkIGNvcmUgZHVtcCBvbiBhcF9lc2NhcGVfaHRtbChOVUxMKS4gIENoZWNrIGJvdGgKICAgICB0YWJsZXMgYW5kIHJhaXNlIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SIHdpdGggYSBsb2cgbWVzc2FnZQogICAgIGlmIExvY2F0aW9uIGlzbid0IHNldC4gIFtEb3VnIE1hY0VhY2hlcm4sIEtlbiBDb2FyXQoKICAqKSBBZGQgUlVMRV9FWFBBVCwgdGhlIHNyYy9saWIvIGRpcmVjdG9yeSBzdHJ1Y3R1cmUsIGFuZCBhIG1vZGlmaWVkIGNvcHkKICAgICBvZiB0aGUgRXhwYXQgMS4wLjIgZGlzdHJpYnV0aW9uLiBbR3JlZyBTdGVpbl0KCiAgKikgUmVwbGFjZSByZWdleGVjKCkgY2FsbHMgd2l0aCBjYWxscyB0byBhIG5ldyBBUEkgc3R1YiBmdW5jdGlvbgogICAgIGFwX3JlZ2V4ZWMoKS4gIFRoaXMgc29sdmVzIHByb2JsZW1zIHdpdGggRFNPIG1vZHVsZXMgd2hpY2ggdXNlIHRoZSByZWdleAogICAgIGxpYnJhcnkuIFtKZW5zLVV3ZSBNYWdlciA8anVtIGhlbGlvcy5kZT4sIFJhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZCAnUmVxdWVzdF9Qcm90b2NvbCcgc3BlY2lhbCBrZXl3b3JkIHRvIG1vZF9zZXRlbnZpZiBzbyB0aGF0CiAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNhbiBiZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSBwcm90b2NvbCB2ZXJzaW9uCiAgICAgKGUuZy4sIEhUVFAvMC45IG9yIEhUVFAvMS4xKSBvZiB0aGUgcmVxdWVzdC4gIFtLZW4gQ29hcl0KCiAgKikgQWRkIERTTyBzdXBwb3J0IGZvciBPcGVuU3RlcCAoTWFjaCA0LjIpIHBsYXRmb3JtLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBSZXggRGlldGVyIDxyZGlldGVyIG1hdGgudW5sLmVkdT5dIFBSIzM5OTcKCiAgKikgRml4IHNlZCByZWdleCBmb3IgZ2VuZXJhdGluZyBhcF9jb25maWdfYXV0by5oIGluIHNyYy9Db25maWd1cmUuCiAgICAgW0phbiBHYWxsbyA8Z2FsbG8gcHZ0LnNrPl0gUFIjMzY5MCwgUFIjNDM3MwogCiAgKikgU3dpdGNoIHRvIC9iaW4vc2g1IGluIEFQQUNJIG9uIFVsdHJpeCBhbmQgZnJpZW5kcyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoCiAgICAgdGhlaXIgYnJhaW4tZGVhZCAvYmluL3NoLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjNDM3MgoKICAqKSBCZXR0ZXIgRFNPIGZsYWdzIHJlY29nbml0aW9uIG9uIE5ldEJTRCBwbGF0Zm9ybXMgdXNpbmcgRUxGLgogICAgIFtUb2RkIFZpZXJsaW5nIDx0diBwb2JveC5jb20+XSBQUiM0MzEwCgogICopIEFsd2F5cyBsb2cgbW9udGhzIGluIGVuZ2xpc2ggZm9ybWF0IGZvciAldCBpbiBtb2RfbG9nX2NvbmZpZy4KICAgICBbUGV0ciBMYW1wYSA8bGFtcGEgZmVlLnZ1dGJyLmN6Pl0gUFIjNDM2NiwgNjc5CgogICopIFN1cHBvcnQgZm9yIHNlcnZlci1wYXJzZWQgYW5kIG11bHRpdmlldy1kZXRlcm1pbmVkIFJlYWRtZU5hbWUgYW5kCiAgICAgSGVhZGVyTmFtZSBmaWxlcyBpbiBtb2RfYXV0b2luZGV4LiBSZW1vdmVkIHRoZSByZXN0cmljdGlvbiBvbgogICAgICIvInMgaW4gUmVhZG1lTmFtZSBhbmQgSGVhZGVyTmFtZSBkaXJlY3RpdmVzIHNpbmNlIHRoZSAqc3ViX3JlcSoKICAgICByb3V0aW5lcyB3aWxsIGRlYWwgd2l0aCB0aGUgYWNjZXNzIGlzc3Vlcy4gKEl0J3Mgbm93IHBvc3NpYmxlIHRvCiAgICAgaGF2ZSB7c2l0ZXxncm91cHxwcm9qZWN0fGN1c3RvbWVyfC4uLn0gd2lkZSByZWFkbWVzIGFuZCBoZWFkZXJzLikKICAgICBbUmF5bW9uZCBTIEJyYW5kIDxyc2J4IHJzYngubmV0PiwgS2VuIENvYXJdIFBSIzE1NzQsIDMwMjYsIDM1MjksCiAgICAgMzU2OSwgNDI1NgoKICAqKSBXaGVuIHN0YXQoKSBmYWlscywgZG9uJ3QgYXNzdW1lIGFueXRoaW5nIGFib3V0IHRoZSBjb250ZW50cyBvZgogICAgIHRoZSBzdHJ1Y3Qgc3RhdC4gIFtFZCBLb3J0aG9mIDxlZCBiaXRtZWNoYW5pYy5jb20+XQoKICAqKSBJdCdzIE9LIGZvciBhIHNlbW9wIHRvIHJldHVybiBFSU5UUiwganVzdCBsb29wIGFyb3VuZCBhbmQgdHJ5CiAgICAgYWdhaW4uICBbRGVhbiBHYXVkZXRdCgogICopIEZpeCBjb25maWd1cmF0aW9uIGVuZ2luZSByZS1lbnRyYW50IGhhbmd1cHMsIHdoaWNoIHNvbHZlIGEKICAgICBoYW5kZnVsIG9mIHByb2JsZW1zIHNlZW4gd2l0aCBtb2RfcGVybCA8UGVybD4gY29uZmlndXJhdGlvbiBzZWN0aW9ucwogICAgIFtTYWx2YWRvciBPcnRpeiBHYXJjaWEgPHNvZyBtc2cuY29tLm14Pl0KCiAgKikgTWFjIE9TIGFuZCBNYWMgT1MgWCBTZXJ2ZXIgbm93IHVzZSB0aGUgYXBwcm9wcmlhdGUgY3VzdG9tIGxheW91dAogICAgIGJ5IGRlZmF1bHQgd2hlbiBidWlsZGluZyB3aXRoIEFQQUNJOyBhbGxvdyBmb3IgcGxhdGZvcm0tc3BlY2lmaWMKICAgICB2YXJpYWJsZSBkZWZhdWx0cyBpbiBjb25maWd1cmUuIFtXaWxmcmVkbyBTYW5jaGV6XQoKICAqKSBEbyBzZXRnaWQoKSBiZWZvcmUgaW5pdGdyb3VwcygpIGluIGh0dHBfbWFpbjsgc29tZSBwbGF0Zm9ybXMKICAgICB6YXAgdGhlIGdyb3VwbGlzdCB3aGVuIHNldGdpZCgpIGlzIGNhbGxlZC4gIFRoaXMgd2FzIGZpeGVkIGluCiAgICAgc3VleGVjIGVhcmxpZXIsIGJ1dCB0aGUgbWFpbiBodHRwZCBjb2RlIG1pc3NlZCB0aGUgY2hhbmdlLgogICAgIFtSb2IgU2FjY29jY2lvIDxyb2JzIEluZmluaXRlVGVjaG5vbG9neS5jb20+XSAgUFIjMjU3OQoKICAqKSBBZGQgcmVjb2duaXRpb24gb2YgLnRneiBhcyBhIGd6aXBwZWQgdGFyY2hpdmUuCiAgICAgW0JlcnRyYW5kIGRlIFNpbmdseSA8YmVydHJhbmQuZGUtc2luZ2x5IHBvbHl0ZWNobmlxdWUuZnI+XSAgUFIjMjM2NAoKICAqKSBtb2RfaW5jbHVkZSdzIGZzaXplL2ZsYXN0bW9kIHNob3VsZCBhbGxvdyBvbmx5IHJlbGF0aXZlIHBhdGhzLCBqdXN0CiAgICAgbGlrZSAiaW5jbHVkZSBmaWxlIi4gIFtKYXJvc2xhdiBCZW5rb3Zza3kgPGJlbmtvdnNrIHBoYS5wdnQuY3o+XQoKICAqKSBPUy8yOiBBZGQgc3VwcG9ydCBmb3IgYnVpbGRpbmcgbG9hZGFibGUgbW9kdWxlcyB1c2luZyBETExzLgogICAgIFtCcmlhbiBIYXZhcmRdCgogICopIEFkZCBpY29uc2RpciwgaHRkb2NzZGlyLCBhbmQgY2dpZGlyIHRvIGNvbmZpZy5sYXlvdXQuCiAgICAgW1dpbGZyZWRvIFNhbmNoZXpdCgogICopIEZpeCBtaW5vciBidXQgYW5ub3lpbmcgYnVnIHdpdGggdGhlIHRlc3QgZm9yIENvbmZpZ3VyYXRpb24udG1wbAogICAgIGJlaW5nIG5ld2VyIHRoYW4gQ29uZmlndXJhdGlvbiBzbyB0aGF0IGl0IGlzIGxlc3MgbGlrZWx5IHRvIGZhaWwKICAgICB3aGVuIHVzaW5nIEFQQUNJIGFuZCBzaGFkb3cgc291cmNlcy4gW1dpbGZyZWRvIFNhbmNoZXpdCgogICopIFBPUlQ6IEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIE1hYyBPUyAodmVyc2lvbnMgMTAuMCBhbmQKICAgICBncmVhdGVyKS4gVXNlIE1hYyBPUyBYIFNlcnZlciBsYXlvdXQgZm9yIG5vdy4gQ2xlYW4gdXAgZHlsZCBjb2RlCiAgICAgaW4gdW5peC9vcy5jLCBhbmQgZG9uJ3QgaW5zdGFsbCB0aGUgZHlsZCBlcnJvciBoYW5kbGVycywgd2hpY2gKICAgICBhcmUgbm8gbG9uZ2VyIG5lZWRlZCBpbiBNYWMgT1MuIFtXaWxmcmVkbyBTYW5jaGV6XQoKICAqKSBSZW5hbWUgUmhhcHNvZHkgbGF5b3V0IHRvICJNYWMgT1MgWCBTZXJ2ZXIiLiBDaGFuZ2UgaW5zdGFsbAogICAgIGxvY2F0aW9ucyB0byBhcHByb3ByaWF0ZSBvbmVzIGZvciB1c2VyLWJ1aWx0IChhcyBvcHBvc2VkIHRvCiAgICAgc3lzdGVtKSBpbnN0YWxscy4gW1dpbGZyZWRvIFNhbmNoZXpdCgogICopIE1vZGlmeSBtb2RfYXV0b2luZGV4J3MgaGFuZGxpbmcgb2YgQWRkRGVzY3JpcHRpb24gc28gdGhhdCB0aGUKICAgICBiZWhhdmlvdXIgbWF0Y2hlcyB0aGUgZG9jdW1lbnRhdGlvbi4gIFtLZW4gQ29hcl0gUFIjMTg5OCwgMzA3Mi4KCiAgKikgQWRkIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIGluc3RhbGwtYmluZGlzdC5zaCBzY3JpcHQgY3JlYXRlZCBieQogICAgIGJpbmJ1aWxkLnNoIHRvIHVzZSB0YXIgd2hlbiBjb3B5aW5nIGRpc3RyaWJ1dGlvbiBmaWxlcyB0byB0aGUKICAgICBzZXJ2ZXJyb290LiBUaGlzIGFsbG93cyB1cGdyYWRpbmcgYW4gZXhpc3RpbmcgaW5zdGFsbGF0aW9uCiAgICAgd2l0aG91dCBuZXN0aW5nIHRoZSBuZXcgZGlzdHJpYnV0aW9uIGluIHRoZSBvbGQuCgogICAgIGluc3RhbGwtYmluZGlzdC5zaCBub3cgZGV0ZWN0cyB0aGUgbG9jYWwgcGVybDUgcGF0aCB0byBpbnN0YWxsCiAgICAgYXB4cyBhbmQgZGJtbWFuYWdlIHdpdGggcHJvcGVyIHBhdGggdG8gcGVybCBpbnRlcnByZXRlci4KCiAgICAgQWRkIGFuIGluc3RhbGwtYmluc3VwcG9ydCB0YXJnZXQgd2hpY2ggY29waWVzIHRoZSBzb3VyY2UgZmlsZXMKICAgICBmb3IgYXB4cyBhbmQgZGJtbWFuYWdlIHRvIGJpbmRpc3QgdG8gYWxsb3cgdGhlc2Ugc2NyaXB0cyB0bwogICAgIGJlIHByb3Blcmx5IGluc3RhbGxlZCByZWxhdGl2ZSB0byB0aGUgZGVzdGluYXRpb24gc2VydmVycm9vdC4KICAgICBbUmFuZHkgVGVyYnVzaCwgQ292YWxlbnQgVGVjaG5vbG9naWVzLCA8cmFuZHkgY292YWxlbnQubmV0Pl0KCiAgKikgRml4IGludGVybWl0dGVudCBTRUdWIGluIGFwX3Byb3h5X2NhY2hlX2Vycm9yKCkgaW4KICAgICBzcmMvbW9kdWxlcy9wcm94eV91dGlsLmMgd2hlcmUgYSBOVUxMIGZpbGVwb2ludGVyIGFuZAogICAgIHRlbXBvcmFyeSBmaWxlbmFtZSB3ZXJlIGNsb3NlZCBhbmQgdW5saW5rZWQuCiAgICAgW0dyYWhhbSBMZWdnZXR0IDxtaW5mcmluIHNoYXJwLmZtPiwKICAgICBUaW0gQ29zdGVsbG8gPHRqY29zdGVsIHNvY3MudXRzLmVkdS5hdT5dIFBSIzMxNzgKCiAgKikgRml4IGluY29uc2lzdGVudCBlcnJvciBtZXNzYWdlcyByZXBvcnRlZCBieSBtb2RfcHJveHkuCiAgICAgW0dyYWhhbSBMZWdnZXR0IDxtaW5mcmluIHNoYXJwLmZtPl0KCiAgKikgT1MvMjogRml4IHRlcm1pbmF0aW5nIENHSXMgdGhhdCBhcmVuJ3QgY29tcGlsZWQgYnkgRU1YIEdDQyB3aGVuIGEgCiAgICAgY29ubmVjdGlvbiBpcyBhYm9ydGVkLiAgW0JyaWFuIEhhdmFyZF0KCiAgKikgRm9yY2UgdGhlIExBTkcgZW52YXJpYWJsZSB0byB0aGUga25vd24gc3RhdGUgb2YgIkMiIHNvIHRoYXQgd2UKICAgICBoYXZlIGFzc3VyYW5jZSBhYm91dCBob3cgc3RyaW5nIG1hbmlwdWxhdG9ycyAoZS5nLiwgdHIpIHdpbGwKICAgICBmdW5jdGlvbi4gIFtLZW4gQ29hcl0gIFBSIzE2MzAKCiAgKikgQWRkIGEgZGlyZWN0aXZlIHRvIGFsbG93IGN1c3RvbWlzaW5nIG9mIHRoZSB0cmFja2luZyBjb29raWUgbmFtZS4KICAgICBbS2VuIENvYXJdICBQUiMyOTIxLCA0MzAzCgogICopIEFkZCAiZm9yY2Utbm8tdmFyeSIgZW52YXJpYWJsZSB0byBhbGxvdyBzZXJ2ZXJzIHRvIHdvcmsgYXJvdW5kCiAgICAgY2xpZW50cyB0aGF0IGNob2tlIG9uICJWYXJ5IiBmaWVsZHMgaW4gdGhlIHJlc3BvbnNlIGhlYWRlci4KICAgICBbS2VuIENvYXIsIERtaXRyeSBLaHJ1c3RhbGV2IDxkaW1hIHppcHB5Lm1hY2hhb24ucnU+XSAgUFIjNDExOAoKICAqKSBGaXhlZCBhIGJ1ZyBpbiBtb2RfZGlyIHRoYXQgY2F1c2VzIGEgY2hpbGQgcHJvY2VzcyB3aWxsIGluZmluaXRlbHkKICAgICByZWN1cnNlIHdoZW4gaXQgYXR0ZW1wcyB0byBoYW5kbGUgYSByZXF1ZXN0IGZvciBhIGRpcmVjdG9yeSB3bmQgdGhlCiAgICAgdmFsdWUgb2YgdGhlIERpcmVjdG9yeUluZGV4IGRpcmVjdGl2ZSBpcyBhIHNpbmdsZSBkb3QuIEFsc28gbGlrZWx5CiAgICAgdG8gaGFwcGVuIGZvciBhbnlvdGhlciB2YWx1ZXMgb2YgRGlyZWN0b3J5SW5kZXggdGhhdCB3aWxsIG1hcCBiYWNrCiAgICAgdG8gdGhlIHNhbWUgZGlyZWN0b3J5LiBUaGUgaGFuZGxlciBub3cgb25seSBjb25zaWRlcnMgcmVndWxhciBmaWxlcwogICAgIGFzIGJlaW5nIGluZGV4IGNhbmRpZGF0ZXMuIE5vIFBSI3MgZm91bmQuCiAgICAgW1JheW1vbmQgUyBCcmFuZCA8cnNieCByc2J4Lm5ldD5dCgogICopIEVhc2UgY29uZmlndXJhdGlvbiBkZWJ1Z2dpbmcgYnkgbWFraW5nIFRlc3RDb21waWxlIGZhbGwgYmFjayB0bwogICAgIHVzaW5nICJtYWtlIiBpZiB0aGUgJE1BS0UgdmFyaWFibGUgaXMgdW5zZXQgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBGaXhlZCB0aGUgU2VydmVyU2lnbmF0dXJlIGRpcmVjdGl2ZSB0byB3b3JrIGFzIGRvY3VtZW50ZWQuCiAgICAgW1JheW1vbmQgUyBCcmFuZCA8cnNieCByc2J4Lm5ldD5dIFBSIzQyNDgKCiAgKikgQWRkICJvcHQiIChTeXNWLXN0eWxlKSBsYXlvdXQgdG8gY29uZmlnLmxheW91dC4gW1JheW1vbmQgUyBCcmFuZAogICAgIDxyc2J4IHJzYngubmV0Pl0KCiAgKikgQWRkIEFQQUNJIC0td2l0aG91dC1leGVjc3RyaXAgb3B0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgdGhlCiAgICAgc3RyaXBwaW5nIG9mIGV4ZWN1dGFibGVzIG9uIGluc3RhbGxhdGlvbi4gIFRoaXMgaXMgdmVyeSBpbXBvcnRhbnQgZm9yIERTTwogICAgIGFuZCBkZWJ1Z2dpbmcgc2l0dWF0aW9ucy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZCBzdXBwb3J0IGZvciBPUy8yIChjYXNlIGluc2Vuc3RpdmUgZmlsZXN5c3RlbSwgLmV4ZSBzdWZmaXgsIGV0YykKICAgICB0byBBUEFDSSBmaWxlcyBhbmQgcmVsYXRlZCBzY3JpcHRzLiAKICAgICBbWWl0emNoYWsgU2NvdHQtVGhvZW5uZXMgPHN0aG9lbm5hIGVmbi5vcmc+LCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiM0MjY5CgogICopIEFkZCBzdXBwb3J0IGZvciBzdGFuZGFsb25lIG1vZGUgaW4gVFBGCiAgICAgW0pvZSBNb2VuaWNoIDxtb2VuaWNoIHVzLmlibS5jb20+XQoKICAqKSBGaXggbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBieSByZWFkX2Nvbm5lY3Rpb24oKSBpbiBzcmMvc3VwcG9ydC9hYi5jCiAgICAgW0ppbSBDb3ggPGpjIHN1cGVybGluay5uZXQ+XSBQUiM0MjcxCgogICopIEZpeCBzcGVjaWFsIFJld3JpdGVDb25kICItcyIgcGF0dGVybiBtYXRjaGluZy4KICAgICBbQm9iIEZpbmNoIDxib2IgbmFzLmNvbT5dCgogICopIEZpeCB2YWx1ZSBxdW90aW5nIGluIHNyYy9Db25maWd1cmUgc2NyaXB0IGZvciBhcF9jb25maWdfYXV0by5oIAogICAgIFtQYXVsIFN1dHRvbiA8cGF1bCBhd2UuY29tPl0KCiAgKikgTWFrZSBzdXJlIFJld3JpdGVMb2NrIGNhbiBiZSB1c2VkIG9ubHkgaW4gdGhlIGdsb2JhbCBjb250ZXh0LCAoaS5lLgogICAgIG91dHNpZGUgb2YgYW55IDxWaXJ0dWFsSG9zdD4gc2VjdGlvbnMpIGJlY2F1c2UgaXQncyBhIGdsb2JhbCBmYWNpbGl0eSBvZgogICAgIHRoZSByZXdyaXRlIGVuZ2luZS4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCB0aGUgb3duZXJzaGlwIGRlbGVnYXRpb24gZm9yIHByb3h5IGRpcmVjdG9yeSB1bmRlciBgbWFrZSBpbnN0YWxsJy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQVBBQ0kgd291bGQgbm90IGNvcnJlY3RseSBidWlsZCBzdWV4ZWMuIFtNYXJpYSBWZXJpbmEKICAgICA8bWFyaWF2IGljZ2ViLnRyaWVzdGUuaXQ+XSBQUiM0MjYwCgogICopIG1vZF9taW1lX21hZ2ljIHBhc3NlZCBvbmx5IHRoZSBmaXJzdCA0ayBvZiBhIGZpbGUgdG8KICAgICB1bmNvbXByZXNzL2d6aXAsIGJ1dCB0aG9zZSB0b29scyBzb21ldGltZXMgZG8gbm90IHByb2R1Y2UKICAgICBhbnkgb3V0cHV0IHVubGVzcyBhIHN1ZmZpY2llbnQgcG9ydGlvbiBvZiB0aGUgY29tcHJlc3NlZAogICAgIGZpbGUgaXMgaW5wdXQuICBDaGFuZ2UgdG8gcGFzcyB0aGUgZW50aXJlIGZpbGUgLS0gYnV0CiAgICAgb25seSByZWFkIDRrIG9mIG91dHB1dC4KICAgICBbTWFyY2luIENpZXNsYWsgPHNhcGVyIHN5c3RlbS5wbD5dIFBSIzQwOTcKCiAgKikgIkluZGV4T3B0aW9ucyBOb25lIiBnZW5lcmF0ZWQgZXh0cmEgc3BhY2VzIGF0IHRoZSBlbmQgb2YgZWFjaAogICAgIGxpbmUuICBbPGlua2xpbmcgZmlyc3RuZXRob3UuY29tPl0gUFIjMzc3MAoKICAqKSBUaGUgIjEwMCBDb250aW51ZSIgcmVzcG9uc2Ugd2Fzbid0IGJlaW5nIHNlbnQgYWZ0ZXIgaW50ZXJuYWwKICAgICByZWRpcmVjdHMuIFtKb3NlIEtBSEFOIDxrYWhhbiB3My5vcmc+XSBQUiMzOTEwLCAzODA2LCAzNTc1CgogICopIFdoZW4gcGFkZGluZyB0aGUgbmFtZSB3aXRoIHNwYWNlcyBmb3IgZGlzcGxheSwgbW9kX2F1dG9pbmRleCB3b3VsZAogICAgIGNvdW50ICYsIDwsIGFuZCA+IGluIHRoZWlyIGVzY2FwZWQgd2lkdGgsIG1lc3NpbmcgdXAgdGhlIGRpc3BsYXkuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiM0MDc1LCAzNzU4CgogICopIFBPUlQ6IGZpeGVkIGEgY29tcGlsYXRpb24gcHJvYmxlbSBvbiBORVhULgogICAgIFtKYWNxdWVzIERpc3RsZXIgPGRpc3RsZXIgZ29sZW0ucGgudXRleGFzLmVkdT5dIFBSIzQxMzAKCiAgKikgci0+cmVxdWVzdF90aW1lIHdhc24ndCBiZWluZyBzZXQgcHJvcGVybHkgaW4gY2VydGFpbiBlcnJvciBjb25kaXRpb25zLgogICAgIFtEZWFuIEdhdWRldF0gUFIjNDE1NgoKICAqKSBQT1JUOiBkZWFsIHdpdGggVVRTIGNvbXBpbGVyIGVycm9yIGluIGh0dHBfcHJvdG9jb2wuYwogICAgIFtEYXZlIER5a3N0cmEgPGR3ZCBiZWxsLWxhYnMuY29tPl0gUFIjNDE4OQoKICAqKSBBZGQgYXBfdnJwcmludGYoKSBmdW5jdGlvbi4gIFtKb2huIFRvYmV5IDxqdG9iZXkgYmFudGEtaW0uY29tPl0gUFIjNDI0NgoKICAqKSBGaXggdGhlIG1vZF9taW1lIGhhc2ggdGFibGUgdG8gd29yayBwcm9wZXJseSB3aXRoIGxvY2FsZXMgb3RoZXIKICAgICB0aGFuIEMuICBbRGVhbiBHYXVkZXRdIFBSIzM0MjcKCiAgKikgRml4IGEgbWVtb3J5IGxlYWsgd2hpY2ggaXMgZXhhY2VyYmF0ZWQgYnkgY2VydGFpbiBjb25maWd1cmF0aW9ucy4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzQyMjUKCiAgKikgUHJldmVudCBjbG9iYmVyaW5nIHNhdmVkIElGUyB2YWx1ZXMgaW4gQVBBQ0kuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBGaXggYnVmZmVyIG92ZXJmbG93cyBpbiBhcF91dWVuY29kZSBhbmQgYXBfdXVkZWNvZGUgcG9pbnRlZCBvdXQKICAgICBieSAiUGV0ZXIgJ0x1bmEnIEFsdGJlcmcgPHBldGVyIGFsdGJlcmcubnU+IiBhbmQgUFIjMzQyMgogICAgIFtQZXRlciAnTHVuYScgQWx0YmVyZyA8cGV0ZXIgYWx0YmVyZy5udT4sIFJvbmFsZCBUc2NoYWzkcl0KCiAgKikgTWFrZSB7U2V0LFVuc2V0LFBhc3N9RW52IHBlci1kaXJlY3RvcnkgaW5zdGVhZCBvZiBwZXItc2VydmVyLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDb3JyZWN0IGFuIGFwcGFyZW50IHR5cG86IG9uIHRoZSBXaW5kb3dzIGFuZCBNUEUgcGxhdGZvcm1zLCB0aGUKICAgICBodHBhc3N3ZCB1dGlsaXR5IHdhcyBsaW1pdGluZyBwYXNzd29yZHMgdG8gb25seSA4IGNoYXJhY3RlcnMuCiAgICAgW0tlbiBDb2FyXQoKICAqKSBFQkNESUMgcGxhdGZvcm1zOiBEYXZpZCBzdWJtaXR0ZWQgcGF0Y2hlcyBmb3IgdHdvIGJ1Z3MgaW4gdGhlCiAgICAgTUQ1IGRpZ2VzdCBwb3J0IGZvciBFQkNESUMgbWFjaGluZXM6CiAgICAgYSkgdGhlIGh0ZGlnZXN0IHV0aWxpdHkgb3Zlcndyb3RlIHRoZSBvbGQgY29udGVudHMgb2YgdGhlIGRpZ2VzdCBmaWxlCiAgICAgYikgdGhlIENvbnRlbnQtTUQ1IGhlYWRlciB2YWx1ZSAoQ29udGVudERpZ2VzdCBkaXJlY3RpdmUpIHdhcyB3cm9uZwogICAgIHdoZW4gdGhlIHJldHVybmVkIGZpbGUgd2FzIG5vdCBjb252ZXJ0ZWQgZnJvbSBFQkNESUMsIGJ1dCB3YXMgYQogICAgIGJpbmFyeSAoZS5nLiwgaW1hZ2UgZmlsZSkgaW4gdGhlIGZpcnN0IHBsYWNlLgogICAgIFtEYXZpZCBNY0NyZWVkeSA8bWNjcmVlZHkgdXMuaWJtLmNvbT5dCgogICopIHN1cHBvcnQvaHRwYXNzd2Qgbm93IHBlcm1pdHMgdGhlIHBhc3N3b3JkIHRvIGJlIHNwZWNpZmllZCBvbiB0aGUKICAgICBjb21tYW5kIGxpbmUgd2l0aCB0aGUgJy1iJyBzd2l0Y2guICBUaGlzIGlzIHVzZWZ1bCB3aGVuIHBhc3N3b3JkcwogICAgIG5lZWQgdG8gYmUgbWFpbnRhaW5lZCBieSBzY3JpcHRzIC0tIHBhcnRpY3VsYXJseSBpbiB0aGUgV2luMzIKICAgICBlbnZpcm9ubWVudC4gIFtLZW4gQ29hcl0KCiAgKikgV2luMzI6IFdpbjMyIG11bHRpcGxlIHNlcnZpY2VzIHBhdGNoLiBBZGRlZCBjYXBhYmlsaXR5IHRvIGluc3RhbGwgYW5kCiAgICAgcnVuIG11bHRpcGxlIGNvcGllcyBvZiBhcGFjaGUgYXMgaW5kaXZpZHVhbCBzZXJ2aWNlcy4KCiAgICAgRXhhbXBsZSAxOgogICAgIGFwYWNoZSAtbiBhcGFjaGUxIC1pIC1mIGM6L2h0dHBkLmNvbmYKICAgICAgICBJbnN0YWxscyBhcGFjaGUgYXMgc2VydmljZSAnYXBhY2hlMScgYW5kIGFzc29jaWF0ZXMgYzovaHR0cGQuY29uZgogICAgICAgIHdpdGggdGhhdCBzZXJ2aWNlLgogICAgIG5ldCBzdGFydCBhcGFjaGUxCiAgICAgICAgU3RhcnRzIGFwYWNoZTEgc2VydmljZS4KICAgICBuZXQgc3RvcCBhcGFjaGUxCiAgICAgICAgU3RvcHMgYXBhY2hlMSBzZXJ2aWNlCgogICAgIEV4YW1wbGUgMjoKICAgICBhcGFjaGUgLW4gYXBhY2hlMiAtaQogICAgICAgIEluc3RhbGxzIGFwYWNoZSBhcyBzZXJ2aWNlICdhcGFjaGUyJy4gaHR0cGQuY29uZiBpcyBsb2NhdGVkIHVuZGVyCiAgICAgICAgdGhlIGRlZmF1bHQgc2VydmVyIHJvb3QgKC9hcGFjaGUvY29uZi9odHRwZC5jb25mKS4KICAgICBuZXQgc3RhcnQgYXBhY2hlMgogICAgICAgIFN0YXJ0cyBhcGFjaGUyIHNlcnZpY2UuCgogICAgIEV4YW1wbGUgMzoKICAgICBhcGFjaGUgLW4gYXBhY2hlMyAtaSAtZCBjOi9wcm9ncmFtIGZpbGVzL2FwYWNoZQogICAgICAgIEluc3RhbGwgYXBhY2hlIGFzIHNlcnZpY2UgJ2FwYWNoZTMnIGFuZCBzZXRzIHNlcnZlciByb290IHRvCiAgICAgICAgYzovcHJvZ3JhbSBmaWxlcy9hcGFjaGUuCgogICAgIEV4YW1wbGUgNDoKICAgICBhcGFjaGUgLW4gYXBhY2hlMiAtayByZXN0YXJ0CiAgICAgICAgUmVzdGFydCBhcGFjaGUyIHNlcnZpY2UgCgogICAgIFtLZWl0aCBXYW5uYW1ha2VyLCBLZW4gUGFyenlnbmF0LCBCaWxsIFN0b2RkYXJkXQoKICAqKSBDb3JyZWN0IHRoZSBzaWduZWQvdW5zaWduZWQgY2hhcmFjdGVyIGhhbmRsaW5nIGZvciB0aGUgTUQ1IHJvdXRpbmVzOwogICAgIG1pc21hdGNoZXMgd2VyZSBjYXVzaW5nIGNvbXBpbGF0aW9uIHByb2JsZW1zIHdpdGggZ2NjIC1wZWRhbnRpYyBhbmQKICAgICBpbiB0aGUgVFBGIGNyb3NzLWNvbXBpbGF0aW9uLiAgW0tlbiBDb2FyXQoKICAqKSBPUy8yOiBSZXdvcmsgQ0dJIGhhbmRsaW5nIHRvIHVzZSBzcGF3biooKSBpbnN0ZWFkIG9mIGZvcmsvZXhlYywgYWNoaWV2aW5nCiAgICAgYSByb3VnaGx5IDUgZm9sZCBzcGVlZCB1cC4gW0JyaWFuIEhhdmFyZF0KCiAgKikgcHJveHkgZnRwOiBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBoYXJkd2lyZWQgc3RyaW5nICJ0ZXh0L3BsYWluIiBhcwogICAgIGEgZmFsbGJhY2sgdHlwZSBmb3IgZmlsZXMgc2VydmVkIGJ5IHRoZSBmdHAgcHJveHksIHVzZSB0aGUKICAgICBhcF9kZWZhdWx0X3R5cGUoKSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIGNvbmZpZ3VyZWQgdHlwZS4KICAgICBUaGlzIGFsbG93cyBmb3Igc3BlY2lhbCBjb25maWd1cmF0aW9ucyBsaWtlCiAgICAgICAgPERpcmVjdG9yeSBwcm94eTpmdHA6Ly9zb21lLmhvc3Q+CiAgICAgICAgRGVmYXVsdFR5cGUgZ2FyZ2xlL2JsdXJiCiAgICAgICAgPC9EaXJlY3Rvcnk+CiAgICAgQWRkaXRpb25hbGx5LCBhZGQgdGhlIENvbnRlbnQtRW5jb2Rpbmc6IGhlYWRlciB0byBGVFAgcHJveHkgcmVwbGllcwogICAgIHdoZW4gdGhlIGVuY29kaW5nIGlzIGRlZmluZWQgKGJ5IHRoZSBBZGRFbmNvZGluZyBkaXJlY3RpdmUpLgogICAgIEJlY2F1c2UgaXQgd2FzIG1pc3NpbmcsIGl0IHdhcyBhbG1vc3QgaW1wb3NzaWJsZSB0byBicm93c2UgY29tcHJlc3NlZAogICAgIGZpbGVzIHVzaW5nIHRoZSBGVFAgcHJveHkgKHdvcmtzIG5vdyBwZXJmZWN0bHkgaW4gQ29tbXVuaWNhdG9yKS4KICAgICBUaGUgZnRwIHByb3h5IG5vdyBhbHNvIHJldHVybnMgdGhlIERhdGU6IGFuZCBTZXJ2ZXI6IGhlYWRlciBsaW5lcyAoaWYgbm90CiAgICAgbXVjaCBlbHNlLi4uIFRoaXMgY29kZSBpcyAic29tZXdoYXQiIGJyb2tlbikgbGlrZSBub3JtYWwgcmVxdWVzdHMgZG8uCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBCZSBtb3JlIHNtYXJ0IGluIEFQQUNJJ3MgY29uZmlndXJlIHNjcmlwdCB3aGVuIGRldGVybWluaW5nIHRoZSBVSUQvR0lECiAgICAgZm9yIFVzZXIvR3JvdXAgZGlyZWN0aXZlcyBhbmQgdXNlIHRoZSBkZXRlcm1pbmVkIFVJRC9HSUQgdG8gaW5pdGlhbGl6ZQogICAgIHRoZSBwZXJtaXNzaW9ucyBvbiB0aGUgcHJveHljYWNoZWRpci4KICAgICBbRGlyay1XaWxsZW0gdmFuIEd1bGlrLCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBDaGFuZ2VkIHRoZSBmb3JraW5nLXByaW9yLXRvLWNsZWFudXAgaW4gdGhlIHByb3h5IG1vZHVsZSB0byBmaXJzdAogICAgIGNoZWNrIHdldGhlciBpdCBhY3R1YWxseSBuZWVkcyB0byBjb2xsZWN0IGdhcmJhZ2UuIFRoaXMgcmVkdWNlcyAKICAgICB0aGUgbnVtYmVyIG9mIGZvcmsoKXMgZnJvbSBvbmUvcmVxdWVzdCB0byBqdXN0IHRoZSBvZGQgb25lIGFuIGhvdXIuCiAgICAgW0RpcmstV2lsbGVtIHZhbiBHdWxpa10KCiAgKikgQWRkZWQgcHJveHksIGF1dGggYW5kIGhlYWRlciBzdXBwb3J0IHRvIHNyYy9zdXBwb3J0L2FiLmMuIEFkZGVkIGEKICAgICBSRUFETUUgZmlsZSB0byBzcmMvc3VwcG9ydC8KICAgICBbRGlyay1XaWxsZW0gdmFuIEd1bGlrXQoKICAqKSBEb24ndCBoYXJkLWNvZGUgdGhlIHBhdGggdG8gQVdLIGluIC0tc2hhZG93IGJvb3RzdHJhcHBpbmcgTWFrZWZpbGUuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzQwNTAKCiAgKikgQWRkIHN1cHBvcnQgZm9yIERTTyBtb2R1bGUgY29tcGlsYXRpb24gb24gQlNEL09TIDMueC4KICAgICBbUmFuZHkgVGVyYnVzaCwgQ292YWxlbnQgVGVjaG5vbG9naWVzXQoKICAqKSBGaXggc2VkLXN1YnN0aXR1dGlvbnMgaW4gYG1ha2UgaW5zdGFsbCc6IHBhdGggZWxlbWVudHMgbGlrZSBgaHR0cGQvY29uZicKICAgICAoZm9yIGluc3RhbmNlIGZyb20gYW4gQVBBQ0kgY29uZmlndXJlIC0tc3lzY29uZmRpcj0vZXRjL2h0dHBkL2NvbmYKICAgICBvcHRpb24pIHdlcmUgc3Vic3RpdHV0ZWQgd2l0aCAkKFRBUkdFVCkuY29uZiwgZXRjLiBTYW1lIGZvciBvdGhlciBzdHJpbmdzCiAgICAgd2l0aCBkb3RzIHdoZXJlIHRoZSBkb3Qgd2Fzbid0IG1hdGNoZWQgYXMgcGxhaW4gdGV4dC4gCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFBPUlQ6IEFkZCBzdXBwb3J0IGZvciBGcmVlQlNEIDQueCBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHZlcmJvc2Ugb3V0cHV0IG9mIEFQQUNJIGNvbmZpZ3VyZSAob3B0aW9uIC12KSAKICAgICBbTWFydGluIEtyYWVtZXIsIFJhbGYgUy4gRW5nZWxzY2hhbGxdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMy42CgogICopIFJlbW92ZWQgbmV3IFBhc3NBbGxFbnYgY29kZSBkdWUgdG8gRFNPIHByb2JsZW1zLiBbTGFycyBFaWxlYnJlY2h0XQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjMuNSBbbm90IHJlbGVhc2VkXQoKICAqKSBNX0lOVkFMSUQgbmVlZGVkIGEgdmFsdWUgd2l0aGluIHRoZSBzY29wZSBvZiBNRVRIT0RTIHNvIHRoYXQgdW5rbm93bgogICAgIG1ldGhvZHMgY2FuIGJlIGFjY2VzcyBjb250cm9sbGVkLiAgW1JveSBGaWVsZGluZ10gUFIjMzgyMQoKICAqKSBBZGRlZCBQYXNzQWxsRW52OyBtYWtlcyBzZXJ2ZXIncyBlbnRpcmUgZW52aXJvbm1lbnQgYXZhaWxhYmxlCiAgICAgdG8gQ0dJcyBhbmQgU1NJcyBleGVjdXRlZCB3aXRoaW4gZGlyZWN0aXZlJ3Mgc2NvcGUuICBbS2VuIENvYXJdCgogICopIGFwX3V1ZW5jb2RlKCkgYWx3YXlzIGFkZGVkIHR3byB0cmFpbGluZyAnPSdzIGFuZCBlbmNvZGluZyBvZgogICAgIDggYml0IGNoYXJhY3RlcnMgb24gYSBtYWNoaW5lIHdpdGggc2lnbmVkIGNoYXIgbWF5IHByb2R1Y2VkCiAgICAgaW5jb3JyZWN0IHJlc3VsdHMuIEFkZGl0aW9uYWxseSBhcF91dWVuY29kZSgpIHNob3VsZCBub3cKICAgICB3b3JrIGNvcnJlY3RseSBvbiBFQkNESUMgcGxhdGZvcm1zLgogICAgIFtSb25hbGQgVHNjaGFs5HIgPHJvbmFsZCBpbm5vdmF0aW9uLmNoPl0gUFIjMzQxMQoKICAqKSBXSU4zMjogQmluYXJ5IGluc3RhbGxlciBub3cgcnVucyB0aGUgY29uZmlndXJhdGlvbiBETEwgYmVmb3JlCiAgICAgdGhlIHJlYm9vdCBwcm9tcHQgKHdoaWNoIGlzIG9ubHkgZ2l2ZW4gaWYgTVNWQ1JULkRMTCBzeXN0ZW0KICAgICBETEwgaXMgbmV3IG9yIHVwZGF0ZWQpLiBUaGlzIHNob3VsZCBhdm9pZCB0aGUgY29uZmlndXJhdGlvbgogICAgIGRpcmVjdG9yeSBiZWluZyBlbXB0eSBhZnRlciBpbnN0YWxsYXRpb24uIFtQYXVsIFN1dHRvbl0KICAgICBQUiMzNzY3LCAzODAwLCAzODI3LCAzODUwLCAzOTAwLCAzOTUzLCAzOTg4CgogICopIFdJTjMyOiBCaW5hcnkgaW5zdGFsbGVyIG5vdyBjcmVhdGVzIFN0YXJ0IG1lbnUgb3B0aW9ucyB0byBzdGFydAogICAgIGFuZCBzdG9wIEFwYWNoZSBhcyBhIGNvbnNvbGUgYXBwbGljYXRpb24gYW5kIHRvIHVuaW5zdGFsbAogICAgIHRoZSBBcGFjaGUgc2VydmljZSBvbiBOVC4gW1BhdWwgU3V0dG9uXSBQUiMzNzQxCgogICopIFdJTjMyOiBBcGFjaGUuZXhlIG5vdyBjb250YWlucyBhbiBpY29uLiBbUGF1bCBTdXR0b25dCgogICopIFBPUlQ6IFN3aXRjaCBiYWNrIHRvIHVzaW5nIGZjbnRsKCkgbG9ja2luZyBvbiBMaW51eCAtLSBpbnN0YWJpbGl0aWVzCiAgICAgaGF2ZSBiZWVuIHJlcG9ydGVkIHdpdGggZmxvY2soKSBsb2NraW5nIChwcm9iYWJseSByZWxhdGVkIHRvIGtlcm5lbAogICAgIHZlcnNpb24pLiAgW0RlYW4gR2F1ZGV0XSBQUiMyNzIzLCAzNTMxCgogICopIFVzaW5nIEFQQUNJLCB0aGUgbWFpbiBjb25maWcgZmlsZSAodXN1YWxseSBodHRwZC5jb25mKSB3YXMKICAgICBub3QgYmVpbmcgYWRqdXN0ZWQgYXMgJChUQVJHRVQpLmNvbmYuIFtXaWxmcmVkbyBTYW5jaGV6CiAgICAgPHdzYW5jaGV6IGFwcGxlLmNvbT5dCgogICopIFBPUlQ6IEFJWCBkb2VzIG5vdCByZXF1aXJlIHRoZSBTSEFSRURfQ09ERSAiaGFjayIKICAgICBbUnlhbiBCbG9vbSA8cmJiIHJhbGVpZ2guaWJtLmNvbT5dCgogICopIFNldC1Db29raWUgaGVhZGVycyB3ZXJlIGJlaW5nIGRvdWJsZWQgdXAgZm9yIHNvbWUgQ0dJcyBieSB0aGUgTyhuXjIpCiAgICAgYXZvaWRhbmNlIGNvZGUgYWRkZWQgaW4gMS4zLjMuCiAgICAgW0RlYW4gR2F1ZGV0LCBKZWZmIExld2lzIDxsZXdpcyBzdGFuZm9yZC5lZHU+XSBQUiMzODcyCgogICopIGFwX2lzeGRpZ2l0IHdhcyBzb21laG93IG5lZ2xlY3RlZCB3aGVuIGFkZGluZyB0aGUgYXBfaXNmb28oKSBtYWNyb3MKICAgICBmb3IgOC1iaXQgc2FmZW5lc3MuICBbRGVhbiBHYXVkZXRdCgogICopIFBPUlQ6IFVzZSAtZlBJQyBpbnN0ZWFkIG9mIC1mcGljIG9uIFNvbGFyaXMgYW5kIFN1bk9TIGZvciBjb21waWxpbmcgRFNPcwogICAgIGJlY2F1c2UgU1BBUkNzIGhhdmUgYSBzbWFsbCBtYWNoaW5lLXNwZWNpZmljIG1heGltdW0gc2l6ZSBmb3IgdGhlIEdsb2JhbAogICAgIE9mZnNldCBUYWJsZSB3aGljaCBpcyBvZnRlbiBleGNlZWRlZCB3aGVuIGNvbXBpbGluZyBvbmUgb2YgdGhlIGxhcmdlcgogICAgIHRoaXJkLXBhcnR5IG1vZHVsZXMgd2l0aCBBcGFjaGUuIFtQZXRlciBVcmJhbiA8UGV0ZXIuVXJiYW4gZXBmbC5jaD5dIFBSIzM5NzcKCiAgKikgTW92ZSB0aGUgZGlyZWN0aXZlIGBFeHRlbmRlZFN0YXR1cycgaW4gaHR0cGQuY29uZi1kaXN0LXdpbiBfYWZ0ZXJfIHRoZQogICAgIERTTy9ETEwgc2VjdGlvbiBiZWNhdXNlIGl0J3MgYSBkaXJlY3RpdmUgZnJvbSBtb2Rfc3RhdHVzIGFuZCBpc24ndAogICAgIGF2YWlsYWJsZSBiZWZvcmUgdGhlIERMTCBvZiBtb2Rfc3RhdHVzIGlzIGxvYWRlZC4KICAgICBbTWFydGluIFBPRVNDSEwgPG1wb2VzY2hsIGdteC5uZXQ+XSBQUiMzOTM2CgogICopIFNFQ1VSSVRZOiBGaXggYSBidWcgaW4gdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBidWZmZXIgc2l6ZSBmb3IgdGhlIGxpbmUgCiAgICAgY29udGludWF0aW9uIGZhY2lsaXR5IGluIEFwYWNoZSdzIGNvbmZpZ3VyYXRpb24gZmlsZXMgd2hpY2ggY291bGQgCiAgICAgbGVhZCB0byBhIGJ1ZmZlciBvdmVyZmxvdyBzaXR1YXRpb24uCiAgICAgW1Rob21hcyBEZXZhbm5lYXV4IDxUaG9tYXMuRGV2YW5uZWF1eCBlbnN0LmZyPl0gUFIjMzYxNwoKICAqKSBNYWtlIGRvY3VtZW50YXRpb24gYW5kIGVycm9yIG1lc3NhZ2VzIG9mIEFQQUNJJ3MgLS1hY3RpdmF0ZS1tb2R1bGU9RklMRSAKICAgICBvcHRpb24gbW9yZSBjbGVhci4gW0phbiBXb2x0ZXIgPGphbmMgd3duZXQubmV0Pl0gUFIjMzk5NQoKICAqKSBGaXggdGhlIGdjYyB2ZXJzaW9uIGNoZWNrIChmb3IgZW5hYmxpbmcgdGhlIGBpbmxpbmUnIGZhY2lsaXR5KSB0byAKICAgICByZWFsbHkgc3VwcG9ydCBhbGwgZnV0dXJlIGdjYyB2ZXJzaW9ucyA+PSAyLjcgdW50aWwgd2Uga25vdyBtb3JlLgogICAgIFtKb2huIFRvYmV5IDxqdG9iZXkgYmFudGEtaW0uY29tPl0gUFIjMzk4MwoKICAqKSBMZXQgQVBBQ0kncyBjb25maWd1cmUgc2NyaXB0IGNvcnJlY3RseSBjb21wbGFpbiBmb3IgdW5rbm93biAtLWVuYWJsZS1YWFgKICAgICBhbmQgLS1kaXNhYmxlLVhYWCBvcHRpb25zLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMzk1OAoKICAqKSBMaW5rIHRoZSBzaGFyZWQgY29yZSBib290c3RyYXAgcHJvZ3JhbSAoYGBSdWxlIFNIQVJFRF9DT1JFPXllcycnKSBhbHNvCiAgICAgYWdhaW5zdCBsaWJhcC5hIGFuZCB1c2UgaXRzIGFwX3NucHJpbnRmKCkgaW5zdGVhZCBvZiBzcHJpbnRmKCkgdG8gYXZvaWQKICAgICBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3dzLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVtb3ZlIG5vIGxvbmdlciB1c2VkIG5vbi1BUEkgZnVuY3Rpb24gYXBfc2luZ2xlX21vZHVsZV9pbml0KCkuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZCBBcHBsZSdzIE1hYyBPUyBYIFNlcnZlciBMYXlvdXQgIlJoYXBzb2R5IiB0byBjb25maWcubGF5b3V0LgogICAgIFtXaWxmcmVkbyBTYW5jaGV6XQoKICAqKSBBZGQgY2dpZGlyLCBodGRvY3NkaXIsIGljb25zZGlyIHZhcmlhYmxlcyB0byBNYWtlZmlsZS50bXBsIGluIG9yZGVyCiAgICAgdG8gbWFrZSBwbGF0Zm9ybSBpbnN0YWxsYXRpb25zIGVhc2llci4gIFtXaWxmcmVkbyBTYW5jaGV6XQoKICAqKSBJbiBjb25maWd1cmUsIGRvIG5vdCBhcHBlbmQgdGhlIHRhcmdldCBuYW1lIHRvIHRoZSBkaXJlY3RvcnkgcGF0aCBpZgogICAgIHRoZSBwYXRoIGFscmVhZHkgY29udGFpbnMgImFwYWNoZSIuICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgU0lHUElQRSBpcyBub3cgaWdub3JlZCBieSB0aGUgc2VydmVyIGNvcmUuICBUaGUgcmVxdWVzdCB3cml0ZSByb3V0aW5lcwogICAgIChhcF9ycHV0YywgYXBfcnB1dHMsIGFwX3J2cHV0cywgYXBfcndyaXRlLCBhcF9ycHJpbnRmLCBhcF9yZmx1c2gpIG5vdwogICAgIGNvcnJlY3RseSBjaGVjayBmb3Igb3V0cHV0IGVycm9ycyBhbmQgbWFyayB0aGUgY29ubmVjdGlvbiBhcyBhYm9ydGVkLgogICAgIFJlcGxhY2VkIG1hbnkgZGlyZWN0ICh1bmNoZWNrZWQpIGNhbGxzIHRvIGFwX2IqIHJvdXRpbmVzIHdpdGggdGhlCiAgICAgYW5hbG9nb3VzIGFwX3IqIGNhbGxzLiAgW1JveSBGaWVsZGluZ10KCiAgKikgRW5oYW5jZWQgbW9kX3Jld3JpdGUncyBtYXBmaWxlIGhhbmRsaW5nOiBUaGUgaW4tY29yZSBjYWNoZSBmb3IgdGV4dCBhbmQKICAgICBEQk0gZm9ybWF0IG1hcGZpbGVzIG5vdyB1c2VzIGEgNC13YXkgaGFzaCB0YWJsZSB3aXRoIExSVSBmdW5jdGlvbmFsaXR5LgogICAgIEZ1cnRoZXJtb3JlIG1hcCBsb29rdXBzIGZvciBub24tZXhpc3RlbnQga2V5cyBhcmUgbm93IGNhY2hlZCBhcyB3ZWxsLgogICAgIEFkZGl0aW9uYWxseSAidHh0IiBtYXBzIGFyZSBub3cgcGFyc2VkIHdpdGggc2ltcGxlIHN0cmluZyBmdW5jdGlvbnMKICAgICBpbnN0ZWFkIG9mIHVzaW5nIGFwX3ByZWdjb21wKCkuIEFzIGEgc2lkZSBlZmZlY3QgYSBidWcgdGhhdCBwcmV2ZW50ZWQKICAgICB0aGUgdXNhZ2Ugb2Yga2V5cyBjb250YWluaW5nIHRoZSAiLCIgY2hhcmFjdGVyIHdhcyBmaXhlZC4KICAgICBUaGUgY2hhbmdlcyBkcmFzdGljYWxseSBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSB3aGVuIGxhcmdlIHJld3JpdGUgbWFwcwogICAgIGFyZSBpbiB1c2UuCiAgICAgW01pY2hhZWwgdmFuIEVsc3QgPG1sZWxzdHYgc2VycGVucy5zd2IuZGU+LCBMYXJzIEVpbGVicmVjaHRdIFBSIzMxNjAKCiAgKikgQWRkZWQgYXBfc3ViX3JlcV9tZXRob2RfdXJpKCkgZm9yIGRvaW5nIGEgc3VicmVxdWVzdCB3aXRoIGEgbWV0aG9kCiAgICAgb3RoZXIgdGhhbiBHRVQsIGFuZCBjb25zdCdkIHRoZSBkZWZpbml0aW9uIG9mIG1ldGhvZCBpbiByZXF1ZXN0X3JlYy4KICAgICBbR3JlZyBTdGVpbl0KCiAgKikgVXNlIHByb3BlciBwaWRfdCB0eXBlIGZvciBzYXZpbmcgUElEcyBpbiBhbGxvYy5jLiAgW0pvaG4gQmxleV0KCiAgKikgUmVwbGFjZWQgdXNlIG9mIFdJTjMyIGRlZmluZSB3aXRoIEhBVkVfRFJJVkVfTEVUVEVSUyB0byBpbmRpY2F0ZQogICAgIHdoZW4gdGhlIE9TIGFsbG93cyBhIERPUyBkcml2ZSBsZXR0ZXIgd2l0aGluIHBhdGhuYW1lcy4gIFtCcmlhbiBIYXZhcmRdCgogICopIEFkZCAlViB0byBtb2RfbG9nX2NvbmZpZywgdGhpcyBsb2dzIHRoZSBob3N0bmFtZSBhY2NvcmRpbmcgdG8gdGhlCiAgICAgVXNlQ2Fub25pY2FsTmFtZSBzZXR0aW5nICh0aGlzIGlzIHRoZSBwcmUtMS4zLjQgYmVoYXZpb3VyIG9mCiAgICAgJXYpLiAgVXNlZnVsIGZvciBtYXNzIHZob3N0aW5nLiAgW1RvbnkgRmluY2ggPGRvdCBkb3RhdC5hdD5dCgogICopIEFkZCBzdXBwb3J0IGZvciBcbiBhbmQgXHQgdG8gbW9kX2xvZ19jb25maWcsIGNhbiBiZSB1c2VkIHRvIHByb2R1Y2UKICAgICBtb3JlIHJlbGlhYmxlIGxvZ3Mgd2l0aCBtdWx0aWxpbmUgZW50cmllcy4gIFtUb255IEZpbmNoIDxkb3QgZG90YXQuYXQ+XQoKICAqKSBGaXhlZCBhIGZldyBjb21waWxlciBuaXRzLiAgW0pvaG4gQmxleSA8amJiNiBhY3B1Yi5kdWtlLmVkdT5dCgogICopIEFkZGVkIGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2VzIGZvciBmYWlsZWQgbXVubWFwKCkgYW5kIGZzZWVrKCkgY2FsbHMKICAgICBpbiBodHRwX2NvcmUuYy4gW0pvaG4gQmxleSwgUm95IEZpZWxkaW5nXQoKICAqKSBBZGRlZCBzb21lIGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2VzIGZvciBzb21lIGZhaWxlZCBtYWxsb2MoKQogICAgIGNhbGxzLiBbSm9obiBCbGV5IDxqYmI2IGFjcHViLmR1a2UuZWR1PiwgSmltIEphZ2llbHNraV0KCiAgKikgT1MvMiBhcF9vc19jYW5vbmljYWxfZmlsZW5hbWUoKSdzIGJlaGF2aW91ciBpcyBpbXByb3ZlZDogYXBfYXNzZXJ0KCkKICAgICBpcyByZW1vdmVkLiBUaGlzIGFsbG93cyA8RGlyZWN0b3J5IHByb3h5Oio+IGRpcmVjdGl2ZXMgdG8gd29yayBhbmQKICAgICBwcmV2ZW50cyBpbnZhbGlkIHJlcXVlc3RzIGZyb20ga2lsbGluZyB0aGUgcHJvY2Vzcy4KICAgICBbQnJpYW4gSGF2YXJkIDxicmlhbmgga2hlbGRhci5hcGFuYS5vcmcuYXU+XQoKICAqKSBSZW9yZ2FuaXNlZCBGQVEgZG9jdW1lbnQuCiAgICAgW0pvc2h1YSBTbGl2ZSA8c2xpdmUgZmluYW5jZS5jb21tZXJjZS51YmMuY2E+XSBQUiMyNDk3CgogICopIHNyYy9zdXBwb3J0LzogVGhlIEFwYWNoZUJlbmNoIGJlbmNobWFyayBwcm9ncmFtIHdhcyBvdmVyaGF1bGVkIGJ5CiAgICAgRGF2aWQgTi4gV2VsdG9uOiB5b3UgY2FuIG5vdyBoYXZlIGl0IGdlbmVyYXRlIGFuIEhUTUwgVEFCTEUsIHByZXN1bWFibHkKICAgICBmb3IgaW50ZWdyYXRpb24gaW50byBvdGhlciBIVE1MIHNvdXJjZXMuIERhdmlkIHVwZGF0ZWQgdGhlIGFiIG1hbiBwYWdlCiAgICAgYXMgd2VsbCBhbmQgYWRkZWQgc29tZSBtaXNzaW5nIGRlc2NyaXB0aW9ucy4gVGhhbmtzIQogICAgIFtEYXZpZCBOLiBXZWx0b24gPGRhdmlkdyBwcm9zYS5pdD5dCgogICopIFdpbjMyOiBUaGUgZmlsZW5hbWUgdmFsaWRpdHkgY2hlY2tlciBub3cgYWxsb3dzIGZpbGVuYW1lcyBjb250YWluaW5nCiAgICAgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgMHg4MCB0byAweGZmIChmb3IgZXhhbXBsZSBhY2NlbnRlZCBjaGFyYWN0ZXJzKS4KICAgICBbUGF1bCBTdXR0b25dIFBSIzM4OTAKCiAgKikgQWRkZWQgY29uZGl0aW9uYWwgbG9nZ2luZyBiYXNlZCB1cG9uIGVudmlyb25tZW50IHZhcmlhYmxlcyB0bwogICAgIG1vZF9sb2dfY29uZmlnLiAgbW9kX2xvZ19yZWZlcmVyIGFuZCBtb2RfbG9nX2FnZW50CiAgICAgYXJlIG5vdyBkZXByZWNhdGVkLiAgW0tlbiBDb2FyXQoKICAqKSBBbGxvdyBhcGFjaGUgYWN0aW5nIGFzIGEgcHJveHkgc2VydmVyIHRvIHJlbGF5IHRoZSByZWFsCiAgICAgcmVhc29uIG9mIGEgZmFpbHVyZSB0byBhIGNsaWVudCByYXRoZXIgdGhhbiB0aGUgImludGVybmFsCiAgICAgc2VydmVyIGVycm9yIiBpdCBkb2VzIGN1cnJlbnRseS4gVGhlIGdlbmVyYWwgZXhwb3N1cmUgbWVjaGFuaXNtCiAgICAgY2FuIGJlIHRyaWdnZXJlZCBieSBhbnkgbW9kdWxlIGJ5IHNldHRpbmcgdGhlICJ2ZXJib3NlLWVycm9yLXRvIgogICAgIG5vdGUgdG8gIioiOyB0aGlzIGFsbG93cyBtb3JlIHRoYW4ganVzdCBwcm94eSBlcnJvcnMgdG8gYmUgZXhwb3NlZC4KICAgICBbQ2xpZmYgU2tvbG5pY2ssIFJveSBGaWVsZGluZywgTWFydGluIEtyYWVtZXJdIFJlbGF0ZWQgdG8gUFIjMzQ1NSwgNDA4NgoKICAqKSBNb3ZlZCBtYW4gcGFnZXMgZm9yIGFiIGFuZCBhcGFjaGVjdHJsIHRvIHNlY3Rpb24gOC4KICAgICBbV2lsZnJlZG8gU2FuY2hleiwgUm95IEZpZWxkaW5nXQoKICAqKSBBZGRlZCAtUyBvcHRpb24gdG8gaW5zdGFsbC5zaCBzbyB0aGF0IG9wdGlvbnMgY2FuIGJlIHBhc3NlZCB0bwogICAgIHN0cmlwIG9uIHNvbWUgcGxhdGZvcm1zLiBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgV2lsZnJlZG8gU2FuY2hlel0KCiAgKikgVHdlYWsgbW9kdWxlcyBNYWtlZmlsZSBnZW5lcmF0ZWQgYnkgQ29uZmlndXJlIHNvIHRoYXQgaXQgaGFuZGxlcwogICAgIHRoZSB0ZXN0IGNhc2Ugb2Ygbm8gbW9kdWxlcyBiZWluZyBzZWxlY3RlZC4gWzxjaGF6IHJlbGlhbnQuY29tPl0KCiAgKikgQWRkZWQgYSA8TGltaXRFeGNlcHQgbWV0aG9kIC4uLj4gc2VjdGlvbmluZyBkaXJlY3RpdmUgdGhhdCBhbGxvd3MKICAgICB0aGUgdXNlciB0byBhc3NpZ24gYXV0aGVudGljYXRpb24gY29udHJvbCB0byBhbnkgSFRUUCBtZXRob2QgdGhhdAogICAgIGlzICpub3QqIGdpdmVuIGluIHRoZSBhcmd1bWVudCBsaXN0OyBpLmUuLCB0aGUgbG9naWNhbCBuZWdhdGlvbgogICAgIG9mIHRoZSA8TGltaXQ+IGRpcmVjdGl2ZS4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgY29udHJvbGxpbmcKICAgICBhY2Nlc3Mgb24gbWV0aG9kcyB1bmtub3duIHRvIHRoZSBBcGFjaGUgY29yZSwgYnV0IHBlcmhhcHMga25vd24gYnkKICAgICBzb21lIG1vZHVsZSBvciBDR0kgc2NyaXB0LiBbUm95IEZpZWxkaW5nLCBUb255IEZpbmNoXQoKICAqKSBQcmV2ZW50IGFwYWNoZWN0bCBmcm9tIGNvbXBsYWluaW5nIGlmIHRoZSBQSURGSUxFIGV4aXN0cyBidXQKICAgICBkb2VzIG5vdCBjb250YWluIGEgcHJvY2VzcyBpZCwgYXMgbWlnaHQgb2NjdXIgaWYgdGhlIHNlcnZlciBpcwogICAgIGJlaW5nIHJhcGlkbHkgcmVzdGFydGVkLiBbV2lsZnJlZG8gU2FuY2hlel0KCiAgKikgV2luMzI6IEFkZCBnbG9iYWwgc3ltYm9scyBtaXNzaW5nIGZyb20gQXBhY2hlQ29yZS5kZWYuIFtDYXJsIE9sc2VuXQoKICAqKSBFbnRpdHkgdGFnIGNvbXBhcmlzb25zIGZvciBJZi1NYXRjaCBhbmQgSWYtTm9uZS1NYXRjaCB3ZXJlIG5vdCBiZWluZwogICAgIHBlcmZvcm1lZCBjb3JyZWN0bHkgLS0gd2VhayB0YWdzIG1pZ2h0IGNhdXNlIGZhbHNlIHBvc2l0aXZlcy4gIEFsc28sCiAgICAgc3Ryb25nIGNvbXBhcmlzb24gd2Fzbid0IHByb3Blcmx5IGVuZm9yY2VkIGluIGFsbCBjYXNlcy4KICAgICBbUm95IEZpZWxkaW5nLCBLZW4gQ29hciwgRGVhbiBHYXVkZXRdIFBSIzIwNjUsIDM2NTcKCiAgKikgT1MvMjogU3VwcGx5IE9TLzIgZXJyb3IgY29kZSBpbnN0ZWFkIG9mIGVycm5vIG9uIHNlbWFwaG9yZSBlcnJvcnMuCiAgICAgW0JyaWFuIEhhdmFyZF0KCiAgKikgV29yayBhcm91bmQgYSBidWcgaW4gTHlueCByZWdhcmRpbmcgaXRzIHNlbmRpbmcgIk5lZ290aWF0ZTogdHJhbnMiCiAgICAgZXZlbiB0aG91Z2ggaXQgZG9lc24ndCB1bmRlcnN0YW5kIFRDTi4gIFtLb2VuIEhvbHRtYW4sIFJveSBGaWVsZGluZ10KCiAgKikgQWRkZWQgYXBfc2l6ZV9saXN0X2l0ZW0oKSwgYXBfZ2V0X2xpc3RfaXRlbSgpLCBhbmQgYXBfZmluZF9saXN0X2l0ZW0oKQogICAgIHRvIHV0aWwuYyBmb3IgcGFyc2luZyBhbiBIVFRQIGhlYWRlciBmaWVsZCB2YWx1ZSB0byBleHRyYWN0IHRoZSBuZXh0CiAgICAgbGlzdCBpdGVtLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBwb3NzaWJsZSBwcmVzZW5jZSBvZiBuZXN0ZWQgY29tbWVudHMsCiAgICAgcXVvdGVkLXBhaXJzLCBhbmQgcXVvdGVkLXN0cmluZ3MuIGFwX2dldF9saXN0X2l0ZW0oKSBhbHNvIHJlbW92ZXMKICAgICBpbnNpZ25pZmljYW50IHdoaXRlc3BhY2UgYW5kIGxvd2VyY2FzZXMgbm9uLXF1b3RlZCB0b2tlbnMuCiAgICAgW1JveSBGaWVsZGluZ10gUFIjMjA2NQoKICAqKSBwcm94eTogVGhlIHZhcmlvdXMgY2FsbHMgdG8gYXBfcHJveHllcnJvcigpIGNhbiByZXR1cm4gSFRUUC8xLjEgc3RhdHVzCiAgICAgY29kZSBkaWZmZXJlbnQgZnJvbSA1MDAuIFRoaXMgYWxsb3dzIHRoZSBwcm94eSB0bywgZS5nLiwgcmV0dXJuCiAgICAgIjQwMyBGb3JiaWRkZW4iIGZvciBQcm94eUJsb2NrJ2VkIFVSTCdzLiBbTWFydGluIEtyYWVtZXJdIFJlbGF0ZWQgdG8gUFIjMzQ1NQoKICAqKSBGaXggb3JkZXJpbmcgb2YgbGFuZ3VhZ2UgdmFyaWFudHMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB0cmFkaXRpb25hbAogICAgIG5lZ290aWF0aW9uIGFsZ29yaXRobSBpcyBiZWluZyB1c2VkIHdpdGggbXVsdGlwbGUgbGFuZ3VhZ2UgdmFyaWFudHMKICAgICBhbmQgbm8gQWNjZXB0LUxhbmd1YWdlLiBbSmFtZXMgVHJlYWN5IDx0cmVhY3kgZGViaWFuLm9yZz5dIFBSIzMyOTksIDM2ODgKCiAgKikgRG8gbm90IHJvdW5kIHRoZSBUQ04gcXVhbGl0eSBjYWxjdWxhdGlvbiB0byA1IGRlY2ltYWwgcGxhY2VzLAogICAgIHVubGlrZSBSRkMgMjI5NiwgYmVjYXVzZSB0aGUgY2FsY3VsYXRpb24gbWlnaHQgbmVlZCAxMiBkZWNpbWFsIHBsYWNlcwogICAgIHRvIGdldCB0aGUgcmlnaHQgcmVzdWx0LiAgW1JveSBGaWVsZGluZ10KCiAgKikgUmVtb3ZlIHVudXNlZCBjb2RlIHRvIGRpc2FibGUgdHJhbnNwYXJlbnQgbmVnb3RpYXRpb24gd2hlbgogICAgIG5lZ290aWF0aW5nIG9uIGVuY29kaW5nIG9ubHksIGFzIHdlIG5vdyBoYW5kbGUgZW5jb2RpbmcgdG9vCiAgICAgKHRob3VnaCB0aGlzIGlzIG5vbnN0YW5kYXJkIGZvciBUQ04pLCByZW1vdmUgY2hhcnNldD1JU08tODg1OS0xCiAgICAgZmlkZGxlIGZyb20gdGhlIGZpZGRsZS1hdmVyc2UgUlZTQSBjb21wYXJpc29uLCBhbmQgZml4IGJ1Z3MgaW4KICAgICBzb21lIGRlYnVnZ2luZyBzdGF0ZW1lbnRzIHdpdGhpbiBtb2RfbmVnb3RpYXRpb24uIFtLb2VuIEhvbHRtYW5dCgogICopIEZpeGVkIGEgcmFyZSBtZW1vcnkgY29ycnVwdGlvbiBwb3NzaWJpbGl0eSBpbiBtb2RfZGlyIGlmIHRoZSBpbmRleAogICAgIGZpbGUgaXMgbmVnb3RpYWJsZSBhbmQgbm8gYWNjZXB0YWJsZSB2YXJpYW50IGNhbiBiZSBmb3VuZC4KICAgICBbRGVhbiBHYXVkZXQsIFJveSBGaWVsZGluZywgTWFydGluIEtyYWVtZXJdCgogICopIFdpbjMyOiBBZGQgbmV3IGNvbmZpZyBkaXJlY3RpdmUsIFNjcmlwdEludGVycHJldGVyU291cmNlLCB0byBlbmFibGUKICAgICBzZWFyY2hpbmcgdGhlIFdpbjMyIHJlZ2lzdHJ5IGZvciBzY3JpcHQgaW50ZXJwcmV0ZXJzLgogICAgIFtCaWxsIFN0b2RkYXJkXQoKICAqKSBXaW4zMjogVGhlIGNvbXBpbGVkLWluIGRlZmF1bHQgZmlsZW5hbWUgZm9yIHRoZSBlcnJvciBsb2cgaXMgbm93CiAgICAgZXJyb3IubG9nLCB3aGljaCBtYXRjaGVzIHRoZSBkZWZhdWx0IGluIHRoZSBkaXN0cmlidXRlZCBodHRwZC5jb25mLgogICAgIFtQYXVsIFN1dHRvbl0KCiAgKikgV2luMzI6IEFueSBlcnJvciBtZXNzYWdlcyBmcm9tIC1pIG9yIC11IGNvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBub3cKICAgICBkaXNwbGF5ZWQgb24gdGhlIGNvbnNvbGUgb3V0cHV0IHJhdGhlciB0aGFuIHNlbnQgdG8gdGhlIGVycm9yIGxvZy4KICAgICBBbHNvIHRoZSAiUnVubmluZyBBcGFjaGUuLi4iIG1lc3NhZ2UgaXMgbm90IG91dHB1dCB1bmxlc3MgQXBhY2hlIGlzCiAgICAgZ29pbmcgdG8gc2VydmUgcmVxdWVzdHMuIFtQYXVsIFN1dHRvbl0KCiAgKikgUmV3b3JrIHRoZSBNRDUgYXV0aGVudGljYXRpb24gc2NoZW1lIHRvIHVzZSBGcmVlQlNEJ3MgYWxnb3JpdGhtLAogICAgIGFuZCB1c2UgYSBwcml2YXRlIHNpZ25pZmljYXRvciAoJyRhcHIxJCcpIHRvIG1hcmsgcGFzc3dvcmRzIGFzCiAgICAgYmVpbmcgc21hc2hlZCB3aXRoIG91ciBvd24gYWxnb3JpdGhtLiAgQWxzbyBhYnN0cmFjdCB0aGUgcGFzc3dvcmQKICAgICBjaGVja2luZyBpbnRvIGEgbmV3IGFwX3ZhbGlkYXRlX3Bhc3N3b3JkKCkgcm91dGluZS4gIFtLZW4gQ29hcl0KCiAgKikgV2luMzI6IFRoZSBmaWxlbmFtZSB2YWxpZGl0eSBjaGVja2VyIG5vdyBhbGxvd3MgIkNPTSIgYnV0IHJlZnVzZXMgCiAgICAgYWNjZXNzIHRvICJDT00xIiB0aHJvdWdoICJDT000Ii4gVGhpcyBhbGxvd3MgZmlsZW5hbWVzIHN1Y2gKICAgICBhcyAiY29tLm5hbWUiIHRvIGJlIHNlcnZlZC4gW1BhdWwgU3V0dG9uXSBQUiMzNzY5LgoKICAqKSBCUzIwMDA6IEFkYXB0IHRvIHRoZSBuZXcgdWZvcmsoKSBzeXN0ZW0gY2FsbCBpbnRlcmZhY2Ugd2hpY2ggd2lsbAogICAgIG1ha2Ugc3VidGFza2luZyBlYXNpZXIgb24gdGhlIE9TRC9QT1NJWCBtYWluZnJhbWUgZW52aXJvbm1lbnQuCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBBZGQgYSBjb21wYXRpYmlsaXR5IGRlZmluZSBmb3IgZXNjYXBlX3VyaSgpIC0+IGFwX2VzY2FwZV91cmkoKSB0bwogICAgIGFwX2NvbXBhdC5oLiBbRGF2aWQgV2hpdGUgPGRhdmlkIHBlcnNpbW1vbi5jb20+XSBQUiMzNzI1CgogICopIE1ha2UgTkRCTSBmaWxlIHN1ZmZpeCBkZXRlcm1pbmF0aW9uIGZvciBtb2RfcmV3cml0ZSBtb3JlIGFjY3VyYXRlLCBpLmUuCiAgICAgdXNlIGAuZGInIGluc3RlYWQgb2YgYC5wYWcnIG5vdCBvbmx5IGZvciBGcmVlQlNELCBidXQgYWxzbyB3aGVuCiAgICAgdGhlIE5EQk0gbGlicmFyeSBsb29rcyBsaWtlIEJlcmtlbGV5LURCIGJhc2VkLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMzNzczCgogICopIEFkZCBhYmlsaXR5IHRvIGhhbmRsZSBERVMgb3IgTUQ1IGF1dGhlbnRpY2F0aW9uIHBhc3N3b3Jkcy4KICAgICBbUnlhbiBCbG9vbSA8cmJiIFJhbGVpZ2guSUJNLkNvbT5dCgogICopIEZpeCBPKG5eMikgbWVtb3J5IGNvbnN1bXB0aW9uIGluIG1vZF9zcGVsaW5nLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBTRUNVUklUWTogQXZvaWQgc29tZSBidWZmZXIgb3ZlcmZsb3cgcHJvYmxlbXMgd2hlbiBlc2NhcGluZwogICAgIHF1b3RlZCBzdHJpbmdzLiAgKFRoaXMgb3ZlcmZsb3cgd2FzIG9uIHRoZSBoZWFwIGFuZCB3ZSBiZWxpZXZlCiAgICAgaW1wb3NzaWJsZSB0byBleHBsb2l0LikgIFtSaWNrIFBlcnJ5IDxwZXJyeSBlY2UudmlsbC5lZHU+XQoKICAqKSBMZXQgc3JjL0NvbmZpZ3VyZSBiZSBhd2FyZSBvZiBDRkxBR1Mgb3B0aW9ucyBzdGFydGluZyB3aXRoIHBsdXMKICAgICBzaWducyBhcyBpdCdzIHRoZSBjYXNlIGZvciB0aGUgSFAvVVggY29tcGlsZXIuCiAgICAgW0RvdWcgWWF0Y2lsbGEgPHlhdGNpbGRhIHVtZG5qLmVkdT5dIFBSIzM2ODEKCiAgKikgUmVtb3ZlIHRoZSBoYXJkLXdpcmUgb2YgVEFSPXRhciAod2Ugbm93IGNoZWNrIGZvciBndGFyIGFuZCBnbnV0YXIgZmlyc3QpCiAgICAgYW5kIGNoZWNrIHRvIHNlZSBpZiB0aGUgdGFyIHdlIHdpbmQgdXAgd2l0aCBzdXBwb3J0cyAnLWgnLgogICAgIFtKaW0gSmFnaWVsc2tpXSBQUiMzNjcxCgogICopIEEgY29uc2lzdGVudCBhbmQgY29uc2VydmF0aXZlIHN0eWxlIGZvciBhbGwgc2hlbGwgc2NyaXB0cyBoYXMgYmVlbgogICAgIGltcGxlbWVudGVkLiBCYXNpY2FsbHksIGFsbCBzaGVsbCBzdHJpbmcgdGVzdHMgdXNlIHRoZSB0cmFkaXRpb25hbAogICAgIGhhY2sgb2YgJ2lmIFsgIngkdmFyIiAhPSAieCIgXScgb3IgJ2lmIFsgIngkdmFyIiA9ICJ4c3RyaW5nIiBdJwogICAgIHRvIHByb3RlY3QgYWdhaW5zdCBiYXJlIG51bGwgdmFyaWFibGUgc3RyaW5ncyAoaWU6IHdyYXBwaW5nIGJvdGgKICAgICBzaWRlcyB3aXRoIGRvdWJsZSBxdW90ZXMgYW5kIHByZXBlbmRpbmcgJ3gnKS4gJ3gnIHdhcyBjaG9zZW4KICAgICBiZWNhdXNlIGl0J3MgbW9yZSB1bml2ZXJzYWwgYW5kIGhvcGVmdWxseSBlYXNpZXIgZm9yIG9sZCBzaGVsbAogICAgIHByZ3JhbW1lcnMsIGFzIHdlbGwgYXMgYmVpbmcgZWFzaWVyIHRvIHNlYXJjaCBmb3IgaW4gJ3ZpJyAoL3hcJCkgOikKICAgICBbSmltIEphZ2llbHNraV0KCiAgKikgVGhlIHN0YXR1cyBtb2R1bGUgbm93IHByaW50cyBvdXQgYm90aCB0aGUgbWFpbiBzZXJ2ZXIgZ2VuZXJhdGlvbiBhcwogICAgIHdlbGwgYXMgdGhlIGdlbmVyYXRpb24gb2YgZWFjaCBwcm9jZXNzLiBBbHNvLCB0aGUgdmhvc3QgaW5mbyBpcwogICAgIHByaW50ZWQgd2l0aCAnP25vdGFibGUnLiBbSmltIEphZ2llbHNraV0KCiAgKikgTW92ZSBzcmMvbWFpbi9tZDVjLmMgdG8gc3JjL2FwL2FwX21kNWMuYzsgaXQncyBodHRwZC1uZXV0cmFsCiAgICAgYW5kIHRoaXMgbWFrZXMgaXRzIGZ1bmN0aW9ucyBhdmFpbGFibGUgdG8gdGhpbmdzIGluIHNyYy9zdXBwb3J0LgogICAgIFtLZW4gQ29hcl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjQKCiAgKikgUmVuYW1lZCBtYWNyb3Mgc3RhdHVzX2Ryb3BzX2Nvbm5lY3Rpb24gdG8gYXBfc3RhdHVzX2Ryb3BzX2Nvbm5lY3Rpb24KICAgICBhbmQgdmVzdGlnaWFsIHNjYW5fc2NyaXB0X2hlYWRlciB0byBhcF9zY2FuX3NjcmlwdF9oZWFkZXJfZXJyLAogICAgIG1vc3RseSBmb3IgYWVzdGhldGljIHJlYXNvbnMuIFtSb3kgRmllbGRpbmddCgogICopIFRoZSBxdWVyeSBzd2l0Y2ggImh0dHBkIC1TIiBkaWRuJ3QgZXhpdCBhZnRlciBzaG93aW5nIHRoZQogICAgIHZob3N0IHNldHRpbmdzLiBUaGF0IHdhcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgb3RoZXIgcXVlcnkgZnVuY3Rpb25zLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgTW92ZWQgdGhlIE1PRFVMRV9NQUdJQ19DT09LSUUgZnJvbSBiZWZvcmUgdGhlIHZlcnNpb25zIGFuZAogICAgIGZpbGVuYW1lIHRvIHRoZSBlbmQgb2YgdGhlIFNUQU5EQVJEX01PRFVMRV9TVFVGRi4gIEl0cwogICAgIHByZXNlbmNlIGF0IHRoZSBiZWdpbm5pbmcgcHJldmVudGVkIHJlcG9ydGluZyBvZiB0aGUgZmlsZW5hbWUKICAgICBmb3IgbW9kdWxlcyBjb21waWxlZCBiZWZvcmUgMSBKYW51YXJ5IDE5OTkuICBbS2VuIENvYXJdCgogICopIFNFQ1VSSVRZOiBhcF9vc19pc19maWxlbmFtZV92YWxpZCgpIGhhcyBiZWVuIGFkZGVkIHRvIFdpbjMyCiAgICAgdG8gZGV0ZWN0IGFuZCBwcmV2ZW50IGFjY2VzcyB0byBzcGVjaWFsIERPUyBkZXZpY2UgZmlsZSBuYW1lcy4KICAgICBbUGF1bCBTdXR0b24sIEtlbiBQYXJ6eWduYXRdCiAgICAgCiAgKikgV0lOMzI6IENyZWF0ZWQgbmV3IG1ha2VmaWxlcyBNYWtlZmlsZV93aW4zMi50eHQgKG5vcm1hbCBidWlsZCkKICAgICBhbmQgTWFrZWZpbGVfd2luMzJfZGVidWcudHh0IChkZWJ1ZyBidWlsZCkgdGhhdCB3b3JrIG9uIFdpbjk1LgogICAgIFJ1biBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgZnJvbSB0aGUgc3JjIGRpcmVjdG9yeToKICAgICAgICBubWFrZSAvZiBNYWtlZmlsZV93aW4zMi50eHQgICAgICAgICAgICMgY29tcGlsZXMgbm9ybWFsIGJ1aWxkCiAgICAgICAgbm1ha2UgL2YgTWFrZWZpbGVfd2luMzIudHh0IGluc3RhbGwgICAjIGNvbXBpbGVzIGFuZCBpbnN0YWxscwogICAgICAgIG5tYWtlIC9mIE1ha2VmaWxlX3dpbjMyLnR4dCBjbGVhbiAgICAgIyByZW1vdmVzIGNvbXBpbGVkIGp1bmsKICAgICAgICBubWFrZSAvZiBNYWtlZmlsZV93aW4zMl9kZWJ1Zy50eHQgICAgICMgY29tcGlsZXMgZGVidWcgYnVpbGQKICAgICAgICBubWFrZSAvZiBNYWtlZmlsZV93aW4zMl9kZWJ1Zy50eHQgaW5zdGFsbAogICAgICAgIG5tYWtlIC9mIE1ha2VmaWxlX3dpbjMyX2RlYnVnLnR4dCBjbGVhbgogICAgIFtSb3kgRmllbGRpbmddCgogICopIEFkZGVkIGJpbmJ1aWxkLnNoIGFuZCBmaW5kcHJnLnNoIGhlbHBlcnMgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHVzCiAgICAgdG8gYnVpbGQgYmluYXJ5IGRpc3RyaWJ1dGlvbnMuIFtMYXJzIEVpbGVicmVjaHRdCgogICopIEluZGV4T3B0aW9ucyBTdXBwcmVzc0NvbHVtblNvcnRpbmcgb25seSB0dXJuZWQgb2ZmIG1ha2luZwogICAgIHRoZSBjb2x1bW4gaGVhZGVycyBhbmNob3JzOyB5b3UgY291bGQgc3RpbGwgY2hhbmdlIHRoZSBkaXNwbGF5CiAgICAgb3JkZXIgYnkgbWFudWFsbHkgYWRkaW5nIGEgJz9OPUEnIG9yIHNpbWlsYXIgcXVlcnkgc3RyaW5nIHRvIHRoZQogICAgIFVSTC4gIE5vdyBTdXBwcmVzc0NvbHVtblNvcnRpbmcgbG9ja3MgaW4gdGhlIHNvcnQgb3JkZXIgc28KICAgICBpdCBjYW4ndCBiZSBvdmVycmlkZGVuIHRoaXMgd2F5LiAgW0tlbiBDb2FyXQoKICAqKSBBZGRlZCBJbmRleE9yZGVyRGVmYXVsdCBkaXJlY3RpdmUgdG8gc3VwcGx5IGEgZGVmYXVsdCBzb3J0IG9yZGVyCiAgICAgZm9yIEZhbmN5SW5kZXhlZCBkaXJlY3RvcnkgbGlzdGluZ3MuICBbS2VuIENvYXJdIFBSIzE2OTkKCiAgKikgQ2hhbmdlIHRoZSBhcF9hc3NlcnQgbWFjcm8gdG8gYSB2YXJpYW50IHRoYXQgd29ya3Mgb24gYWxsIHBsYXRmb3Jtcy4KICAgICBbUmljaGFyZCBQcmlueiA8cmljaGFyZC5wcmlueiBjc28ubmV0Pl0gUFIjMjU3NQoKICAqKSBNYWtlIHN1cmUgdW5kZXIgRUxGLWJhc2VkIE5ldEJTRCAobm93KSBhbmQgT3BlbkJTRCAoZnV0dXJlKSB3ZSBkb24ndAogICAgIHNlYXJjaCBmb3IgYW4gdW5kZXJzY29yZSBvbiBkbHN5bSgpIChhcyBpdCdzIGFscmVhZHkgdGhlIGNhc2UKICAgICBmb3IgRnJlZUJTRCAzLjApLiBbVG9kZCBWaWVybGluZyA8dHYgcG9ib3guY29tPl0gUFIjMjQ2MgogIAogICopIFNtYWxsIGZpeCBmb3IgbW9kX2Vudi5odG1sOiBUaGUgbW9kdWxlIHdhcyBkb2N1bWVudGVkIGFzIHRvIGJlIF9ub3RfCiAgICAgY29tcGlsZWQgaW50byBBcGFjaGUgcGVyIGRlZmF1bHQsIGFsdGhvdWdoIGl0IF9JU18gY29tcGlsZWQgaW50byAKICAgICBBcGFjaGUgcGVyIGRlZmF1bHQuIFtTaW0gSGFyYmVydCA8c2ltIG1pbmRzcHJpbmcuY29tPl0gUFIjMzU3MgoKICAqKSBJbnN0ZWFkIG9mIGZpeGluZyBhIGJ1ZyBpbiB0aGUgZ2VuZXJhdGlvbiBwcm9jZWR1cmUgZm9yIGNvbmZpZy5zdGF0dXMgKGEKICAgICBiYWNrc2xhc2ggd2FzIG1pc3NpbmcpIHdlIHJlbW92ZSB0aGUgYnVnIHRvZ2V0aGVyIHdpdGggaXQncyBjb21wbGV0ZQogICAgIGNvbnRleHQgYmVjYXVzZSB0aGUgc3BlY2lhbCBjYXNlcyBvZiB0aGUgcGFzdCBjYW4gbm93IG5vIGxvbmdlciBvY2N1cgogICAgIGJlY2F1c2Ugb2YgdGhlIHJlY2VudCBtYWdpYyBmb3IgdGhlIC0td2l0aC1sYXlvdXQgZGVmYXVsdC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMzU5MAogCiAgKikgTWFrZSB0b3AtbGV2ZWwgTWFrZWZpbGUgYXdhcmUgb2YgYSBwYXJhbGxlbCBidWlsZCBwcm9jZWR1cmVzIChtYWtlIC1qKSBieQogICAgIG1ha2luZyBzdXJlIHRoZSBzcmMvc3VwcG9ydC8gdG9vbHMgYXJlIF9mb3JjZWRfIHRvIGJlIGJ1aWxkIGxhc3QgKHRoZXkKICAgICBkZXBlbmQgb24gb3RoZXIgbGlicmFyaWVzKS4KICAgICBbTWFya3VzIFRoZWlzc2luZ2VyIDxtYXJrdXMudGhlaXNzaW5nZXIgZ214LmRlPl0KCiAgKikgRml4IGluc3RhbGxhdGlvbiBwcm9jZWR1cmU6IE5vdyB0aGF0IG9zLWlubGluZS5jIGlzIGFjdHVhbGx5IHVzZWQgKGEKICAgICByZWNlbnRseSBmaXhlZCBidWcgcHJldmVudGVkIHRoaXMpIHdlIG5lZWQgdG8gYWxzbyBpbnN0YWxsIG9zLWluY2x1ZGUuYwogICAgIGluIGFkZGl0aW9uIHRvIG9zLmggaW50byB0aGUgUFJFRklYL2luY2x1ZGUvIGxvY2F0aW9uIG9yIGJ1aWxkaW5nIG9mCiAgICAgbW9kdWxlIERTT3Mgd2l0aCBBUFhTIGZhaWxzLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMzUyNwoKICAqKSBBZGRlZCBNT0RVTEVfTUFHSUNfQ09PS0lFIGFzIHRoZSBmaXJzdCBmaWVsZCBpbiBhIG1vZHVsZSBzdHJ1Y3R1cmUgdG8KICAgICBhbGxvdyB1cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgZ2FyYmxlZCBEU08gKG9yIGV2ZW4gYSBmaWxlIHdoaWNoIGlzbid0CiAgICAgYW4gQXBhY2hlIG1vZHVsZSBEU08gYXQgYWxsKSBhbmQgYSBEU08gd2hpY2ggZG9lc24ndCBtYXRjaCB0aGUgY3VycmVudAogICAgIEFwYWNoZSBBUEkuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMzMTUyCiAKICAqKSBUd28gbWlub3IgZW5oYW5jZW1lbnRzIHRvIG1vZF9yZXdyaXRlOiBGaXJzdCBSZXdyaXRlUnVsZSBub3cgYWxzbwogICAgIHN1cHBvcnRzIHRoZSBgYG5vY2FzZXxOQycnIGZsYWcgKGFzIFJld3JpdGVDb25kIGFscmVhZHkgZG9lcyBmb3IgYWdlcykgdG8KICAgICBtYXRjaCBjYXNlIGluc2Vuc2l0aXZlICh0aGlzIGVzcGVjaWFsbHkgYXZvaWRzIG5hc3R5IHBhdHRlcm5zIGxpa2UKICAgICBgW3RUXVtlRV1bc1NdW3RUXScpLiBTZWNvbmQgdHdvIGFkZGl0aW9uYWwgaW50ZXJuYWwgbWFwIGZ1bmN0aW9ucwogICAgIGBlc2NhcGUnIGFuZCBgdW5lc2NhcGUnIHdlcmUgYWRkZWQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXNjYXBlL3VuZXNjYXBlCiAgICAgdG8vZnJvbSBoZXgtZW5jb2RpbmdzIGluIFVSTHMgcGFydHMgKHRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaW4KICAgICBjb21iaW5hdGlvbiB3aXRoIG1hcCBsb29rdXBzKS4gCiAgICAgW01hZ251cyBCb2RpbiwgSWFuIEthbGxlbiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVuYW1lZCB0aGUgbWFjcm8gZXNjYXBlX3VyaSgpIHRvIGFwX2VzY2FwZV91cmkoKSB3aGljaCB3YXMKICAgICBmb3Jnb3R0ZW4gKGJlY2F1c2UgaXQgd2FzIGEgbWFjcm8pIGluIHRoZSBzeW1ib2wgcmVuYW1pbmcgcHJvY2Vzcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHNvbWUgaW5jb25zaXN0ZW5jaWVzIHJlbGF0ZWQgdG8gdGhlIHNjb3BlcyBvZiBkaXJlY3RpdmVzLiBUaGUgb25seQogICAgIHVzZXIgdmlzaWJsZSBjaGFuZ2UgaXMgdGhhdCB0aGUgZGlyZWN0aXZlcyBgVXNlQ2Fub25pY2FsTmFtZScgYW5kCiAgICAgYENvbnRlbnREaWdlc3QnIG5vdyB1c2UgdGhlIChtb3JlIGNvcnJlY3QpIGBPcHRpb25zJyBzY29wZSBpbnN0ZWFkIG9mCiAgICAgKGxlc3MgY29ycmVjdCkgYEF1dGhDb25maWcnIHNjb3BlLiAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFVzaW5nIERTTywgdGhlIFNlcnZlciB0b2tlbiB3YXMgYmVpbmcgbWFuZ2xlZC4gU3BlY2lmaWNhbGx5LCB0aGUKICAgICBtb2R1bGUncyB0b2tlbiB3YXMgYmVpbmcgYWRkZWQgZmlyc3QgYmVmb3JlIHRoZSBBcGFjaGUgdG9rZW4uIFRoaXMKICAgICBoYXMgYmVlbiBmaXhlZC4gW0ppbSBKYWdpZWxza2ldCgogICopIE1ham9yIG92ZXJoYXVsIG9mIG1vZF9uZWdvdGlhdGlvbi5jLCBwYXJ0IDIuCiAgICAgLSBwcm9wZXJseSBoYW5kbGUgImlkZW50aXR5IiB3aXRoaW4gQWNjZXB0LUVuY29kaW5nLgogICAgIC0gYWxsb3cgZW5jb2RlZCB2YXJpYW50cyBpbiBSVlNBIG5lZ290aWF0aW9uIGFuZCBsZXQgdGhlbSBhcHBlYXIgaW4KICAgICAgIHRoZSBBbHRlcm5hdGVzIGZpZWxkIHVzaW5nIHRoZSBub24tc3RhbmRhcmQgImVuY29kaW5nIiB0YWctbGlzdC4KICAgICAtIGZpeGVkIGJvdGggbmVnb3RpYXRpb24gYWxnb3JpdGhtcyBzbyB0aGF0IGFuIGV4cGxpY2l0bHkgYWNjZXB0ZWQKICAgICAgIGVuY29kaW5nIGlzIHByZWZlcnJlZCBvdmVyIG5vIGVuY29kaW5nIGlmICJpZGVudGl0eSIgaXMgbm90CiAgICAgICBpbmNsdWRlZCB3aXRoaW4gQWNjZXB0LUVuY29kaW5nLgogICAgIC0gYWRkZWQgYXBfYXJyYXlfcHN0cmNhdCgpIHRvIGFsbG9jLmMgZm9yIGVmZmljaWVudCBjb25jYXRlbmF0aW9uCiAgICAgICBvZiBsYXJnZSBzdWJzdHJpbmcgc2VxdWVuY2VzLgogICAgIC0gcmVwbGFjZWQgTyhuXjIpIG1lbW9yeSBob2dzIGluIG1vZF9uZWdvdGlhdGlvbiB3aXRoIGFwX2FycmF5X3BzdHJjYXQuCiAgICAgW1JveSBGaWVsZGluZ10KCiAgKikgTWFqb3Igb3ZlcmhhdWwgb2YgbW9kX25lZ290aWF0aW9uLmMsIHBhcnQgMS4KICAgICAtIGNsZWFudXBzIHRvIG1vZF9uZWdvdGlhdGlvbiBjb21tZW50cyBhbmQgY29kZSBzdHJ1Y3R1cmUKICAgICAtIG1hZGUgY29tcGxpYW50IHdpdGggSFRUUC8xLjEgcHJvcG9zZWQgc3RhbmRhcmQgKHJmYzIwNjgpIGFuZCBhZGRlZAogICAgICAgc3VwcG9ydCBmb3IgZXZlcnl0aGluZyBpbiB0aGUgdXBjb21pbmcgSFRUUC8xLjEKICAgICAgIHJldmlzaW9uIChkcmFmdC1pZXRmLWh0dHAtdjExLXNwZWMtcmV2LTA2LnR4dCkuCiAgICAgICAgIC0gbGFuZ3VhZ2UgdGFnIG1hdGNoaW5nIGFsc28gaGFuZGxlcyB0YWdzIHdpdGggbW9yZSB0aGFuIDIKICAgICAgICAgICBsZXZlbHMgbGlrZSB4LXktegogICAgICAgICAtIGVtcHR5IEFjY2VwdCwgQWNjZXB0LUxhbmd1YWdlLCBBY2NlcHQtQ2hhcnNldCBoZWFkZXJzIGFyZQogICAgICAgICAgIHByb2Nlc3NlZCBjb3JyZWN0bHk7IHByZXZpb3VzbHkgYW4gZW1wdHkgaGVhZGVyIHdvdWxkIG1ha2UgYWxsCiAgICAgICAgICAgdmFsdWVzIGFjY2VwdGFibGUgaW5zdGVhZCBvZiB1bmFjY2VwdGFibGUuCiAgICAgICAgIC0gYWxsb3dlZCBmb3IgcSB2YWx1ZXMgaW4gQWNjZXB0LUVuY29kaW5nCiAgICAgLSBhZGRlZCBzdXBwb3J0IGZvciB0cmFuc3BhcmVudCBjb250ZW50IG5lZ290aWF0aW9uIChyZmMyMjk1IGFuZAogICAgICAgcmZjMjI5NikgKHRob3VnaCB3ZSBkbyBub3QgaW1wbGVtZW50IGFsbCBmZWF0dXJlcyBpbiB0aGVzZSBkcmFmdHMsCiAgICAgICBlLmcuIG5vIGZlYXR1cmUgbmVnb3RpYXRpb24pLiAgUmVtb3ZlZCBvbGQgZXhwZXJpbWVudGFsIHZlcnNpb24uCiAgICAgLSBpbXBsZW1lbnRlZCAnc3RydWN0dXJlZCBlbnRpdHkgdGFncycgZm9yIGJldHRlciBjYWNoZSBjb3JyZWN0bmVzcwogICAgICAgKHN0cnVjdHVyZWQgZW50aXR5IHRhZ3MgZW5zdXJlIHRoYXQgY2FjaGVzIHdoaWNoIGNhbiBkZWFsIHdpdGggVmFyeQogICAgICAgd2lsbCAoZXZlbnR1YWxseSkgYmUgdXBkYXRlZCBpZiB0aGUgc2V0IG9mIHZhcmlhbnRzIG9uIHRoZSBzZXJ2ZXIKICAgICAgIGlzIGNoYW5nZWQpCiAgICAgICAgIC0gdGhpcyBpbnZvbHZlZCBhZGRpbmcgYSB2bGlzdF92YWxpZGF0b3IgZWxlbWVudCB0byByZXF1ZXN0X3JlYwogICAgICAgICAtIHRoaXMgaW52b2x2ZWQgYWRkaW5nIHRoZSBhcF9tYWtlX2V0YWcoKSBmdW5jdGlvbiB0byB0aGUgZ2xvYmFsIEFQSQogICAgIC0gbW9kaWZpZWQgZ3Vlc3Npbmcgb2YgY2hhcnNldHMgdXNlZCBieSBBcGFjaGUgbmVnb3RpYXRpb24gYWxnb3JpdGhtIAogICAgICAgdG8gZ3Vlc3MgJ25vIGNoYXJzZXQnIGlmIHRoZSB2YXJpYW50IGlzIG5vdCBhIHRleHQvKiB0eXBlCiAgICAgLSBhZGRlZCBjb2RlIHRvIHNvcnQgbXVsdGl2aWV3cyB2YXJpYW50cyBpbnRvIGEgY2Fub25pY2FsIG9yZGVyIHNvIHRoYXQKICAgICAgIG5lZ290aWF0aW9uIHJlc3VsdHMgYXJlIGNvbnNpc3RlbnQgYWNyb3NzIGJhY2t1cC9yZXN0b3JlcyBhbmQgbWlycm9ycwogICAgIC0gcmVtb3ZlZCBwb3NzaWJpbGl0eSBvZiBhIHR5cGUgbWFwIGZpbGUgcmVzb2x2aW5nIHRvIGFub3RoZXIgdHlwZSBtYXAKICAgICAgIGZpbGUgYXMgaXRzIGJlc3QgdmFyaWFudAogICAgIFtLb2VuIEhvbHRtYW4sIFJveSBGaWVsZGluZywgTGFycyBFaWxlYnJlY2h0XSBQUiMzNDUxLCAzMjk5LCAxOTg3CgogICopIFJGQzIzOTYgYWxsb3dzIHRoZSBzeW50YXggaHR0cDovL2hvc3Q6L3BhdGggKHdpdGggbm8gcG9ydCBudW1iZXIpCiAgICAgYnV0IHRoZSBwcm94eSBkaXNhbGxvd2VkIGl0IChhcF9wcm94eV9jYW5vbl9uZXRsb2MoKSkuCiAgICAgW0RhdmlkIEtyaXN0b2wgPGRtayBiZWxsLWxhYnMuY29tPl0gUFIjMzUzMAoKICAqKSBXaGVuIG1vZHVsZXMgdXBkYXRlL21vZGlmeSB0aGUgZmlsZSBuYW1lIGluIHRoZSBjb25maWdmaWxlX3Qgc3RydWN0dXJlLAogICAgIHN5bnRheCBlcnJvcnMgd2lsbCByZXBvcnQgdGhlIHVwZGF0ZWQgbmFtZSwgbm90IHRoZSBvcmlnaW5hbCBvbmUuCiAgICAgW0ZhYmllbiBDb2VsaG8gPGNvZWxobyBjcmkuZW5zbXAuZnI+XSBQUiMzNTczCgogICopIENvcnJlY3Qgc29tZSBmaWxlbmFtZSBjYXNlIGFzc3VtcHRpb25zIGZyb20gV0lOMzIgdG8KICAgICBDQVNFX0JMSU5EX0ZJTEVTWVNURU0uICBbQnJpYW4gSGF2YXJkIDxicmlhbmgga2hlbGRhci5hcGFuYS5vcmcuYXU+XQoKICAqKSBGb3IgJXYgbG9nIFNlcnZlck5hbWUgcmVnYXJkbGVzcyBvZiB0aGUgVXNlQ2Fub25pY2FsTmFtZQogICAgIHNldHRpbmcgKHNpbWlsYXJseSBmb3IgJXApLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBDb25maWd1cmUgd2FzIGluaXRpYWxpemluZyB0aGUgdmFyaWFibGVzICRPU0RJUiwgJElOQ0RJUiBhbmQgJFNIRUxMCiAgICAgcmF0aGVyIGxhdGUgKHRvbyBsYXRlIGZvciBzb21lIGludm9jYXRpb25zIG9mIFRlc3RDb21waWxlKS4KICAgICBUaGlzIGltcHJvdmVzIHRoZSBtYWtlIGVudmlyb25tZW50IGF2YWlsYWJsZSB0byBUZXN0Q29tcGlsZSBhbmQKICAgICB0aGUgKi5tb2R1bGUgc2NyaXB0cy4gW01hcnRpbiBLcmFlbWVyXQoKICAqKSBUaGUgaGFzaGJhbmcgZW11bGF0aW9uIGNvZGUgaW4gYXBfZXhlY3ZlLmMgd291bGQgaW50ZXJwcmV0CiAgICAgIyEvaGFzaGJhbmcvc2NyaXB0cyBjb3JyZWN0bHksIGJ1dCBmYWlsZWQgdG8gZmFsbCBiYWNrIHRvIGEKICAgICBzdGFuZGFyZCBzaGVsbCBmb3Igc2NyaXB0cyB3aGljaCBkaWQgTk9UIHN0YXJ0IHdpdGggIyEKICAgICBOb3cgU0hFTExfUEFUSCBpcyBzdGFydGVkIGluIHRoZXNlIGNhc2VzLiBbTWFydGluIEtyYWVtZXJdCgogICopIFBPUlQ6IEFkZGVkIHRoZSBDeWJlcmd1YXJkIFYyIHBvcnQgW1JpY2hhcmQgU3RhZ2cgPHN0YWdnIGxlbnRpbC5vcmc+XQogICAgIFBSIzMzMzYKCiAgKikgVXBkYXRlIEFQWFMgbWFudWFsIHBhZ2U6IHNvbWUgLXEgb3B0aW9uIGFyZ3VtZW50cyB3ZXJlIG1pc3NpbmcKICAgICBhbmQgYW5vdGhlciB3YXMgaW5jb3JyZWN0LiBbTWFyayBBbmRlcnNvbiA8bWRhIGRpc2Nlcm5pbmcuY29tPl0gUFIjMzU1MwoKICAqKSBDbGVhbnVwIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9uczogYC0/JyB3YXMgZG9jdW1lbnRlZCB0byBzaG93CiAgICAgdGhlIHVzYWdlIGxpc3QgYnV0IGRvZXMgaXQgd2l0aCBhbiBlcnJvciBiZWNhdXNlIGA/JyBpcyBub3QgYSB2YWxpZAogICAgIGNvbW1hbmQuIE9UT0ggYSBsb3Qgb2YgdXNlcnMgZXhwZWN0IGAtaCcgdG8gcHJpbnQgc3VjaCBhIHVzYWdlIGxpc3QgYW5kCiAgICAgaW5zdGVhZCBhcmUgYW5ub3llZCBmb3IgYWdlcyBieSBvdXIgaHVnZSB1bnJlYWRhYmxlIGxpc3Qgb2YgZGlyZWN0aXZlcy4KICAgICBTbyB3ZSBub3cgY2hhbmdlZCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgdGhpcyB3YXk6CiAgICAgMS4gYC1MJyA9PiBgLVInIAogICAgICAgIEludGVudDogd2UgbmVlZCBgLUwnIHRvIGJlIGZyZWUsIGFuZCBgLVInIGZvciB0aGUgRFNPIHJ1bi10aW1lIHBhdGggaXMKICAgICAgICB2ZXJ5IHNpbWlsYXIgdG8gdGhlIHBvcHVsYXIgbGlua2VyIG9wdGlvbi4KICAgICAyLiBgLWgnID0+IGAtTCcKICAgICAgICBJbnRlbnQ6IHdoaWxlIC1sIGdpdmVzIHRoZSBzbWFsbCBsaXN0IG9mIG1vZHVsZXMsIC1MIG5vdyBnaXZlcyB0aGUKICAgICAgICBsYXJnZSBsaXN0IG9mIGRpcmVjdGl2ZXMgaW1wbGVtZW50ZWQgYnkgdGhlc2UgbW9kdWxlcy4gIFRoaXMgaXMgYWxzbwogICAgICAgIGNvbnNpc3RlbnQgd2l0aCAtdiAoc2hvcnQgdmVyc2lvbiBpbmZvKSBhbmQgLVYgKGxhcmdlIHZlcnNpb24gaW5mbykuCiAgICAgMy4gYC0/JyA9PiBgLWgnIAogICAgICAgIEludGVudDogaXQncyBub3cgdGhlIGV4cGVjdGVkIG9wdGlvbiA7LSkKICAgICBUaGUgbWFudWFsIHBhZ2Ugd2FzIGFkanVzdGVkIGFjY29yZGluZ2x5LiAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjcxNAoKICAqKSBGaXhlZCBwcm9ibGVtIG9mIGZjbG9zZSgpIG9uIGFuIHVub3BlbmVkIGZpbGUgaW4gc3VleGVjIGlmIExPR19FWEVDCiAgICAgd2Fzbid0IGRlZmluZWQuICBbUmljayBGcmFuY2h1ayA8cmlja2YgdHJhbnNwZWN0Lm5ldD5dCgogICopIFJlbW92ZWQgcmVjZW50bHkgaW50cm9kdWNlZCBidWdzIGFuZCBkaXNmaWd1cmVtZW50cyBpbiBBUEFDSToKICAgICBvIGZpeGVkIGFyZ3VtZW50IGxpbmUgcHJvY2Vzc2luZzogdXNpbmcgJGFyZ3Mgd2FzIGJyb2tlbjogSXQgd2FzIG5vdAogICAgICAgaW5pdGlhbGl6ZWQgYW5kIHVzaW5nIGFyZ3M9IiRhcmdzICRhcGNfb3B0aW9uIiBhbmQgZXZlbiBhcmdzPSIkYXJncwogICAgICAgXCIkYXBjX29wdGlvblwiIiBmYWlscyBpbiB0aGUgc2Vjb25kIHByb2Nlc3Npbmcgcm91bmQgZm9yIGFueSBhcmd1bWVudHMKICAgICAgIGNvbnRhaW5pbmcgd2hpdGVzcGFjZXMuIFRoZSBvbmx5IGNvcnJlY3Qgd2F5IGlzIHRvIHVzZSB0aGUgY29uc3RydWN0CiAgICAgICAiJEAiIChidXQgbm90IHBvc3NpYmxlIGhlcmUpIG9yIGl0ZXJhdGUgX2JvdGhfIHRpbWVzIG92ZXIgdGhlIGltcGxpY2l0CiAgICAgICBhcmd1bWVudCBsaW5lIChubyBhcmd1bWVudCB0byBmb3ItbG9vcCkgd2hpY2ggaXMgd2hhdCB3ZSBub3cgdXNlLgogICAgIG8gbWFrZSAtLXdpdGgtbGF5b3V0PUFwYWNoZSB0aGUgZGVmYXVsdCB3aXRob3V0IGNyZWF0aW5nCiAgICAgICByZWR1bmRhbmN5IChjb3B5aW5nIHRoZSAtLXdpdGgtbGF5b3V0IGJsb2NrIGluIHRoZSBhcmd1bWVudCBwYXJzaW5nCiAgICAgICBsb29wKS4gIFdlIGFjaGlldmUgdGhpcyBieSB1c2luZyB0aGUgIiRAIiBjb25zdHJ1Y3QgdG9nZXRoZXIgd2l0aCB0aGUKICAgICAgIGBzZXQnIGNvbW1hbmQgdG8gcHJlcGVuZCAtLXdpdGgtbGF5b3V0PUFwYWNoZSB0byB0aGUgY29tbWFuZCBsaW5lIGluCiAgICAgICBjYXNlIC0td2l0aC1sYXlvdXQgaXMgbm90IHVzZWQuCiAgICAgbyBmaXhlZCBhdXRvLXN1ZmZpeCBoYW5kbGluZyBub3cgdGhhdCBjb25maWcubGF5b3V0IGV4aXN0cy4KICAgICAgIFBhdGhzIHdoaWNoIGFyZSBhdXRvLXN1ZmZpeGVkIGFyZSBtYXJrZWQgd2l0aCBhIHRyYWlsaW5nIHBsdXMgc2lnbiBpbgogICAgICAgY29uZmlnLmxheW91dCBhbmQgZXZlcnkgcGF0aCBub3cgY2FuIGJlIG1hcmtlZCB0aGlzIHdheSAobm90IG9ubHkgdGhlCiAgICAgICBmb3VyIHBhdGhzIGZvciB3aGljaCB3ZSBkbyBpdCBjdXJyZW50bHkpLiAgQWRkaXRpb25hbGx5IHRoZSBzdWZmaXggaXMKICAgICAgIG5vIGxvbmdlciBhIHN0YXRpYyBvbmUuIEluc3RlYWQgaXQncyBub3cgYC88dGFyZ2V0Picgd2hlcmUgPHRhcmdldD4gaXMKICAgICAgIHRoZSBhcmd1bWVudCBvZiB0aGUgLS10YXJnZXQgb3B0aW9uIG9yIHBlciBkZWZhdWx0IGBodHRwZCcuCiAgICAgbyBhbGxvdyBhbHNvIHRhYnMgKGFuZCBvbmx5IHNwYWNlcykgd2hlcmUgd2UgbWF0Y2ggd2hpdGVzcGFjZXMKICAgICBvIHZhcmlvdXMgZml4ZXMgYW5kIGNsZWFudXBzIHJlbGF0ZWQgdG8gdXNlZCBzaGVsbCBjb2Rpbmcgc3R5bGUKICAgICBvIG1hZGUgSmltIGhhcHB5IGJ5IHJlcGxhY2luZyBgV3JpdHRlbiBieScgd2l0aCBgSW5pdGlhbGx5IHdyaXR0ZW4gYnknIDstKQogICAgIG8gdHJpbW1lZCBvdXRwdXQgb2YgLS1oZWxwIHRvIGZpdCBpbnRvIDgwIGNvbHVtbnMKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkZWQgdHdvIG5ldyBjb3JlIEFQSSBmdW5jdGlvbnMsIGFwX3NpbmdsZV9tb2R1bGVfY29uZmlndXJlKCkgYW5kCiAgICAgYXBfc2luZ2xlX21vZHVsZV9pbml0KCksIHdoaWNoIGFyZSBub3cgdXNlZCBieSBtb2Rfc28gdG8gY29uZmlndXJlIGEgbW9kdWxlCiAgICAgYWZ0ZXIgbG9hZGluZy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFBPUlQ6IEFkZCBkZWZpbmVzIGZvciBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQgYW5kCiAgICAgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUIHRvIE5ldEJTRC9PcGVuQlNEIHNlY3Rpb24KICAgICBvZiBhcF9jb25maWcuaCB0byBhbGxvdyBzZXJpYWxpemVkIGFjY2VwdCBmb3IgbXVsdGlwb3J0IGxpc3RlbnMuCiAgICAgW1JveSBGaWVsZGluZywgQ3VydCBTYW1wc29uXSBQUiMzMTIwCgogICopIFBPUlQ6IEZpeGVkIGEgbWlzcGxhY2VkICNlbmRpZiBmb3IgTmV0QlNEL09wZW5CU0Qgc2VjdGlvbgogICAgIG9mIGFwX2NvbmZpZy5oIHRoYXQgd291bGQgc2tpcCBzZXZlcmFsIGRlZmluZXMgaWYgREVGQVVMVF9HUk9VUAogICAgIHdhcyBvdmVycmlkZGVuLiBbUm95IEZpZWxkaW5nXQoKICAqKSBQT1JUOiBUaGUgSTg2IHZlcnNpb24gb2YgREdVWCBoYXMgc3VwcG9ydCBmb3Igc3RybmNhc2VjbXAgYW5kIAogICAgIHN0cmNhc2VjbXAsIHNvIGFsbG93IGl0IGluIGFwX2NvbmZpZy5oLiBbQW1pZWwgTGVlIFllZV0gUFIjMzI0NwoKICAqKSBGaXggb3JkZXJpbmcgb2YgZGVmaW5pdGlvbnMgaW4gYXBfY29uZmlnLmggc28gdGhhdCBhcF9pbmxpbmUgaXMKICAgICBkZWZpbmVkIGJlZm9yZSBpdCBtaWdodCBiZSB1c2VkLiBbVmljdG9yIEtoaW1lbmtvXQoKICAqKSBQT1JUOiBBZGQgRHluYW1pYyBTaGFyZWQgT2JqZWN0IChEU08pIHN1cHBvcnQgZm9yIEJTREkgKHY0LjApLgogICAgIFtUb20gU2Vya293c2tpIDx0a3MgYnNkaS5jb20+XSBQUiMzNDUzCgogICopIE1ha2UgZ2VuZXJhdGlvbiBvZiBzcmMvQ29uZmlndXJhdGlvbi5hcGFjaSBtb3JlIHJvYnVzdDogSXQgZmFpbGVkIHRvCiAgICAgZGlmZmVyZW5jaWF0ZSBiZXR3ZWVuIG1vZHVsZXMgd2hlbiBvbmUgbW9kdWxlIG5hbWUgd2FzIGEgcG9zdGZpeCBvZgogICAgIGFub3RoZXIgKGUuZy4gY2dpIHZzLiBmYXN0Y2dpKS4gV2Ugbm93IGNoZWNrIGZvciBtb2RfWFhYLCBsaWJYWFggYW5kIGV2ZW4KICAgICBqdXN0IFhYWCAodGhpbmsgYWJvdXQgdG90YWxseSBub24tc3RhbmRhcmQgbmFtZXMgbGlrZSAiYXBhY2hlX3NzbCIsIHRvbykuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzMzODAKCiAgKikgSW4gc3JjL0NvbmZpZ3VyZSByZW1vdmUgdGhlIFNFUlZFUl9TVUJWRVJTSU9OIHN1cHBvcnQgKGFscmVhZHkgZGVwcmVjYXRlZAogICAgIHNpbmNlIDEuM2I3KSBhbmQgbWFrZSB3aGl0ZXNwYWNlIGhhbmRsaW5nIG1vcmUgcm9idXN0IChpdCBmYWlsZWQgaG9ycmlibGUKICAgICB3aGVuIHdoaXRlc3BhY2VzIHdlcmUgcHJlc2VudCBpbiB0aGUgYXJndW1lbnRzIG9mIC1EIG9wdGlvbnMpLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMzMjQwCgogICopIEFkZCBBUEFDSSAtLXNoYWRvdz1ESVIgdmFyaWFudCAoaW4gYWRkaXRpb24gdG8gLS1zaGFkb3cpLiBUaGlzIG5vdyBmaXJzdAogICAgIGNyZWF0ZXMgYW4gZXh0ZXJuYWwgcGFja2FnZSBzaGFkb3cgdHJlZSBpbiBESVIgYmVmb3JlIHRoZSBsb2NhbCBidWlsZAogICAgIHNoYWRvdyB0cmVlIGlzIGdlbmVyYXRlZCB1bmRlciBESVIuIFRoaXMgd2F5IG9uZSBjYW4gaGF2ZSB0aGUgZXh0cmFjdGVkCiAgICAgQXBhY2hlIGRpc3RyaWJ1dGlvbiB0cmVlIHJlYWQtb25seSBvbiBORlMgb3IgQ0RST00gYW5kIHN0aWxsIGJ1aWxkIEFwYWNoZQogICAgIGZyb20gdGhlc2Ugc291cmNlcy4gQW4gYXV0b21hdGljYWxseSB0cmlnZ2VyZWQgVlBBVEgtbGlrZSBtZWNoYW5pc20gaXMKICAgICBwcm92aWRlZCB0aHJvdWdoIHRoZSBUT1AgdmFyaWFibGUsIHRvby4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgV2lsZnJlZG8gU2FuY2hleiA8d3NhbmNoZXogYXBwbGUuY29tPl0KCiAgKikgRml4IG5lZ290aWF0aW9uIHNvIHRoYXQgYSBWYXJ5IHJlc3BvbnNlIGhlYWRlciBpcyBjb3JyZWN0bHkgCiAgICAgZ2VuZXJhdGVkIHdoZW4sIGZvciBhIHBhcnRpY3VsYXIgZGltZW5zaW9uLCB2YXJpYW50cyBvbmx5IHZhcnkKICAgICBpbiBoYXZpbmcgb3Igbm90IGhhdmluZyBhIHZhbHVlIGZvciB0aGF0IGRpbWVuc2lvbi4gW1BhdWwgU3V0dG9uXQoKICAqKSBGaXggbmVnb3RpYXRpb24gc28gdGhhdCB3ZSBwcmVmZXIgYW4gZW5jb2RlZCB2YXJpYW50IG92ZXIgYW4KICAgICB1bmVuY29kZWQgdmFyaWFudCBpZiB0aGUgdXNlci1hZ2VudCBleHBsaWNpdGx5IHNheXMgaXQgY2FuCiAgICAgYWNjZXB0IHRoYXQgZW5jb2RpbmcuIFByZXZpb3VzbHkgd2UgYWx3YXlzIHByZWZlcnJlZCB0aGUgdW5lbmNvZGVkCiAgICAgdmFyaWFudC4KICAgICBbUGF1bCBBdXNiZWNrIDxwYXVsYSBhbHVtbmkuY3NlLnVjc2MuZWR1PiwgUGF1bCBTdXR0b25dIFBSIzM0NDcKIAogICopIEZpeCBBUFhTIHRvb2w6IHF1ZXJ5IHZhcmlhYmxlcyBMSUJTX1NITElCIGFuZCBUQVJHRVQgd2VyZSBub3QgcmVjb2duaXplZAogICAgIGFuZCB0aGUgdXNhZ2UgcGFnZSB3YXMgaW5jb25zaXN0ZW50IHdpdGggdGhlIGZ1bmN0aW9uYWxpdHkgYW5kIG1hbnBhZ2UuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFsbG93IHNwZWNpYWwgb3B0aW9ucyAtV2MseHh4IGFuZCAtV2wseHh4IG9uIEFQWFMgY29tcGlsZS9saW5rIGNvbW1hbmQuCiAgICAgVGhleSBjYW4gb2NjdXIgbXVsdGlwbGUgdGltZXMgYW5kIHRoZWlyIGFyZ3VtZW50cyAoYHh4eCcpIGFyZSBwYXNzZWQgQVMKICAgICBJUyB0byB0aGUgY29tcGlsZXIvbGlua2VyIGNvbW1hbmQuICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4ZWQgcG9zc2libGUgKGJ1dCBoYXJtbGVzcyBpbiBwcmFjdGljZSkgYnVnIGluIHRoZSBEQk0gbG9va3VwCiAgICAgcHJvY2VkdXJlIG9mIG1vZF9yZXdyaXRlOiB2ZXJ5IGxvbmcga2V5cyB3ZXJlIHRydW5jYXRlZC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkZWQgYSBnZW5lcmljIC0td2l0aC1sYXlvdXQ9W0ZJTEU6XUlEIG9wdGlvbi4gSUQgaGVyZSBpcyBhIGxheW91dAogICAgIGlkZW50aWZpZXIsIGN1cnJlbnRseSAiQXBhY2hlIiBhbmQgIkdOVSIgYXJlIHByZS1kZWZpbmVkIGluIHRoZSBmaWxlCiAgICAgY29uZmlnLmxheW91dC4gIEN1c3RvbSBsYXlvdXRzIGFyZSBwb3NzaWJsZSBieSB1c2luZyBGSUxFOklEIGFzIHRoZQogICAgIGFyZ3VtZW50IHdoZXJlIHRoZSBsYXlvdXQgSUQgaXMgdGFrZW4gZnJvbSBGSUxFLgoKICAgICBUaGUgY29uZmlnLmxheW91dCBmaWxlIGNvbnNpc3RzIG9mIDxMYXlvdXQgSUQ+Li48L0xheW91dD4gc2VjdGlvbnMKICAgICB3aGVyZSBpbnNpZGUgdGhvc2Ugc2VjdGlvbnMgInBhdGhfdmFyaWFibGU6IHBhdGhfdmFsdWUiIHBhaXJzIGNhbiBiZQogICAgIHNwZWNpZmllZC4gVGhlc2UgbGluZXMgYXJlIGNvbnZlcnRlZCB0byBwYXRoX3ZhcmlhYmxlPSdwYXRoX3ZhbHVlJy4KCiAgKikgQWRkIGEgRGVmYXVsdExhbmd1YWdlIGRpcmVjdGl2ZSBzbyB0aGF0IGZpbGVzIG1pc3NpbmcgYSBsYW5ndWFnZQogICAgIGV4dGVuc2lvbiAoZS5nLiwgLmZyLCAuZGUpIGNhbiBiZSBsYWJlbGxlZCBhcyBiZWluZyBzb21lIG90aGVyCiAgICAgZGVmYXVsdCBsYW5ndWFnZS4gRGVmYXVsdExhbmd1YWdlIGNhbiBhcHBlYXIgaW4gPERpcmVjdG9yeT4gYW5kIAogICAgIDxGaWxlcz4gY29udGFpbmVycyBhcyB3ZWxsIGFzIC5odGFjY2VzcyBmaWxlcy4gIFtQYXVsIFN1dHRvbl0KICAgICBQUiMxMTgwCgogICopIEZpeCBUQVJHRVQgY29uZmlndXJhdGlvbiB3aGVuIGNvbmZpZ3VyaW5nIGFuZCBpbnN0YWxsaW5nIHVzaW5nCiAgICAgQVBBQ0kgY29uZmlndXJlLiBUQVJHRVQgbm93IGRlZmluZXMgdGhlIGJhc2VuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uCiAgICAgZmlsZSwgc3RhcnR1cCBzY3JpcHQsIG1hbnVhbCBwYWdlLCBldGMuIGxvZ19lcnJvcl9jb3JlKCkgbm93IHJlcG9ydHMKICAgICB0aGUgc2VydmVyIGJpbmFyeSBuYW1lIGdpdmVuIGJ5IGFyZ3ZbMF0uIFRBUkdFVCBjYW4gbm93IGFsc28gYmUgZGVmaW5lZAogICAgIHdpdGggLS10YXJnZXQ9VEFSR0VUIHBhcmFtZXRlciBwYXNzZWQgdG8gQVBBQ0kgY29uZmlndXJlLgogICAgIFtSYWxmIEVuZ2Vsc2NoYWxsLCBSYW5keSBUZXJidXNoXQoKICAqKSBtb2RfaW5jbHVkZS5jOmhhbmRsZV9wZXJsKCkgbm93IHByb3Blcmx5IHRlc3RzIGZvciBPUFRfSU5DTk9FWEVDCiAgICAgcmF0aGVyIHRoYW4gT1BUX0lOQ0xVREVTIFtSYWluZXIgU2Nob2VwZiA8c2Nob2VwZiB1bmktbWFpbnouZGU+XQoKICAqKSBhcF9tZDVfYmluYXJ5KCkgd2FzIHVzaW5nIHNwcmludGYoKSByYXRoZXIgdGhhbiBhIHRhYmxlIGxvb2t1cAogICAgIHRvIGNvbnZlcnQgYmluYXJ5IGJ5dGVzIHRvIGhleCBkaWdpdHMuCiAgICAgW1JvbmFsZCBUc2NoYWzkciA8cm9uYWxkIGlubm92YXRpb24uY2g+XSBQUiMzNDA5CgogICopIEZpeCBTRUdWIGluIFRDTiBuZWdvdGlhdGlvbiBpZiBubyB2YXJpYW50cyBhcmUgYWNjZXB0YWJsZS4KICAgICBbTWFydGluIFBsZWNoc21pZCA8cGxlY2hzbWkga2FybGluLm1mZi5jdW5pLmN6Pl0gUFIjMTk4NwoKICAqKSBBUEk6IGFwX2V4aXN0c19jb25maWdfZGVmaW5lKCkgZnVuY3Rpb24gaXMgbm93ICJwdWJsaWMiIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIEZpeCBkb2N1bWVudGF0aW9uIG9mIGBBY3Rpb24nIGRpcmVjdGl2ZTogSXQgY2FuIGFjdGl2YXRlIGEgQ0dJIHNjcmlwdAogICAgIHdoZW4gZWl0aGVyIGEgaGFuZGxlciBvciBhIE1JTUUgY29udGVudCB0eXBlIGlzIHRyaWdnZXJlZCBieSB0aGUgcmVxdWVzdC4KICAgICBbQW5kcmV3IFBpbWxvdHQgPHBpbWxvdHQgbWF0aC5oYXJ2YXJkLmVkdT5dIFBSIzMzNDAKCiAgKikgRG9jdW1lbnQgdGhlIGBhZGQnIGNvbW1hbmQgb2YgYGRibW1hbmFnZScgaW4gYGRibW1hbmFnZS4xJyBtYW5wYWdlLgogICAgIFtEYXZpZCBNYWNLZW56aWUgPGRqbSB1dS5uZXQ+XSBQUiMzMzk0CgogICopIElnbm9yZSBhICJFcnJvckRvY3VtZW50IDQwMSIgZGlyZWN0aXZlIHdpdGggYSBmdWxsIFVSTCBhbmQgd3JpdGUgYQogICAgIG5vdGljZSB0byB0aGUgZXJyb3IgbG9nLiBJdCBpcyBub3QgcG9zc2libGUgdG8gc2VuZCBhIDQwMSByZXNwb25zZQogICAgIGFuZCBhIHJlZGlyZWN0IGF0IHRoZSBzYW1lIHRpbWUuICBbTGFycyBFaWxlYnJlY2h0XQoKICAqKSBGYWxsYmFjayB0byBuYXRpdmUgY29tcGlsZXJzIGZvciBJUklYLTMyIHBsYXRmb3JtLiBJdCBzZWVtcyB0aGF0CiAgICAgYSBnY2MgMi44LjEgY29tcGlsZWQgYXBhY2hlIGlzIGxvZ2dpbmcgY2xpZW50IGFkZHJlc3NlcyB3aXRoIGFsbAogICAgIGJpdHMgc2V0ICgyNTUuMjU1LjI1NS4yNTUpLiBUaGlzIGlzIHRoZSBzZWNvbmQgc3VjaCBwcm9ibGVtIGNhdXNlZAogICAgIGJ5IGdjYyAyLjguMSBjb21waWxlci4gVGhlIGZpcnN0IGJlaW5nIGJyb2tlbiBzZW1hcGhvcmUgbG9ja2luZy4KICAgICBbUmFuZHkgVGVyYnVzaF0KCiAgKikgVXBkYXRlZCBtaW1lLnR5cGVzIHRvIHJlZmxlY3QgY3VycmVudCBJbnRlcm5ldCBtZWRpYSB0eXBlcwogICAgIGFuZCBpbmNsdWRlIGEgVVJMIHRvIHRoZSByZWdpc3RyeS4KICAgICBbTWFub2ogS2FzaWNoYWludWxhLCBSb3kgRmllbGRpbmddIFBSIzIzODAsIDIyODYsIDIyNDYKCiAgKikgU0VDVVJJVFk6IERvIGEgbW9yZSBjb21wbGV0ZSBjaGVjayBpbiBtb2RfaW5jbHVkZSB0byBhdm9pZCAKICAgICBhbiBpbmZpbml0ZSBsb29wIG9mIHJlY3Vyc2l2ZSBTU0kgaW5jbHVkZXMuICBbTWFyYyBTbGVta29dIFBSIzMzMjMKCiAgKikgQWRkIEFQQUNJIC0tc3VleGVjLWRvY3Jvb3QgYW5kIC0tc3VleGVjLWxvZ2ZpbGUgb3B0aW9ucyB3aGljaCBjYW4gYmUKICAgICB1c2VkIHRvIHNldCB0aGUgZG9jdW1lbnQgcm9vdCBkaXJlY3RvcnkgKERPQ19ST09UKSBhbmQgdGhlIHN1ZXhlYwogICAgIGxvZ2ZpbGUgKExPR19FWEVDKSwgcmVzcGVjdGl2ZWx5LiBBZGRpdGlvbmFsbHkgdGhlIC0tbGF5b3V0IG9wdGlvbgogICAgIHdhcyBjaGFuZ2VkIHRvIHNob3cgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VFWEVDIHNldHVwLgogICAgIFtMYXJzIEVpbGVicmVjaHRdIFBSIzMzMTYsIDMzNTcsIDMzNjEKCiAgKikgQWRkZWQgdGhlIGxhc3QgdHdvIFdlYkRBViBzdGF0dXMgY29kZXMgb2YgNDI0IChGYWlsZWQgRGVwZW5kZW5jeSkKICAgICBhbmQgNTA3IChJbnN1ZmZpY2llbnQgU3RvcmFnZSkgZm9yIHVzZSBieSB0aGlyZC1wYXJ0eSBtb2R1bGVzLgogICAgIFtSb3kgRmllbGRpbmddCgogICopIEVuYWJsZWQgYWxsIG9mIHRoZSBXZWJEQVYgbWV0aG9kIG5hbWVzIGZvciB1c2UgYnkgdGhpcmQtcGFydHkKICAgICBtb2R1bGVzLCBMaW1pdCwgYW5kIFNjcmlwdCBkaXJlY3RpdmVzLiAgVGhhdCBpbmNsdWRlcyBQQVRDSCwKICAgICBQUk9QRklORCwgUFJPUFBBVENILCBNS0NPTCwgQ09QWSwgTU9WRSwgTE9DSywgYW5kIFVOTE9DSy4KICAgICBJbXByb3ZlZCBtb2RfYWN0aW9ucy5jIHNvIHRoYXQgaXQgY2FuIHVzZSBhbnkgb2YgdGhlIG1ldGhvZHMKICAgICBkZWZpbmVkIGluIGh0dHBkLmguICBBZGRlZCBhcF9tZXRob2RfbnVtYmVyX29mKG1ldGhvZCkgZm9yCiAgICAgZ2V0dGluZyB0aGUgaW50ZXJuYWwgbWV0aG9kIG51bWJlci4gIFtSb3kgRmllbGRpbmddCgogICopIFBPUlQ6IEFkZCBhIHBvcnQgdG8gdGhlIFRQRiBPUy4gW0pvZSBNb2VuaWNoIDxtb2VuaWNoIHVzLmlibS5jb20+IGFuZAogICAgIG90aGVycyBhdCBJQk1dCgogICopIEZpeCBwcm9ibGVtcyB3aXRoIGhhbmRsaW5nIG9mIFVOQyBuYW1lcyAoZS5nLiwgXFxob3N0XHBhdGgpCiAgICAgb24gV2luMzIuICBbS2VuIFBhcnp5Z25hdCA8a3BhcnogdXMuaWJtLmNvbT5dCgogICopIFJld29yayBvc19jYW5vbmljYWxfKigpIG9uIFdpbjMyIHNvIGl0J3Mgc2ltcGxlciwgbW9yZQogICAgIHJvYnVzdCwgYW5kIHdvcmtzLiAgW0tlbiBQYXJ6eWduYXQgPGtwYXJ6IHVzLmlibS5jb20+XQogICAgIFBSIzI1NTUsIDI5MTUsIDMwNjQsIDMyMzIKCiAgKikgV29yayBhcm91bmQgaW5jb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBzdHJmdGltZSBvbiBXaW4zMi4KICAgICBbTWFub2ogS2FzaWNoYWludWxhLCBLZW4gUGFyenlnbmF0IDxrcGFyeiB1cy5pYm0uY29tPl0KCiAgKikgTW92ZSBhIHR5cGVkZWYgdG8gZml4IGNvbXBpbGUgcHJvYmxlbXMgb24gTGludXggd2l0aCAxLngga2VybmVscy4KICAgICBbTWFub2ogS2FzaWNoYWludWxhXSBQUiMzMTc3CgogICopIFBPUlQ6IEFkZCBhIHBvcnQgdG8gdGhlIENvbmN1cnJlbnQgUG93ZXJNQVggT1MuIFtUb20gSG9yc2xleQogICAgIDxUb20uSG9yc2xleSBtYWlsLmNjdXIuY29tPl0KCiAgKikgV0lOMzI6IExvZyBtb3JlIGV4cGxpY2l0IGVycm9yIG1lc3NhZ2VzIGlmIHNwYXduaW5nIGFuIGludGVycHJldGVkIAogICAgIHNjcmlwdCBmYWlsZWQsIGluY2x1ZGluZyB0aGUgY29tbWFuZCBsaW5lIHVzZWQgdG8gYXR0ZW1wdCB0byBleGVjdXRlIAogICAgIHRoZSBpbnRlcnByZXRlciBhbmQgdGhlIFdpbjMyIGVycm9yIGNvZGUgcmV0dXJuZWQuICBbTWFyYyBTbGVta29dCgogICopIERpc2FibGUgc2VuZGluZyBvZiBlcnJvci1ub3RlcyBvbiBhIDUwMCAoSW50ZXJuYWwgU2VydmVyIEVycm9yKSByZXNwb25zZQogICAgIHNpbmNlIGl0IG9mdGVuIGluY2x1ZGVzIGZpbGUgcGF0aCBpbmZvLiAgRW5hYmxlIHNlbmRpbmcgb2YgZXJyb3Itbm90ZXMKICAgICBvbiBhIDUwMSAoTWV0aG9kIE5vdCBJbXBsZW1lbnRlZCkuICBbUm95IEZpZWxkaW5nXSBQUiMzMTczCgogICopIGh0dHBfY29uZmlnLmMgd291bGQgcmVzcG9uZCB3aXRoIDUwMSAoTWV0aG9kIE5vdCBJbXBsZW1lbnRlZCkgaWYgYQogICAgIGNvbnRlbnQgdHlwZSBoYW5kbGVyIHdhcyBzcGVjaWZpZWQgYnV0IGNvdWxkIG5vdCBiZSBmb3VuZCwgd2hpY2gKICAgICBzaG91bGQgaGF2ZSBiZWVuIGEgNTAwIHJlc3BvbnNlLiAgTGlrZXdpc2UsIG1vZF9wcm94eS5jIHdvdWxkIHJlc3BvbnNkCiAgICAgd2l0aCBhIDUwMSBpZiB0aGUgVVJJIHNjaGVtZSBpcyB1bnJlY29nbml6ZWQgaW5zdGVhZCBvZiB0aGUgY29ycmVjdAogICAgIHJlc3BvbnNlIG9mIDQwMyAoRm9yYmlkZGVuKS4gIFtSb3kgRmllbGRpbmddCgogICopIFNFQ1VSSVRZOiBFbGltaW5hdGUgRG9TIGF0dGFjayB3aGVuIGEgYmFkIFVSSSBwYXRoIGNvbnRhaW5zIHdoYXQKICAgICBsb29rcyBsaWtlIGEgcHJpbnRmIGZvcm1hdCBlc2NhcGUuICBbTWFyYyBTbGVta28sIFN0dWRlbnRlbiBOZXQgVHdlbnRlXQoKICAqKSBGaXggaW4gbW9kX2F1dG9pbmRleDogZm9yIGZpbGVzIHdoZXJlIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgc3RhbXAgd2FzCiAgICAgdW5hdmFpbGFibGUsIGFuIGVtcHR5IHN0cmluZyB3YXMgcHJpbnRlZCB3aGljaCB3YXMgMiBieXRlcyBzaG9ydC4KICAgICBUaGUgc2l6ZSBhbmQgZGVzY3JpcHRpb24gY29sdW1ucyB3ZXJlIHRoZXJlZm9yZSBub3QgYWxpZ25lZCBjb3JyZWN0bHkuCiAgICAgW01hcnRpbiBLcmFlbWVyXSAobm8gUFIjKQoKICAqKSBVcGRhdGUgQlMyMDAwIE9TIGNvZGUgdG8gd29yayB3aXRoIHJlY2VudCB2ZXJzaW9ucy4gU3RhcnRpbmcgd2l0aAogICAgIHJlbGVhc2UgQTE3LCB0aGUgY2hpbGQgZm9yaygpIG11c3QgYmUgcmVwbGFjZWQgYnkgYSBfcmZvcmsoKS4KICAgICAoQlMyMDAwIG9ubHkpIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgQWRkIHRoZSBhY3R1YWwgc2VydmVyX3JlYyBzdHJ1Y3R1cmUgb2YgdGhlIHNwZWNpZmljIFZob3N0IHRvIHRoZQogICAgIHNjb3JlYm9hcmQgZmlsZSBhbmQgYXZvaWQgYSBzdHJpbmcgY29weSAoYXMgd2VsbCBhcyBhbGxvdyBzb21lCiAgICAgZnVydGhlciBmdXR1cmUgZW5oYW5jZW1lbnRzKS4gW0hhcnJpZSBIYXpld2lua2VsCiAgICAgPGhhcnJpZS5oYXpld2lua2VsIGpyYy5pdD5dCgogICopIEFkZCBBUEFDSSAtLXBlcm11dGUtbW9kdWxlPWZvbzpiYXIgb3B0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvCiAgICAgb24tdGhlLWZseS9iYXRjaCBwZXJtdXRlIHRoZSBvcmRlciBvZiB0d28gbW9kdWxlcyAobW9kX2ZvbyBhbmQgbW9kX2JhcikKICAgICBpbiB0aGUgQ29uZmlndXJhdGlvblsuYXBhY2ldIGZpbGUuIFR3byBzcGVjaWFsIGFuZCBpbXBvcnRhbnQgdmFyaWFudHMgYXJlCiAgICAgc3VwcG9ydGVkIGZvciB0aGUgb3B0aW9uIGFyZ3VtZW50OiBmaXJzdCBCRUdJTjpmb28gd2hpY2ggcGVybXV0ZXMgbW9kdWxlCiAgICAgbW9kX2ZvbyB3aXRoIHRoZSBiZWdpbiBvZiB0aGUgbW9kdWxlIGxpc3QsIGkuZS4gaXQgYG1vdmVzJyB0aGUgbW9kdWxlIHRvCiAgICAgdGhlIGJlZ2luIG9mIHRoZSBsaXN0IChnaXZlcyBpdCBsb3dlc3QgcHJpb3JpdHkpLiAgQW5kIHNlY29uZCBmb286RU5ECiAgICAgd2hpY2ggcGVybXV0ZXMgbW9kX2ZvbyB3aXRoIHRoZSBlbmQgb2YgdGhlIG1vZHVsZSBsaXN0LCBpLmUuIGl0IGBtb3ZlcycKICAgICB0aGUgbW9kdWxlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgKGdpdmVzIGl0IGhpZ2hlc3QgcHJpb3JpdHkpLiAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHByb2JsZW0gd2l0aCAnYXBhY2hlIC1rIHNodXRkb3duJyBhbmQgc3RhcnR1cCBldmVudAogICAgIHN5bmNocm9uaXNhdGlvbiAoV2luMzIpLiAgW0tlbiBQYXJ6eWduYXQgPGtwYXJ6IHJhbGVpZ2guaWJtLmNvbT5dCiAgICAgUFIjMzI1NQoKICAqKSBUaGUgY29uZmlnIHBhcnNlciB3YXNuJ3QgY29ycmVjdGx5IG5vdGljaW5nIGEgbWlzc2luZyAnPicKICAgICBvbiBjb250YWluZXIgc3RhcnQgbGluZXMgKGUuZy4sIGl0IHdvdWxkbid0IHNwb3QKICAgICAiPERpcmVjdG9yeSAvIiBhcyBhIHN5bnRheCBlcnJvcikuICBbUnlhbiBCbG9vbSA8cmJibG9vbSB1cy5pYm0uY29tPl0KICAgICBQUiMzMjc5CgogICopIEFkZCBhICdSZW1vdmVIYW5kbGVyJyBkaXJlY3RpdmUgd2hpY2ggd2lsbCBzZWxlY3RpdmVseSByZW1vdmUKICAgICBhbGwgaGFuZGxlciBhc3NvY2lhdGlvbnMgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZSBleHRlbnNpb25zLgogICAgIFtSeWFuIEJsb29tIDxyYmJsb29tIHVzLmlibS5jb20+XSBQUiMxNzk5LgoKICAqKSBQcm9wZXJseSBoYW5kbGUgJiBhbGxvdyAibnVsIiBhbmQgIi4qL251bGwiIGluIEFjY2Vzc0NvbmZpZyBhbmQKICAgICBSZXNvdXJjZUNvbmZpZyBkaXJlY3RpdmVzIG9uIFdpbjMyLiAgQWxzbyBhZGQgYSBub3RlIHRvIHRoZSBlZmZlY3QKICAgICBvZiAndXNlbGVzcyBVc2VyIGRpcmVjdGl2ZSBpZ25vcmVkIG9uIFdpbjMyJyB0byB0aGUgZXJyb3Jsb2cgaWYKICAgICBhIFVzZXIgZGlyZWN0aXZlIGlzIGVuY291bnRlcmVkIG9uIFdpbjMyLgogICAgIFtLZW4gUGFyenlnbmF0IDxrcGFyeiByYWxlaWdoLmlibS5jb20+XSBQUiMyMDc4LCAyMzAzLgoKICAqKSBGaXggbXVsdGlwbGUgd2hpdGVzcGFjZSBoYW5kbGluZyBpbiBpbWFnZW1hcHMgZm9yIG1vZF9pbWFwIHdoaWNoIHdhcwogICAgIGJyb2tlbiBzaW5jZSBBcGFjaGUgMS4zLjEgd2hlcmUgd2UgdG9vayBvdXQgY29tcHJlc3Npbmcgb2YgbXVsdGlwbGUKICAgICBzcGFjZXMgaW4gYXBfY2ZnX2dldGxpbmUoKS4KICAgICBbSXZhbiBSaWNod2Fsc2tpIDxpdmFuIHNlcHB1a3UubmV0Pl0gUFIjMzI0OQoKICAqKSBGaXggQmVya2VsZXktREIvMi54IHN1cHBvcnQgaW4gbW9kX2F1dGhfZGI6IFRoZSBkYXRhIHN0cnVjdHVyZXMgd2VyZSBub3QKICAgICBpbml0aWFsaXplZCBjb3JyZWN0bHkgYW5kIHRoZSBkYl9vcGVuKCkgY2FsbCB1c2VkIGFuIGludmFsaWQgbW9kZQogICAgIHBhcmFtZXRlci4gW1JvbiBLbGF0Y2hrbyA8cm9uIGNrbS51Y3NmLmVkdT5dIFBSIzMxNzEKCiAgKikgUE9SVDogRFNPIHN1cHBvcnQgZm9yIFVuaXhXYXJlIDcKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgUm9uIFJlY29yZCA8cnIgc2NvLmNvbT5dCgogICopIE1lcmdlIHRoZSBjb250ZW50cyBvZiB0aGUge3NybSxhY2Nlc3N9LmNvbmYtZGlzdCogZmlsZXMgaW50byB0aGUKICAgICBodHRwZC5jb25mLWRpc3QqIGZpbGVzLiAgVGhlIHNybSBhbmQgYWNjZXNzIGZpbGVzIG5vdyBjb250YWluCiAgICAgb25seSBjb21tZW50cywgYW5kIGh0dHBkLmNvbmYgaGFzIGFsbCB0aGUgY29tYmluZWQgY29udGVudHMgaW4KICAgICBhIHJhdGlvbmFsIG9yZGVyLiAgW0tlbiBDb2FyXQoKICAqKSBQT1JUOiBEU08vRUxGIHN1cHBvcnQgZm9yIEZyZWVCU0QgMy4wLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBEaXJrIEZyb2VtYmVyZyA8aWJleCBwaHlzaWsuVFUtQmVybGluLkRFPl0KICAKICAqKSBBZGQgYSAiZGVmYXVsdC1oYW5kbGVyIiBoYW5kbGVyIHRoYXQgY2FsbHMgdGhlIGRlZmF1bHRfaGFuZGVyKCkKICAgICBmdW5jdGlvbiB3aGljaCBpcyBub3JtYWxseSBjYWxsZWQgZm9yIHN0YXRpYyBjb250ZW50LiAgVGhpcyBhbGxvd3MKICAgICB5b3UgdG8gb3ZlcnJpZGUgYSBzcGVjaWZpYyBoYW5kbGVyLiAgW01hcmMgU2xlbWtvXQoKICAqKSBGdXJ0aGVyIHNpbXBsaWZ5IGNoZWNraW5nIGZvciBhYnNvbHV0ZSBwYXRocyBieSByZXBsYWNpbmcgYW4KICAgICBoYXJkLWNvZGVkIHN5bnRheCBjaGVjayB3aXRoIGEgY2FsbCB0byBhIHJvdXRpbmUgd2UgYWxyZWFkeSBjcmVhdGVkIHRvCiAgICAgZG8gdGhpcy4gIFtLZW4gUGFyenlnbmF0IDxrcGFyeiByYWxlaWdoLmlibS5jb20+XSBQUiMyOTc2LCAzMDc0CgogICopIExvZyBhbiBlcnJvciBpZiB3ZSBlbmNvdW50ZXIgYSBtYWxmb3JtZWQgInJlcXVpcmUiIGRpcmVjdGl2ZSAKICAgICBpbiBtb2RfYXV0aCBpZiB3ZSBrbm93IHRoYXQgd2Uga25vdyB0aGF0IG5vIG90aGVyIG1vZHVsZSBjYW4KICAgICBkZWFsIHdpdGggaXQuICBbTWFyYyBTbGVta29dCgogICopIFJlbW92ZSBhcF9wcml2YXRlX2V4dGVybiBtZXRob2Qgb2YgaGlkaW5nIGNvbmZsaWN0aW5nIHN5bWJvbHMKICAgICBvbiB0aGUgTkVYVCBwbGF0Zm9ybSBiZWNhdXNlIGl0IGlzIG5vdCBjb3JyZWN0IGZvciBhbGwgdmVyc2lvbnMsCiAgICAgYW5kIHRoZSB2ZXJzaW9ucyBmb3Igd2hpY2ggaXQgaXMgY29ycmVjdCBhcmUgdW5rbm93bi4KICAgICBbV2lsZnJlZG8gU2FuY2hleiA8d3NhbmNoZXogYXBwbGUuY29tPl0KCiAgKikgRml4IGluaGVyaXRhbmNlIG9mIEluZGV4T3B0aW9ucyBOYW1lV2lkdGggYW5kIHJlbW92ZSB1bmludGVuZGVkCiAgICAgcmVzdHJpY3Rpb24gb24gK05hbWVXaWR0aCwgK0ljb25IZWlnaHQsIGFuZCArSWNvbldpZHRoLiAgW0tlbiBDb2FyXQoKICAqKSBGaXggcGVyLWRpcmVjdG9yeSBjb25maWcgbWVyZ2luZyBmb3IgY2FzZXMgaW4gd2hpY2ggYSA1MDAgZXJyb3IKICAgICBpcyBlbmNvdW50ZXJlZCBpbiBhbiAuaHRhY2Nlc3MgZmlsZSBzb21ld2hlcmUgZG93biB0aGUgdHJlZS4KICAgICBbS2VuIENvYXJdICBQUiMyNDA5CgogICopIE1pbm9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IHRvIGFwX2VzY2FwZV9odG1sKCkuIFtSb3kgRmllbGRpbmddCgogICopIEZpeGVkIGEgc2VnbWVudGF0aW9uIHZpb2xhdGlvbiBpbiBtb2RfcHJveHkgd2hlbiBhIHJlc3BvbnNlIGlzCiAgICAgbm9uLWNhY2hhYmxlLiAgW1JveSBGaWVsZGluZywgdHJhY2VkIGJ5IERvdWcgQmxvZWJhdW1dLiBQUiMyOTUwLCAzMDU2CgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMy4zCgogICopIEFkZGVkIGEgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEV4cGVjdCBoZWFkZXIgZmllbGQgYXMKICAgICBzcGVjaWZpZWQgaW4gcmV2LTA1IG9mIEhUVFAvMS4xLiAgRGlzYWJsZWQgdGhlIDEwMCBDb250aW51ZQogICAgIHJlc3BvbnNlIHdoZW4gd2UgYWxyZWFkeSBrbm93IHRoZSBmaW5hbCBzdGF0dXMsIHdoaWNoIGlzIG1pZ2h0eQogICAgIHVzZWZ1bCBmb3IgUFVUIHJlc3BvbnNlcyB0aGF0IHJlc3VsdCBpbiAzMDIgb3IgNDAxLiBbUm95IEZpZWxkaW5nXQoKICAqKSBSZW1vdmUgZXh0cmEgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSBnZXRsaW5lIHJlc3VsdHMgYXMgcGFydAogICAgIG9mIHRoZSBwcm90b2NvbCBwcm9jZXNzaW5nLCB3aGljaCBpcyBleHRyYSBuaWNlIGJlY2F1c2UgaXQgd29ya3MKICAgICBiZXR3ZWVuIGNvbnRpbnVhdGlvbiBsaW5lcywgaXMgYWxtb3N0IG5vIGNvc3QgaW4gdGhlIG5vcm1hbCBjYXNlCiAgICAgb2Ygbm8gZXh0cmEgd2hpdGVzcGFjZSwgYW5kIHNhdmVzIG1lbW9yeS4gW1JveSBGaWVsZGluZ10KCiAgKikgQWRkZWQgbmV3IEhUVFAgc3RhdHVzIGNvZGVzIGFuZCBkZWZhdWx0IHJlc3BvbnNlIGJvZGllcyBmcm9tIHRoZQogICAgIHJldmlzZWQgSFRUUC8xLjEgKDMwNywgNDE2LCA0MTcpLCBXZWJEQVYgKDEwMiwgMjA3LCA0MjIsIDQyMyksIGFuZCAKICAgICBIVFRQIEV4dGVuc2lvbiBGcmFtZXdvcmsgKDUxMCkgc3BlY2lmaWNhdGlvbnMuICBEaWQgbm90IGFkZCB0aGUKICAgICBXZWJEQVYgNDI0IGFuZCA0MjUgY29kZXMgYmVjYXVzZSB0aGV5IGFyZSBib2d1cy4gIFdlIGRvbid0IHVzZSBhbnkKICAgICBvZiB0aGVzZSBjb2RlcyB5ZXQsIGJ1dCB0aGV5IGFyZSBub3cgYXZhaWxhYmxlIHRvIDNyZC1wYXJ0eSBtb2R1bGVzLgogICAgIFtSb3kgRmllbGRpbmddCgogICopIEZpeCBhIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gdGltZWQtb3V0IHJlcXVlc3RzIGFuZCB0aGUKICAgICBhcF9iaGFsZmR1cGxleCBzZWxlY3QgdGhhdCBtaWdodCByZXN1bHQgaW4gYW4gaW5maW5pdGUgbG9vcCBvbgogICAgIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCB2YWxpZGF0ZSB0aGUgZGVzY3JpcHRvci4gW1JveSBGaWVsZGluZ10KCiAgKikgV0lOMzI6IEFkZCAiLWsgc2h1dGRvd24iIGFuZCAiLWsgcmVzdGFydCIgb3B0aW9ucyB0byBzaWduYWwgYQogICAgIHJ1bm5pbmcgQXBhY2hlIHNlcnZlciBbUGF1bCBTdXR0b25dCgogICopIEZpeCBtb2RfYXV0b2luZGV4IGJ1ZyB3aGVyZSBkaXJlY3RvcmllcyBnb3QgYSBzaXplIG9mICIwayIgaW5zdGVhZAogICAgIG9mICItIi4gIFtNYXJ0aW4gUGxlY2hzbWlkIDxwbGVjaHNtaSBrYXJsaW4ubWZmLmN1bmkuY3o+LCBNYXJjIFNsZW1rb10KICAgICBQUiMzMTMwCgogICopIFBPUlQ6IERSUyA2MDAwIG1hY2hpbmUuIFtQYXVsIERlYmxlZWNrZXIgPHBkZWJsZWVja2VyIGpldGFpci5iZT5dCgogICopIEFkZCB0aGUgc2VydmVyIHNpZ25hdHVyZSB0ZXh0IChmcm9tIHRoZSBjb3JlIFNlcnZlclNpZ25hdHVyZSBkaXJlY3RpdmUpCiAgICAgdG8gdGhlIGxpc3Qgb2YgZW52YXJpYWJsZXMgYXZhaWxhYmxlIHRvIHNjcmlwdHMsIFNTSSwgYW5kIHRoZSBsaWtlLgogICAgIFtLZW4gQ29hcl0KCiAgKikgUE9SVDogRml4IHN5cy9yZXNvdXJjZS5oIGhhbmRsaW5nIGZvciBTQ08gMy54IHBsYXRmb3JtLgogICAgIFtNLiBMYWFrIDxtYWVydCBwcm9pbnYuZWU+XSBQUiMzMTA4CiAKICAqKSBGYWxsYmFjayBmcm9tIHN5c2NvbmYtYmFzZWQgdG8gcGxhaW4gSFotYmFzZWQgYHRpY2tzIHBlciBzZWNvbmQnCiAgICAgY2FsY3VsYXRpb24gaW4gbW9kX3N0YXR1cyBmb3IgYWxsIHN5c3RlbXMgd2hpY2ggZG9uJ3QgaGF2ZSBQT1NJWAogICAgIHN5c2NvbmYoKSAobGlrZSBVVFMgMi4xKSBhbmQgbm90IG9ubHkgZm9yIHRoZSBORVhUIHBsYXRmb3JtLgogICAgIFtEYXZlIER5a3N0cmEgPGR3ZCBiZWxsLWxhYnMuY29tPl0gUFIjMzA1NQoKICAqKSBGaXggYHJlcXVpcmUgLi4uJyBkaXJlY3RpdmUgcGFyc2luZyBpbiBtb2RfYXV0aCwgbW9kX2F1dGhfZGJtIGFuZAogICAgIG1vZF9hdXRoX2RiIGJ5IHVzaW5nIGFwX2dldHdvcmRfd2hpdGUoKSAod2hpY2ggdXNlcyBhcF9pc3NwYWNlKCkpIAogICAgIGluc3RlYWQgb2YgYXBfZ2V0d29yZCguLi4sICcgJykgKHdoaWNoIHBhcnNlcyBvbmx5IGFjY29yZGluZyB0byBzcGFjZXMgCiAgICAgYnV0IG5vdCB0YWJzKS4gIFtKYW1lcyBNb3JyaXMgPGptb3JyaXMgaW50ZXJjb2RlLmNvbS5hdT4sIAogICAgIFJhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzMxMDUKCiAgKikgRml4IHRoZSBTRVJWRVJfTkFNRSB2YXJpYWJsZSB1bmRlciBzdWItcmVxdWVzdCBzaXR1YXRpb25zICh3aGVyZQogICAgIGBVc2VDYW5vbmljYWxOYW1lIG9mZicgaXMgdXNlZCkgbGlrZSBDR0kncyBjYWxsZWQgZnJvbSBTU0kgcGFnZXMgb3IKICAgICBSZXdyaXRlQ29uZCB2YXJpYWJsZXMgYnkgYWRvcHRpbmcgci0+aG9zdG5hbWUgdG8gc3ViLXJlcXVlc3RzLgogICAgIFtKYW1lcyBHcmludGVyIDxqcmcgYmxvZHdlbi5kZW1vbi5jby51az5dIFBSIzMxMTEKCiAgKikgRml4IHN0ZGVyciByZWRpcmVjdGlvbiB1bmRlciBzeXNsb2ctYmFzZWQgZXJyb3IgbG9nZ2luZyBzaXR1YXRpb24uCiAgICAgW1lvdWljaGlyb3UgS29nYSA8eS1rb2dhIGpwLkZyZWVCU0Qub3JnPl0gUFIjMzA5NQoKICAqKSBEb2N1bWVudCBgRXJyb3JMb2cgc3lzbG9nOmZhY2lsaXR5JyB2YXJpYW50IG9mIGVycm9yIGxvZ2dpbmcuCiAgICAgW1lvdWljaGlyb3UgS29nYSA8eS1rb2dhIGpwLkZyZWVCU0Qub3JnPl0gUFIjMzA5NgoKICAqKSBGaXggaHR0cDovL2xvY2FsaG9zdC8gaGludHMgaW4gdG9wLWxldmVsIElOU1RBTEwgZG9jdW1lbnQuCiAgICAgW1JvYiBKZW5zb24gPHJvYmplbiBzcG90Y2guY29tPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMzA4OAoKICAqKSBRdW90ZSBwYXRocyBpbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZXMuICBbV2lsZnJlZG8gU2FuY2hlel0KCiAgKikgUE9SVDogUmVtb3ZlIGV4dHJhIEhBVkVfU1lTX1JFU09VUkNFX0ggZGVmaW5lIGZvciBSSEFQU09EWSBzaW5jZQogICAgIGl0IGlzIG5vdyB0YWtlbiBjYXJlIG9mIHByb3Blcmx5IGJ5IHRoZSBoZWFkZXIgZmlsZSB0ZXN0cy4KICAgICBbV2lsZnJlZG8gU2FuY2hleiA8d3NhbmNoZXogYXBwbGUuY29tPl0KCiAgKikgRml4IHByb2JsZW0gd2l0aCBzY3JpcHRzIGFuZCBmaWxlaGFuZGxlIGluaGVyaXRhbmNlIG9uIFdpbjMyLgogICAgIFtLZW4gUGFyenlnbmF0IDxrcGFyeiByYWxlaWdoLmlibS5jb20+XSAgUFIjMjg4NCwgMjkxMAoKICAqKSBXaW4zMiBuYW1lIGNhbm9uaWNhbGlzYXRpb24gY291bGQgZW5kIHVwIHVzaW5nIHRoZSBzZXJ2ZXIncwogICAgIHdvcmtpbmcgZGlyZWN0b3J5IHRvIGZpbGwgaW4gc29tZSBibGFua3MuICBbS2VuIFBhcnp5Z25hdAogICAgIDxrcGFyeiByYWxlaWdoLmlibS5jb20+XSBQUiMzMDAxCgogICopIENvcnJlY3QgaW52YWxpZCBhc3N1bXB0aW9uIGJ5IGFwX3N1Yl9yZXFfbG9va3VwX2ZpbGUoKSB0aGF0IGFsbAogICAgIGFic29sdXRlIHBhdGhzIGJlZ2luIHdpdGggIi8iIC0tIGJlY2F1c2UgdGhleSBkb24ndCBvbiBXaW4zMi4KICAgICBbS2VuIFBhcnp5Z25hdCA8a3BhcnogcmFsZWlnaC5pYm0uY29tPl0gUFIjMjk3NiwgMzA3NAoKICAqKSBBZGQgW1JFRElSRUNUX11WQVJJQU5UUyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBtb2Rfc3BlbGluZwogICAgIHNvIHRoYXQgRXJyb3JEb2N1bWVudCAzMDAgcHJvY2Vzc29ycyBjYW4gcmVmb3JtYXQgdGhlIGxpc3QKICAgICBpZiBkZXNpcmVkLiAgW0tlbiBDb2FyXSBQUiMyODU5CgogICopIEFkZCArLy0gaW5jcmVtZW50YWwgcHJlZml4ZXMgdG8gSW5kZXhPcHRpb25zIGtleXdvcmRzLCBhbmQKICAgICBlbmFibGUgbWVyZ2luZyBvZiBtdWx0aXBsZSBJbmRleE9wdGlvbnMgZGlyZWN0aXZlcy4gIFtLZW4gQ29hcl0KCiAgKikgUE9SVDogQWxsb3cgR3Vlc3NPUyB0byByZWNvZ25pemUgVW5peHdhcmUgNy4wLjEgW1N0ZXZlIENhbWVyb24KICAgICA8c3RldmUuY2FtZXJvbiBjb21wYXEuY29tPl0KCiAgKikgUmVjb25zdHJ1Y3RlZCB0aGUgbG9vcCB0aHJvdWdoIG11bHRpcGxlIGh0YWNjZXNzIGZpbGUgbmFtZXMgc28KICAgICB0aGF0IG1pc3NpbmcgZmlsZXMgYXJlIG5vdCBjb25mdXNlZCB3aXRoIHVucmVhZGFibGUgZmlsZXMuCiAgICAgW1JveSBGaWVsZGluZ10KCiAgKikgVGhlIGFwX3Bmb3BlbiBhbmQgYXBfcGZkb3BlbiByb3V0aW5lcyB3ZXJlIGZhaWxpbmcgdG8gcHJvdGVjdCB0aGUKICAgICBlcnJubyBvbiBhbiBlcnJvciwgd2hpY2ggbGVhZHMgdG8gb25lIGVycm9yIGJlaW5nIG1pc3Rha2VuIGZvcgogICAgIGFub3RoZXIgd2hlbiByZWFkaW5nIG5vbi1leGlzdGVudCAuaHRhY2Nlc3MgZmlsZXMuCiAgICAgW0ppbSBKYWdpZWxza2ldCgogICopIE9TLzI6IFRoZSBuZXcgaGVhZGVyIHRlc3RzIGdldCB0aGluZ3MgcmlnaHQsIG5lZWQgdG8gdXBkYXRlCiAgICAgYXBfY29uZmlnLmguICBbQnJpYW4gSGF2YXJkXQoKICAqKSBUaGUgUGVybCAlRU5WIGhhc2ggd2lsbCBub3cgYmUgc2V0dXAgYnkgZGVmYXVsdCB3aGVuIHVzaW5nIHRoZQogICAgIG1vZF9pbmNsdWRlIGBwZXJsJyBjb21tYW5kIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIFBPUlQ6IEFkZCBQeXJhbWlkIERDL09TeCBzdXBwb3J0IHRvIGNvbmZpZ3VyYXRpb24gbWVjaGFuaXNtLgogICAgIFtFYXJsZSBBa2UgPGFrZWUgd3BkaXNzMS53cGFmYi5hZi5taWw+XQoKICAqKSBQT1JUOiBGaXggc3lzL3Jlc291cmNlLmggaGFuZGxpbmcgZm9yIEFtZGFobCdzIFVUUyAyLjEKICAgICBbRGF2ZSBEeWtzdHJhIDxkd2QgYmVsbC1sYWJzLmNvbT5dIFBSIzMwNTQKCiAgKikgQ29ycmVjdCBjb21tZW50IGluIG1vZF9sb2dfY29uZmlnLmMgYWJvdXQgaXRzIGludGVybmFscy4KICAgICBbRWxmIFN0ZXJuYmVyZyA8ZWxmIGhhbGN5b24uY29tPl0KCiAgKikgQXZvaWQgcG9zc2libGUgbGluZSBvdmVyZmxvdyBpbiBDb25maWd1cmU6IFVzZSBhbiBhd2tmaWxlIHRvCiAgICAgaGFuZGxlIHRoZSBjcmVhdGlvbiBvZiBtb2R1bGVzLmMgW0ppbSBKYWdpZWxza2ldCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMy4yCgogICopIEZpeCBidWcgaW4gYXBfcmVtb3ZlX21vZHVsZSgpLCB3aGljaCBjYXVzZWQgcHJvYmxlbXMgZm9yIGRzbydzIAogICAgIHdobyB3ZXJlIHRoZSB0b3BfbW9kdWxlLiAgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEJlcmtlbGV5LURCLzIueCAoaW4gYWRkaXRpb24gdG8gQmVya2VsZXktREIvMS54KSB0bwogICAgIG1vZF9hdXRoX2RiIHRvIGJvdGggYmUgZnJpZW5kbHkgdG8gdXNlcnMgd2hvIHdhbnRzIHRvIHVzZSB0aGlzIHZlcnNpb24KICAgICBhbmQgdG8gYXZvaWQgcHJvYmxlbXMgdW5kZXIgcGxhdGZvcm1zIHdoZXJlIG9ubHkgdmVyc2lvbiAyLnggaXMgcHJlc2VudC4KICAgICBbRGFuIEphY29ib3dpdHogPGRyb3cgZmFsc2Uub3JnPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgV2hlbiB1c2luZyBhcF9sb2dfcmVycm9yKCksIG1ha2UgdGhlIGVycm9yIG1lc3NhZ2UgYXZhaWxhYmxlIHRvIHRoZQogICAgICpFUlJPUl9OT1RFUyBlbnZhcmlhYmxlcyBieSBkZWZhdWx0LiAgW0tlbiBDb2FyXQoKICAqKSBCUzIwMDAgcGxhdGZvcm0gb25seTogZ2V0IHJpZCBvZiB0aGUgbmFzdHkgQlMyMDAwQXV0aEZpbGUuCiAgICAgWW91IG5vdyBtdXN0IGRlZmluZSBhIEJTMjAwMEFjY291bnQgbmFtZSBmb3IgdGhlIHNlcnZlciBVc2VyLgogICAgIFRoaXMgaGFzIGZld2VyIHNlY3VyaXR5IGltcGxpY2F0aW9ucyB0aGFuIHRoZSBvbGQgYXBwcm9hY2guCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBGaXggU0hBUkVEX0NPUkUgZmVhdHVyZSBmb3IgSFBVWCBwbGF0Zm9ybTogV2Ugbm93IHVzZSBleHRlbnNpb24gYC5zbCcKICAgICBpbnN0ZWFkIG9mIGAuc28nIGFuZCBgU0hMSUJfUEFUSCcgaW5zdGVhZCBvZiBgTERfTElCUkFSWV9QQVRIJyBvbiB0aGlzCiAgICAgcGxhdGZvcm0gdG8gbWFrZSB0aGUgYnJhaW5kZWFkIEhQVVggbGlua2VyIGhhcHB5LiBOb3RpY2UsIGZvciB0aGUgbW9kdWxlCiAgICAgRFNPcyB3ZSBkb24ndCBoYXZlIHRvIHVzZSB0aGlzLCBiZWNhdXNlIHRoZXNlIGFyZSBsb2FkZWQgbWFudWFsbHkgKGFuZAogICAgIG5vdCB2aWEgSFBVWCcgZGxkKS4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI5MDUsIFBSIzI5NjgKCiAgKikgUmVtb3ZlIDY0IHRocmVhZCBsaW1pdCBvbiBXaW4zMi4KICAgICBbQmlsbCBTdG9kZGFyZCA8c3RvZGRhcmQgcmFsZWlnaC5pYm0uY29tPl0KCiAgKikgUmVtb3ZlIHJlZHVuZGFudCBzdWJzdGl0dXRpb25zIGluIHRvcC1sZXZlbCBNYWtlZmlsZS50bXBsLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggQVBBQ0kncyBgR3JvdXAnIGNvbmZpZ3VyYXRpb24gYWRqdXN0bWVudCAtIGVzcGVjaWFsbHkgZm9yIExpbnV4CiAgICAgcGxhdGZvcm1zIHdoZXJlIGBub2dyb3VwJyBleGlzdHMgaW4gL2V0Yy9ncm91cC4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCiAKICAqKSBNYWtlIFByaW50UGF0aCB3b3JrIGdlbmVyaWNhbGx5IGluc3RlYWQgb2YgaGF2aW5nIG9uZSB2ZXJzaW9uCiAgICAgc3RyaWN0bHkgZm9yIE9TLzIuIFtKaW0gSmFnaWVsc2tpLCBCcmlhbiBIYXZhcmRdCgogICopIEZpeCB0aGUgcmVjZW50bHkgaW50cm9kdWNlZCBDIGhlYWRlciBmaWxlIGNoZWNraW5nOiBXZSBub3cgdXNlIHRoZSBDCiAgICAgcHJlLXByb2Nlc3NvciBwYXNzIG9ubHkgKGFuZCBubyBsb25nZXIgdGhlIGNvbXBsZXRlIGNvbXBpbGVyIHBhc3MpIHRvCiAgICAgZGV0ZXJtaW5lIHdoZXRoZXIgYSBDIGhlYWRlciBmaWxlIGV4aXN0cyBvciBub3QuIEJlY2F1c2Ugb25seSB0aGlzIHdheQogICAgIHdlJ3JlIHNhZmUgYWdhaW5zdCBpbnRlci1oZWFkZXIgZGVwZW5kZW5jaWVzICh3aGljaCBjYXVzZWQgaG9ycmlibGUKICAgICBwb3J0YWJpbGl0eSBwcm9ibGVtcykuIFRoZSBvbmx5IGRyYXdiYWNrIGlzIHRoYXQgd2Ugbm93IGhhdmUgYSBDUFAKICAgICBjb25maWd1cmF0aW9uIHZhcmlhYmxlIHdoaWNoIGhhcyB0byBiZSBkZXRlcm1pbmVkIGZpcnN0ICh3ZSBkbyBhIHNpbWlsYXIKICAgICBhcHByb2FjaCBhcyBHTlUgQXV0b2NvbmYgZG9lcyBoZXJlKS4gV2hlbiBhbGwgZmFpbHMgdGhlIHVzZXIgc3RpbGwgaGFzCiAgICAgdGhlIHBvc3NpYmlsaXR5IHRvIG92ZXJyaWRlIGl0IG1hbnVhbGx5IHZpYSBBUEFDSSBvciBzcmMvQ29uZmlndXJhdGlvbi4KICAgICBBcyBhIGZhbGxiYWNrIGZvciB0aGUgaGVhZGVyIGNoZWNrIGl0c2VsZiB3ZSBjYW4gZGlyZWN0bHkgY2hlY2sgdGhlCiAgICAgZXhpc3RhbmNlIG9mIHRoZSBmaWxlIHVuZGVyIC91c3IvaW5jbHVkZSwgdG9vLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyNzc3CgogICopIFBPUlQ6IEFkZGVkIFJIQVBTT0RZIChNYWMgT1MgWCBTZXJ2ZXIpIHN1cHBvcnQuIE1BUF9UTVBGSUxFIGRlZmluZWQKICAgICBhcyBhbiBhbHRlcm5hdGUgbWVjaGFuaXNtIGZvciBtbWFwJ2Qgc2hhcmVkIG1lbW9yeSBmb3IgUkhBUFNPRFkuCiAgICAgYXBfcHJpdmF0ZV9leHRlcm4gZGVmaW5lZCB0byBoaWRlIHN5bWJvbHMgdGhhdCBjb25mbGljdCB3aXRoIGxvYWRlZAogICAgIGR5bmFtaWMgbGlicmFyaWVzIG9uIHRoZSBORVhUIGFuZCBSSEFQU09EWSBwbGF0Zm9ybXMuCiAgICAgW1dpbGZyZWRvIFNhbmNoZXogPHdzYW5jaGV6IGFwcGxlLmNvbT5dCgogICopIERlbGV0ZSBQSUQgZmlsZSBvbiBjbGVhbiBzaHV0ZG93bnMuCiAgICAgW0NoYXJsZXMgUmFuZGFsbCA8Y3JhbmRhbGwgbWF0Y2hsb2dpYy5jb20+XSBQUiMyOTQ3CgogICopIEZpeCBtb2RfYXV0aF8qLmh0bWwgZG9jdW1lbnRzOiBOU0NBIC0+IE5DU0EKICAgICBbWW91aWNoaXJvdSBLb2dhIDx5LWtvZ2EganAuRnJlZUJTRC5vcmc+XSBQUiMyOTkxCgogICopIEZpeCBJTlNUQUxMIGRvY3VtZW50OiB3d3cuZ251LmFpLm1pdC5lZHUgLT4gd3d3LmdudS5vcmcKICAgICBbS2FybCBCZXJyeSA8a2FybCBnbnUub3JnPl0gUFIjMjk5NAoKICAqKSBGaXggZGJtbWFuYWdlLjEgbWFudWFsIHBhZ2UuCiAgICAgW1lvdWljaGlyb3UgS29nYSA8eS1rb2dhIGpwLkZyZWVCU0Qub3JnPl0gUFIjMjk5MgogICAgIAogICopIEZpeCBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgc2l0dWF0aW9uIGluIHN1ZXhlYy5jLgogICAgIFtKZWZmIFN0ZXdhcnQgPGp3cyBwdXJkdWUuZWR1Pl0gUFIjMjc5MAoKICAqKSBBZGQgc29tZSBtb3JlIExJQlMgZm9yIHRoZSBTQ081IHBsYXRmb3JtIHdoaWNoIGFyZSBuZWVkZWQgZm9yIHRoZSBhbHJlYWR5CiAgICAgdXNlZCAtbHByb3QuIEl0J3MgYWN0dWFsbHkgYSBidWcgaW4gU0NPNSwgb2YgY291cnNlLgogICAgIFtSb25hbGQgUmVjb3JkIDxyciBzY28uY29tPl0gUFIjMjUzMwoKICAqKSBGaXggZG9jdW1lbnRhdGlvbiBvZiBQcm94eVBhc3MvUHJveHlQYXNzUmV2ZXJzZSBhY2NvcmRpbmcgdG8gdGhlCiAgICAgdHJhaWxpbmcgc2xhc2ggcHJvYmxlbS4gW0pvbiBEcnVrbWFuIDxqc2QgZ2FtZXNwb3QuY29tPl0gUFIjMjkzMwogIAogICopIFJlbW92ZSBgLW1zeW0nIG9wdGlvbiBmcm9tIExERkxBR1NfU0hMSUIgZm9yIHRoZSBEaWdpdGFsIFVOSVggKE9TRi8xKQogICAgIHBsYXRmb3JtLCBiZWNhdXNlIGl0J3Mgb25seSBzdXBwb3J0ZWQgdW5kZXIgdmVyc2lvbiA0LjAgYW5kIGhpZ2hlci4gQnV0CiAgICAgYmVjYXVzZSBvdXIgR3Vlc3NPUyBpcyBzdGlsbCB1bmF3YXJlIG9mIERpZ2l0YWwgVU5JWCB2ZXJzaW9ucyBhbmQgdGhlCiAgICAgLW1zeW0gaXMganVzdCB0byBvcHRpbWl6ZSB0aGUgRFNPIHN0YXR1cCB0aW1lIGEgbGl0dGxlIGJpdCBpdCdzIHNhZmUgYW5kCiAgICAgYmVzdCB3aGVuIHdlIGxlYXZlIGl0IG91dCBub3cuICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjk2OQoKICAqKSBGaXggdGhlIGFwX2xvZ19lcnJvcl9vbGQoKSwgYXBfbG9nX3VuaXhlcnIoKSBhbmQgYXBfbG9nX3ByaW50ZigpCiAgICAgZnVuY3Rpb25zOiBGaXJzdCBhbGwgdGhyZWUgZnVuY3Rpb25zIG5vIGxvbmdlciBmYWlsIG9uIHN0cmluZ3MgY29udGFpbmluZwogICAgICIlIiBjaGFycyBhbmQgc2Vjb25kIGFwX2xvZ19wcmludGYoKSBubyBsb25nZXIgZG9lcyBhIGRvdWJsZS1mb3JtYXR0aW5nCiAgICAgKGluc3RlYWQgaXQgZGlyZWN0bHkgcGFzc2VzIHRocm91Z2ggdGhlIG1lc3NhZ2UgdG8gYmUgZm9ybWF0dGVkIHRvIHRoZQogICAgIHJlYWwgaW50ZXJuYWwgZm9ybWF0dGluZyBmdW5jdGlvbikuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyOTQxCgogICopIEFsbG93ICJJbmNsdWRlIiBkaXJlY3RpdmVzIGFueXdoZXJlIGluIHRoZSBzZXJ2ZXIgY29uZmlnCiAgICAgZmlsZXMgKGJ1dCBub3QgLmh0YWNjZXNzIGZpbGVzKS4gIFtLZW4gQ29hcl0gUFIjMjcyNwoKICAqKSBUaGUgcHJveHkgd2FzIHJlZnVzaW5nIHRvIHNlcnZlIENPTk5FQ1QgcmVxdWVzdHMgZXhjZXB0IHRvCiAgICAgcG9ydCA0NDMgKGh0dHBzOi8vKSBhbmQgNTYzIChzbmV3czovLykuIFRoZSBuZXcgQWxsb3dDT05ORUNUCiAgICAgZGlyZWN0aXZlIGFsbG93cyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgcG9ydHMgdG8gd2hpY2ggYQogICAgIENPTk5FQ1QgaXMgYWxsb3dlZC4gIFtTYW1lZXIgUGFyZWtoLCBNYXJ0aW4gS3JhZW1lcl0KCiAgKikgbW9kX2V4cGlyZXMgd2lsbCBub3cgYWN0IG9uIGNvbnRlbnQgdGhhdCBpcyBub3Qgc2VudCBmcm9tIGEgZmlsZQogICAgIG9uIGRpc2suICBQcmV2aW91c2x5IGl0IHdvdWxkIG5ldmVyIGFkZCBhbiBFeHBpcmVzOiBoZWFkZXIgdG8KICAgICBhbnkgcmVzcG9uc2UgdGhhdCBkaWQgbm90IGNvbWUgZnJvbSBhIGZpbGUgb24gZGlzazsgdGhlIG9ubHkKICAgICBjYXNlIHdoZXJlIGl0IHN0aWxsIGRvZXNuJ3QgKGFuZCBjYW4ndCkgYWRkIG9uZSBmb3IgdGhhdCB0eXBlIG9mIAogICAgIGNvbnRlbnQgaXMgaWYgeW91IGFyZSB1c2luZyBhIG1vZGlmaWNhdGlvbiBkYXRlIGJhc2VkIHNldHRpbmcuICAKICAgICBbTWFyYyBTbGVta28sIFBhdWwgUGhpbGxpcHMgPHBhdWxwIGdvMm5ldC5jb20+XQoKICAqKSBQcm9ibGVtcyBlbmNvdW50ZXJlZCBkdXJpbmcgLmh0YWNjZXNzIHBhcnNpbmcgb3IgQ0dJIGV4ZWN1dGlvbgogICAgIHRoYXQgbGVhZCB0byBhICI1MDAgU2VydmVyIEVycm9yIiBjb25kaXRpb24gbm93IHByb3ZpZGUgZXhwbGFuYXRvcnkKICAgICB0ZXh0IChpbiB0aGUgKkVSUk9SX05PVEVTIGVudmFyaWFibGUpIHRvIEVycm9yRG9jdW1lbnQgNTAwIHNjcmlwdHMuCiAgICAgW0tlbiBDb2FyXSBQUiMxMjkxCgogICopIEFkZCBOYW1lV2lkdGgga2V5d29yZCB0byBJbmRleE9wdGlvbnMgZGlyZWN0aXZlIHNvIHRoYXQgdGhlCiAgICAgd2lkdGggb2YgdGhlIGZpbGVuYW1lIGNvbHVtbiBpcyBjdXN0b21pc2FibGUuICBbS2VuIENvYXIsIERlYW4gR2F1ZGV0XQogICAgIFBSIzE5NDksIDIzMjQuCgogICopIFJlY29nbml6ZSBsb3dlcmNhc2UgX2FuZF8gdXBwZXJjYXNlIGB1bmFtZScgcmVzdWx0cyB1bmRlcgogICAgIFNDTyBPcGVuU2VydmVyLiBbRGF2aWQgQ29lbGhvIDxkcmMgcHB0LmNvbT5dCgogICopIEFzIGR1cGxpY2F0ZSAiSFRUUC8xLjAgMjAwIE9LIiBsaW5lcyB3aXRoaW4gdGhlIGhlYWRlciBzZWVtIHRvIGJlCiAgICAgYSBjb21tb24gcHJvYmxlbSBvZiAobWlzLWFkbWluaXN0cmF0ZWQ/KSBJSVMgc2VydmVycywgbWFrZSB0aGUgYXBhY2hlCiAgICAgcHJveHkgaW1tdW5lIHRvIHRoZXNlIGVycm9ycyAoYW5kIGlnbm9yZSB0aGUgZHVwbGljYXRlcywgYnV0IGxvZwogICAgIHRoZSBmYWN0IHRvIGVycm9yX2xvZykuIFtNYXJ0aW4gS3JhZW1lcl0sIGFmdGVyIHRoZSBwcm9wb3NhbCBpbiBQUiMyOTE0IAogICAgIAogICopIFRoZSA8SWZNb2R1bGUgYW5kIDxJZkRlZmluZSBibG9jayBzdGFydGluZyBkaXJlY3RpdmVzIG5vdyBvbmx5CiAgICAgYWxsb3cgZXhhY3RseSBvbmUgYXJndW1lbnQuIFByZXZpb3VzbHksIHRoZSBvcHRpb25hbCBuZWdhdGlvbgogICAgIGNoYXJhY3RlciAnIScgY291bGQgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2Ugd2l0aG91dCBhIHN5bnRheAogICAgIGVycm9yIGJlaW5nIHJlcG9ydGVkLCBhbGJlaXQgZGVmZWF0aW5nIHRoZSBJZk1vZHVsZSBmdW5jdGlvbmFsaXR5CiAgICAgKGVuY2xvc2VkIGRpcmVjdGl2ZXMgd291bGQgQUxXQVlTIGJlIGV4ZWN1dGVkKS4gQnkgdXNpbmcgdGhlCiAgICAgc3RyaWN0ZXIgc3ludGF4LCB0aGVzZSBoYXJkLXRvLXRyYWNrIGVycm9ycyBjYW4gYmUgYXZvaWRlZC4KICAgICBbTWFydGluIEtyYWVtZXJdCgogICopIFNpbXBsaWZ5IGhhbmRsaW5nIG9mIEluZGV4T3B0aW9ucyBpbiBtb2RfYXV0b2luZGV4IC0tIGFuZCBCVFcKICAgICBjYXVzZSB0aGUgc3RhbmRhbG9uZSBGYW5jeUluZGV4aW5nIGRpcmVjdGl2ZSB0byBsb2dpY2FsbHkgT1IKICAgICBpbnRvIGFueSBleGlzdGluZyBJbmRleE9wdGlvbnMgc2V0dGluZ3MgcmF0aGVyIHRoYW4gd2lwaW5nCiAgICAgdGhlbSBvdXQuICBbS2VuIENvYXJdCgogICopIENoYW5nZXMgaW4gZnRwIHByb3h5OiBtYWtlIFVSTCBwYXJzaW5nIHNpbXBsZXIgYnkgdXNpbmcgdGhlCiAgICAgcGFyc2VkX3VyaSBzdHVmZi4KICAgICArIEFkZCBkaXNwbGF5IG9mIHRoZSAiY3VycmVudCBkaXJlY3RvcnkiIGluIGNhc2VzIHdoZXJlIGl0J3MKICAgICBkaWZmZXJlbnQgZnJvbSB0aGUgc3VwcGxpZWQgcGF0aCAoZS5nLiwgZnRwOi8vdXNlckBob3N0LyBsaXZlcwogICAgIGluIC9ob21lL3VzZXIsIG5vdCBpbiAvLCB0aGVyZWZvcmUgY2xpY2tpbmcgb24gIi4uLyIgaW4gdGhlCiAgICAgc3RhcnRpbmcgZGlyZWN0b3J5IG1pZ2h0IHNlbmQgdXMgdG8gL2hvbWUvKS4KICAgICArIFdoZW4gZnRwIGxvZ2luIGZhaWxzLCAoZXNwLiB3aGVuIGEgdXNlciBuYW1lIHdhcyBwYXJ0IG9mIHRoZQogICAgIFVSTCBhbHJlYWR5KSwgd2Ugbm93IHJldHVybiBbNDAxIFVuYXV0aG9yaXplZCBdIHRvIGFsbG93IHRoZQogICAgIGJyb3dzZXIgdG8gcG9wIHVwIGFuIGF1dGhvcml6YXRpb24gZGlhbG9nLiBUaGlzIG1ha2VzIHBhc3N3b3JkcwogICAgIHNsaWdodGx5IGxlc3MgdmlzaWJsZSAodGhleSBkb24ndCBhcHBlYXIgaW4gdGhlIHJlZ3VsYXIgbG9nIGZpbGVzKQogICAgIGFuZCBpbXBsZW1lbnRzIGEgZnVuY3Rpb25hbGl0eSB0aGF0IG90aGVyIHd3dyBwcm94eSBzZXJ2ZXJzCiAgICAgYWxyZWFkeSBvZmZlcmVkLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgVHJpZ2dlcmVkIGJ5IHRoZSByZWNlbnQgIlZpYToiIGhlYWRlciBjaGFuZ2VzLCB0aGUgcHJveHkgbW9kdWxlIHdvdWxkCiAgICAgZHVtcCBjb3JlIGZvciByZXBsaWVzIHdpdGggaW52YWxpZCBoZWFkZXJzIChlLmcuLCBkdXBsaWNhdGUKICAgICAiSFRUUC8xLjAgMjAwIE9LIiBsaW5lcykuIFRoZXNlIGVycm9ycyBhcmUgbm93IGxvZ2dlZCBhbmQgdGhlCiAgICAgY29yZSBkdW1wIGlzIGF2b2lkZWQuIEFsc28sIGJyb2tlbiByZXBsaWVzIGFyZSBub3QgY2FjaGVkLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0gUFIjMjkxNAoKICAqKSBuZXcgYEdwcm9mRGlyJyBkaXJlY3RpdmUgd2hlbiBjb21waWxlZCB3aXRoIC1ER1BST0YsIHdoZXJlIGdwcm9mIGNhbgogICAgIHBsb3AgZ21vbi5vdXQgcHJvZmlsZSBkYXRhIGZvciBlYWNoIGNoaWxkIFtEb3VnIE1hY0VhY2hlcm5dCiAgIAogICopIFVzZSB0aGUgY29uc3RydWN0IGBgIiRAIicnIGluc3RlYWQgb2YgYGAkKicnIGluIHRoZSBnZW5lcmF0ZWQKICAgICBjb25maWcuc3RhdHVzIHNjcmlwdCB0byBiZSBpbW11bmUgYWdhaW5zdCBhcmd1bWVudHMgd2l0aCB3aGl0ZXNwYWNlcy4KICAgICBbWXZlcyBBcnJvdXllIDx5dmVzIGFwcGxlLmNvbT5dIFBSIzI4NjYKCiAgKikgUmVwbGFjZSB0aGUgaW5saW5lZCBpbmZvcm1hdGlvbiBncmFiYmluZyBzdHVmZiBmb3IgdGhlIGNvbmZpZ3VyYXRpb24KICAgICBhZGp1c3RtZW50IGZlYXR1cmUgKG5vIC0td2l0aG91dC1jb25mYWRqdXN0KSB3aXRoIGNhbGxzIHRvIGEgbmV3IGhlbHBlcgogICAgIHNjcmlwdCBgYnVpbGRpbmZvLnNoJyB3aGljaCBpcyBib3RoIG1vcmUgZmxleGlibGUgYW5kIGFscmVhZHkgcHJvb2ZlZCB0bwogICAgIGJlIG1vcmUgcm9idXN0IGFnYWluc3QgcGxhdGZvcm0gZGlmZmVyZW5jZXMuIFRoaXMgbWFpbmx5IGZpeGVzIHRoZQogICAgIHJlY2VudGx5IG9jY3VyZWQgYGBzZWQ6IGNvbW1hbmQgZ2FyYmxlZDogLi4uJycgcHJvYmxlbXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI3NzYsIFBSIzI4NDgKCiAgKikgTWFrZSBhYi5jIGFnYWluIHBhc3MgYGBnY2MgLVdhbGwgLVdzaGFkb3cgLVdwb2ludGVyLWFyaXRoIC1XY2FzdC1hbGlnbgogICAgIC1XbWlzc2luZy1wcm90b3R5cGVzIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVduZXN0ZWQtZXh0ZXJucyAtV2lubGluZScnCiAgICAgd2l0aG91dCBjb21wbGFpbnMgYWZ0ZXIgd2UgcmVjZW50bHkgYWRkZWQgdGhlIFBPU1QgZmVhdHVyZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVuYW1lZCBpc19IVFRQX3h4eCgpIG1hY3JvcyB0byBhcF9pc19IVFRQX3h4eCgpIG5hbWUuIFRoZXkgYXJlIHVzZWQgaW5zaWRlCiAgICAgbW9kdWxlcyBhcyBBUEkgZnVuY3Rpb25zIGFuZCB3ZSBmb3Jnb3QgdGhlbSBhdCB0aGUgYmlnIHN5bWJvbCByZW5hbWluZy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVtb3ZlIGJhZCByZWZlcmVuY2UgdG8gbm9uLWV4aXN0aW5nIFNFUlZFUl9WRVJTSU9OIGluIG1vZF9yZXdyaXRlLmh0bWwKICAgICBbWW91aWNoaXJvdSBLb2dhIDx5LWtvZ2EganAuRnJlZUJTRC5PUkc+XSBQUiMyODk1CgogICopIER5bmFtaWNhbGx5IHNpemUgdGhlIGZpbGVuYW1lIGNvbHVtbiBvZiBtb2RfYXV0b2luZGV4IG91dHB1dC4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIEFkZCB0aGUgYWJpbGl0eSB0byBkbyBQT1NUIHJlcXVlc3RzIHRvIHRoZSBhYiBiZW5jaG1hcmtpbmcgdG9vbC4KICAgICBbS3VydCBTdXNzbWFuIDxrbHMgYmVzdC5jb20+XSBQUiMyODcxCgogICopIEJ1bXAgdXAgTUFYX0VOVl9GTEFHUyBpbiBtb2RfcmV3cml0ZS5oIGZyb20gdGhlIHRvbyBjb25zZXJ2YXRpY2UgbGltaXQgb2YKICAgICA1IHRvIDEwIGJlY2F1c2UgdGhlcmUgYXJlIHNvbWUgdXNlcnMgb3V0IHRoZXJlIHdobyBhbHdheXMgaGF2ZSA1IHRvIDgKICAgICB2YXJpYWJsZXMgaW4gb25lIFJld3JpdGVSdWxlIGFuZCBoYWQgdG8gcGF0Y2ggbW9kX3Jld3JpdGUuaCBmb3IgZXZlcnkKICAgICByZWxlYXNlLiBTbyAxNSBzaG91bGQgYmUgbm93IG1vcmUgdGhhbiBlbm91Z2gsIGV2ZW4gZm9yIHRoZW0uIChJIG5ldmVyCiAgICAgbmVlZGVkIG1vcmUgdGhhbiA0IGluIG15IFJld3JpdGVSdWxlcyA7LSkKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWFrZSB0aGUgcHJveHkgZ2VuZXJhdGUgYW5kIHVuZGVyc3RhbmQgVmlhOiBoZWFkZXJzCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBDaGFuZ2UgdGhlIHByb3h5IHRvIHVzZSB0YWJsZXMgaW5zdGVhZCBvZiBhcnJheV9oZWFkZXJzIGZvcgogICAgIHRoZSBoZWFkZXIgbGluZXMuIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgTWFrZSBzdXJlIHRoZSBjb25maWcuc3RhdHVzIGZpbGUgaXMgbm90IG92ZXJyaWRkZW4gd2hlbiBqdXN0CiAgICAgYGBjb25maWd1cmUgLS1oZWxwJycgaXMgdXNlZC4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI4NDQKCiAgKikgU3BsaXQgTU9EVUxFX01BR0lDX05VTUJFUiBpbnRvIF9NQUpPUi9fTUlOT1IgbnVtYmVycy4gVGhpcyBzaG91bGQKICAgICBwcm92aWRlIGEgd2F5IHRvIHRyYWNlIEFQSSBjaGFuZ2VzIHRoYXQgYWRkIGZ1bmN0aW9uYWxpdHkgYnV0IGRvCiAgICAgbm90IGNyZWF0ZSBhIGNvbXBhdGliaWxpdHkgaXNzdWUgZm9yIHByZWNvbXBpbGVkIG1vZHVsZXMsIGV0Yy4KICAgICBTZWUgaW5jbHVkZS9hcF9tbW4uaCBmb3IgbW9yZSBkZXRhaWxzLiAgW1JhbmR5IFRlcmJ1c2hdCgogICopIEZpeCBzdWV4ZWMgaW5zdGFsbGF0aW9uIHVuZGVyIGBtYWtlIGluc3RhbGwgcm9vdD14eHgnIHNpdHVhdGlvbi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRXh0ZW5kIHRoZSBvdXRwdXQgb2YgdGhlIC1WIHN3aXRjaCB0byBpbmNsdWRlIHRoZSBwYXRocyBvZiBhbGwKICAgICBjb21waWxlZC1pbiBjb25maWd1cmF0aW9uIGZpbGVzLCBpZiB0aGV5IHdlcmUgb3ZlcnJpZGRlbiBhdAogICAgIGNvbXBpbGUgdGltZSwgZm9yIGxlYXN0IGFzdG9uaXNobWVudCBvZiB0aGUgdXNlci4KICAgICBbTWFydGluIEtyYWVtZXJdCgogICopIFdoZW4gUkVBRGluZyBhIHJlcXVlc3QgaW4gRXh0ZW5kZWRTdGF0dXMgbW9kZSwgdGhlICJvbGQiCiAgICAgdmhvc3QsIHJlcXVlc3QgYW5kIGNsaWVudCBpbmZvcm1hdGlvbiBpcyBub3QgZGlzcGxheWVkLgogICAgIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBTVEFUVVMgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS4gRnVsbCBzdGF0dXMgaW5mb3JtYXRpb24gbm93CiAgICAgcnVuLXRpbWUgY29uZmlndXJhYmxlIHVzaW5nIHRoZSBFeHRlbmRlZFN0YXR1cyBkaXJlY3RpdmUuCiAgICAgW0ppbSBKYWdpZWxza2ldCgogICopIFNFQ1VSSVRZOiBDVkUtMTk5OS0xMTk5IChjdmUubWl0cmUub3JnKSAKICAgICBFbGltaW5hdGUgTyhuXjIpIHNwYWNlIERvUyBhdHRhY2tzIChhbmQgb3RoZXIgTyhuXjIpCiAgICAgY3B1IHRpbWUgYXR0YWNrcykgaW4gaGVhZGVyIHBhcnNpbmcuICBBZGQgYXBfb3ZlcmxhcF90YWJsZXMoKSwKICAgICBhIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gYnVsayB1cGRhdGUgb3BlcmF0aW9ucwogICAgIG9uIHRhYmxlcyBpbiBhIG1vcmUgZWZmaWNpZW50IG1hbm5lci4gIFtEZWFuIEdhdWRldF0KCiAgKikgU0VDVVJJVFk6IEFkZGVkIGNvbXBpbGUtdGltZSBhbmQgY29uZmlndXJhYmxlIGxpbWl0cyBmb3IKICAgICB2YXJpb3VzIGFzcGVjdHMgb2YgcmVhZGluZyBhIGNsaWVudCByZXF1ZXN0IHRvIGF2b2lkIHNvbWUgc2ltcGxlCiAgICAgZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrcywgaW5jbHVkaW5nIGxpbWl0cyBvbiBtYXhpbXVtIHJlcXVlc3QtbGluZQogICAgIHNpemUgKExpbWl0UmVxdWVzdExpbmUpLCBudW1iZXIgb2YgaGVhZGVyIGZpZWxkcyAoTGltaXRSZXF1ZXN0RmllbGRzKSwKICAgICBhbmQgc2l6ZSBvZiBhbnkgb25lIGhlYWRlciBmaWVsZCAoTGltaXRSZXF1ZXN0RmllbGRzaXplKS4gIEFsc28gYWRkZWQKICAgICBhIGNvbmZpZ3VyYWJsZSBkaXJlY3RpdmUgTGltaXRSZXF1ZXN0Qm9keSBmb3IgbGltaXRpbmcgdGhlIHNpemUgb2YgdGhlCiAgICAgcmVxdWVzdCBtZXNzYWdlIGJvZHkuICBbUm95IEZpZWxkaW5nXQoKICAqKSBNYWtlIHN0YXR1cyBtb2R1bGUgYXdhcmUgb2YgRE5TIGFuZCBsb2dnaW5nIHN0YXRlcywgZXZlbiBpZgogICAgIFNUQVRVUyBub3QgZGVmaW5lZC4gIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBGaXggYSBwcm9ibGVtIHdpdGggdGhlIG5ldyBPUy8yIG11dGV4ZXMuICBbQnJpYW4gSGF2YXJkXQoKICAqKSBFbmhhbmNlIG1vZF9zcGVsaW5nIHNvIHRoYXQgQ2hlY2tTcGVsbGluZyBjYW4gYmUgdXNlZCBpbgogICAgIDxEaXJlY3Rvcnk+IGNvbnRhaW5lcnMgYW5kIC5odGFjY2VzcyBmaWxlcy4gIFtLZW4gQ29hcl0KCiAgKikgQVBJOiBuZXcgYXBfY3VzdG9tX3Jlc3BvbnNlKCkgZnVuY3Rpb24gZm9yIGhvb2tpbmcgaW50byB0aGUKICAgICBFcnJvckRvY3VtZW50IG1lY2hhbmlzbSBhdCBydW50aW1lIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIEFQSTogbmV3IGFwX3V1ZW5jb2RlKCkgZnVuY3Rpb24gW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgQVBJOiBzY2FuX3NjcmlwdF9oZWFkZXJfZXJyX2NvcmUoKSBub3cgInB1YmxpYyIgYW5kIHJlbmFtZWQKICAgICBhcF9zY2FuX3NjcmlwdF9oZWFkZXJfZXJyX2NvcmUoKSBbRG91ZyBNYWNFYWNoZXJuXQoKICAqKSBUaGUgJ3N0YXR1cycgbW9kdWxlIHdpbGwgbm93IHNob3cgdGhlIHByb2Nlc3MgcGlkJ3MgYW5kIHRoZWlyCiAgICAgc3RhdGUgZXZlbiB3aXRob3V0IGZ1bGwgU1RBVFVTIGFjY291bnRpbmcuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBSZXN0b3JlIHRoZSBjbGllbnQgSVAgYWRkcmVzcyB0byB0aGUgZXJyb3IgbG9nIG1lc3NhZ2VzLCB0aGlzCiAgICAgd2FzIGxvc3QgZHVyaW5nIHRoZSB0cmFuc2l0aW9uIGZyb20gMS4yIHRvIDEuMy4gIEFkZCBhIG5ldwogICAgIGZ1bmN0aW9uIGFwX2xvZ19yZXJyb3IoKSB3aGljaCB0YWtlcyBhIHJlcXVlc3RfcmVjICogYW5kCiAgICAgZm9ybWF0cyBpdCBhcHByb3ByaWF0ZWx5LiAgW0RlYW4gR2F1ZGV0XSBQUiMyNjYxCgogICopIEN1cmUgYXBfY2ZnX2dldGxpbmUoKSBvZiBpdHMgbmFzdHkgaGFiaXQgb2YgY29tcHJlc3NpbmcgaW50ZXJuYWwKICAgICB3aGl0ZXNwYWNlIGluIGlucHV0IGxpbmVzIC0tIGluY2x1ZGluZyB3aXRoaW4gcXVvdGVkIHN0cmluZ3MuCiAgICAgW0tlbiBDb2FyXQogICAgIGJ1dCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIHNob3VsZCBjb250aW51ZSB0byBiZQogICAgIHN0cmlwcGVkIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgQ2xlYW51cCBvZiB0aGUgUHJpbnRQYXRoL1ByaW50UGF0aE9TMiBoZWxwZXIgZnVuY3Rpb25zLiBBdm9pZAogICAgIHRoZSB1Z2x5IHVzZSBvZiBhbiBlbnYuIHZhcmlhYmxlIGFuZCB1c2UgY29tbWFuZC1saW5lIGFyZ3MgZm9yCiAgICAgYWx0ZXJuYXRlICRQQVRILiBNYWtlIG1vcmUgbGlrZSBhZHZhbmNlZCAndHlwZSdzIGFzIHdlbGwuCiAgICAgW0ppbSBKYWdpZWxza2ldCgogICopIFRoZSBJUklYTjMyIFJ1bGUgd2FzIGJlaW5nIGlnbm9yZWQuIENvbmZpZ3VyZSBub3cgY29ycmVjdGx5IGFkZHMKICAgICAtbjMyIG9ubHkgaWYgSVJJWE4zMiBzYXlzIHRvLiBbSmltIEphZ2llbHNraSwgQWxhaW4gU3QtRGVuaXMKICAgICA8YWxhaW4uc3QtZGVuaXMgZWMuZ2MuY2E+XSBQUiMyNzM2CgogICopIENsZWFuIHVwIGEgd2FybmluZyBpbiBtb2RfcHJveHkuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZW5hbWVkIF9fRU1YX18gKGludGVybmFsIGRlZmluZSBvZiB0aGUgZ2NjIHBvcnQgdW5kZXIgT1MvMikgdG8gT1MyCiAgICAgZm9sbG93aW5nIHRoZSBzYW1lIGlkZWEgYXMgIk1TVkMgdnMgV0lOMzIiLiBBZGRpdGlvbmFsbHkgdGhlIHNyYy9vcy9lbXgvCiAgICAgZGlyZWN0b3J5IHdhcyByZW5hbWVkIHRvIHNyYy9vcy9vczIvIGZvciBjb25zaXN0ZW5jeS4KICAgICBbQnJpYW4gSGF2YXJkLCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGQgbmV3IFJ1bGUgU0hBUkVEX0NIQUlOIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBsaW5raW5nIG9mIERTTwogICAgIGZpbGVzIChoZXJlIG1vZHVsZXMpIGFnYWluc3Qgb3RoZXIgRFNPIGZpbGVzIChoZXJlIHNoYXJlZCBsaWJyYXJpZXMpLgogICAgIFRoaXMgaXMgZG9uZSBieSBkZXRlcm1pbmluZyBhIHN1YnNldCBvZiBMSUJTIHdoaWNoIGNhbiBiZSBzYWZlbHkgdXNlZCBmb3IKICAgICBsaW5raW5nIHRoZSBEU09zLCBpLmUuIFBJQyBsaWJzIGFuZCBzaGFyZWQgbGlicy4gIEN1cnJlbnRseSB0aGUgcnVsZSBpcwogICAgIGRpc2FibGVkIGZvciBhbGwgcGxhdGZvcm1zIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggdGhpcyAoZXhwZXJpbWVudGFsKQogICAgIHJ1bGUuIEJ1dCB3ZSBwcm92aWRlIGl0IG5vdyBmb3IgdGhvc2UgcGVvcGxlIGhvdyByYW4gaW50byBwcm9ibGVtcyBhbmQKICAgICB3YW50IHRvIGNhbWUgb3V0IGJ5IGZvcmNpbmcgbGlua2luZyBhZ2FpbnN0IERTT3MuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI1ODcKCiAgKikgRml4IHN1RVhFQyBzdGFydCBtZXNzYWdlOiBIYXMgdG8gYmUgb2YgYG5vdGljZScgbGV2ZWwgdG8gcmVhbGx5IGdldAogICAgIHByaW50ZWQgdG9nZXRoZXIgd2l0aCB0aGUgc3RhbmRhcmQgc3RhcnR1cCBtZXNzYWdlIGJlY2F1c2UgdGhlIGBub3RpY2UnCiAgICAgbGV2ZWwgaXMgaGFuZGxlZCBzcGVjaWFsIGluc2lkZSBhcF9sb2dfZXJyb3IoKSBmb3Igc3RhcnR1cCBtZXNzYWdlcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjc2MSBQUiMyNzYxIFBSIzI3NjUKCiAgKikgQWRkIGNvcnJlY3QgYG1vZGVsJyBNSU1FIHR5cGVzIGZyb20gUkZDMjA3NyB0byBtaW1lLnR5cGVzIGZpbGUuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI3MzIKCiAgKikgRml4ZWQgZXhhbXBsZXMgaW4gbW9kX3Jld3JpdGUuaHRtbCBkb2N1bWVudC4gCiAgICAgW1lvdWljaGlyb3UgS29nYSA8eS1rb2dhIGpwLkZyZWVCU0Qub3JnPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjc1NgoKICAqKSBBbGxvdyBhcF9yZWFkX3JlcXVlc3QgZXJyb3JzIHRvIHByb3BhZ2F0ZSB0aHJvdWdoIHRoZSBub3JtYWwgcmVxdWVzdAogICAgIGhhbmRsaW5nIGxvb3Agc28gdGhhdCB0aGUgY29ubmVjdGlvbiBjYW4gYmUgcHJvcGVybHkgY2xvc2VkIHdpdGgKICAgICBsaW5nZXJpbmdfY2xvc2UsIHRodXMgYXZvaWRpbmcgYSBwb3RlbnRpYWwgVENQIHJlc2V0IHRoYXQgd291bGQKICAgICBjYXVzZSB0aGUgY2xpZW50IHRvIG1pc3MgdGhlIEhUVFAgZXJyb3IgcmVzcG9uc2UuICBbUm95IEZpZWxkaW5nXQoKICAqKSBPbmUgbW9yZSBwb3J0YWJpbGl0eSBmaXggZm9yIEFQQUNJIHNoYWRvdyB0cmVlIHN1cHBvcnQ6IFN3YXAgb3JkZXIgb2YgYXdrCiAgICAgYW5kIHNlZCBpbiB0b3AtbGV2ZWwgY29uZmlndXJlIHNjcmlwdCB0byBhdm9pZCBzZWQgZmFpbHMgb24gc29tZQogICAgIHBsYXRmb3JtcyAoZm9yIGluc3RhbmNlIFN1bk9TIDQuMS4zIGFuZCBOQ1IgU3lzVikgYmVjYXVzZSBvZiB0aGUKICAgICBub24tbmV3bGluZS10ZXJtaW5lZCBvdXRwdXQgb2YgQXdrLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjcyOQoKICAqKSBQT1JUOiBORUMgRVdTNDgwMCBzdXBwb3J0LgogICAgIFtNQVRTVVVSQSBUYWthbm9yaSA8dC1tYXRzdXUgcHJvdGVpbi5vc2FrYS11LmFjLmpwPl0KCiAgKikgRml4IGEgc2VnZmF1bHQgaW4gdGhlIHByb3h5IG9uIE9TLzIuICBbQnJpYW4gSGF2YXJkXQoKICAqKSBGaXggV2luMzIgcGFydCBvZiBhcF9zcGF3bl9jaGlsZCgpIGJ5IHByb3ZpZGluZyBhIHJlYXNvbmFibGUgY2hpbGRfaW5mbwogICAgIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIGp1c3QgTlVMTC4gVGhpcyBmaXhlcyBhdCBsZWFzdCB0aGUgUmV3cml0ZU1hcAogICAgIHByb2dyYW1zIHVuZGVyIFdpbjMyLiBbTWFyY28gRGUgTWljaGVsZSA8bWRlbWljaGVsZSB0aW4uaXQ+XSBQUiMyNDgzCgogICopIEFkZCB3b3JrYXJvdW5kIHRvIHRvcC1sZXZlbCBgY29uZmlndXJlJyBzY3JpcHQgZm9yIGJyYWluIGRlYWQgCiAgICAgYGVjaG8nIGNvbW1hbmRzIHdoaWNoIGludGVycGV0IGVzY2FwZSBzZXF1ZW5jZXMgcGVyIGRlZmF1bHQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI2NTQKCiAgKikgTWFrZSBzdXJlIHRoYXQgdGhlIHBhdGggdG8gdGhlIFBlcmwgaW50ZXJwcmV0ZXIgaXMgY29ycmVjdGx5CiAgICAgYWRqdXN0ZWQgdW5kZXIgYG1ha2UgaW5zdGFsbCcgYWxzbyBmb3IgdGhlIHByaW50ZW52IENHSSBzY3JpcHQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI1OTUKIAogICopIFVwZGF0ZSB0aGUgbW9kX3Jld3JpdGUuaHRtbCBkb2N1bWVudCB0byBjb3JyZWN0bHkgcmVmbGVjdCB0aGUgc2l0dWF0aW9uCiAgICAgb2YgdGhlIGBwcm94eScgKGBbUF0nKSBmZWF0dXJlLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjY3OQoKICAqKSBGaXggYGluc3RhbGwtaW5jbHVkZXMnIHN1Yi10YXJnZXQgb2YgYGluc3RhbGwnIHRhcmdldCBpbiB0b3AtbGV2ZWwKICAgICBNYWtlZmlsZS50bXBsOiBUaGUgdW1hc2srY3AgYXBwcm9hY2ggZGlkbid0IHdvcmsgYXMgZXhwZWN0ZWQgKGVzcGVjaWFsbHkKICAgICBmb3IgdXNlcnMgd2hpY2ggZXh0cmFjdGVkIHRoZSBkaXN0cmlidXRpb24gdW5kZXIgJ3VtYXNrIDA3NycpLCBzbyByZXBsYWNlCiAgICAgaXQgYnkgYW4gZXhwbGljaXQgY3ArY2htb2QgYXBwcm9hY2guCiAgICAgW1JpY2hhcmQgTGxveWQsIEN1cnQgU2FtcHNvbiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjY1NiBQUiMyNjI2CiAKICAqKSBGaXggYGRpc3RjbGVhbicgYW5kIGBjbGVhbicgdGFyZ2V0cyBpbiBzcmMvTWFrZWZpbGUudG1wbCB0byBoYXZlIHNhbWUKICAgICBiZWhhdmlvciBhbmQgdG8gY2xlYW51cCBjb3JyZWN0bHkgZXZlbiB1bmRlciBlbmFibGVkIFNIQVJFRF9DT1JFIHJ1bGUuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFVzZSBhIG1vcmUgc3RyYWlnaHQgZm9yd2FyZCBhbmQgdGh1cyBsZXNzIHByb2JsZW1hdGljIFNlZCBjb21tYW5kIGluCiAgICAgc3JjL2hlbHBlci9ta2Rpci5zaCBzY3JpcHQuICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTWFrZSBzdXJlIHRoZSBgY29uZmlndXJlJyBzY3JpcHRzIGRvZXNuJ3QgZmFpbCB3aGVuIHRyeWluZyB0byBndWVzcyB0aGUKICAgICBkb21haW5uYW1lIG9mIHRoZSBtYWNoaW5lIGFuZCB0aGVyZSBhcmUgbXVsdGlwbGUgYGRvbWFpbm5hbWUnIGFuZAogICAgIGBzZWFyY2gnIGVudHJpZXMgaW4gL2V0Yy9yZXNvbHYuY29uZi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjcxMAoKICAqKSBBZGQgbm90ZSBhYm91dCB0aGUgU0hBUkVEX0NPUkUgcmVxdWlyZW1lbnQgb24gc29tZSBwbGF0Zm9ybXMgYWxzbyB0byB0aGUKICAgICBJTlNUQUxMIGZpbGUgYmVjYXVzZSBhIGxvdCBvZiB1c2VycyBkb24ndCByZWFkIGh0ZG9jcy9tYW51YWwvZHNvLmh0bWwKICAgICBmaXJzdC4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI3MDEKCiAgKikgRml4IGRvY3VtZW50ICJoeXBlcmxpbmsiIGZvciBkc28uaHRtbCBpbiBzcmMvQ29uZmlndXJhdGlvbi50bXBsCiAgICAgW0tudXQgQS5TeWVkIDxLbnV0LlN5ZWQgbmhoLm5vPl0gUFIjMjY3NAoKICAqKSBNb2RpZnkgbW9kX3Jld3JpdGUgdG8gdXBkYXRlIHRoZSBWYXJ5IHJlc3BvbnNlIGZpZWxkIGlmIHRoZSBVUkwgcmV3cml0aW5nCiAgICAgZW5naW5lIGRvZXMgYW55IG1hbmlwdWxhdGlvbnMgb3IgZGVjaXNpb25zIGJhc2VkIHVwb24gcmVxdWVzdCBmaWVsZHMuIAogICAgIFtLZW4gQ29hcl0gUFIjMTY0NAoKICAqKSBEb2N1bWVudCB0aGUgc3BlY2lhbCBBUEFDSSBiZWhhdmlvciBmb3IgaW5zdGFsbGF0aW9uIHBhdGhzIHdoZXJlCiAgICAgYGAvYXBhY2hlJycgaXMgYXBwZW5kZWQgdG8gcGF0aHMgdW5kZXIgc29tZSAod2VsbCBkZWZpbmVkLCBvZiBjb3Vyc2UpCiAgICAgc2l0dWF0aW9ucyB0byBwcmV2ZW50IHBvbGx1dGlvbiBvZiBzeXN0ZW0gbG9jYXRpb25zIHdpdGggQXBhY2hlIGZpbGVzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyNjYwCgogICopIEZpeGVkIHByb2JsZW0gd2l0aCBidWZmZXJlZCByZXNwb25zZSBtZXNzYWdlIG5vdCBiZWluZyBzZW50IGZvcgogICAgIHRoZSByZWFkX3JlcXVlc3QgZXJyb3IgY29uZGl0aW9ucyBvZiBVUkktdG9vLWxvbmcgKDQxNCkgYW5kCiAgICAgbWFsZm9ybWVkIGhlYWRlciBmaWVsZHMgKDQwMCkuICBbUm95IEZpZWxkaW5nXSBQUiMyNjQ2CgogICopIEFkZCBzdXBwb3J0IGZvciB0aGUgTWF4LUZvcndhcmRzOiBoZWFkZXIgbGluZSByZXF1aXJlZCBieSBSRkMyMDY4IGZvcgogICAgIHRoZSBUUkFDRSBtZXRob2QuIFRoaXMgYWxsb3dzIGFwYWNoZSB0byBUUkFDRSBhbG9uZyBhIGNoYWluIG9mIHByb3hpZXMKICAgICB1cCB0byBhIHByZWRldGVybWluZWQgZGVwdGguIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgRml4IFNIQVJFRF9DT1JFIHJ1bGU6IFRoZSBDRkxBR1NfU0hMSUIgdmFyaWFibGUgaXMgbm8gbG9uZ2VyIGRvdWJsZWQKICAgICAoY29tcGlsZXJzIGNvbXBsYWluZWQpIGFuZCB0aGUgLnNvLlYuUi5QIGZpbGVuYW1lIGV4dGVuc2lvbiB3YXMgYWRqdXN0ZWQKICAgICB0byBjb3JyZWN0bHkgcmVmbGVjdCB0aGUgMS4zLjIgdmVyc2lvbi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjY0NAoKICAqKSBTRUNVUklUWTogUGx1ZyAiLi4uIiBhbmQgb3RoZXIgY2Fub25pY2FsaXphdGlvbiBob2xlcyB1bmRlciBPUy8yLgogICAgIFtCcmlhbiBIYXZhcmRdCiAgCiAgKikgUE9SVDogaW1wbGVtZW50IHNlcmlhbGl6ZWQgYWNjZXB0cyBmb3IgT1MvMi4gIFtCcmlhbiBIYXZhcmRdCgogICopIG1vZF9pbmNsdWRlIGhhZCBwcm9ibGVtcyB3aXRoIHRoZSBmc2l6ZSBhbmQgZmxhc3Rtb2QgZGlyZWN0aXZlcwogICAgIHVuZGVyIFdJTjMyLiAgRml4IGFsc28gYXZvaWRzIHRoZSBtaW5vciBzZWN1cml0eSBob2xlIG9mIHVzaW5nCiAgICAgIi4uIiBwYXRocyBmb3IgZnNpemUgYW5kIGZsYXN0bW9kLgogICAgIFtNYW5vaiBLYXNpY2hhaW51bGEgPG1hbm9qayByYWxlaWdoLmlibS5jb20+XSBQUiMyMzU1CgogICopIEZpeGVkIHNvbWUgTWFrZWZpbGUgZGVwZW5kZW5jeSBwcm9ibGVtcy4gIFtEZWFuIEdhdWRldF0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjEKCiAgKikgRGlzYWJsZSB0aGUgaW5jb3JyZWN0IGVudHJ5IGZvciBhcHBsaWNhdGlvbi9tc3dvcmQgaW4gdGhlIAogICAgIG1vZF9taW1lX21hZ2ljICJtYWdpYyIgZmlsZSBiZWNhdXNlIGl0IGFsc28gbWF0Y2hlcyBvdGhlciBPZmZpY2UKICAgICBkb2N1bWVudHMuICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjYwOAoKICAqKSBGaXggYnJva2VuIFJBTkxJQiBoYW5kbGluZyBpbiBzcmMvQ29uZmlndXJlICh0aGUgZW50cnkgZnJvbQogICAgIHNyYy9Db25maWd1cmF0aW9uLnRtcGwgd2FzIGlnbm9yZWQpIGFuZCBhZGRpdGlvbmFsbHkgZm9yY2UgUkFOTElCIHRvCiAgICAgL2Jpbi90cnVlIHVuZGVyIEhQL1VYIHdoZXJlIHJhbmxpYiBleGlzdHMgYnV0IGlzIGRlcHJlY2F0ZWQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzI2MjcKICAgICAKICAqKSAnYXBhY2hlY3RsIHN0YXR1cycgZmFpbGVkIG9uIHNvbWUgc3lzdGVtcy4KICAgICBbU3RldmUgVmFuRGV2ZW5kZXIgPHN0ZXZldiBkYXJrd2luZy51b3JlZ29uLmVkdT4sIExhcnMgRWlsZWJyZWNodF0gUFIjMjYxMwoKICAqKSBBZGQgbmV3IGZsYWdzIGZvciBhcF91bnBhcnNlX3VyaV9jb21wb25lbnRzKCkgdG8gbWFrZSBpdCBnZW5lcmF0ZQogICAgIHRoZSBzY2hlbWU6Ly9zaXRlcGFydCBzdHJpbmcgb25seSwgb3IgdG8gb21pdCB0aGUgcXVlcnkgc3RyaW5nLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgV0lOMzI6IENhbm9uaWNhbGl6ZSBTZXJ2ZXJSb290IGJlZm9yZSBjaGVja2luZyB0byBzZWUgaWYgaXQKICAgICBpcyBhIHZhbGlkIGRpcmVjdG9yeS4gIFRoZSBmYWlsdXJlIHRvIGRvIHRoaXMgY2F1c2VkIGNlcnRhaW4KICAgICBTZXJ2ZXJSb290IHNldHRpbmdzIChlZy4gIlNlcnZlclJvb3QgL2FwYWNoZSIpIHRvIGJlIGltcHJvcGVybHkKICAgICByZWplY3RlZC4gIFtNYXJjIFNsZW1rb10KCiAgKikgR2xvYmFsIHJlbmFtaW5nIG9mIEMgaGVhZGVyIGZpbGVzIHRvIGJvdGggZ2V0IHJpZCBvZiBjb25mbGljdHMgd2l0aCB0aGlyZAogICAgIHBhcnR5IHBhY2thZ2VzIGFuZCB0byBhZ2FpbiByZWFjaCBjb25zaXN0ZW5jeToKICAgICAgIDEuIGNvbmYuaCAgICAgIC0+IGFwX2NvbmZpZy5oCiAgICAgICAyLiBjb25mX2F1dG8uaCAtPiBhcF9jb25maWdfYXV0by5oIFwgdGhlc2UgYXJlIG5vdyBtZXJnZWQKICAgICAgIDMuIGFwX2NvbmZpZy5oIC0+IGFwX2NvbmZpZ19hdXRvLmggLyBpbiB0aGUgY29uZmlnIHByb2Nlc3MKICAgICAgIDQuIGNvbXBhdC5oICAgIC0+IGFwX2NvbXBhdC5oCiAgICAgICA1LiBhcGN0eXBlLmggICAtPiBhcF9jdHlwZS5oCiAgICAgQmFja3dhcmQgY29tcGF0aWJpbGl0eSBmaWxlcyBmb3IgY29uZi5oIGFuZCBjb21wYXQuaCB3ZXJlIGNyZWF0ZWQuCgogICopIG1vZF9tbWFwX3N0YXRpYyB3aWxsIG5vIGxvbmdlciB0YWtlIGFjdGlvbiBvbiByZXF1ZXN0cyB1bmxlc3MgYXQgCiAgICAgbGVhc3Qgb25lICJtbWFwZmlsZSIgZGlyZWN0aXZlIGlzIHByZXNlbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIAogICAgIFRoaXMgZXhwZXJpbWVudGFsIG1vZHVsZSBoYXMgdG8gZG8gc29tZSBibGFjayBtYWdpYyB0byBvcGVyYXRlIAogICAgIGluc2lkZSB0aGUgY3VycmVudCBBUEkgYW5kIHRodXMgY3JlYXRlcyBzaWRlLWVmZmVjdHMgZm9yIG90aGVyIAogICAgIG1vZHVsZXMgdW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQogCiAgKikgQWRkIGNvbnNlcnZhdGl2ZSB0aWNrcyBhcm91bmQgbW9yZSBlZ3JlcCBhcmd1bWVudHMgaW4gdG9wLWxldmVsIGNvbmZpZ3VyZQogICAgIHRvIGF2b2lkIHByb2JsZW1zIHVuZGVyIGJyYWluLWRlYWQgcGxhdGZvcm1zIGxpa2UgRGlnaXRhbCBVTklYIChPU0YxKS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjU5NgoKICAqKSBtb2RfcmV3cml0ZSBjcmVhdGVkIFJld3JpdGVMb2NrIGZpbGVzIHVuZGVyIHRoZSBVSUQgb2YgdGhlIHBhcmVudAogICAgIHByb2Nlc3MsIHRodXMgdGhlIGNoaWxkIHByb2Nlc3NlcyBoYWQgbm8gd3JpdGUgYWNjZXNzIHRvIHRoZSBmaWxlcy4KICAgICBOb3cgYSBjaG93bigpIGlzIGRvbmUgb24gdGhlIGZpbGUgdG8gdGhlIHVpZCBvZiB0aGUgY2hpbGRyZW4sCiAgICAgaWYgYXBwbGljYWJsZS4gIFtMYXJzIEVpbGVicmVjaHQsIFJhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIzNDEKCiAgKikgQXV0b2dlbmVyYXRlIHNvbWUgSEFWRV9YWFhYWF9IIGRlZmluZXMgaW4gY29uZl9hdXRvLmggKGRldGVybWluZWQgdmlhCiAgICAgVGVzdENvbXBpbGUpIGluc3RlYWQgb2YgZGVmaW5pbmcgdGhlbSBtYW51YWxseSBpbiBjb25mLmggYmFzZWQgb24gbGVzcwogICAgIGFjY3VyYXRlIHBsYXRmb3JtIGRlZmluaXRpb25zLiAgVGhpcyB3YXkgd2Ugbm8gbG9uZ2VyIGhhdmUgdG8gZmlkZGxlIHdpdGgKICAgICBPUy10eXBlIGFuZC9vciBPUy12ZXJzaW9uIGlkZW50aWZpZXJzIHRvIGRpc2NvdmVyIHdoZXRoZXIgYSBzeXN0ZW0gaGVhZGVyCiAgICAgZmlsZSBleGlzdHMgb3Igbm90LiAgSW5zdGVhZCB3ZSBub3cgZGlyZWN0bHkgY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YKICAgICB0aG9zZSBlc290ZXJpYyBvbmVzLiAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjA5MywgUFIjMjM2MSwgUFIjMjM3NywgUFIjMjQzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUFIjMjUyNCwgUFIjMjUyNSwgUFIjMjUzMywgUFIjMjU2OQoKICAqKSBtb2Rfc2V0ZW52aWYgKEJyb3dzZXJNYXRjaCogYW5kIGZyaWVuZHMpIHdpbGwgbm93IG1hdGNoIGEgbWlzc2luZwogICAgIGZpZWxkIHdpdGggIl4kIi4gIFtLZW4gQ29hcl0KCiAgKikgU2V0IHRoZSBSVExEX0dMT0JBTCBkbG9wZW4gbW9kZSBwYXJhbWV0ZXIgdG8gYWxsb3cgZHluYW1pY2FsbHkgbG9hZGVkCiAgICAgbW9kdWxlcyB0byBsb2FkIHRoZWlyIG93biBtb2R1bGVzIGR5bmFtaWNhbGx5LiAgVGhpcyBpbXByb3ZlcyBtb2RfcGVybAogICAgIGFuZCBtb2RfcGhwMyB3aGVuIHRoZXNlIG1vZHVsZXMgYXJlIGxvYWRlZCBkeW5hbWljYWxseSBpbnRvIEFwYWNoZS4KICAgICBbUmFzbXVzIExlcmRvcmZdCgogICopIENhY2hlIGEgcHJveGllZCByZXF1ZXN0IGluIHRoZSBldmVudCB0aGF0IHRoZSBjbGllbnQgY2FuY2VscyB0aGUKICAgICB0cmFuc2ZlciwgcHJvdmlkZWQgdGhhdCB0aGUgY29uZmlndXJlZCBwZXJjZW50YWdlIG9mIHRoZSBmaWxlIGhhcwogICAgIGFscmVhZHkgYmVlbiB0cmFuc2ZlcnJlZC4gSXQgd29ya3MgZm9yIEhUVFAgdHJhbnNmZXJzIG9ubHkuICBUaGUgCiAgICAgbmV3IGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlIGlzIGNhbGxlZCBDYWNoZUZvcmNlQ29tcGxldGlvbi4gCiAgICAgW0dsZW4gUGFya2VyIDxnbGVuZWJvYiBud2xpbmsuY29tPl0gUFIjMjI3NwoKICAqKSBBZGQgdGhlICI8IURPQ1RZUEUgSFRNTCIgbWFnaWMgY29va2llIHVzZWQgYnkgbW9kZXJuIGRvY3VtZW50cyAoYW5kCiAgICAgcmVxdWlyZWQgYnkgSFRNTCAzLjIgYW5kIGxhdGVyKSB0byBtb2RfbWltZV9tYWdpYydzIGNvbmYvbWFnaWMuCiAgICAgW0FubmEgU2hlcmdvbGQgPGFubmEgaW5leHQuY28udWs+XQoKICAqKSBGaXggeWV0IGFub3RoZXIgc2lnbmFsLWJhc2VkIHJhY2UgY29uZGl0aW9uIGludm9sdmluZyBuZXN0ZWQgdGltZXJzLgogICAgIFNpZ25hbHMgc3Vjay4gIFtEZWFuIEdhdWRldF0KCiAgKikgc3VleGVjJ3MgZXJyb3IgbWVzc2FnZXMgaGF2ZSBiZWVuIGNsYXJpZmllZCBhIGxpdHRsZSBiaXQuICBbS2VuIENvYXJdCgogICopIENsZWFuIHVwIHNvbWUsIGJ1dCBwZXJoYXBzIG5vdCBhbGwsIDgtYml0IGNoYXJhY3RlciBzZXQgcHJvYmxlbXMKICAgICB3aXRoIGNvbmZpZyBmaWxlIHBhcnNpbmcsIGFuZCBVUkwgcGFyc2luZy4gIFdlIG5vdyBkZWZpbmUKICAgICBhcF9pc2RpZ2l0KCksIGFwX2lzdXBwZXIoKSwgLi4uIHdoaWNoIGNhc3QgdG8gYW4gKHVuc2lnbmVkIGNoYXIpLgogICAgIFRoaXMgc2hvdWxkIHdvcmsgb24gbW9zdCBtb2Rlcm4gdW5peGVzLgogICAgIFtEZWFuIEdhdWRldF0gUFIjODAwLCAyMjgyLCAyNTUzICAoYW5kIG90aGVycykKCiAgKikgVGhlICJoYW5kbGVyIG5vdCBmb3VuZCIgZXJyb3Igd2FzIGlzc3VlZCBpbiBjYXNlcyB3aGVyZSB0aGUgaGFuZGxlcgogICAgIHJlYWxseSBkaWQgZXhpc3QsIGJ1dCB3YXMganVzdCBkZWNsaW5pbmcgdG8gc2VydmUgdGhlIHJlcXVlc3QuCiAgICAgW0pvaG4gVmFuIEVzc2VuIDxqdmUgZ2FtZXJzLm9yZz5dIFBSIzI1MjkKCiAgKikgQWRkIER5bmFtaWMgU2hhcmVkIE9iamVjdCAoRFNPKSBzdXBwb3J0IGZvciBTQ081IChPcGVuU2VydmVyIDUuMC54KS4KICAgICBbUm9uYWxkIFJlY29yZCA8cnIgc2NvLmNvbT5dIFBSIzI1MzMKCiAgKikgVGhlIEFQQUNJIGxpYmV4ZWNkaXIgd2FzIG5vdCBleHRlbmRlZCB3aXRoIGFuICJhcGFjaGUvIiBzdWJkaXIKICAgICBpZiB0aGUgaW5zdGFsbGF0aW9uIHByZWZpeCBkaWRuJ3QgYWxyZWFkeSBjb250YWluICJhcGFjaGUiLCBidXQKICAgICBpdCBzaG91bGQgYmUgYmVjYXVzZSB0aGUgRFNPIGZpbGVzIGFyZSBBcGFjaGUtc3BlY2lmaWMuICBOb3cKICAgICBsaWJleGVjZGlyIGlzIHRyZWF0ZWQgdGhlIHNhbWUgd2F5IHN5c2NvbmZkaXIsIGRhdGFkaXIsIGxvY2Fsc3RhdGVkaXIKICAgICBhbmQgaW5jbHVkZWRpciBhcmUgYWxyZWFkeSB0cmVhdGVkLgogICAgIFtDaGFybGVzIExldmVydCA8Y2hhcmxlcyBjb21tLnBvbHltdGwuY2E+XSBQUiMyNTUxCgogICopIFRoZSA8TGltaXQ+IHBhcnNpbmcgcm91dGluZSB3YXMgaW5jb3JyZWN0bHkgdHJlYXRpbmcgbWV0aG9kcyBhcwogICAgIGNhc2UtaW5zZW5zaXRpdmUuICBbS2VuIENvYXJdCgogICopIFRoZSBhcF9icHJpbnRmKCkgY29kZSBuZWdsZWN0ZWQgdG8gdGVzdCBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igb24KICAgICB0aGUgY29ubmVjdGlvbi4gIGFwX2JmbHVzaCgpIG1pc2RpYWdub3NlZCBhIGZhaWx1cmUgYXMgYSBzdWNjZXNzLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgYWRkIHN1cHBvcnQgZm9yICNwZXJsIGFyZyBpbnRlcnBvbGF0aW9uIGluIG1vZF9pbmNsdWRlCiAgICAgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgQVBJOiBOYW1lIGNoYW5nZXMgb2YgdGFibGVfZWx0cyB0byBhcF90YWJsZV9lbHRzLCBpc190YWJsZV9lbXB0eQogICAgIHRvIGFwX2lzX3RhYmxlX2VtcHR5IGFuZCBiZ2V0ZmxhZyB0byBhcF9iZ2V0ZmxhZy4gW0JlbiBMYXVyaWVdCgogICopIFBPUlQ6IEFkZCBVbml4V2FyZSA3IHN1cHBvcnQKICAgICBbVmFkaW0gS29zdG9nbG9kb2ZmIDx2YWRpbSBvbGx5LnJ1Pl0gUFIjMjQ2MwoKICAqKSBGaXggdGhlIEd1ZXNzLURTTy1mbGFncy1mcm9tLVBlcmwgc3R1ZmYgaW4gc3JjL0NvbmZpZ3VyZTogInBlcmwiIHdhcwogICAgIHVzZWQgaW5zdGVhZCBvZiAiJFBFUkwiIHdoaWNoIGNvbnRhaW5zIHRoZSBjb3JyZWN0bHkgZGV0ZXJtaW5lZCBQZXJsCiAgICAgaW50ZXJwcmV0ZXIgKGltcG9ydGFudCBmb3IgaW5zdGFuY2Ugb24gc3lzdGVtcyB3aGVyZSAicGVybCIgYW5kICJwZXJsNSIKICAgICBleGlzdHMsIGxpa2UgQlNESSBvciBGcmVlQlNELCBldGMpLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyNTA1CgogICopIE1vdmUgdGhlIGluaXRpYWwgc3VFWEVDLXJlbGF0ZWQgc3RhcnR1cCBtZXNzYWdlIGZyb20gcGxhaW4KICAgICBmcHJpbnRmKCkvc3RkZXJyIHRvIGEgZGVsYXllZCBhcF9sb2dfZXJyb3IoKS1iYXNlZCBvbmUgdG8gYXZvaWQgcHJvYmxlbXMKICAgICB3aGVuIEFwYWNoZSBpcyBzdGFydGVkIGZyb20gaW5ldGQgKGluc3RlYWQgb2Ygc3RhbmRhbG9uZSkuIFVuZGVyIHRoaXMKICAgICBzaXR1YXRpb24gc3RhcnR1cCBtZXNzYWdlcyBvbiBzdGRlcnIgbGVhZCB0byBwcm9ibGVtcyAodGhlIGxpbmUgaXMgc2VudAogICAgIHRvIHRoZSBjbGllbnQgaW4gZnJvbnQgb2YgdGhlIHJlcXVlc3RlZCBkb2N1bWVudCkuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzg3MSwgUFIjMTMxOAoKICAqKSBBZGQgYSBmbGFnIHNvIGFwX2ZubWF0Y2goKSBjYW4gYmUgdXNlZCBmb3IgY2FzZS1ibGluZCBwYXR0ZXJuIG1hdGNoaW5nLgogICAgIFtLZW4gQ29hciwgRGVhbiBHYXVkZXRdCgogICopIFdJTjMyOiBEb24ndCBjb2xsYXBzZSBtdWx0aXBsZSBzbGFzaGVzIGluIFBBVEhfSU5GTy4KICAgICBbQmVuIExhdXJpZSwgQmlsbCBTdG9kZGFyZCA8d2dzdG9kZGEgdXMuaWJtLmNvbT5dIFBSIzIyNzQKCiAgKikgV0lOMzIgU0VDVVJJVFk6IEVsaW1pbmF0ZSB0cmFpbGluZyAiLiJzIGluIHBhdGggY29tcG9uZW50cy4gVGhlc2UgYXJlCiAgICAgaWdub3JlZCBieSB0aGUgV2luZG93cyBmaWxlc3lzdGVtLCBhbmQgc28gY2FuIGJlIHVzZWQgdG8gYnlwYXNzIHNlY3VyaXR5LgogICAgIFtCZW4gTGF1cmllLCBBbGV4ZWkgS29zdXRdLgoKICAqKSBXZSBub3cgYXR0ZW1wdCB0byBkdW1wIGNvcmUgd2hlbiB3ZSBnZXQgU0lHSUxMLiBbSmltIEphZ2llbHNraV0KCiAgKikgUE9SVDogcmVtb3ZlIGJyb2tlbiB0ZXN0IGZvciBNQVBfRklMRSBpbiBodHRwX21haW4uYy4KICAgICBbV2lsZnJlZG8gU2FuY2hleiA8d3NhbmNoZXogYXBwbGUuY29tPl0KCiAgKikgUE9SVDogQ2hhbmdlIHN1cHBvcnQvYXBhY2hlY3RsIHRvIHVzZSAia2lsbCAtMCAkcGlkIiB0byB0ZXN0IGlmIHRoZQogICAgIGh0dHBkIGlzIHJ1bm5pbmcuICBUaGlzIHNob3VsZCBiZSBtb3JlIHBvcnRhYmxlIHRoYW4gZmlndXJpbmcgb3V0CiAgICAgd2hpY2ggb2YgdGhyZWUgZG96ZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mICJwcyIgYXJlIGluc3RhbGxlZC4KICAgICBbYSBjYXN0IG9mIGRvemVuc10KCiAgKikgV0lOMzI6IElmIHdlIGNhbid0IGZpZ3VyZSBvdXQgaG93IHRvIGV4ZWN1dGUgYSBmaWxlIGluIGEgc2NyaXB0CiAgICAgZGlyZWN0b3J5LCBiYWlsIG91dCBvZiB0aGUgcmVxdWVzdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuICBbVyBHIFN0b2RkYXJkXQoKICAqKSBXSU4zMiBTRUNVUklUWTogRWxpbWluYXRlIGRpcmVjdG9yaWVzIGNvbnNpc3Rpbmcgb2YgdGhyZWUgb3IgbW9yZSBkb3RzOwogICAgIHRoZXNlIGFyZSB0cmVhdGVkIGJ5IFdpbjMyIGFzIGlmIHRoZXkgYXJlICIuLiIgYnV0IGFyZSBub3QgZGV0ZWN0ZWQgYnkKICAgICBvdGhlciBtYWNoaW5lcnkgd2l0aGluIEFwYWNoZS4gVGhpcyBpcyBzb21ldGhpbmcgb2YgYSBrbHVkZ2UgYnV0CiAgICAgZWxpbWluYXRlcyBhIHNlY3VyaXR5IGhvbGUuIFtNYW5vaiBLYXNpY2hhaW51bGEsIEJlbiBMYXVyaWVdCgogICopIE1vdmUgYXBfZXNjYXBlX3F1b3RlcygpIGZyb20gc3JjL2FwIHRvIHNyYy9tYWluL3V0aWwuYzsgaXQgdXNlcwogICAgIHBvb2xzIGFuZCB0aHVzIHBvbGx1dGVzIGxpYmFwICh1bnRpbCB0aGUgcG9vbCBzdHVmZiBpcyBtb3ZlZCB0aGVyZSkuCiAgICAgW0tlbiBDb2FyXQoKICAqKSBJbmRleElnbm9yZSBzaG91bGQgYmUgY2FzZS1ibGluZCBvbiBXaW4zMiAoYW5kIGFueSBvdGhlciBjYXNlLWF3YXJlCiAgICAgYnV0IGNhc2UtaW5zZW5zaXRpdmUgcGxhdGZvcm1zKS4gIE5ldyAjZGVmaW5lIGZvciB0aGlzIGFkZGVkIHRvIGNvbmYuaAogICAgIChDQVNFX0JMSU5EX0ZJTEVTWVNURU0pLiAgW0tlbiBDb2FyXSBQUiMyNDU1CgogICopIEVuYWJsZSBEU08gc3VwcG9ydCBmb3IgT3BlbkJTRCBpbiBnZW5lcmFsLCBub3Qgb25seSBmb3IgMi54LCBiZWNhdXNlIGl0CiAgICAgYWxzbyB3b3JrcyBmb3IgT3BlbkJTRCAxLnguIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBQT1JUOiBGaXggY29tcGlsYXRpb24gcHJvYmxlbSBvbiBBUk0gTGludXguCiAgICAgW1NhbSBLaW5ndG9uIDxzYW0gaWxsdW1pbmF0ZWQuY28udWs+XSBQUiMyNDQzCgogICopIExldCBBUEFDSSdzIGNvbmZpZ3VyZSBzY3JpcHQgZGV0ZXJtaW5lIHNvbWUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgICAgKEdyb3VwLCBQb3J0LCBTZXJ2ZXJBZG1pbiwgU2VydmVyTmFtZSkgdmlhIHNvbWUgaW50ZWxsaWdlbnQgdGVzdHMgdG8KICAgICByZW1vdmUgc29tZSBvZiB0aGUgY2xhc3NpY2FsIGh1cmRsZXMgZm9yIG5ldyB1c2VycyB3aGVuIHNldHRpbmcgdXAKICAgICBBcGFjaGUuIFRoaXMgaXMgZG9uZSBwZXIgZGVmYXVsdCBiZWNhdXNlIGl0IGlzIHVzZWZ1bCBmb3IgdGhlIGF2ZXJhZ2UKICAgICB1c2VyLiBQYWNrYWdlIGF1dGhvcnMgY2FuIHVzZSB0aGUgLS13aXRob3V0LWNvbmZhZGp1c3Qgb3B0aW9uIHRvIGRpc2FibGUKICAgICB0aGVzZSBjb25maWd1cmF0aW9uIGFkanVzdG1lbnRzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGRlZCBhbiBFWFRSQV9ERVBTIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHdoaWNoIGNhbiBiZSB1c2VkCiAgICAgdG8gYWRkIGFuIGV4dHJhIE1ha2VmaWxlIGRlcGVuZGVuY3kgZm9yIHRoZSBodHRwZCB0YXJnZXQsIGZvciBpbnN0YW5jZQogICAgIHRvIGV4dGVybmFsIHRoaXJkLXBhcnR5IGxpYnJhcmllcywgZXRjLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGQgPElmRGVmaW5lPi4uPC9JZkRlZmluZT4gc2VjdGlvbnMgdG8gdGhlIGNvcmUgbW9kdWxlICh3aXRoIHNhbWUgc3Bpcml0CiAgICAgYXMgPElmTW9kdWxlPi4uPC9JZk1vZHVsZT4gc2VjdGlvbnMpIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHNraXAgb3IgcHJvY2VzcwogICAgIGNvbnRhaW5lZCBjb21tYW5kcyBkZXBlbmRlbmQgb2YgYGAtRCBQQVJBTUVURVInJyBvcHRpb25zIG9uIHRoZSBjb21tYW5kCiAgICAgbGluZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBhY2hpZXZlIGxvZ2ljYWwgY29uZGl0aW9ucyBsaWtlIDxJZkRlZmluZQogICAgIFJldmVyc2VQcm94eT4gaW5zdGVhZCBvZiBwaHlzaWNhbGx5IG9uZXMgKGUuZy4gPElmTW9kdWxlIG1vZF9wcm94eS5jPikKICAgICBhbmQgdGh1cyBlc3BlY2lhbGx5IGNhbiBiZSB1c2VkIGZvciBjb25kaXRpb25hbGx5IGxvYWRpbmcgRFNPLWJhc2VkCiAgICAgbW9kdWxlcyB2aWEgTG9hZE1vZHVsZSwgZXRjLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUE9SVDogY2xlYW4gdXAgYSB3YXJuaW5nIGluIG1vZF9zdGF0dXMgZm9yIE9TLzIuICBbQnJpYW4gSGF2YXJkXQoKICAqKSBNYWtlIHRhYmxlIGVsZW1lbnRzIGNvbnN0LiBUaGlzIG1heSBwcmV2ZW50IG9ic2N1cmUgZXJyb3JzLiBbQmVuIExhdXJpZV0KCiAgKikgRml4IHBhcnNpbmcgb2YgRlRQIGBTSVpFJyByZXNwb25zZXMgaW4gcHJveHkgbW9kdWxlOiBUaGUgbmV3bGluZSB3YXMgbm90CiAgICAgdHJ1bmNhdGVkIHdoaWNoIGZvcmNlZCBmb2xsb3dpbmcgSFRUUCBoZWFkZXJzIHRvIGJlIGRhdGEgaW4gdGhlIEhUVFAKICAgICByZXBvbnNlLiBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgQ2hhcmxlcyBGdSA8Y2N3ZiBiYWNjaHVzLmNvbT5dIAogICAgIFBSIzI0MTIsIDIzNjcKCiAgKikgUG9ydGFiaWxpdHkgZml4IGZvciBBUEFDSSBzaGFkb3cgdHJlZSBzdXBwb3J0OiBTd2FwIG9yZGVyIG9mIGF3ayBhbmQgc2VkCiAgICAgaW4gdG9wLWxldmVsIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYXZvaWQgc2VkIGZhaWxzIG9uIHNvbWUgcGxhdGZvcm1zIChmb3IKICAgICBpbnN0YW5jZSBTdW5PUyA0LjEuMyBhbmQgTkNSIFN5c1YpIGJlY2F1c2Ugb2YgdGhlIG5vbi1uZXdsaW5lLXRlcm1pbmVkCiAgICAgb3V0cHV0IG9mIEF3ay4gW0JpbGwgSG91bGUgPGJob3VsZSBzYW5kaWVnb2NhLm5jci5jb20+XSBQUiMyNDM1CgogICopIEltcHJvdmUgcGVyZm9ybWFuY2Ugb2YgZGlyZWN0b3J5IGxpc3RpbmdzIChtb2RfYXV0b2luZGV4KSBieSBjb21wYXJpbmcKICAgICBpbnRlZ2VyIGtleXMgKGxhc3QtbW9kaWZpZWQgYW5kIHNpemUpIGFzIGludGVnZXJzIHJhdGhlciB0aGFuIGNvbnZlcnRpbmcKICAgICB0aGVtIHRvIHN0cmluZ3MgZmlyc3QuICBBbHNvIHVzZSBhIHNldCBvZiBleHBsaWNpdCBieXRlIHRlc3RzIHJhdGhlcgogICAgIHRoYW4gc3RyY21wKCkgdG8gY2hlY2sgZm9yIHBhcmVudCBkaXJlY3RvcnktbmVzcyBvZiBhbiBlbnRyeS4gIE9oLCBhbmQKICAgICBtYWtlIHN1cmUgdGhlIHBhcmVudCBkaXJlY3RvcnkgKGlmIGRpc3BsYXllZCkgaXMgKmFsd2F5cyogbGlzdGVkIGZpcnN0CiAgICAgcmVnYXJkbGVzcyBvZiB0aGUgc29ydCBrZXkuICBPdmVyYWxsIHBlcmZvcm1hbmNlIHdpbm5hZ2Ugc2hvdWxkIGJlIGdvb2QKICAgICBpbiBDUFUgdGltZSwgaW5zdHJ1Y3Rpb24gY2FjaGUsIGFuZCBtZW1vcnkgdXNhZ2UsIHBhcnRpY3VsYXJseSBmb3IgbGFyZ2UKICAgICBkaXJlY3Rvcmllcy4gIFtLZW4gQ29hcl0KCiAgKikgQWRkIGEgdGlueSBidXQgdXNlZnVsIGdvb2R5IHRvIEFQQUNJJ3MgY29uZmlndXJlIHNjcmlwdDogVGhlIGdlbmVyYXRpb24KICAgICBvZiBhIGNvbmZpZy5zdGF0dXMgc2NyaXB0IChhcyBHTlUgQXV0b2NvbmYgZG9lcykgd2hpY2ggcmVtZW1iZXJzIHRoZSB1c2VkCiAgICAgY29uZmlndXJlIGNvbW1hbmQgYW5kIGhlbmNlIGNhbiBiZSB1c2VkIHRvIHJlc3RvcmUgdGhlIGNvbmZpZ3VyYXRpb24gYnkKICAgICBqdXN0IHJlLXJ1bm5pbmcgdGhpcyBzY3JpcHQgb3IgZm9yIHJlbWVtYmVyaW5nIHRoZSBjb25maWd1cmF0aW9uIGJldHdlZW4KICAgICByZWxlYXNlcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkIGh0dHBkIC10ICh0ZXN0KSBvcHRpb24gZm9yIHJ1bm5pbmcgY29uZmlndXJhdGlvbiBzeW50YXggdGVzdHMgb25seS4KICAgICBJZiBzb21ldGhpbmcgaXMgYnJva2VuIGl0IGNvbXBsYWlucyBhbmQgZXhpdHMgd2l0aCBhIHJldHVybiBjb2RlCiAgICAgbm9uLWVxdWFsIHRvIDAuIFRoaXMgY2FuIGJlIHVzZWQgbWFudWFsbHkgYnkgdGhlIHVzZXIgdG8gY2hlY2sgdGhlIEFwYWNoZQogICAgIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgZWRpdGluZyBhbmQgaXMgYWxzbyBhdXRvbWF0aWNhbGx5IHVzZWQgYnkgYXBhY2hlY3RsCiAgICAgb24gKGdyYWNlZnVsKSByZXN0YXJ0IGNvbW1hbmQgdG8gbWFrZSBzdXJlIEFwYWNoZSBkb2Vzbid0IGRpZSBvbiByZXN0YXJ0cwogICAgIGJlY2F1c2Ugb2YgYSBjb25maWd1cmF0aW9uIHdoaWNoIGlzIG5vdyBicm9rZW4gc2luY2UgdGhlIGxhc3QgKHJlKXN0YXJ0LgogICAgIFRoaXMgd2F5IGBhcGFjaGVjdGwgcmVzdGFydCcgY2FuIGJlIHVzZWQgaW5zaWRlIGNyb25qb2JzIHdpdGhvdXQgaGF2aW5nCiAgICAgdG8gZXhwZWN0IEFwYWNoZSB0byBiZSBmYWxsaW5nIGRvd24uIEFkZGl0aW9uYWxseSB0aGUgaHR0cGQgLXQgY2FuIGJlIHJ1bgogICAgIHZpYSBgYXBhY2hlY3RsIGNvbmZpZ3Rlc3QnLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMzkzCiAgCiAgKikgTWlub3IgZGlzcGxheSBmaXggZm9yICJpbnN0YWxsIiB0YXJnZXQgb2YgdG9wLWxldmVsIE1ha2VmaWxlOgogICAgIHRoZSBkaXNwbGF5ZWQgaW5zdGFsbGF0aW9uIGNvbW1hbmQgd2FzIGluY29ycmVjdCBhbHRob3VnaCB0aGUKICAgICBleGVjdXRlZCBjb21tYW5kIHdhcyBjb3JyZWN0LiBOb3cgdGhleSBhcmUgaW4gc3luYy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjQwMgoKICAqKSBDb3JyZWN0IGluaXRpYWxpemF0aW9uIG9mIHZhcmlhYmxlIGBhbGxvd2VkX2dsb2JhbHMnIGluIGh0dHBfbWFpbi5jCiAgICAgW0p1c3RpbiBCcmFkZm9yZCA8anVzdGluIHVrYW5zLmVkdT5dIFBSIzI0MDAKCiAgKikgQXBhY2hlIHdvdWxkIGluY29ycmVjdGx5IGRvd25jYXNlIHRoZSBlbnRpcmUgQ29udGVudC1UeXBlIHBhc3NlZCBmcm9tCiAgICAgQ0dJcy4gIFRoaXMgYWZmZWN0ZWQgc2VydmVyLXB1c2ggc2NyaXB0cyBhbmQgc3VjaCB3aGljaCB1c2UKICAgICBtdWx0aXBhcnQveC1taXhlZC1yZXBsYWNlO2JvdW5kYXJ5PVRoaXNSYW5kb21TdHJpbmcuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiMyMzk0CgogICopIFBPUlQ6IFFOWCB1cGRhdGUgdG8gcHJvcGVybHkgZ3Vlc3MgMzItYml0IHN5c3RlbXMuCiAgICAgW1NlYW4gQm91ZHJlYXUgPHNlYW5iIHFueC5jb20+XSBQUiMyMzkwCgogICopIE1ha2Ugc3VyZSB0aGUgRFNPIGVtdWxhdGlvbiBjb2RlIGZvciBIUFVYIGZpbmRzIHRoZSBwcm9wcmlldGFyeSBzaGxfeHh4KCkKICAgICBmdW5jdGlvbnMgd2hpY2ggYXJlIGluIGxpYmRsZCB1bmRlciBIUFVYIDkvMTAuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIzNzgKCiAgKikgTWFrZSBzdXJlIHRoZSAiaW5zdGFsbCIgdGFyZ2V0IG9mIHRoZSB0b3AtbGV2ZWwgTWFrZWZpbGUgZG9lc24ndCBicmVhawogICAgIGJlY2F1c2Ugb2YgYSByZXR1cm4gY29kZSBvZiAxIGZyb20gYW4gImlmIiAoZm9yIGluc3RhbmNlIHVuZGVyIGJyYWluZGVhZAogICAgIFVsdHJpeCB0aGUgcmVzdWx0IGNvZGUgb2YgYW4gImlmIiBjb25zdHJ1Y3QgaXMgMSBpZiB0aGUgInRoZW4iIGNsYXVzZQogICAgIGRpZG4ndCBtYXRjaCkuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGQgYW4gYWRkaXRpb25hbCAiZHVtbXkiIHRhcmdldCB0byB0aGUgIiQoTElCKSIgdGFyZ2V0IGluIGdlbmVyYXRlZAogICAgIG1vZHVsZXMveHh4L01ha2VmaWxlJ3MgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBTVlI0IE1ha2UgdW5kZXIgImZ1bGwtRFNPIgogICAgIHNpdHVhdGlvbiAobm8gbGlieHh4LmEgYnVpbHQsIG9ubHkgbW9kX3h4eC5zbydzKSB3aGVyZSBMSUIgYW5kIE9CSlMgYXJlCiAgICAgZW1wdHkuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBEZWFuIEdhdWRldCwgTWFydGluIEtyYWVtZXJdCgogICopIFJlcGxhY2UgdHdvIGJhZCBzcHJpbnRmKCkgY2FsbHMgd2l0aCBhcF9zbnByaW50ZigpIHZhcmlhbnRzIGluCiAgICAgbW9kX3Jld3JpdGUuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggbWlzc2luZyB1c2FnZSBkZXNjcmlwdGlvbiBmb3IgTWV0YUZpbGVzIGRpcmVjdGl2ZS4KICAgICBbRGF2aWQgTWFjS2VuemllIDxkam0gdmEucHVibml4LmNvbT5dIFBSIzIzODQKCiAgKikgbW9kX2xvZ19jb25maWcgd291bGRuJ3QgbGV0IHZob3N0cyB1c2UgbG9nIGZvcm1hdHMgZGVmaW5lZCBpbiB0aGUKICAgICBtYWluIHNlcnZlci4gIFtDaHJpc3RvZiBEYW1pYW4gPGRhbWlhbiBtZWRpYWNvbnN1bHQuY29tPl0gUFIjMjA5MAoKICAqKSBtb2RfdXNlcnRyYWNrIHdhcyBjb3JydXB0aW5nIHRoZSBjbGllbnQgaG9zdG5hbWUuICBBcyBwYXJ0IG9mIHRoZQogICAgIGZpeCwgdGhlIGNvb2tpZSB2YWx1ZXMgd2VyZSBzbGlnaHRseSBleHRlbmRlZCB0byBpbmNsdWRlIHRoZQogICAgIGZ1bGx5IHF1YWxpZmllZCBob3N0bmFtZSBvZiB0aGUgY2xpZW50LgogICAgIFtEZWFuIEdhdWRldF0gUFIjMjE5MCwgMjIyOSwgMjM2NgoKICAqKSBGaXggYSB0eXBvIGluIHBvb2wgZGVidWdnaW5nIGNvZGUuICBbQWx2YXJvIE1hcnRpbmV6IEVjaGV2YXJyaWFdCgogICopIG1vZF91bmlxdWVfaWQgZGlkIG5vdCB3b3JrIG9uIGFscGhhIGxpbnV4IChpbiBnZW5lcmFsIG9uIGFueQogICAgIGFyY2hpdGVjdHVyZSB0aGF0IGhhcyA2NC1iaXQgdGltZV90KS4KICAgICBbQWx2YXJvIE1hcnRpbmV6IEVjaGV2YXJyaWFdCgogICopIFBPUlQ6IE1ha2UgU0NPIDUgKGFuZCBwcm9iYWJseSAzKSBjb21waWxlIGFnYWluLiBbQmVuIExhdXJpZV0KCiAgKikgUE9SVDogTkNSIE1QUkFTIHN5c3RlbXMgaGF2ZSB0aGUgc2FtZSBidWcgd2l0aCBTSUdIVVAgcmVzdGFydCB0aGF0CiAgICAgU29sYXJpcyBzeXN0ZW1zIGV4cGVyaWVuY2UuICBTbyBkZWZpbmUgV09SS0FST1VORF9TT0xBUklTX0JVRy4KICAgICBbS2xhdXMgV2ViZXIgPGt3ZWJlciBjaGVwaHJlbi5nZXJtYW55Lm5jci5jb20+XSBQUiMxOTczCgogICopIENoYW5nZSAiT3B0aW9ucyBOb25lIiB0byAiT3B0aW9ucyBGb2xsb3dTeW1MaW5rcyIgaW4gdGhlIAogICAgIDxEaXJlY3RvcnkgLz4gc2VjdGlvbiBvZiB0aGUgZGVmYXVsdCBhY2Nlc3MuY29uZi1kaXN0CiAgICAgKGFuZCAtd2luIGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3QgbWF0dGVyIHRoZXJlKS4gIFRoaXMgaGFzIGJldHRlcgogICAgIHBlcmZvcm1hbmNlLCBhbmQgbW9yZSBpbnR1aXRpdmUgc2VtYW50aWNzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBQT1JUOiBVcGRhdGVkIHN1cHBvcnQgZm9yIFVUUyAyLjEuMi4KICAgICBbRGF2ZSBEeWtzdHJhIDxkd2QgYmVsbC1sYWJzLmNvbT5dIFBSIzIzMjAKCiAgKikgRml4IHN5bWJvbCBleHBvcnQgbGlzdCAoc3JjL3N1cHBvcnQvaHR0cGQuZXhwKSBhZnRlciByZWNlbnQKICAgICBBUEkgY2hhbmdlcyBpbiB0aGUgY2hpbGQgc3Bhd25pbmcgYXJlYS4KICAgICBbSmVucy1Vd2UgTWFnZXIgPGp1bSBoZWxpb3MuZGU+XQoKICAqKSBXb3JrYXJvdW5kIGZvciBjb25maWd1cmUgc2NyaXB0IGFuZCBvbGQgYHRlc3QnIGNvbW1hbmRzIHdoaWNoIGRvIG5vdAogICAgIHN1cHBvcnQgdGhlIC14IGZsYWcgKGZvciBpbnN0YW5jZSB1bmRlciBwbGF0Zm9ybXMgbGlrZSBVbHRyaXgpLiBUaGlzIGlzCiAgICAgc29sdmVkIGJ5IGFub3RoZXIgaGVscGVyIHNjcmlwdCBmaW5kcHJnLnNoIHdoaWNoIHNlYXJjaGVzIGZvciBQZXJsIGFuZAogICAgIEF3ayBsaWtlIFByaW50UGF0aCBidXQgX3ZpYSBkaWZmZXJlbnQgbmFtZXNfLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZW1vdmUgdGhlIHN5c3RlbSgpIGNhbGwgZnJvbSBodHBhc3N3ZC5jLCB3aGljaCBlbGltaW5hdGVzIGEgc3lzdGVtCiAgICAgZGVwZW5kYW5jeS4gIFsiTS5ELlBhcmtlciIgPG1kcGMgbmV0Y29tLmNvbT5dIFBSIzIzMzIKCiAgKikgUE9SVDogRml4IGNvbXBpbGF0aW9uIGZhaWx1cmVzIG9uIE5FWFRTVEVQLgogICAgIFtSZXggRGlldGVyIDxyZGlldGVyIG1hdGgudW5sLmVkdT5dIFBSIzIyOTMsIDIzMTYKCiAgKikgUE9SVDogRl9OREVMQVkgaXMgYSB0eXBvLCBzaG91bGQgaGF2ZSBiZWVuIEZOREVMQVkuICBUaGVyZSdzIGFsc28KICAgICBPX05ERUxBWSBvbiB2YXJpb3VzIHN5c3RlbXMuICBbRGF2ZSBEeWtzdHJhIDxkd2QgYmVsbC1sYWJzLmNvbT5dIFBSIzIzMTMKCiAgKikgUE9SVDogaGVscGVycy9HdWVzc09TIHVwZGF0ZXMgZm9yIHZhcmlvdXMgdmVyc2lvbnMgZm9yIE5DUiBTVlI0LgogICAgIFtqdWVyZyBzY2hyZWluZXIgPGouc2NocmVpbmVyIHpoLmNoPiwKICAgICBCaWxsIEhvdWxlIDxCaWxsLkhvdWxlIFNhbkRpZWdvQ0EuTkNSLkNPTT5dIFBSIzIzMTAKCiAgKikgRml4IHJlY2VudGx5IGludHJvZHVjZWQgV2luMzIgY2hpbGQgc3Bhd25pbmcgY29kZSBpbiBtb2RfcmV3cml0ZS5jIHdoaWNoCiAgICAgd2FzIGJyb2tlbiBiZWNhdXNlIG9mIGludmFsaWQgYXBfcHN0cmNhdCgpIC0+IHN0cmNhdCgpIHRyYW5zZm9ybWF0aW9uLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBQcm94eSBDYWNoZSBGaXhlczogYWNjb3VudCBmb3IgZGlyZWN0b3J5IHNpemVzLCBmb3JrIG9mZiBnYXJiYWdlIGNvbGxlY3Rpb24KICAgICB0byBjb250aW51ZSBpbiBiYWNrZ3JvdW5kLCB1c2UgcHJlZGVmaW5lZCB0eXBlcyAob2ZmX3QsIHNpemVfdCwgdGltZV90KSwKICAgICBsb2cgdGhlIGN1cnJlbnQgY2FjaGUgdXNhZ2UgcGVyY2VudGFnZSBhdCBMb2dMZXZlbCBkZWJ1ZwogICAgIFtNYXJ0aW4gS3JhZW1lciwgYmFzZWQgb24gZGlzY3Vzc2lvbiBiZXR3ZWVuIERlYW4gR2F1ZGV0ICYgRGlyayB2YW5HdWxpa10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zLjAKCiAgKikgVXNpbmcgYSB0eXBlIG1hcCBmaWxlIGFzIGEgY3VzdG9tIGVycm9yIGRvY3VtZW50IHdhcyBub3QgcG9zc2libGUuCiAgICAgW0xhcnMgRWlsZWJyZWNodF0gUFIjMTAzMQoKICAqKSBBdm9pZCBwcm9ibGVtcyB3aXRoIGJyYWluZGVhZCBBd2tzIGJ5IGFkZGl0aW9uYWxseSBzZWFyY2hpbmcgZm9yIGdhd2sgCiAgICAgYW5kIG5hd2sgaW4gQVBBQ0kncyBjb25maWd1cmUgc2NyaXB0LgogICAgIFtEYXZlIER5a3N0cmEgPGR3ZCBiZWxsLWxhYnMuY29tPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjMxOQoKICAqKSBSZW5hbWUgbWQ1LmggdG8gYXBfbWQ1LmggdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggbmF0aXZlIE1ENSBvbgogICAgIHNvbWUgc3lzdGVtcy4gW1JhbmR5IFRlcmJ1c2hdCgogICopIENoYW5nZSB1c2FnZSBvZiBwZXJyb3IoKStmcHJpbnRmKHN0ZGVyciwuLi4pIGluIG1vZF9yZXdyaXRlIHRvCiAgICAgbW9yZSBwcm9wZXIgYXBfbG9nX2Vycm9yKCkgdmFyaWFudHMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1ha2Ugc3VyZSB0aGUgYXJndW1lbnQgZm9yIHRoZSAtLWFkZC1tb2R1bGUgb3B0aW9uIHRvIEFQQUNJJ3MgY29uZmlndXJlCiAgICAgc2NyaXB0IGlzIG9mIHR5cGUgW3BhdGgvdG8vXW1vZF94eHguYyBiZWNhdXNlIGFsbCBjYWxjdWxhdGlvbnMgaW5zaWRlCiAgICAgY29uZmlndXJlIGFuZCBzcmMvQ29uZmlndXJlIGRlcGVuZCBvbiB0aGlzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMzA3CgogICopIENoYW5nZXMgdXNhZ2Ugb2YgcGVycm9yL2ZwcmludGYgdG8gc3RkZXJyIHRvIG1vcmUgcHJvcGVyIGFwX2xvZ19lcnJvcgogICAgIGluIG1vZF9taW1lLCBtb2RfbG9nX3JlZmVyZXIsIG1vZF9sb2dfYWdlbnQsIGFuZCBtb2RfbG9nX2NvbmZpZy4KICAgICBbQnJpYW4gQmVobGVuZG9yZl0KCiAgKikgVmFyaW91cyBPUy8yIGNsZWFudXBzIFsiQnJpYW4gSGF2YXJkIiA8YnJpYW5oIGtoZWxkYXIuYXBhbmEub3JnLmF1Pl0KCiAgKikgUE9SVDogUU5YIG5lZWRlZCBhICNpbmNsdWRlIDxzeXMvbW1hbi5oPjsgYW5kIG5vdyBpdCB1c2VzIGZsb2NrCiAgICAgc2VyaWFsaXplZCBhY2NlcHQgdG8gaGFuZGxlIG11bHRpcGxlIHNvY2tldHMuCiAgICAgW1JvYiBTYWNjb2NjaW8gPHJvYnMgSW5maW5pdGVUZWNobm9sb2d5LmNvbT5dIFBSIzIyOTUsIDIyOTYKIAogICopIEhhdmUgTlQgcHJvcGVybHkgc2V0IHRoZSBkaXJlY3RvcnkgZm9yIENHSSBzY3JpcHRzIAogICAgICgmIG90aGVyIHNwYXduZWQgY2hpbGRyZW4pCiAgICAgW1cgRyBTdG9kZGFyZCA8d2dzdG9kZGEgdXMuaWJtLmNvbT5dCgogICopIFByb3BhZ2F0ZSBlbnZpcm9ubWVudCB0byBDR0kgc2NyaXB0cyBjb3JyZWN0bHkgaW4gV2luMzIuCiAgICAgW1cgRyBTdG9kZGFyZCA8d2dzdG9kZGEgdXMuaWJtLmNvbT5dIFBSIzIyOTQKCiAgKikgU29tZSBzeW1ib2wgcmVuYW1pbmc6CiAgICAgYXBfc3Bhd25fY2hpbGRfZXJyIGJlY2FtZSBhcF9zcGF3bl9jaGlsZAogICAgIGFwX3NwYXduX2NoaWxkX2Vycl9idWZmIGJlY2FtZSBhcF9ic3Bhd25fY2hpbGQKICAgICBzcGF3bl9jaGlsZCB3YXMgb2Jzb2xldGVkIGFuZCBtb3ZlZCB0byBjb21wYXQuaAogICAgIFtCcmlhbiBCZWhsZW5kb3JmXQoKICAqKSBVcGdyYWRlIHRoZSBjaGlsZCBzcGF3bmluZyBjb2RlIGluIG1vZF9yZXdyaXRlIGZvciB0aGUgUmV3cml0ZU1hcAogICAgIHByb2dyYW1zOiBhcF9zcGF3bl9jaGlsZF9lcnIoKSBpcyB1c2VkIGFuZCB0aGUgV2luMzIgY2FzZSBub3cgdXNlcwogICAgIENyZWF0ZVByb2Nlc3MoKSBpbnN0ZWFkIG9mIGEgbG93LWxldmVsIGV4ZWNsKCkgKHdoaWNoIGNhdXNlZCBwcm9ibGVtcyBpbgogICAgIHRoZSBwYXN0IHVuZGVyIFdpbjMyKS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQSBmZXcgY29zbWV0aWNzIGFuZCB0cml2aWFsIGVuaGFuY2VtZW50cyB0byBBUFhTIHRvIG1ha2UgdGhlCiAgICAgZ2VuZXJhdGVkIE1ha2VmaWxlIG1vcmUgdXNlciBmcmllbmRseS4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFByb3h5IEZpeDogVGhlIHByb3h5IHNwZWNpYWwgZmFpbHVyZSByb3V0aW5lIGFwX3Byb3h5ZXJyb3IoKQogICAgIHdhcyB1cGRhdGVkIHRvIHVzZSB0aGUgbm9ybWFsIGFwYWNoZSBlcnJvciBwcm9jZXNzaW5nLCB0aGVyZWJ5IGFsbG93aW5nCiAgICAgcHJveHkgZXJyb3JzIHRvIGJlIHRyZWF0ZWQgYnkgRXJyb3JEb2N1bWVudCdzIGFzIHdlbGwuIEZvciB0aGlzCiAgICAgcHVycG9zZSwgYSBuZXcgbW9kdWxlLXRvLWNvcmUgY29tbXVuaWNhdGlvbiB2YXJpYWJsZSAiZXJyb3Itbm90ZXMiCiAgICAgd2FzIGludHJvZHVjZWQ7IHRoZSBwcm94eSAoYW5kIHBvc3NpYmx5IG90aGVyIG1vZHVsZXMpIGNvbW11bmljYXRlcwogICAgIGl0cyBlcnJvciB0ZXh0IHVzaW5nIHRoaXMgdmFyaWFibGUuIEl0cyBjb250ZW50IGlzIGNvcGllZCB0byBhIG5ldwogICAgIGNnaS1lbnYtdmFyIFJFRElSRUNUX0VSUk9SX05PVEVTIGZvciB1c2UgYnkgRXJyb3JEb2N1bWVudHMuCiAgICAgVGhlIG9sZCBwcm94eSBzcGVjaWFsIGVycm9yIHJvdXRpbmUgYXBfcHJveHlfbG9nX3VlcnJvcigpCiAgICAgd2FzIHJlcGxhY2VkIGJ5IHJlZ3VsYXIgYXBfbG9nX2Vycm9yKCkgY2FsbHMsIG1hbnkgbWVzc2FnZXMgd2VyZSBtYWRlCiAgICAgbW9yZSBpbmZvcm1hdGl2ZS4gCiAgICAgW01hcnRpbiBLcmFlbWVyXSBQUiM0OTQsIDEyNTkKCiAgKikgU0VDVVJJVFk6IEEgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93IGluIHRoZSBmdHAgcHJveHkgd2FzIGZpeGVkLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgVHJhbnNmb3JtIHRoZSBjb25maWd1cmUgbWVzc2FnZSAiWW91IG5lZWQgcm9vdCBwcml2aWxlZ2VzIGZvciBzdUVYRUMiCiAgICAgZnJvbSBhIGZhdGFsIGVycm9yIGludG8gYSAobW9yZSBmcmllbmRseSkgd2FybmluZyBiZWNhdXNlIHRoZSBidWlsZGluZwogICAgICgibWFrZSIpIG9mIEFwYWNoZSB3ZSBjYW4gYWxsb3csIG9mIGNvdXJzZS4gUm9vdCBwcml2aWxlZ2VzIGFyZSBuZWVkZWQKICAgICBvbmx5IGZvciB0aGUgaW5zdGFsbGF0aW9uIHN0ZXAgKCJtYWtlIGluc3RhbGwiKS4gU28gbWFrZSBzdXJlIHRoZQogICAgIHVzZXIgaXMgYXdhcmUgb2YgdGhpcyBmYWN0IGJ1dCBsZXQgaGltIHByb2NlZWQgYXMgbG9uZyBhcyBoZSBjYW4uCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIyODgKICAKICAqKSBSZW5hbWVkIHRocmVlIG1vcmUgZnVuY3Rpb25zIHRvIGNvbW1vbiBhcF8gcHJlZml4IHdoaWNoIHdlIG1pc3NlZCBhdCB0aGUKICAgICBCaWcgU3ltYm9sIFJlbmFtaW5nIGJlY2F1c2UgdGhleSdyZSAjZGVmaW5lcyBhbmQgbm90IHJlYWwgQyBmdW5jdGlvbnM6CiAgICAgaXNfZGVmYXVsdF9wb3J0KCksIGRlZmF1bHRfcG9ydCgpLCBodHRwX21ldGhvZCgpLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBIHplcm8tbGVuZ3RoIG5hbWUgYWZ0ZXIgYSAkIGluIGFuIFNTSSBkb2N1bWVudCBzaG91bGQgY2F1c2UKICAgICBqdXN0IHRoZSAkIHRvIGJlIGluIHRoZSBleHBhbnNpb24uICBUaGlzIHdhcyBicm9rZW4gZHVyaW5nIHRoZQogICAgIHNlY3VyaXR5IGZpeGVzIGluIDEuMi41LiAgW0RlYW4gR2F1ZGV0XSBQUiMxOTIxLCAyMjQ5CgogICopIENhbGwgYXBfZGVzdHJveV9zdWJfcmVxKCkgaW4gYXBfYWRkX2NnaV92YXJzKCkgdG8gcmVjbGFpbSBzb21lCiAgICAgbWVtb3J5LiAgW1JvYiBTYWNjb2NjaW8gPHJvYnMgSW5maW5pdGVUZWNobm9sb2d5LmNvbT5dIFBSIzIyNTIKCiAgKikgRml4IHNyYy9zdXBwb3J0L2h0dHBkLmV4cCAoRFNPIGV4cG9ydCBmaWxlIHdoaWNoIGlzIGN1cnJlbnRseSBvbmx5CiAgICAgdXNlZCB1bmRlciBBSVgpIGJlY2F1c2Ugb2YgcmVjZW50IGNoYW5nZXMgdG8gZnVuY3Rpb24gbmFtZXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuM2I3CgogICopIE1ha2Ugc3VyZSBhIE1JTUUtdHlwZSBjYW4gYmUgZm9yY2VkIHZpYSBhIFJld3JpdGVSdWxlIGV2ZW4gd2hlbiBubwogICAgIHN1YnN0aXR1dGlvbiB0YWtlcyBwbGFjZSwgZm9yIGluc3RhbmNlIHZpYSB0aGUgZm9sbG93aW5nIHJ1bGU6CiAgICAgYGBSZXdyaXRlUnVsZSBebXlzY3JpcHQkIC0gW1Q9YXBwbGljYXRpb24veC1odHRwZC1jZ2ldJycgVGhpcyB3YXMgb2Z0ZW4KICAgICByZXF1ZXN0ZWQgYnkgdXNlcnMgaW4gdGhlIHBhc3QgdG8gZm9yY2UgYSBzaW5nbGUgc2NyaXB0IHdpdGhvdXQgYSAuY2dpCiAgICAgZXh0ZW5zaW9uIGFuZCBvdXRzaWRlIGFueSBjZ2ktYmluIGRpcnMgdG8gYmUgZXhlY3V0ZWQgYXMgYSBDR0kgcHJvZ3JhbS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjI1NAoKICAqKSBBIGZpeCBmb3IgcHJvdG9jb2wgaXNzdWVzIHN1cnJvdW5kaW5nIDQwMCwgNDA4LCBhbmQKICAgICA0MTQgcmVzcG9uc2VzLiBbRWQgS29ydGhvZl0KCiAgKikgSWdub3JlIE1heFJlcXVlc3RzUGVyQ2hpbGQgb24gV0lOMzIuIFtCcmlhbiBCZWhsZW5kb3JmXQoKICAqKSBGaXggZGlzY3JlcGFuY3kgaW4gcHJveHlfZnRwLmMgd2hpY2ggd2FzIGNhdXNpbmcgZmFpbHVyZXMgd2hlbiAKICAgICB0cnlpbmcgdG8gY29ubmVjdCB0byBjZXJ0YWluIGZ0cGQncywgc3VjaCBhcyBhbm9uZnRwZC4gIAogICAgIFtSaWNrIE9obmVtdXMgPHJpY2sgZWNvbXBjb24uY29tPl0KCiAgKikgTWFrZSBtb2RfcmV3cml0ZSB1c2UgYXBfb3Blbl9waXBlZF9sb2coKSBmb3IgUmV3cml0ZUxvZyBkaXJlY3RpdmUncwogICAgIGxvZ2ZpbGUgaW5zdGVhZCBvZiBmaWRkbGluZyBhcm91bmQgaXRzZWxmIHdpdGggY2hpbGQgc3Bhd25pbmcgc3R1ZmYuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1hZGUgUmVmZXJlcklnbm9yZSBjYXNlLWluc2Vuc2l0aXZlLgoKICAqKSBNb2RfbG9nX2FnZW50LCBtb2RfbG9nX3JlZmVyZXIgbm93IHVzZSBhcF9vcGVuX3BpcGVkX2xvZyBmb3IgcGlwZWQgbG9ncy4KICAgICBbQnJpYW4gQmVobGVuZG9yZl0KCiAgKikgUmVwbGFjZSB1c2Ugb2Ygc3Bhd25fY2hpbGQgd2l0aCBhcF9zcGF3bl9jaGlsZF9lcnJfYnVmZiwgdG8gbWFrZSBldmVyeXRoaW5nCiAgICAgInNhZmUiIHVuZGVyIFdpbjMyLiAgSW46IG1vZF9pbmNsdWRlLmMsIG1vZF9taW1lX21hZ2ljLmMKICAgICBbQnJpYW4gQmVobGVuZG9yZl0KCiAgKikgSW1wcm92ZSBSRkMxNDEzIHN1cHBvcnQuIFtCb2IgQmVjayA8YmVjayBib2ZoLnVjcy51YWxiZXJ0YS5jYT5dCgogICopIEZpeCBzdXBwb3J0IHNjcmlwdCBgZGJtbWFuYWdlJzogSXQgd2FzIHVuYWJsZSB0byBoYW5kbGUgc29tZSBzb3J0CiAgICAgb2YgcGFzc3dvcmRzLCBlc3BlY2lhbGx5IHBhc3N3b3JkcyB3aXRoICIwIiBjaGFycy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMjI0MgoKICAqKSBXSU4zMjogQ2xpY2tpbmcgb24gIkxhc3QgTW9kaWZpZWQiIGluIGEgZmFuY3kgaW5kZXggY2F1c2VkIGEgY3Jhc2guIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXSBQUiMyMjM4CgogICopIFdJTjMyOiBDR0lzIGNvdWxkIGNhdXNlIGEgaGFuZyAoYmVjYXVzZSBvZiBhIGRlYWRsb2NrIGluIHRoZSBzdGFuZGFyZCBDCiAgICAgbGlicmFyeSksIHNvIENHSSBoYW5kbGluZyBoYXMgYmVlbiBjaGFuZ2VkIHRvIHVzZSBXaW4zMiBuYXRpdmUgaGFuZGxlcwogICAgIGluc3RlYWQgb2YgQyBmaWxlIGRlc2NyaXB0b3JzLgogICAgIFtCZW4gTGF1cmllIGFuZCBCaWxsIFN0b2RkYXJkIDx3Z3N0b2RkYSB1cy5pYm0uY29tPl0gUFIjMTEyOSwgMTYwNwoKICAqKSBUaGUgcHJveHkgY2FjaGUgd291bGQgc3RvcmUgYW4gaW5jb3JyZWN0IGNvbnRlbnQtbGVuZ3RoIGluIHRoZSBjYWNoZWQKICAgICBmaWxlIGNvcHkgYWZ0ZXIgYSBjYWNoZSB1cGRhdGUuIFRoYXQgcmVzdWx0ZWQgaW4gcmVwZWF0ZWQgZmV0Y2hpbmcKICAgICBvZiB0aGUgb3JpZ2luYWwgY29weSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBjYWNoZWQgY29weS4KICAgICBbRXJuc3QgS2xvcHBlbmJ1cmcgPGtsb3BwZW4gaXNyLnVuaS1zdHV0dGdhcnQuZGU+XSBQUiMyMDk0CgogICopIFRoZSBNYWtlZmlsZXMgYXNzdW1lZCB0aGF0IERTTyBmaWxlcyBhcmUgYnVpbGQgdmlhICQoTEQpLiBUaGlzCiAgICAgaXMgYnJva2VuIGZvciB0d28gcmVhc29uczogRmlyc3Qgd2UgbmV2ZXIgZGVmaW5lZCBhdCBsZWFzdCBMRD1sZAogICAgIHNvbWV3aGVyZSB0byBtYWtlIHN1cmUgdGhpcyB3b3JrcyAoaXQgd2FzIHNpbGVudGx5IGFzc3VtZWQgdGhhdCBtb3N0IE1ha2UKICAgICBwcm92aWRlIGEgYnVpbHQtaW4gTEQgZGVmaW5pdGlvbiAtIEFSR0whKSBhbmQgc2Vjb25kIHVzaW5nIHRoZSBnZW5lcmljIExECiAgICAgdmFyaWFibGUgaXMgbm90IHRoZSB0cnV0aC4gSW5zdGVhZCBhIHNwZWNpYWwgdmFyaWFibGUgbmFtZWQgTERfU0hMSUIgaXMKICAgICByZWFzb25hYmxlIGJlY2F1c2UgYWx0aG91Z2ggImxkIiBpcyB1c3VhbGx5IHRoZSBkZWZhdWx0LCB0aGUgY29tbWFuZCBmb3IKICAgICBidWlsZGluZyBEU08gZmlsZXMgY2FuIGJlICJsaWJ0b29sIiBvciBldmVuICJjYyIgb24gc29tZSBzeXN0ZW1zLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZXBsYWNlIHRoZSBBZGRWZXJzaW9uUGxhdGZvcm0gZGlyZWN0aXZlIHdpdGggU2VydmVyVG9rZW5zIHdoaWNoCiAgICAgcHJvdmlkZXMgZm9yIG1vcmUgY29udHJvbCBvdmVyIHRoZSBmb3JtYXQgb2YgdGhlIFNlcnZlcjoKICAgICBoZWFkZXIgbGluZS4gU0VSVkVSX1NVQlZFUlNJT04gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZDsKICAgICBhbGwgbW9kdWxlIHNob3VsZCB1c2UgdGhlIGFwX2FkZF92ZXJzaW9uX2NvbXBvbmVudCgpCiAgICAgQVBJIGZ1bmN0aW9uIGluc3RlYWQuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBTdXBwb3J0IGZvciB0aGUgTkNSIE1QL1JBUyAzLjAKICAgICBbSm9obiBXaXRoZXJzIDx3aXRoZXJzIHNlbWkua2NzYy5td3IuaXJzLmdvdj5dCgogICopIFRoZSBMREZMQUdTX1NITElCX0VYUE9SVCB2YXJpYWJsZSBvZiBzcmMvQ29uZmlndXJhdGlvblsudG1wbF0gd2FzCiAgICAgbm90IHJldHJpZXZlZCBpbiBzcmMvQ29uZmlndXJlIGFuZCB0aHVzIHdhcyBub3QgdXNlYWJsZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KIAogICopIFZhcmlvdXMgTWFrZWZpbGUgY29uc2lzdGVuY3kgY2xlYW51cHM6CiAgICAgLSBtYWtlIE9TRElSIGFsc28gYXV0b21hdGljYWxseSBiZSByZWxhdGl2ZSB0byBzcmMvIGxpa2UgSU5DRElSCiAgICAgLSBTVUJESVJTIGlzIG5vdyBnZW5lcmF0ZWQgaW4gc3JjL01ha2VmaWxlIG9ubHkgYW5kIG5vdCBpbgogICAgICAgTWFrZWZpbGUuY29uZmlnIGJlY2F1c2UgaXQgaXMgYSBsb2NhbCBkZWZpbmUgZm9yIHRoaXMgbG9jYXRpb24uCiAgICAgLSByZW1vdmUgQlJPS0VOX0JQUklOVEZfRkxBR1MgYmVjYXVzZSBpcyBpdCBubyBsb25nZXIgdXNlZCBpbnNpZGUKICAgICAgIGFueSBNYWtlZmlsZSBidXQgbWFrZSBzdXJlIHRoYXQgYXQgbGVhc3QgdGhlICItSyBpbmxpbmUiIGlzIGtlcHQgaW4KICAgICAgIENGTEFHUyBmb3IgU0NPIDUuCiAgICAgLSB1cGRhdGUgdGhlICJkZXBlbmQiIHRhcmdldHMgaW4gTWFrZWZpbGUudG1wbCBmaWxlcyB0byB1c2UgJChPU0RJUiksIHRvby4KICAgICAtIHVwZGF0ZWQgdGhlIGRlcGVuZGVuY2llcyB0aGVpcnNlbGYKICAgICAtIHJlbW92ZWQgbm90IGV4aXN0aW5nIFNITElCIHZhcmlhYmxlIGZyb20gImNsZWFuIiB0YXJnZXRzCiAgICAgLSByZXBsYWNlZCBTSExJQl9PQkpTL1NITElCU19PQkogY29uc2lzdGVudGx5IHdpdGggT0JKU19QSUMgYmVjYXVzZSBPQkpTCiAgICAgICBhbHJlYWR5IGV4aXN0cyBhbmQgT0JKU19QSUMgYXJlIGFsc28ganVzdCBwbGFpbiBvYmplY3RzIGFuZCBoYXZlIG5vdAogICAgICAgZGlyZWN0bHkgdG8gZG8gd2l0aCAic2hhcmVkIiB0aGluZ3MuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCB0aGV5CiAgICAgICBjb250YWluIFBJQy4gU28gT0JKU19QSUMgaXMgdGhlIG1vcmUgY2Fub25pY2FsIG5hbWUuCiAgICAgLSBVcGRhdGVkIHRoZSBNYWtlZmlsZS1kZXBlbmRlbmN5IGxpbmVzIGZvciBPQkpTX1BJQwogICAgIC0gUmVtb3ZlZCB0aGUgTWFrZWZpbGUtZGVwZW5kZW5jeSBsaW5lIGluIENvbmZpZ3VyZSB0byBhdm9pZCBkb3VibGUKICAgICAgIGRlZmluaXRpb25zCiAgICAgLSByZXBsYWNlZCB1Z2x5IHh4LXNvLm8veHguc28tbyBoYWNrIHdpdGggYSBjbGVhbiBhbmQgY29uc2lzdGVudCB1c2FnZQogICAgICAgb2YgeHh4LmxvIGFzIEdOVSBsaWJ0b29sIGRvZXMgd2l0aCBpdHMgUElDIG9iamVjdHMKICAgICAtIHJlZHVjZSBsb2NhbCBjb21wbGV4aXR5IGluIG1vZHVsZXMgTWFrZWZpbGUudG1wbCBieSBtb3ZpbmcgdGhlIGxhc3QKICAgICAgIGV4aXN0aW5nIHRhcmdldCAiZGVwZW5kIiB0byB0aGUgZ2VuZXJhdGlvbiBzZWN0aW9uIGluIENvbmZpZ3VyZSwgdG9vLgogICAgIC0gcmVtb3ZlZCB0aGUgaGlzdG9yaWNhbCAkKFNQQUNFUikgd2hpY2ggd2FzIHVzZWQgaW4gdGhlIHBhc3QgdG9nZXRoZXIKICAgICAgIHdpdGggQlJPS0VOX0JQUklOVEZfRkxBR1MgdG8gYXZvaWQgemlnLXphZ3MgaW4gdGhlIGJ1aWxkIHByb2Nlc3MuIFRoaXMKICAgICAgIGlzIG5vIGxvbmdlciBuZWVkZWQuCiAgICAgLSBmb3JjZSB0aGUgYnVpbGQgYW5kIHJ1biBvZiB0aGUgZ2VuX3h4eCBwcm9ncmFtcyB1bmRlciBtYWluLyBhcyB0aGUKICAgICAgIGZpcnN0IHN0ZXAgYmVmb3JlIGJ1aWxkaW5nIHRoZSBvYmplY3RzIGJlY2F1c2UgaXQgbG9va3MgY2xlYW5lcgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBXSU4zMjogTWFrZSBXaW4zMiB3b3JrIGFnYWluIGFmdGVyIHRoZSAvZGV2L251bGwgRG9TIGZpeC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgV0lOMzI6IENoZWNrIGZvciBidWZmZXIgb3ZlcmZsb3dzIGluIGFwX29zX2Nhbm9uaWNhbF9maWxlbmFtZS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgV0lOMzI6IERvbid0IGZvcmNlIElTQVBJIGhlYWRlcnMgdG8gZmluaXNoIHdpdGggXG4uCiAgICAgW0ppbSBQYXR0ZXJzb24gPEppbS5QYXR0ZXJzb24gQ29nbm9zLkNPTT4sIEJlbiBMYXVyaWVdIFBSIzIwNjAKCiAgKikgV2hlbiBvcGVuaW5nICJjb25maWd1cmF0aW9uIiBmaWxlcyAobGlrZSBodHRwZC5jb25mLCBodGFjY2VzcwogICAgIGFuZCBodHBhc3N3ZCksIEFwYWNoZSB3aWxsIG5vdCBhbGxvdyB0aGVtIHRvIGJlIG5vbi0vZGV2L251bGwKICAgICBkZXZpY2UgZmlsZXMuIFRoaXMgY2xvc2VzIGEgRG9TIGhvbGUuIEF0IHRoZSBzYW1lIHRpbWUsCiAgICAgd2UgdXNlIGFwX3Bmb3BlbiB0byBvcGVuIHRoZXNlIGZpbGVzIHRvIGhhbmRsZSB0aW1lb3V0cy4KICAgICBbSmltIEphZ2llbHNraSwgTWFydGluIEtyYWVtZXJdCgogICopIEFwYWNoZSB3aWxsIG5vdyBsb2cgdGhlIHJlYXNvbiBpdHMgaHR0cGQgY2hpbGRyZW4gZXhpdCBpZiB0aGV5IGV4aXQKICAgICBkdWUgdG8gYW4gdW5leHBlY3RlZCBzaWduYWwuICAoSXQgcmVxdWlyZXMgYSBuZXcgcG9ydGluZyBkZWZpbmUsCiAgICAgU1lTX1NJR0xJU1QsIHdoaWNoIGlmIGRlZmluZWQgc2hvdWxkIHBvaW50IHRvIGEgbGlzdCBvZiB0ZXh0CiAgICAgZGVzY3JpcHRpb25zIG9mIHRoZSBzaWduYWxzIGF2YWlsYWJsZS4gIFNlZSBQT1JUSU5HLikgIFtEZWFuIEdhdWRldF0KCiAgKikgV0lOMzI6IGNoZGlyKCkgZG9lc24ndCBtYWtlIHNlbnNlIGluIGEgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudCAKICAgICBsaWtlIFdJTjMyLiAgQmVmb3JlLCBXaW4zMiBDR0kncyBjb3VsZCBoYXZlIGhhZCBzcG9yYWRpYyBmYWlsdXJlcyAKICAgICBpZiBhIGNoZGlyIGNhbGwgZnJvbSBvbmUgdGhyZWFkIHdhcyBtYWRlIGJldHdlZW4gYW5vdGhlciBjaGRpciBjYWxsIAogICAgIGFuZCBhIHNwYXduIGluIGFub3RoZXIgdGhyZWFkLiAgU28sIGZvciBub3cgZG9uJ3QgY2hkaXIgZm9yIENHSSBzY3JpcHRzIAogICAgIGluIFdJTjMyLiAgVGhlIGN1cnJlbnQgQ0dJICJzcGVjIiBpcyB1bmNsZWFyIGFzIHRvIHdoZXRoZXIgaXQncyAKICAgICBuZWNlc3NhcnkuICBMb25nLXRlcm0gZml4IGlzIHRvIGVpdGhlciBzZXJpYWxpemUgdGhlIGNoZGlyL3NwYXduIGNvbWJvIAogICAgIG9yIHVzZSBXSU4zMiBuYXRpdmUgY2FsbHMgdG8gc3Bhd24gYSBwcm9jZXNzLiAgVGhpcyB0ZW1wIGZpeCB3YXMgCiAgICAgbmVjZXNzYXJ5IHRvIHJlbW92ZSB0aGlzIGFzIGEgc2hvd3N0b3BwZXIgZm9yIDEuMydzIHJlbGVhc2UuIAogICAgIFtCcmlhbiBCZWhsZW5kb3JmXQoKICAqKSBDbGVhbnVwIHRoZSBzdUVYRUMgc3VwcG9ydCBpbiBBUEFDSSBhbmQgbWFrZSBpdCBtb3JlIHNhZmU6CiAgICAgMS4gQWRkIGJpZyBmYXQgaGludCBpbiBJTlNUQUxMIGFib3V0IHJpc2tzIGFuZCB0byByZWFkIHRoZQogICAgICAgIGh0ZG9jcy9tYW51YWwvc3VleGVjLmh0bWwgZG9jdW1lbnQgYmVmb3JlIHVzaW5nIHRoZSBzdWV4ZWMtcmVsYXRlZAogICAgICAgIGNvbmZpZ3VyZSBvcHRpb25zLgogICAgIDIuIE1ha2Ugc3VyZSB0aGUgdXNlciBoYXMgYXQgbGVhc3QgcHJvdmlkZWQgb25lIC0tc3VleGVjLXh4eHggb3B0aW9uCiAgICAgICAgKHNwZWNpZmllcyBzdUVYRUMgcGFyYW1ldGVycykgaW4gYWRkaXRpb24gdG8gLS1lbmFibGUtc3VleGVjIG9wdGlvbi4KICAgICAgICBJZiBvbmx5IC0tZW5hYmxlLXN1ZXhlYyBpcyBnaXZlbiBBUEFDSSBzdG9wcyB3aXRoIGEgaGludCB0byBJTlNUQUxMCiAgICAgICAgYW5kIGh0ZG9jcy9tYW51YWwvc3VleGVjLmh0bWwgZG9jdW1lbnRzLgogICAgIDMuIFByb3ZpZGUgdHdvIGFkZGl0aW9uYWwgLS1zdWV4ZWMteHh4eCBvcHRpb25zIHRvIG1ha2UgdGhlIHN1RVhFQwogICAgICAgIGNvbmZpZ3VyYXRpb24gY29tcGxldGUgKGVzcGVjaWFsbHkgZm9yIHBhY2thZ2UgbWFpbnRhaW5lcnMgd2hvIGVsc2UKICAgICAgICBoYWQgdG8gcGF0Y2ggdGhlIHNvdXJjZSB0cmVlKSBieSBwcm92aWRpbmcgd2F5cyB0byBjb25maWd1cmUgbWluaW1hbAogICAgICAgIFVJRC9HSUQgYW5kIHNhZmUgUEFUSCwgdG9vLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBDbGVhbnVwIG9mIHRoZSBgY29uZmlndXJlIC0tc2hhZG93JyBwcm9jZXNzOgogICAgIC0gbWFrZSBzdXJlIHRoZSBjb25maWd1cmUgc2NyaXB0IGNyZWF0ZXMgaXRzIHRlbXBvcmFyeSBmaWxlcyBpbiB0aGUKICAgICAgIHNoYWRvdyB0cmVlIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHBhcmFsbGVsIGNvbmZpZ3VyZSBydW5zCiAgICAgLSByZW1vdmVkIHVubmVjZXNzYXJ5IG9wdGlvbiAiLXIiIGZyb20gInJtIiBjYWxsIGZvciBNYWtlZmlsZXMKICAgICAtIG1ha2Ugc3VyZSB0aGUgY29uZmlndXJlIHNjcmlwdHMgY3JlYXRlcyB0aGUgc2hhZG93LXdyYXBwZXIgTWFrZWZpbGUKICAgICAgIG9ubHkgd2hlbiBubyBzaGFkb3cgdHJlZXMgYWxyZWFkeSBleGlzdHMKICAgICAtIG1ha2Ugc3VyZSAibWFrZSBkaXN0Y2xlYW4iIHJlbW92ZXMgdGhlIHNoYWRvdy13cmFwcGVyIE1ha2VmaWxlIGJ1dCBvbmx5CiAgICAgICB3aGVuIG5vIG1vcmUgc2hhZG93IHRyZWVzIGV4aXN0cwogICAgIC0gb3ZlcmhhdWxlZCBta3NoYWRvdy5zaCBzY3JpcHQ6IG5vdyBpdHMgbW9yZSBJRlMtc2FmZSBhbmQgYXBwcm94LiB0d2ljZQogICAgICAgYXMgZmFzdCAoaW4gdGhlIHBhc3QgaXQgbmVlZGVkIDcwc2VjLCBub3cgaXQgcnVucyBqdXN0IDM4c2VjKQogICAgIC0gbWFrZSBzdXJlIENWUyBkb2VzIG5vdCBjb21wbGFpbiBhYm91dCB0aGUgY3JlYXRlZCBmaWxlcwogICAgICAgTWFrZWZpbGxlLjxnbnV0cmlwbGU+IGFuZCBkaXJlY3RvcmllcyBzcmMuPGdudXRyaXBsZT4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkZWQgdGhlIGFwX2FkZF92ZXJzaW9uX2NvbXBvbmVudCgpIEFQSSByb3V0aW5lIGFuZCB0aGUKICAgICBBZGRWZXJzaW9uUGxhdGZvcm0gY29yZSBkaXJlY3RpdmUuICBUaGUgZmlyc3QgYWxsb3dzIG1vZHVsZXMgdG8KICAgICBkZWNsYXJlIHRoZW1zZWx2ZXMgaW4gdGhlIFNlcnZlciByZXNwb25zZSBoZWFkZXIgZmllbGQgdmFsdWUsCiAgICAgYXVnbWVudGluZyB0aGUgU0VSVkVSX1NVQlZFUlNJT04gZGVmaW5lIGluIHRoZSBDb25maWd1cmF0aW9uIGZpbGUKICAgICB3aXRoIHJ1bi10aW1lIHNldHRpbmdzIChtb3JlIHVzZWZ1bCBpbiBhIGxvYWRhYmxlLW1vZHVsZSBlbnZpcm9ubWVudCkuCiAgICAgQWRkVmVyc2lvblBsYXRmb3JtIGluc2VydHMgYSBjb21tZW50IHN1Y2ggYXMgIihVTklYKSIgb3IgIihXaW4zMikiCiAgICAgaW50byB0aGUgc2VydmVyIHZlcnNpb24gc3RyaW5nLiAgW0tlbiBDb2FyXSBQUiMyMDU2CgogICopIE1pbm9yIHN0YWJpbGl0eSB0d2Vha3MgdG8gYXZvaWQgY29yZSBkdW1wcyBpbiBhcF9zbnByaW50Zi4KICAgICBbTWFydGluIEtyYWVtZXJdCgogICopIEVtaXQgdGhlICJBY2NlcHQtUmFuZ2UiIGhlYWRlciBmb3IgdGhlIGRlZmF1bHQgaGFuZGxlci4KICAgICBbQnJpYW4gQmVobGVuZG9yZl0gUFIjMTQ2NAoKICAqKSBBZGQgYSBub3RlIHRvIGh0dHBkLmNvbmYtZGlzdCB0aGF0IGFwYWNoZSB3aWxsIG9uIHNvbWUgc3lzdGVtcyBmYWlsCiAgICAgdG8gc3RhcnQgd2hlbiB0aGUgR3JvdXAgIyBpcyBzZXQgdG8gYSBuZWdhdGl2ZSBvciBsYXJnZSBwb3NpdGl2ZSB2YWx1ZS4KICAgICBbTWFydGluIEtyYWVtZXJdCgogICopIE1ha2Ugc3VyZSB0aGUgbW9kdWxlIGV4ZWN1dGlvbiBvcmRlciBpcyBjb3JyZWN0IGV2ZW4gd2hlbiBzb21lIG1vZHVsZXMKICAgICBhcmUgbG9hZGVkIHVuZGVyIHJ1bnRpbWUgKGBMb2FkTW9kdWxlJykgdmlhIHRoZSBEU08gbWVjaGFuaXNtOgogICAgIDEuIFRoZSBsaXN0IG9mIGxvYWRlZCBtb2R1bGVzIGlzIG5vdyBhIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBvbmUKICAgICAgICBhbmQgbm90IHRoZSBvcmlnaW5hbCBzdGF0aWNhbGx5IGxpc3QgZnJvbSBtb2R1bGVzLmMKICAgICAyLiBUaGUgbG9hZGVkIG1vZHVsZXMgYXJlIG5vdyBjb3JyZWN0bHkgc2V0dXAgYnkgTG9hZE1vZHVsZSBmb3IKICAgICAgICBsYXRlciB1c2UgYnkgdGhlIEFkZE1vZHVsZSBjb21tYW5kLgogICAgIDMuIFdoZW4gdGhlIERTTyBtZWNoYW5pc20gZm9yIG1vZHVsZXMgaXMgdXNlZCBBUEFDSSdzIGBpbnN0YWxsJwogICAgICAgIHRhcmdldCBub3cgZW5hYmxlcyBhbGwgY3JlYXRlZCBgTG9hZE1vZHVsZScgbGluZXMgcGVyIGRlZmF1bHQgYmVjYXVzZQogICAgICAgIHRoaXMgaXMgYm90aCBhbHJlYWR5IGV4cGVjdGVkIGJ5IHRoZSB1c2VyIF9hbmRfIG5lZWRlZCB0byBhdm9pZAogICAgICAgIGNvbmZ1c2lvbiB3aXRoIHRoZSBuZXh0IHBvaW50IGFuZCByZWR1Y2VzIHRoZSBNYWtlZmlsZS50bXBsIGNvbXBsZXhpdHkKICAgICA0LiBXaGVuIHRoZSBEU08gbWVjaGFuaXNtIGZvciBtb2R1bGVzIGlzIHVzZWQsIEFQQUNJJ3MgYGluc3RhbGwnCiAgICAgICAgdGFyZ2V0IG5vdyBhZGRpdGlvbmFsbHkgbWFrZXMgc3VyZSB0aGUgbW9kdWxlIGxpc3QgaXMgcmVjb25zdHJ1Y3RlZAogICAgICAgIHZpYSBhIGNvbXBsZXRlIGBDbGVhck1vZHVsZUxpc3QrQWRkTW9kdWxlLi4uJyBlbnRyeS4KICAgICA1LiBUaGUgc3VwcG9ydCB0b29sIGBhcHhzJyBub3cgYWxzbyBtYWtlcyBzdXJlIGFuIEFkZE1vZHVsZSBjb21tYW5kCiAgICAgICAgaXMgYWRkZWQgaW4gYWRkaXRpb24gdG8gdGhlIExvYWRNb2R1bGUgY29tbWFuZC4KICAgICA2LiBUaGUgbW9kdWxlcy5jIGdlbmVyYXRpb24gd2FzIGV4dGVuZGVkIHRvIG5vdyBjb250YWluIHR3bwogICAgICAgIGNvbW1lbnRzIHRvIG1ha2Ugc3VyZSBubyBvbmUgaXMgY29uZnVzZWQgYnkgdGhlIGNvbmZ1c2luZyB0ZXJtaW5vbG9neQogICAgICAgIG9mIGxvYWRpbmcvbGlua2luZyAod2UgdXNlIGxvYWQ9bGluaytsb2FkICYgbGluaz1hY3RpdmF0ZSBpbnN0ZWFkIG9mCiAgICAgICAgdGhlIG9idmlvdXMgbG9hZD1hY3RpdmF0ZSAmIGxpbms9bGluayA6LSggKQogICAgIFRoaXMgd2F5IG5vdyB0aGVyZSBpcyBubyBsb25nZXIgYSBkaWZmZXJlbmNlIHVuZGVyIGV4ZWN1dGlvbiB0aW1lIGJldHdlZW4KICAgICBzdGF0aWNhbGx5IGFuZCBkeW5hbWljYWxseSBsaW5rZWQgbW9kdWxlcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHRoZSBnZW5lcmF0ZWQgbW9kX3h4eC5jIGZyb20gImFweHMgLWcgLWYgeHh4IiBhZnRlciB0aGUKICAgICBCaWcgU3ltYm9sIFJlbmFtaW5nLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkIGEgY29tbWVudCB0byBtb2RfZXhhbXBsZS5jIHNob3dpbmcgdGhlIGZvcm1hdCBvZiBhIEZMQUcgY29tbWFuZAogICAgIGhhbmRsZXIuICBbS2VuIENvYXJdCgogICopIFN0YW5kYXJkaXplZCB0aGUgdGltZSBmb3JtYXQgaW4gbW9kX3N0YXR1cyB0byBtYXRjaCB0aGF0IG9mIG90aGVyIAogICAgIHBsYWNlcyBpbiB0aGUgY29kZSAoZS5nLiBEQVRFX0dNVCkuICBQUiMxNTUxCgogICopIEZpeCBoYW5kbGluZyBvZiAlWiBpbiB0aW1lZm10IHN0cmluZ3MgZm9yIHRob3NlIHBsYXRmb3JtcyB3aXRoIG5vIHRpbWUKICAgICB6b25lIGluZm9ybWF0aW9uIGluIHRoZWlyIHRtIHN0cnVjdC4gW1BhdWwgRWdnZXJ0IDxlZ2dlcnQgdHdpbnN1bi5jb20+XQogICAgIFBSIzc1NAoKICAqKSBNYWtlcyBtb2RfcmV3cml0ZSwgbW9kX2xvZ19jb25maWcsIG1vZF9zdGF0dXMgYW5kIHRoZSBTZXJ2ZXJTaWduYXR1cmUgCiAgICAgZmVhdHVyZSBjb21wYXRpYmxlIHdpdGggJ1VzZUNhbm9uaWNhbE5hbWUgb2ZmJyBieSBjaGFuZ2luZyAgCiAgICAgci0+c2VydmVyLT5zZXJ2ZXJfaG9zdG5hbWUgdG8gYXBfZ2V0X3NlcnZlcl9uYW1lKCkuICBBbmQgSSBjaGFuZ2VkIHNvbWUgCiAgICAgZnVuY3Rpb25zIHdoaWNoIHVzZSByLT5zZXJ2ZXItPnBvcnQgdG8gdXNlIGFwX2dldF9zZXJ2ZXJfcG9ydCgpIGluc3RlYWQsIAogICAgIGJlY2F1c2UgaWYgdGhlcmUncyBubyBQb3J0IGRpcmVjdGl2ZSBpbiB0aGUgY29uZmlnIHItPnNlcnZlci0+cG9ydCBpcyAwLgogICAgIFtMYXJzIEVpbGVicmVjaHRdCgogICopIGdldC9zZXRfbW9kdWxlX2NvbmZpZyBhcmUgdHJpdmlhbCBlbm91Z2ggdG8gYmUgYmV0dGVyIG9mZiBpbmxpbmUuICBXb3J0aAogICAgIDEuNSUgcGVyZm9ybWFuY2UgYm9vc3QuIFtEZWFuIEdhdWRldF0KCiAgKikgRml4IG9mZi1ieS1vbmUgZXJyb3IgaW4gYXBfcHJveHlfZGF0ZV9jYW5vbigpIGluIHByb3h5X3V0aWwuYwogICAgIHdoZW4gZW5zdXJpbmcgJ3gnIGlzIGF0IGxlYXN0IDMwLWNoYXJzIGJpZy4gW0ppbSBKYWdpZWxza2ksCiAgICAgQnJpYW4gQmVobGVuZG9yZl0KCiAgKikgW0JTMjAwMCBzZWN1cml0eV0gQlMyMDAwIG5lZWRzIGFuIGV4dHJhIGF1dGhlbnRpY2F0aW9uIHRvIGluaXRpYWxpemUKICAgICB0aGUgdGFzayBlbnZpcm9ubWVudCB0byB0aGUgdW5wcml2aWxlZ2VkIFVzZXIgaWQuIE90aGVyd2lzZSBDR0kgc2NyaXB0cwogICAgIHdvdWxkIGhhdmUgYSB3YXkgdG8gZ2FpbiBzdXBlciB1c2VyIGFjY2Vzcy4gW01hcnRpbiBLcmFlbWVyXQoKICAqKSBGaXggZGVidWcgbG9nIG1lc3NhZ2VzIGZvciBCUzIwMDAvT1NEOiBpbnN0ZWFkIG9mIGxvZ2dpbmcgdGhlIHdob2xlCiAgICAgYWJzb2x1dGUgcGF0aCwgb25seSBsb2cgYmFzZSBuYW1lIG9mIGxvZ2dpbmcgc291cmNlIGFzIGlzIGRvbmUKICAgICBpbiB1bml4LiBbTWFydGluIEtyYWVtZXJdCgogICopIFJvbmFsZCBUc2NoYWxhZXIncyBBY2NlcHQtRW5jb2RpbmcgcGF0Y2ggLSBwcmVzZXJ2ZSB0aGUgIngtIiBpbgogICAgIHRoZSBlbmNvZGluZyB0eXBlIGZyb20gdGhlIEFjY2VwdC1FbmNvZGluZyBoZWFkZXIgKGlmIGl0J3MgdGhlcmUpCiAgICAgYW5kIHVzZSBpdCBpbiB0aGUgcmVzcG9uc2UsIGFzIHRoYXQncyBwcm9iYWJseSB3aGF0IGl0J2xsIGJlIGV4cGVjdGluZy4KICAgICBbPFJvbmFsZC5Uc2NoYWxhZXIgcHNpLmNoPl0KCiAgKikgRml4IHRvIG1vZF9hbGlhczogdHJhbnNsYXRlX2FsaWFzX3JlZGlyIGlzIGRlYWxpbmcgd2l0aAogICAgIGEgVVJJLCBub3QgYSBmaWxlbmFtZSwgc28gdGhlIGNoZWNrIGZvciBkcml2ZSBsZXR0ZXJzIGZvciB3aW4zMiAKICAgICBhbmQgZW14IGlzIG5vdCBuZWNlc3NhcnkuIFtEZWFuIEdhdWRldF0KCiAgKikgV0lOMzI6IEFsbG93IC5jbWQgYXMgYW4gZXhlY3V0YWJsZSBleHRlbnNpb24uCiAgICAgW0thcmkgTGlrb3Z1b3JpIDxLYXJpLkxpa292dW9yaSBtb2wuZmk+XSBQUiMyMTQ2CgogICopIE1ha2UgQXBhY2hlIGhlYWRlciBmaWxlcywgYW5kIHNvbWUgdmFyaWFibGVzLCBDKysgZnJpZW5kbHkuCiAgICAgW01pY2hhZWwgQW5kZXJzb24ncyA8bWthIHJlZGVzLmludC5jb20ubXg+XQoKICAqKSBDaGlsZCBwcm9jZXNzZXMgY2FuIG5vdyAic2lnbmFsIiAoYnkgZXhpdGluZyB3aXRoIGEgc3RhdHVzCiAgICAgb2YgQVBFWElUX0NISUxERkFUQUwpIHRoZSBwYXJlbnQgcHJvY2VzcyB0byBhYm9ydCBhbmQKICAgICBzaHV0ZG93biB0aGUgc2VydmVyIGlmIHRoZSBlcnJvciBpbiB0aGUgY2hpbGQgcHJvY2VzcyB3YXMKICAgICBmYXRhbCBlbm91Z2guIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBtb2RfYXV0b2luZGV4J3MgZmluZF9pdG1lKCkgd2FzIHNlbnNpdGl2ZSB0byBNSU1FIHR5cGUgY2FzZS4KICAgICBbSmltIEphZ2llbHNraV0gUFIjMjExMgoKICAqKSBNYWtlIHN1cmUgdGhlIHJlZmVyZXJfbG9nIGFuZCBhZ2VudF9sb2cgZW50cmllcyBpbiB0aGUgZGVmYXVsdCBodHRwZC5jb25mCiAgICAgZmlsZSBhcmUgYWxzbyBhZGp1c3RlZCBmb3IgdGhlIGFjdHVhbCByZWxhdGl2ZSBpbnN0YWxsYXRpb24gcGF0aHMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIxNzUKCiAgKikgV0lOMzI6IEV4dGVuc2l2ZSBvdmVyaGF1bCBvZiB0aGUgd2F5IFVOQ3MgYXJlIGhhbmRsZWQuIFtCZW4gTGF1cmllXQoKICAqKSBXSU4zMjogTWFrZSByb290cyBvZiBmaWxlc3lzdGVtcyAoZS5nLiBjOi8pIHdvcmsuIFtCZW4gTGF1cmllXQogICAgIFBSIzE1NTgKCiAgKikgUE9SVDogVmFyaW91cyBwb3J0aW5nIGNoYW5nZXMgdG8gc3VwcG9ydCBBSVggMy4yLCA0LjEuNSwgNC4yIGFuZCA0LjMuCiAgICAgQWRkaXRpb25hbGx5IHRoZSBjaGVja3MgZm9yIGZpbmRpbmcgdGhlIHZlbmRvciBEU08gbGlicmFyeSB3ZXJlIG1vdmVkCiAgICAgZnJvbSBtb2Rfc28uYyB0byBDb25maWd1cmUgYmVjYXVzZSBmaXJzdCBpdCBuZWVkcyAkUExBVCBldGMuIGFuZCBzZWNvbmQKICAgICBtb2Rfc28gYWxyZWFkeSB1c2VzIGFuIGFic3RyYWN0aW9uIGxheWVyIGFuZCBkb2VzIG5vdCBmaWRkbGUgd2l0aCB0aGUKICAgICB2ZW5kb3IgZnVuY3Rpb25zIGl0c2VsZi4KICAgICBbSmVucy1Vd2UgTWFnZXIsIFJhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFBPUlQ6IFNvbWUgb3B0aW1pemF0aW9uIGRlZmluZXMgZm9yIE5ldEJTRAogICAgIFtKYXJvbWlyIERvbGVjZWsgPGRvbGVjZWsgaWNzLm11bmkuY3o+XSBQUiMyMTY1CgogICopIFBPUlQ6IER5bmFtaWMgU2hhcmVkIE9iamVjdCAoRFNPKSBzdXBwb3J0IGZvciBOZXRCU0QuCiAgICAgW0phcm9taXIgRG9sZWNlayA8ZG9sZWNlayBpY3MubXVuaS5jej4sIFJhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIxNTgKCiAgKikgQWRkIER5bmFtaWMgU2hhcmVkIE9iamVjdCAoRFNPKSBzdXBwb3J0IGZvciBBSVggKGF0IGxlYXN0IDQuMiBidXQgb2xkZXIKICAgICBBSVggdmFyaWFudHMgc2hvdWxkIHdvcmsgZmluZSwgdG9vLiBFdmVuIEFJWCAzLnggc2hvdWxkIHdvcmspLiBUaGlzIGlzCiAgICAgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIHRoZSBmcmVlIERTTyBlbXVsYXRpb24gY29kZSBmcm9tIEplbnMtVXdlIE1hZ2VyCiAgICAgd2hpY2ggd2UgcHV0IGludG8gYSBvcy91bml4L29zLWRzby1haXguYyBmaWxlLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQogIAogICopIFBPUlQ6IEZpeCBjb21waWxlciB3YXJuaW5ncyB1bmRlciBBSVggPj0gNC4yIHdoZXJlIHRoZSBtYW51YWwgcGFnZXMgaW1wbHkKICAgICB0aGF0IHdlIHNob3VsZCB1c2UgTkVUX1NJWkVfVCA9PSBpbnQgYnV0IHRoZSBpbmNsdWRlIGZpbGVzIGZvcmNlIHNpemVfdC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHR3byBidWdzIGluIHNlbGVjdCgpIGhhbmRsaW5nIGluIGh0dHBfbWFpbi5jLgogICAgIFtSb3kgRmllbGRpbmddCgogICopIFN1cHByZXNzICJlcnJvcigwKSIgbWVzc2FnZXMgZm9yIGFwX2xvZ19lcnJvcigpIHdoZW4gdGhlIEFQTE9HX05PRVJSTk8KICAgICBpcyB1bnNldCAoYXMgaXQgaXMgaW4gc2l0dWF0aW9ucyBsaWtlIHRpbWVvdXRzKSB3aGVyZSBpdCBpcyB1bmNsZWFyCiAgICAgd2hldGhlciBlcnJubyBpcyBzZXQgb3Igbm90LiAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBKdXN0IGhhdmluZyBBUEFDSSdzIGxvY2Fsc3RhdGVkaXIgaXMgdG9vIGdlbmVyYWwgYW5kIG5vdCBlbm91Z2ggZm9yIG1vc3QKICAgICBvZiB0aGUgc3lzdGVtcy4gMS4zYjYgYWdhaW4gcmVxdWlyZWQgbWFudWFsIEFQQUNJIHBhdGNoZXMgYnkgcGFja2FnZQogICAgIG1haW50YWluZXJzIGZyb20gUmVkIEhhdCBhbmQgRnJlZUJTRCBiZWNhdXNlIGZvciB0aGVpciBmaWxlc3lzdGVtIGxheW91dCBhCiAgICAgbGl0dGxlIGJpdCBtb3JlIGZsZXhpYmlsaXR5IGluIGNvbmZpZ3VyaW5nIHRoZSBwYXRocyBpcyBuZWVkZWQuIEhlbmNlIHdlCiAgICAgcHJvdmlkZSB0aHJlZSBhZGRpdGlvbmFsIGNvbmZpZ3VyZSBvcHRpb25zICgtLXJ1bnRpbWVkaXIsIC0tbG9nZmlsZWRpciwKICAgICAtLXByb3h5Y2FjaGVkaXIpIHdoaWNoIG5vdyBjYW4gYmUgdXNlZCBmb3IgbW9yZSBncmFudWxhciBhZGp1c3RtZW50cyBpZgogICAgIC0tbG9jYWxzdGF0ZWRpciBpcyBub3QgZW5vdWdoIHRvIGZpdCB0aGUgcGFydGljdWxhciBuZWVkcy4gQXMgYSBuaWNlCiAgICAgc2lkZS1lZmZlY3QgdGhpcyByZWR1Y2VzIHNvbWUgc3ViZGlyIGZpZGRsaW5nIGluIGNvbmZpZ3VyZStNYWtlZmlsZS50bXBsLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBNYWtlIHRoZSBpbnN0YWxsIHJvb3QgZm9yICJtYWtlIGluc3RhbGwiIGluIEFQQUNJJ3MgTWFrZWZpbGUgb3ZlcnJpZGVhYmxlCiAgICAgYnkgcGFja2FnZSBhdXRob3JzLiAgVGhpcyB3YXkgd2UgYXJlIGV2ZW4gbW9yZSBmcmllbmRseSB0byBwYWNrYWdlCiAgICAgbWFpbnRhaW5lcnMgKGVzcGVjaWFsbHkgRGViaWFuIGFuZCBSZWQgSGF0KSB3aG8gYnVpbGQgZm9yIHRoZSByZWFsIHByZWZpeAogICAgIHZpYSAiY29uZmlndXJlIC0tcHJlZml4PS88cmVhbD4iIGJ1dCB1c2UgYSBkaWZmZXJlbnQgbG9jYWwgcHJlZml4IHZpYQogICAgICJtYWtlIHJvb3Q9L3RtcC9hcGFjaGUgaW5zdGFsbCIgZm9yIHJvbGxpbmcgdGhlIHBhY2thZ2Ugd2l0aG91dCBicmlzdGxpbmcKICAgICB0aGUgdGFyZ2V0IGxvY2F0aW9uIG9uIHRoZWlyIHN5c3RlbS4gCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFdvcmthcm91bmQgc2VkIGxpbWl0YXRpb25zIGluIEFQQUNJJ3MgY29uZmlndXJlIHNjcmlwdCBieSBub3cKICAgICBzdWJzdGl0dXRpbmcgaW4gY2h1bmtzIG9mIDUwIGNvbW1hbmRzIChiZWNhdXNlIGZvciBpbnN0YW5jZSBIUFVYJ3MgdmVuZG9yCiAgICAgc2VkIGhhcyBhIGxpbWl0IG9mIG1heC4gOTggY29tbWFuZHMpCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIxMzYKCiAgKikgQWRkaW5nIFNPQ0tTNSBzdXBwb3J0IGFuZCBmaXhpbmcgZXhpc3RpbmcgU09DS1M0IHN1cHBvcnQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIxNDAKCiAgKikgTWFudWFsbHkgZml4IHNvbWUgc3ltYm9scyB3aGljaCB3ZXJlIG5vdCByZW5hbWVkIHRvIHByZWZpeCBhcF8gaW4gdGhlIEJJRwogICAgIFJFTkFNSU5HIHByb2Nlc3MgYmVjYXVzZSB0aGV5IGFyZSBkZWZpbmVkIGFzIHByZS1wcm9jZXNzb3IgbWFjcm9zIGluc3RlYWQKICAgICBvZiByZWFsIGZ1bmN0aW9uczogYnB1dGMsIGJnZXRjLCBwaXBlZF9sb2dfd3JpdGVfZmQsIHBpcGVkX2xvZ19yZWFkX2ZkCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFdvcmthcm91bmQgYnJhaW5kZWFkIEFXSydzIHdoZW4gZ2VuZXJhdGluZyBhcF9jb25maWcuaDogVGhlIHNwbGl0KCkgYW5kCiAgICAgc3Vic3RyKCkgZnVuY3Rpb25zIGNhbm5vdCBiZSBuZXN0ZWQgdW5kZXIgdmVuZG9yIEFXSyBmcm9tIFNvbGFyaXMgMi42LgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMTM5CgogICopIFZhcmlvdXMgYnVnZml4ZXMgYW5kIGNsZWFudXBzIGZvciB0aGUgQVBBQ0kgY29uZmlndXJlIHNjcmlwdDoKICAgICBvIGZpeCBJRlMgaGFuZGxpbmcgZm9yIF9uZXN0ZWRfIHNpdHVhdGlvbgogICAgIG8gZml4IFBlcmwgaW50ZXJwcmV0ZXIgc2VhcmNoOiB0YWtlIGZpcnN0IG9uZSBmb3VuZCBpbnN0ZWFkIG9mIGxhc3Qgb25lCiAgICAgbyBmaXggRFNPIGNvbnNpc3RlbmN5IGNoZWNrCiAgICAgbyBwcmludCBlcnJvciBtZXNzYWdlcyB0byBzdGRlcnIgaW5zdGVhZCBvZiBzdGRvdXQKICAgICBvIGFkZCBpbnN0YWxsLXF1aWV0IGZvciAtLXNoYWRvdyBzaXR1YXRpb24gdG8gTWFrZWZpbGUgc3R1YgogICAgIG8gcmVkdWNlIGNvbXBsZXhpdHkgYnkgYXZvaWRpbmcgc2VkLWhhY2tzIGZvciBydWxlIGFuZCBtb2R1bGUgbGlzdCBsb29wcwogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggREVCVUdfQ0dJIHNpdHVhdGlvbiBpbiBtb2RfY2dpLmMgW0RhdmlkIE1hY0tlbnppZV0gUFIjMjExNAoKICAqKSBNYWtlIHN1cmUgdGhlIGlucHV0IGZpZWxkIHNlcGFyYXRvciAoSUZTKSBzaGVsbCB2YXJpYWJsZSBpcyBleHBsaWNpdGx5CiAgICAgaW5pdGlhbGl6ZWQgY29ycmVjdGx5IGJlZm9yZSBfZXZlcnlfIGBmb3InIGxvb3AgYW5kIGFsc28gcmVzdG9yZWQgYWZ0ZXIKICAgICB0aGUgbG9vcHMuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBNYWtlIHN1cmUgdGhhdCAibWFrZSBpbnN0YWxsIiBkb2Vzbid0IG92ZXJ3cml0ZSB0aGUgYG1pbWUudHlwZXMnIGFuZAogICAgIGBtYWdpYycgZmlsZXMgZnJvbSBhbiBleGlzdGluZyBBcGFjaGUgaW5zdGFsbGF0aW9uLiBCZWNhdXNlIHBlb3BsZSBvZnRlbgogICAgIGN1c3RvbWl6ZSB0aGVzZSBmb3Igb3duIE1JTUUgYW5kIGNvbnRlbnQgdHlwZXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFBPUlQ6IER5bmFtaWMgU2hhcmVkIE9iamVjdCAoRFNPKSBzdXBwb3J0IGZvciBPcGVuQlNEIDIueAogICAgIFtQZXRlciBHYWxiYXZ5LCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMTA5CgogICopIEZpeCB0aGUgcGF0aCB0byB0aGUgU2NvcmVCb2FyZEZpbGUgaW4gdGhlIGluc3RhbGwtY29uZmlnIHRhcmdldCwgdG9vLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMTA1CgogICopIExldCAiY29uZmlndXJlIiBjbGVhciBvdXQgdGhlIHVzZXJzIHBhcmFtZXRlcnMgKHByb3ZpZGVkIGFzIHNoZWxsCiAgICAgdmFyaWFibGVzKSB0byBhdm9pZCBzaWRlLWVmZmVjdHMgaW4gInNyYy9Db25maWd1cmUiIHdoZW4gdGhlIHVzZXIKICAgICBleHBvcnRlZCB0aGVtICh3aGljaCBpcyBub3QgbmVlZGVkLCBidXQgc29tZSB1c2VycyBkbyBpdCkuIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMyMTAxCgogICopIFByb3ZpZGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmcm9tIHNvbWUgb2xkIHNyYy9Db25maWd1cmF0aW9uLnRtcGwKICAgICBwYXJhbWV0ZXIgbmFtZXMgdG8gdGhlIGNhbm9uaWNhbCBBdXRvY29uZi1zdHlsZSBzaGVsbCB2YXJpYWJsZSBuYW1lcy4gRm9yCiAgICAgaW5zdGFuY2UgQ0ZMQUdTIHZzLiBFWFRSQV9DRkxBR1MuIFRoZSBFWFRSQV94eHggdmFyaWFudHMgYXJlIGFjY2VwdGVkIG5vdwogICAgIGJ1dCBhIGhpbnQgbWVzc2FnZSBpcyBkaXNwbGF5ZWQuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQogIAogICopIE1ha2Ugc3VyZSB0aGF0ICJtYWtlIGluc3RhbGwiIGRvZXNuJ3Qgb3ZlcndyaXRlIHRoZSBEb2N1bWVudFJvb3QgYW5kCiAgICAgQ0dJIHNjcmlwdHMgZnJvbSBhbiBleGlzdGluZyBBcGFjaGUgaW5zdGFsbGF0aW9uLiAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgSmltIEphZ2llbHNraV0gUFIjMjA4NAoKICAqKSBNYWtlIGBjb25maWd1cmUgLS1jb21wYXQnIG1vcmUgImNvbXBhdGlibGUiIGJ5IGZpcnN0IAogICAgIGxldCB0aGUgbGliZXhlY2RpciBkZWZhdWx0IHRvIEVQUkVGSVgvbGliZXhlYyBpbnN0ZWFkIG9mIEVQUkVGSVgvYmluIGFuZAogICAgIHNlY29uZCBieSBtYWtpbmcgc3VyZSB0aGUgImF2b2lkLWJyaXN0bGluZy1zdWZmaXgiIC9hcGFjaGUgaXMgbm90CiAgICAgYXBwZW5kZWQgdG8gc3lzY29uZmRpciwgZGF0YWRpciwgbG9jYWxzdGF0ZWRpciBhbmQgaW5jbHVkZWRpciB3aGVuCiAgICAgLS1jb21wYXQgaXMgdXNlZC4gW1JhbGYgUy4gRW5nZWxzY2hhbGwsIExhcnMgRWlsZWJyZWNodF0KCiAgKikgTmVYVCByZXF1aXJlZCBzdHJkdXAoKSBpbiBzdXBwb3J0L2xvZ3Jlc29sdmUuYwogICAgIFtGcmFuY2lzY28gVG9tZWkgPGZhdG9tZWkgc2FuZGJ1cmcudW5tLmVkdT5dIFBSIzIwODIKCiAgKikgQUlYIHJlcXVpcmVkIHN5cy9zZWxlY3QuaCBpbiBzdXBwb3J0L2FiLmMKICAgICBbSmVucyBTY2hsZXVzZW5lciA8SmVucy5TY2hsZXVzZW5lciBkbHIuZGU+XSBQUiMyMDgxCgogICopIEZpeCB0aGUgcGF0aCB0byB0aGUgTWltZU1hZ2ljRmlsZSBpbiB0aGUgaW5zdGFsbC1jb25maWcgdGFyZ2V0LCB0b28uCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzIwODkKCiAgKikgUE9SVDogQWRkZWQgSFAtVVggMTEgcGF0Y2hlcyBbSmVmZiBFYXJpY2tzb24gPGphZWFyaWNrIGNvbGJ5LmVkdT5dCgogICopIElmIHlvdSBzdGFydCBhcGFjaGUgd2l0aCB0aGUgLVMgY29tbWFuZCBsaW5lIG9wdGlvbiBpdCB3aWxsIGR1bXAKICAgICBvdXQgdGhlIHBhcnNlZCB2aG9zdCBzZXR0aW5ncy4gIFRoaXMgaXMgdXNlZnVsIGZvciBmb2xrcyB0cnlpbmcKICAgICB0byBmaWd1cmUgb3V0IHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGVpciB2aG9zdCBjb25maWd1cmF0aW9uLgogICAgIChPdGhlciBkdW1wcyBtYXkgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS4pIFtEZWFuIEdhdWRldF0KCiAgKikgQWRkICVwQSwgJXBJLCBhbmQgJXBwIGNvZGVzIHRvIGFwX3Zmb3JtYXR0ZXIgKGFuZCBoZW5jZSBhcF9icHJpbnRmLAogICAgIGFwX3NucHJpbnRmLCBhbmQgYXBfcHNwcmludGYpLiAgU2VlIGluY2x1ZGUvYXAuaCBmb3IgZG9jcy4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIEJlY2F1c2UgL3Vzci9sb2NhbC9hcGFjaGUgaXMgdGhlIGRlZmF1bHQgcHJlZml4IHRoZSBgYGNvbmZpZ3VyZQogICAgIC0tY29tcGF0Jycgb3B0aW9uIG5vIGxvbmdlciBoYXMgdG8gc2V0IHByZWZpeCwgYWdhaW4uIFRoaXMgd2F5IHRoZQogICAgIC0tY29tcGF0IG9wdGlvbiBob25vcnMgYSBsZWFkaW5nIC0tcHJlZml4IG9wdGlvbi4gW0xhcnMgRWlsZWJyZWNodF0KCiAgKikgUE9SVDogQ2FzdCB0aGUgZmlyc3QgYXJndW1lbnQgb2YgZGxvcGVuKCkgaW4gYXBfb3NfZHNvX2xvYWQoKQogICAgIHRvIGBjaGFyIConIHVuZGVyIE9TRjEgYW5kIEZyZWVCU0QgMi54IHdoZXJlIGl0IGlzIGRlZmluZWQgdGhpcyB3YXkKICAgICB0byBhdm9pZCAiZGlzY2FyZCBjb25zdCIgd2FybmluZ3MuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBJZiBhIHNwZWNpZmljIGhhbmRsZXIgaXMgc2V0IGZvciBhIGZpbGUgeWV0IHRoZSByZXF1ZXN0IHN0aWxsCiAgICAgZW5kcyB1cCBiZWluZyBoYW5kbGVkIGJ5IHRoZSBkZWZhdWx0IGhhbmRsZXIsIGxvZyBhbiBlcnJvcgogICAgIG1lc3NhZ2UgYmVmb3JlIGhhbmRsaW5nIGl0LiAgVGhpcyBjYXRjaGVzIHRoaW5ncyBzdWNoIGFzIHRyeWluZyAKICAgICB0byB1c2UgU1NJcyB3aXRob3V0IG1vZF9pbmNsdWRlIGVuYWJsZWQuICBbTWFyYyBTbGVta29dCgogICopIEZpeCBlcnJvciBsb2dnaW5nIGZvciB0aGUgc3RhcnR1cCBjYXNlIHdoZXJlIGFwX2xvZ19lcnJvcigpIHN0aWxsIHVzZXMKICAgICBzdGRlcnIgYXMgdGhlIHRhcmdldC4gTm93IHRoZSBkZWZhdWx0IGxvZyBsZXZlbCBpcyBob25vcmVkIGhlcmUsIHRvby4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KICAgIAogICopIFBPUlQ6IE1ha2Ugc3VyZSBzb21lIEFXSydzIGRvbid0IGZhaWwgaW4gc3JjL0NvbmZpZ3VyZSB3aXRoICJzdHJpbmcgdG9vCiAgICAgbG9uZyIgZXJyb3JzIHdoZW4gZ2VuZXJhdGluZyB0aGUgTU9EVUxFUyBlbnRyeSBmb3Igc3JjL01ha2VmaWxlCiAgICAgW0JlbiBIeWRlLCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBNYWtlIHN1cmUgc3JjL0NvbmZpZ3VyZSBkb2Vzbid0IGNvbXBsYWluIGFib3V0IHRoZSBvbGQgZGlyZWN0b3J5CiAgICAgL3Vzci9sb2NhbC9ldGMvaHR0cGQvIHdoZW4gQVBBQ0kgaXMgdXNlZC4gIFtMYXJzIEVpbGVicmVjaHRdCiAgIApDaGFuZ2VzIHdpdGggQXBhY2hlIDEuM2I2CgogICopIFBPUlQ6IENsZWFuIHVwIHdhcm5pbmdzIG9uIFVsdHJpeCBhbmQgSFBVWC4gIFtCZW4gSHlkZV0KIAogICopIEFkZGluZyBEU08gc3VwcG9ydCBmb3IgdGhlIEhQL1VYIHBsYXRmb3JtIGJ5IGVtdWxhdGluZyB0aGUgZGxvcGVuLXN0eWxlCiAgICAgaW50ZXJmYWNlIHZpYSB0aGUgc2ltaWxhciBidXQgcHJvcHJpZXRhcnkgSFAvVVggc2hsX3h4eC1zdHlsZSBzeXN0ZW0KICAgICBjYWxscy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFBPUlQ6IFVwZGF0ZWQgVW5peFdhcmUgMi4wLnggYW5kIDIuMS54IGVudHJpZXMgZm9yIERTTyBzdXBwb3J0IGFuZCBtYWRlCiAgICAgQVBBQ0kgTWFrZWZpbGUudG1wbCAiaW5zdGFsbCIgdGFyZ2V0IG1vcmUgcm9idXN0IGZvciBzZW5zaWJsZSBVbml4V2FyZQogICAgIE1ha2UuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSArKysrIFRIRSBCSUcgU1lNQk9MIFJFTkFNSU5HICsrKysKICAgICBUbyBhdm9pZCBzeW1ib2wgY2xhc2hlcyB3aXRoIHRoaXJkLXBhcnR5IGNvZGUgY29tcGlsZWQgaW50byB0aGUgc2VydmVyLAogICAgIHdlIGdsb2JhbGx5IGFwcGxpZWQgdGhlIHByZWZpeCAiYXBfIiB0byB0aGUgZm9sbG93aW5nIGNsYXNzZXMgb2YKICAgICBmdW5jdGlvbnM6CiAgICAgICAgLSBBcGFjaGUgcHJvdmlkZWQgZ2VuZXJhbCBmdW5jdGlvbnMgKGUuZy4sIGFwX2NweXN0cm4pCiAgICAgICAgLSBQdWJsaWMgQVBJIGZ1bmN0aW9ucyAoZS5nLiwgcGFsbG9jLCBiZ2V0cykKICAgICAgICAtIFByaXZhdGUgZnVuY3Rpb25zIHdoaWNoIHdlIGNhbid0IG1ha2Ugc3RhdGljIChiZWNhdXNlIG9mCiAgICAgICAgICBjcm9zcy1vYmplY3QgdXNhZ2UpIGJ1dCBzaG91bGQgYmUgKGUuZy4sIG5ld19jb25uZWN0aW9uKQogICAgIEZvciBiYWNrd2FyZCBzb3VyY2UgY29tcGF0aWJpbGl0eSBhIG5ldyBoZWFkZXIgZmlsZSBuYW1lZCBjb21wYXQuaCB3YXMKICAgICBjcmVhdGVkIHdoaWNoIHByb3ZpZGVzIGRlZmluZXMgZm9yIHRoZSBvbGQgc3ltYm9sIG5hbWVzIGFuZCBjYW4gYmUgdXNlZAogICAgIGJ5IHRoaXJkLXBhcnR5IG1vZHVsZSBhdXRob3JzLgogICAgIFtUaGUgQXBhY2hlIEdyb3VwXQoKICAqKSBBZGRlZCBkeW5hbWljIHNoYXJlZCBvYmplY3QgKERTTykgc3VwcG9ydCBmb3IgU1ZSNC1kZXJpdmF0ZXM6IFRoZQogICAgIHByb2JsZW0gdW5kZXIgU1ZSNCBpcyB0aGF0IHRoZXJlIGlzIG5vIGNvbW1hbmQgZmxhZyB0byBmb3JjZSB0aGUgbGlua2VyCiAgICAgdG8gZXhwb3J0IHRoZSBnbG9iYWwgc3ltYm9scyBvZiB0aGUgaHR0cGQgZXhlY3V0YWJsZSB0aGVyZXdpdGggdGhleSBhcmUKICAgICBhdmFpbGFibGUgdG8gdGhlIERTTydzLiBJbnN0ZWFkIG9mIHByb2JsZW1hdGljIGhhY2tzIGxpa2UgY3JlYXRpbmcgYQogICAgIGR1bW15LnNvIGZpbGUgKGNvbnRhaW5pbmcgZHVtbXkgcmVmZXJlbmNlcyB0byBhbGwgZ2xvYmFsIHN5bWJvbHMpIHRoZQogICAgIGh0dHBkIGJpbmFyeSBpcyBsaW5rZWQgYWdhaW5zdCwgd2UgdXNlIGEgY2xlYW4gdHJpY2sgc3RvbGVuIGZyb20gUGVybCA1OgogICAgIFBsYWNpbmcgdGhlIEFwYWNoZSBjb3JlIGNvZGUgaXRzZWxmIGludG8gYSBEU08gbGlicmFyeSBuYW1lZCBsaWJodHRwZC5zby4KICAgICBUaGlzIHdheSB0aGUgZ2xvYmFsIHN5bWJvbHMgX0hBVkVfIHRvIGJlIGV4cG9ydGVkIGFuZCB0aHVzIGFyZSBhdmFpbGFibGUKICAgICB0byBhbnkgbWFudWFsbHkgbG9hZGVkIERTTydzIHVuZGVyIHJ1bnRpbWUuIFRvIHJlZHVjZSB0aGUgaW1wYWN0IHRvIHRoZQogICAgIHVzZXIgdG8gbnVsbCB3ZSBnbyBldmVuIGZ1cnRoZXIgYW5kIGNyZWF0ZSBhIHN0dWIgaHR0cGQgZXhlY3V0YWJsZSB3aGljaAogICAgIGF1dG9tYXRpY2FsbHkga2VlcHMgdHJhY2sgb2YgdGhlIERTTyBsaWJyYXJ5IGxvYWRpbmcgaXRzZWxmIGFuZCB0aHVzCiAgICAgaGlkZXMgdGhlIGNvbXBsZXRlIG1lY2hhbmlzbSBmcm9tIHRoZSB1c2VyLiBBbHRob3VnaCB0aGUgZ2VuZXJhdGlvbiBvZgogICAgIHRoaXMgRFNPIGxpYnJhcnkgaXMgYXV0b21hdGljYWxseSB0cmlnZ2VyZWQgZm9yIHBsYXRmb3JtcyB3aGljaAogICAgIGVzc2VudGlhbGx5IG5lZWQgaXQgKG1vc3RseSBhbGwgU1ZSNC1kZXJpdmF0ZXMpIGl0IGNhbiBiZSBhbHNvIGVuYWJsZWQKICAgICBtYW51YWxseSB2aWEgdGhlIFJ1bGUgU0hBUkVEX0NPUkUuIFRoaXMgY2FuIGJlIGludGVyZXN0aW5nIGluIHRoZSBmdXR1cmUKICAgICB3aGVyZSB3ZSBwZXJoYXBzIGV4cGxvaXQgdGhpcyBsaWJodHRwZC5zbyBtZWNoYW5pc20gZm9yIHByb3ZpZGluZyBuaWZ0eQogICAgIGZlYXR1cmVzIGxpa2UgZ3JhY2VmdWwgdXBncmFkZXMsIG9yIHdoYXRldmVyLiAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgTWFydGluIEtyYWVtZXJdCgogICopIEJ1aWxkIHRoZSBsaWJyYXJpZXMgYmVmb3JlIGJ1aWxkaW5nIHRoZSByZXN0IG9mIHRoZSB0b29scy4gW0JlbiBIeWRlXQoKICAqKSBBZGQgImRpc3RjbGVhbiIgdGFyZ2V0IHRvIHNyYy8tTWFrZWZpbGVzIHRvIHByb3ZpZGUgIm1ha2UgZGlzdGNsZWFuIiBhbHNvCiAgICAgaW5zaWRlIHRoZSBzcmMgc3VidHJlZSAoaS5lLiBmb3Igbm9uLUFQQUNJIHVzZXJzKS4gRm9sbG93aW5nIEdOVSBNYWtlZmlsZQogICAgIGNvbnZlbnRpb25zIHdoaWxlICJjbGVhbiIgcmVtb3ZlcyBvbmx5IHN0dWZmIGNyZWF0ZWQgYnkgImFsbCIgdGFyZ2V0cywKICAgICAiZGlzdGNsZWFuIiBhZGRpdGlvbmFsbHkgcmVtb3ZlcyB0aGUgc3R1ZmYgZnJvbSB0aGUgY29uZmlndXJhdGlvbgogICAgIHByb2Nlc3MuIFRoaXMgd2F5ICJtYWtlIGRpc3RjbGVhbiIgKGhlbmNlIHRoZSBuYW1lKSBwcm92aWRlcyBhIGZyZXNoCiAgICAgc291cmNlIHRyZWUgYXMgaXQgd2FzIGZvciBkaXN0cmlidXRpb24uCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFsbG93IHRvcC1sZXZlbCAoQVBBQ0kpIE1ha2VmaWxlIHRvIGJyZWFrIG9uIGJ1aWxkIGVycm9ycwogICAgIHRoZSBzYW1lIHdheSB0aGUgc3JjLyBzdWJ0cmVlIE1ha2VmaWxlcyBicmVha3Mgb24gdGhlbSBieSByZXBsYWNpbmcgdGhlCiAgICAgaW5pdGlhbCBBUEFDSSBzZWQtc3ViZGlyLWRpc3BsYXkta2x1ZGdlIHdpdGggYSBtb3JlIGNsZWFuCiAgICAgdmFyaWFibGUtcGFzc2luZy1zb2x1dGlvbjogdmFyaWFibGUgU0RQIGNhbiBvcHRpb25hbGx5IGhvbGQgdGhlIHN1YmRpcgogICAgIHByZWZpeCB3aGljaCBpcyBjb25zaXN0ZW50bHkgdXNlZCBmb3IgZGlzcGxheWluZyB0aGUgc3ViZGlyIG1vdmVtZW50LgogICAgIFRoaXMgd2F5IGV2ZW4gdGhlIHRvcC1sZXZlbCBNYWtlZmlsZSBjYW4gc3RvcCBjb3JyZWN0bHkgb24gZXJyb3JzIGFzIHRoZQogICAgIHVzZXIgZXhwZWN0cy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeGVkIG9yZGVyaW5nIG9mIGFyZ3VtZW50IGNoZWNrcyBmb3IgUmV3cml0ZUJhc2UgZGlyZWN0aXZlLgogICAgIFtUb2RkIEVpZ2Vuc2NoaW5rIDxlaWdlbnN0ciBtaXhpLm5ldD5dIFBSIzIwNDUKCiAgKikgQ2hhbmdlIFdpbjMyIElTX01PRFVMRSB0byBTSEFSRURfTU9EVUxFIHRvIG1hdGNoIFVuaXgnIG1ldGhvZCBvZgogICAgIGluZGljYXRpbmcgdGhhdCBhIG1vZHVsZSBpcyBiZWluZyBjb21waWxlZCBmb3IgZHluYW1pYyBsb2FkaW5nLiBBbHNvCiAgICAgcmVtb3ZlICNkZWZpbmUgSVNfTU9EVUxFIGZyb20gbW9kdWxlcyBhbmQgYWRkIFNIQVJFRF9NT0RVTEUgZGVmaW5lCiAgICAgdG8gdGhlIG1hay9kc3AgZmlsZXMuIFtBbGV4ZWkgS29zdXRdCgogICopIFJlZHVjZSBsb2dnaW5nIGxldmVsIG9mICJub3JtYWwiIHdhcm5pbmcgbWVzc2FnZXMgdG8gQVBMT0dfSU5GTywKICAgICBzaW5jZSB3ZSBhcmUgbm93IGxvZ2dpbmcgQVBMT0dfV0FSTklORyBieSBkZWZhdWx0LiBbUm95IEZpZWxkaW5nXQoKICAqKSBQT1JUOiBPUy8yIHR3ZWFrIHRvIGRlYWwgd2l0aCBtdWx0aXBsZSAuZXhlIHRhcmdldHMuIFtCcmlhbiBIYXZhcmRdCiAKICAqKSBBZGQgZG9jdW1lbnRhdGlvbiBmaWxlIGFuZCBzcmMvQ29uZmlndXJhdGlvbi50bXBsIGVudHJ5IGZvciB0aGUKICAgICBleHBlcmltZW50YWwgbW9kX21tYXBfc3RhdGljIG1vZHVsZS4gQmVjYXVzZSBhbHRob3VnaCBpdCBpcyBhbmQgbWFya2VkIGFzCiAgICAgYW4gZXhwZXJpbWVudGFsIG9uZSBpdCBpcyBkaXN0cmlidXRlZCBhbmQgdGh1cyBzaG91bGQgYmUgZG9jdW1lbnRlZCBhbmQKICAgICBwcmVwYXJlZCBmb3IgY29uZmlndXJhdGlvbiB0aGUgc2FtZSB3YXkgYXMgYWxsIG90aGVycyBtb2R1bGVzLiAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkIHF1ZXJ5ICgtcSkgb3B0aW9uIHRvIGFweHMgc3VwcG9ydCB0b29sIHRvIGJlIGFibGUgdG8gbWFudWFsbHkgcXVlcnkKICAgICBzcGVjaWZpYyBzZXR0aW5ncyBmcm9tIGFweHMuIFRoaXMgaXMgbmVlZGVkIGZvciBpbnN0YW5jZSB3aGVuIHlvdQogICAgIG1hbnVhbGx5IHdhbnQgdG8gYWNjZXNzIEFwYWNoZSdzIGhlYWRlciBmaWxlcyBhbmQgeW91IG5lZWQgdG8gYXNzZW1ibGUKICAgICB0aGUgLUkgb3B0aW9uLiAgTm93IHlvdSBjYW4gZG8gLUlgYXB4cyAtcSBJTkNMVURFRElSYC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTm93IHNyYy9Db25maWd1cmUgdXNlcyBhIGZhbGxiYWNrIHN0cmF0ZWd5IGZvciB0aGUgc2hhcmVkIG9iamVjdCBzdXBwb3J0CiAgICAgb24gcGxhdGZvcm1zIHdoZXJlIG5vIGV4cGxpY2l0IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZTogSWYgYSBQZXJsCiAgICAgaW5zdGFsbGF0aW9uIGV4aXN0cyB3ZSBhc2sgaXQgYWJvdXQgaXRzIHNoYXJlZCBvYmplY3Qgc3VwcG9ydCBhbmQgaWYgaXQncwogICAgIHRoZSBkbG9wZW4tc3R5bGUgb25lIHdlIHNoYW1lbGVzc2x5IGd1ZXNzIHRoZSBjb21waWxlciBhbmQgbGlua2VyIGZsYWdzCiAgICAgZm9yIGNyZWF0aW5nIHNoYXJlZCBvYmplY3RzIGZyb20gUGVybHMga25vd2xlZGdlLiBPZiBjb3Vyc2UsIHRoZSB1c2VyIGlzCiAgICAgd2FybmluZyBhYm91dCB3aGF0IHdlIGFyZSBkb2luZyBhbmQgaW5mb3JtZWQgdGhhdCBoZSBzaG91bGQgc2VuZCB1cwogICAgIHRoZSBndWVzc2VkIGZsYWdzIHdoZW4gdGhleSB3b3JrLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUHJvdmlkZSBBUEFDSSAtLXdpdGhvdXQtc3VwcG9ydCBvcHRpb24gdG8gYmUgYWJsZSB0byBkaXNhYmxlIHRoZSBidWlsZAogICAgIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIHN1cHBvcnQgdG9vbHMgZnJvbSB0aGUgc3JjL3N1cHBvcnQvIGFyZWEuCiAgICAgQWx0aG91Z2ggaXRzIHVzZWZ1bCB0byBoYXZlIHRoZXNlIGluc3RhbGxlZCBwZXIgZGVmYXVsdCB3ZSBzaG91bGQgcHJvdmlkZQogICAgIGEgd2F5IHRvIGNvbXBpbGUgYW5kIGluc3RhbGwgd2l0aG91dCB0aGVtIGZvciBiYWNrd2FyZC1jb21wYXRpYmlsaXR5LgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGQgb2YgdGhlIG5ldyBBUGFjaGUgZVh0ZW5TaW9uIChhcHhzKSBzdXBwb3J0IHRvb2wgZm9yIGJ1aWxkaW5nIGFuZAogICAgIGluc3RhbGxpbmcgbW9kdWxlcyBpbnRvIGFuIF9hbHJlYWR5IGluc3RhbGxlZF8gQXBhY2hlIHBhY2thZ2UgdGhyb3VnaCB0aGUKICAgICBkeW5hbWljIHNoYXJlZCBvYmplY3QgKERTTykgbWVjaGFuaXNtIFttb2Rfc28uY10uIFRoZSB0cmljayBoZXJlIGlzIHRoYXQKICAgICB0aGlzIGFwcHJvYWNoIGFjdHVhbGx5IGRvZXNuJ3QgbmVlZCB0aGUgQXBhY2hlIHNvdXJjZSB0cmVlLiAgVGhlCiAgICAgKEFQQUNJLWluc3RhbGxlZCkgc2VydmVyIHBhY2thZ2UgaXMgZW5vdWdoLCBiZWNhdXNlIHRoaXMgbm93IGluY2x1ZGVzIHRoZQogICAgIEFwYWNoZSBDIGhlYWRlciBmaWxlcyAoUFJFRklYL2luY2x1ZGUpIGFuZCB0aGUgbmV3IEFQWFMgdG9vbAogICAgIChTQklORElSL2FweHMpLiAgVGhlIGludGVuZCBpcyB0byBwcm92aWRlIGEgaGFuZHkgdG9vbCBmb3IgdGhpcmQtcGFydHkKICAgICBtb2R1bGUgYXV0aG9ycyB0byBidWlsZCB0aGVpciBBcGFjaGUgbW9kdWxlcyBfT1VUU0lERV8gdGhlIEFwYWNoZSBzb3VyY2UKICAgICB0cmVlIHdoaWxlIGF2b2lkaW5nIHRoZW0gdG8gZmlkZGxlIGFyb3VuZCB3aXRoIHRoZSB0b3RhbGx5IHBsYXRmb3JtCiAgICAgZGVwZW5kZW5kIHdheSBvZiBjb21waWxpbmcgRFNPIGZpbGVzLiBUaGUgdG9vbCBzdXBwb3J0cyBhbGwgcmFuZ2VzIG9mCiAgICAgbW9kdWxlcywgZnJvbSB0cml2aWFsIG9uZXMgKHNpbmdsZSBtb2RfZm9vLmMpIHRvIGNvbXBsZXggb25lcyAobGlrZSBQSFAzCiAgICAgd2hpY2ggaGFzIGEgbW9kX3BocDMuYyBwbHVzIGEgcHJlLWJ1aWx0IGxpYm1vZHBocDMtc28uYSkgYW5kIGV2ZW4gY2FuCiAgICAgb24tdGhlLWZseSBnZW5lcmF0ZSBhIG1pbmltYWxpc3RpYyBNYWtlZmlsZSBhbmQgc2FtcGxlIG1vZHVsZSBmb3IgdGhlCiAgICAgZmlyc3Qgc3RlcCB0byBwcm92aWRlIGJvdGggYSBxdWljayBzdWNjZXNzIGV2ZW50IGFuZCB0byBkZW1vbnN0cmF0ZSB0aGUKICAgICBBUFhTIG1lY2hhbmlzbSB0byBtb2R1bGUgYXV0aG9ycy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCBjb3JlIGR1bXBzIGluIHVzZSBvZiBDT05ORUNUIGluIHByb3h5LiAgCiAgICAgWzxSYWluZXIuU2NoZXJnIHJleHJvdGguZGU+XSBQUiMxMzI2LCAjMTU3MywgIzE5NDIKCiAgKikgTW9kaWZ5IHRoZSBsb2cgZGlyZWN0aXZlcyBpbiBodHRwZC5jb25mLWRpc3QgZmlsZXMgdG8gdXNlIEN1c3RvbUxvZwogICAgIHNvIHRoYXQgdXNlcnMgaGF2ZSBleGFtcGxlcyBvZiBob3cgQ3VzdG9tTG9nIGNhbiBiZSB1c2VkLgogICAgIFtMYXJzIEVpbGVicmVjaHRdCgogICopIEFkZCB0aGUgbmV3IEFwYWNoZSBBdXRvY29uZi1zdHlsZSBJbnRlcmZhY2UgKEFQQUNJKSBmb3IgdGhlIHRvcC1sZXZlbCBvZgogICAgIHRoZSBBcGFjaGUgZGlzdHJpYnV0aW9uIHRyZWUuICBVbnRpbCBBcGFjaGUgMS4zIHRoZXJlIHdhcyBubyByZWFsCiAgICAgb3V0LW9mLXRoZS1ib3ggYmF0Y2gtY2FwYWJsZSBidWlsZCBhbmQgaW5zdGFsbGF0aW9uIHByb2NlZHVyZSBmb3IgdGhlCiAgICAgY29tcGxldGUgQXBhY2hlIHBhY2thZ2UuIFRoaXMgaXMgbm93IHByb3ZpZGVkIGJ5IGEgdG9wLWxldmVsICJjb25maWd1cmUiCiAgICAgc2NyaXB0IGFuZCBhIGNvcnJlc3BvbmRpbmcgdG9wLWxldmVsICJNYWtlZmlsZS50bXBsIiBmaWxlLiAgVGhlIGdvYWwgaXMKICAgICB0byBwcm92aWRlIGEgR05VIEF1dG9jb25mLXN0eWxlIGZyb250ZW5kIHdoaWNoIGlzIGNhcGFibGUgdG8gYm90aCBkcml2ZQogICAgIHRoZSBvbGQgc3JjL0NvbmZpZ3VyZSBzdHVmZiBpbiBiYXRjaCBhbmQgYWRkaXRpb25hbGx5IGluc3RhbGxzIHRoZQogICAgIHBhY2thZ2Ugd2l0aCBhIEdOVS1jb25mb3JtaW5nIGRpcmVjdG9yeSBsYXlvdXQuIEFueSBvcHRpb25zIGZyb20gdGhlIG9sZAogICAgIGNvbmZpZ3VyYXRpb24gc2NoZW1lIGFyZSBhdmFpbGFibGUgcGx1cyBhIGxvdCBvZiBuZXcgb3B0aW9ucyBmb3IgZmxleGlibHkKICAgICBjdXN0b21pemluZyBBcGFjaGUuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBUaGUgZmxvYXRpbmcgcG9pbnQgYXBfc25wcmludGYgY29kZSB3YXNuJ3QgdGhyZWFkc2FmZS4KICAgICBIYWQgdG8gcmVtb3ZlIHRoZSBIQVZFX0NWVCBtYWNybyBpbiBvcmRlciB0byBkbyB0aHJlYWRzYWZlCiAgICAgY2FsbGluZyBvZiB0aGUgP2N2dCgpIGZsb2F0aW5nIHBvaW50IHJvdXRpbmVzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBQT1JUOiBBZGQgdGhlIFNDT19TViBwb3J0LiBbSmltIEphZ2llbHNraV0gUFIjMTk2MgoKICAqKSBQT1JUOiBJUklYIG5lZWRzIHRoZSAtbjMyIGZsYWcgaWZmIHVzaW5nIHRoZSAnY2MnIGNvbXBpbGVyCiAgICAgW0ppbSBKYWdpZWxza2ldIFBSIzE5MDEKCiAgKikgQlVHOiBDb25maWd1cmUgd2FzIHVzaW5nIFRDQyBhbmQgQ0MgaW5jb25zaXN0ZW50bHkuIE1ha2Ugc3VyZQogICAgIENvbmZpZ3VyZSBrbm93cyB3aGljaCBDQyB3ZSBhcmUgdXNpbmcuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSAiT3B0aW9ucyArSW5jbHVkZXMiIHdhc24ndCBjb3JyZWN0bHkgbWVyZ2VkIGlmICIrSW5jbHVkZXNOb0V4ZWMiCiAgICAgd2FzIGRlZmluZWQgaW4gYSBwYXJlbnQgZGlyZWN0b3J5LiBbTGFycyBFaWxlYnJlY2h0XQoKICAqKSBBUEk6IGFwX3NucHJpbnRmKCkgY29kZSBtdXRhdGVkIGludG8gYXBfdmZvcm1hdHRlcigpLCB3aGljaCBpcwogICAgIGEgZ2VuZXJpYyBwcmludGYtc3R5bGUgcm91dGluZSB0aGF0IGNhbiBjYWxsIGFyYml0cmFyeSBvdXRwdXQKICAgICByb3V0aW5lcy4gIFVzZSB0aGlzIHRvIHJlcGxhY2UgaHR0cF9icHJpbnRmLmMuICBBZGQgbmV3IHJvdXRpbmVzCiAgICAgcHNwcmludGYoKSwgcHZzcHJpbnRmKCkgd2hpY2ggYWxsb2NhdGUgdGhlIGV4YWN0IGFtb3VudCBvZiBtZW1vcnkKICAgICByZXF1aXJlZCBmb3IgYSBzdHJpbmcgZnJvbSBhIHBvb2wuICBVc2UgcHNwcmludGYoKSB0byBjbGVhbiB1cAogICAgIHZhcmlvdXMgYml0cyBvZiBjb2RlIHdoaWNoIHVzZWQgYXBfc25wcmludGYoKS9wc3RyZHVwKCkuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBQT1JUOiBIQVZFX1NOUFJJTlRGIGRvZXNuJ3QgZG8gYW55dGhpbmcgYW55IGxvbmdlci4gIFRoaXMgaXMgYmVjYXVzZQogICAgIGFwX3NucHJpbnRmKCkgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgYW5kIGZvcm1hdHRpbmcgY29kZXMgdGhhbgogICAgIHNucHJpbnRmKCkuICBbRGVhbiBHYXVkZXRdCgogICopIFNJR1hDUFUgYW5kIFNJR1hGU1ogYXJlIG5vdyByZXNldCB0byBTSUdfREZMIGF0IGJvb3QtdGltZS4gIFRoaXMKICAgICBpcyBuZWNlc3Nhcnkgb24gYXQgbGVhc3QgU29sYXJpcyB3aGVyZSB0aGUgL2V0Yy9yYz8uZCBzY3JpcHRzCiAgICAgYXJlIHJ1biB3aXRoIHRoZXNlIHNpZ25hbHMgaWdub3JlZCwgYW5kICJTSUdfSUdOIiBzZXR0aW5ncyBhcmUKICAgICBtYWludGFpbmVkIGFjcm9zcyBleGVjKCkuCiAgICAgW1JlaW4gVG9sbGV2aWsgPHJlaW50IHN5cy5zb2wubm8+XSBQUiMyMDA5CgogICopIEZpeCB0aGUgY2hlY2sgZm9yIHN5bWJvbGljIGxpbmtzIGluIGBgUmV3cml0ZUNvbmQgLi4uIC1sJyc6IHN0YXQoKSB3YXMKICAgICB1c2VkIGluc3RlYWQgb2YgbHN0YXQoKSBhbmQgdGh1cyB0aGlzIGZsYWcgZGlkbid0IHdvcmsgYXMgZXhwZWN0ZWQuCiAgICAgW1JlaW4gVG9sbGV2aWsgPHJlaW50IHN5cy5zb2wubm8+XSBQUiMyMDEwCgogICopIEZpeCB0aGUgcHJveHkgcGFzcy10aHJvdWdoIGZlYXR1cmUgb2YgbW9kX3Jld3JpdGUgZm9yIHRoZSBjYXNlIG9mCiAgICAgZXhpc3RpbmcgUVVFUllfU1RSSU5HIG5vdyB0aGF0IG1vZF9wcm94eSB3YXMgcmVjZW50bHkgY2hhbmdlZCBiZWNhdXNlIG9mCiAgICAgdGhlIG5ldyBVUkwgcGFyc2luZyBzdHVmZi4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEEgZmV3IGNoYW5nZXMgdG8gc2NvcmVib2FyZCBkZWZpbml0aW9ucyB3aGljaCBoZWxwcyBnY2MgZ2VuZXJhdGUKICAgICBiZXR0ZXIgY29kZS4gIFtEZWFuIEdhdWRldF0KCiAgKikgQU5TSSBDIGRvZXNuJ3QgZ3VhcmFudGVlIHRoYXQgImludCBmb28gOiAyIiBpbiBhIHN0cnVjdHVyZSB3aWxsCiAgICAgYmUgYSBzaWduZWQgYml0ZmllbGQuICBTbyBtYXJrIGEgZmV3IGJpdGZpZWxkcyBhcyBzaWduZWQgdG8KICAgICBlbnN1cmUgY29ycmVjdCBjb2RlLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBUaGUgZGVmYXVsdCBmb3IgSG9zdG5hbWVMb29rdXBzIHdhcyBjaGFuZ2VkIHRvIE9mZiwgYnV0IHRoZXJlCiAgICAgd2FzIGEgcHJvYmxlbSBhbmQgaXQgd2Fzbid0IHRha2luZyBlZmZlY3QuIFtEZWFuIEdhdWRldF0KCiAgKikgUE9SVDogQ2xlYW4gdXAgdW5kZWZpbmVkIHNpZ25hbHMgb24gc29tZSBwbGF0Zm9ybXMgKFNDTywgQmVPUykuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBZnRlciBhIFNJR0hVUCB0aGUgbGlzdGVuaW5nIHNvY2tldHMgaW4gdGhlIHBhcmVudCB3ZXJlbid0CiAgICAgcHJvcGVybHkgbWFya2VkIGZvciBjbG9zdXJlIG9uIGZvcmsoKS4KICAgICBbSvxyZ2VuIEtlaWwgPGprIHRvb2xzLmRlPl0gUFIjMjAwMAogCiAgKikgQWxsb3cgJTJGIGluIHR3byBzaXR1YXRpb25zOiAxKSBpdCBpcyBpbiB0aGUgcXVlcnkgcGFydCBvZiB0aGUgVVJJLAogICAgIHRoZXJlZm9yZSBub3QgZXhwb3NlZCB0byAlMkYgLT4gJy8nIHRyYW5zbGF0aW9ucyBhbmQgMikgdGhlIHJlcXVlc3QKICAgICBpcyBhIHByb3h5IHJlcXVlc3QsIHNvIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSBsb2NhbCByZXNvdXJjZSBhbnl3YXkuCiAgICAgV2l0aG91dCB0aGlzLCB0aGUgcHJveHkgd291bGQgZmFpbCB0byB3b3JrIGZvciBhbnkgVVJMJ3Mgd2l0aAogICAgICUyZiBpbiB0aGVtIChvY2N1cnMgcXVpdGUgb2Z0ZW4gaW4KICAgICBodHRwOi8vLi4uL2NnaS1iaW4vLi4uP2h0dHAlM0ElMkYlMkYuLi4gcmVmZXJlbmNlcykgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBQcm90ZWN0IGFnYWluc3QgRkRfU0VUU0laRSBtaXNtYXRjaGVzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBNYWtlIHRoZSBzaGFyZWQgb2JqZWN0IGNvbXBpbGF0aW9uIGNvbW1hbmQgbW9yZSBwb3J0YWJsZSBieSBhdm9pZGluZwogICAgIHRoZSBkaXJlY3QgY29tYmluYXRpb24gb2YgYC1jJyAmIGAtbycgd2hpY2ggaXMgbm90IGhvbm9yZWQgYnkgc29tZQogICAgIGNvbXBpbGVycyBsaWtlIFVuaXhXYXJlJ3MgY2MuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBXSU4zMjogdGhlIHByb3h5IHdhcyBjcmVhdGluZyBmaWxlbmFtZXMgbWlzc2luZyB0aGUgbGFzdCBmb3VyCiAgICAgY2hhcmFjdGVycy4gIFdoaWxlIHRoaXMgbm9ybWFsbHkgZG9lc24ndCBzdG9wIGFueXRoaW5nIGZyb20gCiAgICAgd29ya2luZywgaXQgY2FuIHJlc3VsdCBpbiBleHRyYSBjb2xsaXNpb25zLiAgCiAgICAgW1RpbSBDb3N0ZWxsbyA8dGpjb3N0ZWwgc29jcy51dHMuZWR1LmF1Pl0gUFIjMTg5MAoKICAqKSBOb3cgbW9kX3Byb3h5IHVzZXMgdGhlIHJlc3BvbnNlIHN0cmluZyAoaW4gYWRkaXRpb24gdG8gdGhlIHJlc3BvbnNlIHN0YXR1cwogICAgIGNvZGUpIGZyb20gdGhlIGFscmVhZHkgdXNlZCBGVFAgU0laRSBjb21tYW5kIHRvIHNldHVwIHRoZSBDb250ZW50LUxlbmd0aAogICAgIGhlYWRlciBpZiBhdmFpbGFibGUuIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMxMTgzCgogICopIFJlYW5pbWF0ZWQgdGhlIChzdGlsbCB1bmRvY3VtZW50ZWQpIHByb3h5IHJlY2VpdmUgYnVmZmVyIHNpemUgZGlyZWN0aXZlOgogICAgIFJlbmFtZWQgZnJvbSBSZWNlaXZlQnVmZmVyU2l6ZSB0byBQcm94eVJlY2VpdmVCdWZmZXJTaXplIGJlY2F1c2UgdGhlIG9sZAogICAgIG5hbWUgd2FzIHJlYWxseSB0b28gZ2VuZXJpYywgYWRkZWQgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBkaXJlY3RpdmUgdG8KICAgICB0aGUgbW9kX3Byb3h5Lmh0bWwgYW5kIGNvcnJlY3RlZCB0aGUgaHlwZXJsaW5rIHRvIGl0IGluIHRoZQogICAgIG5ld19mZWF0dXJlc18xLjMuaHRtbCBkb2N1bWVudC4gIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMxMzQ4CgogICopIEZpeCBhIGJ1ZyBpbiB0aGUgc3JjL2hlbHBlcnMvZnAycnAgc2NyaXB0IGFuZCBtYWtlIGl0IGEgbGl0dGxlIGJpdAogICAgIGZhc3RlciBbTWFydGluIEtyYWVtZXJdCiAgCiAgKikgTWFrZSBDb25maWd1cmUgZGllIHdoZW4geW91IGdpdmUgaXQgYW4gdW5rbm93biBjb21tYW5kIHN3aXRjaC4KICAgICBbQmVuIEh5ZGVdCgogICopIEFkZCBmaXZlIG5ldyBhbmQgZnJlc2ggbWFucGFnZXMgZm9yIHRoZSBzdXBwb3J0IHByb2dyYW1zOiBkYm1tYW5hZ2UuMSwKICAgICBzdWV4ZWMuOCwgaHRkaWdlc3QuMSwgcm90YXRlbG9ncy44IGFuZCBsb2dyZXNvbHZlLjguICBOb3cgYWxsIHVwLXRvLWRhdGUKICAgICBhbmQgcGVyIGRlZmF1bHQgY29tcGlsZWQgc3VwcG9ydCBwcm9ncmFtcyBoYXZlIG1hbnVhbCBwYWdlcyAtIGp1c3QgdG8KICAgICBkb2N1bWVudCBvdXIgc3R1ZmYgYSBsaXR0bGUgYml0IG1vcmUgYW5kIHRvIGJlIGFibGUgdG8gZG8gcmVhbGx5CiAgICAgVW5peC1saWtlIGluc3RhbGxhdGlvbnMgOy0pIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBNYWpvciBjbGVhbnVwcyB0byB0aGUgQ29uZmlndXJlIHNjcmlwdCB0byBtYWtlIGl0IGFuZCBpdHMgZ2VuZXJhdGVkCiAgICAgTWFrZWZpbGVzIGFnYWluIHJlYWRhYmxlIGFuZCBtYWludGFpbmFibGU6IGFkZCBTUkNESVIgb3B0aW9uLCByZW1vdmVkCiAgICAgSU5DTFVERVNfREVQVEhbMC0yXSBrbHVkZ2UsIGNsZWFudXAgb2YgVEFSR0VUIG9wdGlvbiwgY2xlYW51cCBvZgogICAgIGdlbmVyYXRlZCBzZWN0aW9ucywgY29uc2VxdWVudGx5IGFkZGVkIE1ha2VmaWxlIGhlYWRlcnMgd2l0aCBpbmhlcml0YW5jZQogICAgIGluZm9ybWF0aW9uLCBhZGRlZCBzdWJkaXIgbW92ZW1lbnQgbWVzc2FnZXMgZm9yIGVhc2llciBmb2xsb3dpbmcgd2hlcmUKICAgICB0aGUgYnVpbGQgcHJvY2VzcyBjdXJyZW50bHkgc3RheXMgKG1vcmUgdmVyYm9zZSB0aGVuIHN0YW5kYXJkIE1ha2UsIGxlc3MKICAgICB2ZXJib3NlIHRoYW4gR05VIG1ha2UpLCBzYW1lIHN0eWxlIHRvIGNvbW1lbnRzIGluIHRoZSBDb25maWd1cmUgc2NyaXB0LAogICAgIGFkZGVkIEFwYWNoZSBsaWNlbnNlIGhlYWRlciwgZml4ZWQgYSBmZXcgYnVncywgZXRjLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KICAgICAKICAqKSBBZGQgdGhlIG5ldyBBcGFjaGVCZW5jaCBwcm9ncmFtICJhYiIgdG8gc3JjL3N1cHBvcnQvOiBUaGlzIGlzIGRlcml2ZWQKICAgICBmcm9tIHRoZSBaZXVzQmVuY2ggYmVuY2htYXJraW5nIHByb2dyYW0gYW5kIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUKICAgICByZXNwb25zZSBwZXJmb3JtYW5jZSBvZiBhbiBBcGFjaGUgaW5zdGFsbGF0aW9uLiBUaGlzIHZlcnNpb24gaXMKICAgICBvZmZpY2lhbGx5IGxpY2Vuc2VkIHdpdGggWmV1cyBUZWNobm9sb2d5LCBMdGQuIFNlZSB0aGUgbGljZW5zZSBhZ3JlZW1lbnQKICAgICBzdGF0ZW1lbnRzIGluIDwxOTk4MDMxNzEyMjQuTkFBMjQ1NDcgZW4xLmVuZ2Vsc2NoYWxsLmNvbT4gaW4gYXBhY2hlLWNvcmUuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFQSTogVmFyaW91cyBjb3JlIGZ1bmN0aW9ucyB0aGF0IGFyZSBkZWZpbmF0ZWx5IG5vdCBwYXJ0IG9mIHRoZSBBUEkKICAgICBoYXZlIGJlZW4gbWFkZSBzdGF0aWMsIGFuZCBhIGZldyBoYXZlIGJlZW4gbWFya2VkIEFQSV9FWFBPUlQuICBTdGlsbAogICAgIG1vcmUgaGF2ZSBiZWVuIG1hcmtlZCBDT1JFX0VYUE9SVCBhbmQgYXJlIG5vdCBpbnRlbmRlZCBmb3IgZ2VuZXJhbAogICAgIHVzZSBieSBtb2R1bGVzLiAgW0RvdWcgTWFjRWFjaGVybiwgRGVhbiBHYXVkZXRdCgogICopIG1vZF9wcm94eSB3YXMgbm90IGNsZWFyaW5nIHRoZSBQcm94eS1Db25uZWN0aW9uIGhlYWRlciBmcm9tCiAgICAgcmVxdWVzdHM7IG5vdyBpdCBkb2VzLiAgVGhpcyBkaWQgbm90IHZpb2xhdGUgYW55IHNwZWMsIGhvd2V2ZXIgCiAgICAgY2F1c2VzIHBvb3IgaW50ZXJhY3Rpb25zIHdoZW4geW91IGFyZSB0YWxraW5nIHRvIHJlbW90ZSBwcm94aWVzLiAgCiAgICAgW01hcmMgU2xlbWtvXSBQUiMxNzQxCgogICopIFZhcmlvdXMgY2xlYW51cHMgdG8gdGhlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UgYW5kIG1hbnVhbCBwYWdlcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgY2ZnX2dldGxpbmUoKSB3YXMgbm90IHByb3Blcmx5IGhhbmRsaW5nIGxpbmVzIHRoYXQgZGlkIG5vdCBlbmQKICAgICB3aXRoIGEgbGluZSB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIuICBbTWFyYyBTbGVta29dIFBSIzE4NjksIDE5MDkKCiAgKikgUGVyZm9ybWFuY2UgdHdlYWsgdG8gbW9kX2xvZ19jb25maWcuICBbRG1pdHJ5IEtocnVzdGFsZXZdCgogICopIENsZWFuIHVwIHNvbWUgdW5kb2N1bWVudGVkIGJlaGF2aW9yIG9mIG1vZF9zZXRlbnZpZiByZWxhdGVkIHRvCiAgICAgIm1lcmdpbmciIHR3byBTZXRFbnZJZiBkaXJlY3RpdmVzIHdoZW4gdGhleSBtYXRjaCB0aGUgc2FtZSBoZWFkZXIKICAgICBhbmQgcmVnZXguICBEb2N1bWVudCB0aGF0IG1vZF9zZXRlbnZpZiB3aWxsIHBlcmZvcm0gY29tcGFyaXNvbnMgaW4KICAgICB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIGNvbmZpZyBmaWxlLiAgT3B0aW1pemUgbW9kX3NldGVudmlmIGJ5CiAgICAgZG9pbmcgbW9yZSB3b3JrIGF0IGNvbmZpZyB0aW1lIHJhdGhlciB0aGFuIGF0IHJ1bnRpbWUuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBzcmMvaW5jbHVkZS9hcF9jb25maWcuaCBub3cgd3JhcHMgaXQncyAjZGVmaW5lJ3Mgd2l0aCAjaWZuZGVmLyNlbmRpZidzCiAgICAgdG8gYWxsb3cgZm9yIG1vZHVsZXMgdG8gb3ZlcnJ1bGUgdGhlbSBhbmQgdG8gcmVkdWNlIHJlZGVmaW5pdGlvbgogICAgIHdhcm5pbmdzIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBbUE9SVF0gRm9yIEEvVVggY2hhbmdlIHRoZSBPUy0jZGVmaW5lIGZvciAtREFVWCB0byAtREFVWDMuCiAgICAgW0ppbSBKYWdpZWxza2ldCgogICopIE1ha2luZyB0aGUgaGFyZC1jb2RlZCBjcm9zcy1tb2R1bGUgZnVuY3Rpb24gY2FsbCBtaW1lX2ZpbmRfY3QoKSAoZnJvbQogICAgIG1vZF9wcm94eSB0byBtb2RfbWltZSkgb2Jzb2xldGUgYnkgbWFraW5nIHN1cmUgdGhlIEFQSSBob29rIGZvciBNSU1FIHR5cGUKICAgICBjaGVja2luZyBpcyByZWFsbHkgY2FsbGVkIGV2ZW4gZm9yIHByb3h5IHJlcXVlc3RzIGV4Y2VwdCBmb3IgVVJMcyB3aXRoCiAgICAgSFRUUCBzY2hlbWVzIChiZWNhdXNlIHRoZXJlIHdlIGNhbiBvcHRpbWl6ZSBieSBub3QgcnVubmluZyB0aGUgdHlwZQogICAgIGNoZWNraW5nIGhvb2tzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSBwcm94eSBnZXRzIHRoZSBNSU1FIENvbnRlbnQtdHlwZQogICAgIGZyb20gdGhlIHJlbW90ZSBob3N0IGxhdGVyKS4gVGhpcyBjaGFuZ2UgY2xlYW5zIHVwIG1vZF9taW1lIGJ5IHJlbW92aW5nCiAgICAgdGhlIHVnbHkgZXhwb3J0IGtsdWRnZSwgbWFrZXMgdGhlIG9uZS1saW5lciBmaWxlIG1vZF9taW1lLmggb2Jzb2xldGUsIGFuZAogICAgIGVzcGVjaWFsbHkgdW5idW5kbGVzIG1vZF9wcm94eSBhbmQgbW9kX21pbWUuIFRoaXMgd2F5IHRoZXkgYm90aCBub3cgY2FuCiAgICAgYmUgY29tcGlsZWQgYXMgc2hhcmVkIG9iamVjdHMgYW5kIGFyZSBubyBsb25nZXIgdGllZCB0b2dldGhlci4gCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIHV0aWwuYyBjbGVhbnVwIGFuZCBzcGVlZHVwLiBbRGVhbiBHYXVkZXRdCgogICopIEFQSTogQ2xhcmlmaWNhdGlvbiwgcHN0cm5kdXAoKSB3aWxsIGFsd2F5cyBjb3B5IG4gYnl0ZXMgb2YgdGhlIHNvdXJjZQogICAgIGFuZCBOVUwgdGVybWluYXRlIGF0IHRoZSAobisxKXN0IGJ5dGUuICBbRGVhbiBHYXVkZXRdCgogICopIE1hcmsgbW9kdWxlIGNvbW1hbmRfcmVjIGFuZCBoYW5kbGVyX3JlYyBzdHJ1Y3R1cmVzIGNvbnN0IHNvIHRoYXQgdGhleQogICAgIGVuZCB1cCBpbiB0aGUgcmVhZC1vbmx5IGRhdGEgc2VjdGlvbiAoYW5kIGFyZSBmcmllbmRsaWVyIHRvIHN5c3RlbXMKICAgICB0aGF0IGRvbid0IGRvIG9wdGltaXN0aWMgbWVtb3J5IGFsbG9jYXRpb24gb24gZm9yaygpKS4gW0RlYW4gR2F1ZGV0XQoKICAqKSBBZGQgY2hlY2sgdG8gdGhlICJQb3J0IiBkaXJlY3RpdmUgdG8gbWFrZSBzdXJlIHRoZSBzcGVjaWZpZWQgCiAgICAgcG9ydCBpcyBpbiB0aGUgYXBwcm9wcmlhdGUgcmFuZ2UuICBbQmVuIEh5ZGVdCgogICopIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB0byBpbnZva2VfaGFuZGxlcigpLgogICAgIFtEbWl0cnkgS2hydXN0YWxldiA8ZGltYSBib2cubXN1LnN1Pl0KCiAgKikgQWRkZWQgc3VwcG9ydCBmb3IgYnVpbGRpbmcgc2hhcmVkIG9iamVjdHMgZXZlbiBmb3IgbGlicmFyeS1zdHlsZSBtb2R1bGVzCiAgICAgKHdoaWNoIGFyZSBidWlsdCBmcm9tIG1vcmUgdGhhbiBvbmUgb2JqZWN0IGZpbGUpLiBUaGlzIG5vdyBwcm92aWRlcyB0aGUKICAgICBhYmlsaXR5IHRvIGJ1aWxkIG1vZF9wcm94eSBhcyBhIHNoYXJlZCBvYmplY3QgbW9kdWxlLiBBZGRpdGlvbmFsbHkKICAgICBtb2R1bGVzIGxpa2UgbW9kX2V4YW1wbGUgYXJlIG5vdyBhbHNvIHN1cHBvcnRlZCBmb3Igc2hhcmVkIG9iamVjdAogICAgIGJ1aWxkaW5nIGJlY2F1c2UgdGhlIGdlbmVyYXRlZCBNYWtlZmlsZXMgbm93IG5vIGxvbmdlciBhc3N1bWUgdGhlcmUgaXMgYXQKICAgICBsZWFzdCBvbmUgc3RhdGljYWxseSBsaW5rZWQgbW9kdWxlLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQVBJOiBDbGFyaWZ5IHVzYWdlIG9mIGNvbnRlbnRfdHlwZSwgaGFuZGxlciwgY29udGVudF9lbmNvZGluZywKICAgICBjb250ZW50X2xhbmd1YWdlIGFuZCBjb250ZW50X2xhbmd1YWdlcyBmaWVsZHMgaW4gcmVxdWVzdF9yZWMuICBUaGV5CiAgICAgbXVzdCBhbHdheXMgYmUgbG93ZXJjYXNlZDsgYW5kIHRoZSBzdHJpbmdzIHBvaW50ZWQgdG8gc2hvdWxkbid0CiAgICAgYmUgbW9kaWZpZWQgKHlvdSBtdXN0IGNvcHkgdGhlbSB0byBtb2RpZnkgdGhlbSkuICBGaXggYSBmZXcgYnVncwogICAgIHJlbGF0ZWQgdG8gdGhpcy4gIFtEZWFuIEdhdWRldF0KCiAgKikgQVBJOiBDbGFyaWZpY2F0aW9uOiBleGNlcHQgZm9yIFJBV19BUkdTLCBhbGwgY29tbWFuZCBoYW5kbGVycyBjYW4KICAgICB0cmVhdCB0aGUgY2hhciAqIHBhcmFtZXRlcnMgYXMgcGVybWFuZW50LCBhbmQgbW9kaWZpYWJsZS4gIFRoZXJlCiAgICAgaXMgbm8gbmVlZCB0byBwc3RyZHVwKCkgdGhlbS4gIENsZWFuIHVwIHNvbWUgbmVlZGxlc3MgcHN0cmR1cCgpLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgTm93IG1vZF9zbyBrZWVwcyB0cmFjayBvZiB3aGljaCBtb2R1bGUgc2hhcmVkIG9iamVjdHMgd2l0aCB3aGljaCBuYW1lcwogICAgIGFyZSBsb2FkZWQgYW5kIHRodXMgYXZvaWRzIG11bHRpcGxlIGxvYWRpbmcgYW5kIHVubG9hZGluZyBhbmQgaXJyaXRhdGluZwogICAgIGVycm9yX2xvZyBtZXNzYWdlcy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFByaW9yIHRvIHRoZSBleGlzdGVuY2Ugb2YgbW9kX3NldGVudiBpdCB3YXMgbmVjZXNzYXJ5IHRvIHR3ZWFrIHRoZSBUWgogICAgIGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoZSBhcGFjaGUgY29yZS4gIEJ1dCB0aGF0IHR3ZWFraW5nIGludGVyZmVyZXMKICAgICB3aXRoIG1vZF9zZXRlbnYuICBTbyBkb24ndCB0d2VhayBpZiB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIGFuIGV4cGxpY2l0CiAgICAgVFogdmFyaWFibGUuICBbSmF5IFNvZmZpYW4gPGpheSBjaW1lZGlhLmNvbT5dIFBSIzE4ODgKCiAgKikgcnB1dHMoKSBkaWQgbm90IGNhbGN1bGF0ZSByLT5zZW50X2JvZHljdCBwcm9wZXJseS4KICAgICBbU2llZ211bmQgU3Rpcm53ZWlzcyA8c2llZ3N0IGthdC5pbmEuZGU+XSBQUiMxOTAwCgogICopIFRoZSBDR0kgc3BlYyBzYXlzIHRoYXQgUkVNT1RFX0hPU1Qgc2hvdWxkIGJlIHNldCB0byB0aGUgcmVtb3RlIGhvc3RzJ3MKICAgICBuYW1lLCBvciBsZWZ0IHVuc2V0IGlmIHRoaXMgdmFsdWUgaXMgdW5hdmFpbGFibGUuICBBcGFjaGUgd2FzIHNldHRpbmcKICAgICBpdCB0byB0aGUgSVAgYWRkcmVzcyB3aGVuIHVuYXZhaWxhYmxlLgogICAgIFtUb255IEZpbmNoIDxmYW5mIGRlbW9uLm5ldD5dIFBSIzE5MjUKCiAgKikgVmFyaW91cyBpbXByb3ZlbWVudHMgdG8gdGhlIGNvbmZpZ3VyYXRpb24gYW5kIGJ1aWxkIHN1cHBvcnQgZm9yIGNvbXBpbGluZwogICAgIG1vZHVsZXMgYXMgc2hhcmVkIG9iamVjdHMuIEVzcGVjaWFsbHkgU29sYXJpcyAyLngsIFN1bk9TIDQuMSwgSVJJWCBhbmQKICAgICBPU0YxIHN1cHBvcnQgd2l0aCBHQ0MgYW5kIHZlbmRvciBjb21waWxlcnMgd2FzIGFkZGVkLiAgVGhpcyB3YXkgc2hhcmVkCiAgICAgb2JqZWN0IHN1cHBvcnQgaXMgbm93IHByb3ZpZGVkIG91dC1vZi10aGUtYm94IGZvciBGcmVlQlNELCBMaW51eCwKICAgICBTb2xhcmlzLCBTdW5PUywgSVJJWCBhbmQgT1NGMS4gSW4gc2hvcnQ6IE9uIGFsbCBtYWpvciBwbGF0Zm9ybXMhCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1pbm9yIGNsZWFudXAgaW4gaHR0cF9tYWluIC0tIHNwbGl0IFFOWCBhbmQgT1MyIHNwZWNpZmljICJtbWFwIgogICAgIHNjb3JlYm9hcmQgY29kZSBpbnRvIHNlcGFyYXRlICNkZWZpbmVzIC0tIFVTRV9QT1NJWF9TQ09SRUJPQVJECiAgICAgYW5kIFVTRV9PUzJfU0NPUkVCT0FSRC4gIFtEZWFuIEdhdWRldF0KCiAgKikgRml4IG9uZSBtb3JlIHNwZWNpYWwgbG9ja2luZyBwcm9ibGVtIGZvciBSZXdyaXRlTWFwIHByb2dyYW1zIGluCiAgICAgbW9kX3Jld3JpdGU6IEFjY29yZGluZyB0byB0aGUgZG9jdW1lbnRhdGlvbiBvZiBmbG9jaygpLCAiTG9ja3MgYXJlIG9uCiAgICAgZmlsZXMsIG5vdCBmaWxlIGRlc2NyaXB0b3JzLiAgVGhhdCBpcywgZmlsZSBkZXNjcmlwdG9ycyBkdXBsaWNhdGVkCiAgICAgdGhyb3VnaCBkdXAoMikgb3IgZm9yaygyKSBkbyBub3QgcmVzdWx0IGluIG11bHRpcGxlIGluc3RhbmNlcyBvZiBhIGxvY2ssCiAgICAgYnV0IHJhdGhlciBtdWx0aXBsZSByZWZlcmVuY2VzIHRvIGEgc2luZ2xlIGxvY2suIElmIGEgcHJvY2VzcyBob2xkaW5nIGEKICAgICBsb2NrIG9uIGEgZmlsZSBmb3JrcyBhbmQgdGhlIGNoaWxkIGV4cGxpY2l0bHkgdW5sb2NrcyB0aGUgZmlsZSwgdGhlCiAgICAgcGFyZW50IHdpbGwgbG9zZSBpdHMgbG9jay4iLiBUbyBvdmVyY29tZSB0aGlzIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoZQogICAgIFJld3JpdGVMb2NrIGZpbGUgaXMgb3BlbmVkIF9BRlRFUl8gdGhlIGNoaWxkcyB3ZXJlIHNwYXduZWQgd2hpY2ggaXMgbm93CiAgICAgdGhlIGNhc2UgYnkgb3BlbmluZyBpdCBpbiB0aGUgY2hpbGRfaW5pdCBpbnN0ZWFkIG9mIHRoZSBtb2R1bGVfaW5pdCBBUEkKICAgICBob29rLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMTAyOQoKICAqKSBDaGFuZ2UgdG8gTG9jYXRpb24gYW5kIExvY2F0aW9uTWF0Y2ggc2VtYW50aWNzLiAgTG9jYXRpb25NYXRjaCBubwogICAgIGxvbmdlciBsZXRzIGEgc2luZ2xlIHNsYXNoIG1hdGNoIG11bHRpcGxlIGFkamFjZW50IHNsYXNoZXMgaW4gdGhlCiAgICAgVVJMLiAgVGhpcyBjaGFuZ2UgaXMgZm9yIGNvbnNpc3RlbmN5IHdpdGggUmV3cml0ZVJ1bGUgYW5kCiAgICAgQWxpYXNNYXRjaC4gIE11bHRpcGxlIHNsYXNoZXMgaGF2ZSBtZWFuaW5nIGluIFVSTHMgdGhhdCB0aGV5IGRvCiAgICAgbm90IGhhdmUgaW4gKHNvbWUpIGZpbGVzeXN0ZW1zLiAgTG9jYXRpb24gb24gdGhlIG90aGVyIGhhbmQgY2FuCiAgICAgYmUgY29uc2lkZXJlZCBhIHNob3J0aGFuZCBmb3IgYSBtb3JlIGNvbXBsaWNhdGVkIHJlZ2V4LCBhbmQgaXQKICAgICBkb2VzIG1hdGNoIG11bHRpcGxlIHNsYXNoZXMgd2l0aCBhIHNpbmdsZSBzbGFzaCAtLSB3aGljaCBpcwogICAgIGFsc28gY29uc2lzdGVudCB3aXRoIHRoZSBBbGlhcyBkaXJlY3RpdmUuCiAgICAgW0RlYW4gR2F1ZGV0XSByZWxhdGVkIFBSIzE0NDAKCiAgKikgRml4IGJ1ZyB3aXRoIG1vZF9taW1lX21hZ2ljIGNhdXNpbmcgY2VydGFpbiBmaWxlcywgaW5jbHVkaW5nIGZpbGVzCiAgICAgb2YgbGVuZ3RoIDAsIHRvIHJlc3VsdCBpbiBubyByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBUaGUgQ29uZmlndXJlIHNjcmlwdCBub3cgZ2VuZXJhdGVzIHNyYy9pbmNsdWRlL2FwX2NvbmZpZy5oIHdoaWNoCiAgICAgY29udGFpbnMgdGhlIHNldCBvZiBkZWZpbmVzIHVzZWQgd2hlbiBBcGFjaGUgaXMgY29tcGlsZWQgb24gYSBwbGF0Zm9ybS4KICAgICBUaGlzIGZpbGUgY2FuIHRoZW4gYmUgaW5jbHVkZWQgYnkgZXh0ZXJuYWwgbW9kdWxlcyBiZWZvcmUgaW5jbHVkaW5nCiAgICAgYW55IEFwYWNoZSBoZWFkZXIgZmlsZXMgaW4gY2FzZSB0aGV5IGFyZSBiZWluZyBidWlsdCBzZXBhcmF0ZWx5IGZyb20KICAgICBBcGFjaGUuICBBbG9uZyB3aXRoIHRoaXMgY2hhbmdlLCBhIGNvdXBsZSBvZiBtaW5vciBjaGFuZ2VzIHdlcmUKICAgICBtYWRlIHRvIG1ha2UgQXBhY2hlJ3MgI2RlZmluZXMgY29leGlzdCBwZWFjZWZ1bGx5IHdpdGggYW55IGF1dG9jb25mCiAgICAgZGVmaW5lcyBhbiBleHRlcm5hbCBtb2R1bGUgbWlnaHQgaGF2ZS4gW1Jhc211cyBMZXJkb3JmXQoKICAqKSBGaXggbW9kX3Jld3JpdGUgZm9yIHRoZSB1Z2x5IEFQSSBjYXNlIHdoZXJlIDxWaXJ0dWFsSG9zdD4gc2VjdGlvbnMgZXhpc3QKICAgICBidXQgd2l0aG91dCBhbnkgUmV3cml0ZVhYWFhYIGRpcmVjdGl2ZXMuIEhlcmUgbW9kX3Jld3JpdGUgaXMgZ2l2ZW4gbm8KICAgICBjaGFuY2UgYnkgdGhlIEFQSSB0byBpbml0aWFsaXplIGl0cyBwZXItc2VydmVyIGNvbmZpZ3VyYXRpb24gYW5kIHRodXMKICAgICByZWNlaXZlcyB0aGUgd3Jvbmcgb25lIGZyb20gdGhlIG1haW4gc2VydmVyLiBUaGlzIGlzIG5vdyBhdm9pZGVkIGJ5CiAgICAgcmVtZW1iZXJpbmcgdGhlIHNlcnZlciB0b2dldGhlciB3aXRoIHRoZSBjb25maWcgc3RydWN0dXJlIHdoaWxlCiAgICAgY29uZmlndXJpbmcgYW5kIGxhdGVyIGFzc3VtaW5nIHRoZXJlIGlzIG5vIGNvbmZpZyB3aGVuIHdlIHNlZSBhCiAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZW1lbWJlcmVkIHNlcnZlciBhbmQgdGhlIG9uZSBjYWxsaW5nIHVzLiAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMTc5MAoKICAqKSBGaXhlZCB0aGUgREJNIFJld3JpdGVNYXAgc3VwcG9ydCBmb3IgbW9kX3Jld3JpdGU6IEZpcnN0IHRoZSBzdXBwb3J0IG5vdwogICAgIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgdW5kZXIgY29uZmlndXJlIHRpbWUgd2hlbiB0aGUgZGJtX3h4eCBmdW5jdGlvbnMKICAgICBhcmUgbm90IGF2YWlsYWJsZS4gU2Vjb25kLCB0d28gaGVhdnkgc291cmNlIGNvZGUgZXJyb3JzIGluIHRoZSBEQk0KICAgICBzdXBwb3J0IGNvZGUgd2VyZSBmaXhlZC4gIFRoaXMgbWFrZXMgREJNIFJld3JpdGVNYXAncyB1c2FibGUgYWdhaW4gYWZ0ZXIKICAgICBhIGxvbmcgdGltZSBvZiBicm9rZW5uZXNzLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMTY5NgoKICAqKSBOb3cgYWxsIGNvbmZpZ3VyYXRpb24gZmlsZXMgc3VwcG9ydCBVbml4LXN0eWxlIGxpbmUtY29udGludWF0aW9uIHZpYSAKICAgICB0aGUgdHJhaWxpbmcgYmFja3NsYXNoICgiXCIpIGNoYXJhY3Rlci4gVGhpcyBlbmFibGVzIHVzIHRvIHdyaXRlIGRvd24KICAgICBjb21wbGV4IG9yIGp1c3QgdmVyeSBsb25nIGRpcmVjdGl2ZXMgaW4gYSBtb3JlIHJlYWRhYmxlIHdheS4gIFRoZQogICAgIGJhY2tzbGFzaCBjaGFyYWN0ZXIgaGFzIHRvIGJlIHJlYWxseSB0aGUgbGFzdCBjaGFyYWN0ZXIgYmVmb3JlIHRoZQogICAgIG5ld2xpbmUgYW5kIGl0IGhhcyBub3QgYmVlbiBwcmVmaXhlZCBieSBhbm90aGVyIChlc2NhcGluZykgYmFja3NsYXNoLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBXaGVuIHVzaW5nIFByb3h5UGFzcyB0aGUgP3F1ZXJ5c3RyaW5nIHdhcyBub3QgcGFzc2VkIGNvcnJlY3RseS4KICAgICBbSm9lbCBUcnVoZXIgPHRydWhlciB3aXJlZC5jb20+XQoKICAqKSBUbyBkZWFsIHdpdGggbW9kdWxlcyBiZWluZyBjb21waWxlZCBhbmQgW2R5bmFtaWNhbGx5XSBsaW5rZWQKICAgICBhdCBhIGRpZmZlcmVudCB0aW1lIGZyb20gdGhlIGNvcmUsIHRoZSBTRVJWRVJfVkVSU0lPTiBhbmQKICAgICBTRVJWRVJfQlVJTFQgc3ltYm9scyBoYXZlIGJlZW4gYWJzdHJhY3RlZCB0aHJvdWdoIHRoZSBuZXcKICAgICBBUEkgcm91dGluZXMgYXBhcGlfZ2V0X3NlcnZlcl92ZXJzaW9uKCkgYW5kIGFwYXBpX2dldF9zZXJ2ZXJfYnVpbHQoKS4KICAgICBbS2VuIENvYXJdICBQUiMxNDQ4CgogICopIFdJTjMyOiBQcmVzZXJ2ZSB0cmFpbGluZyBzbGFzaCBpbiBjYW5vbmljYWwgcGF0aCAoYW5kIGhlbmNlCiAgICAgaW4gUEFUSF9JTkZPKS4gW1BhdWwgU3V0dG9uLCBCZW4gTGF1cmllXQoKICAqKSBQT1JUOiBVU0VfUFRIUkVBRF9TRVJJQUxJWkVEX0FDQ0VQVCBoYXMgcHJvdmVuIHVucmVsaWFibGUKICAgICBkZXBlbmRpbmcgb24gdGhlIHJldiBvZiBTb2xhcmlzIGFuZCB3aGF0IG1peHR1cmUgb2YgbW9kdWxlcwogICAgIGFyZSBpbiB1c2UuICBTbyBpdCBoYXMgYmVlbiBkaXNhYmxlZCwgYW5kIFNvbGFyaXMgaXMgYmFjayB0bwogICAgIHVzaW5nIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVC4gIFVzZXJzIG1heSBleHBlcmltZW50IHdpdGgKICAgICBVU0VfUFRIUkVBRF9TRVJJQUxJWkVEX0FDQ0VQVCBhdCB0aGVpciBvd24gcmlzaywgaXQgbWF5IHNwZWVkCiAgICAgdXAgc3RhdGljIGNvbnRlbnQgb25seSBzZXJ2ZXJzLiAgT3IgaXQgbWF5IGZhaWwgdW5wcmVkaWN0YWJseS4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzE3NzksIDE4NTQsIDE5MDQKCiAgKikgbW9kX3Rlc3RfdXRpbF91cmkuYyBjcmVhdGVkIHdoaWNoIHRlc3RzIHRoZSBsb2dpYyBpbiB1dGlsX3VyaS5jLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgQVBJOiBSZXdyaXRlIG9mIGFic29sdXRlVVJJIGhhbmRsaW5nLCBhbmQgaW4gcGFydGljdWxhciBob3cKICAgICBhYnNvbHV0ZVVSSXMgbWF0Y2ggdmhvc3RzLiAgVW5sZXNzIGEgcmVxdWVzdCBpcyBhIHByb3h5IHJlcXVlc3QsIGEKICAgICAiaHR0cDovL2hvc3QiIHVybCBpcyB0cmVhdGVkIGFzIGlmIGEgc2ltaWxhciAiSG9zdDoiIGhlYWRlciBoYWQgYmVlbgogICAgIHN1cHBsaWVkLiAgVGhpcyBjaGFuZ2Ugd2FzIG1hZGUgdG8gc3VwcG9ydCBmdXR1cmUgSFRUUC8xLnggcHJvdG9jb2xzCiAgICAgd2hpY2ggbWF5IHJlcXVpcmUgY2xpZW50cyB0byBzZW5kIGFic29sdXRlVVJJcyBmb3IgYWxsIHJlcXVlc3RzLgoKICAgICBJbiBvcmRlciB0byBhY2hpZXZlIHRoaXMgY2hhbmdlIHN1YnRsZSBjaGFuZ2VzIHdlcmUgbWFkZSB0byB0aGUgQVBJLiAgSW4gYQogICAgIHJlcXVlc3RfcmVjLCByLT5ob3N0bGVuIGhhcyBiZWVuIHJlbW92ZWQuICByLT51bnBhcnNlZF91cmkgbm93IGV4aXN0cyBzbwogICAgIHRoYXQgdGhlIHVubW9kaWZpZWQgdXJpIGNhbiBiZSByZXRyaWV2ZWQgZWFzaWx5LiAgci0+cHJveHlyZXEgaXMgbm90IHNldAogICAgIGJ5IHRoZSBjb3JlLCBtb2R1bGVzIG11c3Qgc2V0IGl0IGR1cmluZyB0aGUgcG9zdF9yZWFkX3JlcXVlc3Qgb3IKICAgICB0cmFuc2xhdGVfbmFtZXMgcGhhc2UuCgogICAgIFBsdXMgY2hhbmdlcyB0byB0aGUgdmlydHVhbGhvc3QgdGVzdCBzdWl0ZSBmb3IgYWJzb2x1dGVVUkkgdGVzdGluZy4KCiAgICAgVGhpcyBmaXhlcyBzZXZlcmFsIGJ1Z3Mgd2l0aCB0aGUgcHJveHkgcHJveHlpbmcgcmVxdWVzdHMgdG8gdmhvc3RzCiAgICAgbWFuYWdlZCBieSB0aGUgc2FtZSBodHRwZC4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIEFQSTogQ2xlYW51cCBvZiBjb2RlIGluIGh0dHBfdmhvc3QuYywgYW5kIHJlbW92ZSB2aG9zdCBtYXRjaGluZwogICAgIGNvZGUgZnJvbSBtb2RfcmV3cml0ZS4gIFRoZSB2aG9zdCBtYXRjaGluZyBpcyBub3cgcGVyZm9ybWVkIGJ5IGEKICAgICBnbG9iYWxseSBhdmFpbGFibGUgZnVuY3Rpb24gbWF0Y2hlc19yZXF1ZXN0X3Zob3N0KCkuICBbRGVhbiBHYXVkZXRdCgogICopIFJlZHVjZSBtZW1vcnkgdXNhZ2UsIGFuZCBzcGVlZCB1cCBTZXJ2ZXJBbGlhcyBzdXBwb3J0LiAgQXMgYQogICAgIHNpZGUtZWZmZWN0IHVzZXJzIGNhbiBsaXN0IG11bHRpcGxlIFNlcnZlckFsaWFzIGRpcmVjdGl2ZXMKICAgICBhbmQgdGhleSdyZSBhbGwgY29uc2lkZXJlZC4KICAgICBbQ2hpYS1saWFuZyBLYW8gPGNsa2FvIGNpcngub3JnPl0gUFIjMTUzMQoKICAqKSBUaGUgInBvbHkiIGRpcmVjdGl2ZSBpbiBpbWFnZSBtYXBzIGRpZCBub3QgaW5jbHVkZSB0aGUgYm9yZGVycyBvZiB0aGUKICAgICBwb2x5Z29uLCB3aGVyZWFzIHRoZSAicmVjdCIgZGlyZWN0aXZlIGRvZXMuICBGaXggdGhpcyBpbmNvbnNpc3RlbmN5LgogICAgIFtLb25zdGFudGluIE1vcnNobmV2IDxtb2tvIGRlc2lnbi5ydT5dIFBSIzE3NzEKCiAgKikgTWFrZSBcXCBiZWhhdmUgYXMgZXhwZWN0ZWQuICBbPFJvbmFsZC5Uc2NoYWxhZXIgcHNpLmNoPl0KCiAgKikgQWRkIHRoZSBgJWEnIGNvbnN0cnVjdCB0byBMb2dGb3JtYXQgYW5kIEN1c3RvbUxvZyB0byBsb2cgdGhlIGNsaWVudCBJUAogICAgIGFkZHJlc3MuIFtUb2RkIEVpZ2Vuc2NoaW5rIDxlaWdlbnN0ciBtaXhpLm5ldD5dIFBSIzE4ODUKCiAgKikgQVBJOiBBIG5ldyBzb3VyY2UgbW9kdWxlIG1haW4vdXRpbF91cmkuYzsgSXQgY29udGFpbnMgYSByb3V0aW5lCiAgICAgcGFyc2VfdXJpX2NvbXBvbmVudHMoKSBhbmQgZnJpZW5kcyB3aGljaCBicmVha3MgYSBVUkkgaW50byBpdHMgY29tcG9uZW50CiAgICAgcGFydHMuICBUaGVzZSBwYXJ0cyBhcmUgc3RvcmVkIGluIGEgdXJpX2NvbXBvbmVudHMgc3RydWN0dXJlIGNhbGxlZAogICAgIHBhcnNlZF91cmkgd2l0aGluIGVhY2ggcmVxdWVzdF9yZWMsIGFuZCBhcmUgYXZhaWxhYmxlIHRvIGFsbCBtb2R1bGVzLgogICAgIEFkZGl0aW9uYWxseSwgYW4gdW5wYXJzZSByb3V0aW5lIGlzIHN1cHBsaWVkIHdoaWNoIHJlLWFzc2VtYmxlcyB0aGUgVVJJCiAgICAgY29tcG9uZW50cyBiYWNrIHRvIGFuIFVSSSwgb3B0aW9uYWxseSBoaWRpbmcgdGhlIHVzZXJuYW1lOnBhc3N3b3JkQCBwYXJ0CiAgICAgZnJvbSBmdHAgcHJveHkgcmVxdWVzdHMsIGFuZCBvdGhlciB1c2VmdWwgcm91dGluZXMuICBXaXRoaW4gdGhlIHN0cnVjdHVyZSwKICAgICB5b3UgZmluZCBvbiBhIHJlYWR5LWZvci11c2UgYmFzaXM6CiAgICAgICAgc2NoZW1lOyAgICAgLyogc2NoZW1lICgiaHR0cCIvImZ0cCIvLi4uKSAqLwogICAgICAgIGhvc3RpbmZvOyAgIC8qIGNvbWJpbmVkIFt1c2VyWzpwYXNzd29yZF1AXWhvc3RbOnBvcnRdICovCiAgICAgICAgdXNlcjsgICAgICAgLyogdXNlciBuYW1lLCBhcyBpbiBodHRwOi8vdXNlcjpwYXNzd2RAaG9zdDpwb3J0LyAqLwogICAgICAgIHBhc3N3b3JkOyAgIC8qIHBhc3N3b3JkLCBhcyBpbiBodHRwOi8vdXNlcjpwYXNzd2RAaG9zdDpwb3J0LyAqLwogICAgICAgIGhvc3RuYW1lOyAgIC8qIGhvc3RuYW1lIGZyb20gVVJJIChvciBmcm9tIEhvc3Q6IGhlYWRlcikgKi8KICAgICAgICBwb3J0X3N0cjsgICAvKiBwb3J0IHN0cmluZyAoaW50ZWdlciByZXByZXNlbnRhdGlvbiBpcyBpbiAicG9ydCIpICovCiAgICAgICAgcGF0aDsgICAgICAgLyogdGhlIHJlcXVlc3QgcGF0aCAob3IgIi8iIGlmIG9ubHkgc2NoZW1lOi8vaG9zdCB3YXMgZ2l2ZW4pICovCiAgICAgICAgcXVlcnk7ICAgICAgLyogRXZlcnl0aGluZyBhZnRlciBhICc/JyBpbiB0aGUgcGF0aCwgaWYgcHJlc2VudCAqLwogICAgICAgIGZyYWdtZW50OyAgIC8qIFRyYWlsaW5nICIjZnJhZ21lbnQiIHN0cmluZywgaWYgcHJlc2VudCAqLwogICAgIFRoaXMgaXMgbWVhbnQgdG8gc2VydmUgYXMgdGhlIHBsYXRmb3JtIGZvciAqQklHKiBzYXZpbmdzIGluCiAgICAgY29kZSBjb21wbGV4aXR5IGZvciB0aGUgcHJveHkgbW9kdWxlIChhbmQgbWF5YmUgdGhlIHZob3N0IGxvZ2ljKS4KICAgICBbTWFydGluIEtyYWVtZXJdCgogICopIE1ha2UgYWxsIHBvc3NpYmxlIG1ldGEtY29uc3RydWN0IGV4cGFuc2lvbnMgKCROLCAlTiwgJXtOQU1FfSBhbmQKICAgICAke21hcDprZXl9KSBhdmFpbGFibGUgZm9yIGFsbCBsb2NhdGlvbiB3aGVyZSBhIHN0cmluZyBpcyBjcmVhdGVkIGluCiAgICAgbW9kX3Jld3JpdGUgcmV3cml0aW5nIHJ1bGVzZXRzOiAxc3QgYXJnIG9mIFJld3JpdGVDb25kLCAybmQgYXJnIG9mCiAgICAgUmV3cml0ZVJ1bGUgYW5kIGZvciB0aGUgW0U9TkFNRTpTVFJJTkddIGZsYWcgb2YgUmV3cml0ZVJ1bGUuIFRoaXMgd2F5IHRoZQogICAgIHBvc3NpYmxlIGV4cGFuc2lvbnMgYXJlIGNvbnNlcXVlbnRseSB1c2FibGUgYXQgYWxsIHN0cmluZyBjcmVhdGlvbgogICAgIGxvY2F0aW9ucy4gW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCBpbml0aWFsaXphdGlvbiBvZiBSZXdyaXRlTG9nTGV2ZWwgKGRlZmF1bHQgbm93IGlzIDAgYXMgZG9jdW1lbnRlZCAKICAgICBhbmQgbm90IDEpIGFuZCB0aGUgcGVyLXZpcnR1YWwtc2VydmVyIG1lcmdpbmcgb2YgZGlyZWN0aXZlcy4gTm93IGFsbAogICAgIGRpcmVjdGl2ZXMgZXhjZXB0IGBSZXdyaXRlRW5naW5lJyBhbmQgYFJld3JpdGVPcHRpb24nIGFyZSBlaXRoZXIKICAgICBjb21wbGV0ZWx5IG92ZXJyaWRkZW4gKGRlZmF1bHQpIG9yIGNvbXBsZXRlbHkgaW5oZXJpdGVkICh3aGVuCiAgICAgYFJld3JpdGVPcHRpb25zIGluaGVyaXQnKSBpcyB1c2VkLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0gUFIjMTMyNQoKICAqKSBGaXggYFJld3JpdGVNYXAnIHByb2dyYW0gbG9va3VwIGluIHNpdHVhdGlvbnMgd2hlcmUgc3VjaCBtYXBzIGFyZQogICAgIGRlZmluZWQgYnV0IGRpc2FibGVkIChgUmV3cml0ZUVuZ2luZSBvZmYnKSBpbiBwZXItc2VydmVyIGNvbnRleHQuIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSBQUiMxNDMxCgogICopIEZpeCBidWcgaW50cm9kdWNlZCBpbiAxLjNiNC1kZXYsIGNvbmZpZyB3aXRoIG5vIFBvcnQgc2V0dGluZyB3b3VsZCBjYXVzZQogICAgIHNlcnZlciB0byBiaW5kIHRvIHBvcnQgMCByYXRoZXIgdGhhbiA4MC4gIFtEZWFuIEdhdWRldF0KCiAgKikgRml4IGxvbmctc3RhbmRpbmcgcHJvYmxlbSB3aXRoIFJld3JpdGVNYXAgX3Byb2dyYW1zXyB1bmRlciBVbml4IGRlcml2YXRlcwogICAgIChsaWtlIFN1bk9TIGFuZCBGcmVlQlNEKSB3aGljaCBkb24ndCBhY2NlcHQgdGhlIGxvY2tpbmcgb2YgcGlwZXMKICAgICBkaXJlY3RseS4gIEEgbmV3IGRpcmVjdGl2ZSBSZXdyaXRlTG9jayBpcyBpbnRyb2R1Y2VkIHdoaWNoIGNhbiBiZSB1c2VkIHRvCiAgICAgc2V0dXAgYSBzZXBhcmF0ZSBsb2NraW5nIGZpbGUgd2hpY2ggdGhlbiBpcyB1c2VkIGZvciBzeW5jaHJvbml6YXRpb24uCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdIFBSIzEwMjkKCiAgKikgV0lOMzI6IFRoZSBzZXJ2ZXIgcm9vdCBpcyBvYnRhaW5lZCBmcm9tIHRoZSByZWdpc3RyeSBrZXkKICAgICBIS0xNXFNPRlRXQVJFXEFwYWNoZSBHcm91cFxBcGFjaGVcPHZlcnNpb24+ICh2ZXJzaW9uIGlzIGN1cnJlbnRseQogICAgICIxLjMgYmV0YSIpLCB1bmxlc3Mgb3ZlcnJpZGRlbiBieSB0aGUgLWQgY29tbWFuZCBsaW5lIGZsYWcuIFRoZQogICAgIHZhbHVlIGlzIHN0b3JlZCBieSBydW5uaW5nICJhcGFjaGUgLWkgLWQgc2VydmVycm9vdCIuIFtQYXVsIFN1dHRvbl0KCiAgKikgTWVyZ2VkIG9zL3dpbjMyL21vZF9kbGwuYyBpbnRvIG1vZHVsZXMvc3RhbmRhcmQvbW9kX3NvLmMgdG8gc3VwcG9ydAogICAgIGR5bmFtaWMgbG9hZGluZyBvbiBXaW4zMiBhbmQgVW5peCB2aWEgdGhlIHNhbWUgbW9kdWxlLiBbUGF1bCBTdXR0b25dCgogICopIE5vdyBtb2RfcmV3cml0ZSBubyBsb25nZXIgbWFrZXMgcHJvYmxlbWF0aWMgYXNzdW1wdGlvbnMgb24gdGhlIGNoYXJhY3RlcnMKICAgICBhIHVzZXJuYW1lIGNhbiBjb250YWluIHdoZW4gdHJ5aW5nIHRvIGV4cGFuZCBpdCB2aWEgL2V0Yy9wYXNzd2QuIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBUaGUgbW9kX3NldGVudmlmIEJyb3dzZXJNYXRjaCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjb21tYW5kIGRpZCBub3QKICAgICB3b3JrIHByb3Blcmx5IHdpdGggc3BhY2VzIGluIHRoZSByZWdleC4gIFtSb25hbGQgVHNjaGFsYWVyXSBQUiMxODI1CgogICopIEFkZCBuZXcgUmV3cml0ZU1hcCB0eXBlczogRmlyc3QsIGBybmQnIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGB0eHQnCiAgICAgdHlwZSBidXQgd2l0aCBhIHNwZWNpYWwgcG9zdC1wcm9jZXNzaW5nIGZvciB0aGUgbG9va2VkLXVwIHZhbHVlOiBJdAogICAgIHBhcnNlcyBpdCBpbnRvIGFsdGVybmF0aXZlcyBhY2NvcmRpbmcgdG8gYHwnIGNoYXJzIGFuZCB0aGVuIG9ubHkgb25lCiAgICAgcGFydGljdWxhciBhbHRlcm5hdGl2ZSBpcyBjaG9zZW4gcmFuZG9tbHkgKHRoaXMgaXMgYW4gZXNzZW50aWFsCiAgICAgZnVuY3Rpb25hbGl0eSBuZWVkZWQgZm9yIGJhbGFuY2luZyBiZXR3ZWVuIGJhY2tlbmQtc2VydmVycyB3aGVuIHVzaW5nCiAgICAgQXBhY2hlIGFzIGEgUmV2ZXJzZSBQcm94eS4gIFRoZSBsb29rZWQgdXAgdmFsdWUgaGVyZSBpcyBhIGxpc3Qgb2YKICAgICBzZXJ2ZXJzKS4gU2Vjb25kLCBgaW50JyB3aXRoIHRoZSBidWlsdC1pbiBtYXBzIG5hbWVkIGB0b2xvd2VyJyBhbmQKICAgICBgdG91cHBlcicgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbWFwIFVSTCBwYXJ0cyB0byBhIGZpeGVkIGNhc2UgKHRoaXMgaXMgYW4KICAgICBlc3NlbnRpYWwgZmVhdHVyZSB0byBmaXggdGhlIGNhc2Ugb2Ygc2VydmVyIG5hbWVzIHdoZW4gZG9pbmcgbWFzcwogICAgIHZpcnR1YWwtaG9zdGluZyB3aXRoIHRoZSBoZWxwIG9mIG1vZF9yZXdyaXRlIGluc3RlYWQgb2YgdXNpbmcKICAgICA8VmlydHVhbEhvc3Q+IHNlY3Rpb25zKS4gW1JhbGYgUy4gRW5nZWxzY2hhbGwsIHBhcnRzIGJhc2VkIG9uIGNvZGUgZnJvbQogICAgIEpheSBTb2ZmaWFuIDxqYXkgY2ltZWRpYS5jb20+XSBQUiMxNjMxCgogICopIEFkZCBhIG5ldyBkaXJlY3RpdmUgdG8gbW9kX3Byb3h5IHNpbWlsYXIgdG8gUHJveHlQYXNzOiBgUHJveHlQYXNzUmV2ZXJzZScuCiAgICAgVGhpcyBkaXJlY3RpdmUgbGV0cyBBcGFjaGUgYWRqdXN0IHRoZSBVUkwgaW4gTG9jYXRpb24taGVhZGVycyBvbiBIVFRQCiAgICAgcmVkaXJlY3QgcmVzcG9uc2VzIHNlbnQgYnkgdGhlIHJlbW90ZSBzZXJ2ZXIuIFRoaXMgd2F5IHRoZSB2aXJ0dWFsbHkKICAgICBtYXBwZWQgYXJlYSBpcyBubyBsb25nZXIgbGVmdCBvbiByZWRpcmVjdHMgYW5kIHRodXMgYnktcGFzc2VkIHdoaWNoIGlzCiAgICAgZXNwZWNpYWxseSBlc3NlbnRpYWwgd2hlbiBydW5uaW5nIEFwYWNoZSBhcyBhIHJldmVyc2UgcHJveHkuICAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgSGlkZSBQcm94eS1BdXRob3JpemF0aW9uIGZyb20gQ0dJL1NTSS9ldGMganVzdCBsaWtlIEF1dGhvcml6YXRpb24gaXMKICAgICBoaWRkZW4uIFtBbHZhcm8gTWFydGluZXogRWNoZXZhcnJpYV0KCiAgKikgQXBhY2hlIHdpbGwsIHdoZW4gc3RhcnRlZCB3aXRoIHRoZSAtWCAoc2luZ2xlIHByb2Nlc3MpIGRlYnVnZ2luZyBmbGFnLAogICAgIGhvbm9yIHRoZSBTSUdJTlQgb3IgU0lHUVVJVCBzaWduYWxzIGFnYWluIG5vdy4gVGhpcyBjYXBhYmlsaXR5IGdvdCBsb3N0CiAgICAgYSB3aGlsZSBhZ28gZHVyaW5nIE9TLzIgc2lnbmFsIGhhbmRsaW5nIGNoYW5nZXMuCgogICopIFtQT1JUXSBXb3JrIGFyb3VuZCB0aGUgZmFjdCB0aGF0IE5lWFQgcnVucyBvbiBtb3JlIHRoYW4gdGhlCiAgICAgbTY4ayBjaGlwcyBpbiBtb2Rfc3RhdHVzIFtTY290dCBBbmd1aXNoIGFuZCBUaW1vdGh5IEx1b21hCiAgICAgPGx1b21hdCBwZWFrLm9yZz5dCgogICopIFtQT1JUXSBSZWNvZ25pemUgRnJlZUJTRCB2ZXJzaW9ucyBzbyB3ZSBjYW4gdXNlIHRoZSBPUyByZWdleCBhcyB3ZWxsCiAgICAgYXMgaGFuZGxpbmcgdW5zaWduZWQtY2hhcnMgZm9yIEZyZWVCU0QgdjMgYW5kIHYyIFtBbmRyZXkgQ2hlcm5vdgogICAgIDxhY2hlIG5hZ3VhbC5wcC5ydT4gYW5kIEppbV0gUFIjMTQ1MAoKICAqKSBVc2UgU0FfUkVTRVRIQU5EIG9yIFNBX09ORVNIT1Qgd2hlbiBpbnN0YWxsaW5nIHRoZSBjb3JlZHVtcCBoYW5kbGVycy4KICAgICBJbiBwYXJ0aWN1bGFyIHRoZSBoYW5kbGVycyBjb3VsZCB0cmlnZ2VyIHRoZW1zZWx2ZXMgaW50byBhbiBpbmZpbml0ZQogICAgIGxvb3AgaWYgUkxpbWl0TWVtIHdhcyB1c2VkIHdpdGggYSBzbWFsbCBhbW91bnQgb2YgbWVtb3J5IC0tIHRvbyBzbWFsbAogICAgIGZvciB0aGUgc2lnbmFsIHN0YWNrIGZyYW1lIHRvIGJlIHNldCB1cC4gIFtEZWFuIEdhdWRldF0KCiAgKikgRml4IHByb2JsZW1zIHdpdGggYWJzb2x1dGVVUklzIGludHJvZHVjZWQgZHVyaW5nIDEuM2I0LiAgW0RlYW4gR2F1ZGV0LAogICAgIEFsdmFybyBNYXJ0aW5leiBFY2hldmFycmlhIDxhbHZhcm8gbGFuZGVyLmVzPl0KCiAgKikgRml4IG11bHRpcGxlIFVzZXJEaXIgcHJvYmxlbSBpbnRyb2R1Y2VkIGR1cmluZyAxLjNiNC1kZXYuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiMxODUwCgogICopIGFwX2NweXN0cm4oKSBoYWQgYW4gb2ZmLWJ5LTEgZXJyb3IuCiAgICAgW0NoYXJsZXMgRnUgPGNjd2Yga2xhYi5jYWx0ZWNoLmVkdT5dIFBSIzE4NDcKCiAgKikgQVBJOiBBcyBLZW4gc3VnZ2VzdGVkIHRoZSBjaGVja19jbWRfY29udGV4dCgpIGZ1bmN0aW9uIGFuZCByZWxhdGVkCiAgICAgZGVmaW5lcyBhcmUgbm9uLXN0YXRpYyBub3cgc28gbW9kdWxlcyBjYW4gdXNlICdlbS4gIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgbW9kX2luZm8gd291bGQgb2NjYXNpb25hbGx5IHByb2R1Y2UgYW4gdW5wYWlyZWQgPHR0PiBpbiBpdHMKICAgICBvdXRwdXQuIEZpeGVkLiBbTWFydGluIEtyYWVtZXJdCgogICopIEJ5IGRlZmF1bHQgQUlYIGJpbmRzIGEgcHJvY2VzcyAoYW5kIGl0J3MgY2hpbGRyZW4pIHRvIGEgc2luZ2xlCiAgICAgcHJvY2Vzc29yLiAgaHR0cGQgY2hpbGRyZW4gbm93IHVuYmluZCB0aGVtc2VsdmVzIGZyb20gdGhhdCBjcHUKICAgICBhbmQgcmUtYmluZCB0byBvbmUgc2VsZWN0ZWQgYXQgcmFuZG9tIHZpYSBiaW5kcHJvY2Vzc29yKCkKICAgICBbRG91ZyBNYWNFYWNoZXJuXQoKICAqKSBMaW51eCAyLjAgYW5kIGFib3ZlIGltcGxlbWVudCBSTElNSVRfQVMsIFJMSU1JVF9EQVRBIGhhcyBhbG1vc3Qgbm8KICAgICBlZmZlY3QuICBXb3JrIGFyb3VuZCBpdCBieSB1c2luZyBSTElNSVRfQVMgZm9yIHRoZSBSTGltaXRNRU0KICAgICBkaXJlY3RpdmUuICBbRW5yaWsgQmVya2hhbiA8ZW5yaWsgaW5rYS5kZT5dIFBSIzE4MTYKCiAgKikgbW9kX21pbWVfbWFnaWMgZXJyb3IgbWVzc2FnZSBzaG91bGQgaW5kaWNhdGUgdGhlIGZpbGVuYW1lIHdoZW4KICAgICByZWFkcyBmYWlsLiAgWyJNLkQuUGFya2VyIiA8bWRwYyBuZXRjb20uY29tPl0gUFIjMTgyNwoKICAqKSBQcmV2aW91c2x5IEFwYWNoZSB3b3VsZCBwZXJtaXQgPC9GaWxlcz4gdG8gZW5kIDxGaWxlc01hdGNoPiAoYW5kCiAgICAgc2ltaWxhcnkgZm9yIExvY2F0aW9uIGFuZCBEaXJlY3RvcnkpLCBub3cgdGhpcyBpcyBkaWFnbm9zZWQgYXMgYW4KICAgICBlcnJvci4gIEltcHJvdmUgZXJyb3IgbWVzc2FnZXMgZm9yIG1pc21hdGNoZWQgc2VjdGlvbnMgKDxGaWxlcz4sCiAgICAgPEZpbGVzTWF0Y2g+LCA8RGlyZWN0b3J5PiwgPERpcmVjdG9yeU1hdGNoPiwgLi4uKS4KICAgICBbRGVhbiBHYXVkZXQsIE1hcnRpbiBLcmFlbWVyXQoKICAqKSA8RmlsZXM+IGlzIG5vdCBwZXJtaXR0ZWQgd2l0aGluIDxMb2NhdGlvbj4gKGJlY2F1c2Ugb2YgdGhlCiAgICAgc2VtYW50aWMgb3JkZXJpbmcpLiAgW0RlYW4gR2F1ZGV0XSBQUiMzNzkKCiAgKikgPEZpbGVzPiB3aXRoIHdpbGRjYXJkcyB3YXMgYnJva2VuIGJ5IHRoZSBjaGFuZ2UgaW4gd2lsZGNhcmQKICAgICBzZW1hbnRpY3MgKCogZG9lcyBub3QgbWF0Y2ggLykuICBUbyBmaXggdGhpcywgPEZpbGVzPiBub3cKICAgICBhcHBseSBvbmx5IHRvIHRoZSBiYXNlbmFtZSBvZiB0aGUgcmVxdWVzdCBmaWxlbmFtZS4gIFRoaXMKICAgICBmaXhlcyBzb21lIG90aGVyIGluY29uc2lzdGVuY2llcyBpbiA8RmlsZXM+IHNlbWFudGljcwogICAgIChzdWNoIGFzIDxGaWxlcyBhKmI+IG5vdCB3b3JraW5nKS4gIFtEZWFuIEdhdWRldF0gUFIjMTgxNwoKICAqKSBSZW1vdmVkIGJvZ3VzICJkaXN0LnRhciIgdGFyZ2V0IGZyb20gTWFrZWZpbGUudG1wbCBhbmQgbWFrZSBzdXJlCiAgICAgYmFja3VwIGZpbGVzIGFyZSByZW1vdmVkIG9uICJjbGVhbiIgdGFyZ2V0IFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBQT1JUOiBBZGQgLWxtIHRvIExJQlMgZm9yIEhQVVguICBbRGVhbiBHYXVkZXRdIFBSIzE2MzkKCiAgKikgVmFyaW91cyBlcnJvcnMgZnJvbSBzZWxlY3QoKSBhbmQgYWNjZXB0KCkgaW4gY2hpbGRfbWFpbigpIHdvdWxkCiAgICAgcmVzdWx0IGluIGFuIGluZmluaXRlIGxvb3AuICBJdCBzZWVtcyB0aGVzZSB0d28gdGlja2xlIGtlcm5lbAogICAgIG9yIGxpYnJhcnkgYnVncyBvY2Nhc2lvbmFsbHksIGFuZCByZXN1bHQgaW4gbG9nIHNwYW1tYWdlIGFuZAogICAgIGEgZ2VuZXJhbGx5IGJhZCBzY2VuZS4gIE5vdyB0aGUgY2hpbGQgZXhpdHMgaW1tZWRpYXRlbHksCiAgICAgd2hpY2ggc2VlbXMgdG8gYmUgYSBnb29kIHdvcmthcm91bmQuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiMxNzQ3LCAxMTA3LCA1ODgsIDE3ODcsIDk4NywgNTg4CgogICopIENsZWFuZWQgdXAgc29tZSByYWNlIGNvbmRpdGlvbnMgaW4gdW5peCBjaGlsZF9tYWluIGR1cmluZwogICAgIGluaXRpYWxpemF0aW9uLiBbRGVhbiBHYXVkZXRdCgogICopIFNFQ1VSSVRZOiAiVXNlckRpciAvYWJzcGF0aCIgd2l0aG91dCBhICogaW4gdGhlIHBhdGggd291bGQgYWxsb3cKICAgICByZW1vdGUgdXNlcnMgdG8gYWNjZXNzICIvfi4uIiBhbmQgYnlwYXNzIGFjY2VzcyByZXN0cmljdGlvbnMKICAgICAoYnV0IG5vdGUgL34uLi8uLiB3YXMgaGFuZGxlZCBwcm9wZXJseSkuCiAgICAgW0xhdXJpIEplc21pbiA8amVzbWluIHV0LmVlPl0gUFIjMTcwMQoKICAqKSBBUEk6IG9zX2lzX3BhdGhfYWJzb2x1dGUoKSBub3cgdGFrZXMgYSBjb25zdCBjaGFyICogaW5zdGVhZCBvZiBhIGNoYXIgKi4KICAgICBbRGVhbiBHYXVkZXRdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuM2I1CgogICopIFNvdXJjZSBmaWxlIGRlcGVuZGVuY2llcyBpbiBNYWtlZmlsZS50bXBsIGZpbGVzIHRocm91Z2hvdXQgdGhlCiAgICAgc291cmNlIHRyZWUgd2VyZSB1cGRhdGVkIHRvIGFjY3VyYXRlbHkgcmVmbGVjdCByZWFsaXR5LgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgUHJlc2VydmUgdGhlIGNvbnRlbnQgZW5jb2RpbmcgZ2l2ZW4gYnkgdGhlIEFkZEVuY29kaW5nIGRpcmVjdGl2ZQogICAgIHdoZW4gdGhlIGNsaWVudCBkb2Vzbid0IG90aGVyd2lzZSBzcGVjaWZ5IGFuIGVuY29kaW5nLgogICAgIFtSb25hbGQgVHNjaGFsYWVyIDxSb25hbGQuVHNjaGFsYWVyIHBzaS5jaD5dCgogICopIFNvcnQgb3V0IHByb2JsZW1zIHdpdGggY2Fub25pY2FsIGZpbGVuYW1lIGhhbmRsaW5nIGhhcHBlbmluZyB0b28gbGF0ZS4KICAgICBbRGVhbiBHYXVkZXQsIEJlbiBMYXVyaWVdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuM2I0CgogICopIFRoZSBtb2R1bGUgc3RydWN0dXJlIHdhcyBtb2RpZmllZCB0byBpbmNsdWRlIGEgKmR5bmFtaWNfbG9hZF9oYW5kbGUKICAgICBpbiB0aGUgU1RBTkRBUkRfTU9EVUxFX1NUVUZGIHBvcnRpb24sIGFuZCB0aGUgTU9EVUxFX01BR0lDX05VTUJFUgogICAgIGhhcyBiZWVuIGJ1bXBlZCBhY2NvcmRpbmdseS4gIFtQYXVsIFN1dHRvbl0KCiAgKikgQWxsIEJyb3dzZXJNYXRjaCBkaXJlY3RpdmVzIG1lbnRpb25lZCBpbgogICAgIGh0ZG9jcy9tYW51YWwva25vd25fY2xpZW50X3Byb2JsZW1zLmh0bWwgYXJlIGluIHRoZSBkZWZhdWx0CiAgICAgY29uZmlndXJhdGlvbiBmaWxlcy4gIFtMYXJzIEVpbGVicmVjaHRdCgogICopIE1pTlQgcG9ydCB1cGRhdGUuIFtKYW4gUGF1bCBTY2htaWR0XQoKICAqKSBIVFRQLzEuMSByZXF1aXJlcyB4LWd6aXAgYW5kIGd6aXAgZW5jb2RpbmdzIGJlIHRyZWF0ZWQKICAgICBlcXVpdmFsZW50LCBzaW1pbGFybHkgZm9yIHgtY29tcHJlc3MgYW5kIGNvbXByZXNzLiAgQXBhY2hlCiAgICAgbm93IGlnbm9yZXMgYSBsZWFkaW5nIHgtIHdoZW4gY29tcGFyaW5nIGVuY29kaW5ncy4gIEl0IGFsc28KICAgICBwcmVzZXJ2ZXMgdGhlIGVuY29kaW5nIHRoZSBjbGllbnQgcmVxdWVzdHMgKGZvciBleGFtcGxlIGlmCiAgICAgaXQgcmVxdWVzdHMgeC1nemlwLCB0aGVuIEFwYWNoZSB3aWxsIHJlc3BvbmQgd2l0aCB4LWd6aXAKICAgICBpbiB0aGUgQ29udGVudC1FbmNvZGluZyBoZWFkZXIpLgogICAgIFtSb25hbGQgVHNjaGFsYWVyIDxSb25hbGQuVHNjaGFsYWVyIHBzaS5jaD5dIFBSIzE3NzIKCiAgKikgRml4IGEgbWVtb3J5IGxlYWsgb24ga2VlcC1hbGl2ZSBjb25uZWN0aW9ucy4gIFtJZ29yIFRhdGFyaW5vdl0KCiAgKikgQWRkZWQgbW9kX3NvIG1vZHVsZSB0byBzdXBwb3J0IGR5bmFtaWMgbG9hZGluZyBvZiBtb2R1bGVzIG9uIFVuaXgKICAgICAobGlrZSBtb2RfZGxkIGZvciBXaW4zMikuIFRoaXMgcmVwbGFjZXMgbW9kX2RsZC5jLiBVc2UgU2hhcmVkTW9kdWxlCiAgICAgaW5zdGVhZCBvZiBBZGRNb2R1bGUgaW4gQ29uZmlndXJhdGlvbiB0byBidWlsZCBzaGFyZWQgbW9kdWxlcwogICAgIFtTYW1lZXIgUGFyZWtoLCBQYXVsIFN1dHRvbl0KCiAgKikgTWlub3IgY2xlYW51cHMgdG8gci0+ZmluZm8gaGFuZGxpbmcgaW4gc29tZSBtb2R1bGVzLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgQWJzdHJhY3QgcmVhZCgpL3dyaXRlKCkgdG8gYXBfcmVhZCgpL2FwX3dyaXRlKCkuCiAgICAgTWFrZXMgaXQgZWFzaWVyIHRvIGFkZCBvdGhlciB0eXBlcyBvZiBJTyBjb2RlIHN1Y2ggYXMgU0ZJTy4KICAgICBbUmFuZHkgVGVyYnVzaF0KCiAgKikgQVBJOiBHZW5lcmFsaXplIGRlZmF1bHRfcG9ydCBtYW5pcHVsYXRpb25zIHRvIG1ha2Ugc3VwcG9ydCBvZgogICAgIGRpZmZlcmVudCBwcm90b2NvbHMgZWFzaWVyLiBbQmVuIExhdXJpZSwgUmFuZHkgVGVyYnVzaF0KCiAgKikgVGhlcmUgYXJlIG1hbnkgY2FzZXMgd2hlcmUgdXNlcnMgZG8gbm90IHdhbnQgQXBhY2hlIHRvIGZvcm0KICAgICBzZWxmLXJlZmVyZW50aWFsIHVybHMgdXNpbmcgdGhlICJjYW5vbmljYWwiIFNlcnZlck5hbWUgYW5kIFBvcnQuCiAgICAgVGhlIG5ldyBVc2VDYW5vbmljYWxOYW1lIGRpcmVjdGl2ZSAoZGVmYXVsdCBvbiksIGlmIHNldCB0byBvZmYKICAgICB3aWxsIGNhdXNlIEFwYWNoZSB0byB1c2UgdGhlIGNsaWVudC1zdXBwbGllZCBob3N0bmFtZSBhbmQgcG9ydC4KICAgICBBUEk6IFBhcnQgb2YgdGhpcyBjaGFuZ2UgcmVxdWlyZWQgYSBjaGFuZ2UgdG8gdGhlIGNvbnN0cnVjdF91cmwoKQogICAgIHByb3RvdHlwZTsgYW5kIHRoZSBhZGRpdGlvbiBvZiBnZXRfc2VydmVyX25hbWUoKSBhbmQKICAgICBnZXRfc2VydmVyX3BvcnQoKS4KICAgICBbTWljaGFlbCBEb3VnbGFzcyA8bWlrZWRvdWcgdGV4YXMubmV0PiwgRGVhbiBHYXVkZXRdCiAgICAgUFIjMzE1LCA0NTksIDQ4NSwgMTQzMwoKICAqKSBZZXQgYW5vdGhlciByZWFycmFuZ2VtZW50IG9mIHRoZSBzb3VyY2UgdHJlZS4uIG5vdyBhbGwgdGhlIGNvbW1vbgogICAgIGhlYWRlciBmaWxlcyBhcmUgaW4gdGhlIHNyYy9pbmNsdWRlIGRpcmVjdG9yeS4gIFRoZSAtSW1haW4gLUlhcAogICAgIHJlZmVyZW5jZXMgaW4gTWFrZWZpbGVzIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIHRoZSBzaW1wbGVyIC1JaW5jbHVkZQogICAgIGluc3RlYWQuICBJbiBhZGRpdGlvbiB0byBzaW1wbGlmeWluZyB0aGUgYnVpbGQgYSBsaXR0bGUgYml0LCB0aGlzCiAgICAgYWxzbyBtYWtlcyBpdCBjbGVhciB3aGVuIGEgbW9kdWxlIGlzIHJlZmVyZW5jaW5nIHNvbWV0aGluZyBpbiBhCiAgICAgb3RoZXIgdGhhbiBrb3NoZXIgbWFubmVyIChlLmcuLCB0aGUgcHJveHkgaW5jbHVkaW5nIG1vZF9taW1lLmgpLgogICAgIE1vZHVsZS1wcml2YXRlIGhlYWRlciBmaWxlcyAodGhlIHByb3h5LCBtb2RfbWltZSwgdGhlIHJlZ2V4IGxpYnJhcnksCiAgICAgYW5kIG1vZF9yZXdyaXRlKSBoYXZlIG5vdCBiZWVuIG1vdmVkIHRvIHNyYy9pbmNsdWRlOyBub3IgaGF2ZQogICAgIHRoZSBPUy1hYnN0cmFjdGlvbiBmaWxlcy4gIFtLZW4gQ29hcl0KCiAgKikgRml4IGEgYnVnIHdoZXJlIHItPmhvc3RuYW1lIGRpZG4ndCBoYXZlIHRoZSA6cG9ydCBzdHJpcHBlZAogICAgIGZyb20gaXQuICBbRGVhbiBHYXVkZXRdCgogICopIFR3ZWFrZWQgdGhlIGhlYWRlcnNfb3V0IHRhYmxlIHNpemUsIGFuZCB0aGUgc3VicHJvY2Vzc19lbnYKICAgICB0YWJsZSBzaXplIGd1ZXNzIGluIHJlbmFtZV9vcmlnaW5hbF9lbnZpcm9ubWVudCgpLiAgQWRkZWQKICAgICBNQUtFX1RBQkxFX1BST0ZJTEUgd2hpY2ggY2FuIGhlbHAgZGlzY292ZXIgbWFrZV90YWJsZSgpCiAgICAgY2FsbHMgdGhhdCB1c2UgdG9vIHNtYWxsIGFuIGluaXRpYWwgZ3Vlc3MsIHNlZSBhbGxvYy5jLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgT3B0aW9ucyBhbmQgQWxsb3dPdmVycmlkZSB3ZXJlbid0IHByb3Blcmx5IG1lcmdpbmcgaW4gdGhlIG1haW4KICAgICBzZXJ2ZXIgc2V0dGluZyBpbnNpZGUgdmhvc3RzIChvbmx5IGFuIGlzc3VlIHdoZW4geW91IGhhdmUgbm8KICAgICA8RGlyZWN0b3J5PiBvciBvdGhlciBzZWN0aW9uIGNvbnRhaW5pbmcgYW4gT3B0aW9ucyB0aGF0IGFmZmVjdHMKICAgICBhIHJlcXVlc3QpLiAgT3B0aW9ucyArZm9vIG9yIC1mb28gaW4gdGhlIG1haW5fc2VydmVyIHdvdWxkbid0CiAgICAgYWZmZWN0IHRoZSBtYWluX3NlcnZlcidzIGxvb2t1cCBkZWZhdWx0cy4gIFtEZWFuIEdhdWRldF0KCiAgKikgVmFyaWFibGUgJ2N3ZCcgd2FzIGJlaW5nIHVzZWQgcG9pbnRsZXNzbHkgYmVmb3JlIGJlaW5nIHNldC4KICAgICBbS2VuIENvYXJdIFBSIzE3MzgKCiAgKikgci0+YWxsb3dlZCBoYW5kbGluZyBjbGVhbmVkIHVwIGluIHRoZSBzdGFuZGFyZCBtb2R1bGVzLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgU29tZSBjYXNlLXNlbnNpdGl2aXR5IGlzc3VlcyBjbGVhbmVkIHVwIHRvIGJlIGNvbnNpc3RlbnQgd2l0aAogICAgIFJGQzIwNjguICBbRGVhbiBHYXVkZXRdCgogICopIFNJR1VSRyBkb2Vzbid0IGV4aXN0IGV2ZXJ5d2hlcmUuCiAgICAgW01hcmsgQW5kcmV3IEhlaW5yaWNoIDxoZWlucmljaCB0aW5kZXJib3guU3RhbmZvcmQuRURVPl0KCiAgKikgbW9kX3VuaXF1ZV9pZCB3YXMgZXJyb25lb3VzbHkgZ2VuZXJhdGluZyBhIHNlY29uZCB1bmlxdWUgaWQgd2hlbgogICAgIGFuIGludGVybmFsIHJlZGlyZWN0IG9jY3VyZWQuICBTdWNoIHJlZGlyZWN0cyBvY2N1ciwgZm9yIGV4YW1wbGUsCiAgICAgd2hlbiBwcm9jZXNzaW5nIGEgRGlyZWN0b3J5SW5kZXggbWF0Y2guICBbRGVhbiBHYXVkZXRdCgogICopIEFQSTogdGFibGVfYWRkLCB0YWJsZV9tZXJnZSwgYW5kIHRhYmxlX3NldCBpbmNsdWRlIGltcGxpY2l0IHBzdHJkdXAoKQogICAgIG9mIHRoZSBrZXkgYW5kIHZhbHVlLiAgQnV0IGluIG1hbnkgY2FzZXMgdGhpcyBpcyBub3QgcmVxdWlyZWQKICAgICBiZWNhdXNlIHRoZSBrZXkvdmFsdWUgaXMgYSBjb25zdGFudCwgb3IgdGhlIHZhbHVlIGhhcyBiZWVuIGJ1aWx0CiAgICAgYnkgcHN0cmNhdCgpIG9yIG90aGVyIHNpbWlsYXIgbWVhbnMuICBOZXcgcm91dGluZXMgdGFibGVfYWRkbiwKICAgICB0YWJsZV9tZXJnZW4sIGFuZCB0YWJsZV9zZXRuIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgQVBJLCB0aGVzZQogICAgIHJvdXRpbmVzIGRvIG5vdCBwc3RyZHVwKCkgdGhlaXIgYXJndW1lbnRzLiAgVGhlIGNvcmUgY29kZSBhbmQKICAgICBzdGFuZGFyZCBtb2R1bGVzIHdlcmUgY2hhbmdlZCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGVzZSByb3V0aW5lcy4KICAgICBUaGUgcmVzdWx0aW5nIHNlcnZlciBpcyB1cCB0byAyMCUgZmFzdGVyIGluIHNvbWUgc2l0dWF0aW9ucy4KCiAgICAgTm90ZSB0aGF0IGl0IGlzIGVhc3kgdG8gZ2V0IGNvZGUgc3VidGx5IHdyb25nIGlmIHlvdSBwYXNzIGEga2V5L3ZhbHVlCiAgICAgd2hpY2ggaXMgaW4gYSBwb29sIG90aGVyIHRoYW4gdGhlIHBvb2wgb2YgdGhlIHRhYmxlLiAgVGhlIG9ubHkKICAgICBzYWZlIHRoaW5nIHRvIGRvIGlzIHRvIHBhc3Mga2V5L3ZhbHVlcyB3aGljaCBhcmUgaW4gdGhlIHBvb2wgb2YKICAgICB0aGUgdGFibGUsIG9yIGluIG9uZSBvZiB0aGUgYW5jZXN0b3JzIG9mIHRoZSBwb29sIG9mIHRoZSB0YWJsZS4KICAgICBpLmUuIGlmIHRoZSB0YWJsZSBpcyBwYXJ0IG9mIGEgc3VicmVxdWVzdCwgYSB2YWx1ZSBmcm9tIHRoZSBtYWluCiAgICAgcmVxdWVzdCdzIHBvb2wgaXMgT0sgc2luY2UgdGhlIHN1YnJlcXVlc3QgcG9vbCBpcyBhIHN1Yl9wb29sIG9mIHRoZQogICAgIG1haW4gcmVxdWVzdCdzIHBvb2wgKGFuZCB0aGVyZWZvcmUgaGFzIGEgbGlmZXNwYW4gYXQgbW9zdCBhcyBsb25nIGFzCiAgICAgdGhlIG1haW4gcG9vbCkuICBUaGVyZSBpcyBkZWJ1Z2dpbmcgY29kZSB3aGljaCBjYW4gZGV0ZWN0IGltcHJvcGVyCiAgICAgdXNhZ2UsIGVuYWJsZWQgYnkgZGVmaW5pbmcgUE9PTF9ERUJVRy4gIFNlZSBhbGxvYy5jIGZvciBtb3JlIGRldGFpbHMuCiAgICAgW0RtaXRyeSBLaHJ1c3RhbGV2IDxkaW1hIGJvZy5tc3Uuc3U+LCBEZWFuIEdhdWRldF0KCiAgKikgTW9yZSBtb2RfbWltZV9tYWdpYyBjbGVhbnVwOiAgZmV3ZXIgc3lzY2FsbHM7IHNob3VsZCBoYW5kbGUgImZpbGVzIgogICAgIHdoaWNoIGRvbid0IGV4aXN0IG9uIGRpc2sgbW9yZSBncmFjZWZ1bGx5OyBoYW5kbGVzIHZob3N0cyBwcm9wZXJseS4KICAgICBVcGRhdGUgZG9jdW1lbnRhdGlvbiB0byByZWZsZWN0IHRoZSBjb2RlIC0tIGlmIHRoZXJlJ3Mgbm8KICAgICBNaW1lTWFnaWNGaWxlIGRpcmVjdGl2ZSB0aGVuIHRoZSBtb2R1bGUgaXMgbm90IGVuYWJsZWQuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBQT1JUOiBTb21lIG9sZGVyICpuaXggZGlhbGVjdHMgY2Fubm90IGF1dG9tYXRpY2FsbHkgc3RhcnQgc2NyaXB0cwogICAgIHdoaWNoIGJlZ2luIHdpdGggYSAjISBpbnRlcnByZXRlciBsaW5lICh0aGUgc2hlbGwgc3RhcnRzIHRoZSBzY3JpcHRzCiAgICAgYXBwcm9wcmlhdGVseSBvbiB0aGVzZSBwbGF0Zm9ybXMpLiBBcGFjaGUgbm93IHN1cHBvcnRzIHN0YXJ0aW5nIG9mCiAgICAgImhhc2hiYW5nLXNjcmlwdHMiIHdoZW4gdGhlIE5FRURfSEFTSEJBTkdfRU1VTCBkZWZpbmUgaXMgc2V0LgogICAgIFtNYXJ0aW4gS3JhZW1lciwgd2l0aCBjb2RlIGZyb20gUGV0ZXIgV2VtbSA8cGV0ZXIgemV1cy5kaWFsaXgub3ouYXU+CiAgICAgdGFrZW4gZnJvbSB0Y3NoXQoKICAqKSBBUEk6ICJ0eXBlZGVmIGFycmF5X2hlYWRlciB0YWJsZSIgcmVtb3ZlZCBmcm9tIGFsbG9jLmgsIGZvbGtzIHNob3VsZAogICAgIGhhdmUgYmVlbiB3cml0aW5nIHRvIHVzZSB0YWJsZSBhcyBpZiBpdCB3ZXJlIGFuIG9wYXF1ZSB0eXBlLCBidXQgZXZlbgogICAgIHNvbWUgc3RhbmRhcmQgbW9kdWxlcyBnb3QgdGhpcyB3cm9uZy4gIEJ5IGNoYW5naW5nIHRoZSBkZWZpbml0aW9uCiAgICAgdG8gInR5cGVkZWYgc3RydWN0IHRhYmxlIHRhYmxlIiBtb2R1bGUgYXV0aG9ycyB3aWxsIHJlY2VpdmUgY29tcGlsZQogICAgIHRpbWUgd2FybmluZ3MgdGhhdCB0aGV5J3JlIGRvaW5nIHRoZSB3cm9uZyB0aGluZy4gIFRoaXMgY2hhbmdlCiAgICAgZmFjaWxpdGF0ZXMgZnV0dXJlIGNoYW5nZXMgd2l0aCBtb3JlIHNvcGhpc3RpY2F0ZWQgdGFibGUKICAgICBzdHJ1Y3R1cmVzLiAgU3BlY2lmaWNhbGx5LCBtb2R1bGUgYXV0aG9ycyBzaG91bGQgYmUgdXNpbmcgdGFibGVfZWx0cygpCiAgICAgdG8gZ2V0IGFjY2VzcyB0byBhbiBhcnJheV9oZWFkZXIgKiBmb3IgdGhlIHRhYmxlLiBbRGVhbiBHYXVkZXRdCgogICopIEFQSTogUmVuYW1lZCBuZXdfY29ubmVjdGlvbigpIHRvIGF2b2lkIG5hbWVzcGFjZSBjb2xsaXNpb24gd2l0aCBMREFQCiAgICAgbGlicmFyeSByb3V0aW5lcy4gIFtLZW4gQ29hciwgUmFzbXVzIExlcmRvcmZdCgogICopIFdJTjMyOiBtb2Rfc3BlbGluZyBpcyBub3cgYXZhaWxhYmxlIG9uIHRoZSBXaW4zMiBwbGF0Zm9ybS4KICAgICBbTWFyYyBTbGVta29dCgogICopIEZvciBjbGFyaXR5IHRoZSBmb2xsb3dpbmcgY29tcGlsZSB0aW1lIGRlZmluaXRpb24gd2FzIGNoYW5nZWQ6CgogICAgICAgIFNBRkVfVU5TRVJJQUxJWkVEX0FDQ0VQVCAgLT4gICBTSU5HTEVfTElTVEVOX1VOU0VSSUFMSVpFRF9BQ0NFUFQKCiAgICAgQWxzbywgZm9yIGV4YW1wbGUsIEhBVkVfTU1BUCB3b3VsZCBtZWFuIHRvIHVzZSBtbWFwKCkgc2NvcmVib2FyZHMKICAgICBhbmQgbm90IGJlIGEgZ2VuZXJhbCBub3RpY2UgdGhhdCB0aGUgT1MgaGFzIG1tYXAoKS4gTm93IHRoZQogICAgIEhBVkVfTU1BUC9TSE1HRVQgI2RlZmluZXMgc3RyaWN0bHkgYXJlIGluZm9ybWF0aW9uYWwgdGhhdCB0aGUKICAgICBPUyBoYXMgdGhhdCBtZXRob2Qgb2Ygc2hhcmVkIG1lbW9yeTsgdGhlIHR5cGUgdG8gdXNlIGZvcgogICAgIHRoZSBzY29yZWJvYXJkIGlzIGEgc2VwZXJhdGUgI2RlZmluZSAoVVNFX01NQVBfU0NPUkVCT0FSRAogICAgIGFuZCBVU0VfU0hNR0VUX1NDT1JFQk9BUkQpLiBUaGlzIGFsbG93cyBvdXRzaWRlIG1vZHVsZXMgdG8KICAgICBkZXRlcm1pbmUgaWYgc2hhcmVkIG1lbW9yeSBpcyBhdmFpbGFibGUgYW5kIGFsbG93cyBBcGFjaGUKICAgICB0byBkZXRlcm1pbmUgdGhlIGJlc3QgbWV0aG9kIHRvIHVzZSBmb3IgdGhlIHNjb3JlYm9hcmQuCiAgICAgW0ppbSBKYWdpZWxza2ldCgogICopIFBPUlQ6IFVuaXhXYXJlIDIuMS4yIFNNUCBhcHBlYXJzIHRvIHJlcXVpcmUgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBULAogICAgIGFzIGRvIHZhcmlvdXMgZWFybGllciB2ZXJzaW9ucy4gIEl0IHNob3VsZCBiZSBzYWZlIG9uIGFsbCB2ZXJzaW9ucy4KICAgICBVbml4d2FyZSAxLnggYXBwZWFycyB0byBoYXZlIHRoZSBzYW1lIFNJR0hVUCBidWcgYXMgc29sYXJpcyBkb2VzIHdpdGgKICAgICB0aGUgc2xhY2sgY29kZS4gIEEgZmV3IG90aGVyIGNsZWFudXBzIGZvciBVbml4d2FyZS4KICAgICBbVG9tIEh1Z2hlcyA8dGhoIGN5YmVyc2NpZW5jZS5jb20+XSBQUiMxMDgyLCBQUiMxMjgyLCBQUiMxNDk5LCBQUiMxNTUzCgogICopIFBPUlQ6IEEvVVggY2FuIGhhbmRsZSBzaW5nbGUtbGlzdGVuIGFjY2VwdHMgd2l0aG91dCBtdXRleAogICAgIGxvY2tpbmcsIHNvIHdlIGFkZCBTSU5HTEVfTElTVEVOX1VOU0VSSUFMSVpFRF9BQ0NFUFQuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBXaGVuIGRpZSgpIGhhcHBlbnMgd2UgbmVlZCB0byBlYXQgYW55IHJlcXVlc3QgYm9keSBpZiBvbmUgZXhpc3RzLgogICAgIE90aGVyd2lzZSB3ZSBjYW4ndCBjb250aW51ZSB3aXRoIGEga2VlcGFsaXZlIHNlc3Npb24uICBUaGlzIHNob3dzIHVwCiAgICAgYXMgYSBQT1NUIHByb2JsZW0gd2l0aCBNU0lFIDQuMCwgdHlwaWNhbGx5IGFnYWluc3QgcGFnZXMgd2hpY2ggYXJlCiAgICAgYXV0aGVudGljYXRlZC4gIFtSb3kgRmllbGRpbmddIFBSIzEzOTkKCiAgKikgSWYgeW91IGRlZmluZSBTRUNVUklUWV9IT0xFX1BBU1NfQVVUSE9SSVpBVElPTiB0aGVuIHRoZSBBdXRob3JpemF0aW9uCiAgICAgaGVhZGVyIHdpbGwgYmUgcGFzc2VkIHRvIENHSXMuICBUaGlzIGlzIGdlbmVyYWxseSBhIHNlY3VyaXR5IGhvbGUsIHNvCiAgICAgaXQncyBub3QgYSBkZWZhdWx0LiAgW01hcmMgU2xlbWtvXSBQUiM1NDkKCiAgKikgRml4IFkySyBwcm9ibGVtIHdpdGggZGF0ZSBwcmludGluZyBpbiBzdWV4ZWMgbG9nLgogICAgIFtQYXVsIEVnZ2VydCA8ZWdnZXJ0IHR3aW5zdW4uY29tPl0gUFIjMTM0MwoKICAqKSBXSU4zMiBkZXNlcnZlcyBhIHBpZCBmaWxlLiAgW0JlbiBIeWRlXQoKICAqKSBzdWV4ZWMgZXJyb3JzIG5vdyBpbmNsdWRlIHRoZSBlcnJuby9kZXNjcmlwdGlvbi4gIFtNYXJjIFNsZW1rb10gUFIjMTU0MwoKICAqKSBQT1JUOiBPU0YvMSBub3cgdXNlcyBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQgdG8gc29sdmUgUFIjNDY3LgogICAgIFRoZSBjaG9pY2Ugb2YgZmxvY2sgdnMuIGZjbnRsIHdhcyBtYWRlIGJhc2VkIG9uIHRpbWluZ3Mgd2hpY2ggc2hvd2VkIHRoYXQKICAgICBldmVuIG9uIG5vbi1ORlMsIG5vbi1leHBvcnRlZCBmaWxlc3lzdGVtcyBmY250bCgpIHdhcyBhbiBvcmRlciBvZgogICAgIG1hZ25pdHVkZSBzbG93ZXIuICBJdCBhbHNvIHVzZXMgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUIHNvCiAgICAgdGhhdCBzaW5nbGUgc29ja2V0IHVzZXJzIHdpbGwgc2VlIG5vIGRpZmZlcmVuY2UuIFtEZWFuIEdhdWRldF0gUFIjNDY3CgogICopICJGaWxlIGRvZXMgbm90IGV4aXN0IiBlcnJvciBtZXNzYWdlIHdhcyBlcnJvbmVvdXNseSBpbmNsdWRpbmcgdGhlCiAgICAgZXJybm8uICBbTWFyYyBTbGVta29dCgogICopIEltcHJvdmUgdGhlIHdhcm5pbmcgbWVzc2FnZSBnZW5lcmF0ZWQgd2hlbiBhIGNsaWVudCBkcm9wcyB0aGUKICAgICBjb25uZWN0aW9uIChoaXRzIHN0b3AgYnV0dG9uLCBldGMuKSBkdXJpbmcgYSBzZW5kLiAgW1JveSBGaWVsZGluZ10KCiAgKikgRGVmaW5pbmcgR1BST0Ygd2lsbCBkaXNhYmxlIHByb2ZpbGluZyBpbiB0aGUgcGFyZW50IGFuZCBlbmFibGUgaXQKICAgICBpbiB0aGUgY2hpbGRyZW4uICBJZiB5b3UncmUgcHJvZmlsaW5nIHVuZGVyIExpbnV4IHRoaXMgaXMgcHJldHR5IG11Y2gKICAgICBuZWNlc3NhcnkgYmVjYXVzZSBTSUdQUk9GIGlzIGxvc3QgYWNyb3NzIGEgZm9yaygpLiBbRGVhbiBHYXVkZXRdCgogICopIGh0ZGlnZXN0IGFuZCBodHBhc3N3ZCBuZWVkZWQgc2xpZ2h0IHR3ZWFrcyB0byB3b3JrIG9uIE9TLzIgYW5kIFdJTjMyLgogICAgIFtCcmlhbiBIYXZhcmRdCgogICopIFRoZSBOZVhUIGNjICh3aGljaCBpcyBnY2MgaGFja2VkIHVwKSBkb2Vzbid0IGFwcGVhciB0byBzdXBwb3J0IHNvbWUKICAgICBnY2MgZnVuY3Rpb25hbGl0eS4gIFdvcmsgYXJvdW5kIGl0LgogICAgIFtLZWl0aCBTZXZlcnNvbiA8a2VpdGggc3NzZC5uYXZ5Lm1pbD5dIFBSIzE2MTMKCiAgKikgU29tZSBsaW5rZXJzIGNvbXBsYWluIHdoZW4gLm8gZmlsZXMgY29udGFpbiBubyBmdW5jdGlvbnMuCiAgICAgW0tlaXRoIFNldmVyc29uIDxrZWl0aCBzc3NkLm5hdnkubWlsPl0gUFIjMTYxNAoKICAqKSBTb21lIGNvbnN0IGRlY2xhcmF0aW9ucyBpbiBtb2RfaW1hcC5jIHRoYXQgd2VyZSBhZGRlZCBmb3IgZGVidWdnaW5nCiAgICAgcHVycG9zZXMgY2F1c2VkIHNvbWUgY29tcGlsZXJzIGhlYXJ0YnVybiB3aXRob3V0IGFkZGluZyBhbnkKICAgICBzaWduaWZpY2FudCB2YWx1ZSwgc28gdGhleSd2ZSBiZWVuIHJlbW92ZWQuICBbS2VuIENvYXJdCgogICopIFRoZSBzcmMvbWFpbi8qLmggaGVhZGVyIGZpbGVzIGhhdmUgaGFkICNpZm5kZWYgd3JhcHBlcnMgYWRkZWQgdG8KICAgICBpbnN1bGF0ZSB0aGVtIGFnYWluc3QgZHVwbGljYXRlIGNhbGxzIGlmIHRoZXkgZ2V0IGluY2x1ZGVkIHRocm91Z2gKICAgICBtdWx0aXBsZSBwYXRocyAoZS5nLiwgaW4gLmMgZmlsZXMgYXMgd2VsbCBhcyBvdGhlciAuaCBmaWxlcykuCiAgICAgW0tlbiBDb2FyXQoKICAqKSBUaGUgbGliYXAgcm91dGluZXMgbm93IGhhdmUgYSBoZWFkZXIgZmlsZSBmb3IgdGhlaXIgcHJvdG90eXBlcywKICAgICBzcmMvYXAvYXAuaCwgdG8gZWFzZSB0aGVpciB1c2UgaW4gbm9uLWh0dHBkIGFwcGxpY2F0aW9ucy4gIFtLZW4gQ29hcl0KCiAgKikgbW9kX2F1dG9pbmRleCB3aXRoIGEgcGxhaW50ZXh0IGhlYWRlciBmaWxlIHdvdWxkIGVtaXQgdGhlIDxQUkU+CiAgICAgc3RhcnQtdGFnIGJlZm9yZSB0aGUgSFRNTCBwcmVhbWJsZSwgcmF0aGVyIHRoYW4gYWZ0ZXIgdGhlIHByZWFtYmxlCiAgICAgYnV0IGJlZm9yZSB0aGUgaGVhZGVyIGZpbGUgY29udGVudHMuICBbSm9obiBWYW4gRXNzZW4gPGp2ZSBnYW1lcnMub3JnPl0KICAgICBQUiMxNjY3CgogICopIFNFQ1VSSVRZOiBGaXggYSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgaW4gbG9ncmVzb2x2ZS4gIFRoaXMgaXMKICAgICBvbmx5IGFuIGlzc3VlIG9uIHN5c3RlbXMgd2l0aG91dCBhIE1BWEROQU1FIGRlZmluZSBvciB3aGVyZQogICAgIHRoZSByZXNvbHZlciByZXR1cm5zIGRvbWFpbiBuYW1lcyBsb25nZXIgdGhhbiBNQVhETkFNRS4gIFtNYXJjIFNsZW1rb10KCiAgKikgU0VDVVJJVFk6IEVsaW1pbmF0ZSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgaW4gY2ZnX2dldGxpbmUsIHdoaWNoCiAgICAgaXMgdXNlZCB0byByZWFkIHZhcmlvdXMgdHlwZXMgb2YgZmlsZXMgc3VjaCBhcyBodGFjY2VzcyBhbmQKICAgICBodHBhc3N3ZCBmaWxlcy4gIFtNYXJjIFNsZW1rb10KCiAgKikgU0VDVVJJVFk6IEVuc3VyZSB0aGF0IHRoZSBidWZmZXIgcmV0dXJuZWQgYnkgaHRfdGltZSBpcyBhbHdheXMKICAgICBwcm9wZXJseSBudWxsIHRlcm1pbmF0ZWQuICBbTWFyYyBTbGVta29dCgogICopIFRoZSAiQ29ubmVjdGlvbiIgaGVhZGVyIGNvdWxkIGJlIHNlbnQgYmFjayB3aXRoIG11bHRpcGxlICJjbG9zZSIKICAgICB0b2tlbnMuICBOb3QgYW4gZXJyb3IsIGJ1dCBhIHdhc3RlLgogICAgIFs8Um9uYWxkLlRzY2hhbGFlciBwc2kuY2g+XSBQUiMxNjgzCgogICopIG1vZF9yZXdyaXRlJ3MgUmV3cml0ZUxvZyBzaG91bGQgYmVoYXZlIGxpa2UgbW9kX2xvZ19jb25maWcsIGl0CiAgICAgc2hvdWxkbid0IGZvcmNlIGhvc3RuYW1lIGxvb2t1cHMuICBbRGVhbiBHYXVkZXRdIFBSIzE2ODQKCiAgKikgImJhc2ljIiBhdXRoIG5lZWRzIGEgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uLgogICAgIFs8Um9uYWxkLlRzY2hhbGFlciBwc2kuY2g+XSBQUiMxNjY2CgogICopIEZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCB0aGUgZW52aXJvbm1lbnQgcGFzc2VkIHRvIENHSXMgc2hvdWxkCiAgICAgb25seSBjb250YWluIHZhcmlhYmxlcyB3aG9zZSBuYW1lcyBtYXRjaCB0aGUgcmVnZXgKICAgICAvW2EtekEtWl1bYS16QS1aMC05X10qLy4gIFRoaXMgaXMgbm93IGVuZm9yY2VkIGJ5IHN0YW1waW5nCiAgICAgdW5kZXJzY29yZXMgb3ZlciBhbnkgY2hhcmFjdGVyIG91dHNpZGUgdGhlIHJlZ2V4LiAgVGhpcwogICAgIGFmZmVjdHMgSFRUUF8qIHZhcmlhYmxlcywgaW4gYSB3YXkgdGhhdCBzaG91bGQgYmUgYmFja3dhcmQKICAgICBjb21wYXRpYmxlIGZvciBhbGwgdGhlIHN0YW5kYXJkIGhlYWRlcnM7IGFuZCBhZmZlY3RzIHZhcmlhYmxlcwogICAgIHNldCB3aXRoIFNldEVudi9Ccm93c2VyTWF0Y2ggYW5kIHNpbWlsYXIgZGlyZWN0aXZlcy4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIG1vZF9zcGVsaW5nIHJldHVybmVkIGluY29ycmVjdCBIUkVGJ3Mgd2hlbiBhbiBhbWJpZ291cyBtYXRjaAogICAgIHdhcyBmb3VuZC4gTm90aWNlZCBieSA8cm9iaW50b24gYW10cmFzaC5jb21saW5rLmRlPiAoU29lcmVuIFppZWhlKQogICAgIFtTb2VyZW4gWmllaGUgPHJvYmludG9uIGFtdHJhc2guY29tbGluay5kZT4sIE1hcnRpbiBLcmFlbWVyXQoKICAqKSBQT1JUOiBBcGFjaGUgbm93IGNvbXBpbGVzICYgcnVucyBvbiBhbiBFQkNESUMgbWFpbmZyYW1lCiAgICAgKHRoZSBTaWVtZW5zIEJTMjAwMC9PU0QgZmFtaWx5KSBpbiB0aGUgUE9TSVggc3Vic3lzdGVtCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBQT1JUOiBGaXggcHJvYmxlbSBraWxsaW5nIGNoaWxkcmVuIHdoZW4gdGVybWluYXRpbmcuICBBbGxvdyBeQwogICAgIHRvIHNodXQgZG93biB0aGUgc2VydmVyLiAgW0JyaWFuIEhhdmFyZF0KCiAgKikgcHN0cmR1cCgpIGlzIGltcGxpY2l0IGluIGNhbGxzIHRvIHRhYmxlXyogZnVuY3Rpb25zLCBzbyB0aGVyZSdzCiAgICAgbm8gbmVlZCB0byBkbyBpdCBiZWZvcmUgY2FsbGluZy4gIENsZWFuIHVwIGEgZmV3IGNhc2VzLgogICAgIFtNYXJjIFNsZW1rbywgRGVhbiBHYXVkZXRdCgogICopIG5ldyAtQyBhbmQgLWMgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwogICAgIHVzYWdlOgogICAgIC1DICJkaXJlY3RpdmUiIDogcHJvY2VzcyBkaXJlY3RpdmUgYmVmb3JlIHJlYWRpbmcgY29uZmlnIGZpbGVzCiAgICAgLWMgImRpcmVjdGl2ZSIgOiBwcm9jZXNzIGRpcmVjdGl2ZSBhZnRlciByZWFkaW5nIGNvbmZpZyBmaWxlcwogICAgIGV4YW1wbGU6CiAgICAgaHR0cGQgLUMgIlBlcmxNb2R1bGUgQXBhY2hlOjpodHRwZF9jb25mIgogICAgIFtEb3VnIE1hY0VhY2hlcm4sIE1hcnRpbiBLcmFlbWVyXQoKICAqKSBXSU4zMjogRml4IHRoZSBleGVjdXRpb24gb2YgQ0dJcyB0aGF0IGFyZSBzY3JpcHRzIGFuZCBjYWxsZWQgCiAgICAgd2l0aCBwYXRoIGluZm8gdGhhdCBkb2VzIG5vdCBoYXZlIGFuICc9JyBpbi4KICAgICAoZWcuIGh0dHA6Ly9zZXJ2ZXIvY2dpLWJpbi9wcmludGVudj9mb29iYXIpICAKICAgICBbTWFyYyBTbGVta29dIFBSIzE1OTEKCiAgKikgV0lOMzI6IEZpeCBhIGNhbGwgdG8gb3NfY2Fub25pY2FsX2ZpbGVuYW1lIHNvIGl0IGRvZXNuJ3QgdHJ5IHRvIAogICAgIG1lc3Mgd2l0aCBmYWtlIGZpbGVuYW1lcy4gIFRoaXMgZml4ZXMgcHJveHkgY2FjaGluZyBvbiAKICAgICB3aW4zMi4gUFIjMTI2NQoKICAqKSBTRUNVUklUWTogR2VuZXJhbCBtb2RfaW5jbHVkZSBjbGVhbnVwLCBpbmNsdWRpbmcgZml4aW5nIHNldmVyYWwKICAgICBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3dzIGFuZCBhIHBvc3NpYmxlIGluZmluaXRlIGxvb3AuCiAgICAgW0RlYW4gR2F1ZGV0LCBNYXJjIFNsZW1rb10KCiAgKikgU0VDVVJJVFk6IE51bWVyb3VzIGNoYW5nZXMgdG8gbW9kX2ltYXAgaW4gYSBnZW5lcmFsIGNsZWFudXAKICAgICBpbmNsdWRpbmcgZml4aW5nIGEgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93LiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBXSU4zMjogb3ZlcmhhdWwgb2YgbXVsdGl0aHJlYWRpbmcgY29kZS4gU2h1dGRvd25zIGFyZSBub3cgZ3JhY2VmdWwKICAgICAoY29ubmVjdGlvbnMgYXJlIG5vdCBkcm9wcGVkKS4gQ29kZSBjYW4gaGFuZGxlIGdyYWNlZnVsIHJlc3RhcnRzCiAgICAgKGJ1dCB0aGVyZSBpcyBhcyB5ZXQgbm8gd2F5IHRvIHNpZ25hbCB0aGlzIHRvIEFwYWNoZSkuIFZhcmlvdXMKICAgICBvdGhlciBjbGVhbnVwcy4gW1BhdWwgU3V0dG9uXQoKICAqKSBUaGUgYXBsb2dfZXJyb3IgY2hhbmdlcyBzcGVjaWZpYyB0byAxLjMgaW50cm9kdWNlZCBhIGJ1ZmZlcgogICAgIG92ZXJydW4gaW4gdGhlIChub3cgbGVnYWN5KSBsb2dfcHJpbnRmIGZ1bmN0aW9uLiAgRml4ZWQuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBtb2RfZGlnZXN0IGRpZG4ndCBwcm9wZXJseSBkZWFsIHdpdGggcHJveHkgYXV0aGVudGljYXRpb24uICBJdAogICAgIGFsc28gbGFja2VkIGEgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc2lvbiBvZiB0aGUgIkRpZ2VzdCIKICAgICB0b2tlbi4gIFtSb25hbGQgVHNjaGFsYWVyIDxSb25hbGQuVHNjaGFsYWVyIHBzaS5jaD5dIFBSIzE1OTkKCiAgKikgQSBmZXcgY2xlYW51cHMgaW4gbW9kX3N0YXR1cyBmb3IgZWZmaWNpZW5jeS4gIFtEZWFuIEdhdWRldF0KCiAgKikgQSBmZXcgY2xlYW51cHMgaW4gbW9kX2luZm8gdG8gbWFrZSBpdCB0aHJlYWQtc2FmZSwgYW5kIHJlbW92ZSBhbgogICAgIG9mZi1ieS01IGJ1ZyB0aGF0IGNvdWxkIGhhbW1lciBcMCBvbiB0aGUgc3RhY2suIFtEZWFuIEdhdWRldF0KCiAgKikgbm8yc2xhc2goKSB3YXMgTyhuXjIpIGluIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0LiAgTWFrZSBpdCBPKG4pLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgQVBJOiBtaWdyYXRpb24gZnJvbSBzdHJuY3B5KCkgdG8gb3VyICJlbmhhbmNlZCIgdmVyc2lvbiBjYWxsZWQKICAgICBhcF9jcHlzdHJuKCkgZm9yIHBlcmZvcm1hbmNlIGFuZCBmdW5jdGlvbmFsaXR5IHJlYXNvbnMuCiAgICAgTG9jYXRlZCBpbiBsaWJhcC5hLiAgW0ppbSBKYWdpZWxza2ldCgogICopIHRhYmxlX3NldCgpIGFuZCB0YWJsZV91bnNldCgpIGRpZCBub3QgZGVhbCBjb3JyZWN0bHkgd2l0aAogICAgIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIGtleS4KICAgICBbU3RlcGhlbiBTY2hlY2sgPHNzY2hlY2sgaW5mb25leC5uZXQ+LCBCZW4gTGF1cmllXSBQUiMxNjA0CgogICopIFRoZSBBdXRoTmFtZSBtdXN0IG5vdyBiZSBlbmNsb3NlZCBpbiBxdW90ZXMgaWYgaXQgaXMgdG8gY29udGFpbgogICAgIHNwYWNlcy4gIFtLZW4gQ29hcl0gUFIjMTE5NQoKICAqKSBBUEk6IG5ldyBmdW5jdGlvbjogYXBfZXNjYXBlX3F1b3RlcygpLiBbS2VuIENvYXJdIFBSIzExOTUKCiAgKikgV0lOMzI6IFdvcmsgYXJvdW5kIG9wdGltaXNlciBidWcgdGhhdCBraWxsZWQgSVNBUEkgaW4gcmVsZWFzZQogICAgIHZlcnNpb25zLiBbQmVuIExhdXJpZV0gUFIjMTUzMwoKICAqKSBQT1JUOiBVcGRhdGUgdGhlIE1QRSBwb3J0IFtNYXJrIEJpeGJ5LCBKaW0gSmFnaWVsc2tpXQoKICAqKSBJbnRlcmltIChzbG93KSBmaXggZm9yIHAtPnN1Yl9wb29sIGNyaXRpY2FsIHNlY3Rpb25zIGluCiAgICAgYWxsb2MuYyAoYWZmZWN0cyB3aW4zMiBvbmx5KS4gIFtCZW4gSHlkZV0KCiAgKikgbm9uLVdJTjMyIHdhcyBtaXNzaW5nIGRlc3Ryb3lfbXV0ZXggZGVmaW5pdGlvbi4gIFtCZW4gSHlkZV0KCiAgKikgc2VuZF9mZF9sZW5ndGgoKSBkaWQgbm90IGNhbGN1bGF0ZSB0b3RhbF9ieXRlc19zZW50IHByb3Blcmx5LgogICAgIFtCZW4gUmVzZXIgPGJyZXNlciByZWdub3cuY29tPl0gUFIjMTM2NgoKICAqKSBUaGUgYnB1dGMoKSBtYWNybyB3YXMgbm90IHByb3Blcmx5IGludGVncmF0ZWQgd2l0aCB0aGUgY2h1bmtpbmcKICAgICBjb2RlOyBpbiBtYW55IGNhc2VzIG1vZHVsZXMgdXNpbmcgYnB1dGMoKSBjb3VsZCBjYXVzZSBjb21wbGV0ZWx5CiAgICAgYm9ndXMgY2h1bmtlZCBvdXRwdXQuICAoVHlwaWNhbGx5IHRoaXMgd2lsbCBzaG93IHVwIGFzIHByb2JsZW1zCiAgICAgd2l0aCBJbnRlcm5ldCBFeHBsb3JlciA0LjAgcmVhZGluZyBhIHBhZ2UsIGJ1dCBvdGhlciBicm93c2VycwogICAgIGhhdmluZyBubyBwcm9ibGVtLikgW0RlYW4gR2F1ZGV0XQoKICAqKSBDcmVhdGUgTEFSR0VfV1JJVEVfVEhSRVNIT0xEIGRlZmluZSB3aGljaCBkZXRlcm1pbmVzIGhvdyBtYW55CiAgICAgYnl0ZXMgaGF2ZSB0byBiZSBzdXBwbGllZCB0byBid3JpdGUoKSBiZWZvcmUgaXQgd2lsbCBjb25zaWRlcgogICAgIGRvaW5nIGEgd3JpdGV2KCkgdG8gYXNzZW1ibGUgbXVsdGlwbGUgYnVmZmVycyBpbiBvbmUgc3lzdGVtCiAgICAgY2FsbC4gIFRoaXMgaXMgY3JpdGljYWwgZm9yIG1vZHVsZXMgc3VjaCBhcyBtb2RfaW5jbHVkZSwKICAgICBtb2RfYXV0b2luZGV4LCBtb2RfcGhwMyB3aGljaCBhbGwgdXNlIGJwdXRjKCkvYnB1dHMoKSBvZiBzbWFsbGVyCiAgICAgc3RyaW5ncyBpbiBzb21lIGNhc2VzLiAgVGhlIHJlc3VsdCB3b3VsZCBiZSBleHRyYSBlZmZvcnQKICAgICBzZXR0aW5nIHVwIHdyaXRldigpLCBhbmQgaW4gbWFueSBjYXNlcyBleHRyYSBlZmZvcnQgYnVpbGRpbmcKICAgICBjaHVua3MuICBUaGUgZGVmYXVsdCBpcyAzMSwgaXQgY2FuIGJlIG92ZXJyaWRlbiBhdCBjb21waWxlCiAgICAgdGltZS4gW0RlYW4gR2F1ZGV0XQoKICAqKSBNb3ZlIHRoZSBnaWQgc3dpdGNoaW5nIGNvZGUgaW50byB0aGUgY2hpbGQgc28gdGhhdCBsb2cgZmlsZXMKICAgICBhbmQgcGlkIGZpbGVzIGFyZSBvcGVuZWQgd2l0aCB0aGUgcm9vdCBnaWQuCiAgICAgW0dyZWdvcnkgQSBMdW5kYmVyZyA8bHVuZGJlcmcgdnIubmV0Pl0KCiAgKikgV0lOMzI6IENoZWNrIGZvciBiaW5hcmllcyBieSBsb29raW5nIGZvciB0aGUgZXhlY3V0YWJsZSBoZWFkZXIKICAgICBpbnN0ZWFkIG9mIGNvdW50aW5nIGNvbnRyb2wgY2hhcmFjdGVycy4KICAgICBbSmltIFBhdHRlcnNvbiA8SmltLlBhdHRlcnNvbiBDb2dub3MuQ09NPl0gUFIjMTM0MAoKICAqKSBhcF9zbnByaW50ZigpIG1vdmVkIGZyb20gbWFpbi91dGlsX3NucHJpbnRmLmMgdG8gYXAvYXBfc25wcmludGYuYwogICAgIHNvIHRoZSBmdW5jdGlvbmFsaXR5IGlzIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMgb3RoZXIgdGhhbiB0aGUKICAgICBzZXJ2ZXIgaXRzZWxmIChsaWtlIHRoZSBzcmMvc3VwcG9ydCB0b29scykuICBbS2VuIENvYXJdCgogICopIGFwX3NsYWNrKCkgbW92ZWQgb3V0IG9mIG1haW4vdXRpbC5jIGludG8gYXAvYXBfc2xhY2suYyBhcyBwYXJ0IG9mCiAgICAgdGhlIGxpYmFwIGNvbnNvbGlkYXRpb24gd29yay4gIFtLZW4gQ29hcl0KCiAgKikgYXBfc25wcmludGYoKSB3aXRoIGEgbGVuIG9mIDAgYmVoYXZlZCBsaWtlIHNwcmludGYoKS4gIFRoaXMgaXMgbm90CiAgICAgdXNlZnVsLCBhbmQgaXNuJ3Qgd2hhdCB0aGUgc3RhbmRhcmRzIHJlcXVpcmUuICBOb3cgaXQgcmV0dXJucyAwCiAgICAgYW5kIHdyaXRlcyBub3RoaW5nLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBXaGVuIGFuIGVycm9yIG9jY3VycyBpbiBmY250bCgpIGxvY2tpbmcgc3VnZ2VzdCB0aGUgdXNlciBsb29rIHVwCiAgICAgdGhlIGRvY3MgZm9yIExvY2tGaWxlLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBFbGltaW5hdGUgc29tZSBkZWFkIGNvZGUgZnJvbSB3cml0ZXZfaXRfYWxsKCkuCiAgICAgW0lnb3IgVGF0YXJpbm92IDx0YXRhcmlubyBwcmFpcmllLk5vRGFrLmVkdT5dCgogICopIG1vZF9hdXRvaW5kZXggaGFkIGFuIGZyZWFkKCkgd2l0aG91dCBjaGVja2luZyB0aGUgcmVzdWx0IGNvZGUuCiAgICAgSXQgYWxzbyB3b3VsZG4ndCBoYW5kbGUgIkFkZEljb25CeVR5cGUgKFRYVCwvaWNvbnMvdGV4dC5naWYgdGV4dC8qIgogICAgIChub3RlIHRoZSBtaXNzaW5nIGNsb3NpbmcgcGFyZW4pIHByb3Blcmx5LiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBJdCBhcHBlYXJzIHRoZSAiMjU3dGggYnl0ZSIgYnVnIChzZWUKICAgICBodGRvY3MvbWFudWFsL21pc2Mva25vd25fY2xpZW50X3Byb2JsZW1zLmh0bWwjMjU3dGgtYnl0ZSkgY2FuIGhhcHBlbgogICAgIGF0IHRoZSAyNTZ0aCBieXRlIGFzIHdlbGwuICBGaXhlZC4gIFtEZWFuIEdhdWRldF0KCiAgKikgUE9SVDogRml4IG1vZF9taW1lX21hZ2ljIHVuZGVyIE9TLzIsIG5vIHN1cHBvcnQgZm9yIGJsb2NrIGRldmljZXMuCiAgICAgW0JyaWFuIEhhdmFyZF0KCiAgKikgRml4IG1lbW9yeSBjb3JydXB0aW9uIGNhdXNlZCBieSBhbGxvY2F0aW5nIGF1dGggdXNlcm5hbWVzIGluIHRoZQogICAgIHdyb25nIHBvb2wuICBbRGVhbiBHYXVkZXRdIFBSIzE1MDAKCiAgKikgRml4IGFuIG9mZi1ieS0xLCBhbmQgYW4gdW50ZXJtaW5hdGVkIHN0cmluZyBlcnJvciBpbgogICAgIG1vZF9taW1lX21hZ2ljLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXggYSBwb3RlbnRpYWwgU0VHViBwcm9ibGVtIGluIG1vZF9uZWdvdGlhdGlvbiB3aGVuIGRlYWxpbmcKICAgICB3aXRoIHR5cGUtbWFwcy4gIFtEZWFuIEdhdWRldF0KCiAgKikgQmV0dGVyIGdsaWJjIHN1cHBvcnQgdW5kZXIgTGludXguICBbRGVhbiBHYXVkZXRdIFBSIzE1NDIKCiAgKikgIlJlZGlyZWN0TWF0Y2ggZ29uZSAvIiB3b3VsZCBjYXVzZSBhIFNJR1NFR1YuIFtEZWFuIEdhdWRldF0gUFIjMTMxOQoKICAqKSBXSU4zMjogYXZvaWQgb3ZlcmZsb3dzIGR1cmluZyBmaWxlIGNhbm9uaWNhbGlzYXRpb25zLgogICAgIFs8bWFsY29sbSBtZ2Rldi5kZW1vbi5jby51az5dIFBSIzEzNzgKCiAgKikgV0lOMzI6IHNldF9maWxlX3Nsb3QoKSBkaWRuJ3QgZGV0ZWN0IGFic29sdXRlIHBhdGhzLiBbQmVuIExhdXJpZV0KICAgICBQUiMxNTExLCAxNTA4CgogICopIFdJTjMyOiBtb2Rfc3RhdHVzIGRpc3BsYXkgaGVhZGVyIGRpZG4ndCBtYXRjaCBmaWVsZHMuIFtCZW4gTGF1cmllXQoKICAqKSBUaGUgcHRocmVhZF9tdXRleF8qIGZ1bmN0aW9ucyByZXR1cm4gYW4gZXJyb3IgY29kZSwgYW5kIGRvbid0CiAgICAgc2V0IGVycm5vLiAgW0lnb3IgVGF0YXJpbm92IDx0YXRhcmlubyBwcmFpcmllLk5vRGFrLmVkdT5dCgogICopIFdJTjMyOiBBbGxvdyBzcGFjZXMgdG8gcHJlZml4IHRoZSBpbnRlcnByZXRlciBpbiAjISBsaW5lcy4KICAgICBbQmVuIExhdXJpZV0gUFIjMTEwMQoKICAqKSBXSU4zMjogQ3VyZSBmaWxlIGxlYWsgaW4gQ0dJcy4gW1BldGVyIFRpbGxlbWFucyA8cHRpIG5ldDRhbGwuYmU+XSBQUiMxNTIzCgogICopIHByb3h5X2Z0cDogdGhlIGRpcmVjdG9yeSBsaXN0aW5ncyBnZW5lcmF0ZWQgYnkgdGhlIHByb3h5IGZ0cCBtb2R1bGUKICAgICBub3cgaGF2ZSBhIHRpdGxlIGluIHdoaWNoIHRoZSBwYXRoIGNvbXBvbmVudHMgYXJlIGNsaWNrYWJsZSBhbmQgYWxsb3cKICAgICBxdWljayBuYXZpZ2F0aW9uIHRvIHRoZSBjbGlja2VkLW9uIGRpcmVjdG9yeSBvbiB0aGUgY3VycmVudGx5IGxpc3RlZAogICAgIGZ0cCBzZXJ2ZXIuIFRoaXMgYWxzbyBmaXhlcyBhIGJ1ZyB3aGVyZSB0aGUgIi4uIiBkaXJlY3RvcnkgbGlua3Mgd291bGQKICAgICBzb21ldGltZXMgcmVmZXIgdG8gdGhlIHdyb25nIGRpcmVjdG9yeS4gIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgV0lOMzI6IEFsbG9jYXRlIHRoZSBjb3JyZWN0IGFtb3VudCBvZiBtZW1vcnkgZm9yIHRoZSBzY29yZWJvYXJkLgogICAgIFtCZW4gSHlkZV0gUFIjMTM4NwoKICAqKSBXSU4zMjogT25seSBsb3dlcmNhc2UgdGhlIHBhcnQgb2YgdGhlIHBhdGggdGhhdCBpcyByZWFsLiBbQmVuIExhdXJpZV0KICAgICBQUiMxNTA1CgogICopIEZpeCBwcm9ibGVtcyB3aXRoIHRpbWVvdXRzIGluIGluZXRkIG1vZGUgYW5kIC1YIG1vZGUuICBbRGVhbiBHYXVkZXRdCgogICopIEZpeCB0aGUgc3B1cmlvdXMgIigwKXVua25vd24gZXJyb3I6IG1tYXBfaGFuZGxlcjogbW1hcCBmYWlsZWQiCiAgICAgZXJyb3IgbWVzc2FnZXMuIFtCZW4gSHlkZV0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zYjMKCiAgKikgV0lOMzI6IFdvcmsgYXJvdW5kIGJyYWluLWRhbWFnZWQgc3Bhd24gY2FsbHMgdGhhdCBjYW4ndCBkZWFsCiAgICAgd2l0aCBzcGFjZXMgYW5kIHNsYXNoZXMuICBbQmVuIExhdXJpZV0KCiAgKikgV0lOMzI6IEZpeCB0aGUgY29kZSBzbyBDR0lzIGNhbiB1c2Ugc29ja2V0IGNhbGxzIG9uIFdpbmRvd3MuICAKICAgICBUaGUgcHJvYmxlbSB3YXMgdGhhdCBjZXJ0YWluIHVuZG9jdW1lbnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKICAgICBuZWVkZWQgZm9yIHNvY2tldHMgdG8gd29yayB1bmRlciBXaW4zMiB3ZXJlIG5vdCBiZWluZyBwYXNzZWQuCiAgICAgW0ZyYW5rIEZhdWJlcnQgPGZyYW5rIHNhbmUuY29tPl0KCiAgKikgQWRkIGEgIi1WIiBjb21tYW5kIGxpbmUgZmxhZyB0byB0aGUgaHR0cGQgYmluYXJ5LiAgVGhpcyAKICAgICBmbGFnIHNob3dzIHNvbWUgb2YgdGhlIGRlZmluZXMgdGhhdCBBcGFjaGUgd2FzIGNvbXBpbGVkIHdpdGguCiAgICAgSXQgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuICBbTWFydGluIEtyYWVtZXJdCgogICopIFN0YXJ0IHNlcGFyYXRpbmcgdGhlIGFwXyooKSByb3V0aW5lcyBpbnRvIHRoZWlyIG93biBsaWJyYXJ5LCBzbyB0aGV5CiAgICAgY2FuIGJlIHVzZWQgYnkgaXRlbXMgaW4gc3JjL3N1cHBvcnQgYW1vbmcgb3RoZXIgdGhpbmdzLiAgCiAgICAgW0tlbiBDb2FyXSBQUiM1MTIsIDkwNSwgMTI1MiwgMTMwOCAKCiAgKikgR2l2ZSBhIG1vcmUgaW5mb3JtYXRpdmUgZXJyb3Igd2hlbiBubyBBdXRoVHlwZSBpcyBzZXQuCiAgICAgW0xhcnMgRWlsZWJyZWNodF0KCiAgKikgUmVtb3ZlIHN0cnRvdWwoKSB1c2UgZnJvbSBtb2RfcHJveHkgYmVjYXVzZSBpdCBpc24ndCBhdmFpbGFibGUKICAgICBvbiBhbGwgcGxhdGZvcm1zLiAgIFtNYXJjIFNsZW1rb10gUFIjMTIxNAoKICAqKSBXSU4zMjogU29tZSBXaW4zMiBzeXN0ZW1zIHRlcm1pbmF0ZWQgYWxsIHJlc3BvbnNlcyBhZnRlciAxNiBrQi4gCiAgICAgVGhpcyB0dXJucyBvdXQgdG8gYmUgYSBidWcgaW4gV2luc29jayAtIHNlbGVjdCgpIGRvZXNuJ3QgYWx3YXlzIAogICAgIHJldHVybiB0aGUgY29ycmVjdCBzdGF0dXMuICBbQmVuIExhdXJpZV0KCiAgKikgRGlyZWN0aXZlcyBvd25lZCBieSBodHRwX2NvcmUgY2FuIG5vdyB1c2UgdGhlIG5ldyBjaGVja19jbWRfY29udGV4dCgpCiAgICAgcm91dGluZSB0byBlbnN1cmUgdGhhdCB0aGV5J3JlIG5vdCBiZWluZyB1c2VkIHdpdGhpbiBhIGNvbnRhaW5lcgogICAgIChlLmcuLCA8RGlyZWN0b3J5Pikgd2hlcmUgdGhleSdyZSBpbnZhbGlkLiAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBQT1JUOiBSZWNlbnQgY2hhbmdlcyBtYWRlIGl0IG5lY2Vzc2FyeSB0byBhZGQgZXhwbGljaXQgcHJvdG90eXBlCiAgICAgZm9yIGZnZXRjKCkgYW5kIGZnZXRzKCkgb24gU3VuT1MgNC54LiAgW01hcnRpbiBLcmFlbWVyLCBCZW4gSHlkZV0KCiAgKikgSXQgd2FzIG5lY2Vzc2FyeSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHJlc291cmNlcyB3aGljaCBhcmUKICAgICBhbGxvY2F0ZWQgaW4gdGhlIHBhcmVudCwgZm9yIGNsZWFudXAgaW4gdGhlIHBhcmVudCwgYW5kIHJlc291cmNlcwogICAgIHdoaWNoIGFyZSBhbGxvY2F0ZWQgaW4gZWFjaCBjaGlsZCwgZm9yIGNsZWFudXAgaW4gZWFjaCBjaGlsZC4KICAgICBBIG5ldyBwb29sIHdhcyBjcmVhdGVkIHdoaWNoIGlzIHBhc3NlZCB0byB0aGUgbW9kdWxlIGNoaWxkX2luaXQKICAgICBhbmQgY2hpbGRfZXhpdCBmdW5jdGlvbnM7IG1vZHVsZXMgYXJlIGZyZWUgdG8gcmVnaXN0ZXIgcGVyLWNoaWxkCiAgICAgY2xlYW51cHMgdGhlcmUuICBUaGlzIGZpeGVzIGEgYnVnIHdpdGggcmVsaWFibGUgcGlwZWQgbG9ncy4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIG1vZF9hdXRvaW5kZXggd2Fzbid0IGRpc3BsYXlpbmcgdGhlIFJlYWRtZU5hbWUgZmlsZSBhdCB0aGUgYm90dG9tCiAgICAgdW5sZXNzIGl0IHdhcyBhbHNvIGRvaW5nIEZhbmN5SW5kZXhlcywgYnV0IGl0IGRpc3BsYXllZCB0aGUKICAgICBIZWFkZXJOYW1lIGZpbGUgYXQgdGhlIHRvcCB1bmRlciBhbGwgY2lyY3Vtc3RhbmNlcy4gIEl0IG5vdyBzaG93cwogICAgIHRoZSBSZWFkbWVOYW1lIGZpbGUgZm9yIHNpbXBsZSBpbmRpY2VzLCB0b28sIGFzIGl0IHNob3VsZC4gIAogICAgIFtLZW4gQ29hcl0gUFIjMTM3MwoKICAqKSBodHRwX2NvcmUgd2FzIG1tYXAoKWluZyBldmVuIGluIGNhc2VzIHdoZXJlIGl0IHdhc24ndCBnb2luZyB0bwogICAgIHJlYWQgdGhlIGZpbGUuICBbQmVuIEh5ZGUgPGJoeWRlIGdlbnN5bS5jb20+XQoKICAqKSBDb21wbGV0ZSByZXdyaXRlIDstKSBvZiBtb2RfcmV3cml0ZSdzIFVSTCByZXdyaXRpbmcgZW5naW5lOgogICAgIE5vdyB0aGUgcmV3cml0aW5nIGVuZ2luZSAodGhlIGhlYXJ0IG9mIG1vZF9yZXdyaXRlKSBpcyBvcmdhbml6ZWQgbW9yZQogICAgIHN0cmFpZ2h0LWZvcndhcmQsIGZpcnN0IHRpbWUgd2VsbCBkb2N1bWVudGVkIGFuZCByZWR1Y2VkIHRvIHRoZSByZWFsbHkKICAgICBlc3NlbnRpYWwgcGFydHMuIEFsbCByZWR1bmRhbnQgY2FzZXMgd2VyZSBzdHJpcHBlZCBvZmYgYW5kIHByb2Nlc3Npbmcgbm93CiAgICAgaXMgdGhlIHNhbWUgZm9yIGJvdGggcGVyLXNlcnZlciBhbmQgcGVyLWRpcmVjdG9yeSBjb250ZXh0IHdpdGggb25seSBhCiAgICAgbWluaW11bSBkaWZmZXJlbmNlICh0aGUgcHJlZml4IHN0cmlwcGluZyBpbiBwZXItZGlyIGNvbnRleHQpLiBBcyBhCiAgICAgc2lkZS1lZmZlY3Qgc29tZSBzdWJ0bGUgcmVzdHJpY3Rpb25zIGFuZCB0d28gcmVjZW50bHkgZGlzY292ZXJlZCBwcm9ibGVtcwogICAgIGFyZSBnb25lOiBXcm9uZyBlc2NhcGluZyBvZiBRVUVSWV9TVFJJTkcgb24gcmVkaXJlY3RzIGluIHBlci1kaXJlY3RvcnkKICAgICBjb250ZXh0IGFuZCByZXN0cmljdGlvbnMgb24gdGhlIHN1YnN0aXR1dGlvbiBVUkwgb24gcmVkaXJlY3RzLgogICAgIEFkZGl0aW9uYWxseSBzb21lIG1pbm9yIHNvdXJjZSBjbGVhbnVwcyB3ZXJlIGRvbmUuIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXSAKCiAgKikgTGFycyBFaWxlYnJlY2h0IHdyb3RlIGEgd2hvbGUgbmV3IHNldCBvZiBBcGFjaGUgVmhvc3QgSW50ZXJuYWxzCiAgICAgZG9jdW1lbnRhdGlvbiwgZXhhbXBsZXMsIGV4cGxhbmF0aW9ucyBhbmQgY2F2ZWF0cy4gVGhleSBsaXZlIGluIGEgbmV3CiAgICAgc3ViZGlyZWN0b3J5IGh0ZG9jcy9tYW51YWwvdmhvc3QvLiBbTGFycyBFaWxlYnJlY2h0IDxzZnggdW5peC1hZy5vcmc+XQoKICAqKSBJZiBhcF9zbGFjayBmYWlscyB0byBhbGxvY2F0ZSBhYm92ZSB0aGUgbG93IHNsYWNrIGxpbmUgaXQncyBhIGdvb2QKICAgICBpbmRpY2F0aW9uIHRoYXQgZnVydGhlciBwcm9ibGVtcyB3aWxsIG9jY3VyOyBpdCdzIGEgYmV0dGVyIGluZGljYXRpb24KICAgICB0aGFuIG1hbnkgZXh0ZXJuYWwgbGlicmFyaWVzIGdpdmUgdXMgd2hlbiB3ZSBhY3R1YWxseSBydW4gb3V0IG9mCiAgICAgZGVzY3JpcHRvcnMuICBTbyByZXBvcnQgaXQgdG8gdGhlIHVzZXIgb25jZSBwZXIgcmVzdGFydC4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzExODEKCiAgKikgQ2hhbmdlIG1vZF9pbmNsdWRlIGFuZCBtb2RfYXV0b2luZGV4IHRvIHVzZSBZMkstc2FmZSBkYXRlIGZvcm1hdHMKICAgICBieSBkZWZhdWx0LiAgW0tlbiBDb2FyXQoKICAqKSBBZGQgYSAiU3VwcHJlc3NDb2x1bW5Tb3J0aW5nIiBvcHRpb24gdG8gdGhlIEluZGV4T3B0aW9ucyBsaXN0LAogICAgIHdoaWNoIHdpbGwga2VlcCB0aGUgY29sdW1uIGhlYWRpbmcgZnJvbSBiZWluZyBsaW5rcyBmb3Igc29ydGluZwogICAgIHRoZSBkaXNwbGF5LiAgW0tlbiBDb2FyLCBzdWdnZXN0ZWQgYnkgQnJpYW4gVGllbWFubiA8YnRtYW4gcGFjaWZpYy5uZXQ+XQogICAgIFBSICMxMjYxCgogICopIFBPUlQ6IFVwZGF0ZSB0aGUgTHlueE9TIHBvcnQuICBbTWFyaXVzIEdyb2VnZXIgPG1hZyBzeXNnby5kZT5dCgogICopIEZpeCBsb2dpYyBlcnJvciB3aGVuIGlzc3VpbmcgYSBtbWFwKCkgZmFpbGVkIG1lc3NhZ2UKICAgICB3aXRoIGEgbm9uLXplcm8gTU1BUF9USFJFU0hPTEQuCiAgICAgW0RhdmlkIENoYW1iZXJzIDxkYXZpZGMgZmxvc3VuLnNhbGsuZWR1Pl0gUFIjMTI5NAoKICAqKSBQcmVzZXJ2ZSBoYW5kbGVyIHZhbHVlIG9uIFByb3h5UGFzcydlZCByZXF1ZXN0cyBieSBub3QKICAgICBjYWxsaW5nIGZpbmRfdHlwZXMgb24gYSBwcm94eSdkIHJlcXVlc3Q7IGZpeGVzIHByb2JsZW1zCiAgICAgd2hlcmUgc29tZSBQcm94eVBhc3MnZWQgVVJMcyB3ZXJlbid0IGFjdHVhbGx5IHBhc3NlZAogICAgIHRvIHRoZSBwcm94eS4KICAgICBbTGFycyBFaWxlYnJlY2h0XSBQUiM4NzAKCiAgKikgRml4IGEgYnl0ZSBvcmRlcmluZyBwcm9ibGVtIGluIG1vZF9hY2Nlc3Mgd2hpY2ggcHJldmVudGVkCiAgICAgdGhlIG9sZC1zdHlsZSBzeW50YXggKGkuZS4gImEuYi5jLiIgdG8gbWF0Y2ggYSBjbGFzcyBDKQogICAgIGZyb20gd29ya2luZyBwcm9wZXJseS4gW0RlYW4gR2F1ZGV0XSBQUiMxMjQ4LCAxMzI4LCAxMzg0CgogICopIEZpeCBwcm9ibGVtIHdpdGggVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUIG5vdCB3b3JraW5nCiAgICAgcHJvcGVybHkuIEVhY2ggY2hpbGQgbmVlZHMgdG8gb3BlbiB0aGUgbG9ja2ZpbGUgaW5zdGVhZAogICAgIG9mIHVzaW5nIHRoZSBwYXNzZWQgZmlsZS1kZXNjcmlwdG9yIGZyb20gdGhlIHBhcmVudC4gCiAgICAgW0ppbSBKYWdpZWxza2ldIFBSIzEwNTYKCiAgKikgRml4IHRoZSBlcnJvciBsb2dnaW5nIGluIG1vZF9jZ2k7IHRoZSByZWNlbnQgZXJyb3IgbG9nIGNoYW5nZXMKICAgICBpbnRyb2R1Y2VkIGEgYnVnIHRoYXQgcHJldmVudGVkIGl0IGZyb20gd29ya2luZyBjb3JyZWN0bHkuCiAgICAgW00uRC5QYXJrZXJdIFBSIzEzNTIKCiAgKikgRGVmYXVsdCB0byBVU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQgb24gSFBVWCB0byBwcm9wZXJseSAKICAgICBoYW5kbGUgbXVsdGlwbGUgTGlzdGVuIGRpcmVjdGl2ZXMuICBbTWFyYyBTbGVta29dIFBSIzg3MgoKICAqKSBJbmhlcml0IGEgYnVnZml4IHRvIGZubWF0Y2guYyBmcm9tIEZyZWVCU0Qgc291cmNlcy4KICAgICBbIltLT0k4LVJdIOHOxNLFyiD+xdLOz9ciIDxhY2hlIG5hZ3VhbC5wcC5ydT5dIFBSIzEzMTEKCiAgKikgV2hlbiBhIGNvbmZpZ3VyYXRpb24gcGFyc2UgY29tcGxhaW5lZCBhYm91dCBhIGJhZCBkaXJlY3RpdmUsCiAgICAgdGhlIGxvZ2dlciB3b3VsZCB1c2Ugd2hhdGV2ZXIgKHVucmVsYXRlZCkgdmFsdWUgd2FzIGluIGVycm5vLgogICAgIGVycm5vIGlzIG5vdyBmb3JjZWQgdG8gRUlOVkFMIGZpcnN0IGluIHRoaXMgY2FzZS4gIFtLZW4gQ29hcl0KCiAgKikgQSBzZWQgY29tbWFuZCBpbiB0aGUgQ29uZmlndXJlIHNjcmlwdCBwdXNoZWQgdGhlIGVkZ2Ugb2YgUE9TSVhuZXNzLAogICAgIGJyZWFraW5nIG9uIHNvbWUgc3lzdGVtcy4gIFtCaGFiYSBSLk1pc3JhIDxzeXN0ZW0gdnQuZWR1Pl0gUFIjMTM2OAoKICAqKSBTb2xhcmlzID49IDIuNSB3YXMgdG90YWxseSBicm9rZW4gZHVlIHRvIGEgbWVzcyB1cCB1c2luZyBwdGhyZWFkCiAgICAgbXV0ZXhlcy4gIFtSb3kgRmllbGRpbmcsIERlYW4gR2F1ZGV0XQoKICAqKSBPUy8yIFBvcnQgdXBkYXRlZDsgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGJ1aWxkIE9TLzIgZnJvbSB0aGUgc2FtZQogICAgIHNvdXJjZXMgYXMgVW5peCBub3cuICBbQnJpYW4gSGF2YXJkIDxicmlhbmgga2hlbGRhci5hcGFuYS5vcmcuYXU+XQoKICAqKSBGaXggYSB5ZWFyIGZvcm1hdHRpbmcgYnVnIGluIG1vZF91c2VydHJhY2suCiAgICAgW1BhdWwgRWdnZXJ0IDxlZ2dlcnQgdHdpbnN1bi5jb20+XSBQUiMxMzQyCgogICopIEEgbWlsZCBTSUdURVJNL1NJR0FMUk0gcmFjZSBjb25kaXRpb24gd2FzIGVsaW1pbmF0ZWQuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiMxMjExCgogICopIFdhcm4gdXNlciB0aGF0IGRlZmF1bHQgcGF0aCBoYXMgY2hhbmdlZCBpZiAvdXNyL2xvY2FsL2V0Yy9odHRwZAogICAgIGlzIGZvdW5kIG9uIHRoZSBzeXN0ZW0uICBbTGFycyBFaWxlYnJlY2h0XQoKICAqKSBWYXJpb3VzIG1vZF9taW1lX21hZ2ljIGJ1ZyBmaXhlcyBhbmQgY2xlYW51cHM6IFVuY29tcHJlc3Npb24KICAgICBzaG91bGQgd29yaywgaXQgc2hvdWxkIHdvcmsgb24gV0lOMzIsIGFuZCBhIGZldyByZXNvdXJjZQogICAgIGxlYWtzIGFuZCBhYm9ydCBjb25kaXRpb25zIGFyZSBmaXhlZC4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzEyMDUKCiAgKikgUE9SVDogT24gQUlYIDEueCBmaWxlcyBjYW4ndCBiZSBuYW1lZCAnQCcsIGZpeCB0aGUgcHJveHkgY2FjaGUKICAgICB0byB1c2UgJyUnIGluc3RlYWQgb2YgJ0AnIGluIGl0cyBlbmNvZGluZ3MuCiAgICAgW0RhdmlkIFNjaHVsZXIgPHNjaHVsZCBidHYuaWJtLmNvbT5dIFBSIzEzMTcKCiAgKikgSW1wcm92ZSB0aGUgd2FybmluZyBtZXNzYWdlIGdlbmVyYXRlZCB3aGVuIHRoZSAic2VydmVyIGlzIGJ1c3kiLgogICAgIFtEZWFuIEdhdWRldF0gUFIjMTI5MwoKICAqKSBQT1JUOiBBbGwgcG9ydHMgd2hpY2ggZG9uJ3Qgb3RoZXJ3aXNlIGRlZmluZSBERUZfV0FOVEhTUkVHRVggd2lsbAogICAgIGdldCBTcGVuY2VyIHJlZ2V4IGJ5IGRlZmF1bHQuICBUaGlzIGlzIHRvIGF2b2lkIGhhdmluZyB0bwogICAgIGRpc2NvdmVyIGJ1Z3MgaW4gb3BlcmF0aW5nIHN5c3RlbSBsaWJyYXJpZXMuICBbRGVhbiBHYXVkZXRdCgogICopIFBPUlQ6ICJGaXgiIFBSIzQ2NyBieSBnZW5lcmF0aW5nIHdhcm5pbmdzIG9uIHN5c3RlbXMgd2hpY2ggd2UgaGF2ZQogICAgIG5vdCBiZWVuIGFibGUgdG8gZ2V0IHdvcmtpbmcgVVNFXypfU0VSSUFMSVpFRF9BQ0NFUFQgc2V0dGluZ3MgZm9yLgogICAgIERvY3VtZW50IHRoaXMgYSBiaXQgbW9yZSBpbiBzcmMvUE9SVElORy4gIFtEZWFuIEdhdWRldF0gUFIjNDY3CgogICopIEVuc3VyZSB0aGF0IG9uZSBjb3B5IG9mIGNvbmZpZyB3YXJuaW5ncyBtYWtlcyBpdCB0byB0aGUKICAgICBlcnJvcl9sb2cuICBbRGVhbiBHYXVkZXRdCgogICopIEludmVudCBuZXcgc3RydWN0dXJlIGFuZCBhc3NvY2lhdGVkIG1ldGhvZHMgdG8gaGFuZGxlIGNvbmZpZyBmaWxlCiAgICAgcmVhZGluZy4gQWRkICJjdXN0b20iIGhvb2sgdG8gdXNlIGNvbmZpZyBmaWxlIGNmZ19nZXRsaW5lKCkgb24KICAgICBzb21ldGhpbmcgd2hpY2ggaXMgbm90IGEgRklMRSogIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgTWFrZSBzaW5nbGUtZXhlIFdpbmRvd3MgaW5zdGFsbC4gW0JlbiBMYXVyaWUgYW5kIEVyaWMgRXNzZWxpbmtdCgogICopIFdJTjMyOiBNYWtlIENHSSB3b3JrIHVuZGVyIFdpbjk1LiBbQmVuIExhdXJpZSBhbmQgUGF1bCBTdXR0b25dCgogICopIFdJTjMyOiBNYWtlIGluZGV4Lmh0bWwgYW5kIGZyaWVuZHMgd29yayB1bmRlciBXaW45NS4gW0JlbiBMYXVyaWVdCgogICopIFBPUlQ6IFNvbGFyaXMgMi40IG5lZWRzIFNwZW5jZXIgcmVnZXgsIHRoZSBzeXN0ZW0gcmVnZXggaXMgYnJva2VuLgogICAgIFtKb2huIExpbmUgPGptbDQgY2FtLmFjLnVrPl0gUFIjMTMyMQoKICAqKSBEZWZhdWx0IHBhdGhuYW1lIGhhcyBiZWVuIGNoYW5nZWQgZXZlcnl3aGVyZSB0byAvdXNyL2xvY2FsL2FwYWNoZQogICAgIFtTYW1lZXIgPHNhbWVlciBjMi5uZXQ+XQoKICAqKSBQT1JUOiBBSVggbm93IHVzZXMgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBULgogICAgIFtEYXZpZCBCcm9uZGVyIDxEYXZpZC1Ccm9uZGVyIHVpb3dhLmVkdT5dIFBSIzg0OQoKICAqKSBQT1JUOiBpMzg2IEFJWCBkb2VzIG5vdCBoYXZlIG1lbW1vdmUuCiAgICAgW0RhdmlkIFNjaHVsZXIgPHNjaHVsZCBidHYuaWJtLmNvbT5dIFBSIzEyNjcKCiAgKikgUE9SVDogSFBVWCBub3cgZGVmYXVsdHMgdG8gdXNpbmcgU3BlbmNlciByZWdleC4KICAgICBbUGhpbGlwcGUgVmFuaGFlc2VuZG9uY2sgPHB2YW5oYWVzIGJlLm9yYWNsZS5jb20+LAogICAgIE9tYXIgRGVsIFJpbyA8YWwxMTIyNjMgYWNhZGVtMDEubGFnLml0ZXNtLm14Pl0gUFIjNDgyLCAxMjQ2CgogICopIFBPUlQ6IFNvbWUgdmVyc2lvbnMgb2YgTmV0QlNEIGRvbid0IGF1dG9tYXRpY2FsbHkgZGVmaW5lCiAgICAgX19OZXRCU0RfXy4gIFdvcmthcm91bmQgYnkgZGVmaW5pbmcgTkVUQlNELgogICAgIFtDaHJpcyBDcmFmdCA8Y2NyYWZ0IGNuY2MuY2MuY28udXM+XSBQUiM5NzcKCiAgKikgUE9SVDogVW5peFdhcmUgMi54IHJlcXVpcmVzIC1sZ2VuIGZvciBzeXNsb2cuCiAgICAgW0hhbnMgU25pamRlciA8aHMgbWVnYW5ldC5ubD5dIFBSIzEyNDkKCiAgKikgUE9SVDogVUxUUklYIGFwcGVhcnMgdG8gbm90IGhhdmUgc3lzbG9nLgogICAgIFtMYXJzIEVpbGVicmVjaHQgPExhcnMuRWlsZWJyZWNodCB1bml4LWFnLm9yZz5dCgogICopIFBPUlQ6IEJhc2ljIEdlbWluaSBwb3J0ICh0cmVhdCBpdCBsaWtlIHVuaXh3YXJlMjEyKS4KICAgICBbIlBhdmVsIFlha292bGV2IChQYXVsIE1jSGFja2VyKSIgPGhhYyB0b21jYXQub2xseS5ydT5dCgogICopIFBPUlQ6IEFsbCBTVlI0IHN5c3RlbXMgbm93IHVzZSBORVRfU0laRV9UID0gc2l6ZV90LCBhbmQKICAgICB1c2UgVVNFX1NITUdFVF9TQ09SRUJPQVJELgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgVmFyaW91cyBpbXByb3ZlbWVudHMgaW4gZGV0ZWN0aW5nIGNvbmZpZyBmaWxlIGVycm9ycyAobWlzc2luZyBjbG9zaW5nCiAgICAgZGlyZWN0aXZlcyBmb3IgPERpcmVjdG9yeT4sIDxGaWxlcz4gZXRjLiBibG9ja3MsIHByb2hpYml0aW5nIGdsb2JhbAogICAgIHNlcnZlciBzZXR0aW5ncyBpbiA8VmlydHVhbEhvc3Q+IGJsb2NrcywgZmxhZ2dpbmcgdW5oYW5kbGVkIG11bHRpcGxlCiAgICAgYXJndW1lbnRzIHRvIDxEaXJlY3Rvcnk+LCA8RmlsZXM+IGV0Yy4pCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBBZGQgc3VwcG9ydCB0byBzdWV4ZWMgd3JhcHBlciBwcm9ncmFtIGZvciBtb2RfdW5pcXVlX2lkJ3MgVU5JUVVFX0lECiAgICAgdmFyaWFibGUgdG8gcHJvdmlkZSB0aGlzIG9uZSB0byBzdWV4ZWMnZCBDR0lzLCB0b28uCiAgICAgW00uRC5QYXJrZXIgPG1kcGMgbmV0Y29tLmNvbT5dIFBSIzEyODQKCiAgKikgTmV3IHN1cHBvcnQgdG9vbDogc3JjL3N1cHBvcnQvc3BsaXQtbG9nZmlsZSwgYSBzYW1wbGUgUGVybCBzY3JpcHQgd2hpY2gKICAgICBzcGxpdHMgdXAgYSBjb21iaW5lZCBhY2Nlc3MgbG9nIGludG8gc2VwYXJhdGUgZmlsZXMgYmFzZWQgb24gdGhlCiAgICAgbmFtZSBvZiB0aGUgdmlydHVhbCBob3N0IChsaXN0ZWQgZmlyc3QgaW4gdGhlIGxvZyByZWNvcmRzIGJ5ICIldiIpLgogICAgIFtLZW4gQ29hcl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4zYjIgKHRoZXJlIGlzIG5vIDEuM2IxKQoKICAqKSBUZXN0Q29tcGlsZSB3YXMgbm90IHBhc3NpbmcgJExJQlMgW0RlYW4gR2F1ZGV0XQoKICAqKSBNYWtlZmlsZS50bXBsIHdhcyBub3QgdXNpbmcgJENGTEFHUyBpbiB0aGUgbGluayBwaGFzZS4gCiAgICAgW01hcnRpbiBLcmFlbWVyXQoKICAqKSBBZGQgZGVidWdnaW5nIGNvZGUgdG8gYWxsb2MuYy4gIERlZmluaW5nIEFMTE9DX0RFQlVHIHByb3ZpZGVzIGEKICAgICBydWRpbWVudGFyeSBtZW1vcnkgZGVidWdnZXIgd2hpY2ggY2FuIGJlIHVzZWQgb24gbGl2ZSBzZXJ2ZXJzIHdpdGgKICAgICBsb3cgaW1wYWN0IC0tIGl0IHNldHMgYWxsIGFsbG9jYXRlZCBhbmQgZnJlZWQgbWVtb3J5IGJ5dGVzIHRvIDB4YTUuCiAgICAgRGVmaW5pbmcgQUxMT0NfVVNFX01BTExPQyB3aWxsIGNhdXNlIHRoZSBhbGxvYyBjb2RlIHRvIHVzZSBtYWxsb2MoKQogICAgIGFuZCBmcmVlKCkgZm9yIGVhY2ggb2JqZWN0LiAgVGhpcyBpcyBmYXIgbW9yZSBleHBlbnNpdmUgYW5kIHNob3VsZAogICAgIG9ubHkgYmUgdXNlZCBmb3IgdGVzdGluZyB3aXRoIHRvb2xzIHN1Y2ggYXMgRWxlY3RyaWMgRmVuY2UgYW5kCiAgICAgUHVyaWZ5LiAgU2VlIG1haW4vYWxsb2MuYyBmb3IgbW9yZSBkZXRhaWxzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBDb25maWd1cmUgdXNlcyBhIHNoIHRyYXAgYW5kIGRpZG4ndCBzZXQgaXRzIGV4aXRjb2RlIHByb3Blcmx5LgogICAgIFtEZWFuIEdhdWRldF0gUFIjMTE1OQoKICAqKSBZZXQgYW5vdGhlciB2aG9zdCByZXZhbXAuICBBZGQgdGhlIE5hbWVWaXJ0dWFsSG9zdCBkaXJlY3RpdmUgd2hpY2gKICAgICBleHBsaWNpdGx5IGxpc3RzIHRoZSBpcDpwb3J0IHBhaXJzIHRoYXQgYXJlIHRvIGJlIHVzZWQgZm9yIG5hbWUtdmhvc3RzLgogICAgIEZyb20gYSBnaXZlbiBpcDpwb3J0LCByZWdhcmRsZXNzIHdoYXQgdGhlIEhvc3Q6IGhlYWRlciBpcywgeW91IGNhbgogICAgIG9ubHkgcmVhY2ggdGhlIHZob3N0cyBkZWZpbmVkIG9uIHRoYXQgaXA6cG9ydC4gIFRoZSBwcmVjZWRlbmNlIG9mCiAgICAgdmhvc3RzIHdhcyByZXZlcnNlZCB0byBtYXRjaCBvdGhlciBwcmVjZWRlbmNlcyBpbiB0aGUgY29uZmlnIC0tCiAgICAgdGhlIGVhcmxpZXIgdmhvc3RzIG92ZXJyaWRlIHRoZSBsYXRlciB2aG9zdHMuICBBbGwgdmhvc3QgbWF0Y2hpbmcgd2FzCiAgICAgbW92ZWQgaW50byBodHRwX3Zob3N0LltjaF0uICBbRGVhbiBHYXVkZXRdCgogICopIGFwX2lubGluZSBjYW4gYmUgdXNlZCB0byBmb3JjZSBpbmxpbmluZy4gIEdOVUMgX19hdHRyaWJ1dGVfXygpIGNhbgogICAgIGJlIHVzZWQgZm9yIHdoYXRldmVyIHJlYXNvbiBpcyBhcHByb3ByaWF0ZSAoaS5lLiBmb3JtYXQoKSB3YXJuaW5ncwogICAgIGZvciBwcmludGYgc3R5bGUgZnVuY3Rpb25zKS4gIEJvdGggYXJlIGVuYWJsZWQgb25seSB3aXRoCiAgICAgZ2NjID49IDIuNy54IChzbyB0aGF0IHdlIGhhdmUgZmV3ZXIgc3VwcG9ydCBpc3N1ZXMgd2l0aCBvbGRlcgogICAgIHZlcnNpb25zKS4gIFtEZWFuIEdhdWRldF0KCiAgKikgRml4IHN1cHBvcnQgZm9yIFByb3h5IEF1dGhlbnRpY2F0aW9uICh3ZSB3ZXJlIHRlc3RpbmcgdGhlIHJlc3BvbnNlCiAgICAgc3RhdHVzIHRvbyBlYXJseSkuIFtNYXJjIFNsZW1rb10KCiAgKikgQ29yZUR1bXBEaXJlY3RvcnkgZGlyZWN0aXZlIGRpcmVjdHMgd2hlcmUgdGhlIGNvcmUgZmlsZSBpcwogICAgIHdyaXR0ZW4gd2hlbiBhIFNJR1NFR1YsIFNJR0JVUywgU0lHQUJPUlQgb3IgU0lHQUJSVCBhcmUKICAgICByZWNlaXZlZC4gIFtNYXJjIFNsZW1rbywgRGVhbiBHYXVkZXRdCgogICopIFBPUlQ6IFN1cHBvcnQgZm9yIEF0YXJpIE1JTlQuCiAgICAgW0phbiBQYXVsIFNjaG1pZHQgPEphbi5QLlNjaG1pZHQgbW5pLmZoLWdpZXNzZW4uZGU+XQoKICAqKSBXaGVuIGJvb3RpbmcsIGFwYWNoZSB3aWxsIG5vdyBkZXRhY2ggaXRzZWxmIGZyb20gc3RkaW4sIHN0ZG91dCwKICAgICBhbmQgc3RkZXJyLiAgc3RkZXJyIHdpbGwgbm90IGJlIGRldGFjaGVkIHVudGlsIGFmdGVyIHRoZSBjb25maWcKICAgICBmaWxlcyBoYXZlIGJlZW4gcmVhZCBzbyB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNlZSBpbml0aWFsIGVycm9yCiAgICAgbWVzc2FnZXMuICBBZnRlciB0aGF0IGFsbCBlcnJvcnMgYXJlIGxvZ2dlZCBpbiB0aGUgZXJyb3JfbG9nLgogICAgIFRoaXMgbWFrZXMgaXQgbW9yZSBjb252ZW5pZW50IHRvIHN0YXJ0IGFwYWNoZSB2aWEgcnNoLCBzc2gsCiAgICAgb3IgY3JvbnRhYnMuICBbRGVhbiBHYXVkZXRdIFBSIzUyMwoKICAqKSBtb2RfcHJveHkgd2FzIHNlbmRpbmcgSFRUUC8xLjEgcmVzcG9uc2VzIHRvIGZ0cCByZXF1ZXN0cyBieSBtaXN0YWtlLgogICAgIEFsc28gcmVtb3ZlZCB0aGUgYXV0by1nZW5lcmF0ZWQgbGluayB0byB3d3cuYXBhY2hlLm9yZyB0aGF0IHdhcyB0aGUKICAgICBzb3VyY2Ugb2Ygc28gbWFueSBtaXNkaXJlY3RlZCBidWcgcmVwb3J0cy4gIFtSb3kgRmllbGRpbmcsIE1hcmMgU2xlbWtvXQoKICAqKSBzZW5kX2ZiIHdvdWxkIG5vdCBkZXRlY3QgYWJvcnRlZCBjb25uZWN0aW9ucyBpbiBzb21lIHNpdHVhdGlvbnMuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBtb2RfaW5jbHVkZSB3b3VsZCB1c2UgdW5pbml0aWFsaXplZCBkYXRhIHdoZW4gcGFyc2luZyBjZXJ0YWluCiAgICAgZXhwcmVzc2lvbnMgaW52b2x2aW5nICYmIGFuZCB8fC4gW0JyaWFuIFNsZXNpbnNreV0gUFIjMTEzOQoKICAqKSBtb2RfaW1hcCBzaG91bGQgb25seSBoYW5kbGUgR0VUIG1ldGhvZHMuICBbSmF5IEJsb29kd29ydGhdCgogICopIHN1ZXhlYy5jIHdvdWxkbid0IGJ1aWxkIHdpdGhvdXQgLURMT0dfRVhFQy4gW0phc29uIEEuIERvdXJdCgogICopIG1vZF9hdXRvaW5kZXggaW1wcm9wZXJseSBjb3VudGVkICZlc2NhcGVzOyBhcyBtb3JlIHRoYW4gb25lCiAgICAgY2hhcmFjdGVyIGluIHRoZSBkZXNjcmlwdGlvbi4gIEl0IGFsc28gaW1wcm9wZXJseSB0cnVuY2F0ZWQKICAgICBkZXNjcmlwdGlvbnMgdGhhdCB3ZXJlIGV4YWN0bHkgdGhlIG1heGltdW0gbGVuZ3RoLgogICAgIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgUmVkaXJlY3RNYXRjaCB3YXMgbm90IHByb3Blcmx5IGVzY2FwaW5nIHRoZSByZXN1bHQgKFBSIzExNTUpLiAgQWxzbwogICAgICJSZWRpcmVjdE1hdGNoIC9hZHZlcnRpc2VyLyguKikgJDEiIGlzIG5vdyBwZXJtaXR0ZWQuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBtb2RfaW5jbHVkZSBub3cgdXNlcyBzeW1ib2xpYyBuYW1lcyB0byBjaGVjayBmb3IgcmVxdWVzdCBzdWNjZXNzCiAgICAgYW5kIHJldHVybiBIVFRQIGVycm9ycywgYW5kIGNvcnJlY3RseSBoYW5kbGVzIGFsbCB0eXBlcyBvZgogICAgIHJlZGlyZWN0aW9ucyAocHJldmlvdXNseSBpdCBvbmx5IGRpZCB0ZW1wb3JhcnkgcmVkaXJlY3QgY29ycmVjdGx5KS4KICAgICBbS2VuIENvYXIsIFJveSBGaWVsZGluZ10KCiAgKikgbW9kX3VzZXJkaXIgd2FzIG1vZGlmeWluZyByLT5maW5mbyBpbiBjYXNlcyB3aGVyZSBpdCB3YXNuJ3Qgc2V0dGluZwogICAgIHItPmZpbGVuYW1lLiAgU2luY2UgdGhvc2UgdHdvIGFyZSBtZWFudCB0byBiZSBpbiBzeW5jIHdpdGggZWFjaCBvdGhlcgogICAgIHRoaXMgaXMgYSBidWcuICBbIlBhdWwgQi4gSGVuc29uIiA8aGVuc29uIGludHJhbmV0LmNzdXBvbW9uYS5lZHU+XQoKICAqKSBQT1JUOiBTdXBwb3J0IFVuaXN5cyBTVlI0LCB3aG9zZSB1bmFtZSByZXR1cm5zIG1vc3RseSB1c2VsZXNzIGRhdGEuCiAgICAgWyJLYXVmbWFuLCBTdGV2ZW4gRSIgPFN0ZXZlbi5LYXVmbWFuIHVuaXN5cy5jb20+XQoKICAqKSBJbmV0ZCBtb2RlICh3aGljaCBpcyBidWdneSkgdXNlcyB0aW1lb3V0cyB3aXRob3V0IGhhdmluZyBzZXR1cCB0aGUKICAgICBqbXBidWZmZXIuIFtEZWFuIEdhdWRldF0gUFIjMTA2NAoKICAqKSBXb3JrIGFyb3VuZCBwcm9ibGVtIHVuZGVyIExpbnV4IHdoZXJlIGEgY2hpbGQgd2lsbCBzdGFydCBsb29waW5nCiAgICAgcmVwb3J0aW5nIGEgc2VsZWN0IGVycm9yIG92ZXIgYW5kIG92ZXIuCiAgICAgW1JpY2sgRnJhbmNodWsgPHJpY2tmIHRyYW5zcGVjdC5uZXQ+XSBQUiMxMTA3LCA5ODcsIDU4OAoKICAqKSBGaXhlZCBlcnJvciBpbiBwcm94eV91dGlsLmMgd2hlbiBsb29waW5nIHRocm91Z2ggbXVsdGlwbGUgaG9zdCBJUAogICAgIGFkZHJlc3Nlcy4gW0xhcnMgRWlsZWJyZWNodF0gUFIjOTc0CgogICopIElmIEJVRkZFUkVEX0xPR1MgaXMgZGVmaW5lZCB0aGVuIG1vZF9sb2dfY29uZmlnIHdpbGwgZG8gYXRvbWljCiAgICAgYnVmZmVyZWQgd3JpdGVzIC0tIHRoYXQgaXMsIGl0IHdpbGwgYnVmZmVyIHVwIHRvIFBJUEVfQlVGIChpLmUuIDRrKQogICAgIGJ5dGVzIGJlZm9yZSB3cml0aW5nLCBidXQgaXQgd2lsbCBuZXZlciBzcGxpdCBhIGxvZyBlbnRyeSBhY3Jvc3MgYQogICAgIGJ1ZmZlciBib3VuZGFyeS4gIFtEZWFuIEdhdWRldF0KCiAgKikgQVBJOiB0aGUgc2hvcnRfc2NvcmUgcmVjb3JkIGhhcyBiZWVuIHNwbGl0IGludG8gdHdvIHBpZWNlcywgb25lIHdoaWNoCiAgICAgdGhlIHBhcmVudCB3cml0ZXMgb24sIGFuZCBvbmUgd2hpY2ggdGhlIGNoaWxkIHdyaXRlcyBvbi4gIEFzIHBhcnQgb2YKICAgICB0aGlzIGNoYW5nZSB0aGUgZ2V0X3Njb3JlYm9hcmRfaW5mbygpIGZ1bmN0aW9uIHdhcyByZW1vdmVkLCBhbmQKICAgICBzY29yZWJvYXJkX2ltYWdlIHdhcyBleHBvcnRlZC4gIFRoaXMgY2hhbmdlIGZpeGVzIGEgcmFjZSBjb25kaXRpb24KICAgICBpbiBmaWxlIGJhc2VkIHNjb3JlYm9hcmQgc3lzdGVtcywgYW5kIHNwZWVkcyB1cCBjaGFuZ2VzIGludm9sdmluZyB0aGUKICAgICBzY29yZWJvYXJkIGluIGVhcmxpZXIgMS4zIGRldmVsb3BtZW50LiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBUEk6IE5ldyByZWdpc3Rlcl9vdGhlcl9jaGlsZCgpIEFQSSAoc2VlIGh0dHBfbWFpbi5oKSB3aGljaCBhbGxvd3MKICAgICBtb2R1bGVzIHRvIHJlZ2lzdGVyIGNoaWxkcmVuIHdpdGggdGhlIHBhcmVudCBmb3IgbWFpbnRlbmFuY2UuICBJdAogICAgIGlzIGRpc2FibGVkIGJ5IGRlZmluaW5nIE5PX09USEVSX0NISUxELiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBUEk6IE5ldyBwaXBlZF9sb2cgQVBJIChzZWUgaHR0cF9sb2cuaCkgd2hpY2ggaW1wbGVtZW50cyBwaXBlZCBsb2dzLAogICAgIGFuZCB3aWxsIHVzZSByZWdpc3Rlcl9vdGhlcl9jaGlsZCB0byBpbXBsZW1lbnQgcmVsaWFibGUgcGlwZWQgbG9ncwogICAgIHdoZW4gaXQgaXMgYXZhaWxhYmxlLiAgVGhlIHJlbGlhYmxlIHBpcGVkIGxvZ3MgcGFydCBjYW4gYmUgZGlzYWJsZWQKICAgICBieSBkZWZpbmluZyBOT19SRUxJQUJMRV9QSVBFRF9MT0dTLiAgQXQgdGhlIG1vbWVudCByZWxpYWJsZSBwaXBlZAogICAgIGxvZ3MgaXMgb25seSBhdmFpbGFibGUgb24gVW5peC4gW0RlYW4gR2F1ZGV0XQoKICAqKSBBUEk6IHNldF9sYXN0X21vZGlmaWVkKCkgYnJva2VuIGludG8gc2V0X2xhc3RfbW9kaWZpZWQoKSwgc2V0X2V0YWcoKSwgYW5kCiAgICAgbWVldHNfY29uZGl0aW9ucygpLiAgVGhpcyBhbGxvd3MgY29uZGl0aW9uYWwgSFRUUCBzZWxlY3Rpb24gdG8gYmUKICAgICBoYW5kbGVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgc3RvcmluZyBvZiB0aGUgaGVhZGVyIGZpZWxkcywgYW5kIHByb3ZpZGVzCiAgICAgdGhlIGFiaWxpdHkgZm9yIENHSXMgdG8gc2V0IHRoZWlyIG93biBFVGFncyBmb3IgY29uZGl0aW9uYWwgY2hlY2tpbmcuCiAgICAgW0tlbiBDb2FyLCBSb3kgRmllbGRpbmddICBQUiM4OTUKCiAgKikgQ2hhbmdlcyB0byBtb2RfbG9nX2NvbmZpZyB0byBhbGxvdyBuYW1pbmcgb2YgZm9ybWF0IHN0cmluZ3MuCiAgICAgRm9ybWF0IG5pY2tuYW1lcyBhcmUgZGVmaW5lZCB3aXRoICJMb2dGb3JtYXQgZm10IG5pY2tuYW1lIiwgYW5kIGNhbgogICAgIGJlIHVzZWQgd2l0aCAiTG9nRm9ybWF0IG5pY2tuYW1lIiBhbmQgIkN1c3RvbUxvZyBsb2d0YXJnZXQgbmlja25hbWUiLgogICAgIFtLZW4gQ29hcl0KCiAgKikgTmV3IG1vZHVsZSwgIm1vZF9zcGVsaW5nIiwgd2hpY2ggY2FuIGhlbHAgZmluZCBmaWxlcyBldmVuIHdoZW4gCiAgICAgdGhlIFVSTCBpcyBzbGlnaHRseSBtaXNzcGVsbGVkLiBbTWFydGluIEtyYWVtZXIsIEFsZXhlaSBLb3N1dF0KCiAgKikgQVBJOiBOZXcgZnVuY3Rpb24gY2hpbGRfdGVybWluYXRlKCkgdHJpZ2dlcnMgdGhlIGNoaWxkIHByb2Nlc3MgdG8KICAgICBleGl0LCB3aGlsZSBhbGxvd2luZyB0aGUgY2hpbGQgZmluaXNoIHdoYXQgaXQgbmVlZHMgdG8gZm9yIHRoZQogICAgIGN1cnJlbnQgcmVxdWVzdCBmaXJzdC4gIAogICAgIFtEb3VnIE1hY0VhY2hlcm4sIEFsZXhlaSBLb3N1dF0KCiAgKikgV2luZG93cyBub3cgZGVmYXVsdHMgdG8gdXNpbmcgZnVsbCBzdGF0dXMgcmVwb3J0cyB3aXRoIG1vZF9zdGF0dXMuCiAgICAgW0FsZXhlaSBLb3N1dF0gUFIgIzEwOTQKCiAgKikgKlJlYWxseSogZGlzYWJsZSBhbGwgbW9kX3Jld3JpdGUgb3BlcmF0aW9ucyBpZiB0aGUgZW5naW5lIGlzIG9mZi4KICAgICBTb21lIHRoaW5ncyAobGlrZSBSZXdyaXRlTWFwcykgd2VyZSBjaGVja2VkL3BlcmZvcm1lZCBldmVuIGlmIHRoZXkKICAgICB3ZXJlbid0IHN1cHBvc2VkIHRvIGJlLiAgW0tlbiBDb2FyXSBQUiAjOTkxCgogICopIEltcGxlbWVudCBhIG5ldyB0aW1lciBzY2hlbWUgd2hpY2ggZWxpbWluYXRlcyB0aGUgbmVlZCB0byBjYWxsIGFsYXJtKCkgYWxsCiAgICAgdGhlIHRpbWUuICBJbnN0ZWFkIGEgY291bnRlciBpbiB0aGUgc2NvcmVib2FyZCBmb3IgZWFjaCBjaGlsZCBpcyB1c2VkIHRvCiAgICAgc2hvdyB3aGVuIHRoZSBjaGlsZCBoYXMgbWFkZSBmb3J3YXJkIHByb2dyZXNzLiAgVGhlIHBhcmVudCBzYW1wbGVzIHRoaXMKICAgICBjb3VudGVyIGV2ZXJ5IHNjb3JlYm9hcmQgbWFpbnRlbmFuY2UgY3ljbGUsIGFuZCBpc3N1ZXMgU0lHQUxSTSBpZiBubwogICAgIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgaW4gdGhlIHRpbWVvdXQgcGVyaW9kLiAgVGhpcyByZWR1Y2VzIHRoZSBzdGF0aWMKICAgICByZXF1ZXN0IGJlc3QtY2FzZSBzeXNjYWxsIGNvdW50IHRvIDIyIGZyb20gMjkuICBUaGlzIHNjaGVtZSBpcyBvbmx5CiAgICAgdXNlZCBieSBzeXN0ZW1zIHdpdGggbWVtb3J5LWJhc2VkIHNjb3JlYm9hcmRzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBUaGUgcHJveHkgbm93IHByb3Blcmx5IGhhbmRsZXMgQ09OTkVDVCByZXF1ZXN0cyB3aGljaCBhcmUgc2VudAogICAgIHRvIHByb3h5IHNlcnZlcnMgd2hlbiB1c2luZyBQcm94eVJlbW90ZS4gIFtNYXJjIFNsZW1rb10gUFIjMTAyNAoKICAqKSBBIHNjcmlwdCBjYWxsZWQgYXBhY2hlY3RsIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBzdXBwb3J0IAogICAgIGRpcmVjdG9yeS4gIFRoaXMgc2NyaXB0IGFsbG93cyB5b3UgdG8gZG8gdGhpbmdzIHN1Y2ggYXMgCiAgICAgImFwYWNoZWN0bCBzdGFydCIgYW5kICJhcGFjaGVjdGwgcmVzdGFydCIgZnJvbSB0aGUgY29tbWFuZAogICAgIGxpbmUuICBbTWFyYyBTbGVta29dCgogICopIE1vZHVsZXMgYW5kIGNvcmUgcm91dGluZXMgYXJlIG5vdyBwdXQgaW50byBsaWJyYXJpZXMsIHdoaWNoCiAgICAgc2ltcGxpZmllcyB0aGUgbGluayBsaW5lIHRyZW1lbmRvdXNseSAoYW1vbmcgb3RoZXIgYWR2YW50YWdlcykuCiAgICAgW1BhdWwgU3V0dG9uXQoKICAqKSBTb21lIG9mIHRoZSBNRDUgbmFtZXMgZGVmaW5lZCBpbiBBcGFjaGUgaGF2ZSBiZWVuIHJlbmFtZWQgdG8gaGF2ZQogICAgIGFuIGBhcF8nIHByZWZpeCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCByb3V0aW5lcyBzdXBwbGllZCBieQogICAgIGV4dGVybmFsIGxpYnJhcmllcy4gIFtLZW4gQ29hcl0KCiAgKikgUmVtb3ZhbCBvZiBtb2RfYXV0aF9tc3FsLmMgZnJvbSB0aGUgZGlzdHJpYnV0aW9uLiBUaGVyZSBhcmUgbWFueQogICAgIG90aGVyIG9wdGlvbnMgZm9yIGRhdGFiYXNlcyB0b2RheS4gUmF0aGVyIHRoYW4gb2ZmZXIgb25lIG9wdGlvbiwKICAgICBvZmZlciBub25lIGF0IHRoaXMgdGltZS4gbW9kX2F1dGhfbXNxbCBhbmQgb3RoZXIgU1FMIGRhdGFiYXNlCiAgICAgYXV0aGVudGljYXRpb24gbW9kdWxlcyBjYW4gYmUgZm91bmQgYXQgdGhlIEFwYWNoZSBNb2R1bGUgUmVnaXN0cnkuCiAgICAgaHR0cDovL21vZHVsZXMuYXBhY2hlLm9yZy8gSXQgd291bGQgYmUgbmljZSB0byBvZmZlciBhIGdlbmVyaWMKICAgICBtb2RfYXV0aF9zcWwgb3B0aW9uIGluIHRoZSBuZWFyIGZ1dHVyZS4KCiAgKikgUE9SVDogQmVPUyBzdXBwb3J0IGFkZGVkIFtBbGV4ZWkgS29zdXRdCgogICopIENvbmZpZ3VyZSBubyBsb25nZXIgYWNjZXB0cyB0aGUgLW1ha2Ugb3B0aW9uLCBzaW5jZSBpdCBjcmVhdGVzCiAgICAgTWFrZWZpbGUgb24gdGhlIGZseSBiYXNlZCBvbiBNYWtlZmlsZS50bXBsIGFuZCBDb25maWd1cmF0aW9uLgoKICAqKSBBcGFjaGUgbm93IGdyYWNlZnVsbHkgc2h1dHMgZG93biB3aGVuIGl0IHJlY2VpdmVzIGEgU0lHVEVSTSwgaW5zdGVhZAogICAgIG9mIGZvcmNpYmx5IGtpbGxpbmcgb2ZmIGFsbCBpdHMgcHJvY2Vzc2VzIGFuZCBleGl0aW5nIHdpdGhvdXQKICAgICBjbGVhbmluZyB1cC4gW0FsZXhlaSBLb3N1dF0KCiAgKikgQVBJOiBBIG5ldyBmaWVsZCBpbiB0aGUgcmVxdWVzdF9yZWMsIHItPm10aW1lLCBoYXMgYmVlbiBhZGRlZCB0bwogICAgIGF2b2lkIGdyYXR1aXRvdXMgcGFyc2luZyBvZiBkYXRlIHN0cmluZ3MuICBJdCBpcyBpbnRlbmRlZCB0byBob2xkCiAgICAgdGhlIGxhc3QtbW9kaWZpZWQgZGF0ZSBvZiB0aGUgcmVzb3VyY2UgKGlmIGFwcGxpY2FibGUpLiAgQW4KICAgICB1cGRhdGVfbXRpbWUoKSByb3V0aW5lIGhhcyBhbHNvIGJlZW4gYWRkZWQgdG8gYWR2YW5jZSBpdCBpZgogICAgIGFwcHJvcHJpYXRlLiAgW1JveSBGaWVsZGluZywgS2VuIENvYXJdCgogICopIFNFQ1VSSVRZOiBJZiBhIGh0YWNjZXNzIGZpbGUgY2FuIG5vdCBiZSByZWFkIGR1ZSB0byBiYWQgcGVybWlzc2lvbnMsCiAgICAgZGVueSBhY2Nlc3MgdG8gdGhlIGRpcmVjdG9yeSB3aXRoIGEgSFRUUF9GT1JCSURERU4uICBUaGUgcHJldmlvdXMKICAgICBiZWhhdmlvciB3YXMgdG8gaWdub3JlIHRoZSBodGFjY2VzcyBmaWxlIGlmIGl0IGNvdWxkIG5vdCBiZSByZWFkLgogICAgIFRoaXMgY2hhbmdlIG1heSBtYWtlIHNvbWUgc2V0dXBzIHdpdGggdW5yZWFkYWJsZSBodGFjY2VzcyBmaWxlcwogICAgIHN0b3Agd29ya2luZy4gIFtNYXJjIFNsZW1rb10gUFIjODE3CgogICopIEFkZCBhcGxvZ19lcnJvcigpIHByb3ZpZGluZyBhIG1lY2hhbmlzbSB0byBkZWZpbmUgbGV2ZWxzIG9mCiAgICAgdmVyYm9zaXR5IHRvIHRoZSBzZXJ2ZXIgZXJyb3IgbG9nZ2luZy4gVGhpcyBhZGRpdGlvbiBhbHNvIHByb3ZpZGVzCiAgICAgdGhlIGFiaWxpdHkgdG8gbG9nIGVycm9ycyB1c2luZyBzeXNsb2dkLiBFcnJvciBsb2dnaW5nIGlzIGNvbmZpZ3VyYWJsZQogICAgIG9uIGEgcGVyLXNlcnZlciBiYXNpcyB1c2luZyB0aGUgTG9nTGV2ZWwgZGlyZWN0aXZlLiBDb252ZXJzaW9uCiAgICAgb2YgbG9nXyooKSBpbiBwcm9ncmVzcy4gW1JhbmR5IFRlcmJ1c2hdCgogICopIEZ1cnRoZXIgZW5oYW5jZSBhcGxvZ19lcnJvcigpIHRvIG5vdCBsb2cgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQKICAgICBlcnJubyBpbmZvcm1hdGlvbiB3aGVuIGl0IGlzbid0IGFwcGxpY2FibGUuIFtLZW4gQ29hciwgRGVhbiBHYXVkZXRdCgogICopIFdJTjMyOiBDYW5vbmljYWxpc2UgZmlsZW5hbWVzIHVuZGVyIFdpbjMyLiBTaG9ydCBmaWxlbmFtZXMgYXJlCiAgICAgY29udmVydGVkIHRvIGxvbmcgb25lcy4gQmFja3NsYXNoZXMgYXJlIGNvbnZlcnRlZCB0byBmb3J3YXJkCiAgICAgc2xhc2hlcy4gQ2FzZSBpcyBjb252ZXJ0ZWQgdG8gbG93ZXIuIFBhcnRzIG9mIFVSTHMgdGhhdCBkbyBub3QKICAgICBjb3JyZXNwb25kIHRvIGZpbGVzIGFyZSBsZWZ0IGNvbXBsZXRlbHkgYWxvbmUuIFtCZW4gTGF1cmllXQoKICAqKSBQT1JUOiAyIG5ldyBPU3MgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgcG9ydHM6CiAgICAgIEVuY29yZSdzIFVNQVggVjogQXJpZWggTWFya2VsIDxhbWFya2VsIGVuY29yZS5jb20+CiAgICAgIEFjb3JuIFJJU0NpWDogU3RlcGhlbiBCb3JyaWxsIDxzYm9ycmlsbCB4ZW1wbGFyLmNvLnVrPgoKICAqKSBBZGQgdGhlIHNlcnZlciB2ZXJzaW9uIChTRVJWRVJfVkVSU0lPTiBtYWNybykgdG8gdGhlICJzZXJ2ZXIKICAgICBjb25maWd1cmVkIGFuZCBydW5uaW5nIiBlbnRyeSBpbiB0aGUgZXJyb3JfbG9nLiAgQWxzbyBidWlsZCBhbgogICAgIG9iamVjdCBmaWxlIGF0IGxpbmstdGltZSB0aGF0IGNvbnRhaW5zIHRoZSBjdXJyZW50IHRpbWUKICAgICAoU0VSVkVSX0JVSUxUIGdsb2JhbCBjb25zdCBjaGFyW10pLCBhbmQgaW5jbHVkZSB0aGF0IGluIHRoZQogICAgIG1lc3NhZ2UuICBbS2VuIENvYXJdCgogICopIFNldCByLT5oZWFkZXJzX291dCB3aGVuIHNlbmRpbmcgcmVzcG9uc2VzIGZyb20gdGhlIHByb3h5LgogICAgIFRoaXMgZml4ZXMgdGhpbmdzIHN1Y2ggYXMgdGhlIGxvZ2dpbmcgb2YgaGVhZGVycyBzZW50IGZyb20KICAgICB0aGUgcHJveHkuICBbTWFyYyBTbGVta29dIFBSIzY1OQoKICAqKSBzdXBwb3J0L2h0dHBkX21vbml0b3IgaXMgbm8gbG9uZ2VyIGRpc3RyaWJ1dGVkIGJlY2F1c2UgdGhlIAogICAgIHNjb3JlYm9hcmQgc2hvdWxkIG5vdCBiZSBmaWxlIGJhc2VkIGlmIGF0IGFsbCBwb3NzaWJsZS4gVXNlCiAgICAgbW9kX3N0YXR1cyB0byBzZWUgY3VycmVudCBzZXJ2ZXIgc25hcHNob3QuCgogICopIChzZXRfZmlsZV9zbG90KTogTmV3IGZ1bmN0aW9uLCBhbGxvd2luZyBhdXRoIGRpcmVjdGl2ZXMgdG8gYmUKICAgICBpbmRlcGVuZGVudCBvZiB0aGUgc2VydmVyIHJvb3QsIHNvIHRoZSBzZXJ2ZXIgZG9jdW1lbnRzIGNhbiBiZQogICAgIG1vdmVkIHRvIGEgZGlmZmVyZW50IGRpcmVjdG9yeSBvciBtYWNoaW5lIG1vcmUgZWFzaWx5LgogICAgIFtEYXZpZCBKLiBNYWNLZW56aWVdCgogICopIElmIG5vIFRyYW5zZmVyTG9nIGlzIGdpdmVuIGV4cGxpY2l0bHksIGRlY2xpbmUKICAgICB0byBsb2cuICBUaGlzIHN1cHBvcnRzIGNvZXhpc3RlbmNlIHdpdGggb3RoZXIgbG9nZ2luZyBtb2R1bGVzLAogICAgIHN1Y2ggYXMgdGhlIGN1c3RvbSBvbmUgdGhhdCBVVU5FVCB1c2VzLiBbRGF2aWQgSi4gTWFjS2VuemllXQoKICAqKSBDaGVjayBmb3IgdGl0bGVzIGluIHNlcnZlci1wYXJzZWQgSFRNTCBmaWxlcy4KICAgICBJZ25vcmUgbGVhZGluZyBuZXdsaW5lcyBhbmQgcmV0dXJucyBpbiB0aXRsZXMuICBUaGUgb2xkIGJlaGF2aW9yCiAgICAgb2YgcmVwbGFjaW5nIGEgbmV3bGluZSBhZnRlciA8dGl0bGU+IHdpdGggYSBzcGFjZSBjYXVzZXMgdGhlCiAgICAgdGl0bGUgdG8gYmUgbWlzYWxpZ25lZCBpbiB0aGUgbGlzdGluZy4gW0RhdmlkIEouIE1hY0tlbnppZV0KCiAgKikgQ2hhbmdlIG1vZF9jZXJuX21ldGEgdG8gYmUgY29uZmlndXJhYmxlIG9uIGEgcGVyLWRpcmVjdG9yeSBiYXNpcy4KICAgICBbRGF2aWQgSi4gTWFjS2VuemllXQoKICAqKSBBZGQgJ0luY2x1ZGUnIGRpcmVjdGl2ZSB0byBhbGxvdyBpbmNsdXNpb24gb2YgY29uZmlndXJhdGlvbgogICAgIGZpbGVzIHdpdGhpbiBjb25maWd1cmF0aW9uIGZpbGVzLiBbUmFuZHkgVGVyYnVzaF0KCiAgKikgUHJveHkgZXJyb3JzIG9uIGNvbm5lY3QoKSBhcmUgbG9nZ2VkIHRvIHRoZSBlcnJvcl9sb2cgKG5vdGhpbmcKICAgICBuZXcpOyBub3cgdGhleSBpbmNsdWRlIHRoZSBJUCBhZGRyZXNzIGFuZCBwb3J0IHRoYXQgZmFpbGVkCiAgICAgKCp0aGF0J3MqIG5ldykuICAgW0tlbiBDb2FyLCBNYXJjIFNsZW1rb10gUFIjMzUyCgogICopIFZhcmlvdXMgYXJjaGl0ZWN0dXJlcyBub3cgZGVmaW5lIFVTRV9NTUFQX0ZJTEVTIHdoaWNoIGNhdXNlcwogICAgIHRoZSBzZXJ2ZXIgdG8gdXNlIG1tYXAoKSBmb3Igc3RhdGljIGZpbGVzLiAgVGhlcmUgYXJlIHR3bwogICAgIGNvbXBpbGUtdGltZSB0dW5hYmxlcyBNTUFQX1RIUkVTSE9MRCAobWluaW11bSBudW1iZXIgb2YgYnl0ZXMKICAgICByZXF1aXJlZCB0byB1c2UgbW1hcCgpLCBkZWZhdWx0IGlzIDApLCBhbmQgTU1BUF9TRUdNRU5UX1NJWkUgKG1heGltdW0KICAgICBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbiBvbmUgY3ljbGUgZnJvbSBhIHNpbmdsZSBtbWFwKClkIG9iamVjdCwKICAgICBkZWZhdWx0IDMyNzY4KS4gIFtEZWFuIEdhdWRldF0KCiAgKikgQVBJOiBBZGRlZCBwb3N0X3JlYWRfcmVxdWVzdCBBUEkgcGhhc2Ugd2hpY2ggaXMgcnVuIHJpZ2h0IGFmdGVyIHJlYWRpbmcKICAgICB0aGUgcmVxdWVzdCBmcm9tIGEgY2xpZW50LCBvciByaWdodCBhZnRlciBhbiBpbnRlcm5hbCByZWRpcmVjdC4gIEl0IGlzCiAgICAgdXNlZnVsIGZvciBtb2R1bGVzIHNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgZGVwZW5kIG9ubHkgb24KICAgICB0aGUgaGVhZGVycy9jb250ZW50cyBvZiB0aGUgcmVxdWVzdC4gIEl0IGRvZXMgbm90IHJ1biBkdXJpbmcgc3VicmVxdWVzdHMKICAgICBiZWNhdXNlIHN1YnJlcXVlc3RzIGluaGVyaXQgcHJldHR5IG11Y2ggZXZlcnl0aGluZyBmcm9tIHRoZSBtYWluCiAgICAgcmVxdWVzdC4gW0RlYW4gR2F1ZGV0XQoKICAqKSBBZGRlZCBtb2RfdW5pcXVlX2lkIHdoaWNoIGlzIHVzZWQgdG8gZ2VuZXJhdGUgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IKICAgICBlYWNoIGhpdCwgYXZhaWxhYmxlIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBVTklRVUVfSUQuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBpbml0X21vZHVsZXMgaXMgbm93IGNhbGxlZCBhZnRlciB0aGUgZXJyb3IgbG9ncyBoYXZlIGJlZW4gb3BlbmVkLiAgVGhpcwogICAgIGFsbG93cyBtb2R1bGVzIHRvIGVtaXQgaW5mb3JtYXRpb24gbWVzc2FnZXMgaW50byB0aGUgZXJyb3IgbG9ncy4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIEZpeGVkIHByb3h5LXBhc3MtdGhyb3VnaCBmZWF0dXJlIG9mIG1vZF9yZXdyaXRlOyBBZGRlZCBlcnJvciBsb2dnaW5nCiAgICAgaW5mb3JtYXRpb24gZm9yIGNhc2Ugd2hlcmUgcHJveHkgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUuIFtNYXJjIFNsZW1rb10KCiAgKikgUE9SVDogQXBhY2hlIGhhcyBuZWVkIGZvciBtdXRleGVzIHRvIHNlcmlhbGl6ZSBpdHMgY2hpbGRyZW4gYXJvdW5kCiAgICAgYWNjZXB0LiAgSW4gcHJpb3IgdmVyc2lvbnMgZWl0aGVyIGZjbnRsIGZpbGUgbG9ja2luZyBvciBmbG9jayBmaWxlCiAgICAgbG9ja2luZyB3ZXJlIHVzZWQuICBUaGUgbWV0aG9kIGlzIGNob3NlbiBieSB0aGUgZGVmaW5pdGlvbiBvZgogICAgIFVTRV94eHhfU0VSSUFMSVpFRF9BQ0NFUFQgaW4gY29uZi5oLiAgeHh4IGlzIEZDTlRMIGZvciBmY250bCgpLAogICAgIGFuZCBGTE9DSyBmb3IgZmxvY2soKS4gIE5ldyBvcHRpb25zIGhhdmUgYmVlbiBhZGRlZDoKICAgICAgICAtIFNZU1ZTRU0gdG8gdXNlIFN5c3RlbSBWIHN0eWxlIHNlbWFwaG9yZXMKICAgICAgICAtIFBUSFJFQUQgdG8gdXNlIFBPU0lYIHRocmVhZHMgKGFwcGVhcnMgdG8gd29yayBvbiBTb2xhcmlzIG9ubHkpCiAgICAgICAgLSBVU0xPQ0sgdG8gdXNlIElSSVggdXNsb2NrCiAgICAgQmFzZWQgb24gdGltaW5nIHZhcmlvdXMgdGVjaG5pcXVlcywgdGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZQogICAgIHRvIHRoZSBkZWZhdWx0czoKICAgICAgICAtIExpbnV4IDIueCB1c2VzIGZsb2NrIGluc3RlYWQgb2YgZmNudGwKICAgICAgICAtIFNvbGFyaXMgMi54IHVzZXMgcHRocmVhZHMKICAgICAgICAtIElSSVggdXNlcyBTeXNWIHNlbWFwaG9yZXMgLS0gaG93ZXZlciBtdWx0aXByb2Nlc3NvciBJUklYIGJveGVzCiAgICAgICAgICB3b3JrIGZhciBmYXN0ZXIgaWYgeW91IC1EVVNFX1VTTE9DS19TRVJJQUxJWkVEX0FDQ0VQVAogICAgIFtEZWFuIEdhdWRldCwgUGllcnJlLVl2ZXMgS2VyZW1iZWxsZWMgPFBpZXJyZS1ZdmVzLktlcmVtYmVsbGVjIHZ0Y29tLmZyPiwKICAgICBNYXJ0aWpuIEtvc3RlciA8bS5rb3N0ZXIgcG9ib3guY29tPl0KCiAgKikgUE9SVDogVGhlIHNlbWFudGljcyBvZiBhY2NlcHQvc2VsZWN0IG1ha2UgaXQgdmVyeSBkZXNpcmFibGUgdG8gdXNlCiAgICAgbXV0ZXhlcyB0byBzZXJpYWxpemUgYWNjZXB0IHdoZW4gbXVsdGlwbGUgTGlzdGVucyBhcmUgaW4gdXNlLiAgQnV0CiAgICAgaW4gdGhlIGNhc2Ugd2hlcmUgb25seSBhIHNpbmdsZSBzb2NrZXQgaXMgb3BlbiBpdCBpcyBzb21ldGltZXMKICAgICByZWR1bmRhbnQgdG8gc2VyaWFsaXplIGFjY2VwdCgpLiAgTm90IGFsbCB1bml4ZXMgZG8gYSBnb29kIGpvYiB3aXRoCiAgICAgcG90ZW50aWFsbHkgZG96ZW5zIG9mIGNoaWxkcmVuIGJsb2NrZWQgb24gYWNjZXB0KCkgb24gdGhlIHNhbWUKICAgICBzb2NrZXQuICBJdCdzIG5vdyBwb3NzaWJsZSB0byBkZWZpbmUgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUIGFuZAogICAgIHRoZSBzZXJ2ZXIgd2lsbCBhdm9pZCBzZXJpYWxpemF0aW9uIHdoZW4gbGlzdGVuaW5nIG9uIG9ubHkgb25lIHNvY2tldCwKICAgICBhbmQgdXNlIHNlcmlhbGl6YXRpb24gd2hlbiBsaXN0ZW5pbmcgb24gbXVsdGlwbGUgc29ja2V0cy4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzQ2NwoKICAqKSBDb25maWd1cmUgY2hhbmdlczogVGVzdExpYiByZXBsYWNlZCBieSBUZXN0Q29tcGlsZSwgd2hpY2ggaGFzCiAgICAgc29tZSBhZGRpdGlvbmFsIGNhcGFiaWxpdHkgKHN1Y2ggYXMgZG9pbmcgYSBzYW5pdHkgY2hlY2sgb2YKICAgICB0aGUgY29tcGlsZXIgYW5kIGZsYWdzIHNlbGVjdGVkKTsgdGhlIHZlcnNpb24gb2YgU29sYXJpcyBpcyBub3cKICAgICBhdmFpbGFibGUgdmlhIHRoZSAjZGVmaW5lIHZhbHVlIG9mIFNPTEFSSVMyOyBJUklYIG4zMmJpdCBsaWJzCiAgICAgbm93IHN1cHBvcnRlZCBhbmQgc2VsZWN0YWJsZSBieSBuZXcgQ29uZmlndXJhdGlvbiBSdWxlOiBJUklYTjMyOwogICAgIFdlIG5vIGxvbmdlciBkZWZhdWx0IHRvIC1PMiBvcHRpbWl6YXRpb24uICBbSmltIEphZ2llbHNraV0KCiAgKikgVXBkYXRlZCBDb25maWd1cmU6IENvbmZpZ3VyYXRpb24gbm93IHVzZXMgQWRkTW9kdWxlIHRvIHNwZWNpZnkKICAgICBtb2R1bGUgc291cmNlIG9yIGJpbmFyeSBmaWxlIGxvY2F0aW9uLCByZWxhdGl2ZSB0byBzcmMgZGlyZWN0b3J5LgogICAgIE1vZHVsZXMgY2FuIGJlIGRyb3BwZWQgaW50byBtb2R1bGVzL2V4dHJhLCBvciBpbiB0aGVpciBvd24gCiAgICAgZGlyZWN0b3J5LCBhbmQgbW9kdWxlcyBjYW4gY29tZSB3aXRoIGEgTWFrZWZpbGUgb3IgQ29uZmlndXJlIGNhbiAKICAgICBjcmVhdGUgb25lLiAgTW9kdWxlcyBjYW4gYWRkIGNvbXBpbGVyIG9yIGxpYnJhcnkgaW5mb3JtYXRpb24gdG8gCiAgICAgZ2VuZXJhdGVkIE1ha2VmaWxlcy4gW1BhdWwgU3V0dG9uXQoKICAqKSBTb3VyY2UgY29yZSByZS1vcmdhbmlzYXRpb246IGRpc3RyaWJ1dGVkIG1vZHVsZXMgYXJlIG5vdyBpbiAKICAgICBtb2R1bGVzL3N0YW5kYXJkLiBBbGwgb3RoZXIgc291cmNlIGNvZGUgaXMgaW4gbWFpbi4gT1Mtc3BlY2lmaWMKICAgICBjb2RlIGlzIGluIG9zL3t1bml4LGVteCx3aW4zMn0gZGlyZWN0b3JpZXMuIFtQYXVsIFN1dHRvbl0KCiAgKikgbW9kX2Jyb3dzZXIgaGFzIGJlZW4gcmVtb3ZlZCwgc2luY2UgaXQncyByZXBsYWNlZCBieSBtb2Rfc2V0ZW52aWYuCiAgICAgW0tlbiBDb2FyXQoKICAqKSBGaXggYW5vdGhlciBsb25nLXN0YW5kaW5nIGJ1ZyBpbiBzdWJfcmVxX2xvb2t1cF9maWxlIHdoZXJlIGl0IHdvdWxkCiAgICAgaGFwcGlseSBza2lwIHBhc3QgYWNjZXNzIGNoZWNrcyBvbiBzdWJkaXJlY3RvcmllcyBsb29rZWQgdXAgd2l0aAogICAgIHJlbGF0aXZlIHBhdGhzLiAgKEl0J3MgdXNlZCBieSBtb2RfZGlyLCBtb2RfbmVnb3RpYXRpb24sCiAgICAgYW5kIG1vZF9pbmNsdWRlLikgW0RlYW4gR2F1ZGV0XQoKICAqKSBkaXJlY3Rvcnlfd2FsayBvcHRpbWl6YXRpb24gdG8gcmVkdWNlIGFuIE8oTipNKSBsb29wIHRvIE8oTitNKSB3aGVyZQogICAgIE4gaXMgdGhlIG51bWJlciBvZiA8RGlyZWN0b3J5PiBzZWN0aW9ucywgYW5kIE0gaXMgdGhlIG51bWJlciBvZgogICAgIGNvbXBvbmVudHMgaW4gdGhlIGZpbGVuYW1lIG9mIGFuIG9iamVjdC4KCiAgICAgVG8gYWNoaWV2ZSB0aGlzIG9wdGltaXphdGlvbiB0aGUgZm9sbG93aW5nIGNvbmZpZyBjaGFuZ2VzIHdlcmUgbWFkZToKICAgICAgICAtIFdpbGRjYXJkcyAoKiBhbmQgPywgbm90IHRoZSByZWdleCBmb3JtcykgaW4gPERpcmVjdG9yeT5zLAogICAgICAgICAgPEZpbGVzPnMsIGFuZCA8TG9jYXRpb24+cyBub3cgdHJlYXQgYSBzbGFzaCBhcyBhIHNwZWNpYWwKICAgICAgICAgIGNoYXJhY3Rlci4gIEZvciBleGFtcGxlICIvaG9tZS8qL3B1YmxpY19odG1sIiBwcmV2aW91c2x5IHdvdWxkCiAgICAgICAgICBtYXRjaCAiL2hvbWUvYS9hbmRyZXcvcHVibGljX2h0bWwiLCBub3cgaXQgb25seSBtYXRjaGVzIHRoaW5ncwogICAgICAgICAgbGlrZSAiL2hvbWUvYm9iL3B1YmxpY19odG1sIi4gIFRoaXMgbWltaWNzIC9iaW4vc2ggYmVoYXZpb3VyLgogICAgICAgIC0gSXQncyBwb3NzaWJsZSBub3cgdG8gdXNlIFtdIHdpbGRjYXJkaW5nIGluIDxEaXJlY3Rvcnk+LCA8RmlsZXM+CiAgICAgICAgICBvciA8TG9jYXRpb24+LgogICAgICAgIC0gUmVnZXggPERpcmVjdG9yeT5zIGFyZSBhcHBsaWVkIGFmdGVyIGFsbCBub24tcmVnZXggPERpcmVjdG9yeT5zLgoKICAgIFtEZWFuIEdhdWRldF0KCiAgKikgRml4IGEgYnVnIGludHJvZHVjZWQgaW4gMS4zYTEgZGlyZWN0b3J5X3dhbGsgcmVnYXJkaW5nIC5odGFjY2VzcyBmaWxlcwogICAgIGFuZCBjb3JydXB0ZWQgcGF0aHMuICBbRGVhbiBHYXVkZXRdCgogICopIEVuaGFuY2VkIGFuZCBjbGVhbmVkIHVwIHRoZSBVUkwgcmV3cml0aW5nIGVuZ2luZSBvZiBtb2RfcmV3cml0ZToKICAgICBGaXJzdCB0aGUgZ3JvdXBlZCBwYXJ0cyBvZiBSZXdyaXRlUnVsZSBwYXR0ZXJuIG1hdGNoZXMgKHBhcmVudGhlc2lzISkgY2FuCiAgICAgYmUgYWNjZXNzZWQgbm93IHZpYSBiYWNrcmVmZXJlbmNlcyAkMS4uJDkgaW4gUmV3cml0ZUNvbmRzIHRlc3QtYWdhaW5zdAogICAgIHN0cmluZ3MgaW4gYWRkaXRpb24gdG8gUmV3cml0ZVJ1bGVzIHN1YnN0IHN0cmluZy4gU2Vjb25kIHRoZSBncm91cGVkCiAgICAgcGFydHMgb2YgUmV3cml0ZUNvbmQgcGF0dGVybiBtYXRjaGVzIChwYXJlbnRoZXNpcyEpIGNhbiBiZSBhY2Nlc3NlZCBub3cKICAgICB2aWEgYmFja3JlZmVyZW5jZXMgJTEuLiU5IGJvdGggaW4gZm9sbG93aW5nIFJld3JpdGVDb25kIHRlc3QtYWdhaW5zdAogICAgIHN0cmluZ3MgYW5kIFJld3JpdGVSdWxlcyBzdWJzdCBzdHJpbmcuIFRoaXMgcHJvdmlkZXMgbWF4aW11bSBmbGV4aWJpbGl0eQogICAgIHRocm91Z2ggdGhlIHVzZSBvZiBiYWNrcmVmZXJlbmNlcy4KICAgICBBZGRpdGlvbmFsbHkgdGhlIHJld3JpdGluZyBlbmdpbmUgd2FzIGNsZWFuZWQgdXAgYnkgcHV0dGluZyBjb21tb24KICAgICBjb2RlIHRvIHRoZSBuZXcgZXhwYW5kX2JhY2tyZWZzX2luYnVmZmVyKCkgZnVuY3Rpb24uIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBXaGVuIG1lcmdpbmcgdGhlIG1haW4gc2VydmVyJ3MgPERpcmVjdG9yeT4gYW5kIDxMb2NhdGlvbj4gc2VjdGlvbnMgaW50bwogICAgIGEgdmhvc3QsIHB1dCB0aGUgbWFpbiBzZXJ2ZXIncyBmaXJzdCBhbmQgdGhlIHZob3N0J3Mgc2Vjb25kLiAgT3RoZXJ3aXNlCiAgICAgdGhlIHZob3N0IGNhbid0IG92ZXJyaWRlIHRoZSBtYWluIHNlcnZlci4gIFtEZWFuIEdhdWRldF0gUFIjNzE3CgogICopIFRoZSA8RGlyZWN0b3J5PiBjb2RlIHdvdWxkIG1lcmdlIGFuZCByZS1tZXJnZSB0aGUgc2FtZSBzZWN0aW9uIGFmdGVyCiAgICAgYSBtYXRjaCB3YXMgZm91bmQsIHBvc3NpYmx5IGNhdXNpbmcgcHJvYmxlbXMgd2l0aCBzb21lIG1vZHVsZXMuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBpcC1iYXNlZCB2aG9zdHMgYXJlIHN0b3JlZCBhbmQgcXVlcmllZCB1c2luZyBhIGhhc2hpbmcgZnVuY3Rpb24sIHdoaWNoCiAgICAgaGFzIGJlZW4gc2hvd24gdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBvbiBzZXJ2ZXJzIHdpdGggbWFueSBpcC12aG9zdHMuCiAgICAgU29tZSBvdGhlciBjaGFuZ2VzIGhhZCB0byBiZSBtYWRlIHRvIGFjY29tbW9kYXRlIHRoaXM6CiAgICAgICAgLSB0aGUgKiBhZGRyZXNzIGZvciB2aG9zdHMgbm93IGJlaGF2ZXMgbGlrZSBfZGVmYXVsdF8KICAgICAgICAtIHRoZSBtYXRjaGluZyBwcm9jZXNzIG5vdyBpczoKICAgICAgICAgICAgLSBtYXRjaCBhbiBpcC12aG9zdCBkaXJlY3RseSB2aWEgaGFzaCAocG9zc2libHkgbWF0Y2hlcyBtYWluCiAgICAgICAgICAgICAgc2VydmVyKQogICAgICAgICAgICAtIGlmIHRoYXQgZmFpbHMsIGp1c3QgcHJldGVuZCBpdCBtYXRjaGVkIHRoZSBtYWluIHNlcnZlcgogICAgICAgICAgICAtIGlmIHNvIGZhciBvbmx5IHRoZSBtYWluIHNlcnZlciBoYXMgYmVlbiBtYXRjaGVkLCBwZXJmb3JtCiAgICAgICAgICAgICAgbmFtZS1iYXNlZCBsb29rdXBzIChTZXJ2ZXJOYW1lLCBTZXJ2ZXJBbGlhcywgU2VydmVyUGF0aCkKICAgICAgICAgICAgICAqb25seSBvbiBuYW1lLWJhc2VkIHZob3N0cyoKICAgICAgICAgICAgLSBpZiB0aGV5IGZhaWwsIGxvb2sgZm9yIF9kZWZhdWx0XyB2aG9zdHMKICAgICBbRGVhbiBHYXVkZXQsIERhdmUgSGFua2lucyA8ZGhhbmtpbnMgc3VnYXJhdC5uZXQ+XQoKICAqKSBkYm1tYW5hZ2Ugb3ZlcmhhdWw6CiAgICAgLSBtZXJnZSBkYm1tYW5hZ2UgYW5kIGRibW1hbmFnZS5uZXcgZnVuY3Rpb25hbGl0eSwgcmVtb3ZlIGRibW1hbmFnZS5uZXcgCiAgICAgLSB0aWUoKSB0byBBbnlEQk1fRmlsZSB3aGljaCB3aWxsIHVzZSBvbmUgb2YgREJfRmlsZSwgTkRCTV9GaWxlIG9yCiAgICAgICBHREJNX0ZpbGUgKC1sZGIsIC1sbmRibSwgLWxnZGJtKSAodHJ5aW5nIGVhY2ggaW4gdGhhdCBvcmRlcikKICAgICAtIHByb3ZpZGUgYmV0dGVyIHNlZWQgZm9yIHJhbmQKICAgICAtIHByb21wdCBmb3IgcGFzc3dvcmQgYXMgcGVyIGdldHBhc3MoMykgKHR1cm4gb2ZmIGVjaG8sIHJlYWQgZnJvbQogICAgICAgL2Rldi90dHksIGV0Yy4pCiAgICAgLSB1c2UgIm5ld3N0eWxlIiBjcnlwdCBiYXNlZCBvbiAkQ29uZmlne29zbmFtZX0gKCReTykKICAgICAtIHdpbGwgbm90IGFkZCBhIHVzZXIgaWYgYWxyZWFkeSBpbiBkYXRhYmFzZSwgdXNlIG5ldyBgdXBkYXRlJyBjb21tYW5kCiAgICAgICBpbnN0ZWFkCiAgICAgLSBhZGRlZCBgY2hlY2snIGNvbW1hbmQgdG8gY2hlY2sgYSB1c2VycycgcGFzc3dvcmQKICAgICAtIGFkZGVkIGBpbXBvcnQnIGNvbW1hbmQgdG8gY29udmVydCBleGlzdGluZyBwYXNzd29yZCB0ZXh0LWZpbGVzIG9yIAogICAgICAgZGJtIGZpbGVzIGV4cG9ydGVkIHdpdGggYHZpZXcnCiAgICAgLSBtb3JlIGRlc2NyaXB0aXZlIHVzYWdlLCBnZW5lcmFsIGNsZWFudXAsICd1c2Ugc3RyaWN0JyBjbGVhbiwgZXRjLgogICAgIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIEFkZGVkIHBzb2NrZXQoKSB3aGljaCBpcyBhIHBvb2wgZm9ybSBvZiBzb2NrZXQoKSwgdmFyaW91cyBwbGFjZXMgd2l0aGluCiAgICAgdGhlIHByb3h5IHdlcmVuJ3QgcHJvcGVybHkgYmxvY2tpbmcgYWxhcm1zIHdoaWxlIHJlZ2lzdGVyaW5nIHRoZSBjbGVhbnVwCiAgICAgZm9yIGl0cyBzb2NrZXRzLiAgYmNsb3NlKCkgbm93IHVzZXMgcGNsb3NlKCkgYW5kIHBjbG9zZXNvY2tldCgpLiAgVGhlcmUKICAgICB3YXMgYSBidWcgd2hlcmUgdGhlIGNsaWVudCBzb2NrZXQgd2FzIGJlaW5nIGNsb3NlKClkIHR3aWNlIGR1ZSBhIHN0aWxsCiAgICAgcmVnaXN0ZXJlZCBjbGVhbnVwLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBIGZldyBjbGVhbnVwcyB3ZXJlIG1hZGUgdG8gcmVkdWNlIHRpbWUoKSwgZ2V0cGlkKCksIGFuZCBzaWduYWwoKSBjYWxscy4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIFBPUlQ6IEFJWCA+PSA0LjIgcmVxdWlyZXMgLWxtIGR1ZSB0byBsaWJjIGNoYW5nZXMuCiAgICAgW0phc29uIFZlbm5lciA8amFzb24gaWRpb20uY29tPl0gUFIjNjY3CgogICopIEVuYWJsZSBgYD0iIicnIGZvciBSZXdyaXRlQ29uZCBkaXJlY3RpdmVzIHRvIG1hdGNoIGFnYWluc3QKICAgICB0aGUgZW1wdHkgc3RyaW5nLiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgd2F5IGluc3RlYWQgb2YgYGBeJCcnLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXhlZCBhbiBpbmZpbml0ZSBsb29wIGluIG1vZF9pbWFwIGZvciByZWZlcmVuY2VzIGFib3ZlIHRoZSBzZXJ2ZXIgcm9vdAogICAgIFtEZWFuIEdhdWRldF0gUFIjNzQ4CgogICopIG1vZF9wcm94eSBub3cgaGFzIGEgUmVjZWl2ZUJ1ZmZlclNpemUgZGlyZWN0aXZlLCBzaW1pbGFyIHRvCiAgICAgU2VuZEJ1ZmZlclNpemUsIHNvIHRoYXQgdGhlIFRDUCB3aW5kb3cgY2FuIGJlIHNldCBhcHByb3ByaWF0ZWx5CiAgICAgZm9yIExGTnMuIFtQaGlsbGlwIEEuIFByaW5kZXZpbGxlXQoKICAqKSBtb2RfYnJvd3NlciBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgbW9yZSBnZW5lcmFsIG1vZF9zZXRlbnZpZgogICAgIChjb3VydGVzeSBvZiBQYXVsIFN1dHRvbikuICBCcm93c2VyTWF0Y2gqIGRpcmVjdGl2ZXMgYXJlIHN0aWxsCiAgICAgYXZhaWxhYmxlLCBidXQgYXJlIG5vdyBqb2luZWQgYnkgU2V0RW52SWYqLCBVblNldEVudklmKiwgYW5kCiAgICAgVW5TZXRFbnZJZlplcm8gZGlyZWN0aXZlcy4gIFtLZW4gQ29hcl0KCiAgKikgIkhvc3RuYW1lTG9va3VwcyBkb3VibGUiIGZvcmNlcyBkb3VibGUtcmV2ZXJzZSBETlMgdG8gc3VjY2VlZCBpbgogICAgIG9yZGVyIGZvciByZW1vdGVfaG9zdCB0byBiZSBzZXQgKGZvciBsb2dnaW5nLCBvciBmb3IgdGhlIGVudiB2YXIKICAgICBSRU1PVEVfSE9TVCkuICBUaGUgb2xkIGRlZmluZSBNQVhJTVVNX0ROUyBoYXMgYmVlbiBkZXByZWNhdGVkLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgbW9kX2FjY2VzcyBvdmVyaGF1bDoKICAgICAtIE5vdyB1bmRlcnN0YW5kcyBuZXR3b3JrL25ldG1hc2sgc3ludGF4IChpLmUuICAxMC4xLjAuMC8yNTUuMjU1LjAuMCkKICAgICAgIGFuZCBjaWRyIHN5bnRheCAoaS5lLiAxMC4xLjAuMC8xNikuICBQUiM3NjIKICAgICAtIENyaXRpY2FsIHBhdGggd2FzIHNwZWQgdXAgYnkgcHJlLWNvbXB1dGluZyBhIGZldyB0aGluZ3MgYXQgY29uZmlnIHRpbWUuCiAgICAgLSBUaGUgdW5kb2N1bWVudGVkIHN5bnRheCAiYWxsb3cgdXNlci1hZ2VudHMiIHdhcyByZW1vdmVkLAogICAgICAgdGhlIHJlcGxhY2VtZW50IGlzICJhbGxvdyBmcm9tIGVudj1mb29iYXIiIGNvbWJpbmVkIHdpdGggbW9kX2Jyb3dzZXIuCiAgICAgLSBXaGVuIHVzZWQgd2l0aCBob3N0bmFtZXMgaXQgbm93IGZvcmNlcyBhIGRvdWJsZS1yZXZlcnNlIGxvb2t1cAogICAgICAgbm8gbWF0dGVyIHdoYXQgdGhlIGRpcmVjdG9yeSBzZXR0aW5ncyBhcmUuICBUaGlzIGRvdWJsZS1yZXZlcnNlCiAgICAgICBkb2Vzbid0IGFmZmVjdCBhbnkgb2YgdGhlIG90aGVyIHJvdXRpbmVzIHRoYXQgdXNlIHRoZSByZW1vdGUKICAgICAgIGhvc3RuYW1lLiAgSW4gcGFydGljdWxhciBpdCdzIHN0aWxsIHBhc3NlZCB0byBDR0lzIGFuZCB0aGUgbG9nCiAgICAgICB3aXRob3V0IHRoZSBkb3VibGUtcmV2ZXJzZSBjaGVjay4gIFJlbGF0ZWQgUFIjODYwLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgV2hlbiBhIGxhcmdlIGJ3cml0ZSgpIG9jY3VycyAobGFyZ2VyIHRoYW4gdGhlIGludGVybmFsIGJ1ZmZlciBzaXplKSwKICAgICB3aGlsZSB0aGVyZSBpcyBhbHJlYWR5IHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyLCBhcGFjaGUgd2lsbCBjb21iaW5lCiAgICAgdGhlIGxhcmdlIHdyaXRlIGFuZCB0aGUgYnVmZmVyIGludG8gYSBzaW5nbGUgd3JpdGV2KCkuICAoVGhpcyBpcwogICAgIGluIGFudGljaXBhdGlvbiBvZiB1c2luZyBtbWFwKCkgZm9yIHJlYWRpbmcgZmlsZXMuKQogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgSW4gb2JzY3VyZSBjYXNlcyB3aGVyZSBhIHBhcnRpYWwgc29ja2V0IHdyaXRlIG9jY3VycmVkIHdoaWxlIGNodW5raW5nLAogICAgIEFwYWNoZSB3b3VsZCBvbWl0IHRoZSBjaHVuayBoZWFkZXIvZm9vdGVyIG9uIHRoZSBuZXh0IGJsb2NrLiAgQ2xlYW5lZAogICAgIHVwIG90aGVyIGJ1Z3MvaW5jb25zaXN0ZW5jaWVzIGluIGVycm9yIGNvbmRpdGlvbnMgaW4gYnVmZi5jLiAgRml4ZWQKICAgICBhIGJ1ZyB3aGVyZSBhIGxvbmcgcGF1c2UgaW4gRE5TIGxvb2t1cHMgY291bGQgY2F1c2UgdGhlIGxhc3QgcGFja2V0CiAgICAgb2YgYSByZXNwb25zZSB0byBiZSB1bmR1bHkgZGVsYXllZC4gIFtSb3kgRmllbGRpbmcsIERlYW4gR2F1ZGV0XQoKICAqKSBBUEk6IEFkZGVkIGNoaWxkX2V4aXQgZnVuY3Rpb24gdG8gbW9kdWxlIHN0cnVjdHVyZS4gIFRoaXMgaXMgY2FsbGVkCiAgICAgb25jZSBwZXIgImhlYXZ5LXdlaWdodCBwcm9jZXNzIiBqdXN0IGJlZm9yZSBhIHNlcnZlciBjaGlsZCBleGl0KCkncyAKICAgICBlLmcuIHdoZW4gbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCBpcyByZWFjaGVkLCBldGMuCiAgICAgW0RvdWcgTWFjRWFjaGVybiwgRGVhbiBHYXVkZXRdCgogICopIG1vZF9pbmNsdWRlIGNsZWFudXAgc2hvd2VkIHRoYXQgaGFuZGxlX2Vsc2Ugd2FzIGJlaW5nIHVzZWQgdG8gaGFuZGxlCiAgICAgZW5kaWYuICBJdCBkaWRuJ3QgY2F1c2UgcHJvYmxlbXMsIGJ1dCBpdCB3YXMgY2xlYW5lZCB1cCB0b28uCiAgICAgW0hvd2FyZCBGZWFyXQoKICAqKSBtb2RfY2Vybl9tZXRhIHdvdWxkIGF0dGVtcHQgdG8gZmluZCBtZXRhIGZpbGVzIGZvciB0aGUgZGlyZWN0b3J5IGl0c2VsZgogICAgIGluIHNvbWUgY2FzZXMsIGJ1dCBub3QgaW4gb3RoZXJzLiAgSXQgbm93IGF2b2lkcyBpdCBpbiBhbGwgY2FzZXMuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBtb2RfbWltZV9tYWdpYyB3b3VsZCBjb3JlIGR1bXAgaWYgdGhlcmUgd2FzIGEgZGVjb21wcmVzc2lvbiBlcnJvci4KICAgICBbTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyIG1jaC5zbmkuZGU+XSBQUiM5MDQKCiAgKikgUE9SVDogc29tZSB2YXJpYW50cyBvZiBER1VYIHJlcXVpcmUgLWxzb2NrZXQgLWxuc2wKICAgICBbQWxleGFuZGVyIEwgSm9uZXMgPGFsZXggc3lzdGVtcy1vcHRpb25zLmNvLnVrPl0gUFIjNzMyCgogICopIG1vZF9hdXRvaW5kZXggbm93IGFsbG93cyBzb3J0aW5nIG9mIEZhbmN5SW5kZXhlZCBkaXJlY3RvcnkgbGlzdGluZ3MKICAgICBieSB0aGUgdmFyaW91cyBmaWVsZHMgKG5hbWUsIHNpemUsIGV0IGNldGVyYSksIGVpdGhlciBpbiBhc2NlbmRpbmcKICAgICBvciBkZXNjZW5kaW5nIG9yZGVyLiAgSnVzdCBjbGljayBvbiB0aGUgY29sdW1uIGhlYWRlci4gIFtLZW4gQ29hcl0KCiAgKikgUE9SVDogVmFyaW91cyB0d2Vha3MgdG8gZWxpbWluYXRlIHBvaW50ZXItaW50IGNhc3Rpbmcgd2FybmluZ3Mgb24gNjQtYml0CiAgICAgQ1BVcyBsaWtlIHRoZSBBbHBoYS4gIEFwYWNoZSBzdGlsbCBzdG9yZXMgaW50cyBpbiBwb2ludGVycywgYnV0IHRoYXQncwogICAgIHRoZSByZWxhdGl2ZWx5IHNhZmUgZGlyZWN0aW9uLiAgW0RlYW4gR2F1ZGV0XSBQUiMzNDQKCiAgKikgUE9SVDogUU5YIG1tYXAoKSBzdXBwb3J0IGZvciBmYXN0ZXIvbW9yZSByZWxpYWJsZSBzY29yZWJvYXJkIGhhbmRsaW5nLgogICAgIFtJZ29yIE4gS292YWxlbmtvIDxpbmZvaCBtYWlsLndwbHVzLm5ldD5dIFBSIzY4MwoKICAqKSBjaGlsZF9tYWluIGF2b2lkcyBhbiB1bm5lZWRlZCBjYWxsIHRvIHNlbGVjdCgpIHdoZW4gdGhlcmUgaXMgb25seSBvbmUKICAgICBsaXN0ZW5pbmcgc29ja2V0LiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgc2VydmVyIGlzIHN0YXJ2ZWQgZm9yIGlkbGUgc2VydmVycyBpdCB3aWxsCiAgICAgc3Bhd24gMSwgdGhlbiAyLCB0aGVuIDQsIC4uLiwgdGhlbiAzMiBzZXJ2ZXJzIGVhY2ggc2Vjb25kLAogICAgIGRvdWJsaW5nIGVhY2ggc2Vjb25kLiAgSXQnbGwgYWxzbyBnaXZlIGEgd2FybmluZyBpbiB0aGUgZXJyb3Jsb2cKICAgICBzaW5jZSB0aGUgbW9zdCBjb21tb24gcmVhc29uIGZvciB0aGlzIGlzIGEgcG9vciBTdGFydFNlcnZlcnMKICAgICBzZXR0aW5nLiAgVGhlIGRlZmluZSBNQVhfU1BBV05fUkFURSBjYW4gYmUgdXNlZCB0byByYWlzZS9sb3dlcgogICAgIHRoZSBtYXhpbXVtLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBcGFjaGUgbm93IHByb3ZpZGVzIGFuIGVmZmVjdGl2ZWx5IHVuYnVmZmVyZWQgY29ubmVjdGlvbiBmb3IKICAgICBDR0kgc2NyaXB0cy4gIFRoaXMgbWVhbnMgdGhhdCBkYXRhIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50CiAgICAgYXMgc29vbiBhcyB0aGUgQ0dJIHBhdXNlcyBvciBzdG9wcyBvdXRwdXQ7IHByZXZpb3VzbHksIEFwYWNoZSB3b3VsZAogICAgIGJ1ZmZlciB0aGUgb3V0cHV0IHVwIHRvIGEgZml4ZWQgYnVmZmVyIHNpemUgYmVmb3JlIHNlbmRpbmcsIHdoaWNoCiAgICAgY291bGQgcmVzdWx0IGluIHRoZSB1c2VyIHZpZXdpbmcgYW4gZW1wdHkgcGFnZSB1bnRpbCB0aGUgQ0dJIGZpbmlzaGVkCiAgICAgb3Igb3V0cHV0IGEgY29tcGxldGUgYnVmZmVyLiAgSXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byB1c2UgYW4KICAgICAibnBoLSIgQ0dJIHRvIGdldCB1bmJ1ZmZlcmVkIG91dHB1dC4gIEdpdmVuIHRoYXQgbW9zdCBDR0lzIGFyZSB3cml0dGVuCiAgICAgaW4gYSBsYW5ndWFnZSB0aGF0IGJ5IGRlZmF1bHQgZG9lcyBidWZmZXJpbmcgKGUuZy4gcGVybCkgdGhpcwogICAgIHNob3VsZG4ndCBoYXZlIGEgZGV0cmltZW50YWwgZWZmZWN0IG9uIHBlcmZvcm1hbmNlLgoKICAgICAibnBoLSIgQ0dJcywgd2hpY2ggZm9ybWVybHkgcHJvdmlkZWQgYSBkaXJlY3Qgc29ja2V0IHRvIHRoZSBjbGllbnQKICAgICB3aXRob3V0IGFueSBzZXJ2ZXIgcG9zdC1wcm9jZXNzaW5nLCB3ZXJlIG5vdCBmdWxseSBjb21wYXRpYmxlIHdpdGgKICAgICBIVFRQLzEuMSBvciBTU0wgc3VwcG9ydC4gIEFzIHN1Y2ggdGhleSB3b3VsZCBoYXZlIGhhZCB0byBpbXBsZW1lbnQKICAgICB0aGUgdHJhbnNwb3J0IGRldGFpbHMsIHN1Y2ggYXMgZW5jcnlwdGlvbiBvciBjaHVua2luZywgaW4gb3JkZXIKICAgICB0byB3b3JrIHByb3Blcmx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucy4gIE5vdywgdGhlIG9ubHkgZGlmZmVyZW5jZQogICAgIGJldHdlZW4gbnBoIGFuZCBub24tbnBoIHNjcmlwdHMgaXMgIm5vbi1wYXJzZWQgaGVhZGVycyIuCiAgICAgW0RlYW4gR2F1ZGV0LCBTYW1lZXIgUGFyZWtoLCBSb3kgRmllbGRpbmddCgogICopIElmIGEgQlVGRiBpcyBzd2l0Y2hlZCBmcm9tIGJ1ZmZlcmVkIHRvIHVuYnVmZmVyZWQgcmVhZGluZyB0aGUgZmlyc3QKICAgICBicmVhZCgpIHdpbGwgcmV0dXJuIHdoYXRldmVyIHJlbWFpbmVkIGluIHRoZSBidWZmZXIgcHJpb3IgdG8gdGhlCiAgICAgc3dpdGNoLiBbRGVhbiBHYXVkZXRdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuM2ExCgogICopIEFkZGVkIGFub3RoZXIgQ29uZmlndXJlIGhlbHBlciBzY3JpcHQ6IFRlc3RMaWIuIEl0IGRldGVybWluZXMKICAgICBpZiBhIHNwZWNpZmllZCBsaWJyYXJ5IGV4aXN0cy4gIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBQT1JUOiBBbGxvdyBmb3IgdXNlIG9mIG4zMmJpdCBsaWJyYXJpZXMgdW5kZXIgSVJJWCA2LngKICAgICBbZGVyaXZlZCBmcm9tIHBhdGNoIGZyb20gSmVmZiBIYXllcyA8amhheWVzIGF3LnNnaS5jb20+XQogICAgIFBSIzcyMQoKICAqKSBQT1JUOiBTb21lIGFyY2hpdGVjdHVyZXMgdXNlIHNpemVfdCBmb3IgdmFyaW91cyBsZW5ndGhzIGluIG5ldHdvcmsKICAgICBmdW5jdGlvbnMgc3VjaCBhcyBhY2NlcHQoKSwgYW5kIGdldHNvY2tuYW1lKCkuICBUaGUgZGVmaW5pdGlvbgogICAgIE5FVF9TSVpFX1QgaXMgdXNlZCB0byBjb250cm9sIHRoaXMuIFtEZWFuIEdhdWRldF0KCiAgKikgUE9SVDogTGludXg6IEF0dGVtcHQgdG8gZGV0ZWN0IGdsaWJjIGJhc2VkIHN5c3RlbXMgYW5kIGluY2x1ZGUgY3J5cHQuaAogICAgIGFuZCAtbGNyeXB0LiAgVGVzdCBmb3IgdmFyaW91cyBkYiBsaWJyYXJpZXMgKGRibSwgbmRibSwgZGIpIHdoZW4KICAgICBtb2RfYXV0aF9kYm0gb3IgbW9kX2F1dGhfZGIgYXJlIGluY2x1ZGVkLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBQT1JUOiBRTlggZG9lc24ndCBoYXZlIGluaXRncm91cHMoKSB3aGljaCBzdXBwb3J0L3N1ZXhlYy5jIHVzZXMuCiAgICAgW0lnb3IgTiBLb3ZhbGVua28gPGluZm9oIG1haWwud3BsdXMubmV0Pl0KCiAgKikgImZvcmNlLXJlc3BvbnNlLTEuMCIgbm93IG9ubHkgYXBwbGllcyB0byByZXF1ZXN0cyB3aGljaCBhcmUgSFRUUC8xLjAgdG8KICAgICBiZWdpbiB3aXRoLiAgIm5va2VlcGFsaXZlIiBub3cgd29ya3MgZm9yIEhUVFAvMS4xIGNsaWVudHMuICBBZGRlZAogICAgICJkb3duZ3JhZGUtMS4wIiB3aGljaCBjYXVzZXMgQXBhY2hlIHRvIHByZXRlbmQgaXQgcmVjZWl2ZWQgYSAxLjAuCiAgICAgW0RlYW4gR2F1ZGV0XSByZWxhdGVkIFBSIzg3NQoKICAqKSBBUEk6IENvcnJlY3QgY2hpbGRfaW5pdCgpIHNsb3QgZGVjbGFyYXRpb24gZnJvbSBpbnQgdG8gdm9pZCwgdG8KICAgICBtYXRjaCB0aGUgaW5pdCgpIGRlY2xhcmF0aW9uLiAgVXBkYXRlIG1vZF9leGFtcGxlIHRvIHVzZSB0aGUgbmV3CiAgICAgaG9vay4gIFtLZW4gQ29hcl0KCiAgKikgYWRkZWQgdHJhbnNwb3J0IGhhbmRsZSBzbG90ICh0X2hhbmRsZSkgdG8gdGhlIEJVRkYgc3RydWN0dXJlCiAgICAgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgZ2V0X2NsaWVudF9ibG9jaygpIHJldHVybnMgd3JvbmcgbGVuZ3RoIGlmIHBvbGljeSBpcwogICAgIFJFUVVFU1RfQ0hVTktFRF9ERUNIVU5LLgogICAgIFtLZW5pY2hpIEhvcmkgPGtlbiBkMi5iczEuZmMubmVjLmNvLmpwPl0gUFIjODE1CgogICopIFN1cHBvcnQgdGhlIGltYWdlIG1hcCBmb3JtYXQgb2YgRnJvbnRQYWdlLiAgRm9yIGV4YW1wbGU6CiAgICAgICAgcmVjdCAvdXJsLmhybSAxMCAyMCAzMCA0MAogICAgIFsiQ2hyaXMgTydCeXJuZSIgPG9ieXJuZSBpb2wuaWU+XSBQUiM4MDcKCiAgKikgUE9SVDogLWxyZXNvbHYgYW5kIC1sc29ja3Mgd2VyZSBpbiB0aGUgd3Jvbmcgb3JkZXIgZm9yIFNvbGFyaXMuCiAgICAgWyJEYXJyZW4gTydTaGF1Z2huZXNzeSIgPGRhcnJlbiBhYWlpLm96LmF1Pl0gUFIjODQ2CgogICopIEFkZE1vZHVsZUluZm8gZGlyZWN0aXZlIGZvciBtb2RfaW5mbyB3aGljaCBhbGxvd3MgeW91IHRvIGFubm90YXRlCiAgICAgdGhlIG91dHB1dCBvZiBtb2RfaW5mby4gIFsiTG91IEQuIExhbmdob2x0eiIgPGxkbCB1c2kudXRhaC5lZHU+XQoKICAqKSBBZGRlZCBOb1Byb3h5IGRpcmVjdGl2ZSB0byBhdm9pZCB1c2luZyBQcm94eVJlbW90ZSBmb3Igc2VsZWN0ZWQKICAgICBhZGRyZXNzZXMuICBBZGRlZCBQcm94eURvbWFpbiBkaXJlY3RpdmUgdG8gY2F1c2UgdW5xdWFsaWZpZWQKICAgICBuYW1lcyB0byBiZSBxdWFsaWZpZWQgYnkgcmVkaXJlY3Rpb24uCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lciBtY2guc25pLmRlPl0KCiAgKikgU3VwcG9ydCBQcm94eSBBdXRoZW50aWNhdGlvbiwgYW5kIGRvbid0IHBhc3MgdGhlIFByb3h5LUF1dGhvcml6ZQogICAgIGhlYWRlciB0byB0aGUgcmVtb3RlIGhvc3QgaW4gdGhlIHByb3h5LiBbU2FtZWVyIFBhcmVraCBhbmQKICAgICBXYWxsYWNlXQoKICAqKSBVcGdyYWRlZCBtb2RfcmV3cml0ZSBmcm9tIDMuMC42KyB0byBsYXRlc3Qgb2ZmaWNpYWxseSBhdmFpbGFibGUgdmVyc2lvbgogICAgIDMuMC45LiBUaGlzIHVwZ3JhZGUgaW5jbHVkZXM6IGZpeGVkIGRlYWRsb29waW5nIG9uIHJld3JpdGluZyB0byBzYW1lCiAgICAgVVJMcywgZml4ZWQgcmV3cml0ZWxvZygpLCBmaXhlZCBmb3JjZWQgcmVzcG9uc2UgY29kZSBoYW5kbGluZyBvbgogICAgIHJlZGlyZWN0cyBmcm9tIHdpdGhpbiAuaHRhY2Nlc3MgZmlsZXMsIGRpc2FibGVkIHBpcGUgbG9ja2luZyB1bmRlcgogICAgIGJyYWluZGVhZCBTdW5PUyA0LjEueCwgYWxsb3cgZW52IHZhcmlhYmxlcyB0byBiZSBzZXQgZXZlbiBvbiBydWxlcyB3aXRoCiAgICAgbm8gc3Vic3RpdHV0aW9uLCBidWdmaXhlZCBzaXR1YXRpb25zIHdoZXJlIEhvc3RuYW1lTG9va3VwcyBpcyBvZmYsIG1hZGUKICAgICBtb2RfcmV3cml0ZSBtb3JlIHRocmVhZC1zYWZlIGZvciBOVCBwb3J0IGFuZCBmaXhlZCBwcm9ibGVtIHdoZW4gY3JlYXRpbmcKICAgICBhbiBlbXB0eSBxdWVyeSBzdHJpbmcgdmlhICJ4eHg/Ii4KICAgICAgICAgVGhpcyB1cGRhdGUgYWxzbyByZW1vdmVzIHRoZSBjb3B5cmlnaHQgb2YgUmFsZiBTLiBFbmdlbHNjaGFsbCwKICAgICBpLmUuIG5vdyBtb2RfcmV3cml0ZSBubyBsb25nZXIgaGFzIGEgc2hhcmVkIGNvcHlyaWdodC4gSW5zdGVhZCBpcyBpcwogICAgIGV4Y2x1c2l2ZWx5IGNvcHlyaWdodGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAgbm93LiBUaGlzIGhhcHBlbmVkIGJlY2F1c2UKICAgICB0aGUgYXV0aG9yIG5vdyBoYXMgZ2lmdGVkIG1vZF9yZXdyaXRlIGV4Y2x1c2l2ZWx5IHRvIHRoZSBBcGFjaGUgR3JvdXAgYW5kIAogICAgIG5vIGxvbmdlciBtYWludGFpbnMgYW4gZXh0ZXJuYWwgdmVyc2lvbi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQVBJOiBBZGRlZCBjaGlsZF9pbml0IGZ1bmN0aW9uIHRvIG1vZHVsZSBzdHJ1Y3R1cmUuICBUaGlzIGlzIGNhbGxlZAogICAgIG9uY2UgcGVyICJoZWF2eS13ZWlnaHQgcHJvY2VzcyIgYmVmb3JlIGFueSByZXF1ZXN0cyBhcmUgaGFuZGxlZC4KICAgICBTZWUgaHR0cF9jb25maWcuaCBmb3IgbW9yZSBkZXRhaWxzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBbm9ueW1vdXNfTG9nRW1haWwgd2FzIGxvZ2dpbmcgb24gZWFjaCBzdWJyZXF1ZXN0LgogICAgIFtEZWFuIEdhdWRldF0gUFIjNDIxLCA4NjgKCiAgKikgQVBJOiBBZGRlZCBpc19pbml0aWFsX3JlcSgpIHdoaWNoIHRlc3RzIGlmIHRoZSByZXF1ZXN0IGJlaW5nCiAgICAgcHJvY2Vzc2VkIGlzIHRoZSBpbml0aWFsIHJlcXVlc3QsIG9yIGEgc3VicmVxdWVzdC4KICAgICBbRG91ZyBNYWNFYWNoZXJuXQoKICAqKSBFeHRlbmRlZCBTU0kgKG1vZF9pbmNsdWRlKSBub3cgaGFuZGxlcyBhZGRpdGlvbmFsIHJlbG9wcyBmb3IKICAgICBzdHJpbmcgY29tcGFyaXNvbnMgKDwsID4sIDw9LCBhbmQgPj0pLiAgW0JydW5vIFdvbGZmIElJSV0gUFIjNDEKCiAgKikgQ29uZmlndXJlIGZpeGVkIHRvIGNvcnJlY3RseSBwcm9wYWdhdGUgdXNlci1zZWxlY3RlZCBvcHRpb25zIGFuZAogICAgIHNldHRpbmdzIChzdWNoIGFzIENDIGFuZCBPUFRJTSkgdG8gTWFrZWZpbGVzIG90aGVyIHRoYW4KICAgICBzcmMvTWFrZWZpbGUgKG5vdGFibHkgc3VwcG9ydC9NYWtlZmlsZSkuICBbS2VuIENvYXJdIFBSIzY2NiwgIzgzNAoKICAqKSBJbmRleE9wdGlvbnMgU3VwcHJlc3NIVE1MUHJlYW1ibGUgbm93IGNhdXNlcyB0aGUgYWN0dWFsIEhUTUwgb2YKICAgICBkaXJlY3RvcnkgaW5kaWNlcyB0byBzdGFydCB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgSGVhZGVyTmFtZSBmaWxlCiAgICAgaWYgdGhlcmUgaXMgb25lLiAgSWYgdGhlcmUgaXNuJ3Qgb25lLCB0aGUgYmVoYXZpb3VyIGlzIHVuY2hhbmdlZC4KICAgICBbS2VuIENvYXIsIFJveSBGaWVsZGluZywgQW5kcmV5IEEuIENoZXJub3ZdCgogICopIFdJTjMyOiBNb2R1bGVzIGNhbiBub3cgYmUgZHluYW1pY2FsbHkgbG9hZGVkIERMTHMgdXNpbmcgdGhlCiAgICAgTG9hZE1vZHVsZS9Mb2FkRmlsZSBkaXJlY3RpdmVzLiBOb3RlIHRoYXQgbW9kdWxlIERMTHMgbXVzdCBiZQogICAgIGNvbXBpbGVkIHdpdGggdGhlIG11bHRpdGhyZWFkZWQgRExMIHZlcnNpb24gb2YgdGhlIHJ1bnRpbWUgbGlicmFyeS4KICAgICBbQWxleGVpIEtvc3V0IGFuZCBCZW4gTGF1cmllXQoKICAqKSBBdXRvbWF0aWMgaW5kZXhpbmcgcmVtb3ZlZCBmcm9tIG1vZF9kaXIgYW5kIHBsYWNlZCBpbnRvIG1vZF9hdXRvaW5kZXguCiAgICAgVGhpcyBhbGxvd3MgdGhlIGFkbWluIHRvIGNvbXBsZXRlbHkgcmVtb3ZlIGF1dG9tYXRpYyBpbmRleGluZwogICAgIGZyb20gdGhlIHNlcnZlciwgd2hpbGUgc3RpbGwgc3VwcG9ydGluZyB0aGUgYmFzaWMgZnVuY3Rpb25zIG9mCiAgICAgdHJhaWxpbmctc2xhc2ggcmVkaXJlY3RzIGFuZCBEaXJlY3RvcnlJbmRleCBmaWxlcy4gIE5vdGUgdGhhdCBpZgogICAgIHlvdSdyZSBjYXJyeWluZyBvdmVyIGFuIG9sZCBDb25maWd1cmF0aW9uIGZpbGUgYW5kIHlvdSB1c2UgZGlyZWN0b3J5CiAgICAgaW5kZXhpbmcgdGhlbiB5b3UnbGwgd2FudCB0byBhZGQ6CgogICAgIE1vZHVsZSBhdXRvaW5kZXhfbW9kdWxlICAgIG1vZF9hdXRvaW5kZXgubwoKICAgICBiZWZvcmUgbW9kX2RpciBpbiB5b3VyIENvbmZpZ3VyYXRpb24uICBbRGVhbiBHYXVkZXRdCgogICopIHBvcGVuZGlyL3BjbG9zZWRpciBjcmVhdGVkIHRvIHByb3Blcmx5IHByb3RlY3QgZGlyZWN0b3J5IHNjYW5uaW5nLgogICAgIFtEZWFuIEdhdWRldF0gUFIjNTI1CgogICopIEFsaWFzTWF0Y2gsIFNjcmlwdEFsaWFzTWF0Y2ggYW5kIFJlZGlyZWN0TWF0Y2ggZGlyZWN0aXZlcyBhZGRlZCwKICAgICBnaXZpbmcgcmVnZXggc3VwcG9ydCB0byBtb2RfYWxpYXMuIDxEaXJlY3RvcnlNYXRjaD4sIDxMb2NhdGlvbk1hdGNoPgogICAgIGFuZCA8RmlsZXNNYXRjaD4gc2VjdGlvbnMgYWRkZWQgdG8gc3VjY2VlZCA8RGlyZWN0b3J5TWF0Y2ggfj4sIGV0Yy4uLgogICAgIFtBbGV4ZWkgS29zdXRdCgogICopIFRoZSBBY2Nlc3NGaWxlTmFtZSBkaXJlY3RpdmUgY2FuIG5vdyB0YWtlIG1vcmUgdGhhbiBvbmUgZmlsZW5hbWUuCiAgICAgWyJMb3UgRC4gTGFuZ2hvbHR6IiA8bGRsIHVzaS51dGFoLmVkdT5dCgogICopIFRoZSBuZXcgbW9kX21pbWVfbWFnaWMgY2FuIGJlIHVzZWQgdG8gIm1hZ2ljYWxseSIgZGV0ZXJtaW5lIHRoZSB0eXBlCiAgICAgb2YgYSBmaWxlIGlmIHRoZSBleHRlbnNpb24gaXMgdW5rbm93bi4gIEJhc2VkIG9uIHRoZSB1bml4IGZpbGUoMSkKICAgICBjb21tYW5kLiAgW0lhbiBLbHVmdCA8aWtsdWZ0IGNpc2NvLmNvbT5dCgogICopIFdlIG5vdyBkZXRlcm1pbmUgYW5kIGRpc3BsYXkgdGhlIHRpbWUgc3BlbnQgcHJvY2Vzc2luZyBhCiAgICAgcmVxdWVzdCBpZiBkZXNpcmVkLiAgW0ppbSBKYWdpZWxza2ldCgogICopIG1vZF9zdGF0dXM6IFBJRCBmaWVsZCBvZiAiZGVhZCIgY2hpbGQgc2xvdHMgbm8gbG9uZ2VyIGRpc3BsYXlzCiAgICAgbWFpbiBodHRwZCBwcm9jZXNzJ3MgUElELiAgW0ppbSBKYWdpZWxza2ldCgogICopIE1ha2VmaWxlLm50IGFkZGVkIC0gdG8gYnVpbGQgYWxsIHRoZSBiaXRzIGZyb20gdGhlIGNvbW1hbmQgbGluZToKICAgICAgICBubWFrZSAtZiBNYWtlZmlsZS5udAogICAgICAgICBEb2Vzbid0IHlldCB3b3JrIHByb3Blcmx5LiBbQmVuIExhdXJpZV0KCiAgKikgRGVmYXVsdCB0ZXh0IG9mIDQwNCBlcnJvciBpcyBub3cgIk5vdCBGb3VuZCIgcmF0aGVyIHRoYW4gdGhlCiAgICAgcG90ZW50aWFsbHkgbWlzbGVhZGluZyAiRmlsZSBOb3QgRm91bmQiLiAgW0tlbiBDb2FyXQoKICAqKSBDT05GSUc6ICJIb3N0bmFtZUxvb2t1cHMiIG5vdyBkZWZhdWx0cyB0byBvZmYgYmVjYXVzZSBpdCBpcyBmYXIgYmV0dGVyCiAgICAgZm9yIHRoZSBuZXQgaWYgd2UgcmVxdWlyZSBwZW9wbGUgdGhhdCBhY3R1YWxseSBuZWVkIHRoaXMgZGF0YSB0bwogICAgIGVuYWJsZSBpdC4gIFtMaW51cyBUb3J2YWxkc10KCiAgKikgZGlyZWN0b3J5X3dhbGsoKSBpcyBhbiBleHBlbnNpdmUgZnVuY3Rpb24sIGtlZXAgYSBsaXR0bGUgbW9yZSBzdGF0ZSB0bwogICAgIGF2b2lkIG5lZWRsZXNzIHN0cmluZyBjb3VudGluZy4gIEFkZCB0d28gbmV3IGZ1bmN0aW9ucyBtYWtlX2RpcnN0cl9wYXJlbnQKICAgICBhbmQgbWFrZV9kaXJzdHJfcHJlZml4IHdoaWNoIHJlcGxhY2UgYWxsIGV4aXN0aW5nIHVzZXMgb2YgbWFrZV9kaXJzdHIuCiAgICAgVGhlIG5ldyBmdW5jdGlvbnMgYXJlIGEgbGl0dGxlIGxlc3MgZ2VuZXJhbCB0aGFuIG1ha2VfZGlyc3RyLCBidXQKICAgICB3b3JrIG1vcmUgZWZmaWNpZW50bHkgKGxlc3MgbWVtb3J5LCBsZXNzIHN0cmluZyBjb3VudGluZykuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBFWFRSQV9MRkxBR1Mgd2FzIGNoYW5nZWQgdG8gRVhUUkFfTERGTEFHUyAoYW5kIExGTEFHUyB3YXMgY2hhbmdlZAogICAgIHRvIExERkxBR1MpIHRvIGF2b2lkIGNvbXBsaWNhdGlvbnMgd2l0aCBsZXggcnVsZXMgaW4gbWFrZSBmaWxlcy4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzM3MgoKICAqKSBydW5fbWV0aG9kIG9wdGltaXplZCB0byBhdm9pZCBuZWVkbGVzcyBzY2FubmluZyBvdmVyIE5VTExzIGluIHRoZQogICAgIG1vZHVsZSBsaXN0LiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBSZXZhbXAgb2YgKHVuaXgpIHNjb3JlYm9hcmQgbWFuYWdlbWVudCBjb2RlIHN1Y2ggdGhhdCBpdCBhdm9pZHMKICAgICB1bm5lY2Vzc2FyeSB0cmF2ZXJzYWxzIG9mIHRoZSBzY29yZWJvYXJkIG9uIGVhY2ggaGl0LiAgVGhpcyBpcwogICAgIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgZm9yIGhpZ2ggdm9sdW1lIHNpdGVzIHdpdGggYSBsYXJnZQogICAgIEhBUkRfU0VSVkVSX0xJTUlULiAgU29tZSBvZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9ucyB3ZXJlIE8obl4yKSwKICAgICBhbmQgYXJlIG5vdyBPKG4pLiAgU2VlIGFsc28gU0NPUkVCT0FSRF9NQUlOVEVOQU5DRV9JTlRFUlZBTCBpbgogICAgIGh0dHBkLmguIFtEZWFuIEdhdWRldF0KCiAgKikgSW4gY29uZmlndXJhdGlvbnMgdXNpbmcgbXVsdGlwbGUgTGlzdGVuIHN0YXRlbWVudHMgaXQgd2FzIHBvc3NpYmxlIGZvcgogICAgIGJ1c3kgc29ja2V0cyB0byBzdGFydmUgb3RoZXIgc29ja2V0cyBvZiBzZXJ2aWNlLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBZGRlZCBob29rIHNvIHN0YW5kYWxvbmVfbWFpbiBjYW4gYmUgcmVwbGFjZWQgYXQgY29tcGlsZSB0aW1lCiAgICAgKGRlZmluZSBTVEFOREFMT05FX01BSU4pCiAgICAgW0RvdWcgTWFjRWFjaGVybl0KCiAgKikgTG93ZXN0LWxldmVsIHJlYWQvd3JpdGUgZnVuY3Rpb25zIGluIGJ1ZmYuYyB3aWxsIGJlIHJlcGxhY2VkIHdpdGgKICAgICB0aGUgU0ZJTyBsaWJyYXJ5IGNhbGxzIHNmcmVhZC9zZndyaXRlIGlmIEJfU0ZJTyBpcyBkZWZpbmVkIGF0CiAgICAgY29tcGlsZSB0aW1lLiAgVGhlIGRlZmF1bHQgc2ZpbyBkaXNjaXBsaW5lIHdpbGwgYmVoYXZlIGFzIGFwYWNoZQogICAgIHdvdWxkIHdpdGhvdXQgc2ZpbyBjb21waWxlZCBpbi4KICAgICBbRG91ZyBNYWNFYWNoZXJuXQoKICAqKSBFbmhhbmNlIFVzZXJEaXIgZGlyZWN0aXZlIChtb2RfdXNlcmRpcikgdG8gYWNjZXB0IGEgbGlzdCBvZgogICAgIHVzZXJuYW1lcyBmb3IgdGhlICdkaXNhYmxlJyBrZXl3b3JkLCBhbmQgYWRkICdlbmFibGUgdXNlci4uLicgdG8KICAgICBzZWxlY3RpdmVseSAqZW4qYWJsZSB1c2VyZGlycyBpZiB0aGV5J3JlIGdsb2JhbGx5IGRpc2FibGVkLgogICAgIFtLZW4gQ29hcl0KCiAgKikgSWYgTkVUU0NBUEVfREJNX0NPTVBBVCBpcyBkZWZpbmVkIGluIEVYVFJBX0NGTEFHUyB0aGVuIEFwYWNoZQogICAgIHdpbGwgd29yayB3aXRoIE5ldHNjYXBlIGRibSBmaWxlcy4gIChkYm1tYW5hZ2Ugd2lsbCBwcm9iYWJseSBub3QKICAgICB3b3JrIGhvd2V2ZXIuKSBbQWxleGFuZGVyIFNwb2hyIDxhc3BvaHIgbmV0bWF0aWMuY29tPl0gUFIjNDQ0CgogICopIEFkZCBhIExpc3RlbkJhY2tsb2cgZGlyZWN0aXZlIHRvIGNvbnRyb2wgdGhlIGJhY2tsb2cgcGFyYW1ldGVyCiAgICAgcGFzc2VkIHRvIGxpc3RlbigpLiAgQWxzbyBjaGFuZ2UgdGhlIGRlZmF1bHQgdG8gNTExIGZyb20gNTEyLgogICAgIFtNYXJjIFNsZW1rb10KCiAgKikgQVBJOiBBIG5ldyBoYW5kbGVyIHJlc3BvbnNlIERPTkUgd2hpY2ggaW5mb3JtcyBhcGFjaGUgdGhhdCB0aGUKICAgICByZXF1ZXN0IGhhcyBiZWVuIGhhbmRsZWQgYW5kIGl0IGNhbiBmaW5pc2ggb2ZmIHF1aWNrbHksIHNpbWlsYXIgdG8KICAgICBob3cgaXQgaGFuZGxlcyBlcnJvcnMuIFtSb2IgSGFydGlsbF0KCiAgKikgVHVybiBvZmYgY2h1bmtlZCBlbmNvZGluZyBhZnRlciBzZW5kaW5nIHRlcm1pbmF0aW5nIGNodW5rL2Zvb3RlcgogICAgIHNvIHRoYXQgd2UgY2FuJ3QgZG8gaXQgdHdpY2UgYnkgYWNjaWRlbnQuIFtSb3kgRmllbGRpbmddCgogICopIG1vZF9leHBpcmUgYWxzbyBpc3N1ZXMgQ2FjaGUtQ29udHJvbDogbWF4LWFnZSBoZWFkZXJzLgogICAgIFtSb2IgSGFydGlsbF0KCiAgKikgQVBJOiBBZGRlZCBraWxsX29ubHlfb25jZSBvcHRpb24gZm9yIGZyZWVfcHJvY19jaGFpbiBzbyB0aGF0IGl0IHdvbid0CiAgICAgYWdncmVzc2l2ZWx5IHRyeSB0byBraWxsIG9mZiBzcGVjaWZpYyBjaGlsZHJlbi4gIEZvciBmYXN0Y2dpLgogICAgIFtTdGFubGV5IEdhbWJhcmluIDxnYW1iYXJpbiBPcGVuTWFya2V0LmNvbT5dCgogICopIG1vZF9hdXRoIGRlYWxzIHdpdGggZXh0cmEgJzonIGRlbGltaXRlZCBmaWVsZHMuICBbTWFyYyBTbGVta29dCgogICopIEFkZGVkIEljb25IZWlnaHQgYW5kIEljb25XaWR0aCB0byBtb2RfZGlyJ3MgSW5kZXhPcHRpb25zIGRpcmVjdGl2ZS4KICAgICBXaGVuIHVzZWQgdG9nZXRoZXIsIHRoZXNlIGNhdXNlIG1vZF9kaXIgdG8gZW1pdCBIRUlHSFQgYW5kIFdJRFRICiAgICAgYXR0cmlidXRlcyBpbiB0aGUgRmFuY3lJbmRleGluZyBJTUcgdGFncy4gIFtLZW4gQ29hcl0KCiAgKikgUE9SVDogU2VxdWVudCBhbmQgU09OWSBORVdTLU9TIHN1cHBvcnQgYWRkZWQuICBbSmltIEphZ2llbHNraV0KCiAgKikgUE9SVDogQWRkZWQgV2luZG93cyBOVCBzdXBwb3J0CiAgICAgW0JlbiBMYXVyaWUgYW5kIEFtYmFyaXNoIE1hbHBhbmkgPGFtYmFyaXNoIHZhbGljZXJ0LmNvbT5dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMi42CgogICopIG1vZF9pbmNsdWRlIHdoZW4gdXNpbmcgWEJpdEhhY2sgRnVsbCB3b3VsZCBzZW5kIEVUYWdzIGluIGFkZGl0aW9uIHRvCiAgICAgc2VuZGluZyBMYXN0LU1vZGlmaWVkcy4gIFRoaXMgaXMgaW5jb3JyZWN0IEhUVFAvMS4xIGJlaGF2aW91ci4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzExMzMKCiAgKikgU0VDVVJJVFk6IFdoZW4gYSBjbGllbnQgY29ubmVjdHMgdG8gYSBwYXJ0aWN1bGFyIHBvcnQvYWRkciwgYW5kCiAgICAgZ2l2ZXMgYSBIb3N0OiBoZWFkZXIgZW5zdXJlIHRoYXQgdGhlIHZpcnR1YWwgaG9zdCByZXF1ZXN0ZWQgY2FuCiAgICAgYWN0dWFsbHkgYmUgcmVhY2hlZCB2aWEgdGhhdCBwb3J0L2FkZHIuICBbRWQgS29ydGhvZiA8ZWQgb3JnYW5pYy5jb20+XQoKICAqKSBTdXBwb3J0IHZpcnR1YWwgaG9zdHMgd2l0aCB3aWxkY2FyZCBwb3J0IGFuZC9vciBtdWx0aXBsZSBwb3J0cwogICAgIHByb3Blcmx5LiAgW0VkIEtvcnRob2YgPGVkIG9yZ2FuaWMuY29tPl0KCiAgKikgRml4ZWQgc29tZSBjYXNlLXNlbnNpdGl2aXR5IGlzc3VlcyBhY2NvcmRpbmcgdG8gUkZDMjA2OC4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIFNldCByLT5hbGxvd2VkIHByb3Blcmx5IGluIG1vZF9hc2lzLmMsIG1vZF9kaXIuYywgbW9kX2luZm8uYywKICAgICBhbmQgbW9kX2luY2x1ZGUuYy4gIFtEZWFuIEdhdWRldF0KCiAgKikgVmFyaWFibGUgJ2N3ZCcgd2FzIGJlaW5nIHVzZWQgcG9pbnRsZXNzbHkgYmVmb3JlIGJlaW5nIHNldC4KICAgICBbS2VuIENvYXJdIFBSIzE3MzgKCiAgKikgU0lHVVJHIGRvZXNuJ3QgZXhpc3Qgb24gYWxsIHBsYXRmb3Jtcy4KICAgICBbTWFyayBBbmRyZXcgSGVpbnJpY2ggPGhlaW5yaWNoIHRpbmRlcmJveC5TdGFuZm9yZC5FRFU+XQoKICAqKSBXaGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgYSBQT1NULCBvciBvdGhlciBvcGVyYXRpb24gd2l0aCBhCiAgICAgcmVxdWVzdCBib2R5LCB0aGUgYm9keSBoYXMgdG8gYmUgcmVhZCBmcm9tIHRoZSBuZXQgYmVmb3JlIGFsbG93aW5nCiAgICAgYSBrZWVwYWxpdmUgc2Vzc2lvbiB0byBjb250aW51ZS4gIFtSb3kgRmllbGRpbmddIFBSIzEzOTkKCiAgKikgV2hlbiBhbiBlcnJvciBvY2N1cnMgaW4gZmNudGwoKSBsb2NraW5nIHN1Z2dlc3QgdGhlIHVzZXIgbG9vayB1cAogICAgIHRoZSBkb2NzIGZvciBMb2NrRmlsZS4gIFtEZWFuIEdhdWRldF0KCiAgKikgdGFibGVfc2V0KCkgYW5kIHRhYmxlX3Vuc2V0KCkgZGlkIG5vdCBkZWFsIGNvcnJlY3RseSB3aXRoCiAgICAgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgdGhlIHNhbWUga2V5LiBbU3RlcGhlbiBTY2hlY2sKICAgICA8c3NjaGVjayBpbmZvbmV4Lm5ldD4sIEJlbiBMYXVyaWVdIFBSIzE2MDQKCiAgKikgc2VuZF9mZF9sZW5ndGgoKSBkaWQgbm90IGNhbGN1bGF0ZSB0b3RhbF9ieXRlc19zZW50IHByb3Blcmx5IGluIGVycm9yCiAgICAgY2FzZXMuICBbQmVuIFJlc2VyIDxicmVzZXIgcmVnbm93LmNvbT5dIFBSIzEzNjYKCiAgKikgci0+Y29ubmVjdGlvbi0+dXNlciB3YXMgYWxsb2NhdGVkIGluIHRoZSB3cm9uZyBwb29sIGNhdXNpbmcgY29ycnVwdGlvbgogICAgIGluIHNvbWUgY2FzZXMgd2hlbiB1c2VkIHdpdGggbW9kX2Nlcm5fbWV0YS4gIFtEZWFuIEdhdWRldF0gUFIjMTUwMAoKICAqKSBtb2RfcHJveHkgd2FzIHNlbmRpbmcgSFRUUC8xLjEgcmVzcG9uc2VzIHRvIGZ0cCByZXF1ZXN0cyBieSBtaXN0YWtlLgogICAgIEFsc28gcmVtb3ZlZCB0aGUgYXV0by1nZW5lcmF0ZWQgbGluayB0byB3d3cuYXBhY2hlLm9yZyB0aGF0IHdhcyB0aGUKICAgICBzb3VyY2Ugb2Ygc28gbWFueSBtaXNkaXJlY3RlZCBidWcgcmVwb3J0cy4gIFtSb3kgRmllbGRpbmcsIE1hcmMgU2xlbWtvXQoKICAqKSBNdWx0aXBsZSAiY2xvc2UiIHRva2VucyBtYXkgaGF2ZSBiZWVuIHNldCBpbiB0aGUgIkNvbm5lY3Rpb24iCiAgICAgaGVhZGVyLCBub3QgYW4gZXJyb3IsIGJ1dCBhIHdhc3RlLgogICAgIFs8Um9uYWxkLlRzY2hhbGFlciBwc2kuY2g+XSBQUiMxNjgzCgogICopICJiYXNpYyIgYW5kICJkaWdlc3QiIGF1dGggdG9rZW5zIHNob3VsZCBiZSB0ZXN0ZWQgY2FzZS1pbnNlbnNpdGl2ZS4KICAgICBbPFJvbmFsZC5Uc2NoYWxhZXIgcHNpLmNoPl0gUFIjMTU5OSwgUFIjMTY2NgoKICAqKSBJdCBhcHBlYXJzIHRoZSAiMjU3dGggYnl0ZSIgYnVnIChzZWUKICAgICBodGRvY3MvbWFudWFsL21pc2Mva25vd25fY2xpZW50X3Byb2JsZW1zLmh0bWwjMjU3dGgtYnl0ZSkgY2FuIGhhcHBlbgogICAgIGF0IHRoZSAyNTZ0aCBieXRlIGFzIHdlbGwuICBGaXhlZC4gIFtEZWFuIEdhdWRldF0KCiAgKikgbW9kX3Jld3JpdGUgd291bGQgbm90IGhhbmRsZSAlM2YgcHJvcGVybHkgaW4gc29tZSBzaXR1YXRpb25zLgogICAgIFtSYWxmIEVuZ2Vsc2NoYWxsXQoKICAqKSBBcGFjaGUgY291bGQgZ2VuZXJhdGUgaW1wcm9wZXJseSBjaHVua2VkIEhUVFAvMS4xIHJlc3BvbnNlcyB3aGVuCiAgICAgdGhlIGJwdXRjKCkgb3IgcnB1dGMoKSBmdW5jdGlvbnMgd2VyZSB1c2VkIGJ5IG1vZHVsZXMgKHN1Y2ggYXMKICAgICBtb2RfaW5jbHVkZSkuICBbRGVhbiBHYXVkZXRdCgogICopICNpZmRlZiB3cmFwIGEgZmV3ICNkZWZpbmVzIGluIGh0dHBkLmggdG8gbWFrZSBsaWZlIGVhc2llciBvbgogICAgIHNvbWUgcG9ydHMuICBbUmFsZiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IE1QRSBjb21waWxhdGlvbiBlcnJvciBpbiBtb2RfdXNlcnRyYWNrLmMuICBbTWFyayBCaXhieV0KCiAgKikgUXVvdGUgQ0M9JyQoQ0MpJyB0byBpbXByb3ZlIHJlY3Vyc2UgbWFrZSBjYWxscy4gIFtNYXJ0aW4gS3JhZW1lcl0KCiAgKikgQXZvaWQgQl9FUlJPUiByZWRlY2xhcmF0aW9uIG9uIHN5c3ZyNCBzeXN0ZW1zLiAgW01hcnRpbiBLcmFlbWVyXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjIuNQoKICAqKSBTRUNVUklUWTogRml4IGEgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93IGluIGxvZ3Jlc29sdmUuICBUaGlzIGlzCiAgICAgb25seSBhbiBpc3N1ZSBvbiBzeXN0ZW1zIHdpdGhvdXQgYSBNQVhETkFNRSBkZWZpbmUgb3Igd2hlcmUgCiAgICAgdGhlIHJlc29sdmVyIHJldHVybnMgZG9tYWluIG5hbWVzIGxvbmdlciB0aGFuIE1BWEROQU1FLiAgW01hcmMgU2xlbWtvXQoKICAqKSBGaXggYW4gaW1wcm9wZXIgbGVuZ3RoIGluIGFuIGFwX3NucHJpbnRmIGNhbGwgaW4gcHJveHlfZGF0ZV9jYW5vbigpLgogICAgIFtNYXJjIFNsZW1rb10KCiAgKikgRml4IGNvcmUgZHVtcCBpbiB0aGUgZnRwIHByb3h5IHdoZW4gcmVhZGluZyBpbmNvcnJlY3RseSBmb3JtYXR0ZWQKICAgICBkaXJlY3RvcnkgbGlzdGluZ3MuICBbTWFyYyBTbGVta29dCgogICopIFNFQ1VSSVRZOiBGaXggcG9zc2libGUgbWlub3IgYnVmZmVyIG92ZXJmbG93IGluIHRoZSBwcm94eSBjYWNoZS4KICAgICBbTWFyYyBTbGVta29dCgogICopIFNFQ1VSSVRZOiBFbGltaW5hdGUgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93IGluIGNmZ19nZXRsaW5lLCB3aGljaAogICAgIGlzIHVzZWQgdG8gcmVhZCB2YXJpb3VzIHR5cGVzIG9mIGZpbGVzIHN1Y2ggYXMgaHRhY2Nlc3MgYW5kIAogICAgIGh0cGFzc3dkIGZpbGVzLiAgW01hcmMgU2xlbWtvXQoKICAqKSBTRUNVUklUWTogRW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciByZXR1cm5lZCBieSBodF90aW1lIGlzIGFsd2F5cwogICAgIHByb3Blcmx5IG51bGwgdGVybWluYXRlZC4gIFtNYXJjIFNsZW1rb10KCiAgKikgU0VDVVJJVFk6IEdlbmVyYWwgbW9kX2luY2x1ZGUgY2xlYW51cCwgaW5jbHVkaW5nIGZpeGluZyBzZXZlcmFsCiAgICAgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93cyBhbmQgYSBwb3NzaWJsZSBpbmZpbml0ZSBsb29wLiAgVGhpcyBjbGVhbnVwCiAgICAgd2FzIGRvbmUgYWdhaW5zdCAxLjMgY29kZSBhbmQgdGhlbiBiYWNrcG9ydGVkIHRvIDEuMiwgdGhlIHJlc3VsdAogICAgIGlzIGEgbGFyZ2UgZGlmZmVyZW5jZSAoZHVlIHRvIGluZGVudGF0aW9uIGNsZWFudXAgaW4gMS4zIGNvZGUpLgogICAgIFVzZXJzIGludGVyZXN0ZWQgaW4gc2VlaW5nIGEgc21hbGxlciBzZXQgb2YgcmVsZXZhbnQgZGlmZmVyZW5jZXMKICAgICBzaG91bGQgY29uc2lkZXIgY29tcGFyaW5nIGFnYWluc3Qgc3JjL21vZHVsZXMvc3RhbmRhcmQvbW9kX2luY2x1ZGUuYwogICAgIGZyb20gdGhlIDEuM2IzIHJlbGVhc2UuICBOb24taW5kZW50YXRpb24gY2hhbmdlcyB0byBtb2RfaW5jbHVkZQogICAgIGJldHdlZW4gMS4yIGFuZCAxLjMgd2VyZSBtaW5pbWFsLiAgW0RlYW4gR2F1ZGV0LCBNYXJjIFNsZW1rb10KCiAgKikgU0VDVVJJVFk6IE51bWVyb3VzIGNoYW5nZXMgdG8gbW9kX2ltYXAgaW4gYSBnZW5lcmFsIGNsZWFudXAKICAgICBpbmNsdWRpbmcgZml4aW5nIGEgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93LiAgVGhpcyBjbGVhbnVwIGFsc28KICAgICB3YXMgZG9uZSB3aXRoIDEuMyBjb2RlIGFzIGEgYmFzaXMsIHNlZSB0aGUgcHJldmlvdXMgbm90ZQogICAgIGFib3V0IG1vZF9pbmNsdWRlLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBTRUNVUklUWTogSWYgYSBodGFjY2VzcyBmaWxlIGNhbiBub3QgYmUgcmVhZCBkdWUgdG8gYmFkIAogICAgIHBlcm1pc3Npb25zLCBkZW55IGFjY2VzcyB0byB0aGUgZGlyZWN0b3J5IHdpdGggYSBIVFRQX0ZPUkJJRERFTi4gIAogICAgIFRoZSBwcmV2aW91cyBiZWhhdmlvciB3YXMgdG8gaWdub3JlIHRoZSBodGFjY2VzcyBmaWxlIGlmIGl0IGNvdWxkIG5vdAogICAgIGJlIHJlYWQuICBUaGlzIGNoYW5nZSBtYXkgbWFrZSBzb21lIHNldHVwcyB3aXRoIHVucmVhZGFibGUKICAgICBodGFjY2VzcyBmaWxlcyBzdG9wIHdvcmtpbmcuICBQUiM4MTcgIFtNYXJjIFNsZW1rb10KCiAgKikgU0VDVVJJVFk6IG5vMnNsYXNoKCkgd2FzIE8obl4yKSBpbiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dC4gIAogICAgIE1ha2UgaXQgTyhuKS4gIFRoaXMgaW5lZmZpY2llbmN5IGNvdWxkIGJlIHVzZWQgdG8gbW91bnQgYSBkZW5pYWwgCiAgICAgb2Ygc2VydmljZSBhdHRhY2sgYWdhaW5zdCB0aGUgQXBhY2hlIHNlcnZlci4gIFRoYW5rcyB0byAKICAgICBNaWNoYWwgWmFsZXdza2kgPGxjYW10dWYgYm9zcy5zdGFzemljLndhdy5wbD4gZm9yIHJlcG9ydGluZwogICAgIHRoaXMuICBbRGVhbiBHYXVkZXRdCgogICopIG1vZF9pbmNsdWRlIHVzZWQgdW5pbml0aWFsaXplZCBkYXRhIGZvciBzb21lIHVzZXMgb2YgJiYgYW5kIHx8LgogICAgIFtCcmlhbiBTbGVzaW5za3kgPGJzbGVzaW5zIHdpcmVkLmNvbT5dIFBSIzExMzkKCiAgKikgbW9kX2ltYXAgc2hvdWxkIGRlY2xpbmUgYWxsIG5vbi1HRVQgbWV0aG9kcy4KICAgICBbSmF5IEJsb29kd29ydGggPGpheSBwYXRod2F5cy5zZGUuc3RhdGUuc2MudXM+XQoKICAqKSBzdWV4ZWMuYyB3b3VsZG4ndCBidWlsZCB3aXRob3V0IC1ETE9HX0VYRUMuIFtKYXNvbiBBLiBEb3VyXQoKICAqKSBtb2RfdXNlcmRpciB3YXMgbW9kaWZ5aW5nIHItPmZpbmZvIGluIGNhc2VzIHdoZXJlIGl0IHdhc24ndCBzZXR0aW5nCiAgICAgci0+ZmlsZW5hbWUuICBTaW5jZSB0aG9zZSB0d28gYXJlIG1lYW50IHRvIGJlIGluIHN5bmMgd2l0aCBlYWNoIG90aGVyCiAgICAgdGhpcyBpcyBhIGJ1Zy4gIFsiUGF1bCBCLiBIZW5zb24iIDxoZW5zb24gaW50cmFuZXQuY3N1cG9tb25hLmVkdT5dCgogICopIG1vZF9pbmNsdWRlIGRpZCBub3QgcHJvcGVybHkgaGFuZGxlIGFsbCBwb3NzaWJsZSByZWRpcmVjdHMgZnJvbSBzdWItCiAgICAgcmVxdWVzdHMuICBbS2VuIENvYXJdCgogICopIEluZXRkIG1vZGUgKHdoaWNoIGlzIGJ1Z2d5KSB1c2VzIHRpbWVvdXRzIHdpdGhvdXQgaGF2aW5nIHNldHVwIHRoZQogICAgIGptcGJ1ZmZlci4gW0RlYW4gR2F1ZGV0XSBQUiMxMDY0CgogICopIFdvcmsgYXJvdW5kIHByb2JsZW0gdW5kZXIgTGludXggd2hlcmUgYSBjaGlsZCB3aWxsIHN0YXJ0IGxvb3BpbmcKICAgICByZXBvcnRpbmcgYSBzZWxlY3QgZXJyb3Igb3ZlciBhbmQgb3Zlci4KICAgICBbUmljayBGcmFuY2h1ayA8cmlja2YgdHJhbnNwZWN0Lm5ldD5dIFBSIzExMDcKCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yLjQKCiAgKikgVGhlIFByb3h5UmVtb3RlIGNoYW5nZSBpbiAxLjIuMyBpbnRyb2R1Y2VkIGEgYnVnIHJlc3VsdGluZyBpbiB0aGUgcHJveHkKICAgICBhbHdheXMgbWFraW5nIHJlcXVlc3RzIHdpdGggdGhlIGZ1bGwtVVJJIGluc3RlYWQgb2YganVzdCB0aGUgVVJJIHBhdGguCiAgICAgW01hcmMgU2xlbWtvLCBSb3kgRmllbGRpbmddCgogICopIEFkZCAtbG0gZm9yIEFJWCB2ZXJzaW9ucyA+PSA0LjIgdG8gYWxsb3cgQXBhY2hlIHRvIGxpbmsgcHJvcGVybHkKICAgICBvbiB0aGlzIHBsYXRmb3JtLiAgW01hcmMgU2xlbWtvXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjIuMwoKICAqKSBUaGUgcmVxdWVzdCB0byBhIHJlbW90ZSBwcm94eSB3YXMgbWFuZ2xlZCBpZiBpdCB3YXMgZ2VuZXJhdGVkIGFzIHRoZQogICAgIHJlc3VsdCBvZiBhIFByb3h5UGFzcyBkaXJlY3RpdmUuIFVSTCBzY2hlbWVzIG90aGVyIHRoYW4gaHR0cDovLyB3ZXJlIG5vdAogICAgIHN1cHBvcnRlZCB3aGVuIFByb3h5UmVtb3RlIHdhcyB1c2VkLiBQUiMyNjAsIFBSIzY1NiwgUFIjNjk5LCBQUiM3MTMsCiAgICAgUFIjODEyIFtMYXJzIEVpbGVicmVjaHRdCgogICopIEZpeGVkIHByb3h5LXBhc3MtdGhyb3VnaCBmZWF0dXJlIG9mIG1vZF9yZXdyaXRlOyBBZGRlZCBlcnJvciBsb2dnaW5nCiAgICAgaW5mb3JtYXRpb24gZm9yIGNhc2Ugd2hlcmUgcHJveHkgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUuIFtNYXJjIFNsZW1rb10KCiAgKikgRm9yY2UgcHJveHkgdG8gYWx3YXlzIHJlc3BvbmQgYXMgSFRUUC8xLjAsIHdoaWNoIGl0IHdhcyBmYWlsaW5nIHRvCiAgICAgZG8gZm9yIGVycm9ycyBhbmQgY2FjaGVkIHJlc3BvbnNlcy4gIFtSb3kgRmllbGRpbmddCgogICopIFBPUlQ6IEltcHJvdmVkIHN1cHBvcnQgZm9yIENvbnZleE9TIDExLiAgW0plZmYgVmVudGVyc10KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yLjIgW25vdCByZWxlYXNlZF0KCiAgKikgRml4ZWQgYW5vdGhlciBsb25nLXN0YW5kaW5nIGJ1ZyBpbiBzdWJfcmVxX2xvb2t1cF9maWxlIHdoZXJlIGl0IHdvdWxkCiAgICAgaGFwcGlseSBza2lwIHBhc3QgYWNjZXNzIGNoZWNrcyBvbiBzdWJkaXJlY3RvcmllcyBsb29rZWQgdXAgd2l0aCByZWxhdGl2ZQogICAgIHBhdGhzLiAgKEl0J3MgdXNlZCBieSBtb2RfZGlyLCBtb2RfbmVnb3RpYXRpb24sIGFuZCBtb2RfaW5jbHVkZS4pCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBBZGQgbG9ja2ZpbGUgbmFtZSB0byBlcnJvciBtZXNzYWdlIHByaW50ZWQgb3V0IHdoZW4KICAgICBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQgaXMgZGVmaW5lZC4KICAgICBbTWFyYyBTbGVta29dCgogICopIEVuaGFuY2VkIHRoZSBjaHVua2luZyBhbmQgZXJyb3IgaGFuZGxpbmcgaW5zaWRlIHRoZSBidWZmZXIgZnVuY3Rpb25zLgogICAgIFtEZWFuIEdhdWRldCwgUm95IEZpZWxkaW5nXQoKICAqKSBXaGVuIG1lcmdpbmcgdGhlIG1haW4gc2VydmVyJ3MgPERpcmVjdG9yeT4gYW5kIDxMb2NhdGlvbj4gc2VjdGlvbnMgaW50bwogICAgIGEgdmhvc3QsIHB1dCB0aGUgbWFpbiBzZXJ2ZXIncyBmaXJzdCBhbmQgdGhlIHZob3N0J3Mgc2Vjb25kLiAgT3RoZXJ3aXNlCiAgICAgdGhlIHZob3N0IGNhbid0IG92ZXJyaWRlIHRoZSBtYWluIHNlcnZlci4gIFtEZWFuIEdhdWRldF0gUFIjNzE3CgogICopIFRoZSA8RGlyZWN0b3J5PiBjb2RlIHdvdWxkIG1lcmdlIGFuZCByZS1tZXJnZSB0aGUgc2FtZSBzZWN0aW9uIGFmdGVyCiAgICAgYSBtYXRjaCB3YXMgZm91bmQsIHBvc3NpYmx5IGNhdXNpbmcgcHJvYmxlbXMgd2l0aCBzb21lIG1vZHVsZXMuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXhlZCBhbiBpbmZpbml0ZSBsb29wIGluIG1vZF9pbWFwIGZvciByZWZlcmVuY2VzIGFib3ZlIHRoZSBzZXJ2ZXIgcm9vdC4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzc0OAoKICAqKSBtb2RfaW5jbHVkZSBjbGVhbnVwIHNob3dlZCB0aGF0IGhhbmRsZV9lbHNlIHdhcyBiZWluZyB1c2VkIHRvIGhhbmRsZQogICAgIGVuZGlmLiAgSXQgZGlkbid0IGNhdXNlIHByb2JsZW1zLCBidXQgaXQgd2FzIGNsZWFuZWQgdXAgdG9vLgogICAgIFtIb3dhcmQgRmVhcl0KCiAgKikgTGFzdCBvZmZpY2lhbCBzeW5jaHJvbml6YXRpb24gb2YgbW9kX3Jld3JpdGUgd2l0aCBhdXRob3IgdmVyc2lvbiAoYmVjYXVzZQogICAgIG1vZF9yZXdyaXRlIGlzIG5vdyBkaXJlY3RseSBkZXZlbG9wZWQgYnkgdGhlIGF1dGhvciBhdCB0aGUgQXBhY2hlIEdyb3VwKToKICAgICBvIGFkZGVkIGRpZmYgYmV0d2VlbiBtb2RfcmV3cml0ZSAzLjAuNisgYW5kIDMuMC45CiAgICAgICBtaW51cyBXSU4zMi9OVCBzdHVmZiwgYnV0IHBsdXMgY29weXJpZ2h0IHJlbW92ZW1lbnQuCiAgICAgICBJbiBkZXRhaWw6CiAgICAgICAtIHdvcmthcm91bmQgZm9yIGRldGVjdGluZyBpbmZpbml0ZSByZXdyaXRpbmcgbG9vcHMKICAgICAgIC0gZml4ZWQgc2V0dGluZyBvZiBlbnYgdmFycyB3aGVuICItIiBpcyB1c2VkIGFzIHN1YnN0IHN0cmluZwogICAgICAgLSBmaXhlZCBmb3JjZWQgcmVzcG9uc2UgY29kZSBvbiByZWRpcmVjdHMgKFBSIzc3NykKICAgICAgIC0gZml4ZWQgY2FzZXMgd2hlcmUgci0+YXJncyBpcyAiIgogICAgICAgLSBrbHVkZ2UgdG8gZGlzYWJsZSBsb2NraW5nIG9uIHBpcGVzIHVuZGVyIGJyYWluZGVhZCBTdW5PUwogICAgICAgLSBmaXggZm9yIHJld3JpdGVsb2cgaW4gY2FzZXMgd2hlcmUgcmVtb3RlIGhvc3RuYW1lIGlzIHVua25vd24KICAgICAgIC0gZml4ZWQgdG90YWxseSBkYW1hZ2VkIHJlcXVlc3RfcmVjIHdhbGstYmFjayBsb29wCiAgICAgbyByZW1vdmUgc3RhdGljIGZyb20gbG9jYWwgZGF0YSBhbmQgYWRkIHN0YXRpYyB0byBnbG9iYWwgb25lcy4KICAgICBvIHJlcGxhY2VkIHVnbHkgcHJveHkgZmluZGluZyBzdHVmZiBieSBzaW1wbGUKICAgICAgIGZpbmRfbGlua2VkX21vZHVsZSgibW9kX3Byb3h5IikgY2FsbC4KICAgICBvIGFkZGVkIG1pc3NpbmcgbmVnYXRpb24gY2hhciBvbiByZXdyaXRlbG9nKCkKICAgICBvIGZpeGVkIGEgZmV3IGNvbW1lbnQgdHlwb3MKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQW5vbnltb3VzX0xvZ0VtYWlsIHdhcyBsb2dnaW5nIG9uIGVhY2ggc3VicmVxdWVzdC4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzQyMSwgUFIjODY4CgogICopICJmb3JjZS1yZXNwb25zZS0xLjAiIG5vdyBvbmx5IGFwcGxpZXMgdG8gcmVxdWVzdHMgd2hpY2ggYXJlIEhUVFAvMS4wIHRvCiAgICAgYmVnaW4gd2l0aC4gICJub2tlZXBhbGl2ZSIgbm93IHdvcmtzIGZvciBIVFRQLzEuMSBjbGllbnRzLiAgQWRkZWQKICAgICAiZG93bmdyYWRlLTEuMCIgd2hpY2ggY2F1c2VzIEFwYWNoZSB0byBwcmV0ZW5kIGl0IHJlY2VpdmVkIGEgMS4wLgogICAgIEFkZGl0aW9uYWxseSBtb2RfYnJvd3NlciBub3cgdHJpZ2dlcnMgZHVyaW5nIHRyYW5zbGF0ZV9uYW1lIHRvIHdvcmthcm91bmQKICAgICBhIGRlZmljaWVuY3kgaW4gdGhlIGhlYWRlcl9wYXJzZSBwaGFzZS4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzg3NQoKICAqKSBnZXRfY2xpZW50X2Jsb2NrKCkgcmV0dXJucyB3cm9uZyBsZW5ndGggaWYgcG9saWN5IGlzIAogICAgIFJFUVVFU1RfQ0hVTktFRF9ERUNIVU5LLgogICAgIFtLZW5pY2hpIEhvcmkgPGtlbiBkMi5iczEuZmMubmVjLmNvLmpwPl0gUFIjODE1CgogICopIFByb3Blcmx5IHRyZWF0IDxmaWxlcz4gY29udGFpbmVyIGxpa2Ugb3RoZXIgY29udGFpbmVycyBpbiBtb2RfaW5mby4KICAgICBbTWFyYyBTbGVta29dIFBSIzg0OAoKICAqKSBUaGUgcHJveHkgZGlkbid0IHRyZWF0IHRoZSAiSG9zdDoiIGtleXdvcmQgb2YgdGhlIGhvc3QgaGVhZGVyIGFzIGNhc2UtCiAgICAgaW5zZW5zaXRpdmUuICBUaGUgcHJveHkgd291bGQgY29ycnVwdCB0aGUgZmlyc3QgbGluZSBvZiBhIHJlc3BvbnNlIGZyb20KICAgICBhbiBIVFRQLzAuOSBzZXJ2ZXIuICBbS2VuaWNoaSBIb3JpIDxrZW4gZDIuYnMxLmZjLm5lYy5jby5qcD5dIFBSIzgxMyw4MTQKCiAgKikgbW9kX2luY2x1ZGUgd291bGQgbG9nIHNvbWUgYm9ndXMgdmFsdWVzIG9jY2FzaW9uYWxseS4KICAgICBbU2tpcCBNb250YW5hcm8gPHNraXAgY2FsZW5kYXIuY29tPiwgTWFyYyBTbGVta29dIFBSIzc5NwoKICAqKSBQT1JUOiBUaGUgc2xhY2sgZmQgY2hhbmdlcyBpbiAxLjIuMSBpbnRyb2R1Y2VkIGEgcHJvYmxlbSB3aXRoIFNJR0hVUAogICAgIHVuZGVyIFNvbGFyaXMgMi54ICh1cCB0aHJvdWdoIDIuNS4xKS4gIEl0IGhhcyBiZWVuIGZpeGVkLgogICAgIFtEZWFuIEdhdWRldF0gUFIjODMyCgogICopIEFQSTogSW4gSFRUUC8xLjEsIHdoZXRoZXIgb3Igbm90IGEgcmVxdWVzdCBtZXNzYWdlIGNvbnRhaW5zIGEgYm9keQogICAgIGlzIGluZGVwZW5kZW50IG9mIHRoZSByZXF1ZXN0IG1ldGhvZCBhbmQgYmFzZWQgc29sZWx5IG9uIHRoZSBwcmVzZW5jZQogICAgIG9mIGEgQ29udGVudC1MZW5ndGggb3IgVHJhbnNmZXItRW5jb2RpbmcuICBUaGVyZWZvcmUsIG91ciBkZWZhdWx0CiAgICAgaGFuZGxlcnMgbmVlZCB0byBiZSBwcmVwYXJlZCB0byByZWFkIGEgYm9keSBldmVuIGlmIHRoZXkgZG9uJ3Qga25vdwogICAgIHdoYXQgdG8gZG8gd2l0aCBpdDsgb3RoZXJ3aXNlLCB0aGUgYm9keSB3b3VsZCBiZSBtaXN0YWtlbiBmb3IgdGhlCiAgICAgbmV4dCByZXF1ZXN0IG9uIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLiAgZGlzY2FyZF9yZXF1ZXN0X2JvZHkoKQogICAgIGhhcyBiZWVuIGFkZGVkIHRvIHRha2UgY2FyZSBvZiB0aGF0LiAgW1JveSBGaWVsZGluZ10gUFIjMzc4CgogICopIEFQSTogU3ltYm9sIEFQQUNIRV9SRUxFQVNFIHByb3ZpZGVzIGEgbnVtZXJpYyBmb3JtIG9mIHRoZSBBcGFjaGUKICAgICByZWxlYXNlIHZlcnNpb24gbnVtYmVyLCBzdWNoIHRoYXQgaXQgYWx3YXlzIGluY3JlYXNlcyBhbG9uZyB0aGUKICAgICBzYW1lIGxpbmVzIGFzIG91ciBzb3VyY2UgY29kZSBicmFuY2hpbmcuICBbUm95IEZpZWxkaW5nXQoKICAqKSBNaW5vciBvdmVyc2lnaHQgb24gbXVsdGlwbGUgdmFyaWFudHMgZml4ZWQuICBbUGF1bCBTdXR0b25dIFBSIzk0CgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMi4xCgogICopIFNFQ1VSSVRZOiBEb24ndCBzZXJ2ZSBmaWxlIHN5c3RlbSBvYmplY3RzIHVubGVzcyB0aGV5IGFyZSBwbGFpbiBmaWxlcywKICAgICBzeW1saW5rcywgb3IgZGlyZWN0b3JpZXMuICBUaGlzIHByZXZlbnRzIGxvY2FsIHVzZXJzIGZyb20gdXNpbmcgcGlwZXMKICAgICBvciBuYW1lZCBzb2NrZXRzIHRvIGludm9rZSBwcm9ncmFtcyBmb3IgYW4gZXh0cmVtZWx5IGNydWRlIGZvcm0gb2YKICAgICBDR0kuICBbRGVhbiBHYXVkZXRdCgogICopIFNFQ1VSSVRZOiBIZWFkZXJOYW1lIGFuZCBSZWFkbWVOYW1lIHdlcmUgc2V0dGFibGUgaW4gLmh0YWNjZXNzIGFuZAogICAgIGNvdWxkIGNvbnRhaW4gIi4uLyIgYWxsb3dpbmcgYSBsb2NhbCB1c2VyIHRvICJwdWJsaXNoIiBhbnkgZmlsZSBvbgogICAgIHRoZSBzeXN0ZW0uICBObyBzbGFzaGVzIGFyZSBhbGxvd2VkIG5vdy4gIFtEZWFuIEdhdWRldF0KCiAgKikgU0VDVVJJVFk6IEl0IHdhcyBwb3NzaWJsZSB0byB2aW9sYXRlIHRoZSBzeW1saW5rIE9wdGlvbnMgdXNpbmcgbW9kX2RpcgogICAgIChoZWFkZXJzLCByZWFkbWVzLCB0aXRsZXMpLCBtb2RfbmVnb3RpYXRpb24gKHR5cGUgbWFwcyksIG9yCiAgICAgbW9kX2Nlcm5fbWV0YSAobWV0YSBmaWxlcykuICBbRGVhbiBHYXVkZXRdCgogICopIFNFQ1VSSVRZOiBBcGFjaGUgd2lsbCByZWZ1c2UgdG8gcnVuIGFzICJVc2VyIHJvb3QiIHVubGVzcwogICAgIEJJR19TRUNVUklUWV9IT0xFIGlzIGRlZmluZWQgYXQgY29tcGlsZSB0aW1lLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBDT05GSUc6IElmIGEgc3ltbGluayBwb2ludGVkIHRvIGEgZGlyZWN0b3J5IHRoZW4gaXQgd291bGQgYmUgZGlzYWxsb3dlZAogICAgIGlmIGl0IGNvbnRhaW5lZCBhIC5odGFjY2VzcyBkaXNhbGxvd2luZyBzeW1saW5rcy4gIFRoaXMgaXMgY29udHJhcnkKICAgICB0byB0aGUgcnVsZSB0aGF0IHN5bWxpbmsgcGVybWlzc2lvbnMgYXJlIHRlc3RlZCB3aXRoIHRoZSBzeW1saW5rCiAgICAgb3B0aW9ucyBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeS4gIFtEZWFuIEdhdWRldF0gUFIjMzUzCgogICopIENPTkZJRzogVGhlIExvY2tGaWxlIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBwbGFjZSB0aGUgc2VyaWFsaXppbmcKICAgICBsb2NrZmlsZSBpbiBhbnkgbG9jYXRpb24uICBJdCBwcmV2aW91c2x5IGRlZmF1bHRlZCB0byAvdXNyL3RtcC9odGxvY2suCiAgICAgW1NvbWVob3cgaXQgdG9vayBmb3VyIG9mIHVzOiBSYW5keSBUZXJidXNoLCBKaW0gSmFnaWVsc2tpLCBEZWFuIEdhdWRldCwKICAgICBNYXJjIFNsZW1rb10KCiAgKikgUmVxdWVzdCBwcm9jZXNzaW5nIG5vdyByZXRhaW5zIHN0YXRlIG9mIHdoZXRoZXIgb3Igbm90IHRoZSByZXF1ZXN0CiAgICAgYm9keSBoYXMgYmVlbiByZWFkLCBzbyB0aGF0IGludGVybmFsIHJlZGlyZWN0cyBhbmQgc3VicmVxdWVzdHMgd2lsbAogICAgIG5vdCB0cnkgdG8gcmVhZCBpdCB0d2ljZSAoYW5kIGJsb2NrKS4gW1JveSBGaWVsZGluZ10KCiAgKikgQWRkIGEgcGxhY2Vob2xkZXIgaW4gbW9kdWxlcy9NYWtlZmlsZSB0byBhdm9pZCBlcnJvcnMgd2l0aCBjZXJ0YWluCiAgICAgbWFrZXMuIFtNYXJjIFNsZW1rb10KCiAgKikgUVVFUllfU1RSSU5HIHdhcyB1bmVzY2FwZWQgaW4gbW9kX2luY2x1ZGUsIGl0IHNob3VsZG4ndCBiZS4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzY0NAoKICAqKSBtb2RfaW5jbHVkZSB3YXMgbm90IHByb3Blcmx5IGNoYW5naW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KICAgICBbTWFyYyBTbGVta29dIFBSIzc0MgoKICAqKSBBdHRlbXB0IHRvIHdvcmsgYXJvdW5kIHByb2JsZW1zIHdpdGggdGhpcmQgcGFydHkgbGlicmFyaWVzIHRoYXQgZG8gbm90CiAgICAgaGFuZGxlIGhpZ2ggbnVtYmVyZWQgZGVzY3JpcHRvcnMgKGV4YW1wbGVzIGluY2x1ZGUgYmluZCwgYW5kCiAgICAgc29sYXJpcyBsaWJjKS4gIE9uIGFsbCBzeXN0ZW1zIGFwYWNoZSBhdHRlbXB0cyB0byBrZWVwIGFsbCBwZXJtYW5lbnQKICAgICBkZXNjcmlwdG9ycyBhYm92ZSAxNSAoY2FsbGVkIHRoZSBsb3cgc2xhY2sgbGluZSkuICBTb2xhcmlzIHVzZXJzCiAgICAgY2FuIGFsc28gYmVuZWZpdCBmcm9tIGFkZGluZyAtREhJR0hfU0xBQ0tfTElORT0yNTYgdG8gRVhUUkFfQ0ZMQUdTCiAgICAgd2hpY2gga2VlcHMgYWxsIG5vbi1GSUxFICogZGVzY3JpcHRvcnMgYWJvdmUgMjU1LiAgT24gYWxsIHN5c3RlbXMKICAgICB0aGlzIHNob3VsZCBtYWtlIHN1cHBvcnRpbmcgbGFyZ2UgbnVtYmVycyBvZiB2aG9zdHMgd2l0aCBtYW55IG9wZW4KICAgICBsb2cgZmlsZXMgbW9yZSBmZWFzaWJsZS4gIElmIHRoaXMgY2F1c2VzIHRyb3VibGUgcGxlYXNlIHJlcG9ydCBpdCwKICAgICB5b3UgY2FuIGRpc2FibGUgdGhpcyB3b3JrYXJvdW5kIGJ5IGFkZGluZyAtRE5PX1NMQUNLIHRvIEVYVFJBX0NGTEFHUy4KICAgICBbRGVhbiBHYXVkZXRdIHZhcmlvdXMgUFJzCgogICopIFJlbGF0ZWQgdG8gdGhlIGxhc3QgZW50cnksIG5ldHdvcmsgc29ja2V0cyBhcmUgbm93IG9wZW5lZCBiZWZvcmUKICAgICBsb2cgZmlsZXMgYXJlIG9wZW5lZC4gIFRoZSBvbmx5IGtub3duIGNhc2Ugd2hlcmUgdGhpcyBjYW4gY2F1c2UKICAgICBwcm9ibGVtcyBpcyB1bmRlciBTb2xhcmlzIHdpdGggbWFueSB2aXJ0dWFsaG9zdHMgYW5kIG1hbnkgTGlzdGVuCiAgICAgZGlyZWN0aXZlcy4gIEJ1dCB1c2luZyAtREhJR0hfU0xBQ0tfTElORT0yNTYgZGVzY3JpYmVkIGFib3ZlIHdpbGwKICAgICB3b3JrIGFyb3VuZCB0aGlzIHByb2JsZW0uICBbRGVhbiBHYXVkZXRdCgogICopIFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVCBpcyBub3cgZGVmYXVsdCBmb3IgRnJlZUJTRCwgQS9VWCwgYW5kCiAgICAgU3VuT1MgNC4KCiAgKikgSW1wcm92ZWQgdW5peCBlcnJvciByZXNwb25zZSBsb2dnaW5nLiAgW01hcmMgU2xlbWtvXQoKICAqKSBVcGRhdGUgbW9kX3Jld3JpdGUgZnJvbSAzLjAuNSB0byAzLjAuNi4gIE5ldyBydWxlZmxhZwogICAgIFFTQT1xdWVyeV9zdHJpbmdfYXBwZW5kLiAgQWxzbyBmaXhlZCBhIG5hc3R5IGJ1ZyBpbiBwZXItZGlyIGNvbnRleHQ6CiAgICAgd2hlbiBhIFVSTCBodHRwOi8vLi4uIHdhcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYSBzcGVjaWFsCiAgICAgcmVkaXJlY3QgZmxhZywgZS5nLiBSPXBlcm1hbmVudCwgdGhlIHBlcm1hbmVudCBzdGF0dXMgd2FzIGxvc3QuCiAgICAgW1JvbmFsZCBUc2NoYWxhZXIgPFJvbmFsZC5Uc2NoYWxhZXIgcHNpLmNoPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgSWYgYW4gb2JqZWN0IGhhcyBtdWx0aXBsZSB2YXJpYW50cyB0aGF0IGFyZSBvdGhlcndpc2UgZXF1YWwgQXBhY2hlCiAgICAgd291bGQgcHJlZmVyIHRoZSBsYXN0IGxpc3RlZCB2YXJpYW50IHJhdGhlciB0aGFuIHRoZSBmaXJzdC4KICAgICBbUGF1bCBTdXR0b25dIFBSIzk0CgogICopICJtYWtlIGNsZWFuIiBhdCB0aGUgdG9wIGxldmVsIG5vdyByZW1vdmVzICouby4gIFtEZWFuIEdhdWRldF0gUFIjNzUyCgogICopIG1vZF9zdGF0dXMgZHVtcHMgY29yZSBpbiBpbmV0ZCBtb2RlLiAgW01hcmMgU2xlbWtvIGFuZCBSb3kgRmllbGRpbmddCiAgICAgUFIjNTY2CgogICopIHByZWdzdWIgaGFkIGFuIG9mZi1ieS0xIGluIGl0cyBlcnJvciBjaGVja2luZyBjb2RlLiBbQWxleGVpIEtvc3V0XQoKICAqKSBQT1JUOiBmaXggcmxpbV90IHByb2JsZW1zIHdpdGggQUlYIDQuMi4gW01hcmMgU2xlbWtvXSBQUiMzMzMKCiAgKikgUE9SVDogVXBkYXRlIFVuaXhXYXJlIHN1cHBvcnQgZm9yIDIuMS4yLgogICAgIFtMYXdyZW5jZSBSb3Nlbm1hbiA8bGVyIGxlcmN0ci5vcmc+XSBQUiM1MTEKCiAgKikgUE9SVDogTm9uU3RvcC1VWCBbSm9hY2hpbSBTY2htaXR6IDxzY2htaXR6X2pvYWNoaW0gdGFuZGVtLmNvbT5dIFBSIzMyNwoKICAqKSBQT1JUOiBVcGRhdGUgQ29udmV4T1Mgc3VwcG9ydCBmb3IgMTEuNS4KICAgICBbRGF2aWQgRGVTaW1vbmUgPGZveCBjb252ZXguY29tPl0gUFIjMzk5CgogICopIFBPUlQ6IFN1cHBvcnQgZm9yIERFQyBjYyBjb21waWxlciB1bmRlciBVTFRSSVguCiAgICAgWyJQLiBBbGVqYW5kcm8gTG9wZXotVmFsZW5jaWEiIDxhbGVqb2xvIGlkZWFtLmdvdi5jbz5dIFBSIzM4OAoKICAqKSBQT1JUOiBTdXBwb3J0IGZvciBNYXhpb24vT1MgU1ZSNC4yIFJlYWwgVGltZSBVbml4LiBbbm8gbmFtZSBnaXZlbl0gUFIjMzgzCgogICopIFBPUlQ6IFdvcmthcm91bmQgZm9yIEFJWCAzLnggY29tcGlsZXIgYnVnIGluIGh0dHBfYnByaW50Zi5jLiAgCiAgICAgW01hcmMgU2xlbWtvXSBQUiM3MjUKCiAgKikgUE9SVDogZml4IHByb2JsZW0gY29tcGlsaW5nIGh0dHBfYnByaW50Zi5jIHdpdGggZ2NjIHVuZGVyIFNDTwogICAgIFtNYXJjIFNsZW1rb10gUFIjNjk1CgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjJiMTEKCiAgKikgRml4ZWQgb3BlbiB0aW1lc3RhbXAgZmQgaW4gcHJveHlfY2FjaGUuYyBbQ2h1Y2sgTXVyY2tvXQoKICAqKSBBZGRlZCB1bmRvY3VtZW50ZWQgcGVybCBTU0kgbWVjaGFuaXNtIGZvciAtRFVTRV9QRVJMX1NTSSBhbmQgbW9kX3BlcmwuCiAgICAgW0RvdWcgTWFjRWFjaGVybiwgUm9iIEhhcnRpbGxdCgogICopIFByb3h5IG5lZWRzIHRvIHVzZSBoYXJkX3RpbWVvdXQgaW5zdGVhZCBvZiBzb2Z0X3RpbWVvdXQgd2hlbiBpdCBpcwogICAgIHJlYWRpbmcgZnJvbSBvbmUgYnVmZmVyIGFuZCB3cml0aW5nIHRvIGFub3RoZXIsIGF0IGxlYXN0IHVudGlsIGl0IGhhcwogICAgIGEgY3VzdG9tIHRpbWVvdXQgaGFuZGxlci4gIFtSb3kgRmllbGRpbmcgYW5kIFBldHIgTGFtcGFdCgogICopIEZpeGVkIHByb2JsZW0gb24gSVJJWCB3aXRoIHNlcnZlcnMgaGFuZ2luZyBpbiBJZGVudGl0eUNoZWNrLAogICAgIGFwcGFyZW50bHkgZHVlIHRvIGEgbWlzbWF0Y2ggYmV0d2VlbiBzaWdhY3Rpb24gYW5kIHNldGptcC4KICAgICBbUm95IEZpZWxkaW5nXSBQUiM1MDIKCiAgKikgTG9nIGNvcnJlY3Qgc3RhdHVzIGNvZGUgaWYgd2UgdGltZW91dCBiZWZvcmUgcmVjZWl2aW5nIGEgcmVxdWVzdCAoNDA4KQogICAgIG9yIGlmIHdlIHJlY2VpdmVkIGEgcmVxdWVzdC1saW5lIHRoYXQgd2FzIHRvbyBsb25nIHRvIHByb2Nlc3MgKDQxNCkuCiAgICAgW0VkIEtvcnRob2YgYW5kIFJveSBGaWVsZGluZ10gUFIjNjAxCgogICopIFZpcnR1YWwgaG9zdHMgd2l0aCB0aGUgc2FtZSBTZXJ2ZXJOYW1lLCBidXQgb24gZGlmZmVyZW50IHBvcnRzLCB3ZXJlCiAgICAgbm90IGJlaW5nIHNlbGVjdGVkIHByb3Blcmx5LiAgW0VkIEtvcnRob2ZdCgogICopIEFkZGVkIGNvZGUgdG8gcmV0dXJuIHRoZSByZXF1ZXN0ZWQgSVAgYWRkcmVzcyBmcm9tIHByb3h5X2hvc3QyYWRkcigpCiAgICAgaWYgZ2V0aG9zdGJ5YWRkcigpIGZhaWxzIGR1ZSB0byByZXZlcnNlIEROUyBsb29rdXAgcHJvYmxlbXMuIE9yaWdpbmFsCiAgICAgY2hhbmdlIHN1Ym1pdHRlZCBieSBKb3pzZWYgSG9sbG9zaSA8aG9sbG9zaSBzYmNtLmNvbT4uCiAgICAgW0NodWNrIE11cmNrb10gUFIjNjE0CgogICopIElmIG11bHRpcGxlIHJlcXVlc3RzIG9uIGEgc2luZ2xlIGNvbm5lY3Rpb24gYXJlIHVzZWQgdG8gcmV0cmlldmUKICAgICBkYXRhIGZyb20gZGlmZmVyZW50IHZpcnR1YWwgaG9zdHMsIHRoZSB2aXJ0dWFsIGhvc3QgbGlzdCB3b3VsZCBiZQogICAgIHNjYW5uZWQgc3RhcnRpbmcgd2l0aCB0aGUgbW9zdCByZWNlbnRseSB1c2VkIFZIIGluc3RlYWQgb2YgdGhlIGZpcnN0LAogICAgIGNhdXNpbmcgbW9zdCB2aXJ0dWFsIGhvc3RzIHRvIGJlIGlnbm9yZWQuCiAgICAgW1BhdWwgU3V0dG9uIGFuZCBNYXJ0aW4gTWFyZXNdIFBSIzYxMAoKICAqKSBUaGUgT1MvMiBoYW5kbGluZyBvZiBwcm9jZXNzIGdyb3VwIHdhcyBicm9rZW4gYnkgYSBwb3J0aW5nIHBhdGNoIGZvcgogICAgIE1QRSwgc28gcmVzdG9yZWQgcHJpb3IgY29kZSBmb3IgT1MvMi4gIFtSb3kgRmllbGRpbmcgYW5kIEdhcmV5IFNtaWxleV0KCiAgKikgSW5oZXJpdCB2aXJ0dWFsIHNlcnZlciBwb3J0IGZyb20gbWFpbiBzZXJ2ZXIgaWYgbm9uZSAob3IgIioiKSBpcwogICAgIGdpdmVuIGZvciBWaXJ0dWFsSG9zdC4gIFtEZWFuIEdhdWRldF0gUFIjNTc2CgogICopIElmIHRoZSBsb29rdXAgZm9yIGEgRGlyZWN0b3J5SW5kZXggbmFtZSB3aXRoIGNvbnRlbnQgbmVnb3RpYXRpb24KICAgICBoYXMgZm91bmQgbWF0Y2hpbmcgdmFyaWFudHMsIGJ1dCBub25lIGFyZSBhY2NlcHRhYmxlLCByZXR1cm4gdGhlCiAgICAgbmVnb3RpYXRpb24gcmVzdWx0IGlmIHRoZXJlIGFyZSBubyBtb3JlIERpcmVjdG9yeUluZGV4IG5hbWVzIHRvIGxvb2t1cC4KICAgICBbUGV0ciBMYW1wYSBhbmQgUm95IEZpZWxkaW5nXQoKICAqKSBJZiBhIHNvZnRfdGltZW91dCBvY2N1cnMgYWZ0ZXIga2VlcGFsaXZlIGlzIHNldCwgdGhlbiB0aGUgbWFpbiBjaGlsZAogICAgIGxvb3Agd291bGQgdHJ5IHRvIHJlYWQgYW5vdGhlciByZXF1ZXN0IGV2ZW4gdGhvdWdoIHRoZSBjb25uZWN0aW9uCiAgICAgaGFzIGJlZW4gYWJvcnRlZC4gIFtSb3kgRmllbGRpbmddCgogICopIENvbmZpZ3VyZSBjaGFuZ2VzOiBBbGxvdyBmb3Igd2hpdGVzcGFjZSBhdCB0aGUgc3RhcnQgb2YgYQogICAgIE1vZHVsZSBkZWNsYXJhdGlvbi4gQWxzbywgYmUgbW9yZSB1bmRlcnN0YW5kaW5nIGFib3V0IHRoZQogICAgIENDPS9PUFRJTT0gZm9ybWF0IGluIENvbmZpZ3VyYXRpb24uIEZpbmFsbHksIGZpeCBjb21waWxlcgogICAgIGZsYWdzIGlmIHVzaW5nIEhQLVVYJ3MgY2MgY29tcGlsZXIuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBTdWJyZXF1ZXN0cyBhbmQgaW50ZXJuYWwgcmVkaXJlY3RzIG5vdyBpbmhlcml0IHRoZV9yZXF1ZXN0IGZyb20gdGhlCiAgICAgb3JpZ2luYWwgcmVxdWVzdC1saW5lLiBbUm95IEZpZWxkaW5nXQoKICAqKSBUZXN0IGZvciBlcnJvciBjb25kaXRpb25zIGJlZm9yZSBjcmVhdGluZyBvdXRwdXQgaGVhZGVyIGZpZWxkcywgc2luY2UKICAgICB3ZSBkb24ndCB3YW50IHRoZSBlcnJvciBtZXNzYWdlIHRvIGluY2x1ZGUgdGhvc2UgZmllbGRzLiAgTGlrZXdpc2UsCiAgICAgcmVzZXQgdGhlIGNvbnRlbnRfbGFuZ3VhZ2UocykgYW5kIGNvbnRlbnRfZW5jb2Rpbmcgb2YgdGhlIHJlc3BvbnNlCiAgICAgYmVmb3JlIGdlbmVyYXRpbmcgb3IgcmVkaXJlY3RpbmcgdG8gYW4gZXJyb3IgbWVzc2FnZSwgc2luY2UgdGhlIG5ldwogICAgIG1lc3NhZ2Ugd2lsbCBoYXZlIGl0cyBvd24gQ29udGVudC0qIGRlZmluaXRpb25zLiBbRGVhbiBHYXVkZXRdCgogICopIFJlc3RvcmVkIHRoZSBzZW1hbnRpY3Mgb2YgaGVhZGVyc19vdXQgKGhlYWRlcnMgc2VudCBvbmx5IHdpdGggMjAwLi4yOTkKICAgICBhbmQgMzA0IHJlc3BvbnNlcykgYW5kIGVycl9oZWFkZXJzX291dCAoaGVhZGVycyBzZW50IHdpdGggYWxsIHJlc3BvbnNlcykuCiAgICAgQXZvaWQgdGhlIG92ZXJoZWFkIG9mIGNvcHlpbmcgdGFibGVzIGlmIGVycl9oZWFkZXJzX291dCBpcyBlbXB0eQogICAgICh0aGUgdXN1YWwgY2FzZSkuICBbUm95IEZpZWxkaW5nXQoKICAqKSBGaXhlZCBhIGNvdXBsZSBwbGFjZXMgd2hlcmUgYSBjaGVjayBmb3IgdGhlIGRlZmF1bHQgQ29udGVudC1UeXBlIHdhcwogICAgIG5vdCBwcm9wZXJseSBjaGVja2luZyBib3RoIHRoZSB2YWx1ZSBjb25maWd1cmVkIGJ5IHRoZSBEZWZhdWx0VHlwZQogICAgIGRpcmVjdGl2ZSBhbmQgdGhlIERFRkFVTFRfVFlQRSBzeW1ib2wgaW4gaHR0cGQuaC4gIENoYW5nZWQgdGhlIHZhbHVlCiAgICAgb2YgREVGQVVMVF9UWVBFIHRvIG1hdGNoIHRoZSBkb2N1bWVudGVkIGRlZmF1bHQgKHRleHQvcGxhaW4pLgogICAgIFtEZWFuIEdhdWRldF0gUFIjNTA2CgogICopIEVzY2FwZSB0aGUgSFRNTC1zZW5zaXRpdmUgY2hhcmFjdGVycyBpbiB0aGUgUmVxdWVzdC1VUkkgdGhhdCBpcwogICAgIG91dHB1dCBmb3IgZWFjaCBjaGlsZCBieSBtb2Rfc3RhdHVzLiBbRGVhbiBHYXVkZXQgYW5kIEtlbiBDb2FyXSBQUiM1MDEKCiAgKikgUHJvcGVybHkgaW5pdGlhbGl6ZSB0aGUgZmxvY2sgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBtdXRleCBsb2NraW5nCiAgICAgYXJvdW5kIGFjY2VwdCgpIHdoZW4gVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUIGlzIGRlZmluZWQuCiAgICAgW01hcmMgU2xlbWtvXQoKICAqKSBUaGUgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBQQVRIX0lORk8gaGFzIGJlZW4gcmVzdG9yZWQgdG8gdGhlIHByZS0xLjJiCiAgICAgKGFuZCBOQ1NBIGh0dHBkKSBkZWZpbml0aW9uIHdoZXJlaW4gaXQgd2FzIHRoZSBleHRyYSBwYXRoIGluZm8gYmV5b25kCiAgICAgdGhlIENHSSBzY3JpcHQgZmlsZW5hbWUuICBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgRklMRVBBVEhfSU5GTyBoYXMKICAgICBiZWVuIHJlbW92ZWQsIGFuZCBpbnN0ZWFkIHdlIHN1cHBseSB0aGUgb3JpZ2luYWwgUkVRVUVTVF9VUkkgdG8gYW55CiAgICAgc2NyaXB0IHRoYXQgd2FudHMgdG8gYmUgQXBhY2hlLXNwZWNpZmljIGFuZCBuZWVkcyB0aGUgcmVhbCBVUkkgcGF0aC4KICAgICBUaGlzIHNvbHZlcyBhIHByb2JsZW0gd2l0aCBleGlzdGluZyBzY3JpcHRzIHRoYXQgdXNlIGV4dHJhIHBhdGggaW5mbwogICAgIGluIHRoZSBTY3JpcHRBbGlhcyBkaXJlY3RpdmUgdG8gcGFzcyBvcHRpb25zIHRvIHRoZSBDR0kgc2NyaXB0LgogICAgIFtSb3kgRmllbGRpbmddCgogICopIFRoZSBfZGVmYXVsdF8gY2hhbmdlIGluIDEuMmIxMCB3aWxsIGNoYW5nZSB0aGUgYmVoYXZpb3VyIG9uIGNvbmZpZ3MKICAgICB0aGF0IHVzZSBtdWx0aXBsZSBMaXN0ZW4gc3RhdGVtZW50cyBmb3IgbGlzdGVuaW5nIG9uIG11bHRpcGxlIHBvcnRzLgogICAgIEJ1dCB0aGF0IGNoYW5nZSBpcyBuZWNlc3NhcnkgdG8gbWFrZSBfZGVmYXVsdF8gY29uc2lzdGVudCB3aXRoIG90aGVyCiAgICAgZm9ybXMgb2YgPFZpcnR1YWxIb3N0Pi4gIEl0IHJlcXVpcmVzIHN1Y2ggY29uZmlncyB0byBiZSBtb2RpZmllZAogICAgIHRvIHVzZSA8VmlydHVhbEhvc3QgX2RlZmF1bHRfOio+LiAgVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4KICAgICB1cGRhdGVkLiAgW0RlYW4gR2F1ZGV0XSBQUiM1MzAKCiAgKikgSWYgYW4gRXJyb3JEb2N1bWVudCBDR0kgc2NyaXB0IGlzIHVzZWQgdG8gcmVzcG9uZCB0byBhbiBlcnJvcgogICAgIGdlbmVyYXRlZCBieSBhbm90aGVyIENHSSBzY3JpcHQgd2hpY2ggaGFzIGFscmVhZHkgcmVhZCB0aGUgbWVzc2FnZQogICAgIGJvZHkgb2YgdGhlIHJlcXVlc3QsIHRoZSBzZXJ2ZXIgd291bGQgYmxvY2sgdHJ5aW5nIHRvIHJlYWQgdGhlCiAgICAgbWVzc2FnZSBib2R5IGFnYWluLiAgW1JvYiBIYXJ0aWxsXQoKICAqKSBzaWduYWwoKSByZXBsYWNlbWVudCBjb25mbGljdGVkIHdpdGggYSBkZWZpbmUgb24gUU5YIChhbmQgcG90ZW50aWFsbHkKICAgICBvdGhlciBwbGF0Zm9ybXMpLiBGaXhlZC4gW0JlbiBMYXVyaWVdIFBSIzUxMgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjJiMTAKCiAgKikgQWxsb3cgSFRUUERfUk9PVCwgU0VSVkVSX0NPTkZJR19GSUxFLCBERUZBVUxUX1BBVEgsIGFuZCBTSEVMTF9QQVRICiAgICAgdG8gYmUgY29uZmlndXJlZCB2aWEgLUQgaW4gQ29uZmlndXJhdGlvbi4gIFtEZWFuIEdhdWRldF0gUFIjNDQ5CgogICopIDxWaXJ0dWFsSG9zdCBfZGVmYXVsdF86cG9ydG51bT4gZGlkbid0IHdvcmsgcHJvcGVybHkuICBbRGVhbiBHYXVkZXRdCgogICopIEFkZGVkIHByb3RvdHlwZSBmb3IgbWt0ZW1wKCkgZm9yIFNVTk9TNCBbTWFyYyBTbGVta29dCgogICopIEluIG1vZF9wcm94eS5jLCBjaGVjayByZXR1cm4gdmFsdWVzIGZvciBwcm94eV9ob3N0MmFkZHIoKSB3aGVuIHJlYWRpbmcKICAgICBjb25maWcsIGluIGNhc2UgdGhlIGhvc3RlbnQgc3RydWN0IHJldHVybmVkIGlzIHRyYXNoLgogICAgIFtDaHVjayBNdXJja29dIFBSICM0OTEKCiAgKikgRml4ZWQgdGhlIGZpeCBpbiAxLjJiOSBmb3IgcGFyc2luZyBVUkwgcXVlcnkgaW5mbyBpbnRvIGFyZ3MgZm9yIENHSQogICAgIHNjcmlwdHMuICBbRGVhbiBHYXVkZXQsIFJveSBGaWVsZGluZywgTWFyYyBTbGVta29dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMmI5ICBbbmV2ZXIgYW5ub3VuY2VkXQoKICAqKSBSZXNldCB0aGUgTU9EVUxFX01BR0lDX05VTUJFUiB0byBhY2NvdW50IGZvciB0aGUgdW5zaWduZWQgcG9ydAogICAgIGNoYW5nZXMgYW5kIGluIGFudGljaXBhdGlvbiBvZiAxLjIgZmluYWwgcmVsZWFzZS4gIFtSb3kgRmllbGRpbmddCgogICopIEZpeCBwcm9ibGVtIHdpdGggc2NyaXB0cyBub3QgcmVjZWl2aW5nIGEgU0lHUElQRSB3aGVuIGNsaWVudCBkcm9wcwogICAgIHRoZSBjb25uZWN0aW9uIChlLmcuLCB3aGVuIHVzZXIgcHJlc3NlcyBTdG9wKS4gIEFwYWNoZSB3aWxsIG5vdyBzdG9wCiAgICAgdHJ5aW5nIHRvIHNlbmQgYSBtZXNzYWdlIGJvZHkgaW1tZWRpYXRlbHkgYWZ0ZXIgYW4gZXJyb3IgZnJvbSB3cml0ZS4KICAgICBbUm95IEZpZWxkaW5nIGFuZCBOYXRoYW4gS3Vyel0gUFIjMzM1CgogICopIFJlYXJyYW5nZSBDb25maWd1cmF0aW9uLnRtcGwgc28gdGhhdCBtb2RfcmV3cml0ZSBoYXMgaGlnaGVyIHByaW9yaXR5CiAgICAgdGhhbiBtb2RfYWxpYXMsIGFuZCBtb2RfYWxpYXMgaGFzIGhpZ2hlciBwcmlvcml0eSB0aGFuIG1vZF9wcm94eTsKICAgICByZWFycmFuZ2VkIG90aGVyIG1vZHVsZXMgdG8gZW5oYW5jZSB1bmRlcnN0YW5kaW5nIG9mIHRoZWlyIHB1cnBvc2UKICAgICBhbmQgcmVsYXRpdmUgb3JkZXIgKGFuZCBtYXliZSBldmVuIHJlZHVjZSBzb21lIG92ZXJoZWFkKS4KICAgICBbUm95IEZpZWxkaW5nIGFuZCBTYW1lZXIgUGFyZWtoXQoKICAqKSBGaXggZ3JhY2VmdWwgcmVzdGFydC4gIEVsaW1pbmF0ZSBtYW55IHNpZ25hbC1yZWxhdGVkIHJhY2UKICAgICBjb25kaXRpb25zIGluIGJvdGggZm9ybXMgb2YgcmVzdGFydCwgYW5kIGluIFNJR1RFUk0uICBTZWUKICAgICBodGRvY3MvbWFudWFsL3N0b3BwaW5nLmh0bWwgZm9yIGRldGFpbHMgb24gc3RvcHBpbmcgYW5kCiAgICAgcmVzdGFydGluZyB0aGUgcGFyZW50LiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXggbWVtb3J5IGxlYWtzIGluIG1vZF9yZXdyaXRlLCBtb2RfYnJvd3NlciwgbW9kX2luY2x1ZGUuICBUdW5lCiAgICAgbWVtb3J5IGFsbG9jYXRvciB0byBhdm9pZCBhIGJlaGF2aW91ciB0aGF0IHJlcXVpcmVkIGV4dHJhIGJsb2NrcyB0bwogICAgIGJlIGFsbG9jYXRlZC4gIFtEZWFuIEdhdWRldF0KCiAgKikgQWxsb3cgc3VleGVjIHRvIGFjY2VzcyBmaWxlcyByZWxhdGl2ZSB0byBjdXJyZW50IGRpcmVjdG9yeSBidXQgbm90CiAgICAgYWJvdmUuICAoRXhjbHVkaW5nIGxlYWRpbmcgLyBvciBhbnkgLi4gZGlyZWN0b3J5LikgIFtLZW4gQ29hcl0KICAgICBQUiMyNjksIDMxOSwgMzk1CgogICopIEZpeCBzdWV4ZWMgc2VnZmF1bHQgd2hlbiBncm91cCBkb2Vzbid0IGV4aXN0LiBbR3JlZ29yeSBOZWlsIFNoYXBpcm9dCiAgICAgUFIjMzY3LCAzNjgsIDM1NCwgNDUzCgogICopIEZpeCB0aGUgYWJvdmUgZml4OiBpZiBzdWV4ZWMgaXMgZW5hYmxlZCwgYXZvaWQgZGVzdHJveWluZyByLT51cmwKICAgICB3aGlsZSBvYnRhaW5pbmcgdGhlIC9+dXNlciBhbmQgc2F2ZSB0aGUgdXNlcm5hbWUgaW4gYSBzZXBhcmF0ZSBkYXRhCiAgICAgYXJlYSBzbyB0aGF0IGl0IHdvbid0IGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBjYWxsIHRvIGdldGdyZ2lkKCksIGFuZAogICAgIGZpeCBzb21lIG1pc3VzZSBvZiB0aGUgcG9vbCBzdHJpbmcgYWxsb2NhdGlvbiBmdW5jdGlvbnMuICBBbHNvIGZpeGVzCiAgICAgYSBnZW5lcmFsIHByb2JsZW0gd2l0aCBwYXJzaW5nIFVSTCBxdWVyeSBpbmZvIGludG8gYXJncyBmb3IgQ0dJIHNjcmlwdHMuCiAgICAgW1JveSBGaWVsZGluZ10gUFIjMzM5LCAzNjcsIDM1NCwgNDUzCgogICopIEZpeCBJUklYIHdhcm5pbmcgYWJvdXQgYnplcm8gdW5kZWZpbmVkLiBbTWFyYyBTbGVta29dCgogICopIEZpeCBwcm9ibGVtIHdpdGggPERpcmVjdG9yeSBwcm94eTouLi4+LiBbTWFydGluIEtyYWVtZXJdIFBSIzI3MQoKICAqKSBDb3JyZWN0ZWQgc3BlbGxpbmcgb2YgImF1dGhvcml0YXRpdmUiLiAgQXV0aERCQXV0aG9yYXRhdGl2ZSBiZWNhbWUKICAgICBBdXRoREJBdXRob3JpdGF0aXZlLiBbTWFyYyBTbGVta29dIFBSIzQyMAoKICAqKSBNYXhDbGllbnRzIHNob3VsZCBiZSBhdCBsZWFzdCAxLiBbTGFycyBFaWxlYnJlY2h0XSBQUiMzNzUKCiAgKikgVGhlIGRlZmF1bHQgaGFuZGxlciBub3cgbG9ncyBpbnZhbGlkIG1ldGhvZHMgb3IgVVJJcyAoaS5lLiBQVVQgb24gYW4KICAgICBvYmplY3QgdGhhdCBjYW4ndCBiZSBQVVQsIG9yIEZPT0JBUiBmb3Igc29tZSBtZXRob2QgRk9PQkFSIHRoYXQKICAgICBhcGFjaGUgZG9lc24ndCBrbm93IGFib3V0IGF0IGFsbCkuICBMb2cgNDA0cyB0aGF0IG9jY3VyIGluIG1vZF9pbmNsdWRlLgogICAgIFtQYXVsIFN1dHRvbiwgSm9obiBWYW4gRXNzZW5dCgogICopIElmIGEgc29mdCB0aW1lb3V0IChvciBsaW5nZXJvdXQpIG9jY3VycyB3aGlsZSB0cnlpbmcgdG8gZmx1c2ggYQogICAgIGJ1ZmZlciBvciB3cml0ZSBpbnNpZGUgYnVmZi5jIG9yIGZyZWFkJ2luZyBmcm9tIGEgQ0dJJ3Mgb3V0cHV0LAogICAgIHRoZW4gdGhlIHRpbWVvdXQgd291bGQgYmUgaWdub3JlZC4gW1JveSBGaWVsZGluZ10gUFIjMzczCgogICopIFdvcmsgYXJvdW5kIGEgYnVnIGluIE5ldHNjYXBlIE5hdmlnYXRvciB2ZXJzaW9ucyAyLngsIDMueCBhbmQgNC4wYjIncwogICAgIHBhcnNpbmcgb2YgaGVhZGVycy4gIElmIHRoZSB0ZXJtaW5hdGluZyBlbXB0eS1saW5lIENSTEYgb2NjdXJzIHN0YXJ0aW5nCiAgICAgYXQgdGhlIDI1NnRoIG9yIDI1N3RoIGJ5dGUgb2Ygb3V0cHV0LCB0aGVuIE5hdmlnYXRvciB3aWxsIHRoaW5rIGEgbm9ybWFsCiAgICAgaW1hZ2UgaXMgaW52YWxpZC4gIFdlIGFyZSBndWVzc2luZyB0aGF0IHRoaXMgaXMgYmVjYXVzZSB0aGVpciBpbml0aWFsCiAgICAgcmVhZCBvZiBhIG5ldyByZXF1ZXN0IHVzZXMgYSAyNTYgYnl0ZSBidWZmZXIuIFdlIGNoZWNrIHRoZSBieXRlcyB3cml0dGVuCiAgICAgc28gZmFyIGFuZCwgaWYgd2UgYXJlIGFib3V0IHRvIHRpY2tsZSB0aGUgYnVnLCB3ZSBpbnN0ZWFkIGluc2VydCBhCiAgICAgcGFkZGluZyBoZWFkZXIgb2YgZW1pbmVudCBib2dvc2l0eS4gW1JveSBGaWVsZGluZyBhbmQgRGVhbiBHYXVkZXRdIFBSIzIzMgoKICAqKSBGaXhlZCBTSUdTRUdWIHByb2JsZW0gd2hlbiBhIERpcmVjdG9yeUluZGV4IGZpbGUgaXMgYWxzbyB0aGUgc291cmNlCiAgICAgb2YgYW4gZXh0ZXJuYWwgcmVkaXJlY3Rpb24uICBbUm95IEZpZWxkaW5nIGFuZCBQYXVsIFN1dHRvbl0KCiAgKikgQ29uZmlndXJlIHdvdWxkIGNyZWF0ZSBhIGJyb2tlbiBNYWtlZmlsZSBpZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCiAgICAgY29udGFpbmVkIGEgY29tbWVudGVkLW91dCBSdWxlLiAgW1JveSBGaWVsZGluZ10KCiAgKikgUHJvbW90ZSBwZXJfZGlyX2NvbmZpZyBhbmQgc3VicHJvY2Vzc19lbnYgZnJvbSB0aGUgc3VicmVxdWVzdCB0byB0aGUKICAgICBtYWluIHJlcXVlc3QgaW4gbW9kX25lZ290aWF0aW9uLiAgSW4gcGFydGljdWxhciB0aGlzIGZpeGVzIGEgYnVnCiAgICAgd2hlcmUgPEZpbGVzPiBzZWN0aW9ucyB3b3VsZG4ndCBwcm9wZXJseSBhcHBseSB0byBuZWdvdGlhdGVkIGNvbnRlbnQuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXggYSBwb3RlbnRpYWwgZGVhZGxvY2sgaW4gbW9kX2NnaSBzY3JpcHRfZXJyIGhhbmRsaW5nLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSByb3RhdGVsb2dzIHplcm8tcGFkcyB0aGUgbG9nZmlsZSBuYW1lcyB0byBpbXByb3ZlIGFscGhhYmV0aWMgc29ydGluZy4KICAgICBbTWl0Y2hlbGwgQmxhbmsgSnJdCgogICopIFVwZGF0ZWQgbW9kX3Jld3JpdGUgdG8gMy4wLjQ6IEZpeGVzIEhUVFAgcmVkaXJlY3RzIGZyb20gd2l0aGluCiAgICAgLmh0YWNjZXNzIGZpbGVzIGJlY2F1c2UgdGhlIFJld3JpdGVCYXNlIHdhcyBub3QgcmVwbGFjZWQgY29ycmVjdGx5LgogICAgIFVwZGF0ZWQgbW9kX3Jld3JpdGUgdG8gMy4wLjU6IEZpeGVzIHByb2JsZW0gd2l0aCByZXdyaXRpbmcgaW5zaWRlCiAgICAgPERpcmVjdG9yeT4gc2VjdGlvbnMgbWlzc2luZyBhIHRyYWlsaW5nIC8uICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQ2xlYW4gdXAgTGludXggc2V0dGluZ3MgaW4gY29uZi5oIGJ5IGRldGVjdGluZyAyLnggdmVyc3VzIDEueC4gIEZvcgogICAgIDEueCB0aGUgc2V0dGluZ3MgYXJlIHRob3NlIG9mIHByZS0xLjJiOC4gIEZvciAyLnggd2UgaW5jbHVkZQogICAgIFVTRV9TSE1HRVRfU0NPUkVCT0FSRCAoc2NvcmVib2FyZCBpbiBzaGFyZWQgbWVtb3J5IHJhdGhlciB0aGFuIGZpbGUpIGFuZAogICAgIEhBVkVfU1lTX1JFU09VUkNFX0ggKGVuYWJsZSB0aGUgUkxpbWl0IGNvbW1hbmRzKS4KICAgICBbRGVhbiBHYXVkZXRdIFBSIzMzNiwgUFIjMzQwCgogICopIFJlZGlyZWN0IGRpZCBub3QgcHJlc2VydmUgP3F1ZXJ5X3N0cmluZ3Mgd2hlbiBwcmVzZW50IGluIHRoZSBjbGllbnQncwogICAgIHJlcXVlc3QuICBbRGVhbiBHYXVkZXRdCgogICopIENvbmZpZ3VyZSB3YXMgZmluZGluZyBub24tbW9kdWxlcyBvbiBFWFRSQV9MSUJTLiBbRnJhbmsgQ3JpbmdsZV0gUFIjMzgwCgogICopIFVzZSAvYmluL3NoNSBvbiBVTFRSSVguICBbUC4gQWxlamFuZHJvIExvcGV6LVZhbGVuY2lhXSBQUiMzNjkKCiAgKikgQWRkIFVuaXhXYXJlIGNvbXBpbGUvaW5zdGFsbCBpbnN0cnVjdGlvbnMuICBbQ2h1Y2sgTXVyY2tvXQoKICAqKSBBZGQgbW9kX2V4YW1wbGUgKGlsbHVzdHJhdGlvbiBvZiBBUEkgdGVjaG5pcXVlcykuICBbS2VuIENvYXJdCgogICopIEFkZCBtYWNybyBmb3IgbWVtbW92ZSB0byBjb25mLmggZm9yIFNVTk9TNC4gW01hcmMgU2xlbWtvXQoKICAqKSBJbXByb3ZlIGhhbmRsaW5nIG9mIGRpcmVjdG9yaWVzIHdoZW4gZmlsZW5hbWVzIGhhdmUgc3BhY2VzIGluIHRoZW0uCiAgICAgW0NodWNrIE11cmNrb10KCiAgKikgRm9yIGhvc3RzIHdpdGggbXVsdGlwbGUgSVAgYWRkcmVzc2VzLCB0cnkgYWxsIGFkZGl0aW9uYWwgYWRkcmVzc2VzIGlmCiAgICAgbmVjZXNzYXJ5IHRvIGdldCBhIGNvbm5lY3QuIEZhaWwgb25seSBpZiBob3N0ZW50IGFkZHJlc3MgbGlzdCBpcwogICAgIGV4aGF1c3RlZC4gW0NodWNrIE11cmNrb10KCiAgKikgTW9yZSBzaWduZWQvdW5zaWduZWQgcG9ydCBmaXhlcy4gIFtEZWFuIEdhdWRldF0KCiAgKikgSEFSRF9TRVJWRVJfTElNSVQgY2FuIGJlIGRlZmluZWQgaW4gdGhlIENvbmZpZ3VyYXRpb24gZmlsZSBub3cuCiAgICAgW0RlYW4gR2F1ZGV0XQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjJiOAoKICAqKSBzdWV4ZWMuYyBkb2Vzbid0IGNsb3NlIHRoZSBsb2cgZmlsZSwgYWxsb3dpbmcgQ0dJcyB0byBjb250aW51ZSB3cml0aW5nCiAgICAgdG8gaXQuICBbTWFyYyBTbGVta29dCgogICopIFRoZSBhZGRpdGlvbiBvZiA8TG9jYXRpb24+IGFuZCA8RmlsZT4gZGlyZWN0aXZlcyBtYWRlIHRoZQogICAgIHN1Yl9yZXFfbG9va3VwX3NpbXBsZSgpIGZ1bmN0aW9uIGJvZ3VzLCBzbyB3ZSBub3cgaGFuZGxlCiAgICAgdGhlIHNwZWNpYWwgY2FzZXMgZGlyZWN0bHkuICBbRGVhbiBHYXVkZXRdCgogICopIFdlIG5vdyB0cnkgdG8gbG9nIHdoZXJlIHRoZSBzZXJ2ZXIgaXMgZHVtcGluZyBjb3JlIHdoZW4gYSBmYXRhbAogICAgIHNpZ25hbCBpcyByZWNlaXZlZC4gIFtLZW4gQ29hcl0KCiAgKikgSW1wcm92ZWQgbGluZ2VyaW5nX2Nsb3NlIGJ5IGFkZGluZyBhIHNwZWNpYWwgdGltZW91dCwgcmVtb3ZpbmcgdGhlCiAgICAgc3B1cmlvdXMgbG9nIG1lc3NhZ2VzLCByZW1vdmluZyB0aGUgbm9uYmxvY2tpbmcgc2V0dGluZ3MgKHRoZXkKICAgICBhcmUgbm90IG5lZWRlZCB3aXRoIHRoZSBiZXR0ZXIgdGltZW91dCksIGFuZCBhZGRpbmcgY29tbWVudGFyeQogICAgIGFib3V0IHRoZSBOT19MSU5HQ0xPU0UgYW5kIFVTRV9TT19MSU5HRVIgaXNzdWVzLiAgTk9fTElOR0NMT1NFIGlzCiAgICAgbm93IHRoZSBkZWZhdWx0IGZvciBTdW5PUzQsIFVuaXhXYXJlLCBOZVhULCBhbmQgSVJJWC4gIFtSb3kgRmllbGRpbmddCgogICopIFNlbmQgZXJyb3IgbWVzc2FnZXMgYWJvdXQgc2V0c29ja29wdCBmYWlsdXJlcyB0byB0aGUgc2VydmVyIGVycm9yCiAgICAgbG9nIGluc3RlYWQgb2Ygc3RkZXJyLiAgW1JveSBGaWVsZGluZ10KCiAgKikgRml4IGxvb3Bob2xlcyBpbiBwcm94eSBjYWNoZSBleHBpcnkgdmlzIGEgdmlzIGFsYXJtcy4gW0JyaWFuIE1vb3JlXQoKICAqKSBTdG9wZ2FwIHNvbHV0aW9uIGZvciBDR0kgMy1zZWNvbmQgZGVsYXkgd2l0aCBzZXJ2ZXItc2lkZSBpbmNsdWRlczogaWYKICAgICBwcm9jZXNzaW5nIGEgc3VicmVxdWVzdCwgYWxsb2NhdGUgbWVtb3J5IGZyb20gci0+bWFpbi0+cG9vbCBpbnN0ZWFkCiAgICAgb2Ygci0+cG9vbCBzbyB0aGF0IHdlIGNhbiBhdm9pZCB3YWl0aW5nIGZvciBmcmVlX3Byb2NfY2hhaW4gdG8gY2xlYW51cAogICAgIGluIHRoZSBtaWRkbGUgb2YgYW4gU1NJIHJlcXVlc3QuICBbRGVhbiBHYXVkZXRdIFBSICMxMjIKCiAgKikgRml4ZWQgc3RhdHVzIG9mIHJlc3BvbnNlIHdoZW4gUE9TVCBpcyByZWNlaXZlZCBmb3IgYSBub25leGlzdGVudCBVUkwKICAgICAod2FzIHNlbmRpbmcgNDA1LCBub3cgNDA0KSBhbmQgd2hlbiBhbnkgbWV0aG9kIGlzIHNlbnQgd2l0aCBhCiAgICAgZnVsbC1VUkkgdGhhdCBkb2Vzbid0IG1hdGNoIHRoZSBzZXJ2ZXIgYW5kIHRoZSBzZXJ2ZXIgaXMgbm90IGFjdGluZwogICAgIGFzIGEgcHJveHkgKHdhcyBzZW5kaW5nIDUwMSwgbm93IDQwMykuICBbUm95IEZpZWxkaW5nXQoKICAqKSBIb3N0IHBvcnQgY2hhbmdlZCB0byB1bnNpZ25lZCBzaG9ydC4gW0tlbiBDb2FyXSBQUiAjMjc2CgogICopIEZpeCB0eXBvIGluIGNvbW1hbmQgZGVmaW5pdGlvbiBvZiBBdXRoQXV0aG9yaXRhdGl2ZS4gW0tlbiBDb2FyXSBQUiAjMjQ2CgogICopIERlZmluZWQgVVNFX1NITUdFVF9TQ09SRUJPQVJEIGZvciBzaGFyZWQgbWVtb3J5IG9uIExpbnV4LiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBSZXBvcnQgZXh0cmEgaW5mbyBmcm9tIGVycm5vIHdpdGggbWFueSBlcnJvcnMgdGhhdCBjYXVzZSBodHRwZCB0byBleGl0LgogICAgIHNwYXduX2NoaWxkLCBwb3BlbmYsIGFuZCBwY2xvc2VmIG5vdyBoYXZlIHZhbGlkIGVycm5vIHJldHVybnMgaW4gdGhlCiAgICAgZXZlbnQgb2YgYW4gZXJyb3IuICBDb3JyZWN0IHByb2JsZW1zIHdoZXJlIGVycm5vIHdhcyBzdG9tcGVkIG9uCiAgICAgYmVmb3JlIGJlaW5nIHJlcG9ydGVkLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBJbiB0aGUgcHJveHksIGlmIHRoZSBjYWNoZSBmaWxlc3lzdGVtIHdhcyBmdWxsLCBnYXJiYWdlX2NvbGwoKSB3YXMKICAgICBuZXZlciBjYWxsZWQsIGFuZCB0aHVzIHRoZSBmaWxlc3lzdGVtIHdvdWxkIHJlbWFpbiBmdWxsIGluZGVmaW5pdGVseS4KICAgICBXZSBub3cgYWxzbyByZW1vdmUgaW5jb21wbGV0ZSBjYWNoZSBmaWxlcyBsZWZ0IGlmIHRoZSBvcmlnaW4gc2VydmVyCiAgICAgZGlkbid0IHNlbmQgYSBDb250ZW50LUxlbmd0aCBoZWFkZXIgYW5kIGVpdGhlciB0aGUgY2xpZW50IGhhcyBhYm9ydGVkCiAgICAgdHJhbnNmZXIgb3IgYndyaXRlKCkgdG8gY2xpZW50IGhhcyBmYWlsZWQuIFtQZXRyIExhbXBhXQoKICAqKSBGaXhlZCB0aGUgaGFuZGxpbmcgb2YgbW9kdWxlIGFuZCBzY3JpcHQtYWRkZWQgaGVhZGVyIGZpZWxkcy4KICAgICBJbXByb3ZlZCB0aGUgaW50ZXJmYWNlIGZvciBzZW5kaW5nIGhlYWRlciBmaWVsZHMgYW5kIHJlZHVjZWQKICAgICB0aGUgZHVwbGljYXRpb24gb2YgY29kZSBiZXR3ZWVuIHNlbmRpbmcgb2theSByZXNwb25zZXMgYW5kIGVycm9ycy4KICAgICBXZSBub3cgYWx3YXlzIHNlbmQgYm90aCBoZWFkZXJzX291dCBhbmQgZXJyX2hlYWRlcnNfb3V0LCBhbmQKICAgICBlbnN1cmUgdGhhdCB0aGUgc2VydmVyLXJlc2VydmVkIGZpZWxkcyBhcmUgbm90IGJlaW5nIG92ZXJyaWRkZW4sCiAgICAgd2hpbGUgbm90IG92ZXJyaWRpbmcgdGhvc2UgdGhhdCBhcmUgbm90IHJlc2VydmVkLiAgW1JveSBGaWVsZGluZ10KCiAgKikgTW92ZWQgdHJhbnNwYXJlbnQgY29udGVudCBuZWdvdGlhdGlvbiBmaWVsZHMgdG8gZXJyX2hlYWRlcnNfb3V0CiAgICAgdG8gcmVmbGVjdCBhYm92ZSBjaGFuZ2VzLiAgW1BldHIgTGFtcGFdCgogICopIEZpeGVkIHRoZSBkZXRlcm1pbmF0aW9uIG9mIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBtYWtlIHRoZQogICAgIGNvbm5lY3Rpb24gcGVyc2lzdGVudCBmb3IgYWxsIG9mIHRoZSBjYXNlcyB3aGVyZSBzb21lIG90aGVyIHBhcnQKICAgICBvZiB0aGUgc2VydmVyIGhhcyBhbHJlYWR5IGluZGljYXRlZCB0aGF0IHdlIHNob3VsZCBub3QuICBBbHNvCiAgICAgaW1wcm92ZWQgdGhlIG9yZGVyaW5nIG9mIHRoZSB0ZXN0IHNvIHRoYXQgY2h1bmtlZCBlbmNvZGluZyB3aWxsCiAgICAgYmUgc2V0IHdoZW5ldmVyIGl0IGlzIGRlc2lyZWQgaW5zdGVhZCBvZiBvbmx5IHdoZW4gS2VlcEFsaXZlCiAgICAgaXMgZW5hYmxlZC4gQWRkZWQgcGVyc2lzdGVudCBjb25uZWN0aW9uIGNhcGFiaWxpdHkgZm9yIG1vc3QgZXJyb3IKICAgICByZXNwb25zZXMgKHRob3NlIHRoYXQgZG8gbm90IGluZGljYXRlIGEgYmFkIGlucHV0IHN0cmVhbSkgd2hlbgogICAgIGFjY2Vzc2VkIGJ5IGFuIEhUVFAvMS4xIGNsaWVudC4gW1JveSBGaWVsZGluZ10KCiAgKikgQWRkZWQgbWlzc2luZyB0aW1lb3V0cyBmb3Igc2VuZGluZyBoZWFkZXIgZmllbGRzLCBlcnJvciByZXNwb25zZXMsCiAgICAgYW5kIHRoZSBsYXN0IGNodW5rIG9mIGNodW5rZWQgZW5jb2RpbmcsIGVhY2ggb2Ygd2hpY2ggY291bGQgaGF2ZQogICAgIHJlc3VsdGVkIGluIGEgcHJvY2VzcyBiZWluZyBzdHVjayBpbiB3cml0ZSBmb3JldmVyLiAgVXNpbmcgc29mdF90aW1lb3V0CiAgICAgcmVxdWlyZXMgdGhhdCB0aGUgc2VuZGVyIGNoZWNrIGZvciBhbiBhYm9ydGVkIGNvbm5lY3Rpb24gcmF0aGVyIHRoYW4KICAgICBjb250aW51aW5nIGFmdGVyIGFuIEVJTlRSLiAgVGltZW91dHMgdGhhdCB1c2VkIHRvIGJlIGluaXRpYXRlZCBiZWZvcmUKICAgICBzZW5kX2h0dHBfaGVhZGVyIChhbmQgbmV2ZXIga2lsbGVkKSBhcmUgbm93IGluaXRpYXRlZCBvbmx5IHdpdGhpbiBvcgogICAgIGFyb3VuZCB0aGUgcm91dGluZXMgdGhhdCBhY3R1YWxseSBkbyB0aGUgc2VuZGluZywgYW5kIG5vdCBhbGxvd2VkIHRvCiAgICAgcHJvcGFnYXRlIGFib3ZlIHRoZSBjYWxsZXIuICBbUm95IEZpZWxkaW5nXQoKICAqKSBtb2RfYXV0aF9hbm9uIHJlcXVpcmVkIGFuIEAgb3IgYSAuIGluIHRoZSBlbWFpbCBhZGRyZXNzLCBub3QgYm90aC4KICAgICBbRGlyayB2YW5HdWxpa10KCiAgKikgcGVyX2Rpcl9kZWZhdWx0cyB3ZXJlbid0IHNldCBjb3JyZWN0bHkgdW50aWwgZGlyZWN0b3J5X3dhbGsgZm9yCiAgICAgbmFtZS1iYXNlZCB2aG9zdHMuICBUaGlzIGZpeGVzIGFuIG9ic2N1cmUgYnVnIHdpdGggdGhlIHdyb25nIGNvbmZpZwogICAgIGluZm8gYmVpbmcgdXNlZCBmb3Igdmhvc3RzIHRoYXQgc2hhcmUgdGhlIHNhbWUgaXAgYXMgdGhlIHNlcnZlci4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIEltcHJvdmVkIGdlbmVyYXRpb24gb2YgbW9kdWxlcy9NYWtlZmlsZSB0byBiZSBtb3JlIGdlbmVyaWMgZm9yCiAgICAgbmV3IG1vZHVsZSBkaXJlY3Rvcmllcy4gW0tlbiBDb2FyLCBDaHVjayBNdXJja28sIFJveSBGaWVsZGluZ10KCiAgKikgR2VuZXJhdGUgbWFrZWZpbGUgZGVwZW5kZW5jeSBmb3IgQ29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgYWN0dWFsCiAgICAgbmFtZSBnaXZlbiB3aGVuIHJ1bm5pbmcgdGhlIENvbmZpZ3VyZSBwcm9jZXNzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXhlZCBwcm9ibGVtIHdpdGggdmhvc3QgZXJyb3IgbG9nIG5vdCBiZWluZyBzZXQgcHJpb3IgdG8KICAgICBpbml0aWFsaXppbmcgdmlydHVhbCBob3N0cy4gW0RlYW4gR2F1ZGV0XQoKICAqKSBGaXhlZCBpbmZpbml0ZSBsb29wIHdoZW4gYSB0cmFpbGluZyBzbGFzaCBpcyBpbmNsdWRlZCBhZnRlciBhIHR5cGUgbWFwCiAgICAgZmlsZSBVUkwgKGV4dHJhIHBhdGggaW5mbykuIFtQZXRyIExhbXBhXQoKICAqKSBGaXhlZCBzZXJ2ZXIgc3RhdHVzIHVwZGF0aW5nIG9mIHBlci1jb25uZWN0aW9uIGNvdW50ZXJzLiBbUm95IEZpZWxkaW5nXQoKICAqKSBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgRE5TIGlzc3VlcyAocmVsaWFiaWxpdHkgYW5kIHNlY3VyaXR5KSwgYW5kIHRyeQogICAgIHRvIGV4cGxhaW4gdGhlIHZpcnR1YWwgaG9zdCBtYXRjaGluZyBwcm9jZXNzLiAgW0RlYW4gR2F1ZGV0XQoKICAqKSBUcnkgdG8gY29udGludWUgZ3JhY2VmdWxseSBieSBkaXNhYmxpbmcgdGhlIHZob3N0IGlmIGEgRE5TIGxvb2t1cAogICAgIGZhaWxzIHdoaWxlIHBhcnNpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFtEZWFuIEdhdWRldF0KCiAgKikgSW1wcm92ZWQgY2FsbHMgdG8gc2V0c29ja29wdC4gIFtSb3kgRmllbGRpbmddCgogICopIE5lZ290aWF0aW9uIGNoYW5nZXM6IERvbid0IG91dHB1dCBlbXB0eSBjb250ZW50LXR5cGUgaW4gdmFyaWFudCBsaXN0OwogICAgIE91dHB1dCBjaGFyc2V0IGluIHZhcmlhbnQgbGlzdDsgUmV0dXJuIHNvb25lciBmcm9tIGhhbmRsZV9tdWx0aSgpIGlmCiAgICAgbm8gdmFyaWFudHMgZm91bmQ7IEFkZCBoYW5kbGluZyBvZiAnKicgd2lsZGNhcmQgaW4gQWNjZXB0LUNoYXJzZXQuCiAgICAgW1BldHIgTGFtcGEgYW5kIFBhdWwgU3V0dG9uXQoKICAqKSBGaXhlZCBvdmVybGF5aW5nIG9mIHJlcXVlc3Qvc3ViLXJlcXVlc3Qgbm90ZXMgYW5kIGhlYWRlcnMgaW4KICAgICBtb2RfbmVnb3RpYXRpb24uICBbRGVhbiBHYXVkZXRdCgogICopIElmIHR3byB2YXJpYW50cycgY2hhcnNldCBxdWFsaXR5IGFyZSBlcXVhbCBhbmQgb25lIGlzIHRoZSBkZWZhdWx0CiAgICAgY2hhcnNldCAoaXNvLTg4NTktMSksIHRoZW4gcHJlZmVyIHRoZSB2YXJpYW50IHRoYXQgd2FzIHNwZWNpZmljYWxseQogICAgIGxpc3RlZCBpbiBBY2NlcHQtQ2hhcnNldCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0LiAgW1BldHIgTGFtcGFdCgogICopIE1lbW9yeSBhbGxvY2F0aW9uIHByb2JsZW0gaW4gcHVzaF9hcnJheSgpIC0tIGl0IHdvdWxkIGNvcnJ1cHQgbWVtb3J5CiAgICAgd2hlbiBuYWxsb2M9PTAuICBbS2FpIFJpc2t1IDxrcmlza3UgdGYuaHV0LmZpPiBhbmQgUm95IEZpZWxkaW5nXQoKICAqKSBpbnZva2VfaGFuZGxlcigpIGRvZXNuJ3QgaGFuZGxlIG1pbWUgYXJndW1lbnRzIGluIGNvbnRlbnQtdHlwZQogICAgIFtQZXRyIExhbXBhXSBQUiMxNjAKCiAgKikgUmVkdWNlZCBJZGVudGl0eUNoZWNrIHRpbWVvdXQgdG8gMzAgc2Vjb25kcywgYXMgcGVyIFJGQyAxNDEzIG1pbmltdW0uCiAgICAgW0tlbiBDb2FyXQoKICAqKSBGaXhlZCBwcm9ibGVtIHdpdGggRXJyb3JEb2N1bWVudCBub3Qgd29ya2luZyBmb3IgdmlydHVhbCBob3N0cwogICAgIGR1ZSB0byBvbmUgb2YgdGhlIHBlcmZvcm1hbmNlIGNoYW5nZXMgaW4gMS4yYjcuIFtEZWFuIEdhdWRldF0KCiAgKikgTG9nIGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgZ2V0IGEgcmVxdWVzdCBoZWFkZXIgdGhhdCBpcyB0b28gbG9uZywKICAgICBzaW5jZSBpdCBtYXkgaW5kaWNhdGUgYSBidWZmZXIgb3ZlcmZsb3cgYXR0YWNrLiBbTWFyYyBTbGVta29dCgogICopIE1hZGUgaXNfdXJsKCkgYWxsb3cgIlstLithLXpBLVowLTldKzoiIGFzIGEgdmFsaWQgc2NoZW1lIGFuZAogICAgIG5vdCByZWplY3QgVVJMcyB3aXRob3V0IGEgZG91YmxlLXNsYXNoLCBhcyBwZXIgUkZDMjA2OCBzZWN0aW9uIDMuMi4KICAgICBbS2VuIENvYXJdIFBSICMxNDYsICMxODcKCiAgKikgQWRkZWQgdGFibGUgZW50cnkgcGxhY2Vob2xkZXIgZm9yIG5ldyBoZWFkZXJfcGFyc2VyIGNhbGxiYWNrCiAgICAgaW4gYWxsIG9mIHRoZSBkaXN0cmlidXRlZCBtb2R1bGVzLiBbS2VuIENvYXJdIFBSICMxOTEKCiAgKikgQWxsb3cgZm9yIGNnaSBmaWxlcyB3aXRob3V0IHRoZSAuRVhFIGV4dGVuc2lvbiBvbiB0aGVtIHVuZGVyIE9TLzIuCiAgICAgW0dhcmV5IFNtaWxleV0gUFIgIzU5CgogICopIEZpeGVkIGVycm9yIG1lc3NhZ2Ugd2hlbiByZXNvdXJjZSBpcyBub3QgZm91bmQgYW5kIFVSTCBjb250YWlucwogICAgIHBhdGggaW5mby4gW1BldHIgTGFtcGEgYW5kIERlYW4gR2F1ZGV0XSBQUiAjNDAKCiAgKikgRml4ZWQgdXNlciBhbmQgc2VydmVyIGNvbmZ1c2lvbiBvdmVyIHdoYXQgc2hvdWxkIGJlIGEgdmlydHVhbCBob3N0CiAgICAgYW5kIHdoYXQgaXMgdGhlIG1haW4gc2VydmVyLCByZXN1bHRpbmcgaW4gYWNjZXNzIHRvIHNvbWV0aGluZwogICAgIG90aGVyIHRoYW4gdGhlIG5hbWUgZGVmaW5lZCBpbiB0aGUgdmlydHVhbGhvc3QgZGlyZWN0aXZlIChidXQKICAgICB3aXRoIHRoZSBzYW1lIElQIGFkZHJlc3MpIGZhaWxpbmcuIFtEZWFuIEdhdWRldF0KCiAgKikgVXBkYXRlZCBtb2RfcmV3cml0ZSB0byB2ZXJzaW9uIDMuMC4yLCB3aGljaDogZml4ZXMgY29tcGlsZSBlcnJvciBvbgogICAgIEFJWDsgaW1wcm92ZXMgdGhlIHJlZGlyZWN0aW9uIHN0dWZmIHRvIGVuYWJsZSB0aGUgdXNlcnMgdG8gZ2VuZXJhbGx5CiAgICAgcmVkaXJlY3QgdG8gaHR0cCwgaHR0cHMsIGdvcGhlciBhbmQgZnRwOyBhZGRlZCBUSU1FIHZhcmlhYmxlIGZvcgogICAgIFJld3JpdGVDb25kIHdoaWNoIGV4cGFuZHMgdG8gWVlZWU1NRERISE1NU1Mgc3RyaW5ncyBhbmQgYWRkZWQgdGhlCiAgICAgc3BlY2lhbCBwYXR0ZXJucyA+U1RSSU5HLCA8U1RSSU5HIGFuZCA9U1RSSU5HIHRvIFJld3JpdGVDb25kLCB3aGljaAogICAgIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggJXtUSU1FfSBvciBvdGhlciB2YXJpYWJsZXMgdG8gY3JlYXRlCiAgICAgdGltZS1kZXBlbmRlbnQgcmV3cml0aW5nIHJ1bGVzLiBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgYnB1c2hmZCgpIG5vIGxvbmdlciBub3RlcyBjbGVhbnVwcyBmb3IgdGhlIGZpbGUgZGVzY3JpcHRvcnMgaXQgaXMgaGFuZGVkLgogICAgIE1vZHVsZSBhdXRob3JzIG1heSBuZWVkIHRvIGFkanVzdCB0aGVpciBjb2RlIGZvciBwcm9wZXIgY2xlYW51cCB0byB0YWtlCiAgICAgcGxhY2UgKHRoYXQgaXMsIGNhbGwgbm90ZV9jbGVhbnVwc19mb3JfZmQoKSkuIFRoaXMgY2hhbmdlIGZpeGVzIHByb2JsZW1zCiAgICAgd2l0aCBmaWxlIGRlc2NyaXB0b3JzIGJlaW5nIGVycm9uZW91c2x5IGNsb3NlZCB3aGVuIHRoZSBwcm94eSBtb2R1bGUgd2FzCiAgICAgaW4gdXNlLiBbQmVuIExhdXJpZV0KCiAgKikgRml4IGJ1ZyBpbiBzdWV4ZWMgcmVpbnRyb2R1Y2VkIGJ5IGNoYW5nZXMgaW4gMS4yYjcgd2hpY2ggYWxsb3dzCiAgICAgaW5pdGdyb3VwcygpIHRvIGhvc2UgdGhlIGdyb3VwIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgbGF0ZXIKICAgICBjb21wYXJpc29ucy4gW1JhbmR5IFRlcmJ1c2hdCgogICopIFJlbW92ZSB1bm5lY2Vzc2FyeSBjYWxsIHRvIHZhX2VuZCgpIGluIGNyZWF0ZV9hcmd2KCkgd2hpY2gKICAgICBjYXVzZWQgYSBTRUdWIG9uIHNvbWUgc3lzdGVtcy4KCiAgKikgVXNlIHByb3BlciBNQVhIT1NUTkFNRUxFTiBzeW1ib2wgZm9yIGxpbWl0aW5nIGxlbmd0aCBvZiBzZXJ2ZXIgbmFtZS4KICAgICBbRGVhbiBHYXVkZXRdCgogICopIENsZWFyIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGxpc3RlbmVycy4gW1JhbmR5IFRlcmJ1c2hdCgogICopIEltcHJvdmVkIGhhbmRsaW5nIG9mIElQIGFkZHJlc3MgYXMgYSB2aXJ0dWFsaG9zdCBhZGRyZXNzIGFuZAogICAgIGludHJvZHVjZWQgIl9kZWZhdWx0XyIgYXMgYSBzeW5vbnltIGZvciB0aGUgZGVmYXVsdCB2aG9zdCBjb25maWcuCiAgICAgW0RlYW4gR2F1ZGV0XSBQUiAjMjEyCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMmI3CgogICopIFBvcnQgdG8gIFVYUC9EUyhWMjApIFtUb3NoaWFraSBOb211cmEgPG5vbSB5ay5mdWppdHN1LmNvLmpwPl0KCiAgKikgdW5zZXQgQ29udGVudC1MZW5ndGggaWYgY2h1bmtlZCAoUkZDLTIwNjgpIFtQZXRyIExhbXBhXQoKICAqKSBtb2RfbmVnb3RpYXRpb24gZml4ZXMgW1BldHIgTGFtcGFdIFBSIzE1NywgUFIjMTU4LCBQUiMxNTkKICAgICAtIHJlcGxhY2UgcHJvdG9jb2wgcmVzcG9uc2UgbnVtYmVycyB3aXRoIHN5bWJvbHMKICAgICAtIHNhdmUgdmFyaWFudC1saXN0IGludG8gbWFpbiByZXF1ZXN0IG5vdGVzCiAgICAgLSBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgZnJvbSBzdWJyZXF1ZXN0cwogICAgIC0gbWVyZ2Ugbm90ZXMsIGhlYWRlcnNfb3V0IGFuZCBlcnJfaGVhZGVyc19vdXQKCiAgKikgY2hhbmdlZCBzdGF0dXMgY2hlY2sgbWFzayBpbiBwcm94eV9odHRwLmMgZnJvbSAiSFRUUC8jLiMgIyMjICoiIHRvCiAgICAgIkhUVFAvIy4jICMjIyoiIHRvIGJlIG1vcmUgbGVuaWVudCBhYm91dCB3aGF0IHdlIGFjY2VwdC4KICAgICBbQ2h1Y2sgTXVyY2tvXQoKICAqKSBtb3JlIHByb3h5IEZUUCBidWcgZml4ZXM6CiAgICAgLSBDaGFuZ2VkIHNlbmRfZGlyKCkgdG8gcmVtb3ZlIHVzZXIvcGFzc3dkIGZyb20gZGlzcGxheWVkIFVSTC4KICAgICAtIENoYW5nZWQgbG9naW4gZXJyb3IgbWVzc2FnZXMgdG8gYmUgbW9yZSBkZXNjcmlwdGl2ZS4KICAgICAtIHJlbW92ZSBzZXR0aW5nIG9mIFNPX0RFQlVHIHNvY2tldCBvcHRpb24KICAgICAtIE1ha2UgZnRwX2dldHJjKCkgbW9yZSBsZW5pZW50IGFib3V0IG11bHRpbGluZSByZXNwb25zZXMsCiAgICAgICBzcGVjaWZpY2FsbHksIDIzMCByZXNwb25zZXMgd2hpY2ggZG9uJ3QgaGF2ZSBjb250aW51YXRpb24gMjMwLQogICAgICAgb24gZWFjaCBsaW5lKS4gVGhlc2Ugc2VlbSB0byBiZSBhbGwgTlQgRlRQIHNlcnZlcnMsIGFuZCB3aGlsZQogICAgICAgcGVyaGFwcyBxdWVzdGlvbmFibGUsIHRoZXkgYXBwZWFyIHRvIGJlIGxlZ2FsIGJ5IFJGQyA5NTkuCiAgICAgLSBBZGQgbWlzc2luZyBraWxsX3RpbWVvdXQoKSBhZnRlciB0cmFuc2ZlciB0byB1c2VyIGNvbXBsZXRlcy4KICAgICBbQ2h1Y2sgTXVyY2tvXQoKICAqKSBGaXhlZCBwcm9ibGVtIHdoZXJlIGEgYnVzeSBzZXJ2ZXIgY291bGQgaGFuZyB3aGVuIHJlc3RhcnRpbmcKICAgICBhZnRlciBiZWluZyBzZW50IGEgU0lHSFVQIGR1ZSB0byBjaGlsZCBwcm9jZXNzZXMgbm90IGV4aXRpbmcuCiAgICAgW01hcmMgU2xlbWtvXQoKICAqKSBNb2RpZnkgbW9kX2luY2x1ZGUgZXNjYXBpbmcgc28gYSAnXCcgb25seSBzaWduaWZpZXMgYW4gZXNjYXBlZAogICAgIGNoYXJhY3RlciBpZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgb25lIHRoYXQgbmVlZHMKICAgICBlc2NhcGluZy4gIFtCZW4gTGF1cmllXQoKICAqKSBFbGltaW5hdGVkIHBvc3NpYmxlIGluZmluaXRlIGxvb3AgaW4gbW9kX2ltYXAgd2hlbiByZWxhdGl2ZSBVUkxzIGFyZQogICAgIHVzZWQgd2l0aCBhICdiYXNlJyBkaXJlY3RpdmUgdGhhdCBkb2VzIG5vdCBoYXZlIGEgJy8nIGluIGl0LgogICAgIFtNYXJjIFNsZW1rbywgcmVwb3J0ZWQgYnkgT25ubyBXaXR2bGlldCA8b25ubyB0Yy5oc2Eubmw+XQoKICAqKSBSZWR1Y2VkIHRoZSBkZWZhdWx0IHRpbWVvdXQgZnJvbSAxMjAwIHNlY29uZHMgdG8gMzAwLCBhbmQgdGhlCiAgICAgb25lIGluIHRoZSBzYW1wbGUgY29uZmlnZmlsZSBmcm9tIDQwMCB0byAzMDAuICBbTWFyYyBTbGVta29dCgogICopIFN0b3AgdmJwcmludGYgZnJvbSBjcmFzaGluZyBpZiBnaXZlbiBhIE5VTEwgc3RyaW5nIHBvaW50ZXI7CiAgICAgcHJpbnQgKG51bGwpIGluc3RlYWQuICBbS2VuIENvYXJdCgogICopIERvbid0IGRpc2FibGUgTmFnbGUgYWxnb3JpdGhtIGlmIHN5c3RlbSBkb2Vzbid0IGhhdmUgVENQX05PREVMQVkuCiAgICAgW01hcmMgU2xlbWtvIGFuZCBSb3kgRmllbGRpbmddCgogICopIEZpeGVkIHByb2JsZW0gd2l0aCBtb2RfY2dpLWdlbmVyYXRlZCBpbnRlcm5hbCByZWRpcmVjdHMgdHJ5aW5nIHRvCiAgICAgcmVhZCB0aGUgcmVxdWVzdCBtZXNzYWdlLWJvZHkgdHdpY2UuIFtBcmNoaWUgQ29iYnMgYW5kIFJveSBGaWVsZGluZ10KCiAgKikgUmVkdWNlZCB0aW1lb3V0IG9uIGxpbmdlcmluZyBjbG9zZSwgcmVtb3ZlZCBwb3NzaWJpbGl0eSBvZiBhIGJsb2NrZWQKICAgICByZWFkIGNhdXNpbmcgdGhlIGNoaWxkIHRvIGhhbmcsIGFuZCBzdG9wcGVkIGxvZ2dpbmcgb2YgZXJyb3JzIGlmCiAgICAgdGhlIHNvY2tldCBpcyBub3QgY29ubmVjdGVkIChyZXNldCBieSBjbGllbnQpLiAgW1JveSBGaWVsZGluZ10KCiAgKikgUmVhcnJhbmdlZCBtYWluIGNoaWxkIGxvb3AgdG8gcmVtb3ZlIGR1cGxpY2F0aW9uIG9mIGNvZGUgaW4KICAgICBzZWxlY3QvYWNjZXB0IGFuZCBrZWVwLWFsaXZlIHJlcXVlc3RzLCBmaXhlZCBzZXZlcmFsIGJ1Z3MgcmVnYXJkaW5nCiAgICAgY2hlY2tpbmcgc2NvcmVib2FyZF9pbWFnZSBmb3IgZXhpdCBpbmRpY2F0aW9uIGFuZCBmYWlsdXJlIHRvCiAgICAgYWNjb3VudCBmb3IgYWxsIHN1Y2Nlc3MgY29uZGl0aW9ucyBhbmQgdHJhcCBhbGwgZXJyb3IgY29uZGl0aW9ucywKICAgICBwcmV2ZW50ZWQgbXVsdGlwbGUgZmx1c2hlcyBiZWZvcmUgY2xvc2luZyB0aGUgc29ja2V0OyBjbG9zZSB0aGUgZW50aXJlCiAgICAgc29ja2V0IGJ1ZmZlciBpbnN0ZWFkIG9mIGp1c3Qgb25lIGRlc2NyaXB0b3IsIHByZXZlbnQgbG9nZ2luZyBvZgogICAgIEVQUk9UTyBhbmQgRUNPTk5BQk9SVEVEIG9uIHBsYXRmb3JtcyB3aGVyZSBzdXBwb3J0ZWQsIGFuZCBnZW5lcmFsbHkKICAgICBpbXByb3ZlZCByZWFkYWJpbGl0eS4gIFtSb3kgRmllbGRpbmddCgogICopIEV4dGVuc2l2ZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMuIENsZWFuZWQgdXAgaW5lZmZpY2llbnQgdXNlIG9mCiAgICAgYXV0byBpbml0aWFsaXplcnMsIG11bHRpcGxlIGlzX21hdGNoZXhwIGNhbGxzIG9uIGEgc3RhdGljIHN0cmluZywKICAgICBhbmQgZXhjZXNzaXZlIG1lcmdpbmcgb2YgcmVzcG9uc2VfY29kZV9zdHJpbmdzLiBbRGVhbiBHYXVkZXRdCgogICopIEFkZGVkIGRvdWJsZS1idWZmZXJpbmcgdG8gbW9kX2luY2x1ZGUgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBvbgogICAgIHNlcnZlci1zaWRlIGluY2x1ZGVzLiBbTWFyYyBTbGVta29dCgogICopIFNldmVyYWwgZml4ZXMgZm9yIHN1ZXhlYyB3cmFwcGVyLiBbUmFuZHkgVGVyYnVzaF0KICAgICAtIE1ha2Ugd3JhcHBlciB3b3JrIGZvciBmaWxlcyBvbiBORlMgZmlsZXN5c3RlbS4KICAgICAtIEZpeCBwb3J0YWJpbGl0eSBwcm9ibGVtIG9mIE1BWFBBVEhMRU4uCiAgICAgLSBGaXggYXJyYXkgb3ZlcnJ1biBwcm9ibGVtIGluIGNsZWFuX2VudigpLgogICAgIC0gRml4IGFsbG9jYXRpb24gb2YgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZQoKICAqKSBSZW1vdmVkIGV4dHJhbmVvdXMgYmxhbmsgbGluZSBpcyBkZXNjcmlwdGlvbiBvZiBtb2Rfc3RhdHVzIGNoYXJzLgogICAgIFtLdXJ0IEtvaGxlcl0KCiAgKikgTG9nZ2luZyBvZiBlcnJvcnMgZnJvbSB0aGUgY2FsbF9leGVjIHJvdXRpbmUgc2ltcGx5IHdlbnQgbm93aGVyZSwKICAgICBzaW5jZSB0aGUgbG9nZmlsZSBmZCBoYXMgYmVlbiBjbG9zZWQsIHNvIG5vdyB3ZSBzZW5kIHRoZW0gdG8gc3RkZXJyLgogICAgIFtIYXJhbGQgVC4gQWx2ZXN0cmFuZF0KCiAgKikgRml4ZWQgY29yZSBkdW1wIHdoZW4gRG9jdW1lbnRSb290IGlzIGEgQ0dJLgogICAgIFtCZW4gTGF1cmllLCByZXBvcnRlZCBieSA8Z2VkZGlzIHRlc3NlcmFlLmNvbT5dCgogICopIEZpeGVkIHBvdGVudGlhbCBmaWxlIGRlc2NyaXB0b3IgbGVhayBpbiBtb2RfYXNpczsgdXBkYXRlZCBpdCBhbmQKICAgICBodHRwX2NvcmUgdG8gdXNlIHBmb3Blbi9wZmNsb3NlIGluc3RlYWQgb2YgZm9wZW4vZmNsb3NlLgogICAgIFtSYW5keSBUZXJidXNoIGFuZCBSb3kgRmllbGRpbmddCgogICopIEZpeGVkIGhhbmRsaW5nIG9mIHVuc2lnbmVkIGludHMgaW4gYXBfc25wcmludGYoKSBvbiBzb21lIGNoaXBzIHN1Y2gKICAgICBhcyB0aGUgREVDIEFscGhhIHdoaWNoIGlzIDY0LWJpdCBidXQgdXNlcyAzMi1iaXQgaW50cy4KICAgICBbRGVhbiBHYXVkZXQgYW5kIEtlbiBDb2FyXQoKICAqKSBSZXR1cm4gYSAzMDIgcmVzcG9uc2UgY29kZSB0byB0aGUgY2xpZW50IHdoZW4gc2VuZGluZyBhIHJlZGlyZWN0CiAgICAgZHVlIHRvIGEgbWlzc2luZyB0cmFpbGluZyAnLycgb24gYSBkaXJlY3RvcnkgaW5zdGVhZCBvZiBhIDMwMTsgbm93CiAgICAgaXQgaXMgY2FjaGVhYmxlLiBbTWFya3VzIEd5Z2VyXQoKICAqKSBGaXggY29uZGl0aW9uIHdoZXJlLCBpZiBhIGJhZCBkaXJlY3RpdmUgb2NjdXJzIGluIC5odGFjY2VzcywgYW5kCiAgICAgc3ViX3JlcXVlc3QoKSBnb2VzIGZpcnN0IHRvIHRoaXMgZGlyZWN0b3J5LCB0aGVuIGxvZ19yZWFzb24oKSB3aWxsCiAgICAgU0lHU0VHViBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSBpbml0aWFsaXplZCByLT5wZXJfZGlyX2NvbmZpZy4KICAgICBbUFIjMTYyIGZyb20gUGV0ciBMYW1wYSwgZml4IGJ5IE1hcmMgU2xlbWtvIGFuZCBEZWFuIEdhdWRldF0KCiAgKikgRml4IGhhbmRsaW5nIG9mIGxhbmdfaW5kZXggaW4gaXNfdmFyaWFudF9iZXR0ZXIoKS4gIFRoaXMgd2FzCiAgICAgY2F1c2luZyBwcm9ibGVtcyB3aGljaCByZXN1bHRlZCBpbiB0aGUgc2VydmVyIHNlbmRpbmcgdGhlCiAgICAgd3JvbmcgbGFuZ3VhZ2UgZG9jdW1lbnQgaW4gc29tZSBjYXNlcy4gW1BldHIgTGFtcGFdCgogICopIFJlbW92ZSBmcmVlKCkgZnJvbSBjbGVhbl9lbnYoKSBpbiBzdWV4ZWMgd3JhcHBlci4gVGhpcyB3YXMgbnVraW5nCiAgICAgdGhlIGNsZWFuIGVudmlyb25tZW50IG9uIHNvbWUgc3lzdGVtcy4KCiAgKikgVHdlYWsgYnl0ZXNlcnZpbmcgY29kZSAoZS5nLiBzZXJ2aW5nIFBERiBmaWxlcykgdG8gd29yayBhcm91bmQKICAgICBidWdzIGluIE5ldHNjYXBlIE5hdmlnYXRvciBhbmQgTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyLgogICAgIEVtaXQgQ29udGVudC1MZW5ndGggaGVhZGVyIHdoZW4gc2VuZGluZyBtdWx0aXBhcnQvYnl0ZXJhbmdlcy4KICAgICBbQWxleGVpIEtvc3V0XQoKICAqKSBQb3J0IHRvIEhJLVVYL1dFMi4gW05pY2sgTWFjbGFyZW5dCgogICopIFBvcnQgdG8gSFAgTVBFIG9wZXJhdGluZyBzeXN0ZW0gZm9yIEhQIDMwMDAgbWFjaGluZXMKICAgICBbTWFyayBCaXhieSA8bWFya2IgY2NjZC5lZHU+XQoKICAqKSBGaXhlZCBidWcgd2hpY2ggY2F1c2VkIGEgc2VnbWVudGF0aW9uIGZhdWx0IGlmIG9ubHkgb25lIGFyZ3VtZW50CiAgICAgZ2l2ZW4gdG8gUkxpbWl0KiBkaXJlY3RpdmVzLiBbRWQgS29ydGhvZl0KCiAgKikgQ29udGludWUgcGVyc2lzdGVudCBjb25uZWN0aW9uIGFmdGVyIDIwNCBvciAzMDQgcmVzcG9uc2UuIFtEZWFuIEdhdWRldF0KCiAgKikgSW1wcm92ZWQgYnVmZmVyZWQgb3V0cHV0IHRvIHRoZSBjbGllbnQgYnkgZGVsYXlpbmcgdGhlIGZsdXNoIGRlY2lzaW9uCiAgICAgdW50aWwgdGhlIEJVRkYgY29kZSBpcyBhY3R1YWxseSBhYm91dCB0byByZWFkIHRoZSBuZXh0IHJlcXVlc3QuCiAgICAgVGhpcyBmaXhlcyBhIHByb2JsZW0gaW50cm9kdWNlZCBpbiAxLjJiNSB3aXRoIGNsaWVudHMgdGhhdCBzZW5kCiAgICAgYW4gZXh0cmEgQ1JMRiBhZnRlciBhIFBPU1QgcmVxdWVzdC4gQWxzbyBpbXByb3ZlZCBjaHVua2VkIG91dHB1dAogICAgIHBlcmZvcm1hbmNlIGJ5IGNvbWJpbmluZyB3cml0ZXMgdXNpbmcgd3JpdGV2KCkgYW5kIHJlbW92aW5nIGFzCiAgICAgbWFueSBiZmx1c2goKSBjYWxscyBhcyBwb3NzaWJsZS4gIE5PVEU6IFBsYXRmb3JtcyB3aXRob3V0IHdyaXRldigpCiAgICAgbXVzdCBhZGQgLUROT19XUklURVYgdG8gdGhlIGNvbXBpbGVyIENGTEFHUywgZWl0aGVyIGluIENvbmZpZ3VyYXRpb24KICAgICBvciBDb25maWd1cmUsIHVubGVzcyB3ZSBoYXZlIGFscmVhZHkgZG9uZSBzby4gIFtEZWFuIEdhdWRldF0KCiAgKikgRml4ZWQgbW9kX3Jld3JpdGUgYnVnIHdoaWNoIHRydW5jYXRlZCB0aGUgcmV3cml0dGVuIFVSTCBbTWFyYyBTbGVta29dCgogICopIEZpeGVkIG1vZF9pbmZvIG91dHB1dCBjb3JydXB0aW9uIGJ1ZyBpbnRyb2R1Y2VkIGJ5IGJ1ZmZlciBvdmVyZmxvdwogICAgIGZpeGVzLiBbRGVhbiBHYXVkZXRdCgogICopIEZpeGVkIGh0dHBfcHJvdG9jb2wgdG8gY29ycmVjdGx5IG91dHB1dCBhbGwgSFRUUC8xLjEgaGVhZGVycywgaW5jbHVkaW5nCiAgICAgZm9yIHRoZSBzcGVjaWFsIGNhc2Ugb2YgYSAzMDQgcmVzcG9uc2UuICBbUGF1bCBTdXR0b25dCgogICopIEltcHJvdmVkIGhhbmRsaW5nIG9mIFRSQUNFIG1ldGhvZCBieSBieXBhc3Npbmcgbm9ybWFsIG1ldGhvZCBoYW5kbGluZwogICAgIGFuZCBoZWFkZXIgcGFyc2luZyByb3V0aW5lczsgZml4ZWQgQWxsb3cgcmVzcG9uc2UgdG8gYWx3YXlzIGFsbG93IFRSQUNFLgogICAgIFtEZWFuIEdhdWRldF0KCiAgKikgRml4ZWQgY29tcGlsZXIgd2FybmluZ3MgaW4gdGhlIHJlZ2V4IGxpYnJhcnkuIFtEZWFuIEdhdWRldF0KCiAgKikgQ2xlYW5lZC11cCBzb21lIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTC4gW0tlbiBDb2FyXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjJiNgoKICAqKSBBbGxvdyB3aGl0ZXNwYWNlIGluIGltYWdlbWFwIG1hcGZpbGUgY29vcmRpbmF0ZXMuIFtNYXJjIFNsZW1rb10KCiAgKikgRml4IHR5cG8gaW50cm9kdWNlZCBpbiBmaXggZm9yIHBvdGVudGlhbCBpbmZpbml0ZSBsb29wIGFyb3VuZAogICAgIGFjY2VwdCgpIGluIGNoaWxkX21haW4oKS4gVGhpcyBjaGFuZ2UgY2F1c2VkIHRoZSByZXYgdG8gMS4yYjYuCiAgICAgMS4yYjUgd2FzIG5ldmVyIGEgcHVibGljIGJldGEuCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMmI1CgogICopIENoYW5nZSBLZWVwQWxpdmUgc2VtYW50aWNzIChPbnxPZmYgaW5zdGVhZCBvZiBhIG51bWJlciksIGFkZAogICAgIE1heEtlZXBBbGl2ZVJlcXVlc3RzIGRpcmVjdGl2ZS4gW0FsZXhlaSBLb3N1dF0KCiAgKikgVmFyaW91cyBOZVhUIGNvbXBpbGF0aW9uIHBhdGNoZXMsIGFzIHdlbGwgYXMgYSBjaGFuZ2UgaW4KICAgICByZWdleC9yZWdjb21wLmMgc2luY2UgdGhhdCBmaWxlIGFsc28gdXNlZCBhIE5FWFQgZGVmaW5lLgogICAgIFtBbmRyZWFzIEtvZW5pZ10KCiAgKikgQWxsb3cgKiB0byB0ZXJtaW5hdGUgdGhlIGVuZCBvZiBhIGRpcmVjdG9yeSBtYXRjaCBpbiBtb2RfZGlyLgogICAgIEFsbG93cyAvfiogdG8gbWF0Y2ggZm9yIGJvdGggL35qb2UgYW5kIC9+am9lLy4gW0RhdmlkIEJyb25kZXJdCgogICopIERvbid0IGNhbGwgY2FuX2V4ZWMoKSBpZiBzdWV4ZWNfZW5hYmxlZC4gQ2FsbGluZyB0aGlzIHJlcXVpcmVzCiAgICAgc2NyaXB0cyBleGVjdXRlZCBieSB0aGUgc3VleGVjIHdyYXBwZXIgdG8gYmUgd29ybGQgZXhlY3V0YWJsZSwgd2hpY2gKICAgICBkZWZlYXRzIG9uZSBvZiB0aGUgYWR2YW50YWdlcyBvZiBydW5uaW5nIHRoZSB3cmFwcGVyLiBbUmFuZHkgVGVyYnVzaF0KCiAgKikgUG9ydGFiaWxpdHkgRml4OiBJUklYIGNvbXBsYWluZWQgd2l0aCAnbWFrZSBjbGVhbicgYWJvdXQgKnB1cmUqIChyZW1vdmVkKQogICAgIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBNaWdyYXRpb24gZnJvbSBzcHJpbnRmKCkgdG8gc25wcmludGYoKSB0byBhdm9pZCBidWZmZXIKICAgICBvdmVyZmxvd3MuIFtNYXJjIFNsZW1rb10KCiAgKikgUHJvdmlkZSBwb3J0YWJsZSBzbnByaW50ZigpIGltcGxlbWVudGF0aW9uIChhcF9zbnByaW50ZikKICAgICBhcyB3ZWxsIGFzICpjdnQgZmFtaWx5LiBbSmltIEphZ2llbHNraV0KCiAgKikgUG9ydGFiaWxpdHkgRml4OiBOZVhUIGxhY2tzIHVuaXN0ZC5oIHNvIHdlIHdyYXAgaXQncyBpbmNsdXNpb24KICAgICBbSmltIEphZ2llbHNraV0KCiAgKikgUmVtb3ZlIG1vZF9mYXN0Y2dpLmMgZnJvbSB0aGUgZGlzdHJpYnV0aW9uLiBUaGlzIG1vZHVsZSBhcHBlYXJzCiAgICAgdG8gYmUgbWFpbnRhaW5lZCBtb3JlIHRocm91Z2ggdGhlIE9wZW4gTWFya2V0IGNoYW5uZWxzIGFuZCBzaG91bGQKICAgICBjb250aW51ZSB0byBiZSBlYXNpbHkgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZmFzdGNnaS5jb20vCgogICopIEZpeGVkIGJ1ZyBpbiBtb2R1bGVzL01ha2VmaWxlIHRoYXQgd291bGRuJ3QgYWxsb3cgYnVpbGRpbmcgaW4gbW9yZQogICAgIHRoYW4gb25lIHN1YmRpcmVjdG9yeSAob3IgY2xlYW5pbmcsIGVpdGhlcikuIFtKZXJlbXkgTGFpZG1hbl0KCiAgKikgbW9kX2luZm8gYXNzdW1lZCB0aGF0IHRoZSBjb25maWcgZmlsZXMgd2VyZSByZWxhdGl2ZSB0byBTZXJ2ZXJSb290LgogICAgIFtLZW4gdGhlIFJvZGVudF0KCiAgKikgQ0dJIHNjcmlwdHMgY2FsbGVkIGFzIGFuIGVycm9yIGRvY3VtZW50IHJlc3VsdGluZyBmcm9tIGZhaWxlZAogICAgIENHSSBleGVjdXRpb24gd291bGQgaGFuZyB3YWl0aW5nIGZvciBQT1NUJ2VkIGRhdGEuIFtSb2IgSGFydGlsbF0KCiAgKikgTG9nIHJlYXNvbiB3aGVuIG1vZF9kaXIgcmV0dXJucyBhY2Nlc3MgSFRUUF9GT1JCSURERU4KICAgICBbS2VuIHRoZSBSb2RlbnRdCgogICopIFByb3Blcmx5IGNoZWNrIGVycm5vIHRvIHByZXZlbnQgZGlzcGxheSBvZiBhIGRpcmVjdG9yeSBpbmRleAogICAgIHdoZW4gc2VydmVyIHJlY2VpdmVzIGEgbG9uZyBlbm91Z2ggVVJMIHRvIGNvbmZ1c2Ugc3RhdCgpLgogICAgIFtNYXJjIFNsZW1rb10KCiAgKikgU2V2ZXJhbCBzZWN1cml0eSBlbmhhbmNlbWVudHMgdG8gc3VleGVjIHdyYXBwZXIuIEl0IGlzIF9oaWdobHlfCiAgICAgcmVjb21tZW5kZWQgdGhhdCBwcmV2aW91c2x5IGluc3RhbGxlZCB2ZXJzaW9ucyBvZiB0aGUgd3JhcHBlcgogICAgIGJlIHJlcGxhY2VkIHdpdGggdGhpcyB2ZXJzaW9uLiAgW1JhbmR5IFRlcmJ1c2gsIEphc29uIERvdXJdCgogICAgICAgIC0gfnVzZXIgZXhlY3V0aW9uIG5vdyBwcm9wZXJseSByZXN0cmljdGVkIHRvIH51c2VyJ3MgaG9tZQogICAgICAgICAgZGlyZWN0b3J5IGFuZCBiZWxvdy4KICAgICAgICAtIGV4ZWN1dGlvbiByZXN0cmljdGVkIHRvIFVJRC9HSUQgPiAxMDAKICAgICAgICAtIHJlc3RyaWN0IHBhc3NlZCBlbnZpcm9ubWVudCB0byBrbm93biB2YXJpYWJsZXMKICAgICAgICAtIGNhbGwgc2V0Z2lkKCkgYmVmb3JlIGluaXRncm91cHMoKSAocG9ydGFiaWxpdHkgZml4KQogICAgICAgIC0gcmVtb3ZlIHVzZSBvZiBzZXRlbnYoKSAocG9ydGFiaWxpdHkgZml4KQoKICAqKSBBZGQgSFRUUC8xLjAgcmVzcG9uc2UgZm9yY2luZy4gW0JlbiBMYXVyaWVdCgogICopIEFkZCBhY2Nlc3MgY29udHJvbCB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBbQmVuIExhdXJpZV0KCiAgKikgQWRkIHJmbHVzaCgpIGZ1bmN0aW9uLiBbQWxleGVpIEtvc3V0XQoKICAqKSByZW1vdmUgZHVwbGljYXRlIHBjYWxsb2MoKSBjYWxsIGluIG5ld19jb25uZWN0aW9uKCkuCgogICopIEZpeCBpbmNvcnJlY3QgY29tcGFyaXNvbiB3aGljaCBjb3VsZCBhbGxvdyBudW1iZXIgb2YgY2hpbGRyZW4gPQogICAgIE1heENsaWVudHMgKyAxIGlmIGxlc3MgdGhhbiBIQVJEX1NFUlZFUl9MSU1JVC4gQWxzbyBmaXggcG90ZW50aWFsCiAgICAgcHJvYmxlbSBpZiBTdGFydFNlcnZlcnMgPiBIQVJEX1NFUlZFUl9MSU1JVC4gW0VkIEtvcnRob2ZdCgogICopIFVwZGF0ZWQgc3VwcG9ydCBmb3IgT1NlcyAoTWFjaFRlbiwgVUxUUklYLCBQYXJhZ29uLCBJU0MsIE9wZW5CU0QKICAgICBBSVggUFMvMiwgQ09OVkVYT1MuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBSZXBsYWNlIGluc3RhbmNlcyBvZiBpbmV0X250b2EoKSB3aXRoIGluZXRfYWRkcigpIGZvciBQcm94eUJsb2NrLgogICAgIEl0J3MgbW9yZSBwb3J0YWJsZS4gW01hcnRpbiBLcmFlbWVyXQoKICAqKSBSZXBsYWNlIHJlZmVyZW5jZXMgdG8gbWFrZSBpbiBNYWtlZmlsZS50bXBsIHdpdGggJChNQUtFKS4KICAgICBbQ2h1Y2sgTXVyY2tvXQoKICAqKSBBZGQgUHJveHlCbG9jayBkaXJlY3RpdmUgdy9JUCBhZGRyZXNzIGNhY2hpbmcuIEFkZCBJUCBhZGRyZXNzCiAgICAgY2FjaGluZyB0byBOb0NhY2hlIGRpcmVjdGl2ZSBhcyB3ZWxsLiBQcm94eUJsb2NrIHdvcmtzIHdpdGggYWxsCiAgICAgaGFuZGxlcnM7IE5vQ2FjaGUgbm93IGFsc28gd29ya3Mgd2l0aCBGVFAgZm9yIGFub255bW91cyBsb2dpbnMuCiAgICAgU3RpbGwgbW9yZSBjb2RlIGNsZWFudXAuIFtDaHVjayBNdXJja29dCgogICopIEFkZCAiaGVhZGVyIHBhcnNlIiBBUEkgaG9vayBbQmVuIExhdXJpZV0KCiAgKikgRml4IGJ5dGUgb3JkZXJpbmcgcHJvYmxlbXMgZm9yIFJFTU9URV9QT1JUIFtDaHVjayBNdXJja29dCgogICopIHN1RVhFQyB3cmFwcGVyIHdhcyBmcmVlaW5nIG1lbW9yeSB0aGF0IGhhZCBub3QgYmVlbiBtYWxsb2MnZWQuCgogICopIENvcnJlY3RseSBhbGxvdyBhY2Nlc3MgYW5kIGF1dGggZGlyZWN0aXZlcyBpbiA8RmlsZXM+IHNlY3Rpb25zIGluCiAgICAgc2VydmVyIGNvbmZpZyBmaWxlcy4gW0FsZXhlaSBLb3N1dF0KCiAgKikgRml4IGJ1ZyB3aXRoIFNlcnZlclBhdGggdGhhdCBjb3VsZCBjYXVzZSBjZXJ0YWluIGZpbGVzIHRvIGJlIG5vdAogICAgIGZvdW5kIGJ5IHRoZSBzZXJ2ZXIuIFtBbGV4ZWkgS29zdXRdCgogICopIEZpeCBoYW5kbGluZyBvZiBFcnJvckRvY3VtZW50IHNvIHRoYXQgaXQgZG9lc24ndCByZW1vdmUgYSB0cmFpbGluZwogICAgIGRvdWJsZS1xdW90ZSBmcm9tIHRleHQgYW5kIHNvIHRoYXQgaXQgcHJvcGVybHkgY2hlY2tzIGZvciB1bnN1cHBvcnRlZAogICAgIHN0YXR1cyBjb2RlcyB1c2luZyB0aGUgbmV3IGluZGV4X29mX3Jlc3BvbnNlIGludGVyZmFjZS4gW1JveSBGaWVsZGluZ10KCiAgKikgTXVsdGlwbGUgZml4ZXMgdG8gdGhlIGxpbmdlcmluZ19jbG9zZSBjb2RlIGluIG9yZGVyIHRvIGF2b2lkIGJlaW5nCiAgICAgaW50ZXJydXB0ZWQgYnkgYSBzdHJheSB0aW1lb3V0LCB0byBhdm9pZCBsaW5nZXJpbmcgb24gYSBjb25uZWN0aW9uCiAgICAgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGFib3J0ZWQgb3IgbmV2ZXIgcmVhbGx5IGV4aXN0ZWQsIHRvIGVuc3VyZSB0aGF0CiAgICAgd2Ugc3RvcCBsaW5nZXJpbmcgYXMgc29vbiBhcyBhbnkgZXJyb3IgY29uZGl0aW9uIGlzIHJlY2VpdmVkLCBhbmQgdG8KICAgICBwcmV2ZW50IGJlaW5nIHN0dWNrIGluZGVmaW5pdGVseSBpZiB0aGUgcmVhZCBibG9ja3MuICBBbHNvIGltcHJvdmVzCiAgICAgcmVwb3J0aW5nIG9mIGVycm9yIGNvbmRpdGlvbnMuICBbTWFyYyBTbGVta28gYW5kIFJveSBGaWVsZGluZ10KCiAgKikgRml4ZWQgaW5pdGlhbGl6YXRpb24gb2YgcGFyYW1ldGVyIHN0cnVjdHVyZSBmb3Igc2lnYWN0aW9uLgogICAgIFs8bWd5Z2VyIGl0ci5jaD4sIEFkcmlhbiBGaWxpcGktTWFydGluXQoKICAqKSBGaXhlZCByZWluaXRpYWxpemluZyB0aGUgcGFyYW1ldGVycyBiZWZvcmUgZWFjaCBjYWxsIHRvIGFjY2VwdCBhbmQKICAgICBzZWxlY3QsIGFuZCByZW1vdmVkIHBvdGVudGlhbCBmb3IgaW5maW5pdGUgbG9vcCBpbiBhY2NlcHQuCiAgICAgW1JveSBGaWVsZGluZywgYWZ0ZXIgdXNlZnVsIFBSIGZyb20gPGFkcmlhbiB2aXJnaW5pYS5lZHU+XQoKICAqKSBGaXhlZCBjb25kaXRpb24gd2hlcmUsIGlmIGEgY2hpbGQgZmFpbHMgdG8gZm9yaywgdGhlIHNjb3JlYm9hcmQgd291bGQKICAgICBjb250aW51ZSB0byBzYXkgU0VSVkVSX1NUQVJUSU5HIGZvcmV2ZXIuIEV2ZW50dWFsbHksIHRoZSBtYWluIHByb2Nlc3MKICAgICB3b3VsZCByZWZ1c2UgdG8gc3RhcnQgbmV3IGNoaWxkcmVuIGJlY2F1c2UgY291bnRfaWRsZV9zZXJ2ZXJzKCkgd2lsbAogICAgIGNvdW50IHRob3NlIFNFUlZFUl9TVEFSVElORyBlbnRyaWVzIGFuZCB3aWxsIGFsd2F5cyByZXBvcnQgdGhhdCB0aGVyZQogICAgIGFyZSBlbm91Z2ggaWRsZSBzZXJ2ZXJzLiBbUGhpbGxpcCBWYW5kcnldCgogICopIEZpeGVkIGJ1ZyBpbiBiY3dyaXRlIHJlZ2FyZGluZyBmYWlsdXJlIHRvIGFjY291bnQgZm9yIHBhcnRpYWwgd3JpdGVzLgogICAgIEF2b2lkZWQgY2FsbGluZyBiZmx1c2goKSB3aGVuIHRoZSBjbGllbnQgaXMgcGlwZWxpbmluZyByZXF1ZXN0cy4KICAgICBSZW1vdmVkIHVubmVjZXNzYXJ5IGZsdXNoZXMgZnJvbSBodHRwX3Byb3RvY29sLiBbRGVhbiBHYXVkZXRdCgogICopIEFkZGVkIGRlc2NyaXB0aW9uIG9mICIuIiBtb2RlIGluIHNlcnZlci1zdGF0dXMgW0ppbSBKYWdpZWxza2ldCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMmI0CgogICopIEZpeCBwb3NzaWJsZSByYWNlIGNvbmRpdGlvbiBpbiBhY2NlcHRfbXV0ZXhfaW5pdCgpIHRoYXQKICAgICBjb3VsZCBsZWF2ZSBhIHNtYWxsIHNlY3VyaXR5IGhvbGUgb3BlbiBhbGxvd2luZyBmaWxlcyB0byBiZQogICAgIG92ZXJ3cml0dGVuIGluIGNhc2VzIHdoZXJlIHRoZSBzZXJ2ZXIgVUlEIGhhcyB3cml0ZSBwZXJtaXNzaW9ucy4KICAgICBbTWFyYyBTbGVta29dCgogICopIEZpeCBhd2sgY29tcGF0aWJpbHR5IHByb2JsZW0gaW4gQ29uZmlndXJlLiBbSmltIEphZ2llbHNraV0KCiAgKikgRml4IHBvcnRhYmxpdHkgcHJvYmxlbSBpbiB1dGlsX3NjcmlwdCB3aGVyZSBBUkdfTUFYIG1heSBub3QgYmUKICAgICBkZWZpbmVkIGZvciBzb21lIHN5c3RlbXMuCgogICopIEFkZCBjaGFuZ2VzIHRvIGFsbG93IGNvbXBpbGF0aW9uIG9uIE1hY2h0ZW4gNC4wLjMgZm9yIFBvd2VyUEMuCiAgICAgW1JhbmRhbCBTY2h3YXJ0el0KCiAgKikgT1MvMiBjaGFuZ2VzIHRvIHN1cHBvcnQgYW4gTU1BUCBzdHlsZSBzY29yZWJvYXJkIGZpbGUgYW5kIFVOSVgKICAgICBzdHlsZSBtYWdpYyAjISB0b2tlbiBmb3IgYmV0dGVyIHNjcmlwdCBwb3J0YWJpbGl0eS4gW0dhcmV5IFNtaWxleV0KCiAgKikgRml4IGJ1ZyBpbiBzdWV4ZWMgd3JhcHBlciBpbnRyb2R1Y2VkIGluIGIzIHRoYXQgd291bGQgY2F1c2UgZmFpbGVkCiAgICAgZXhlY3V0aW9uIGZvciB+dXNlcmRpciBDR0kuIFtKYXNvbiBEb3VyXQoKICAqKSBGaXggaW5pdGdyb3VwcygpIGJ1c2luZXNzIGluIHN1ZXhlYyB3cmFwcGVyLiBbSmFzb24gRG91cl0KCiAgKikgRml4IG1vbnRoIG9mZiBieSBvbmUgaW4gc3VleGVjIHdyYXBwZXIgbG9nZ2luZy4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4yYjM6CgogICopIEZpeCBlcnJvciBpbiBtb2RfY2dpIHdoaWNoIGNvdWxkIGNhdXNlIHJlc291cmNlcyBub3QgdG8gYmUgcHJvcGVybHkKICAgICBmcmVlZCwgb3Igd29yc2UuIFtEZWFuIEdhdWRldF0KCiAgKikgRml4IGZpbmRfc3RyaW5nKCkgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlLiBbSG93YXJkIEZlYXJdCgogICopIEFkZCBzZXRfZmxhZ19zbG90KCkgYXQgdGhlIHJlcXVlc3Qgb2YgRGlyayBhbmQgb3RoZXJzLgogICAgIFtEaXJrIHZhbkd1bGlrXQoKICAqKSBTeW5jIG1vZF9yZXdyaXRlIHdpdGggcGF0Y2ggbGV2ZWwgMTAuIFtSYWxmIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGQgY2hhbmdlcyB0byBpbXByb3ZlIHRoZSBlcnJvciBtZXNzYWdlIGdpdmVuIGZvciBpbnZhbGlkCiAgICAgU2VydmVyTmFtZSBwYXJhbWV0ZXJzLiBbRGlyayB2YW5HdWxpa10KCiAgKikgQWRkICJBdXRob3JpdGF0aXZlIiBkaXJlY3RpdmUgZm9yIEF1dGggbW9kdWxlcyB0aGF0IGRvbid0CiAgICAgY3VycmVudGx5IGhhdmUgaXQuIFRoaXMgZ2l2ZXMgYWRtaW4gY29udHJvbCB0byBhc3NpZ24gYXV0aG9yaXRhdGl2ZQogICAgIGNvbnRyb2wgdG8gYW4gYXV0aGVudGljYXRpb24gc2NoZW1lIGFuZCBhbGxvdyAiZmFsbCB0aHJvdWdoIiBmb3IKICAgICB0aG9zZSBhdXRoZW50aWNhdGlvbiBtb2R1bGVzIHRoYXQgYXJlbid0ICJBdXRob3JpdGF0aXZlIiB0aGVyZWJ5CiAgICAgYWxsb3dpbmcgbXVsdGlwbGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcyB0byBiZSBjaGFpbmVkLgogICAgIFtEaXJrIHZhbkd1bGlrXQoKICAqKSBSZW1vdmUgcmVxdWlyZW1lbnQgZm9yIFJlc291cmNlQ29uZmlnL0FjY2Vzc0NvbmZpZyBpZiBub3QgdXNpbmcKICAgICB0aGUgdGhyZWUgY29uZmlnIGZpbGUgbGF5b3V0LiBbUmFuZHkgVGVyYnVzaF0KCiAgKikgQWRkIFBBU1YgbW9kZSB0byBtb2RfcHJveHkgRlRQIGhhbmRsZXIuIFtDaHVjayBNdXJja29dCgogICopIENoYW5nZXMgdG8gc3VleGVjIHdyYXBwZXIgdG8gZml4IHRoZSBmb2xsb3dpbmcgcHJvYmxlbXM6CiAgICAgMS4gIHN5bWxpbmtlZCBob21lZGlycyB3aWxsIGtpbGwgfnVzZXJkaXJzLgogICAgIDIuICBpbml0Z3JvdXBzKCkgb24gTGludXggMi4wLnggY2xvYmJlcnMgZ3ItPmdyaWQuCiAgICAgMy4gIENHSSBjb21tYW5kIGxpbmVzIHBhcmFtdGVycyBwcm9ibGVtcwogICAgIDQuICBwdy1wd2RpciBmb3IgImRvY3Jvb3QgY2hlY2siIHN0aWxsIHRoZSBodHRwZCB1c2VyJ3MgcHcgcmVjb3JkLgogICAgW1JhbmR5IFRlcmJ1c2gsIEphc29uIERvdXJdCgogICopIENoYW5nZSBjcmVhdGVfYXJndigpIHRvIGFjY2VwdCB2YXJpYWJsZSBhcmd1bWVudHMuIFRoaXMgZml4ZXMKICAgICBhIHByb2JsZW0gd2hlcmUgYXJndW1lbnRzIHdlcmUgbm90IGdldHRpbmcgcGFzc2VkIHRvIHRoZSBDR0kgdmlhCiAgICAgYXJndltdIHdoZW4gdGhlIHN1ZXhlYyB3cmFwcGVyIHdhcyBhY3RpdmUuIFtSYW5keSBUZXJidXNoLCBKYWtlIEJ1Y2hob2x6XQoKICAqKSBDb2xsYXBzZSBtdWx0aXBsZSBzbGFzaGVzIGluIHBhdGggVVJMcyB0byBwcm9wZXJseSBhcHBseQogICAgIGhhbmRsZXJzIGRlZmluZWQgYnkgPExvY2F0aW9uPi4gW0FsZXhlaSBLb3N1dF0KCiAgKikgRGVmaW5lIGEgc2FuZSBzZXQgb2YgREVGQVVMVF9VU0VSIGFuZCBERUZBVUxUX0dST1VQIHZhbHVlcyBmb3IgQUlYLgoKICAqKSBJbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiByZXF1ZXN0IGR1cmF0aW9uIHRpbWluZ3MgYnkgc2V0dGluZwogICAgIHItPnJlcXVlc3RfdGltZSBpbiByZWFkX3JlcXVlc3RfbGluZSgpIGluc3RlYWQgb2YgcmVhZF9yZXF1ZXN0KCkuCiAgICAgW0RlYW4gR2F1ZGV0XQoKICAqKSBSZXNldCB0aW1lb3V0IHdoaWxlIHJlYWRpbmcgdmlhIGdldF9jbGllbnRfYmxvY2soKSBpbiBtb2RfY2dpLmMKICAgICBGaXhlcyBwcm9ibGVtIHdpdGggdGltZWQgb3V0IHRyYW5zZmVycyBvZiBsYXJnZSBmaWxlcy4gW1Jhc211cyBMZXJkb3JmXQoKICAqKSBBZGQgdGhlIGFiaWxpdHkgdG8gcGFzcyBkaWZmZXJlbnQgTWFrZWZpbGUudG1wbCBmaWxlcyB0byBDb25maWd1cmUKICAgICB1c2luZyB0aGUgLW1ha2UgZmxhZy4gW1JvYiBIYXJ0aWxsXQoKICAqKSBGaXggY29yZWR1bXAgdHJpZ2dlcmVkIHdoZW4gc2VuZGluZyBhIFNJR0hVUCB0byB0aGUgc2VydmVyIGNhdXNlZAogICAgIGJ5IGFuIGFzc2VydGlvbiBmYWlsdXJlLCBpbiB0dXJuIGNhdXNlZCBieSBhbiB1bmluaXRpYWxpc2VkIGZpZWxkIGluIGEKICAgICBsaXN0ZW5fcmVjLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgRklMRVBBVEhfSU5GTyB2YXJpYWJsZSB0byBDR0kgZW52aXJvbm1lbnQsIHdoaWNoIGlzIGVxdWFsIHRvCiAgICAgUEFUSF9JTkZPIGZyb20gcHJldmlvdXMgdmVyc2lvbnMgb2YgQXBhY2hlIChpbiBjZXJ0YWluIHNpdHVhdGlvbnMsCiAgICAgQXBhY2hlIDEuMidzIFBBVEhfSU5GTyB3aWxsIGJlIGRpZmZlcmVudCB0aGFuIDEuMSdzKS4gW0FsZXhlaSBLb3N1dF0KICAgICBbbGF0ZXIgcmVtb3ZlZCBpbiAxLjJiMTFdCgogICopIEFkZCByd3JpdGUoKSBmdW5jdGlvbiB0byBBUEkgdG8gYWxsb3cgZm9yIHNlbmRpbmcgc3RyaW5ncyBvZgogICAgIGFyYml0cmFyeSBsZW5ndGguIFtEb3VnIE1hY0VhY2hlcm5dCgogICopIFJlbW92ZSBybGltX3QgdHlwZWRlZiBmb3IgTmV0QlNELiBEbyBvbGRlciB2ZXJzaW9ucyBuZWVkIHRoaXM/CgogICopIERlZmluZWQgcmxpbV90IGFuZCBXQU5USFNSRUdFWD15ZXMgYW5kIGZpeGVkIHdhaXRwaWQoKSBzdWJzdGl0dXRlIGZvcgogICAgIE5lWFQuIFtKaW0gSmFnaWVsc2tpXQoKICAqKSBSZW1vdmVkIHJlY2VudCBtb2RpZmljYXRpb24gdG8gcHJvbW90ZSB0aGUgc3RhdHVzIGNvZGUgb24gaW50ZXJuYWwKICAgICByZWRpcmVjdHMsIHNpbmNlIHRoZSBjb3JyZWN0IGZpeCB3YXMgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGxvZyBmb3JtYXQKICAgICBpbiBtb2RfbG9nX2NvbmZpZyBzbyB0aGF0IGl0IG91dHB1dHMgdGhlIG9yaWdpbmFsIHN0YXR1cy4gW1JvYiBIYXJ0aWxsXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjJiMjoKCiAgKikgVXBkYXRlIHNldF9zaWduYWxzKCkgdG8gdXNlIHNpZ2FjdGlvbigpIGZvciBzZXR0aW5nIGhhbmRsZXJzLgogICAgIFRoaXMgYXBwZWFycyB0byBmaXggYSByZS1lbnRyYW50IHByb2JsZW0gaW4gdGhlIHNlZ19mYXVsdCgpCiAgICAgYnVzX2Vycm9yKCkgaGFuZGxlcnMuIFtSYW5keSBUZXJidXNoXQoKICAqKSBDaGFuZ2VzIHRvIGFsbG93IG1vZF9zdGF0dXMgY29tcGlsZSBmb3IgT1MvMiBbR2FyZXkgU21pbGV5XQoKICAqKSBjaGFuZ2VzIGZvciBERUMgQVhQIHJ1bm5pbmcgT1NGLzEgdjMuMC4gW01hcmMgRXZhbnNdCgogICopIHByb3h5X2h0dHAuYyBidWdmaXhlczogIFtDaHVjayBNdXJja29dCiAgICAgICAgMSkgZml4ZXMgcG9zc2libGUgTlVMTCBwb2ludGVyIHJlZmVyZW5jZSB3L05vQ2FjaGUKICAgICAgICAyKSBmaXhlcyBOb0NhY2hlIGJlaGF2aW9yIHdoZW4gdXNpbmcgUHJveHlSZW1vdGUgKFByb3h5UmVtb3RlCiAgICAgICAgICAgaG9zdCB3b3VsZCBjYWNoZSBub3RoaW5nIGlmIGl0IHdhcyBpbiB0aGUgbG9jYWwgZG9tYWluLAogICAgICAgICAgIGFuZCB0aGUgbG9jYWwgZG9tYWluIHdhcyBpbiB0aGUgTm9DYWNoZSBsaXN0KQogICAgICAgIDMpIEFkZHMgSG9zdDogaGVhZGVyIHdoZW4gbm90IGF2YWlsYWJsZQogICAgICAgIDQpIFNvbWUgY29kZSBjbGVhbnVwIGFuZCBjbGFyaWZpY2F0aW9uCgogICopIG1vZF9pbmNsdWRlLmMgYnVnZml4ZXM6CiAgICAgICAgMSkgRml4ZWQgYW4gb21taXNzaW9uIHRoYXQgY2F1c2VkIGluY2x1ZGUgdmFyaWFibGVzIHRvIG5vdAogICAgICAgICAgIGJlIHBhcnNlZCBpbiBjb25maWcgZXJybXNnIGRpcmVjdGl2ZXMgW0hvd2FyZCBGZWFyXQogICAgICAgIDIpIFJlbW92ZSBIQVZFX1BPU0lYX1JFR0VYIGNydWZ0IFtBbGV4ZWkgS29zdXRdCiAgICAgICAgMykgUGF0Y2ggdG8gZml4IGNvbXBpbGVyIHdhcm5pbmdzIFs8cGVycm90IGxhbC5pbjJwMy5mcj5dCiAgICAgICAgNCkgQWxsb3cgYmFja3NsYXNoLWVzY2FwaW5nIHRvIGFsbCBxdW90ZWQgdGV4dAogICAgICAgICAgIFtCZW4gWW9zaGlubyA8YmVuIHdpbGlraS5lbmcuaGF3YWlpLmVkdT5dCiAgICAgICAgNSkgUGFzcyB2YXJpYWJsZSB0byBjb21tYW5kIGxpbmUgaWYgbm90IHNldCBpbiBYU1NJJ3MgZW52CiAgICAgICAgICAgW0hvd2FyZCBGZWFyXQoKICAqKSBGaXggaW5maW5pdGUgbG9vcCB3aGVuIHByb2Nlc3NpbmcgQ29udGVudC1sYW5ndWFnZSBsaW5lcyBpbgogICAgIHR5cGUtbWFwIGZpbGVzLiBbQWxleGVpIEtvc3V0XQoKICAqKSBDbG9zZWQgZmlsZS1nbG9iYmluZyBob2xlIGluIHRlc3QtY2dpIHNjcmlwdC4gW0JyaWFuIEJlaGxlbmRvcmZdCgogICopIEZpeGVkIHByb2JsZW0gaW4gc2V0X1t1c2VyfGdyb3VwXSB0aGF0IHByZXZlbnRlZCBDR0kgZXhlY3V0aW9uCiAgICAgZm9yIG5vbi12aXJ0dWFsaG9zdHMgd2hlbiBzdUVYRUMgd2FzIGVuYWJsZWQuIFtSYW5keSBUZXJidXNoXQoKICAqKSBBZGRlZCBQT1JUSU5HIGluZm9ybWF0aW9uIGZpbGUuICBbSmltIEphZ2llbHNraV0KCiAgKikgQWRkZWQgZGVmaW5pdGlvbnMgZm9yIFNfSVdHUlAgYW5kIFNfSVdPVEggdG8gY29uZi5oIFtCZW4gTGF1cmllXQoKICAqKSBDaGFuZ2VkIGRlZmF1bHQgZ3JvdXAgdG8gIm5vZ3JvdXAiIGluc3RlYWQgb2YgIm5vYm9keSIgW1JhbmR5IFRlcmJ1c2hdCgogICopIEZpeGVkIGRlZmluZSB0eXBvIG9mIEZDTlRMX1NFUklBTElaRURfQUNDRVBUIHdoZXJlCiAgICAgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUIHdhcyBpbnRlbmRlZC4KCiAgKikgRml4ZWQgYWRkaXRpb25hbCB1c2VzIG9mIDB4ZmZmZmZmZmYgd2hlcmUgSU5BRERSX05PTkUgd2FzIGludGVuZGVkLAogICAgIHdoaWNoIGNhdXNlZCBwcm9ibGVtcyBvZiBzeXN0ZW1zIHdoZXJlIHNvY2tldCBzX2FkZHIgaXMgPjMyYml0cy4KCiAgKikgQWRkZWQgY29tbWVudCB0byBleHBsYWluIChyLT5jaHVua2VkID0gMSkgc2lkZS1lZmZlY3QgaW4KICAgICBodHRwX3Byb3RvY29sLmMgW1JveSBGaWVsZGluZ10KCiAgKikgUmVwbGFjZWQgdXNlIG9mIGluZGV4KCkgaW4gbW9kX2V4cGlyZXMuYyB3aXRoIG1vcmUgYXBwcm9wcmlhdGUKICAgICBhbmQgcG9ydGFibGUgaXNkaWdpdCgpIHRlc3QuICBbQmVuIExhdXJpZV0KCiAgKikgVXBkYXRlZCBDb25maWd1cmUgZm9yIC4uLgogICAgICAgIE9TLzIgICAgICAgICAgKERFRl9XQU5USFNSRUdFWD15ZXMsIG90aGVyIGNvZGUgY2hhbmdlcykKICAgICAgICAqLWRnLWRndXgqICAgIChiYWQgcGF0dGVybiBtYXRjaCkKICAgICAgICBRTlggICAgICAgICAgIChERUZfV0FOVEhTUkVHRVg9eWVzKQogICAgICAgICotc3Vub3M0KiAgICAgKERFRl9XQU5USFNSRUdFWD15ZXMsIC1EVVNFQkNPUFkpCiAgICAgICAgKi11bHRyaXggICAgICAobmV3KQogICAgICAgICotdW5peHdhcmUyMTEgKG5ldykKICAgICBhbmQgYWRkZWQgc29tZSB1c2VyIGRpYWdub3N0aWMgaW5mby4gIFtCZW4gTGF1cmllXQoKICAqKSBJbiBoZWxwZXJzL0N1dFJ1bGUsIHJlcGxhY2VkICJjdXQiIGludm9jYXRpb24gd2l0aCAiYXdrIiBpbnZvY2F0aW9uCiAgICAgZm9yIGJldHRlciBwb3J0YWJpbGl0eS4gW0ppbSBKYWdpZWxza2ldCgogICopIFVwZGF0ZWQgaGVscGVycy9HdWVzc09TIGZvciAuLi4KICAgICAgICBTQ08gNSAgICAgICAgICAgIChyZWNvZ25pemUgbWlub3IgcmVsZWFzZXMpCiAgICAgICAgU0NPIFVuaXhXYXJlICAgICAoYnJhaW5kYW1hZ2VkIHVuYW1lLCB3aGF0ZXZlci13aGF0ZXZlci11bml4d2FyZTIpCiAgICAgICAgU0NPIFVuaXhXYXJlIDIuMS4xICAgICAgKHJlcXVpcmVzIGEgc2VwYXJhdGUgc2V0IG9mICNkZWZpbmVzIGluIGNvbmYuaCkKICAgICAgICBJUklYNjQgICAgICAgICAgICgtc2dpLWlyaXg2NCkKICAgICAgICBVTFRSSVggICAgICAgICAgICgtdW5rbm93bi11bHRyaXgpCiAgICAgICAgU0lOSVggICAgICAgICAgICAoLXdoYXRldmVyLXN5c3Y0KQogICAgICAgIE5DUiBVbml4ICAgICAgICAgKC1uY3Itc3lzdjQpCiAgICAgYW5kIGZpeGVkIHNvbWV0aGluZyBpbiBoZWxwZXJzL1ByaW50UGF0aCAgW0JlbiBMYXVyaWVdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMmIxCgogICopIE5vdCBsaXN0ZWQuIFNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvbmV3X2ZlYXR1cmVzXzFfMi5odG1sPgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjEuMQoKICAqKSBGaXhlZCBidWcgd2hlcmUgQ29va2llIG1vZHVsZSB3b3VsZCBtYWtlIHR3byBlbnRyaWVzIGluIHRoZQogICAgIGxvZ2ZpbGUgZm9yIGVhY2ggYWNjZXNzIFtNYXJrIENveF0KCiAgKikgRml4ZWQgYnVnIHdoZXJlIFJlZGlyZWN0IGluIC5odGFjY2VzcyBmaWxlcyB3b3VsZCBjYXVzZSBtZW1vcnkKICAgICBsZWFrLiBbTmF0aGFuIE5ldWxpbmdlcl0KCiAgKikgTXVsdGlWaWV3cyBub3cgd29ya3MgY29ycmVjdGx5IHdpdGggQWRkSGFuZGxlciBbQWxleGVpIEtvc3V0XQoKICAqKSBQcm9ibGVtcyB3aXRoIG1vZF9hdXRoX21zcWwgZml4ZWQgW0RpcmsgdmFuR3VsaWtdCgogICopIEZpeCBtaXNzcGVsbGluZyBvZiAiQW5vbnltb3VzX0F1dGhvcmF0aXZlIiBkaXJlY3RpdmUgaW4gbW9kX2F1dGhfYW5vbi4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4xLjAKCiAgKikgQnJpbmcgTmVYVCBzdXBwb3J0IHVwIHRvIGRhdGUuIFtUYWthYWtpIE1hdHN1bW90b10KCiAgKikgQnJpbmcgUU5YIHN1cHBvcnQgdXAgdG8gZGF0ZS4gW0JlbiBMYXVyaWVdCgogICopIE1ha2UgdmlydHVhbCBob3N0cyBkZWZhdWx0IHRvIG1haW4gc2VydmVyIGtlZXBhbGl2ZSBwYXJhbWV0ZXJzLgogICAgIFtBbGV4ZWkgS29zdXQsIEJlbiBMYXVyaWVdCgogICopIEFsbG93IFNjYW5IVE1MVGl0bGVzIHRvIHdvcmsgd2l0aCBsb3dlcmNhc2UgPHRpdGxlPiB0YWdzLiBbQWxleGVpIEtvc3V0XQoKICAqKSBGaXggbWlzc2luZyBhZGRyZXNzIGZhbWlseSBmb3IgY29ubmVjdCwgYWxzbyByZW1vdmUgdW5yZWFjaGFibGUgc3RhdGVtZW50CiAgICAgaW4gbW9kX3Byb3h5LiBbQmVuIExhdXJpZV0KCiAgKikgbW9kX2VudiBub3cgdHVybmVkIG9uIGJ5IGRlZmF1bHQgaW4gQ29uZmlndXJhdGlvbi50bXBsLgoKICAqKSBCdWdzIHdoaWNoIHdlcmUgZml4ZWQ6CiAgICAgICAgYSkgeWV0IG1vcmUgbW9kX3Byb3h5IGJ1Z3MgW0JlbiBMYXVyaWVdCiAgICAgICAgYikgQ0dJIHdvcmtzIGFnYWluIHdpdGggaW5ldGQgW0FsZXhlaSBLb3N1dF0KICAgICAgICBjKSBMZWFkaW5nIGNvbG9ucyB3ZXJlIHN0cmlwcGVkIGZyb20gcGFzc3dvcmRzIFs8b3NtIGludGVyZ3VpZGUuY29tPl0KICAgICAgICBkKSBBbm90aGVyIGZpeCB0byBtdWx0aS1tZXRob2QgTGltaXQgcHJvYmxlbSBbPGprIHRvb2xzLmRlPl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4xYjQKCiAgKikgci0+Ynl0ZXNfc2VudCB2YXJpYWJsZSByZXN0b3JlZC4gW1JvYmVydCBUaGF1XQoKICAqKSBQcmV2aW91c2x5IGJyb2tlbiBtdWx0aS1tZXRob2QgPExpbWl0PiBwYXJzaW5nIGZpeGVkLiBbUm9iZXJ0IFRoYXVdCgogICopIE1vcmUgcG9zc2libHkgdW5zZWN1cmUgcHJvZ3JhbXMgcmVtb3ZlZCBmcm9tIHRoZSBzdXBwb3J0IGRpcmVjdG9yeS4KCiAgKikgTW9yZSBtb2RfYXV0aF9tc3FsIGF1dGhlbnRpY2F0aW9uIGltcHJvdmVtZW50cy4KCiAgKikgVmlydHVhbEhvc3RzIGJhc2VkIG9uIEhvc3Q6IGhlYWRlcnMgbm8gbG9uZ2VyIGNvbmZsaWN0IHdpdGggdGhlCiAgICAgTGlzdGVuIGRpcmVjdGl2ZS4KCiAgKikgT1MvMiBjb21wYXRpYmlsaXR5IGVuaGFuY2VtZW50cy4gW0dhcnkgU21pbGV5XQoKICAqKSBQT1NUIG5vdyBhbGxvd2VkIHRvIGRpcmVjdG9yeSBpbmRleCBDR0kgc2NyaXB0cy4KCiAgKikgQWN0aW9ucyBub3cgd29yayB3aXRoIGZpbGVzIG9mIHRoZSBkZWZhdWx0IHR5cGUuCgogICopIEJ1Z3Mgd2hpY2ggd2VyZSBmaXhlZDoKICAgICAgICBhKSBtb3JlIG1vZF9wcm94eSBidWdzCiAgICAgICAgYikgZWFybHkgdGVybWluYXRpb24gb2YgaW5ldGQgcmVxdWVzdHMKICAgICAgICBjKSBjb21waWxlIHdhcm5pbmdzIG9uIHNldmVyYWwgc3lzdGVtcwogICAgICAgIGQpIHByb2JsZW1zIHdoZW4gc2NyaXB0cyBzdG9wIHJlYWRpbmcgb3V0cHV0IGVhcmx5CgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMWIzCgogICopIE11Y2ggb2YgY2dpLWJpbiBhbmQgYWxsIG9mIGNnaS1zcmMgaGFzIGJlZW4gcmVtb3ZlZCwgZHVlIHRvCiAgICAgdmFyaW91cyBzZWN1cml0eSBob2xlcyBmb3VuZCBhbmQgdGhhdCB3ZSBjb3VsZCBubyBsb25nZXIgc3VwcG9ydAogICAgIHRoZW0uCgogICopIFRoZSAiU2V0LUNvb2tpZSIgaGVhZGVyIGlzIG5vdyBzcGVjaWFsLWNhc2VkIHRvIG5vdCBtZXJnZSBtdWx0aXBsZQogICAgIGluc3RhbmNlcywgc2luY2UgY2VydGFpbiBwb3B1bGFyIGJyb3dzZXJzIGNhbiBub3QgaGFuZGxlIG11bHRpcGxlCiAgICAgU2V0LUNvb2tpZSBpbnN0cnVjdGlvbnMgaW4gYSBzaW5nbGUgaGVhZGVyLiBbUGF1bCBTdXR0b25dCgogICopIHJwcmludGYoKSBhZGRlZCB0byBidWZmZXIgY29kZSwgb2NjdXJyZW5jZXMgb2Ygc3ByaW50ZiByZW1vdmVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDT05ORUNUIG1ldGhvZCBmb3IgcHJveHkgbW9kdWxlLCB3aGljaCBtZWFucyB0dW5uZWxpbmcgU1NMIHNob3VsZCB3b3JrLgogICAgIChObyBjcnlwdG8gbmVlZGVkKSAgQWxzbyBhIE5vQ2FjaGUgY29uZmlnIGRpcmVjdGl2ZS4KCiAgKikgU2V2ZXJhbCBBUEkgYWRkaXRpb25zOiBwc3RybmR1cCgpLCB0YWJsZV91bnNldCgpIGFuZCBnZXRfdG9rZW4oKQogICAgIGZ1bmN0aW9ucyBub3cgYXZhaWxhYmxlIHRvIG1vZHVsZXMuCgogICopIG1vZF9pbWFwIGZpeHVwcywgaW4gcGFydGljdWxhciBMb2NhdGlvbjogaGVhZGVycyBhcmUgbm93IGNvbXBsZXRlCiAgICAgVVJMJ3MuCgogICopIE5ldyAiaW5mbyIgbW9kdWxlIHdoaWNoIHJlcG9ydHMgb24gaW5zdGFsbGVkIG1vZHVsZSBzZXQgdGhyb3VnaCBhCiAgICAgc3BlY2lhbCBVUkwsIGEgbGEgbW9kX3N0YXR1cy4KCiAgKikgIlNlcnZlclBhdGgiIGRpcmVjdGl2ZSBhZGRlZCAtIGFsbG93cyBmb3IgZ3JhY2VmdWwgdHJhbnNpdGlvbgogICAgIGZvciBIb3N0Oi1oZWFkZXItYmFzZWQgdmlydHVhbCBob3N0cy4KCiAgKikgQW5vbnltb3VzIGF1dGhlbnRpY2F0aW9uIG1vZHVsZSBpbXByb3ZlbWVudHMuCgogICopIE1TUUwgYXV0aGVudGljYXRpb24gbW9kdWxlIGltcHJvdmVtZW50cy4KCiAgKikgU3RhdHVzIG1vZHVsZSBkZXNpZ24gaW1wcm92ZWQgLSBvdXRwdXQgbm93IHRhYmxlLWJhc2VkLiBbQmVuIExhdXJpZV0KCiAgKikgaHRkaWdlc3QgdXRpbGl0eSBpbmNsdWRlZCBmb3IgdXNlIHdpdGggZGlnZXN0IGF1dGhlbnRpY2F0aW9uCiAgICAgbW9kdWxlLgoKICAqKSBtb2RfbmVnb3RpYXRpb246IEFjY2VwdCB2YWx1ZXMgd2l0aCB3aWxkY2FyZHMgdG8gYmUgdHJlYXRlZCB3aXRoCiAgICAgbGVzcyBwcmlvcml0eSB0aGFuIHRob3NlIHdpdGhvdXQgd2lsZGNhcmRzIGF0IHRoZSBzYW1lIHF1YWxpdHkKICAgICB2YWx1ZS4gW0FsZXhlaSBLb3N1dF0KCiAgKikgQnVncyB3aGljaCB3ZXJlIGZpeGVkOgogICAgICAgIGEpIG51bWVyb3VzIG1vZF9wcm94eSBidWdzCiAgICAgICAgYikgQ0dJIGVhcmx5LXRlcm1pbmF0aW9uIGJ1ZyBbQmVuIExhdXJpZV0KICAgICAgICBjKSBLZWVwYWxpdmVzIG5vdCB3b3JraW5nIHdpdGggdmlydHVhbCBob3N0cwogICAgICAgIGQpIFJlZmVyZXJJZ25vcmUgcHJvYmxlbXMKICAgICAgICBlKSBjbG9zaW5nIGZkJ3MgdHdpY2UgaW4gbW9kX2luY2x1ZGUgKGNhdXNpbmcgY29yZSBkdW1wcyBvbgogICAgICAgICAgIExpbnV4IGFuZCBlbHNld2hlcmUpLgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjFiMgoKICAqKSBCdWdmaXhlczoKICAgICAgICBhKSBjb3JlIGR1bXBzIGluIG1vZF9kaWdlc3QKICAgICAgICBiKSB0cnVuY2F0ZWQgaG9zdG5hbWVzL2lwIGFkZHJlc3MgaW4gdGhlIGxvZ3MKICAgICAgICBjKSByZWxhdGl2ZSBVUkwncyBpbiBtb2RfaW1hcCBtYXAgZmlsZXMKCkNoYW5nZXMgd2l0aCBBcGFjaGUgMS4xYjEKCiAgKikgTm90IGxpc3RlZC4gU2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy9uZXdfZmVhdHVyZXNfMV8xLmh0bWw+CgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMC4zCgogICopIEludGVybmFsIHJlZGlyZWN0cyB3aGljaCBvY2N1ciBpbiBtb2RfZGlyLmMgbm93IHByZXNlcnZlIHRoZQogICAgIHF1ZXJ5IHBvcnRpb24gb2YgYSByZXF1ZXN0ICh0aGUgYml0IGFmdGVyIHRoZSBxdWVzdGlvbiBtYXJrKS4KICAgICBbQWRhbSBTdXNzbWFuXQoKICAqKSBFc2NhcGUgYWN0aXZlIGNoYXJhY3RlcnMgJzwnLCAnPicgYW5kICcmJyBpbiBodG1sIG91dHB1dCBpbgogICAgIGRpcmVjdG9yeSBsaXN0aW5ncywgZXJyb3IgbWVzc2FnZXMgYW5kIHJlZGlyZWN0aW9uIGxpbmtzLgogICAgIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgQXBhY2hlIHdpbGwgbm93IHdvcmsgd2l0aCBMeW54T1MgMi4zIGFuZCBsYXRlciBbU3RldmVuIFdhdHRdCgogICopIEZpeCBmb3IgUE9TSVggY29tcGxpYW5jZSBpbiB3YWl0aW5nIGZvciBwcm9jZXNzZXMgaW4gYWxsb2MuYy4KICAgICBbTmljayBXaWxsaWFtc10KCiAgKikgc2V0c29ja29wdCBubyBsb25nZXIgdGFrZXMgYSBjb25zdCBkZWNsYXJlZCBhcmd1bWVudCBbTWFydGlqbiBLb3N0ZXJdCgogICopIFJlc2V0IHRpbWVvdXQgdGltZXIgYWZ0ZXIgZWFjaCBzdWNjZXNzZnVsIGZ3cml0ZSgpIHRvIHRoZSBuZXR3b3JrLgogICAgIFRoaXMgcGF0Y2ggYWRkcyBhIHJlc2V0X3RpbWVvdXQoKSBwcm9jZWR1cmUgdGhhdCBpcyBjYWxsZWQgYnkKICAgICBzZW5kX2ZkKCkgdG8gcmVzZXQgdGhlIHRpbWVvdXQgZXZlciB0aW1lIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgbmV0LgogICAgIFtOYXRoYW4gU2NocmVua10KCiAgKikgdGltZW91dCgpIHNpZ25hbCBoYW5kbGVyIG5vdyBjaGVja3MgZm9yIFNJR1BJUEUgYW5kIHJlcG9ydHMKICAgICBsb3N0IGNvbm5lY3Rpb25zIGluIGEgbW9yZSB1c2VyIGZyaWVuZGx5IHdheS4gW1JvYiBIYXJ0aWxsXQoKICAqKSBMb2NhdGlvbiBvZiB0aGUgInNjb3JlYm9hcmQiIGZpbGUgd2hpY2ggdXNlZCB0byBsaXZlIGluIC90bXAgaXMKICAgICBub3cgY29uZmlndXJhYmxlIChmb3IgT1NlcyB0aGF0IGNhbid0IHVzZSBtbWFwKSB2aWEgU2NvcmVCb2FyZEZpbGUKICAgICB3aGljaCB3b3JrcyBzaW1pbGFyIHRvIFBpZEZpbGUgKGluIGh0dHBkLmNvbmYpIFtSb2IgSGFydGlsbF0KCiAgKikgSW5jbHVkZSBzeXMvcmVzb3VyY2UuaCBpbiB0aGUgY29ycmVjdCBwbGFjZSBmb3IgU3VuT1M0IFtTYW1lZXIgUGFyZWtoXQoKICAqKSB0aGUgcHN0cmNhdCBjYWxsIGluIG1vZF9jb29raWVzLmMgZGlkbid0IGhhdmUgYW4gZW5kaW5nIE5VTEwsCiAgICAgd2hpY2ggY2F1c2VkIGEgU0VHViB3aXRoIGNvb2tpZXMgZW5hYmxlZAoKICAqKSBPdXRwdXQgd2FybmluZyB3aGVuIE1pblNwYXJlU2VydmVycyBpcyBzZXQgdG8gPD0gMCBhbmQgY2hhbmdlIGl0IHRvIDEKICAgICBbUm9iIEhhcnRpbGxdCgogICopIExvZyB0aGUgVU5JWCB0ZXh0dWFsIGVycm9yIHJldHVybmVkIGJ5IHNvbWUgc3lzdGVtIGNhbGxzLCBpbgogICAgIHBhcnRpY3VsYXIgZXJyb3JzIGZyb20gYWNjZXB0KCkgW0RhdmlkIFJvYmluc29uXQoKICAqKSBBZGQgc3RyZXJyb3IgZnVuY3Rpb24gdG8gdXRpbC5jIGZvciBTdW5PUzQgW1JhbmR5IFRlcmJ1c2hdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMC4yCgogICopIHBhdGNoIHRvIGdldCBBcGFjaGUgY29tcGlsZWQgb24gVW5peFdhcmUgMi54LCByZWNvbW1lbmRlZCBhcwogICAgIGEgdGVtcG9yYXJ5IG1lYXN1cmUsIHBlbmRpbmcgcmV3cml0ZSBvZiByZmM5MzEuYy4gW0NodWNrIE11cmNrb10KCiAgKikgRml4IGdldF9iYXNpY19hdXRoX3B3KCkgdG8gc2V0IHRoZSBhdXRoX3R5cGUgb2YgdGhlIHJlcXVlc3QuCiAgICAgW0RhdmlkIFJvYmluc29uXQoKICAqKSBwYXN0IGNoYW5nZXMgdG8gaHR0cF9jb25maWcuYyB0byBvbmx5IHVzZSB0aGUKICAgICBzZXRybGltaXQgZnVuY3Rpb24gb24gc3lzdGVtcyBkZWZpbmluZyBSTElNSVRfTk9GSUxFCiAgICAgYnJva2UgdGhlIGZlYXR1cmUgb24gU1VOT1M0LiBOb3cgZGVmaW5lcyBIQVZFX1JFU09VUkNFCiAgICAgZm9yIFNVTk9TIGFuZCBwcm90b3R5cGVzIHRoZSBuZWVkZWQgZnVuY3Rpb25zLgoKICAqKSBSZW1vdmUgdXNlcyBvZiBNQVhfU1RSSU5HX0xFTi9IVUdFX1NUUklOR19MRU4gZnJvbSBzZXZlcmFsIHJvdXRpbmVzLgogICAgIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgRml4IHVzZSBvZiBwb2ludGVyIHRvIHNjcmF0Y2ggbWVtb3J5LiBbQ2xpZmYgU2tvbG5pY2tdCgogICopIE1lcmdlIG11bHRpcGxlIGhlYWRlcnMgZnJvbSBDR0kgc2NyaXB0cyBpbnN0ZWFkIG9mIHRha2luZyBsYXN0CiAgICAgb25lLiBbRGF2aWQgUm9iaW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBTQ08gNS4gW0JlbiBMYXVyaWVdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDEuMC4xCgogICopIFNpbGVuY2UgbW9kX2xvZ19yZWZlcmVyIGFuZCBtb2RfbG9nX2FnZW50IGlmIG5vdCBjb25maWd1cmVkCiAgICAgW1JhbmR5IFRlcmJ1c2hdCgogICopIFJlY3Vyc2l2ZSBpbmNsdWRlcyBjYW4gb2NjdXIgaWYgdGhlIGNsaWVudCBzdXBwbGllcyBQQVRIX0lORk8gZGF0YQogICAgIGFuZCB0aGUgc2VydmVyIHByb3ZpZGVyIHVzZXMgcmVsYXRpdmUgbGlua3M7IGFzIGZpbGUuaHRtbAogICAgIHJlbGF0aXZlIHRvIC9kb2Muc2h0bWwvcGF0aGluZm8gaXMgL2RvYy5zaHRtbC9maWxlLmh0bWwuIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgVGhlIHJlcGxhY2VtZW50IGZvciBpbml0Z3JvdXBzKCkgZGlkIG5vdCBjYWxsIHtzZXQsZW5kfWdyZW50KCkuIFRoaXMKICAgICBoYWQgdHdvIGltcGxpY2F0aW9uczogaWYgYW55dGhpbmcgZWxzZSB1c2VkIGdldGdyZW50KCksIHRoZW4KICAgICBpbml0Z3JvdXBzKCkgd291bGQgZmFpbCwgYW5kIGl0IHdhcyBjb25zdW1pbmcgYSBmaWxlIGRlc2NyaXB0b3IuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE9uIGhlYXZpbHkgbG9hZGVkIHNlcnZlcnMgaXQgd2FzIHBvc3NpYmxlIGZvciB0aGUgc2NvcmVib2FyZCB0byBnZXQKICAgICBvdXQgb2Ygc3luYyB3aXRoIHJlYWxpdHksIGFzIGEgcmVzdWx0IG9mIGEgcmFjZSBjb25kaXRpb24uCiAgICAgVGhlIG9ic2VydmVkIHN5bXB0b21zIGFyZSBmYXIgbW9yZSBBcGFjaGVzIHJ1bm5pbmcgdGhhbiBzaG91bGQKICAgICBiZSwgYW5kIGhlYXZ5IHN5c3RlbSBsb2FkcywgZ2VuZXJhbGx5IGZvbGxvd2VkIGJ5IGNhdGFzdHJvcGhpYwogICAgIHN5c3RlbSBmYWlsdXJlLiBbQmVuIExhdXJpZV0KCiAgKikgRml4IHR5cG8gaW4gbGljZW5zZS4gW0RhdmlkIFJvYmluc29uXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAxLjAuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMyBOb3YgMTk5NQoKICAqKSBOb3QgbGlzdGVkLiBTZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL25ld19mZWF0dXJlc18xXzAuaHRtbD4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDUgTm92IDE5OTUKCiAgKikgTmV3IG1hbiBwYWdlIGZvciAnaHR0cGQnIGFkZGVkIHRvIHN1cHBvcnQgZGlyZWN0b3J5IFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgLmh0Z3JvdXAgZmlsZXMgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBsaW5lIGdpdmluZyBtZW1iZXJzIGZvciBhCiAgICAgZ2l2ZW4gZ3JvdXAgKGVhY2ggbXVzdCBoYXZlIHRoZSBncm91cCBuYW1lIGluIGZyb250KSwgZm9yIE5DU0EKICAgICBiYWNrLWNvbXBhdGliaWxpdHkgW1JvYmVydCBUaGF1XQoKICAqKSBNdXR1YWwgZXhjbHVzaW9uIGFyb3VuZCBhY2NlcHQoKSBpcyBvbiBieSBkZWZhdWx0IGZvciBTVlI0IHN5c3RlbXMKICAgICBnZW5lcmFsbHksIHNpbmNlIHRoZXkgZ2VuZXJhbGx5IGNhbid0IGhhbmRsZSBtdWx0aXBsZSBwcm9jZXNzZXMgaW4KICAgICBhY2NlcHQoKSBvbiB0aGUgc2FtZSBzb2NrZXQuICBUaGlzIHNob3VsZCBjdXJlIGZsYWt5IGJlaGF2aW9yIG9uCiAgICAgYSBsb3Qgb2YgdGhvc2Ugc3lzdGVtcy4gIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgQWRkVHlwZSwgQWRkRW5jb2RpbmcsIGFuZCBBZGRMYW5ndWFnZSBkaXJlY3RpdmVzIHRha2UgbXVsdGlwbGUKICAgICBleHRlbnNpb25zIG9uIGEgc2luZ2xlIGNvbW1hbmQgbGluZSBbRGF2aWQgUm9iaW5zb25dCgogICopIFVzZXJEaXIgY2FuIGJlIGRpc2FibGVkIGZvciBhIGdpdmVuIHZpcnR1YWwgaG9zdCBieSBzYXlpbmcKICAgICAiVXNlckRpciBkaXNhYmxlZCIgaW4gdGhlIDxWaXJ0dWFsSG9zdD4gc2VjdGlvbiAtLS0gaXQgd2FzIGEgYnVnCiAgICAgdGhhdCB0aGlzIGRpZG4ndCB3b3JrLiAgW0RhdmlkIFJvYmluc29uXQoKICAqKSBDb21waWxlcyBvbiBRTlggW0JlbiBMYXVyaWVdCgogICopIENvcnJlY3RlZCBwYXJzaW5nIG9mIGN0aW1lIHRpbWUgZm9ybWF0IFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgaHR0cGQgZG9lcyBhIHBlcnJvcigpIGJlZm9yZSBleGl0aW5nIGlmIGl0IGNhbid0IGxvZyBpdHMgcGlkCiAgICAgdG8gdGhlIFBpZEZpbGUsIHRvIG1ha2UgZGlhZ25vc2luZyB0aGUgZXJyb3IgYSBiaXQgZWFzaWVyLgogICAgIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgPCEtLSNpbmNsdWRlIGZpbGU9Ii4uLiItLT4gY2FuIG5vIGxvbmdlciBpbmNsdWRlIGZpbGVzIGluIHRoZQogICAgIHBhcmVudCBkaXJlY3RvcnksIGZvciBOQ1NBIGJhY2stY29tcGF0aWJpbGl0eS4gIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgJ34nIGlzICpub3QqIGVzY2FwZWQgaW4gVVJJcyBnZW5lcmF0ZWQgZm9yIGRpcmVjdG9yeSBsaXN0aW5ncwogICAgIFtSb3kgRmllbGRpbmddCgogICopIEVsaW1pbmF0ZWQgY29tcGlsZXIgd2FybmluZyBpbiB0aGUgaW1hZ2VtYXAgbW9kdWxlIFtSYW5keSBUZXJidXNoXQoKICAqKSBGaXhlZCBidWcgaW52b2x2aW5nIGhhbmRsaW5nIFVSSXMgd2l0aCBlc2NhcGVkICUtY2hhcmFjdGVycwogICAgIGluIHJlZGlyZWN0cyBbRGF2aWQgUm9iaW5zb25dCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDAuOC4xNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0IE9jdCAxOTk1CgogICopIFN3aXRjaGVkIHRvIG5ldywgc2ltcGxlciBsaWNlbnNlCgogICopIEVsaW1pbmF0ZWQgY29yZSBkdW1wcyB3aXRoIGltcHJvcGVybHkgZm9ybWF0dGVkIERCTSBncm91cCBmaWxlcyBbTWFyayBDb3hdCgogICopIERvbid0IGFsbG93IHJlcXVlc3RzIGZvciBvcmRpbmFyeSBmaWxlcyB0byBoYXZlIFBBVEhfSU5GTyBbQmVuIExhdXJpZV0KCiAgKikgUmVqZWN0IHBhdGhzIGNvbnRhaW5pbmcgJS1lc2NhcGVkICclJyBvciBudWxsIGNoYXJhY3RlcnMgW0RhdmlkIFJvYmluc29uXQoKICAqKSBDb3JyZWN0bHkgaGFuZGxlcyBpbnRlcm5hbCByZWRpcmVjdHMgdG8gZmlsZXMgd2l0aCBuYW1lcyBjb250YWluaW5nICclJwogICAgIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgUmVwdW5jdHVhdGVkIHNvbWUgZXJyb3IgbWVzc2FnZXMgW0FyYW0gTWlyemFkZWgsIEFuZHJldyBXaWxzb25dCgogICopIFVzZSBnZXRldWlkKCkgcmF0aGVyIHRoYW4gZ2V0dWlkKCkgdG8gc2VlIGlmIHdlIGhhdmUgcm9vdCBwcml2aWxlZ2UsCiAgICAgc28gdGhhdCBzZXJ2ZXIgY29ycmVjdGx5IHJlc2V0cyBwcml2aWxlZ2UgaWYgcnVuIHNldHVpZCByb290LiAgW0FuZHJldwogICAgIFdpbHNvbl0KCiAgKikgSGFuZGxlIGZ0cDogYW5kIHRlbG5ldDogVVJMcyBjb3JyZWN0bHkgaW4gaW1hZ2VtYXBzIChidWlsdC1pbiBtb2R1bGUpCiAgICAgW1JhbmR5IFRlcmJ1c2hdCgogICopIEZpeCByZWxhdGl2ZSBVUkxzIGluIGltYWdlbWFwIGZpbGVzIFtSYW5keSBUZXJidXNoXQoKICAqKSBTb21ld2hhdCBiZXR0ZXIgZml4IGZvciB0aGUgb2xkICJBbGlhcyAvZm9vLyAvYmFyLyIgYnVzaW5lc3MKICAgICBbRGF2aWQgUm9iaW5zb25dCgogICopIERvbid0IHJlcGVhdGVkbHkgb3BlbiB0aGUgRXJyb3JMb2cgaWYgYSBidW5jaCBvZiA8VmlydHVhbEhvc3Q+CiAgICAgZW50cmllcyBhbGwgbmFtZSB0aGUgc2FtZSBvbmUuIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgRml4IGRpcmVjdG9yeSBsaXN0aW5ncyB3aXRoIGZpbGVuYW1lcyBjb250YWluaW5nIHVudXN1YWwgY2hhcmFjdGVycwogICAgIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgQmV0dGVyIFVSSS1lc2NhcGluZyBmb3IgZ2VuZXJhdGVkIFVSSXMgaW4gZGlyZWN0b3JpZXMgd2l0aCBmaWxlbmFtZXMKICAgICBjb250YWluaW5nIHVudXN1YWwgY2hhcmFjdGVycyBbQmVuIExhdXJpZV0KCiAgKikgRml4ZWQgcG90ZW50aWFsIEZJTEUqIGxlYWsgaW4gaHR0cF9tYWluLmMgW0JlbiBMYXVyaWVdCgogICopIFVuYmxvY2sgYWxhcm1zIG9uIGVycm9yIHJldHVybiBmcm9tIHNwYXduX2NoaWxkKCkgW0RhdmlkIFJvYmluc29uXQoKICAqKSBTYW1wbGUgQ29uZmlnIGZpbGVzIGhhdmUgZXh0cmEgbm90ZSBmb3IgU0NPIHVzZXJzIFtCZW4gTGF1cmllXQoKICAqKSBDb25maWd1cmF0aW9uIGhhcyBub3RlIGZvciBIUC1VWCB1c2VycyBbUm9iIEhhcnRpbGxdCgogICopIEVsaW1pbmF0ZWQgc29tZSBib2d1cyBMaW51eC1vbmx5ICNkZWZpbmVzIGluIGNvbmYuaCBbQXJhbSBNaXJ6YWRlaF0KCiAgKikgTnVrZWQgYm9ndXMgI2RlZmluZSBpbiBodHRwZC5oIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgQmV0dGVyIHRlc3QgZm9yIHdoZXRoZXIgYSBzeXN0ZW0gaGFzIHNldHJsaW1pdCgpIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgQ2FsbHMgdXBkYXRlX2NoaWxkX3N0YXR1cygpIGFmdGVyIHJlb3Blbl9zY29yZWJvYXJkKCkgW0RhdmlkIFJvYmluc29uXQoKICAqKSBEb2Vzbid0IHNlbmQgaXRzZWxmIFNJR0hVUCBvbiBzdGFydHVwIHdoZW4gcnVuIGluIHRoZSAtWCBkZWJ1Zy1vbmx5IG1vZGUKICAgICBbQmVuIExhdXJpZV0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkgU2VwIDE5OTUKCiAgKikgQ29tcGlsZXMgb24gU0NPIE9EVCAzLjAgW0JlbiBMYXVyaWVdCgogICopIEFkZERlc2NyaXB0aW9uIHdvcmtzIChiZXR0ZXIpIFtCZW4gTGF1cmllXQoKICAqKSBMZWF2ZXMgYW4gaW50ZWxsaWdpYmxlIGVycm9yIGRpYWdub3N0aWMgd2hlbiBpdCBjYW4ndCBzZXQgZ3JvdXAKICAgICBwcml2aWxlZ2VzIG9uIHN0YW5kYWxvbmUgc3RhcnR1cCBbQW5kcmV3IFdpbHNvbl0KCiAgKikgQ29tcGlsZXMgb24gTmVYVCBhZ2FpbiAtLS0gdGhlIDAuOC4xMyBSTElNSVQgcGF0Y2ggd2FzIGZhaWxpbmcgb24KICAgICB0aGF0IG1hY2hpbmUsIHdoaWNoIGNsYWltcyB0byBiZSBCU0QgYnV0IGRvZXMgbm90IHN1cHBvcnQgUkxJTUlULgogICAgIFtSYW5keSBUZXJidXNoXQoKICAqKSBnY2MgLVdhbGwgbm8gbG9uZ2VyIGNvbXBsYWlucyBhYm91dCBhbiB1bnVzZWQgdmFyaWFibGUgd2hlbiB1dGlsLmMKICAgICBpcyBjb21waWxlZCB3aXRoIC1ETUlOSU1BTF9ETlMgW0FuZHJldyBXaWxzb25dCgogICopIE51a2VkIGFub3RoZXIgY29tcGlsZXIgd2FybmluZyBmb3IgLVdhbGwgb24gTGludXggW0FyYW0gTWlyemFkZWhdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDAuOC4xMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA3IFNlcCAxOTk1CgogICopIE1ha2UgSW5kZXhJZ25vcmUgKndvcmsqIChvb29wcykgW0phcmtrbyBUb3JwcGFdCgogICopIEhhdmUgYnVpbHQtaW4gaW1hZ2VtYXAgY29kZSByZWNvZ25pemUgJiBob25vciBQb2ludCBkaXJlY3RpdmUgW0phbWVzCiAgICAgQ2xvb3NdCgogICopIEdlbmVyYXRlIGNsZWFuZXIgZGlyZWN0b3J5IGxpc3RpbmdzIGluIGRpcmVjdG9yaWVzIHdpdGggYSBtaXggb2YKICAgICBsb25nIGFuZCBzaG9ydCBmaWxlbmFtZXMgW1JvYiBIYXJ0aWxsXQoKICAqKSBQcm9wZXJseSBpbml0aWFsaXplIGR5bmFtaWNhbGx5IGxvYWRlZCBtb2R1bGVzIFtSb3lzdG9uIFNodWZmbGVib3RoYW1dCgogICopIFByb3Blcmx5IGRlZmF1bHQgU2VydmVyTmFtZSBmb3IgdmlydHVhbCBzZXJ2ZXJzIFtSb2JlcnQgVGhhdV0KCiAgKikgUmF0aW9uYWxpemUgaGFuZGxpbmcgb2YgQlNEIGluIGNvbmYuaCBhbmQgZWxzZXdoZXJlIFtSYW5keSBUZXJidXNoLAogICAgIFBhdWwgUmljaGFyZHMgYW5kIGEgY2FzdCBvZiB0aG91c2FuZHMuLi5dCgogICopIE9uIHNlbGYtaWRlbnRpZmllZCBCU0Qgc3lzdGVtcyAod2UgZG9uJ3QgdHJ5IHRvIGd1ZXNzIGFueSBtb3JlKSwKICAgICBhbGxvY2F0ZSBhIGZldyBleHRyYSBmaWxlIGRlc2NyaXB0b3JzIHBlciB2aXJ0dWFsIGhvc3Qgd2l0aCBzZXRybGltaXQsCiAgICAgaWYgd2UgY2FuLCB0byBhdm9pZCBydW5uaW5nIG91dC4gW1JhbmR5IFRlcmJ1c2hdCgogICopIFdyaXRlIDIyLWNoYXJhY3RlciBsb2NrIGZpbGUgbmFtZSBpbnRvIGJ1ZmZlciB3aXRoIGVub3VnaCBzcGFjZQogICAgIG9uIHN0YXJ0dXAgW0tvbnN0YW50aW4gT2xjaGFuc2tpXQoKICAqKSBVc2UgYXJjaGFpYyBzZXRwZ3JwKCkgaW50ZXJmYWNlIG9uIE5lWFQsIHdoaWNoIHJlcXVpcmVzIGl0IFtCcmlhbgogICAgIFBpbmtlcnRvbl0KCiAgKikgU3VwcHJlc3MgLVdhbGwgd2FybmluZyBieSBjYXN0aW5nIGNvbnN0IGF3YXkgaW4gdXRpbC5jIFtBcmFtIE1pcnphZGVoXQoKICAqKSBTdXBwcmVzcyAtV2FsbCB3YXJuaW5nIGJ5IGluaXRpYWxpemluZyB2YXJpYWJsZSBpbiBuZWdvdGlhdGlvbiBjb2RlCiAgICAgW1RvYmlhcyBXZWluZ2FydG5lcl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEgQXVnIDE5OTUKCiAgKikgRG9lc24ndCBwYXVzZSB0aHJlZSBzZWNvbmRzIGFmdGVyIGluY2x1ZGluZyBhIENHSSBzY3JpcHQgd2hpY2ggaXMKICAgICB0b28gc2xvdyB0byBkaWUgb2ZmICh0aGlzIGlzIGRvbmUgYnkgbm90IGV2ZW4gdHJ5aW5nIHRvIGtpbGwgb2ZmCiAgICAgc3VicHJvY2Vzc2VzLCBpbmNsdWRpbmcgdGhlIFNJR1RFUk0vcGF1c2UvU0lHS0lMTCByb3V0aW5lLCB1bnRpbAogICAgIGFmdGVyIHRoZSBlbnRpcmUgZG9jdW1lbnQgaGFzIGJlZW4gcHJvY2Vzc2VkKS4gIFtSb2JlcnQgVGhhdV0KCiAgKikgRG9lc24ndCBkbyBTU0kgaWYgT3B0aW9ucyBJbmNsdWRlcyBpcyBvZmYuICAoT29vcHMpLiAgW0RhdmlkIFJvYmluc29uXQoKICAqKSBPcHRpb25zIEluY2x1ZGVzTm9FeGVjIGFsbG93cyBpbmNsdXNpb24gb2YgYXQgbGVhc3QgdGV4dC8qIFtSb3kgRmllbGRpbmddCgogICopIEFsbG93cyAuaHRhY2Nlc3MgZmlsZXMgdG8gb3ZlcnJpZGUgPERpcmVjdG9yeT4gc2VjdGlvbnMgbmFtaW5nIHRoZQogICAgIHNhbWUgZGlyZWN0b3J5IFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgUmVtb3ZlZCBhbiBlZmZpY2llbmN5IGhhY2sgaW4gc3ViX3JlcV9sb29rdXBfdXJpIHdoaWNoIHdhcwogICAgIGNhdXNpbmcgY2VydGFpbiBleHRyZW1lbHkgbWFyZ2luYWwgY2FzZXMgKGUuZy4sIFNjcmlwdEFsaWFzIG9mIGEKICAgICAqcGFydGljdWxhciogaW5kZXguaHRtbCBmaWxlKSB0byBmYWlsLiAgW0RhdmlkIFJvYmluc29uXQoKICAqKSBEb2Vzbid0IGxvZyBhbiBlcnJvciB3aGVuIHRoZSByZXF1ZXN0ZWQgVVJJIHJlcXVpcmVzCiAgICAgYXV0aGVudGljYXRpb24sIGJ1dCBubyBhdXRoIGhlYWRlciBsaW5lIHdhcyBzdXBwbGllZCBieSB0aGUKICAgICBjbGllbnQ7IHRoaXMgaXMgYSBub3JtYWwgY29uZGl0aW9uICh0aGUgY2xpZW50IGRvZXNuJ3Qgbm8gYXV0aCBpcwogICAgIG5lZWRlZCBoZXJlIHlldCkuICBbUm9iZXJ0IFRoYXVdCgogICopIEJlaGF2ZXMgbW9yZSBzYW5lbHkgd2hlbiB0aGUgbmFtZSBzZXJ2ZXIgbG9zZXMgaXRzIG1pbmQgW1NlYW4gV2VsY2hdCgogICopIFJGQzkzMSBjb2RlIGNvbXBpbGVzIGNsZWFubHkgb24gb2xkIEJTREkgcmVsZWFzZXMgW1JhbmR5IFRlcmJ1c2hdCgogICopIFJGQzkzMSBjb2RlIG5vIGxvbmdlciBwYXNzZXMgb3V0IG5hbWUgb2YgcHJpb3IgY2xpZW50cyBvbiBjdXJyZW50CiAgICAgcmVxdWVzdHMgaWYgdGhlIGN1cnJlbnQgcmVxdWVzdCBjYW1lIGZyb20gYSBzZXJ2ZXIgdGhhdCBkb2Vzbid0CiAgICAgZG8gUkZDOTMxLiAgW0RhdmlkIFJvYmluc29uXQoKICAqKSBDb25maWd1cmF0aW9uIHNjcmlwdCBhY2NlcHRzICJNb2R1bGUiIGxpbmVzIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZS4KICAgICBbUm9iZXJ0IFRoYXVdCgogICopIENsZWFuZWQgdXAgY29tcGlsZXIgd2FybmluZyBmcm9tIG1vZF9hY2Nlc3MuYyBbUm9iZXJ0IFRoYXVdCgogICopIENsZWFuZWQgdXAgY29tbWVudHMgaW4gbW9kX2NnaS5jIFtSb2JlcnQgVGhhdV0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQgQXVnIDE5OTUKCiAgKikgV2lsZGNhcmQgPERpcmVjdG9yeT4gc3BlY2lmaWNhdGlvbnMgd29yay4gIFtSb2JlcnQgVGhhdV0KCiAgKikgRG9lc24ndCBsb29wIGZvciBidWdneSBDR0kgb24gU29sYXJpcyBbQ2xpZmYgU2tvbG5pY2tdCgogICopIFN5bWxpbmsgY2hlY2tzIChGb2xsb3dTeW1MaW5rcyBvZmYsIG9yIFN5bUxpbmtJZk93bmVyTWF0Y2gpIGFsd2F5cyBjaGVjawogICAgIHRoZSBmaWxlIGJlaW5nIHJlcXVlc3RlZCBpdHNlbGYsIGluIGFkZGl0aW9uIHRvIHRoZSBkaXJlY3RvcmllcyBsZWFkaW5nCiAgICAgdXAgdG8gaXQuIFtSb2JlcnQgVGhhdV0KCiAgKikgTG9ncyBhY2Nlc3MgZmFpbHVyZXMgZHVlIHRvIHN5bWxpbmsgY2hlY2tzIG9yIGludmFsaWQgY2xpZW50IGFkZHJlc3MKICAgICBpbiB0aGUgZXJyb3IgbG9nIFtSb3kgRmllbGRpbmcsIFJvYmVydCBUaGF1XQoKICAqKSBTeW1saW5rIGNoZWNrcyBkZWFsIGNvcnJlY3RseSB3aXRoIHN5c3RlbXMgd2hlcmUgbHN0YXQgb2YKICAgICAiL3BhdGgvdG8vc29tZS9saW5rLyIgZm9sbG93cyB0aGUgbGluay4gIFtUaGF1LCBGaWVsZGluZ10KCiAgKikgRG9lc24ndCByZXNldCBEaXJlY3RvcnlJbmRleCB0byAnaW5kZXguaHRtbCcgd2hlbgogICAgIG90aGVyIGRpcmVjdG9yeSBvcHRpb25zIGFyZSBzZXQgaW4gYSAuaHRhY2Nlc3MgZmlsZS4gIFtSb2JlcnQgVGhhdV0KCiAgKikgQ2xhcmlmaWVkIGluaXQgY29kZSBhbmQgbnVrZWQgYm9ndXMgd2FybmluZyBpbiBtb2RfYWNjZXNzLmMKICAgICBbRmxvcmVudCBHdWlsbGF1bWVdCgogICopIENvcnJlY3RlZCBzZXZlcmFsIGRpcmVjdGl2ZXMgaW4gc2FtcGxlIHNybS5jb25mCiAgICAgLS0tIGluY2x1ZGVzIGNvcnJlY3Rpb25zIHRvIGRpcmVjdG9yeSBpbmRleGluZyBpY29uLXJlbGF0ZWQgZGlyZWN0aXZlcwogICAgICh1c2luZyB1bmtub3duLmdpZiByYXRoZXIgdGhhbiB1bmtub3duLnhibSBhcyB0aGUgRGVmYXVsdEljb24sIGRvaW5nCiAgICAgaWNvbnMgZm9yIGVuY29kaW5ncyByaWdodCwgYW5kIHR1cm5pbmcgb24gQWRkRW5jb2RpbmcgYnkgZGVmYXVsdCkuCiAgICAgW1JveSBGaWVsZGluZ10KCiAgKikgQ29ycmVjdGVkIGRlc2NyaXB0aW9ucyBvZiBhcmdzIHRvIEFkZEljb24gYW5kIEFkZEFsdCBpbiBjb21tYW5kIHRhYmxlCiAgICAgW0phbWVzIENsb29zXQoKICAqKSBJTlNUQUxMICYgUkVBRE1FIG1lbnRpb24gImNvbnRyaWJ1dGVkIG1vZHVsZXMiIGRpcmVjdG9yeSBbQnJpYW4KICAgICBCZWhsZW5kb3JmXQoKICAqKSBGaXhlZCBFbmdsaXNoIGluIHRoZSBsaWNlbnNlIGxhbmd1YWdlLi4uICAiZm9yIGZvciIgLS0+ICJmb3IiLgogICAgIFtSb3kgRmllbGRpbmddCgogICopIEZpeGVkIFNjcmlwdEFsaWFzL0FsaWFzIGludGVyYWN0aW9uIGJ5IG1vdmluZyBTY3JpcHRBbGlhcyBoYW5kbGluZyB0bwogICAgIG1vZF9hbGlhcy5jLCBtZXJnaW5nIGl0IGFsbW9zdCBjb21wbGV0ZWx5IHdpdGggaGFuZGxpbmcgb2YgQWxpYXMsIGFuZAogICAgIGFkZGluZyBhICdub3RlcycgZmllbGQgdG8gdGhlIHJlcXVlc3RfcmVjIHdoaWNoIGFsbG93cyB0aGUgQ0dJIG1vZHVsZQogICAgIHRvIGRpc2NvdmVyIHdoZXRoZXIgdGhlIEFsaWFzIG1vZHVsZSBoYXMgcHV0IHRoaXMgcmVxdWVzdCB0aHJvdWdoCiAgICAgU2NyaXB0QWxpYXMgKHdoaWNoIGl0IG5lZWRzIHRvIGtub3cgZm9yIGJhY2stY29tcGF0aWJpbGl0eSwgYXMgdGhlIG9sZAogICAgIE5DU0EgY29kZSBkaWQgbm90IGNoZWNrIE9wdGlvbnMgRXhlY0NHSSBpbiBTY3JpcHRBbGlhcyBkaXJlY3RvcmllcykuCiAgICAgW1JvYmVydCBUaGF1XQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCBBdWcgMTk5NQoKICAqKSBBbGxvd092ZXJyaWRlIGFwcGxpZXMgdG8gdGhlIG5hbWVkIGRpcmVjdG9yeSwgYW5kIG5vdCBqdXN0CiAgICAgc3ViZGlyZWN0b3JpZXMuICBbRGF2aWQgUm9iaW5zb25dCgogICopIERvIGxvY2tpbmcgZm9yIGFjY2VwdCgpIGV4Y2x1c2lvbiAob24gc3lzdGVtcyB0aGF0IG5lZWQgaXQpCiAgICAgdXNpbmcgYSBzcGVjaWFsIGZpbGUgY3JlYXRlZCBmb3IgdGhlIHB1cnBvc2UgaW4gL3Vzci90bXAsIGFuZAogICAgIG5vdCB0aGUgZXJyb3IgbG9nOyB1c2luZyB0aGUgZXJyb3IgbG9nIGNhdXNlcyByZWFsIHByb2JsZW1zCiAgICAgaWYgaXQncyBORlMtbW91bnRlZDsgdGhpcyBpcyBrbm93biB0byBiZSB0aGUgY2F1c2Ugb2YgYSB3aG9sZQogICAgIGxvdCBvZiAic2VydmVyIGhhbmciIHByb2JsZW1zIHdpdGggU29sYXJpcy4gIFtEYXZpZCBSb2JpbnNvbjsKICAgICB0aGFua3MgdG8gTWVydGVuIFNjaHVtYW5uIGZvciBoZWxwIGRpYWdub3NpbmcgdGhlIHByb2JsZW1dLgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiBBdWcgMTk5NQoKICAqKSBDb21waWxlcyB3aXRoIC1ETUFYSU1VTV9ETlMgLS0tLSBvb29wcyEgW0hlbnJpayBNb3J0ZW5zZW5dCgogICopIE5lc3RlZCBpbmNsdWRlcyBzZWUgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9mIHRoZSBpbmNsdWRpbmcgZG9jdW1lbnQsCiAgICAgZm9yIE5DU0EgYnVnLWNvbXBhdGliaWxpdHkgKHNvbWUgc2l0ZXMgaGF2ZSBzdGFuZGFyZCBmb290ZXIgaW5jbHVkZXMKICAgICB3aGljaCB0cnkgdG8gcHJpbnQgb3V0IHRoZSBsYXN0LW1vZGlmaWVkIGRhdGUpLiAgW0VyaWMgSGFnYmVyZy9Sb2JlcnQKICAgICBUaGF1XQoKICAqKSA8IS0tZXhlYyBjZ2k9Ii9zb21lL3VyaS9oZXJlIi0tPiBhbHdheXMgdHJlYXRzIHRoZSBpdGVtIG5hbWVkIGJ5IHRoZQogICAgIFVSSSBhcyBhIENHSSBzY3JpcHQsIGV2ZW4gaWYgaXQgd291bGQgaGF2ZSBiZWVuIHRyZWF0ZWQgYXMgc29tZXRoaW5nCiAgICAgZWxzZSBpZiByZXF1ZXN0ZWQgZGlyZWN0bHksIGZvciBOQ1NBIGJhY2stY29tcGF0aWJpbGl0eS4gIChOb3RlIHRoYXQKICAgICB0aGlzIG1lYW5zIHRoYXQgcGVvcGxlIHdobyBrbm93IHRoZSBuYW1lIG9mIHRoZSBzY3JpcHQgY2FuIHNlZSB0aGUKICAgICBjb2RlIGp1c3QgYnkgYXNraW5nIGZvciBpdCkuICBbUm9iZXJ0IFRoYXVdCgogICopIE5ldyB2ZXJzaW9uIG9mIGRibW1hbmFnZSBzY3JpcHQgaW5jbHVkZWQgaW4gc3VwcG9ydCBkaXJlY3RvcnkgYXMKICAgICBkYm1tYW5hZ2UubmV3LgoKICAqKSBDaGVjayBpZiBzY29yZWJvYXJkIGZpbGUgY291bGRuJ3QgYmUgb3BlbmVkLCBhbmQgc2F5IHNvLCByYXRoZXIKICAgICB0aGVuIGdvaW5nIGluc2FuZSBbRGF2aWQgUm9iaW5zb25dCgogICopIFBPU1QgdG8gQ0dJIHdvcmtzIG9uIEEvVVggW0ppbSBKYWdpZWxza2ldCgogICopIEFkZEljb24gYW5kIEFkZEFsdCBjb21tYW5kcyB3b3JrIHByb3Blcmx5IFtSb2IgSGFydGlsbF0KCiAgKikgTkNTQSBzZXJ2ZXIgcHVzaCB3b3JrcyBwcm9wZXJseSAtLS0gdGhlIEFyZW5hIGJ1ZyBjb21wYXRpYmlsaXR5CiAgICAgd29ya2Fyb3VuZCwgd2hpY2ggYnJva2UgaXQsIGlzIGdvbmUgKHVzZSAtREFSRU5BX0JVR19XT1JLQVJPVU5ECiAgICAgaWYgeW91IHN0aWxsIHdhbnQgdGhlIHdvcmthcm91bmQpLiAgW1JvYiBIYXJ0aWxsXQoKICAqKSBJZiBjbGllbnQgZGlkbid0IHN1Ym1pdCBhbnkgQWNjZXB0LWVuY29kaW5ncywgaWdub3JlIGVuY29kaW5ncyBpbgogICAgIGNvbnRlbnQgbmVnb3RpYXRpb24uICAoTkIgdGhpcyB3aWxsIGFsbCBoYXZlIHRvIGJlIHJld29ya2VkIGFueXdheQogICAgIGZvciB0aGUgbmV3IEhUVFAgZHJhZnQpLiAgW0Zsb3JlbnQgR3VpbGxhdW1lXQoKICAqKSBEb24ndCBkdW1wIGNvcmUgd2hlbiB0cnlpbmcgdG8gbG9nIHRpbWVkLW91dCByZXF1ZXN0cyBbSmltIEphZ2llbHNraV0KCiAgKikgUmVhbGx5IGhvbm9yIENhY2hlTmVnb3RpYXRlZERvY3MgW0Zsb3JlbnQgR3VpbGxhdW1lXQoKICAqKSBHaXZlIFJlZGlyZWN0IHByaW9yaXR5IG92ZXIgQWxpYXMsIGZvciBOQ1NBIGJ1ZyBjb21wYXRpYmlsaXR5CiAgICAgW0RhdmlkIFJvYmluc29uXQoKICAqKSBDb3JyZWN0bHkgc2V0IFBBVEhfVFJBTlNMQVRFRCBpbiBhbGwgY2FzZXMgZnJvbSA8IS0tI2V4ZWMgY21kPSIiLS0+LAogICAgIHBhcmFsbGVsaW5nIGVhcmxpZXIgYnVnIGZpeCBmb3IgQ0dJIFtEYXZpZCBSb2JpbnNvbl0KCiAgKikgSWYgREJNIGF1dGggaXMgaW1wcm9wZXJseSBjb25maWd1cmVkLCByZXBvcnQgYSBzZXJ2ZXIgZXJyb3IgYW5kIGRvbid0CiAgICAgZHVtcCBjb3JlLgoKICAqKSBEZWxldGVkIEZDTlRMX1NFUklBTElaRURfQUNDRVBUUyBmcm9tIGNvbmYuaCBlbnRyeSBmb3IgQS9VWDsKICAgICBpdCBzZWVtcyB0byB3b3JrIHdlbGwgZW5vdWdoIHdpdGhvdXQgaXQgKGV2ZW4gaW4gYSAxMCBoaXRzL3NlYwogICAgIHdvcmtvdXQpLCBhbmQgdGhlIG92ZXJoZWFkIGZvciB0aGUgbG9ja2luZyB1bmRlciBBL1VYIGlzCiAgICAgYWxhcm1pbmdseSBoaWdoICh0aG91Z2ggaXQgaXMgdmVyeSBsb3cgb24gb3RoZXIgc3lzdGVtcykuCiAgICAgW0VyaWMgSGFnYmVyZywgSmltIEphZ2llbHNraV0KCiAgKikgRml4ZWQgcG9ydGFiaWxpdHkgcHJvYmxlbXMgd2l0aCBtb2RfY29va2llcy5jIFtDbGlmZiBTa29sbmlja10KCiAgKikgRnVydGhlciBkZS1CZXJrbGl6ZSBtb2RfY29va2llcy5jOyBjaGFuZ2UgdGhlIGJvZ3VzICNpbmNsdWRlLiAgW0JyaWFuCiAgICAgQmVobGVuZG9yZi9FcmljIEhhZ2JlcmddCgogICopIE1vcmUgaW1wcm92ZW1lbnRzIHRvIGRlZmF1bHQgQ29uZmlndXJhdGlvbiBmb3IgQS9VWCBbSmltIEphZ2llbHNraV0KCiAgKikgQ29tcGlsZXMgY2xlYW4gb24gTkVYVCBbUm9iIEhhcnRpbGxdCgogICopIENvbXBpbGVzIGNsZWFuIG9uIFNHSSBbUm9iZXJ0IFRoYXVdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDAuOC44ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA4IEF1ZyAxOTk1CgogICopIFN1bk9TIGxpYnJhcnkgcHJvdG90eXBlcyBub3cgbmV2ZXIgaW5jbHVkZWQgdW5sZXNzIGV4cGxpY2l0bHkKICAgICByZXF1ZXN0ZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gKHZpYSAtRFNVTk9TX0xJQl9QUk9UT1RZUEVTKTsKICAgICBwZW9wbGUgdXNpbmcgR05VIGxpYmMgb24gU3VuT1MgYXJlIHNjcmV3ZWQgYnkgcHJvdG90eXBlcyBmb3IgdGhlCiAgICAgc3RhbmRhcmQgbGlicmFyeS4KCiAgICAgKFRob3NlIHdobyB3aXNoIHRvIGNvbXBpbGUgY2xlYW4gd2l0aCBnY2MgLVdhbGwgb24gYSBzdGFuZGFyZAogICAgIFN1bk9TIHNldHVwIG5lZWQgdGhlIHByb3RvdHlwZXMsIGFuZCBtYXkgb2J0YWluIHRoZW0gdXNpbmcKICAgICAtRFNVTk9TX0xJQl9QUk9UT1RZUEVTLiAgVGhvc2Ugd2lzaGluZyB0byB1c2UgLVdhbGwgb24gYSBzeXN0ZW0KICAgICB3aXRoIG5vbnN0YW5kYXJkIGxpYnJhcmllcyBhcmUgcHJlc3VtYWJseSBjb21wZXRlbnQgdG8gbWFrZSB0aGVpcgogICAgIG93biBhcnJhbmdlbWVudHMpLgoKICAqKSBTdHJpcHMgdHJhaWxpbmcgJy8nIGNoYXJhY3RlcnMgb2ZmIGJvdGggYXJncyB0byB0aGUgQWxpYXMgY29tbWFuZCwKICAgICB0byBtYWtlICdBbGlhcyAvZm9vLyAvYmFyLycgd29yay4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDMgQXVnIDE5OTUKCiAgKikgRG9uJ3QgaGFuZyB3aGVuIHJlc3RhcnRpbmcgd2l0aCBhIGNoaWxkIGZyb20gJ1RyYW5zZmVyTG9nICJ8Li4uIicgcnVubmluZwogICAgIFtyZXBvcnRlZCBieSBEYXZpZCBSb2JpbnNvbl0KCiAgKikgQ29tcGlsZXMgY2xlYW4gb24gT1NGLzEgW0RhdmlkIFJvYmluc29uXQoKICAqKSBBZGRlZCBzb21lIG9mIHRoZSBtb3JlIHJlY2VudCBzaWduaWZpY2FudCBjaGFuZ2VzIChBZGRMYW5ndWFnZSBzdHVmZiwKICAgICBleHBlcmltZW50YWwgTG9nRm9ybWF0IHN1cHBvcnQpIHRvIENIQU5HRVMgZmlsZSBpbiBkaXN0cmlidXRpb24gcm9vdAogICAgIGRpcmVjdG9yeQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMiBBdWcgMTk5NQoKICAqKSBEZWxldGVkIE5ldHNjYXBlIHJlbG9hZCB3b3JrYXJvdW5kIC0tLSBpdCdzIGluIHZpb2xhdGlvbiBvZiBIVFRQIHNwZWNzLgogICAgIChJZiB5b3UgYWN0dWFsbHkgd2FudGVkIGEgY29uZGl0aW9uYWwgR0VUIHdoaWNoIGJ5cGFzc2VkIHRoZSBjYWNoZSwgeW91CiAgICAgY291bGRuJ3QgZ2V0IGl0KS4gW1JlcG9ydGVkIGJ5IFJveSBGaWVsZGluZ10KCiAgKikgUHJvcGVybHkgdGVybWluYXRlIGhlYWRlcnMgb24gJzMwNCBOb3QgTW9kaWZpZWQnIHJlcGxpZXMgdG8gY29uZGl0aW9uYWwKICAgICBHRVRzIC0tLSBubyBicm93c2VyIHdlIGNhbiBmaW5kIGNhcmVzIG11Y2gsIGJ1dCB0aGUgQ0VSTiBwcm94eSBjaG9rZXMuCiAgICAgW1JlcG9ydGVkIGJ5IENsaWZmIFNrb2xuaWNrOyBmaXggZGlzY292ZXJlZCBpbmRlcGVuZGVudGx5IGJ5IFJvYiBIYXJ0aWxsXQoKICAqKSBodHRwZCAtdiBkb2Vzbid0IGNhbGwgaXRzZWxmICJTaGFtYmhhbGEiLiAgW1JlcG9ydGVkIGJ5IENodWNrIE11cmNrb10KCiAgKikgU3VuT1MgbGliLWZ1bmN0aW9uIHByb3RvdHlwZXMgaW4gY29uZi5oIGNvbmRpdGlvbmFsaXplZCBvbiBfX0dOVUNfXywKICAgICBub3QgX19TVU5QUk9fQyAodGhleSdyZSBuZWVkZWQgdG8gcXVpZXQgZ2NjIC1XYWxsLCBidXQgYWNjIGNob2tlcyBvbiAnZW0sCiAgICAgYW5kIG9sZGVyIHZlcnNpb25zIGRvbid0IHNldCB0aGUgX19TVU5QUk9fQyBwcmVwcm9jZXNzb3IgdmFyaWFibGUpLiAgT24KICAgICBhbGwgb3RoZXIgc3lzdGVtcywgdGhlc2UgYXJlIG5ldmVyIHVzZWQgYW55d2F5LiAgW1JlcG9ydGVkIGJ5IE1hcmsgQ294XS4KCiAgKikgU2NvcmVib2FyZCBmaWxlICgvdG1wL2h0c3RhdHVzLiopIG5vIGxvbmdlciBwdWJsaWNhbGx5IHdyaXRhYmxlLgoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMSBBdWcgMTk5NQoKICAqKSBBZGRlZCBsYXN0LW1pbnV0ZSBjb25maWd1cmFibGUgbG9nIGV4cGVyaW1lbnQsIGFzIG9wdGlvbmFsIG1vZHVsZQoKICAqKSBDb3JyZWN0bHkgc2V0IHItPmJ5dGVzX3NlbnQgZm9yIEhUVFAvMC45IHJlcXVlc3RzLCBzbyB0aGV5IGdldCBsb2dnZWQKICAgICBwcm9wZXJseS4gIChPbmUtbGluZSBmaXggdG8gaHR0cF9wcm90b2NvbC5jKS4KCiAgKikgV29yayBhcm91bmQgYm9ndXMgYmVoYXZpb3Igd2hlbiByZWxvYWRpbmcgZnJvbSBOZXRzY2FwZS4KICAgICBJdCdzIE5ldHNjYXBlJ3MgYnVnIC0tLSBmb3Igc29tZSByZWFzb24gdGhleSBleHBlY3QgYSByZXF1ZXN0IHdpdGgKICAgICBJZi1tb2RpZmllZC1zaW5jZTogdG8gbm90IGZ1bmN0aW9uIGFzIGEgY29uZGl0aW9uYWwgR0VUIGlmIGl0IGFsc28KICAgICBjb21lcyB3aXRoIFByYWdtYTogbm8tY2FjaGUsIHdoaWNoIGlzIHdheSBvdXQgb2YgbGluZSB3aXRoIHRoZSBIVFRQCiAgICAgc3BlYyAoYWNjb3JkaW5nIHRvIFJveSBGaWVsZGluZywgdGhlIHJlZGFjdG9yKS4KCiAgKikgQWRkZWQgcGFyYW1ldGVyIHRvIHNldCBtYXhpbXVtIG51bWJlciBvZiBzZXJ2ZXIgcHJvY2Vzc2VzLgoKICAqKSBBZGRlZCBwYXRjaGVzIHRvIG1ha2UgaXQgd29yayBvbiBBL1VYLiAgQS9VWCBpcyAqd2VpcmQqLiAgW0VyaWMgSGFnYmVyZywKICAgICBKaW0gSmFnaWVsc2tpXQoKICAqKSBJZGVudGl0eUNoZWNrIGJ1Z2ZpeCBbQ2h1Y2sgTXVyY2tvXS4KCiAgKikgQ29ycmVjdGVkIGNnaS1zcmMvTWFrZWZpbGUgZW50cnkgZm9yIG5ldyBpbWFnZW1hcCBzY3JpcHQuICBbQWxleGVpIEtvc3V0XQoKICAqKSBNb3JlIHNhbXBsZSBjb25maWcgZmlsZSBjb3JyZWN0aW9uczsgYWRkIGV4dGVuc2lvbiB0byBBZGRUeXBlIGZvcgogICAgICouYXNpcywgbW92ZSBBZGRUeXBlIGdlbmVyaWMgZGVzY3JpcHRpb24gdG8gaXRzIHByb3BlciBwbGFjZSwgYW5kCiAgICAgZml4IG1pc2NlbGxhbmVvdXMgdHlwb3MuIFsgQWxleGVpIEtvc3V0IF0KCiAgKikgRGVsZXRlZCB0aGUgKm90aGVyKiByZWZlcmVuY2UgdG8gdGhlIHJlZ2VudHMgZnJvbSB0aGUgQmVya2VsZXkKICAgICBsZWdhbCBkaXNjbGFpbWVyIChldmVyeXBsYWNlKS4KCiAgKikgTnVrZWQgU2hhbWJoYWxhIG5hbWUgZnJvbSBzcmMvUkVBRE1FOyBoYWQgYWxyZWFkeSBjbGVhbmVkIGl0IG91dAogICAgIG9mIGV2ZXJ5d2hlcmUgZWxzZS4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjQKCiAgKikgQ2hhbmdlcyB0byBzZXJ2ZXItcG9vbCBtYW5hZ2VtZW50IHBhcm1zIC0tLSByZW5hbWVkIGN1cnJlbnQKICAgICBTdGFydFNlcnZlcnMgdG8gTWluU3BhcmVTZXJ2ZXJzLCBjcmVhdGVkIHNlcGFyYXRlIFN0YXJ0U2VydmVycwogICAgIHBhcmFtZXRlciB3aGljaCBtZWFucyB3aGF0IGl0IHNheXMsIGFuZCByZW5hbWVkIE1heFNlcnZlcnMgdG8KICAgICBNYXhTcGFyZVNlcnZlcnMgKHRob3VnaCB0aGUgb2xkIG5hbWUgc3RpbGwgd29ya3MsIGZvciBOQ1NBIDEuNAogICAgIGJhY2stY29tcGF0aWJpbGl0eSkuICBUaGUgb2xkIG5hbWVzIHdlcmUgZ2VuZXJhbGx5IHJlZ2FyZGVkIGFzCiAgICAgdG9vIGNvbmZ1c2luZy4gIEFsc28gYWx0ZXJlZCAiZG9jcyIgaW4gc2FtcGxlIGNvbmZpZyBmaWxlcy4KCiAgKikgTW9yZSBpbXByb3ZlbWVudHMgdG8gZGVmYXVsdCBjb25maWcgZmlsZXMgLS0tCiAgICAgc2FtcGxlIGRpcmVjdGl2ZXMgKGNvbW1lbnRlZCBvdXQpIGZvciBYQml0SGFjaywgQmluZEFkZHJlc3MsCiAgICAgQ2FjaGVOZWdvdGlhdGVkRG9jcywgVmlydHVhbEhvc3Q7IGRlY2VudCBzZXQgb2YgQWRkTGFuZ3VhZ2UKICAgICBkZWZhdWx0cywgQWRkVHlwZXMgZm9yIHNlbmQtYXMtaXMgYW5kIGltYWdlbWFwIG1hZ2ljIHR5cGVzLCBhbmQKICAgICBpbXByb3ZlbWVudHMgdG8gc2FtcGxlcyBmb3IgRGlyZWN0b3J5SW5kZXggW0FsZXhlaSBLb3N1dF0KCiAgKikgWWV0IG1vcmUgaW1wcm92ZW1lbnRzIHRvIGRlZmF1bHQgY29uZmlnIGZpbGVzIC0tLSBjaGFuZ2VzIHRvCiAgICAgQWxleGVpJ3Mgc2FtcGxlIEFkZExhbmd1YWdlIGRpcmVjdGl2ZXMsIGFuZCBzYW1wbGUgTGFuZ3VhZ2VQcmlvcml0eQogICAgIFsgRmxvcmVudCBHdWlsbGF1bWUgXQoKICAqKSBTZXQgY29uZmlnIGZpbGUgbG9jYXRpb25zIHByb3Blcmx5IGlmIG5vdCBzZXQgaW4gaHR0cGQuY29uZgogICAgIFsgRGF2aWQgUm9iaW5zb24gXQoKICAqKSBEb24ndCBlc2NhcGUgVVJJcyBpbiBpbnRlcm5hbCByZWRpcmVjdHMgbXVsdGlwbGUgdGltZXM7IGRvbid0CiAgICAgZG8gdGhhdCB3aGVuIHRyYW5zbGF0aW5nIFBBVEhfSU5GTyB0byBQQVRIX1RSQU5TTEFURUQgZWl0aGVyLgogICAgIFsgRGF2aWQgUm9iaW5zb24gXQoKICAqKSBDb3JyZWN0ZWQgc3BlbGxpbmcgb2YgIlJlcXVpcmVkIiBpbiA0MDEgZXJyb3IgcmVwb3J0cyBbQW5kcmV3IFdpbHNvbl0KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjMKCiAgKikgRWRpdGVkIGRpc3RyaWJ1dGlvbiBSRUFETUUgdG8gKmJyaWVmbHkqIHN1bW1hcml6ZSBpbnN0YWxsYXRpb24KICAgICBwcm9jZWR1cmVzLCBhbmQgZ2l2ZSBhIHBvaW50ZXIgdG8gdGhlIElOU1RBTEwgZmlsZSBpbiB0aGUgc3JjLwogICAgIGRpcmVjdG9yeS4KCiAgKikgVXBncmFkZWQgaW1hZ2VtYXAgc2NyaXB0IGluIGNnaS1iaW4gdG8gMS44IHZlcnNpb24gZnJvbSBtb3JlCiAgICAgcmVjZW50IE5DU0EgZGlzdHJpYnV0aW9ucy4KCiAgKikgQnVnIGZpeCB0byBwcmV2aW91cyBidWcgZml4IC0tLSBpZiAuaHRhY2Nlc3MgZmlsZSBhbmQgPERpcmVjdG9yeT4KICAgICBleGlzdCBmb3IgdGhlIHNhbWUgZGlyZWN0b3J5LCB1c2UgYm90aCBhbmQgZG9uJ3Qgc2VnZmF1bHQuICBbUmVwb3J0ZWQKICAgICBieSBEYXZpZCBSb2JpbnNvbl0KCiAgKikgUHJvcGVyIG1ha2VmaWxlIGRlcGVuZGVuY2llcyBbRGF2aWQgUm9iaW5zb25dCgogICopIE5vdGUgKHJlKXN0YXJ0cyBpbiBlcnJvciBsb2cgLS0tIHJlcG9ydGVkIGJ5IFJvYiBIYXJ0aWxsLgoKICAqKSBPbmx5IGNhbGwgbm8yc2xhc2goKSBhZnRlciBnZXRfcGF0aF9pbmZvKCkgaGFzIGJlZW4gZG9uZSwgdG8KICAgICBwcmVzZXJ2ZSBtdWx0aXBsZSBzbGFzaGVzIGluIHRoZSBQQVRIX0lORk8gW05DU0EgY29tcGF0aWJpbGl0eSwKICAgICByZXBvcnRlZCBieSBBbmRyZXcgV2lsc29uLCB0aG91Z2ggdGhpcyBvbmUgaXMgcHJvYmFibHkgYSByZWFsIGJ1Z10KCiAgKikgRml4ZWQgbW9kX2ltYXAuYyAtLS0gcmVsYXRpdmUgcGF0aHMgd2l0aCBiYXNlX3VyaSByZWZlcmVyIGRvbid0CiAgICAgZHVtcCBjb3JlIHdoZW4gUmVmZXJlciBpcyBub3Qgc3VwcGxpZWQuIFtSYW5keSBUZXJidXNoXQoKICAqKSBMaWdodGx5IGVkaXRlZCBzYW1wbGUgY29uZmlnIGZpbGVzIHRvIHJlZmVyIHBlb3BsZSB0byBvdXIgZG9jdW1lbnRhdGlvbgogICAgIGluc3RlYWQgb2YgTkNTQSdzLCBhbmQgdG8gbGlzdCBSb2IgTWNDb29sIGFzICpvcmlnaW5hbCogYXV0aG9yIChhbHNvCiAgICAgZGVsZXRlZCBoaXMgb2xkLCBhbmQgbm8gZG91YnQgbm9uLWZ1bmN0aW9uYWwgZW1haWwgYWRkcmVzcykuICBXb3VsZCBiZQogICAgIG5pY2UgdG8gaGF2ZSBleGFtcGxlcyBvZiBuZXcgZmVhdHVyZXMuLi4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC44LjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkgSnVsIDE5OTUKCiAgKikgQWRkZWQgQWRkTGFudWFnZSBjb2RlIFtGbG9yZW50IEd1aWxsYXVtZV0KCiAgKikgRG9uJ3Qgc2F5ICJhY2Nlc3MgZm9yYmlkZGVuIiB3aGVuIGEgQ0dJIHNjcmlwdCBpcyBub3QgZm91bmQuICBbTWFyayBDb3hdCgogICopIEFsbCBzb3J0cyBvZiBwcm9ibGVtcyB3aGVuIE11bHRpVmlld3MgZmluZHMgYSBkaXJlY3RvcnkuICBJdCB3b3VsZAogICAgIGJlIG5pY2UgaWYgbW9kX2Rpci5jIHdhcyByb2J1c3QgZW5vdWdoIHRvIGhhbmRsZSB0aGF0LCBidXQgZm9yIG5vdywKICAgICBqdXN0IHB1bnQuICBbcmVwb3J0ZWQgYnkgQnJpYW4gQmVobGVuZG9yZl0KCiAgKikgV2FpdCBmb3IgYWxsIGNoaWxkcmVuIG9uIHJlc3RhcnQsIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBvbGQgc29ja2V0CiAgICAgaXMgZ29uZSBhbmQgd2UgY2FuIHJlb3BlbiBpdC4gIFtyZXBvcnRlZCBieSBSYW5keSBUZXJidXNoXQoKICAqKSBJbWFnZW1hcCBtb2R1bGUgaXMgZW5hYmxlZCBpbiBkZWZhdWx0IENvbmZpZ3VyYXRpb24KCiAgKikgUmVmZXJlckxvZyBhbmQgVXNlckFnZW50TG9nIG1vZHVsZXMgcHJvcGVybHkgZGVmYXVsdCB0aGUgbG9nZmlsZQogICAgIFtSYW5keSBUZXJidXNoXQoKICAqKSBNYXJrIENveCdzIG1vZF9jb29raWVzIGFkZGVkIHRvIHRoZSBkaXN0cmlidXRpb24gYXMgYW4gb3B0aW9uYWwKICAgICBtb2R1bGUgKGNvbW1lbnRlZCBvdXQgaW4gdGhlIGRlZmF1bHQgQ29uZmlndXJhdGlvbiwgYW5kIG5vdGVkIGFzCiAgICAgYW4gZXhwZXJpbWVudCwgYWxvbmcgd2l0aCBtb2RfZGxkKS4gW01hcmsgQ294XQoKICAqKSBDb21waWxlcyBvbiBVTFRSSVggKGEgY29udGludWluZyBiYXR0bGUuLi4pLiBbUm9iZXJ0IFRoYXVdCgogICopIEZpeGVkIG5hc3R5IGJ1ZyBpbiBTSUdURVJNIGhhbmRsaW5nIFtyZXBvcnRlZCBieSBSYW5keSBUZXJidXNoXQoKICAqKSBDaGFuZ2VkICJTaGFtYmhhbGEiIHRvICJBcGFjaGUiIGluIEFQSSBkb2NzLiBbUm9iZXJ0IFRoYXVdCgogICopIEFkZGVkIG5ldywgdG9vdGhpZXIgbGVnYWwgZGlzY2xhaW1lci4gW1JvYmVydCBUaGF1OyBjb3BpZWQgZnJvbSBCU0QKICAgICBsaWNlbnNlXQoKQ2hhbmdlcyB3aXRoIEFwYWNoZSAwLjguMQoKICAqKSBOZXcgaW1hZ2VtYXAgbW9kdWxlIFtSYW5keSBUZXJidXNoXQoKICAqKSBSZXBsYWNlbWVudCByZWZlcmVyIGxvZyBtb2R1bGUgd2l0aCBOQ1NBLWNvbXBhdGlibGUgUmVmZXJlcklnbm9yZQogICAgIFtNYXR0aGV3IEdyYXkgYWdhaW5dCgogICopIERvbid0IG11bmcgZGlyZWN0b3J5IGxpc3RpbmdzIHdpdGggdmVyeSBsb25nIGZpbGVuYW1lcy4KICAgICBbRmxvcmVudCBHdWlsbGF1bWVdCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDAuOC4wIChuZWUgU2hhbWJoYWxhIDAuNi4yKSAgICAgICAgICAgICAgICAgIDE2IEp1bCAxOTk1CgogICopIE5ldyBjb25maWcgc2NyaXB0LiAgU2VlIElOU1RBTEwgZm9yIGluZm8uICBbUm9iZXJ0IFRoYXVdCgogICopIFNjb3JlYm9hcmQgbWVjaGFuaXNtIGZvciByZWd1bGF0aW5nIHRoZSBudW1iZXIgb2YgZXh0YW50IHNlcnZlcgogICAgIHByb2Nlc3Nlcy4gIE1heFNlcnZlcnMgYW5kIFN0YXJ0U2VydmVycyBkZWZhdWx0cyBhcmUgdGhlIHNhbWUgYXMKICAgICBmb3IgTkNTQSwgYnV0IHRoZSBtZWFuaW5ncyBhcmUgc2xpZ2h0bHkgZGlmZmVyZW50LiAgKEFjdHVhbGx5LAogICAgIEkgc2hvdWxkIHByb2JhYmx5IGxvd2VyIHRoZSBNYXhTZXJ2ZXJzIGRlZmF1bHQgdG8gMTApLgoKICAgICBCZWZvcmUgYXNraW5nIGZvciBhIG5ldyBjb25uZWN0aW9uLCBlYWNoIHNlcnZlciBwcm9jZXNzIGNoZWNrcwogICAgIHRoZSBudW1iZXIgb2Ygb3RoZXIgc2VydmVycyB3aGljaCBhcmUgYWxzbyB3YWl0aW5nIGZvciBhCiAgICAgY29ubmVjdGlvbi4gIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gTWF4U2VydmVycywgaXQgcXVpZXRseSBkaWVzCiAgICAgb2ZmLiAgQ29udmVyc2VseSwgZXZlcnkgc2Vjb25kLCB0aGUgcm9vdCwgb3IgY2FyZXRha2VyLCBwcm9jZXNzCiAgICAgbG9va3MgdG8gc2VlIGhvdyBtYW55IHNlcnZlcnMgYXJlIHdhaXRpbmcgZm9yIGEgbmV3IGNvbm5lY3Rpb247CiAgICAgaWYgdGhlcmUgYXJlIGZld2VyIHRoYW4gU3RhcnRTZXJ2ZXJzLCBpdCBzdGFydHMgYSBuZXcgb25lLiAgVGhpcwogICAgIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgbnVtYmVyIG9mIHNlcnZlciBwcm9jZXNzZXMgYWxyZWFkeSBleHRhbnQuCiAgICAgVGhlIGFjY291bnRpbmcgaXMgYXJyYW5nZWQgdGhyb3VnaCBhICJzY29yZWJvYXJkIiBmaWxlLCBuYW1lZAogICAgIC90bXAvaHRzdGF0dXMuKiwgb24gd2hpY2ggZWFjaCBwcm9jZXNzIGhhcyBhbiBpbmRlcGVuZGVudCBmaWxlCiAgICAgZGVzY3JpcHRvciAodGhleSBuZWVkIHRvIHNlZWsgd2l0aG91dCBpbnRlcmZlcmVuY2UpLgoKICAgICBUaGUgZW5kIGVmZmVjdCBpcyB0aGF0IE1heFNlcnZlcnMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mCiAgICAgc2VydmVycyBvbiBhbiAqaW5hY3RpdmUqIHNlcnZlciBtYWNoaW5lLCBidXQgbW9yZSB3aWxsIGJlIGZvcmtlZAogICAgIG9mZiB0byBoYW5kbGUgdW51c3VhbGx5IGhlYXZ5IGxvYWRzIChvciB1bnVzdWFsbHkgc2xvdyBjbGllbnRzKTsKICAgICB0aGVzZSB3aWxsIGRpZSBvZmYgd2hlbiB0aGV5IGFyZSBubyBsb25nZXIgbmVlZGVkIC0tLSB3aXRob3V0CiAgICAgcmV2ZXJ0aW5nIHRvIHRoZSBvdmVyaGVhZCBvZiBmdWxsIGZvcmtpbmcgb3BlcmF0aW9uLiAgVGhlcmUgaXMgYQogICAgIGhhcmQgbWF4aW11bSBvZiAxNTAgc2VydmVyIHByb2Nlc3NlcyBjb21waWxlZCBpbiwgbGFyZ2VseSB0bwogICAgIGF2b2lkIGZvcmtpbmcgb3V0IG9mIGNvbnRyb2wgYW5kIGRyYWdnaW5nIHRoZSBtYWNoaW5lIGRvd24uCiAgICAgKFRoaXMgaXMgYXJndWFibHkgdG9vIGhpZ2gpLgoKICAgICBJbiBteSBzZXJ2ZXIgZW5kdXJhbmNlIHRlc3RzLCB0aGlzIG1lY2hhbmlzbSBkaWQgbm90IGFwcGVhciB0bwogICAgIGltcG9zZSBhbnkgc2lnbmlmaWNhbnQgb3ZlcmhlYWQsIGV2ZW4gYWZ0ZXIgSSBmb3JjZWQgaXQgdG8gcHV0IHRoZQogICAgIHNjb3JlYm9hcmQgZmlsZSBvbiBhIG5vcm1hbCBmaWxlc3lzdGVtICh3aGljaCBtaWdodCBoYXZlIG1vcmUKICAgICBvdmVyaGVhZCB0aGFuIHRtcGZzKS4gIFtSb2JlcnQgVGhhdV0KCiAgKikgU2V0IEhUVFBfRk9PIHZhcmlhYmxlcyBmb3IgU1NJIDwhLS0jZXhlYyBjbWQtLT5zLCBub3QganVzdCBDR0kgc2NyaXB0cy4KICAgICBbQ2xpZmYgU2tvbG5pY2tdCgogICopIFJlYWQgLmh0YWNjZXNzIGZpbGVzIGV2ZW4gaW4gZGlyZWN0b3J5IHdpdGggPERpcmVjdG9yeT4gc2VjdGlvbi4KICAgICAoRm9ybWVyIGluY29tcGF0aWJpbGl0eSBub3RlZCBvbiBtYWlsaW5nIGxpc3QsIG5vdyBmaXhlZCkuIFtSb2JlcnQKICAgICBUaGF1XQoKICAqKSAiSEVBRCAvIiBnaXZlcyB0aGUgY2xpZW50IGEgIkJhZCBSZXF1ZXN0IiBlcnJvciBtZXNzYWdlLCByYXRoZXIKICAgICB0aGFuIHRyeWluZyB0byBzZW5kIG5vIGJvZHkgKmFuZCogbm8gaGVhZGVycy4gIFtDbGlmZiBTa29sbmlja10uCgogICopIERvbid0IHByb2R1Y2UgZG91YmxlIGVycm9yIHJlcG9ydHMgZm9yIHNvbWUgdmVyeSBvYnNjdXJlIGNhc2VzCiAgICAgbWFpbmx5IGludm9sdmluZyBhdXRoIGNvbmZpZ3VyYXRpb24gKHRoZSAiYWxsIG1vZHVsZXMgZGVjbGluZSB0bwogICAgIGhhbmRsZSIgY2FzZSB3aGljaCBpcyBhIHN1cmUgc2lnbiBvZiBhIHNlcnZlciBidWcgaW4gbW9zdCBjYXNlcywKICAgICBidXQgYWxzbyBoYXBwZW5zIHdoZW4gYXV0aGVudGljYXRpb24gaXMgYmFkbHkgbWlzY29uZmlndXJlZCkuCiAgICAgW1JvYmVydCBUaGF1XQoKICAqKSBNb3ZlZCBGQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVCBkZWZpbmVzIGludG8gY29uZi5oICh0aGF0J3Mgd2hhdAogICAgIGl0J3MgKmZvciosIGFuZCB0aGlzIHNvcnQgb2YgdGhpbmcgcmVhbGx5IHNob3VsZG4ndCBiZSBjbHV0dGVyaW5nCiAgICAgdXAgdGhlIE1ha2VmaWxlKS4gW1JvYmVydCBUaGF1XQoKICAqKSBJbmNpZGVudGFsIGNvZGUgY2xlYW51cHMgaW4gaHR0cF9tYWluLmMgLS0tIHN0b3AgZHJhZ2dpbmcKICAgICBzYV9jbGllbnQgYXJvdW5kOyBqdXN0IGRlY2xhcmUgaXQgd2hlcmUgdXNlZC4gIFtSb2JlcnQgVGhhdV0KCiAgKikgQW5vdGhlciBhY2MtcmVsYXRlZCBmaXguICAoSXQgZG9lc24ndCBsaWtlIGNvbnN0IGNoYXIKICAgICBpbiBzb21lIHBsYWNlcy4uLikuIFtNYXJrIENveF0KCkNoYW5nZXMgd2l0aCBTaGFtYmhhbGEgMC42LjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMgSnVsIDE5OTUKCiAgKikgRml4ZWQgYXV0aF9uYW1lLXJlbGF0ZWQgdHlwb3MgaW4gaHR0cF9jb3JlLmMgW0JyaWFuIEJlaGxlbmRvcmZdCiAgICAgQWxzbywgZml4ZWQgYXV0aCB0eXBvIGluIGh0dHBfcHJvdG9jb2wuYyB1bm1hc2tlZCBieSB0aGlzIGZpeC4KCiAgKikgQ29tcGlsZXMgY2xlYW4gd2l0aCBhY2Mgb24gU3VuT1MgW1BhdWwgU3V0dG9uXQoKICAqKSBSZW9yZGVyZWQgbW9kdWxlcyBpbiBtb2R1bGVzLmMgc28gdGhhdCBSZWRpcmVjdCB0YWtlcyBwcmlvcml0eQogICAgIG92ZXIgU2NyaXB0QWxpYXMsIGZvciBOQ1NBIGJ1Zy1jb21wYXRpYmlsaXR5IFtSb2IgSGFydGlsbF0gLS0tCiAgICAgYmVsaWV2ZSBpdCBvciBub3QsIGhlIGhhcyBhbiBhY3R1YWwgc2l0ZSB3aXRoIGEgU2NyaXB0QWxpYXMgYW5kCiAgICAgYSBSZWRpcmVjdCBkZWNsYXJlZCBmb3IgdGhlICpleGFjdCBzYW1lIGRpcmVjdG9yeSouICBFdmVuICpteSoKICAgICBjb21wYXRpYmlsaXR5IGZldGlzaCB3b3VsZG4ndCBtb3RpdmF0ZSBtZSB0byBmaXggdGhpcyBpZiB0aGUgZml4CiAgICAgcmVxdWlyZWQgYW55IGVmZm9ydCwgYnV0IGl0IGRvZXNuJ3QsIHNvIHdoYXQgdGhlIGhleS4KCiAgKikgRml4ZWQgdG8gcHJvcGVybHkgZGVmYXVsdCBzZXZlcmFsIHNlcnZlcl9yZWMgZmllbGRzIGZvciB2aXJ0dWFsCiAgICAgc2VydmVycyBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBpbiB0aGUgbWFpbiBzZXJ2ZXJfcmVjLgogICAgIFtDbGlmZiBTa29sbmljayAtLS0gJ3BvcnQnIHdhcyBhIHBhcnRpY3VsYXIgaXJyaXRhbnRdLgoKICAqKSBObyBsb25nZXIga2lsbHMgb2ZmIG5waC0gY2hpbGQgcHJvY2Vzc2VzIGJlZm9yZSB0aGV5IGFyZQogICAgIGZpbmlzaGVkIHNlbmRpbmcgb3V0cHV0LiBbTWF0dGhldyBHcmF5XQoKQ2hhbmdlcyB3aXRoIFNoYW1iaGFsYSAwLjYuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCBKdWwgMTk5NQoKICAqKSBUd28gc3R5bGVzIG9mIHRpbWVvdXQgLS0tIGhhcmQgYW5kIHNvZnQuICBzb2Z0X3RpbWVvdXQoKXMganVzdCBwdXQKICAgICB0aGUgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50IGluIGFuICJhYm9ydGVkIiBzdGF0ZSwgYnV0IG90aGVyd2lzZQogICAgIGFsbG93IHdoYXRldmVyIGhhbmRsZXJzIGFyZSBydW5uaW5nIHRvIGNsZWFuIHVwLiAgaGFyZF90aW1lb3V0KClzCiAgICAgYWJvcnQgdGhlIHJlcXVlc3QgaW4gcHJvZ3Jlc3MgY29tcGxldGVseTsgYW55dGhpbmcgbm90IHRpZWQgdG8gc29tZQogICAgIHJlc291cmNlIHBvb2wgY2xlYW51cCB3aWxsIGxlYWsuICBUaGV5J3JlIHN0aWxsIGFyb3VuZCBiZWNhdXNlIEkKICAgICBoYXZlbid0IHlldCBjb21lIHVwIHdpdGggYSBtb3JlIGVsZWdhbnQgd2F5IG9mIGhhbmRsaW5nCiAgICAgdGltZW91dHMgd2hlbiB0YWxraW5nIHRvIHNvbWV0aGluZyB0aGF0IGlzbid0IHRoZSBjbGllbnQuICBUaGUKICAgICBkZWZhdWx0X2hhbmRsZXIgYW5kIHRoZSBkaXJfaGFuZGxlciBub3cgdXNlIHNvZnQgdGltZW91dHMsIGxhcmdlbHkKICAgICBzbyBJIGNhbiB0ZXN0IHRoZSBmZWF0dXJlLiAgW1JvYmVydCBUaGF1XQoKICAqKSBUcmFuc2ZlckxvZyAifCBteV9wb3N0cHJvY2Vzc29yIC4uLiIgc2VlbXMgdG8gYmUgdGhlcmUuICBOb3RlIHRoYXQKICAgICB0aGUgY2FzZSBvZiBsb2cgaGFuZGxlcnMgZHlpbmcgcHJlbWF0dXJlbHkgaXMgcHJvYmFibHkgaGFuZGxlZCBWRVJZCiAgICAgZ3JhY2VsZXNzbHkgYXQgdGhpcyBwb2ludCwgYW5kIGlmIHRoZSBsb2dnZXIgc3RvcHMgcmVhZGluZyBpbnB1dCwKICAgICB0aGUgc2VydmVyIHdpbGwgaGFuZy4gIChJdCBpcyBrbm93biB0byBjb3JyZWN0bHkgcmVzdGFydCB0aGUKICAgICBsb2dnaW5nIHByb2Nlc3Mgb24gc2VydmVyIHJlc3RhcnQ7IHRoaXMgaXMgKHNob3VsZCBiZSEpIGdvaW5nIHRocm91Z2gKICAgICB0aGUgc2FtZSBTSUdURVJNL3BhdXNlL1NJR0tJTEwgcm91dGluZSB1c2VkIHRvIGRpbmcgYW4gZXJyYW50IENHSQogICAgIHNjcmlwdCkuICBbUm9iZXJ0IFRoYXVdCgogICopIGFzaXMgZmlsZXMgc3VwcG9ydGVkIChuZXcgbW9kdWxlKS4gIFtSb2JlcnQgVGhhdV0KCiAgKikgSWRlbnRpdHlDaGVjayBjb2RlIGlzIGNvbXBpbGVkIGluLCBidXQgaGFzIG5vdCBiZWVuIHRlc3RlZC4gIChJCiAgICAgZG9uJ3Qga25vdyBhbnlvbmUgd2hvIHJ1bnMgaWRlbnRkKS4gW1JvYmVydCBUaGF1XQoKICAqKSBQQVRIX0lORk8gYW5kIFBBVEhfVFJBTlNMQVRFRCBhcmUgbm90IHNldCB1bmxlc3Mgc29tZSByZWFsIFBBVEhfSU5GTwogICAgIGNhbWUgaW4gd2l0aCB0aGUgcmVxdWVzdCwgZm9yIE5DU0EgYnVnLWNvbXBhdGliaWxpdHkuIFtSb2JlcnQgVGhhdV0KCiAgKikgRG9uJ3QgbGVhayB0aGUgRElSICogb24gSEVBRCByZXF1ZXN0IGZvciBhIGRpcmVjdG9yeS4gW1JvYmVydCBUaGF1XQoKICAqKSBEZWxldGVkIHRoZSBibG9ja19hbGFybXMoKSBzdHVmZiBmcm9tIGRibV9hdXRoOyBubyBsb25nZXIgbmVjZXNzYXJ5LAogICAgIGFzIHRpbWVvdXRzIGFyZSBub3QgaW4gc2NvcGUuIFtSb2JlcnQgVGhhdV0KCiAgKikgcXVvdGVkLXN0cmluZyBhcmdzIGluIGNvbmZpZyBmaWxlcyBub3cgaGFuZGxlZCBjb3JyZWN0bHkgKGRvZXNuJ3QgZHJvcAogICAgIHRoZSBsYXN0IGNoYXJhY3RlcikuIFtSb2JlcnQgVGhhdTsgcmVwb3J0ZWQgYnkgUmFuZHkgVGVyYnVzaF0KCiAgKikgRml4ZWQgc2lsbHkgdHlwbyBpbiBodHRwX21haW4uYyB3aGljaCB3YXMgc3VkZGVubHkgZmF0YWwgaW4gSFAtVVguCiAgICAgSG93IHRoZSBoZWxsIGRpZCBpdCBldmVyIHdvcms/IFtSb2JlcnQgVGhhdTsgcmVwb3J0ZWQgYnkgUm9iIEhhcnRpbGxdCgogICopIG1vZF9jb3JlLmMgLS0tIGRlZmF1bHRfdHlwZSByZXR1cm5zIERFRkFVTFRfVFlQRSAodGhlIGNvbXBpbGUtdGltZQogICAgIGRlZmF1bHQgZGVmYXVsdCB0eXBlKTsgdGhlIGZvcm1lciBkZWZhdWx0IGRlZmF1bHQgYmVoYXZpb3Igd2hlbiBhbGwKICAgICB0eXBlLWNoZWNrZXJzIGRlZmF1bHRlZCBoYWQgYmVlbiBhIGNvcmUgZHVtcC4gIFtQYXVsIFN1dHRvbl0KCiAgKikgQ29weSBmaWxlbmFtZXMgb3V0IG9mIHRoZSBzdHJ1Y3QgZGlyZW50IHdoZW4gaW5kZXhpbmcKICAgICBkaXJlY3Rvcmllcy4gIChPbiBMaW51eCwgcmVhZGRpcigpIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzYW1lCiAgICAgbWVtb3J5IGFyZWEgZXZlcnkgdGltZSkuICBGaXggaXMgaW4gbW9kX2Rpci5jLiAgW1BhdWwgU3V0dG9uXQoKQ2hhbmdlcyB3aXRoIFNoYW1iaGFsYSAwLjUuMyBbbm90IHJlbGVhc2VkXQoKICAqKSBEZWZhdWx0IHJlc3BvbnNlIGhhbmRsZXIgbm90ZXMgImZpbGUgbm90IGZvdW5kIiBpbiB0aGUgZXJyb3IgbG9nLAogICAgIGlmIHRoZSBmaWxlIHdhcyBub3QgZm91bmQuICBbQ2xpZmYgU2tvbG5pY2tdLgoKICAqKSBBbm90aGVyIENsaWZmIGJ1ZyAtLS0gIkdFVCAvfnVzZXIiIG5vdyBwcm9wZXJseSByZWRpcmVjdHMgKHRoZSB1c2VyZGlyCiAgICAgY29kZSBubyBsb25nZXIgc2V0cyB1cCBib2d1cyBQQVRIX0lORk8gd2hpY2ggZmFrZXMgb3V0IHRoZSBkaXJlY3RvcnkKICAgICBoYW5kbGVyKS4gW0NsaWZmIFNrb2xuaWNrXQoKQ2hhbmdlcyB3aXRoIFNoYW1iaGFsYSAwLjUuMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwNiBKdWwgMTk5NQoKICAqKSBDaGFuZ2VzIHRvIGh0dHBfbWFpbi5jIC0tLSByb290IHNlcnZlciBubyBsb25nZXIgcGxheXMgc2lsbHkKICAgICBnYW1lcyB3aXRoIFNJR0NITEQsIGFuZCBzbyBub3cgZGV0ZWN0cyBhbmQgcmVwbGFjZXMgZHlpbmcKICAgICBjaGlsZHJlbi4gIENoaWxkIHByb2Nlc3NlcyBqdXN0IGRpZSBvbiBTSUdURVJNLCB3aXRob3V0IHRha2luZwogICAgIHRoZSB3aG9sZSBwcm9jZXNzIGdyb3VwIHdpdGggdGhlbS4gIFBvdGVudGlhbCBwcm9ibGVtIC0tLSBpZiBhbnkKICAgICBjaGlsZCBwcm9jZXNzIHJlZnVzZXMgdG8gZGllLCB3ZSBoYW5nIGluIHJlc3RhcnQuCiAgICAgTWF4UmVxdWVzdHNQZXJDaGlsZCBtYXkgc3RpbGwgbm90IHdvcmssIGJ1dCBpdCBjZXJ0YWlubHkgd29ya3MKICAgICBiZXR0ZXIgdGhhbiBpdCBkaWQgYmVmb3JlIHRoaXMhICBbUm9iZXJ0IFRoYXVdCgogICopIG1vZF9kaXIuYyBidWcgZml4ZXM6IFJlYWRtZU5hbWUgYW5kIEhlYWRlck5hbWUKICAgICB3b3JrIChvciB3b3JrIGJldHRlciwgYXQgbGVhc3QpOyBvdmVyLWxvbmcgZGVzY3JpcHRpb24gbGluZXMKICAgICBwcm9wZXJseSB0ZXJtaW5hdGVkLiBbTWFyayBDb3hdCgogICopIGh0dHBfcmVxdWVzdC5jIG5vdyBjYWxscyB1bmVzY2FwZV91cmwoKSBtb3JlIHBsYWNlcyB3aGVyZSBpdAogICAgIHNob3VsZCBbUGF1bCBTdXR0b25dLgoKICAqKSBNb3JlIGRpcmVjdG9yeSBoYW5kbGluZyBidWdzIChyZXBvcnRlZCBieSBDb3gpCiAgICAgUGFyZW50IERpcmVjdG9yeSBsaW5rIGlzIG5vdyBzZXQgY29ycmVjdGx5LiBbUm9iZXJ0IFRoYXVdCgpDaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuNS4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA0IEp1bCAxOTk1CgogICopIEdlbmVyYWxpemVkIGNsZWFudXAgaW50ZXJmYWNlIGluIGFsbG9jLmMgLS0tIGFueSBmdW5jdGlvbiBjYW4gYmUKICAgICByZWdpc3RlcmVkIHdpdGggYWxsb2MuYyBhcyBhIGNsZWFudXAgZm9yIGEgcmVzb3VyY2UgcG9vbDsKICAgICB0cmFja2luZyBvZiBmaWxlcyBhbmQgZmlsZSBkZXNjcmlwdG9ycyBoYXMgYmVlbiByZWltcGxlbWVudGVkIGluCiAgICAgdGVybXMgb2YgdGhpcyBpbnRlcmZhY2UsIHNvIEkgY2FuIGdpdmUgaXQgc29tZSBzb3J0IG9mIGEgdGVzdC4KICAgICBbUm9iZXJ0IFRoYXVdCgogICopIE1vcmUgY2hhbmdlcyBpbiBhbGxvYy5jIC0tLSBuZXcgY2xlYW51cF9mb3JfZXhlYygpIGZ1bmN0aW9uLAogICAgIHdoaWNoIHRyYWNrcyBkb3duIGFuZCBjbG9zZXMgYWxsIGZpbGUgZGVzY3JpcHRvcnMgd2hpY2ggaGF2ZSBiZWVuCiAgICAgcmVnaXN0ZXJlZCB3aXRoIHRoZSBhbGxvYy5jIG1hY2hpbmVyeSBiZWZvcmUgdGhlIHNlcnZlciBleGVjKClzIGEKICAgICBjaGlsZCBwcm9jZXNzIGZvciBDR0kgb3IgPCEtLSNleGVjLS0+LiAgQ0dJIGNoaWxkcmVuIG5vdyBnZXQKICAgICBzdGFydGVkIHdpdGggZXhhY3RseSB0aHJlZSBmaWxlIGRlc2NyaXB0b3JzIG9wZW4uICBIb3BlZnVsbHksCiAgICAgdGhpcyBjdXJlcyB0aGUgcHJvYmxlbSBSb2IgSC4gd2FzIGhhdmluZyB3aXRoIG92ZXJseSBwZXJzaXN0ZW50CiAgICAgQ0dJIGNvbm5lY3Rpb25zLiBbUm9iZXJ0IFRoYXVdCgogICopIE11dHVhbCBleGNsdXNpb24gYXJvdW5kIHRoZSBhY2NlcHQoKSBpbiBjaGlsZF9tYWluKCkgLS0tIHRoaXMgaXMKICAgICByZXF1aXJlZCBvbiBhdCBsZWFzdCBTR0ksIFNvbGFyaXMgYW5kIExpbnV4LCBhbmQgaXMgI2lmZGVmJ2VkIGluCiAgICAgYnkgZGVmYXVsdCBvbiB0aG9zZSBzeXN0ZW1zIG9ubHkgKC1ERkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQpLgogICAgIFRoaXMgdXNlcyBmY250bChGX1NFVExLLC4uLikgb24gdGhlIGVycm9yIGxvZyBkZXNjcmlwdG9yIGJlY2F1c2UKICAgICBmbG9jaygpIG9uIHRoYXQgZGVzY3JpcHRvciB3b24ndCB3b3JrIG9uIHN5c3RlbXMgd2hpY2ggaGF2ZSBCU0QKICAgICBmbG9jaygpIHNlbWFudGljcywgaW5jbHVkaW5nIChJIHRoaW5rKSBMaW51eCAxLjMgYW5kIFNvbGFyaXMuCgogICAgIFRoaXMgZG9lcyB3b3JrIG9uIFN1bk9TICh3aGVuIHRoZSBzZXJ2ZXIgaXMgaWRsZSwgb25seSBvbmUKICAgICBwcm9jZXNzIGluIHRoZSBwb29sIGlzIHdhaXRpbmcgb24gYWNjZXB0KCkpOyBpdCAqb3VnaHQqIHRvIHdvcmsKICAgICBvbiB0aGUgb3RoZXIgc3lzdGVtcy4gW1JvYmVydCBUaGF1XQoKICAqKSBGcmVlQlNEIGFuZCBCU0RJIHBvcnRhYmlsaXR5IHR3ZWFrcyBbQ2h1Y2sgTXVyY2tvXQoKICAqKSBzaXplb2YoKnNhX2NsaWVudCkgYnVnZml4IGZyb20gW1JvYiBIYXJ0aWxsXQoKICAqKSBwc3RyZHVwKC4uLiwgTlVMTCkgcmV0dXJucyBOVUxMLCBbUmFuZHkgVGVyYnVzaF0KCiAgKikgYmxvY2tfYWxhcm1zKCkgdG8gYXZvaWQgbGVha2luZyB0aGUgREJNKiBpbiBkYm0gYXV0aCAodGhpcyBzaG91bGQKICAgICBiZSB1bm5lY2Vzc2FyeSBpZiBJIGdvIHRvIHRoZSByZXZpc2VkIHRpbWVvdXQtaGFuZGxpbmcgc2NoZW1lKS4KICAgICBbUm9iZXJ0IFRoYXVdCgogICopIEZvciBOQ1NBIGJ1Zy1jb21wYXRpYmlsaXR5LCBzZXQgUVVFUllfU1RSSU5HIGVudiB2YXIgKHRvIGEgbnVsbAogICAgIHN0cmluZykgZXZlbiBpZiBub25lIGNhbWUgaW4gd2l0aCB0aGUgcmVxdWVzdC4gIFtSb2JlcnQgVGhhdV0KCiAgKikgQ0hBTkdFUyBmaWxlIGFkZGVkIHRvIGRpc3RyaWJ1dGlvbiA7LSkuCgpDaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuNC41CgogICopIG1vZF9kbGQgLS0tIGVhcmx5IGR5bmFtaWMgbG9hZGluZyBzdXBwb3J0IFtyc3RdCiAgKikgQWRkIHdpbGRjYXJkIGNvbnRlbnQgaGFuZGxlcnMgZm9yIFhCSVRIQUNLOyBkZWZhdWx0X2hhbmRlciBub3cKICAgICBpbnZva2VkIHdpdGggdGhhdCBtZWNoYW5pc20gKGFzIGEgaGFuZGxlciBoYW5naW5nIG9mZiBtb2RfY29yZSkgW3JzdF0KICAqKSBYQklUSEFDSyBzdXBwb3J0ZWQgYXMgYSB3aWxkY2FyZCBjb250ZW50LWhhbmRsZXIsIGFuZCAKICAgICBjb25maWd1cmFibGUgYXQgcnVuLXRpbWUgKG5vdCBqdXN0IGF0IGNvbXBpbGUgdGltZSwgYXMgaW4gdGhlCiAgICAgInBhdGNoeSBzZXJ2ZXIiIHJlbGVhc2VzKSBbcnN0XQoKQ2hhbmdlcyB3aXRoIFNoYW1iaGFsYSAwLjQuNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCBKdW4gMTk5NQoKICAqKSBGaXhlZCBiYXNpYyB0aGlua29zIGluIG1vZF9kYm1fYXV0aC5jIFtyc3QsIHJlcG9ydGVkIGJ5IE1hcmsgQ294XQogICopIEhhbmRsZSBBZGR0eXBlIHgveSAueiBbcnN0LCByZXBvcnRlZCBieSBDb3hdCgpDaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuNC4zCgogICopIEZpeGVkIHZlcnkgZHVtYiBidWcgaW4gbW9kX2FsaWFzOyAiQWxpYXMiIGFuZCAiUmVkaXJlY3QiIGFyZSBub3QKICAgICBzeW5vbnltb3VzIFtyc3QsIHRlcmJ1c2hdCgpDaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuNC4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4IEp1biAxOTk1CgogICopIEZpcnN0LWN1dCB2aXJ0dWFsIGhvc3QgaW1wbGVtZW50YXRpb247IHNvbWUgcmVmaXQgaW4gdGhlIGNvbmZpZwogICAgIHJlYWRpbmcgY29kZSwgYW5kIGxvZyBtYW5hZ2VtZW50LCB3YXMgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgdGhpcyBbcnN0XQogICopIFN1Yi1wb29sIG1hY2hpbmVyeSwgb3JpZ2luYWxseSBhZGRlZCB0byBhdm9pZCBleGNlc3NpdmUgc3RvcmFnZQogICAgIGFsbG9jYXRpb24gb24gbGlzdGluZ3Mgb2YgbGFyZ2UgZGlyZWN0b3JpZXMgKHdoaWNoIHR1cm5lZCBvdXQgdG8KICAgICBiZSB0aGUgcHJvYmxlbSB0aGF0IHRoZSAwLjMgc3RvcmFnZSBhY2NvdW50aW5nIHdhcyBhZGRlZCB0bwogICAgIGZpbmQpLiAgU3VicmVxdWVzdHMgYW5kIG1vZF9kaXIgY2hhbmdlZCB0byB1c2Ugc3VicG9vbHMuICBbcnN0XQogICopIE1vcmUgbWVtb3J5IGRlYnVnZ2luZyAtLS0gZnJlZSBsaXN0IGNvbnNpc3RlbmN5IGNoZWNrcy4gW3JzdF0KICAqKSBBZGRlZCBlcnJfaGVhZGVycyB0byByZXF1ZXN0X3JlYywgd2l0aCBzdXBwb3J0IGVsc2V3aGVyZSBbcnN0XQogICopIE90aGVyIGZpeGVzIHRvIG1pbm9yIGJ1Z3MgaW4gbW9kX2RpciBhbmQgbW9kX2luY2x1ZGVzIFtyc3QsIHRlcmJ1c2hdCgpDaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5IEp1biAxOTk1CgogICopIFN3aXRjaCBPTkVfUFJPQ0VTUyB0byBhIHJ1bnRpbWUgY29tbWFuZC1saW5lIG9wdGlvbiAoLVgpCiAgKikgRG9uJ3QgY29tcGlsZSBpbiBtb2RfYWlfYmFja2NvbXBhdCBieSBkZWZhdWx0CiAgKikgU3dpdGNoIG5hbWUgb2Ygc2VydmVyIGZyb20gQXBhY2hlIHRvIFNoYW1iaGFsYSBpbiBNYWtlZmlsZQogICopIEFkZCBzb21lIGFjY291bnRpbmcgcm91dGluZXMgdG8gdHJhY2sgbWVtb3J5IHVzYWdlIGluIHRoZSBwb29scywKICAgICBmb3IgZGVidWdnaW5nCgpDaGFuZ2VzIHdpdGggU2hhbWJoYWxhIDAuMgoKICAqKSBTZXQgRE9DVU1FTlRfUk9PVCBDR0kgdmFyaWFibGUKICAqKSBBZGQgc2luZ2xlLXByb2Nlc3MgZGVidWdnaW5nLCBhcyBhIGNvbXBpbGUtdGltZSBvcHRpb24gKE9ORV9QUk9DRVNTKQogICopIEFkZCBjcml0aWNhbCBzZWN0aW9uIHByb3RlY3Rpb24gdG8gaGFuZGxpbmcgb2YgY2xlYW51cCBzdHJ1Y3R1cmVzIAogICAgIGluIGFsbG9jLmMgW3JzdF0KICAqKSBTaWduaWZpY2FudCBjb2RlIHJlb3JnIHdpdGhpbiB0aGUgc2VydmVyIGNvcmUgdG8gZ3JvdXAgcmVsYXRlZAogICAgIGZ1bmN0aW9ucyB0b2dldGhlciBbcnN0XQogICopIENvcnJlY3RseSBoYW5kbGUgY2xpZW50cyB0aGF0IGhhbmcgdXAgYmVmb3JlIHNlbmRpbmcgYW55IHJlcXVlc3QKICAgICBbcnN0XQogICopIFJlcGxhY2UgZHlpbmcgY2hpbGQgcHJvY2Vzc2VzLiBbcnN0XQoKQ2hhbmdlcyB3aXRoIFNoYW1iaGFsYSAwLjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiBKdW4gMTk5NQoKICAgTWFqb3IgcmV3cml0ZSBvZiB0aGUgcHJlLWV4aXN0aW5nICJwYXRjaHkgc2VydmVyIiBjb2RlYmFzZSwgYnkKICAgUm9iZXJ0IFRoYXUgKHJzdCkuICBTaWduaWZpY2FudCBwb3J0aW9ucyBvZiB0aGUgc2VydmVyIGNvZGUsIHN1Y2gKICAgYXMgY29uZmlndXJhdGlvbi1maWxlIGhhbmRsaW5nIGFuZCBIVFRQIGF1dGhlbnRpY2F0aW9uIHN1cHBvcnQsCiAgIHdlcmUgcmlwcGVkIG91dCBhbmQgcmV3cml0dGVuIGZyb20gc2NyYXRjaC4gIENvZGUgdGhhdCB3YXMgbm90CiAgIGNvbXBsZXRlbHkgcmV3cml0dGVuIHdhcyBzaWduaWZpY2FudGx5IGFsdGVyZWQuCgogICBNYWpvciBjaGFuZ2VzIHdpdGggdGhpcyByZWxlYXNlIGluY2x1ZGU6CgogICAqKSBJbnRyb2R1Y3Rpb24gb2YgdGhlIG1vZHVsZSBBUEk7IGluIHJlcXVlc3QgaGFuZGxpbmcsIHRoZSBjZW50cmFsIAogICAgICBtYWNoaW5lcnkganVzdCBkaXNwYXRjaGVzIHRvIHZhcmlvdXMgbW9kdWxlcywgd2hpY2ggYWN0dWFsbHkgZG8KICAgICAgbW9zdCBvZiB0aGUgd29yay4gIENvbmZpZ3VyYXRpb24gaGFuZGxpbmcgaXMgc2ltaWxhciAtLS0gbW9kdWxlcwogICAgICBkZWNsYXJlIHRoZWlyIG93biBjb21tYW5kcywgYW5kIHRoZSBjZW50cmFsIG1hY2hpbmVyeSBqdXN0CiAgICAgIGRpc3BhdGNoZXMgdG8gdGhlbS4gIAoKICAgICAgQVBJIGZlYXR1cmVzIGZyb20gc2hhbWJoYWxhLzAuMSB3ZXJlIHN1YnN0YW50aWFsbHkgdW5jaGFuZ2VkIGluCiAgICAgIEFwYWNoZSAxLjAgYW5kIDEuMS4gICgxLjAgQVBJIGZlYXR1cmVzIG5vdCB5ZXQgcHJlc2VudCBpbiB0aGlzCiAgICAgIHJlbGVhc2UsIHN1Y2ggYXMgd2lsZGNhcmQgaGFuZGxlcnMgYW5kIHN1YnBvb2xzLCB3ZXJlIGFkZGVkIGluCiAgICAgIHN1YnNlcXVlbnQgU2hhbWJoYWxhIHJlbGVhc2VzLCBhbmQgd2VyZSBhbHNvIGdlbmVyYWxseSByc3QncwogICAgICB3b3JrKS4gCgogICAqKSBUaGlzIHJlbGVhc2UgaW5jbHVkZWQgdGhlIGZvbGxvd2luZyBtb2R1bGVzOgoKICAgICAgbW9kX2FjY2VzcyAgICAgIChhY2Nlc3MgY29udHJvbCAtLS0gYWxsb3cgYW5kIGRlbnkgZGlyZWN0aXZlcyksCiAgICAgIG1vZF9hbGlhcyAgICAgICAoQWxpYXMgYW5kIFJlZGlyZWN0IGNvbW1hbmRzKSwKICAgICAgbW9kX2F1dGggICAgICAgIChzdHJhaWdodCBIVFRQIGF1dGhlbnRpY2F0aW9uLCBiYXNlZCBvbiBmbGF0LWZpbGVzKQogICAgICBtb2RfYXV0aF9kYm0gICAgKHNhbWUsIHdpdGggZGJtIGZpbGVzKQogICAgICBtb2RfY2dpICAgICAgICAgKENHSSBzY3JpcHRzIGFuZCwgaW4gdGhpcyByZWxlYXNlLCBTY3JpcHRBbGlhcykKICAgICAgbW9kX2NvbW1vbl9sb2cgIChDTEYgYWNjZXNzIGxvZ3M7IGxhdGVyIHJlbmFtZWQgbW9kX2xvZ19jb21tb24pCiAgICAgIG1vZF9kaXIgICAgICAgICAoZGlyZWN0b3J5IGluZGV4aW5nKQogICAgICBtb2RfaW5jbHVkZSAgICAgKHNlcnZlci1zaWRlIGluY2x1ZGVzKQogICAgICBtb2RfbWltZSAgICAgICAgKEFkZFR5cGUgZGlyZWN0aXZlcykKICAgICAgbW9kX25lZ290aWF0aW9uIChjb250ZW50IG5lZ290aWF0aW9uKQogICAgICBtb2RfdXNlcmRpciAgICAgKHN1cHBvcnQgZm9yIHVzZXJzJyBwdWJsaWNfaHRtbCBkaXJlY3RvcmllcykKCiAgICAgIEl0IGFsc28gaW5jbHVkZWQgYSBtb2RfYWlfYmFja2NvbXBhdCwgd2hpY2ggd2FzIGEgcHJpdmF0ZSBoYWNrCiAgICAgIGZvciBiYWNrLWNvbXBhdGliaWxpdHkgd2l0aCByc3QncyBvd24gQUktbGFiIHNlcnZlcnMuCgogICAgICBBbGwgb2YgdGhlc2UgbW9kdWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgY29tcGxldGUsIGFuZCBmdW5jdGlvbmFsIAogICAgICBvciBuZWFybHkgc28gKGEgZmV3LCB3aGljaCBpbXBsZW1lbnRlZCBmZWF0dXJlcyBub3QgaW4gdXNlIGF0CiAgICAgIFRoYXUncyBzaXRlLCByZXF1aXJlZCBwYXRjaGVzIG9mIGEgZmV3IGxpbmVzKS4KCiAgICopIHN1Yi1yZXF1ZXN0IG1hY2hpbmVyeSwgdG8gYWxsb3cgbW9kdWxlcyB0byBkZXRlcm1pbmUgaG93IG90aGVyCiAgICAgIG1vZHVsZXMgd291bGQgYXNzaWduIE1JTUUgdHlwZXMgdG8gYSBnaXZlbiBmaWxlLCBvciBvcHRpb25hbGx5CiAgICAgIHNlcnZlIGl0cyBjb250ZW50ICh0aGlzIGlzIGhlYXZpbHkgdXNlZCBieSBtb2RfZGlyLCBtb2RfaW5jbHVkZQogICAgICBhbmQgbW9kX25lZ290aWF0aW9uKS4KCiAgICopIFJlc291cmNlIHBvb2wgc3lzdGVtIGZvciBrZWVwaW5nIHRyYWNrIG9mIG1lbW9yeSBhbGxvY2F0ZWQgYW5kCiAgICAgIGZpbGVzIG9wZW5lZCBpbiBzZXJ2aWNlIG9mIGEgcGFydGljdWxhciByZXF1ZXN0LiAgTXVjaCBvZiB0aGUKICAgICAgY29kZSBpbiB0aGUgbW9kdWxlcyAod2hlbiB0aGV5IHdlcmVuJ3QgcmV3cml0ZXMpIHdhcyBhZGp1c3RlZCB0byAKICAgICAgcmVwbGFjZSBhIHBlcnZhc2l2ZSBjb252ZW50aW9uIG9mIHVzaW5nIGZpeGVkLXNpemUgYnVmZmVycyBvbgogICAgICB0aGUgc3RhY2sgd2l0aCBhbiBlcXVhbGx5IHBlcnZhc2l2ZSBjb252ZW50aW9uIG9mIHVzaW5nIG1lbW9yeQogICAgICBhbGxvY2F0ZWQgd2l0aCBwYWxsb2MoKS4KCiAgICopIFJlb3JnYW5pemF0aW9uIG9mIGRhdGEgc3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbgogICAgICByZXF1ZXN0IHRvIGVsaW1pbmF0ZSB1c2Ugb2YgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgdGhlIHRyb3VibGVzb21lIAogICAgICB1bm11bmdlX25hbWUgZnVuY3Rpb24gKHVzZWQgaW4gTkNTQSBhbmQgZWFybHkgQXBhY2hlIHJlbGVhc2VzIHRvIAogICAgICBhdHRlbXB0IHRvIGRldGVybWluZSB0aGUgVVJJIHdoaWNoIG1hcHBlZCB0byBhIGdpdmVuIGZpbGVuYW1lCiAgICAgIC0tLSBhIGRpZmZpY3VsdCBwcm9wb3NpdGlvbiwgZ2l2ZW4gdGhhdCBpdCBpcyBlYXN5IHRvIHByb2R1Y2UKICAgICAgc2V0dXBzIGluIHdoaWNoIG11bHRpcGxlIFVSSXMgbWFwIHRvIHRoZSBzYW1lIGZpbGUpLgoKICAgKikgU291cmNlIGZpbGVzIHJlbmFtZWQgYW5kIHJlYXJyYW5nZWQKCiAgICopIFZlcnkgc2ltcGxlIHByZS1mb3JraW5nIGJlaGF2aW9yIC0tLSBwYXJlbnQgcHJvY2VzcyBmb3JrZWQgb2ZmIGEgCiAgICAgIGZpeGVkIG51bWJlciBvZiBjaGlsZHJlbiwgYW5kIHRoZW4ganVzdCB3YWl0ZWQgZm9yIFNJR0hVUC4KCiAgICopIE90aGVyIG1vcmUgbWlub3IgY2hhbmdlcyB0b28gbnVtZXJvdXMgdG8gbGlzdC4KCiAgIFRoaXMgcmVsZWFzZSBpbmNsdWRlZCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBhIGxvdCBvZiBjb2RlIGZyb20gdGhlCiAgIEFwYWNoZSAwLjYuNCBwdWJsaWMgcmVsZWFzZSwgcGx1cyBhbiBlYXJseSBwcmUtZm9ya2luZyBwYXRjaAogICBjb2RldmVsb3BlZCBieSBSb2JlcnQgVGhhdSBhbmQgUm9iIEhhcnRpbGwuCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDAuNy4zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwIEp1biAxOTk1CgogICAqKSBUaGVyZSB3ZXJlIGEgYnVuY2ggb2YgY2hhbmdlcyBiZXR3ZWVuIEFwYWNoZSAwLjYuNCBhbmQgMC43LjMgdGhhdAogICAgICB3ZXJlIGluY29ycG9yYXRlZCBieSBSb2IgSGFydGlsbCBvbiB0aGUgbWFpbiBicmFuY2ggd2hpbGUgUm9iZXJ0IFRoYXUKICAgICAgd29ya2VkIG9uIHRoZSBTaGFtYmhhbGEgcmV3cml0ZSBhYm92ZS4gIE1vc3Qgd2VyZSBtZXJnZWQgaW50byB0aGUKICAgICAgU2hhbWJhbGEgYXJjaGl0ZWN0dXJlIGFmdGVyIEFwYWNoZSAwLjguMC4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC42LjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMgTWF5IDE5OTUKCiAgICopIFBhdGNoZXMgYnkgUm9iIEhhcnRpbGwsIENsaWZmIFNrb2xuaWNrLCBSYW5keSBUZXJidXNoLCBSb2JlcnQgVGhhdSwKICAgICAgYW5kIG90aGVycy4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC41LjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgQXByIDE5OTUKCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC40ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDIgQXByIDE5OTUKCiAgKikgUGF0Y2hlcyBieSBCcmlhbiBCZWhsZW5kb3JmLCBBbmRyZXcgV2lsc29uLCBSb2JlcnQgVGhhdSwKICAgICBhbmQgUm9iIEhhcnRpbGwuCgpDaGFuZ2VzIHdpdGggQXBhY2hlIDAuMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0IE1hciAxOTk1CgogICopIFBhdGNoZXMgYnkgUm9iZXJ0IFRoYXUsIERhdmlkIFJvYmluc29uLCBSb2IgSGFydGlsbCwgYW5kCiAgICAgQ2FybG9zIFZhcmVsYS4KCkNoYW5nZXMgd2l0aCBBcGFjaGUgMC4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTggTWFyIDE5OTUKCiAgKikgQmFzZWQgb24gTkNTQSBodHRwZCAxLjMgYnkgUm9iIE1jQ29vbCBhbmQgcGF0Y2hlcyBieSBDRVJULAogICAgIFJveSBGaWVsZGluZywgUm9iZXJ0IFRoYXUsIE5pY29sYXMgUGlvY2gsIERhdmlkIFJvYmluc29uLAogICAgIEJyaWFuIEJlaGxlbmRvcmYsIFJvYiBIYXJ0aWxsLCBhbmQgQ2xpZmYgU2tvbG5pY2suCg==