CiAgQHZlcmJhdGltCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCCpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzIEludGVybmF0aW9uYWwgTi5WLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAxNiBSZWFsIFRpbWUgRW5naW5lZXJzIEx0ZCwgQWxsIHJpZ2h0cyByZXNlcnZlZAogICoKICAqIEBmaWxlICAgIHN0X3JlYWRtZS50eHQKICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCiAgKiBAYnJpZWYgICBUaGlzIGZpbGUgbGlzdHMgdGhlIG1haW4gbW9kaWZpY2F0aW9uIGRvbmUgYnkgU1RNaWNyb2VsZWN0cm9uaWNzIG9uCiAgKiAgICAgICAgICBGcmVlUlRPUyBmb3IgaW50ZWdyYXRpb24gd2l0aCBTVE0zMkN1YmUgc29sdXRpb24uCiAgKiAgICAgICAgICBGb3IgbW9yZSBkZXRhaWxzIG9uIEZyZWVSVE9TIGltcGxlbWVudGF0aW9uIG9uIFNUTTMyQ3ViZSwgcGxlYXNlIHJlZmVyCiAgKiAgICAgICAgICB0byBVTTE3MjIgIkRldmVsb3BpbmcgQXBwbGljYXRpb25zIG9uIFNUTTMyQ3ViZSB3aXRoIEZyZWVSVE9TIgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBjb21wb25lbnQgaXMgbGljZW5zZWQgYnkgU1QgdW5kZXIgQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsCiAgKiB0aGUgIkxpY2Vuc2UiOyBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlCiAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CiAgKiAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEBlbmR2ZXJiYXRpbQoKPT09PT09PQoKIyMjIDMxLUF1Z3VzdC0yMDIwICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT09CiAgKyBCdWcgZml4IGZvciBHMCBjb21waWxhdGlvbiBlcnJvciBkdWUgdG8gSVJRbl9UeXBlIG1pc21hdGNoIGJldHdlZW4gRzAgYW5kIG90aGVyIGZhbWlsaWVzCiAgICAgIC0gU291cmNlL0NNU0lTX1JUT1NfVjIvY21zaXNfb3MyLmMKICArIEJ1ZyBmaXggd2hlbiB1c2luZyBzeXN0aWNrIGFzIHRpbWViYXNzZSBmb3IgSEFMCiAgICAgIC0gU291cmNlL0NNU0lTX1JUT1NfVjIvY21zaXNfb3MyLmMKCiMjIyAyMC1KdWx5LTIwMjAgIyMjCj09PT09PT09PT09PT09PT09PT09PT09PT0KICArIEZyZWVSVE9TOiBVcGRhdGUgdG8gRnJlZVJUT1MgdjEwLjMuMQogIAogICsgQ01TSVNfUlRPU19WMjogdXBkYXRlIGFnYWluc3QgdGhlIGxhdGVzdCBDTVNJUy1GcmVlUlRPUyB2MTAuMy4wIHJlbGVhc2UKICAgICAgLSBDTVNJU19SVE9TX1YyL2Ntc2lzX29zMi5jCiAgICAgIC0gQ01TSVNfUlRPU19WMi9mcmVlcnRvc19tcG9vbC5oCiAgICAgIC0gQ01TSVNfUlRPU19WMi9mcmVlcnRvc19vczIuaAogICAgICAtIENNU0lTX1JUT1NfVjIvb3Nfc3lzdGljay5jCgogICsgQWRkIFRpY2tsZXNzIElkbGUgc3VwcG9ydCBmb3IgQ00yMy9DTTMzCiAgICAgIC0gR0NDL0FSTV9DTTIzL25vbl9zZWN1cmUvcG9ydC5jCiAgICAgIC0gR0NDL0FSTV9DTTIzL25vbl9zZWN1cmUvcG9ydG1hY3JvLmgKICAgICAgLSBHQ0MvQVJNX0NNMjNfTlRaL25vbl9zZWN1cmUvcG9ydC5jCiAgICAgIC0gR0NDL0FSTV9DTTIzX05UWi9ub25fc2VjdXJlL3BvcnRtYWNyby5oCiAgICAgIC0gR0NDL0FSTV9DTTMzL25vbl9zZWN1cmUvcG9ydC5jCiAgICAgIC0gR0NDL0FSTV9DTTMzL25vbl9zZWN1cmUvcG9ydG1hY3JvLmgKICAgICAgLSBHQ0MvQVJNX0NNMzNfTlRaL25vbl9zZWN1cmUvcG9ydC5jCiAgICAgIC0gR0NDL0FSTV9DTTMzX05UWi9ub25fc2VjdXJlL3BvcnRtYWNyby5oCiAgICAgIC0gSUFSL0FSTV9DTTIzL25vbl9zZWN1cmUvcG9ydC5jCiAgICAgIC0gSUFSL0FSTV9DTTIzL25vbl9zZWN1cmUvcG9ydG1hY3JvLmgKICAgICAgLSBJQVIvQVJNX0NNMjNfTlRaL25vbl9zZWN1cmUvcG9ydC5jCiAgICAgIC0gSUFSL0FSTV9DTTIzX05UWi9ub25fc2VjdXJlL3BvcnRtYWNyby5oCiAgICAgIC0gSUFSL0FSTV9DTTMzL25vbl9zZWN1cmUvcG9ydC5jCiAgICAgIC0gSUFSL0FSTV9DTTMzL25vbl9zZWN1cmUvcG9ydG1hY3JvLmgKICAgICAgLSBJQVIvQVJNX0NNMzNfTlRaL25vbl9zZWN1cmUvcG9ydC5jCiAgICAgIC0gSUFSL0FSTV9DTTMzX05UWi9ub25fc2VjdXJlL3BvcnRtYWNyby5oCiAgCiAgKyAgRml4IE1QVSBoYXJkZmF1bHQgYnVnIGZvciBDb3J0ZXgtTTQgTVBVCiAgICAgIC0gR0NDXEFSTV9DTTRfTVBVXHBvcnQuYwogICAgICAtIElBUlxBUk1fQ000X01QVVxwb3J0LmMKICAgICAgLSBSVkRTXEFSTV9DTTRfTVBVXHBvcnQuYwoKICArICBBZGQgc3VwcG9ydCBmb3IgMTYgTVBVIHJlZ2lvbnMgdG8gQ29ydGV4LU00IE1QVSBwb3J0cwogICAgICAtIEdDQy9BUk1fQ000X01QVS9wb3J0bWFjcm8uaAogICAgICAtIElBUi9BUk1fQ000X01QVS9wb3J0bWFjcm8uaAogICAgICAtIFJWRFMvQVJNX0NNNF9NUFUvcG9ydG1hY3JvLmgKCiAgKyBVcGRhdGUgQVJNX0NNN19NUFUgc291cmNlIGZpbGVzIGZvciBhbGwgY29tcGlsZXJzCiAgICAgIC0gR0NDL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCiAgICAgIC0gR0NDL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKICAgICAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKICAgICAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0YXNtLnMKICAgICAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaAogICAgICAtIFJWRFMvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKICAgICAgLSBSVkRTL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKCiMjIyAxNy1KYW51YXJ5LTIwMjAgIyMjCj09PT09PT09PT09PT09PT09PT09PT09PT0KICArIEZpeCBjb21waWxlIGVycm9yIGluIHRoZSBHQ0MgQ003X01QVSBwb3J0IGNhdXNlZCBieSBhIGR1cGxpY2F0ZWQgdmFyaWFibGUgZGVjbGFyYXRpb24KICAgICAgLSBTb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCgojIyMgMTMtRGVjZW1iZXItMjAxOSAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09PQogICsgUmVtb3ZlIHdhcm5pbmdzIHRocm93biBieSBFV0FSTSBmb3IgQ00zMy9DTTIzIHBvcnRzCiAgICAgIC0gSUFSL0FSTV9DTTIzL25vbl9zZWN1cmUvcG9ydG1hY3JvLmgKICAgICAgLSBJQVIvQVJNX0NNMjNfTlRaL25vbl9zZWN1cmUvcG9ydG1hY3JvLmgKICAgICAgLSBJQVIvQVJNX0NNMzMvbm9uX3NlY3VyZS9wb3J0bWFjcm8uaAogICAgICAtIElBUi9BUk1fQ00zM19OVFovbm9uX3NlY3VyZS9wb3J0bWFjcm8uaAoKIyMjIDE5LUp1bHktMjAxOSAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09PQogICsgRml4IHJ1bnRpbWUgZXJyb3IgaW4gdGhlICBJQVIvQ000X01QVSBwb3J0CiAgICAgICAtIElBUi9BUk1fQ000X01QVS9wb3J0LmMKCiMjIyAxMi1KdWx5LTIwMTkgIyMjCj09PT09PT09PT09PT09PT09PT09PT09PT0KICArIEZyZWVSVE9TOiBVcGRhdGUgYWdhaW5zdCB0aGUgRnJlZVJUT1MgdjEwLjIuMSByZWxlYXNlCiAgICAtIHN1cHBvcnQgZm9yIHRoZSBDTTMzIGFuZCBDTTIzIGNvcmVzCgogICsgQ01TSVNfUlRPU19WMjogdXBkYXRlIGFnYWluc3QgdGhlIGxhdGVzdCBDTVNJUy1GcmVlUlRPUyB2MTAuMi4wIHJlbGVhc2UKCiAgKyBBZGQgTVBVIHN1cHBvcnQgZm9yIHRoZSBDTTcvcjBwMToKICAgICAgIC0gR0NDL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCiAgICAgICAtIEdDQy9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oCiAgICAgICAtIElBUi9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwogICAgICAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0YXNtLnMKICAgICAgIC0gSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKICAgICAgIC0gUlZEUy9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwogICAgICAgLSBSVkRTL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKCiAgKyBjbXNpc19vcy5jOiBGaXggY29tcGlsZSBlcnJvcnMgYnkgdXNpbmcgdGhlIGNvcnJlY3QgVGltZXJDYWxsYmFja0Z1bmN0aW9uX3QgdHlwZSBmb3IgdGltZXIgY3JlYXRpb24KCiMjIyAyOS1NYXJzLTIwMTkgIyMjCj09PT09PT09PT09PT09PT09PT09PT09PT0KICArIGNtc2lzX29zLmMgOiBGaXggYnVnIGluIG9zUG9vbEFsbG9jKCk6IG1lbW9yeSBibG9ja3MgY2FuJ3QgYmUgcmV1c2VkIGFmdGVyIGJlaW5nIGZyZWUnZAogICsgU291cmNlL0NNU0lTX1JUT1NfVjIvY21zaXNfb3MsIFNvdXJjZS9DTVNJU19SVE9TX1YyL2Ntc2lzX29zMS5jLCBTb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vczIuYywgU291cmNlL0NNU0lTX1JUT1NfVjIvY21zaXNfb3MyLmg6IHJlc3RvcmUgb3JpZ2luYWwgQXBhY2hlIGxpY2Vuc2UgdGVybXMKICArIHN0X3JlYWRtZS50eHQ6IHVwZGF0ZSBsaWNlbnNlIHRlcm1zIHRvIEJTRC0zLUNsYXVzZQoKCiMjIyAxMy1BdWd1c3QtMjAxOCAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09PQogICsgQWRkIGVtcHR5IGltcGxlbWVudGF0aW9uIGZvciB0aGUgbWlzc2luZyBmdW5jdGlvbiBvc1RocmVhZEdldFN0YWNrU2l6ZSgpCiAgICB0byBhdm9pZCBsaW5rIGVycm9ycyB3aGVuIHVzaW5nIENNU0lTLVJUT1MgVjIuCgogICsgVXBkYXRlIHRoZSBGcmVlUlRPU0NvbmZpZ190ZW1wbGF0ZS5oIHdpdGggc3BlY2lmaWMgZGVmaW5lcyBmb3IgdGhlCiAgICBDTVNJUy1SVE9TIFYyLgoKICArIFJlbmFtZSB0aGUgIlJURV9SVE9TX0ZyZWVSVE9TX1hYWFgiIG1hY3JvcyB0byAiVVNFX0ZyZWVSVE9TX1hYWFgiIGluCiAgICBjbXNpc19vczIuYy4KCiMjIyAzMC1KdWx5LTIwMTggIyMjCj09PT09PT09PT09PT09PT09PT09PT09PT0KICsgVXBkYXRlIExpY2Vuc2UudHh0IGZpbGUgdG8gTUlUIGxpY2Vuc2UgaW5zdGVhZCBvZiBHUEx2MgoKIyMjIDIzLUp1bHktMjAxOCAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09PQogKyBGaXggY29tcGlsZXIgd2FybmluZ3MgdGhyb3duIGJ5IElBUiBjb21waWxlciA4LjIwCgogKyBBZGQgTVBVIHN1cHBvcnQgZm9yIHRoZSBDTTcvcjBwMToKICAtIEdDQy9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwogIC0gR0NDL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKICAtIElBUi9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwogIC0gSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydGFzbS5zCiAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaAogIC0gUlZEUy9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwogIC0gUlZEUy9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oCgojIyMgMDktQXByaWwtMjAxOCAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09PQogIFVwZGF0ZSB0aGUgRnJlZVJUT1MgYWdhaW5zdCB0aGUgbGF0ZXN0IHJlbGVhc2UgMTAuMC4xCiAgbW9yZSBkZXRhaWxzIGFyZSBhdmFpbGFibGUgaW46IGh0dHBzOi8vd3d3LmZyZWVydG9zLm9yZy9IaXN0b3J5LnR4dAoKICArIEludGVncmF0ZSBzdXBwb3J0IGZvciB0aWNrbGVzcyBtb2RlIGZvciBBUk1fQ00wIGNvcmU6CiAgICAtIEdDQy9BUk1fQ00wL3BvcnQuYwogICAgLSBHQ0MvQVJNX0NNMC9wb3J0bWFjcm8uaAogICAgLSBJQVIvQVJNX0NNMC9wb3J0LmMKICAgIC0gSUFSL0FSTV9DTTAvcG9ydG1hY3JvLmgKICAgIC0gUlZEUy9BUk1fQ00wL3BvcnQuYwoKIEludGVncmF0ZSBDTVNJUy1SVE9TdjIgd3JhcHBlciBiYXNlZCBvbjogaHR0cHM6Ly9naXRodWIuY29tL0FSTS1zb2Z0d2FyZS9DTVNJUy1GcmVlUlRPUy9yZWxlYXNlcy90YWcvMTAuMC4xCiAgKyBBZGQgbmV3IGZpbGVzOgogICAgLSBDTVNJU19SVE9TX1YyL2Ntc2lzX29zLmgKICAgIC0gQ01TSVNfUlRPU19WMi9jbXNpc19vczEuYwogICAgLSBDTVNJU19SVE9TX1YyL2Ntc2lzX29zMi5jCiAgICAtIENNU0lTX1JUT1NfVjIvY21zaXNfb3MyLmgKICAgICAgImNtc2lzX29zMS5jIiBhbmQgImNtc2lzX29zMS5oIiBjb250YWlucyB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mCiAgICAgICBDTVNJUy1SVE9TdjEsaS5lIGFzIHJlbGVhc2VkIGJ5IEFSTSwgdXNpbmcgdGhlIENNU0lTLVJUT1NWMiBBUEkuCgogICsgVGhlIFNUIGN1c3RvbWl6ZWQgQ01TSVMtUlRPU3YxIGlzIG1haW50YWluZWQgdW5kZXI6CiAgICAtIENNU0lTX1JUT1MvY21zaXNfb3MuYwogICAgLSBDTVNJU19SVE9TL2Ntc2lzX29zLmgKCiAgKyBXaGVuIHVzaW5nIENNU0lTLVJUT1N2MiBBUElzLCB0aGUgZm9sbG93aW5nIEZyZWVSVE9TIGRlZmluZXMgYXJlIHJlcXVpcmVkOgogICAgLSAjZGVmaW5lIGNvbmZpZ01BWF9QUklPUklUSUVTICAgICAgICAgICAgICAgICAgICAgNTYKICAgIC0gI2RlZmluZSBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OICAgICAgICAgIDAKICAgIC0gI2RlZmluZSBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gIDAKCgojIyMgMTAtQXVndXN0LTIwMTcgIyMjCj09PT09PT09PT09PT09PT09PT09PT09PT0KICBVcGRhdGUgRnJlZVJUT1MgdG8gc3VwcG9ydCBNUFUgZmVhdHVyZSB3aXRoIElBUiBjb21waWxlci4KCiAgKyBBZGQgdGhlIGZvbGxvd2luZyBwb3J0czoKICAgIC0gSUFSL0FSTV9DTTRfTVBVCiAgICAtIElBUi9BUk1fQ003X01QVQogICAgLSBSVkRTL0FSTV9DTTdfTVBVCgoKIyMjIDAzLU1hcmNoLTIwMTcgIyMjCj09PT09PT09PT09PT09PT09PT09PT09PT0KICBVcGRhdGUgQ01TSVMtUlRPUyBkcml2ZXJzIHRvIHN1cHBvcnQgYm90aCBDTVNJUyBDb3JlIFY0LnggYW5kIFY1LngKCiAgQnVnIGZpeGVzOgogICsgQ01TSVMtUlRPUzogV3JvbmcgcmV0dXJuIHZhbHVlIGZvciBvc1NpZ25hbFdhaXQoKQogICsgQ01TSVMtUlRPUzogTm90IGFsbCBxdWV1ZSBzaXplIGlzIDAgaW5pdGlhbGl6ZWQgd2l0aCBvc01haWxDQWxsb2MoKQoKICBMaW1pdGF0aW9uOgogICsgQ01TSVMtUlRPUzogb3NTaWduYWxXQWl0KCkgZnVuY3Rpb24gaXMgbm90IGZ1bGx5IGNvbXBsaWFudCB3aXRoIHRoZSBzcGVjaWZpY2F0aW9uCgoKIyMjIDMwLVNlcHRlbWJlci0yMDE2ICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT09CiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyByZWxlYXNlIGlzIHRvIFVwZ3JhZGUgdG8gdXNlIEZyZWVSVE9TIFY5LjAuMCwgdGhpcyB2ZXJzaW9uCiAgaXMgYSBkcm9wLWluIGNvbXBhdGlibGUgcmVwbGFjZW1lbnQgZm9yIEZyZWVSVE9TIFY4LjIuMy4KICBGb3IgbW9yZSBkZXRhaWxzIHBsZWFzZSByZWZlciB0byBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9IaXN0b3J5LnR4dAoKICArIEFkZCBzdXBwb3J0IHRvIHRpY2tsZXNzIG1vZGUgZm9yIE1QVSBwb3J0czoKICAgIC0gR0NDL0FSTV9DTTNfTVBVL3BvcnQuYwogICAgLSBHQ0MvQVJNX0NNNF9NUFUvcG9ydC5jCiAgICAtIFJWRFMvQVJNX0NNNF9NUFUvcG9ydC5jCgogICsgVXBkYXRlIENNMCBwb3J0cywgYWRkIHBvc3NpYmlsaXR5IHRvIHVzZSBhIHRpbWViYXNlIGRpZmZlcmVudCB0aGFuIFN5c3RpY2s6CiAgICAtIElBUi9BUk1fQ00wL3BvcnQuYwogICAgLSBSVkRTL0FSTV9DTTAvcG9ydC5jCiAgICAtIEdDQy9BUk1fQ00wL3BvcnQuYwoKICArIEZpeCBjb21waWxhdGlvbiBlcnJvciBpbiBDTTNfTVBVIGFuZCBDTTRfTVBVIHBvcnRzOgogICAgLSBHQ0MvQVJNX0NNM19NUFUvcG9ydG1hY3JvLmgKICAgIC0gR0NDL0FSTV9DTTRfTVBVL3BvcnRtYWNyby5oCiAgICAtIFJWRFMvQVJNX0NNNF9NUFUvcG9ydG1hY3JvLmgKICAgIC0gQWRkICJTb3VyY2VccG9ydGFibGVcQ29tbW9uXCIgZGlyZWN0b3J5CgogICsgY21zaXNfb3MuYwogICAgLSBBZGQgc3VwcG9ydCBvZiBTdGF0aWNhbGx5IEFsbG9jYXRlZCBTeXN0ZW1zIGludHJvZHVjZWQgd2l0aCBGcmVlUlRPUyBWOS4wLjAKICAgIC0gQWRkIG5ldyB3cmFwcGVycyBDTVNJUy1SVE9TIEFQSXMKCiAgICAgICAgIEZyZWVSVE9TIEFQSXMgICAgICAgfCAgICAgQ01TSVMtUlRPUyBBUElzICAgICAgICB8ICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICB1eFF1ZXVlTWVzc2FnZXNXYWl0aW5nKCkgfCAgb3NNZXNzYWdlV2FpdGluZygpICAgICAgICB8ICBSZXR1cm4gdGhlIG51bWJlciBvZiBtZXNzYWdlcyBzdG9yZWQgaW4gYSBxdWV1ZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHhUYXNrQWJvcnREZWxheSgpICAgICAgICB8ICBvc0Fib3J0RGVsYXkoKSAgICAgICAgICAgIHwgIEZvcmNlIGEgdGhyZWFkIHRvIGdldCBvdXQgdGhlIGJsb2NrZWQgc3RhdGUgaW1tZWRpYXRlbHkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB1eFNlbWFwaG9yZUdldENvdW50KCkgICAgfCAgb3NTZW1hcGhvcmVHZXRDb3VudCgpICAgICB8ICBSZXR1cm4gdGhlIGN1cnJlbnQgY291bnQgb2YgYSBzZW1hcGhvcmUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB1eFF1ZXVlU3BhY2VzQXZhaWxhYmxlKCkgfCAgb3NNZXNzYWdlQXZhaWxhYmxlU3BhY2UoKSB8ICBSZXR1cm4gdGhlIGF2YWlsYWJsZSBzcGFjZSBpbiBhIG1lc3NhZ2UgcXVldWUKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB2UXVldWVEZWxldGUoKSAgICAgICAgICAgfCAgb3NNZXNzYWdlRGVsZXRlKCkgICAgICAgICB8ICBEZWxldGUgYSBtZXNzYWdlIFF1ZXVlCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCiMjIyAyMi1KYW51YXJ5LTIwMTYgIyMjCj09PT09PT09PT09PT09PT09PT09PT09CiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyByZWxlYXNlIGlzIHRvIFVwZ3JhZGUgdG8gdXNlIEZyZWVSVE9TIFY4LjIuMy4KICBJdCBhbHNvIHByb3ZpZGVzIGZpeGVzIGZvciBtaW5vciBpc3N1ZXMuCgogICsgY21zaXNfb3MuYwogICAgLSBJbXBsZW1lbnRhdGlvbiBvZiBmdW5jdGlvbnMgIm9zU2lnbmFsU2V0IiBhbmQgIm9zU2lnbmFsV2FpdCIgYXJlIG5vdyBkZWxpbWl0ZWQgYnkKICAgICAgICAgI2RlZmluZSBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TLgogICAgLSBGdW5jdGlvbiAib3NUaW1lclN0YXJ0IiA6IGZpeCBmb3IgYW4gYXNzZXJ0IGlzc3VlIHdoZW4gY2FsbGVkIGZyb20gYW4gSVNSLgogICAgLSBGdW5jdGlvbiAib3NNYWlsQ3JlYXRlIiAgOiBpbnRlcm5hbCB2YXJpYWJsZXMgaW5pdGlhbGl6YXRpb24uCiAgICAtIEZ1bmN0aW9uICJvc1NpZ25hbFdhaXQiIDogc2lnbmFscyB2YWx1ZSBpcyBub3cgY29tcGFyZWQgdmVyc3VzIGludGVnZXIgemVybyBmb3IgZXJyb3IgY2hlY2tpbmcuCgogICsgZnJlZVJUT1Mgc291cmNlcwogICAgLSBGcmVlUlRPUy5oIGZpbGUgOiBBZGQgY29uZmlndXJhdGlvbiBzYW5pdHkgY2hlY2sgaW4gY2FzZSBvZiBjb25maWdVU0VfUkVDVVJTSVZFX01VVEVYRVMgIHNldAogICAgICBhbmQgY29uZmlnVVNFX01VVEVYRVMgIG5vdCBzZXQuCgogICsgU1RNaWNyb2VsZWN0cm9uaWNzIGxpY2Vuc2Ugc2ltcGxpZmljYXRpb25zLCBzZWUgbGljZW5zZSBkaXNjbGFpbWVyIHdpdGhpbiB0aGlzIGZpbGUncyBoZWFkZXIKCgojIyMgMjctTWFyY2gtMjAxNSAjIyMKPT09PT09PT09PT09PT09PT09PT09CiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyByZWxlYXNlIGlzIHRvIFVwZ3JhZGUgdG8gdXNlIEZyZWVSVE9TIFY4LjIuMS4KCiAgKyBNYWpvciBjaGFuZ2Ugb2YgdGhlIHZlcnNpb24gOC4yLjEgaXMgdGhlIHN1cHBvcnQgb2YgQ003IGNvcmUuCiAgRm9yIFNUTTMyRjc0Nnh4L1NUTTMyRjc1Nnh4IGRldmljZXMsIG5lZWQgdG8gdXNlIHBvcnQgZmlsZXMgdW5kZXIgU291cmNlL1BvcnRhYmxlL1hYWC9BUk1fQ003L3IwcDEsCiAgd2hlcmUgWFhYIHJlZmVycyB0byB0aGUgY29tcGlsZXIgdXNlZC4KCiAgKyBJdCBhbHNvIHByb3ZpZGVzIGltcGxlbWVudGF0aW9uIG9mIG9zU2lnbmFsIG1hbmFnZW1lbnQgQVBJcywgb3NTaWduYWxTZXQoKSBhbmQgb3NTaWduYWxXYWl0KCksCiAgZml4ZXMgb3NNYXNzYWdlIHF1ZXVlIHNpemUsIG9zTWFpbFFEZWYgbWFjcm8gYW5kIG9zRGVsYXlVbnRpbCBwYXJhbWV0ZXJzLgoKICArIEluIHRoaXMgcmVsZWFzZSBhbiBhbGlnbm1lbnQgaGFzIGJlZW4gZG9uZSBpbiBBUk1fQ000IGFuZCBBUk1fQ00zIHBvcnQuYyB2ZXJzdXMgQVJNX0NNMCBwb3J0LmMKICByZWdhcmRpbmcgdGhlIHVzZSBvZiBtYWNyb3MgY29uZmlnUFJFX1NMRUVQX1BST0NFU1NJTkcgYW5kIGNvbmZpZ1BPU1RfU0xFRVBfUFJPQ0VTU0lORywgdGhlc2UgdG93IG1hY3JvcwogIGFyZSBub3cgdGFraW5nIGFzIHBhcmFtZXRlciBhcyBwb2ludGVyIHRvIFRpY2tUeXBlX3QuCgogICsgY21zaXNfb3MuYwogICAgLSBBZGQgaW1wbGVtZW50YXRpb24gb2Ygb3NTaWduYWxTZXQoKSBhbmQgb3NTaWduYWxXYWl0KCkgQVBJcwogICAgLSBGaXggbWFzc2FnZSBxdWV1ZSBzaXplIGluIG9zTWVzc2FnZUNyZWF0ZSBBUEkKICAgIC0gb3NEZWxheVVudGlsOiBwYXJhbWV0ZXIgUHJldmlvdXNXYWtlVGltZSBpcyBub3cgcGFzc2VkIGFzIGEgcG9pbnRlci4KICAgIC0gRW5hYmxpbmcgTWFpbCBxdWV1ZSBtYW5hZ2VtZW50IEFQSXMgKHRlbXBvcmFyeSByZW1vdmVkIGluIHByZXZpb3VzIHZlcnNpb24pLgogICAgLSBGdW5jdGlvbiAib3NUaHJlYWRHZXRQcmlvcml0eSIgdXNlcyBub3cgdXhUYXNrUHJpb3JpdHlHZXRGcm9tSVNSIGlmIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCBoYW5kbGVyLCBpZiBub3QgdXNlIHV4VGFza1ByaW9yaXR5R2V0LgoKICArIGNtc2lzX29zLmgKICAgIC0gb3NGZWF0dXJlX1dhaXQgaXMgZGVmaW5lZCB0byAwIHRvIGluZGljYXRlIHRoYXQgb3NXYWl0IGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUgKGFzIHNwZWNpZmllZCBieSBjbXNpc19vcyB0ZW1wbGF0ZSBieSBBUk0pCiAgICAtIEZpeCBjb21waWxhdGlvbiBpc3N1ZSB3aXRoIG9zTWFpbFFEZWYgbWFjcm8uCiAgICAtIEVuYWJsaW5nIE1haWwgcXVldWUgbWFuYWdlbWVudCBBUElzICh0ZW1wb3JhcnkgcmVtb3ZlZCBpbiBwcmV2aW91cyB2ZXJzaW9uKQoKICArIGZyZWVSVE9TIHNvdXJjZXMKICAgIC0gQVJNX0NNMyBwb3J0LmMgYW5kIEFSTV9DTTQgcG9ydC5jOgogICAgICBmdW5jdGlvbiB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCA6IGNvbmZpZ1BSRV9TTEVFUF9QUk9DRVNTSU5HIGFuZCBjb25maWdQT1NUX1NMRUVQX1BST0NFU1NJTkcgYXJlIG5vdyB0YWtpbmcKICAgICAgYXMgcGFyYW1ldGVyIGFzIHBvaW50ZXIgdG8gVGlja1R5cGVfdC4KICAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBjaGFuZ2UgaXMgdG8gYWxpZ24gdGhlIENNMyBhbmQgQ000IGltcGxlbWVudGF0aW9uIHdpdGggQ00wIG9uZS4KCiAgKyBOb3RlCiAgICAtIG9zU2lnbmFsU2V0IHJldHVybnMgYW4gaW50MzJfdCB2YWx1ZSB3aGljaCBpcyBhIGEgc3RhdHVzIChvc09LIG9yIG9zRXJyb3IpCiAgICAgIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIHNpZ25hbCB2YWx1ZSBhcyBzcGVjaWZpZWQgaW4gY21zaXNfb3MgdGVtcGxhdGUgYnkgQVJNLgogICAgICBUaGlzIGlzIG1haW5seSBkdWUgdG8gZnJlZVJUT1MgaW1wbGVtZW50YXRpb24sIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBhbGlnbmVkICh3aXRoIHRoZSBjbXNpcyBvcyB0ZW1wbGF0ZSBieSBBUk0pIGFzIHNvb24gYXMgdGhlIGZyZWVSVE9TIG5leHQgdmVyc2lvbiB3aWxsIGFsbG93IGl0LgoKICAgIC0gb3NUaHJlYWREZWYoKSBtYWNybyBpcyBkZWZpbmVkIGluIHRoZSBmcmVlUlRPUyBjbXNpc19vcy5oIHdyYXBwZXIgYXMgZm9sbG93IDoKICAgICAgICBvc1RocmVhZERlZihuYW1lLCB0aHJlYWQsIHByaW9yaXR5LCBpbnN0YW5jZXMsIHN0YWNrc3opCiAgICAgIHRoZSBtYWNybyBvc1RocmVhZERlZigpIGFzIGRlZmluZWQgaW4gQVJNIGNtc2lzX29zLmggaXMgZGVmaW5lZCB3aXRoIDQgcGFyYW1ldGVycyA6CiAgICAgIG5hbWUgOiBuYW1lIG9mIHRoZSB0aHJlYWQgZnVuY3Rpb24uCiAgICAgIHByaW9yaXR5IDogaW5pdGlhbCBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIGZ1bmN0aW9uLgogICAgICBpbnN0YW5jZXMgOiBudW1iZXIgb2YgcG9zc2libGUgdGhyZWFkIGluc3RhbmNlcy4KICAgICAgc3RhY2tzeiA6IHN0YWNrIHNpemUgKGluIGJ5dGVzKSByZXF1aXJlbWVudHMgZm9yIHRoZSB0aHJlYWQgZnVuY3Rpb24uCgogICAgLSBvc1RocmVhZERlZiBhcyBkZWZpbmVkIGluIHRoZSBBUk0gdGVtcGxhdGUgZmlsZSBjbXNpc19vcy5oIGFzc3VtZXMgdGhhdCB0aGUgdGhyZWFkIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIHRocmVhZCBmdW5jdGlvbiBuYW1lLgogICAgICB3aGVyZSB0aGUgZnJlZVJUT1MgaW1wbGVtZW50YXRpb24gZ2l2ZXMgc2VwYXJhdGUgcGFyYW1ldGVycyBmb3IgdGhlIHRocmVhZCBuYW1lIGFuZCB0aGUgdGhyZWFkIGZ1bmN0aW9uIG5hbWUuCgogICAgICBjYXJlIG11c3QgYmUgdGFrZW4gd2hlbiBwb3J0aW5nIGFuIGFwcGxpY2F0aW9uIGZyb20vdG8gYW5vdGhlciBPUyB0by9mcm9tIGZyZWVSVE9TIGNtc2lzX29zIHJlZ2FyZGluZyB0aGlzIG1hY3JvLgoKICAgICAgICB0aGUgbWFjcm8gb3NUaHJlYWREZWYoKSBhcyBkZWZpbmVkIGluIEFSTSBjbXNpc19vcy5oIHRlbXBsYXRlIGlzIGRlZmluZWQgd2l0aCA0IHBhcmFtZXRlcnMgOgogICAgICAgICAgIG5hbWUgOiBuYW1lIG9mIHRoZSB0aHJlYWQgZnVuY3Rpb24uCiAgICAgICAgICAgcHJpb3JpdHkgOiBpbml0aWFsIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgZnVuY3Rpb24uCiAgICAgICAgICAgaW5zdGFuY2VzIDogbnVtYmVyIG9mIHBvc3NpYmxlIHRocmVhZCBpbnN0YW5jZXMuCiAgICAgICAgICAgc3RhY2tzeiA6IHN0YWNrIHNpemUgKGluIGJ5dGVzKSByZXF1aXJlbWVudHMgZm9yIHRoZSB0aHJlYWQgZnVuY3Rpb24uCgogICAgICAgIHRoZSBtYWNybyBvc1RocmVhZERlZigpIGFzIGRlZmluZWQgaW4gZnJlZVJUT1MgY21zaXNfb3MuaCBpcyBkZWZpbmVkIHdpdGggNSBwYXJhbWV0ZXJzIDoKICAgICAgICAgICBuYW1lIDogbmFtZSBvZiB0aGUgdGhyZWFkICh1c2VkIGZvciBkZWJ1Z2dpbmcgYW5kIHRyYWNlKS4KICAgICAgICAgICB0aHJlYWQgOiBuYW1lIG9mIHRoZSB0aHJlYWQgZnVuY3Rpb24KICAgICAgICAgICBwcmlvcml0eSA6IGluaXRpYWwgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCBmdW5jdGlvbi4KICAgICAgICAgICBpbnN0YW5jZXMgOiBudW1iZXIgb2YgcG9zc2libGUgdGhyZWFkIGluc3RhbmNlcy4KICAgICAgICAgICBzdGFja3N6IDogc3RhY2sgc2l6ZSAoaW4gYnl0ZXMpIHJlcXVpcmVtZW50cyBmb3IgdGhlIHRocmVhZCBmdW5jdGlvbi4KCgojIyMgMjUtRGVjZW1iZXItMjAxNCAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09CiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyByZWxlYXNlIGlzIHRvIHJlbW92ZSBjb21waWxhdGlvbiBlcnJvcnMgYW5kIHdhcm5pbmcuIEl0IGFsc28gcmVpbnRyb2R1Y2VzCiAgdGhlIGZ1bmN0aW9uIG9zVGhyZWFkSXNTdXNwZW5kZWQoKSB3aGljaCBoYXMgYmVlbiByZW1vdmVkIGluIHRoZSB2ZXJzaW9uIFYxLjIuMC4KCiAgKyBjbXNpc19vcy5jCiAgICAgIC0gb3NUaHJlYWRHZXRQcmlvcml0eSgpIGFuZCBtYWtlQ21zaXNQcmlvcml0eSgpOiByZXBsYWNlIElOQ0xVREVfdlRhc2tQcmlvcml0eUdldCBieSB0aGUgY29ycmVjdAogICAgICAgICBmcmVlUlRPUyBjb25zdGFudCB1eFRhc2tQcmlvcml0eUdldC4KICAgICAgICAgVGhlIHZlcnNpb24gMS4yLjIgaXMgdXNpbmcgYSB3cm9uZyBjb25zdGFudCBJTkNMVURFX3ZUYXNrUHJpb3JpdHlHZXQsIHdoaWxlIHRoZSBjb3JyZWN0IGZyZWVSVE9TCiAgICAgICAgIGNvbnN0YW50IGlzIHV4VGFza1ByaW9yaXR5R2V0LgogICAgICAgICBUaGlzIGZpeCBlbnN1cmUgYSBzYWZlIHVzZSBvZiBvc1RocmVhZEdldFByaW9yaXR5KCkgZnVuY3Rpb24uCgogICAgICAtIG9zVGhyZWFkSXNTdXNwZW5kZWQoKTogdGhpcyBmdW5jdGlvbiBoYXMgYmVlbiByZW1vdmVkIGluIHZlcnNpb24gVjEuMi4wLCBpdCBpcyBub3cgYXZhaWxhYmxlIGdhaW4uCiAgICAgICAgIFVzZXIgY2FuIGVpdGhlciB1c2UgdGhpcyBmdW5jdGlvbiB0byBjaGVjayBpZiBhIFRocmVhZCBpcyBzdXNwZW5kZWQgZWl0aGVyIHVzZSBmdW5jdGlvbiBvc1RocmVhZEdldFN0YXRlLAogICAgICAgICB3aGljaCBpcyBtb3JlIGdlbmVyaWMsIHRvIGNoZWNrIHRoZSBleGFjdCBzdGF0ZSBvZiBhIHRocmVhZC4KCiAgICAgIC0gb3NUaHJlYWRMaXN0KCk6IHRoaXMgZnVuY3Rpb24gaXMgbm93IHRha2luZyBhcyBhcmd1bWVudCBhIHBvaW50ZXIgdG8gdWludDhfdCBpbnN0ZWFkIG9mIGEgcG9pbnRlciB0byBpbnQ4X3QuCiAgICAgICAgIFRoZSBjaGFuZ2UgaXMgbWFkZSB0byByZW1vdmUgYSBjb21waWxhdGlvbiB3YXJuaW5nLgoKICAgICAgLSBvc1JlY3Vyc2l2ZU11dGV4Q3JlYXRlKCk6IHRoZSBwcm90b3R5cGUgaGFzIGJlZW4gY2hhbmdlZCB0byBvc011dGV4SWQgb3NSZWN1cnNpdmVNdXRleENyZWF0ZSAoY29uc3Qgb3NNdXRleERlZl90ICptdXRleF9kZWYpCiAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBtYWRlIHRvIG1ha2Ugb3NSZWN1cnNpdmVNdXRleENyZWF0ZSgpIGNvbXBhdGlibGUgd2l0aCBmdW5jdGlvbiBNdXRleENyZWF0ZSgpLgogICAgICAgICAgSXQgYWxzbyBhbGxvdyB0aGUgYmV0dGVyIHVzZSBvZiB0aGUgZnVuY3Rpb24gaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgbWFjcm8gb3NNdXRleCwgbm90ZSB0aGF0IG9zTXV0ZXggcmV0dXJuIGEKICAgICAgICAgICJjb25zdCBvc011dGV4RGVmX3QgKm11dGV4X2RlZiIuCiAgICAgICAgICBleGFtcGxlIDogb3NNdXRleDFJZCA9IG9zUmVjdXJzaXZlTXV0ZXhDcmVhdGUgKG9zTXV0ZXgoTXV0ZXgxKSk7CgogICAgICAtIEZpeCBpbXBsZW1lbnRhdGlvbiBvZiBmdW5jdGlvbnMgb3NTZW1hcGhvcmVXYWl0KCksIG9zTXV0ZXhSZWxlYXNlKCkgYW5kIG9zTXV0ZXhXYWl0KCkgYnkgdXNpbmcgdGhlIGFwcHJvcHJpYXRlCiAgICAgICAgIGZyZWVSVE9TIJNGcm9tSVNSlCBBUElzIHdoZW4gY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0LgoKICAgICAgLSBGaXggY29tcGlsYXRpb24gd2FybmluZyB3aGVuIHRoZSBjb25zdGFudCBJTkNMVURFX2VUYXNrR2V0U3RhdGUgaXMgbm90IGRlZmluZWQKCiAgKyBjbXNpc19vcy5oCiAgICAgIC0gb3NUaHJlYWRJc1N1c3BlbmRlZCgpOiBhZGQgZnVuY3Rpb24gcHJvdG90eXBlLgogICAgICAtIG9zVGhyZWFkTGlzdCgpOiBmdW5jdGlvbiBwcm90b3R5cGUgbW9kaWZpZWQgYXMgZGVzY3JpYmVkIGluIGNtc2lzX29zLmMgc2VjdGlvbi4KICAgICAgLSBvc1JlY3Vyc2l2ZU11dGV4Q3JlYXRlKCk6IGZ1bmN0aW9uIG1vZGlmaWVkIGFzIGRlc2NyaWJlZCBpbiBjbXNpc19vcy5jIHNlY3Rpb24uCgogICsgSW1wb3J0YW50IG5vdGU6CiAgICBNYWlsIFF1ZXVlIE1hbmFnZW1lbnQgRnVuY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgY21zaXNfb3MgdmVyc2lvbiwgd2lsbCBiZSBhZGRlZCBpbiB0aGUgbmV4dCByZWxlYXNlLgoKCiMjIyAwNC1EZWNlbWJlci0yMDE0ICMjIwo9PT09PT09PT09PT09PT09PT09PT09PT0KICArIGNtc2lzX29zLmMsIG9zU2VtYXBob3JlQ3JlYXRlKCk6IHVzZSB2U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCkgaW5zdGVhZCBvZiB4U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCksCiAgICB0byBrZWVwIGNvbXBhdGliaWxpdHkgd2l0aCBhcHBsaWNhdGlvbiBjb2RlIGRldmVsb3BlZCBvbiBGcmVlUlRPUyBWNy42LjAuCgoKIyMjIDA3LU5vdmVtYmVyLTIwMTQgIyMjCj09PT09PT09PT09PT09PT09PT09PT09PQogICsgY21zaXNfb3MuaDogbW9kaWZ5IHRoZSBvc1RocmVhZFN0YXRlIGVudW0gdG8gZml4IHdhcm5pbmcgZ2VuZXJhdGVkIGJ5IEFSTUNDIGNvbXBpbGVyCiAgKyB0YXNrLmM6IGFkZCBwcmVwcm9jZXNzb3IgY29tcGlsYXRpb24gY29uZGl0aW9uIGZvciBwcnZUYXNrSXNUYXNrU3VzcGVuZGVkKCkgZnVuY3Rpb24KICAgICAgICAgICAgKGl0J3MgYnVpbGQgb25seSB3aGVuIElOQ0xVREVfdlRhc2tTdXNwZW5kIG9wdGlvbiBpcyBlbmFibGVkIGluIEZyZWVSVE9TQ29uZmlnLmggZmlsZSkKCgojIyMgMDQtTm92ZW1iZXItMjAxNCAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09CiAgKyBVcGdyYWRlIHRvIHVzZSBGcmVlUlRPUyBWOC4xLjIgYW5kIENNU0lTLVJUT1MgVjEuMDIuCiAgKyBjbXNpc19vcy5jCiAgICAgIC0gQWxtb3N0IG9mIENNU0lTLVJUT1MgQVBJcyBhcmUgaW1wbGVtZW50ZWQgZm9yIEZyZWVSVE9TCiAgICAgIC0gQWRkaXRpb25hbCB3cmFwcGVyIEFQSXMgY3JlYXRlZCBmb3IgRnJlZVJUT1MKCiAgKyBJbXBvcnRhbnQgbm90ZToKICAgIFdoZW4gdXBncmFkaW5nIGV4aXN0aW5nIGFwcGxpY2F0aW9uIGNvZGUgdG8gdXNlIHRoaXMgbGFzdCB2ZXJzaW9uLCB0aGUgZm9sbG93aW5nCiAgICB1cGRhdGUgc2hvdWxkIGJlIGNvbnNpZGVyZWQ6CiAgICAgIC0gb3NUaHJlYWRJc1N1c3BlbmRlZCgpIGlzIG5vIGxvbmdlciBwdWJsaWMgQVBJIGluIEZyZWVSVE9TIGFuZCBpdCBzaG91bGQKICAgICAgICBiZSByZXBsYWNlZCBieSB0aGUgd3JhcHBpbmcgb2YgZVRhc2tHZXRTdGF0ZSgpCiAgICAgIC0gb3NLZXJuZWxTdGFydCgpIEFQSSBjaGFuZ2VkLCBtdXN0IGJlIHVwZGF0ZWQKICAgICAgLSB1cGRhdGUgRnJlZVJUT1NDb25maWcuaCBmaWxlLCB0YWtpbmcgRnJlZVJUT1NDb25maWdfdGVtcGxhdGUuaCBmaWxlIGFzIHJlZmVyZW5jZQoKCiMjIyAxMy1KdW5lLTIwMTQgIyMjCj09PT09PT09PT09PT09PT09PT09CiAgKyBGcmVlUlRPU0NvbmZpZ190ZW1wbGF0ZS5oOiBhZGQgdGhpcyBkZWZpbml0aW9uICNkZWZpbmUgSU5DTFVERV94VGFza0dldFNjaGVkdWxlclN0YXRlIDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGVuYWJsZSB0aGUgdXNlIG9mIHhUYXNrR2V0U2NoZWR1bGVyU3RhdGUoKSBBUEkgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBjb2RlLgoKCiMjIyAzMC1BcHJpbC0yMDE0ICMjIwo9PT09PT09PT09PT09PT09PT09PT0KICArIGNtc2lzX29zLmM6IGFkZCBwcmVwcm9jZXNzb3IgY29tcGlsYXRpb24gY29uZGl0aW9uIHdoZW4gY2FsbGluZyBzb21lIEZyZWVSVE9TIEFQSXMsIHRvIGF2b2lkIGxpbmsKICAgICAgICAgICAgICAgIGVycm9ycyB3aXRoIE1ESy1BUk0gd2hlbiBzb21lIEZyZWVSVE9TIGZlYXR1cmVzIGFyZSBub3QgZW5hYmxlZCBpbiBGcmVlUlRPU0NvbmZpZy5oCgoKIyMjIDIyLUFwcmlsLTIwMTQgIyMjCj09PT09PT09PT09PT09PT09PT09PQogICsgQWRkIFRpY2tsZXMgbW9kZSBmb3IgQ00wIHBvcnQgKElBUiwgR0NDLCBSVkRTKS4KCgojIyMgMTgtRmVicnVhcnktMjAxNCAjIyMKPT09PT09PT09PT09PT09PT09PT09PT09CiAgICsgRnJlZVJUT1MgVjcuNi4wIGN1c3RvbWl6ZWQgdmVyc2lvbiBmb3IgU1RNMzJDdWJlIHNvbHV0aW9uLgoKCiAqIDxoMz48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMz4KICovCg==