ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9yeSBvZiBDaGFuZ2VzCgpWZXJzaW9uIDcuNS4yCgpEYW5pZWwgKDQgSmFudWFyeSAyMDAxKQotIEFzIEtldmluIFAgUm90aCBzdWdnZXN0ZWQsIEkndmUgYWRkZWQgdGV4dCB0byB0aGUgbWFuIHBhZ2UgZm9yIGV2ZXJ5IGNvbW1hbmQKICBsaW5lIG9wdGlvbiBhbmQgd2hhdCBoYXBwZW5zIHdoZW4geW91IHNwZWNpZnkgdGhhdCBvcHRpb24gbW9yZSB0aGFuCiAgb25jZS4gVGhhdCBoYXNuJ3QgYmVlbiBleGFjdGx5IGNyeXN0YWwgY2xlYXIgYmVmb3JlLgoKLSBNYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IHBvc3NpYmxlIHRvIHJ1biBmcm9tIG91dHNpZGUgdGhlIHNvdXJjZS10cmVlLiBGb3IKICBvZGQgcmVhc29ucyBJIGNhbid0IGJ1aWxkIGN1cmwgcHJvcGVybHkgb3V0c2lkZSB0aG91Z2guIEl0IGhhcyB0byBkbyB3aXRoCiAgY3VybCdzIGRlcGVuZGVuY2llcyBvbiBsaWJjdXJsLi4uCgotIEN1dCBvZmYgYWxsIG9sZGVyIChkYXRlZCAxOTk5IGFuZCBlYXJsaWVyKSBDSEFOR0VTIGVudHJpZXMgZnJvbSB0aGlzIGZpbGUuCiAgVGhlIG9sZGVyIHBpZWNlIGlzIG5hbWVkIENIQU5HRVMuMCBhbmQgaXMgYWRkZWQgdG8gdGhlIENWUyByZXBvc2l0b3J5IGluCiAgY2FzZSBhbnlvbmUgd291bGQgbmVlZCBpdC4KCi0gSSBhZGRlZCBhbm90aGVyIGZpbGUgJ0NWUy1JTkZPJyB0byB0aGUgQ1ZTLiBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dAogIGZpbGVzIGluIHRoZSBDVlMgdGhhdCBhcmVuJ3QgaW5jbHVkZWQgaW4gcmVsZWFzZSBhcmNoaXZlcyBhbmQgaG93IHRvIGJ1aWxkCiAgY3VybCB3aGVuIHlvdSBnZXQgdGhlIHNvdXJjZXMgb2ZmIENWUy4KCi0gVXBkYXRlZCBDT05UUklCVVRFIGFuZCBGQVEgZHVlIHRvIHRoZSBuZXcgbGljZW5zZS4KCkRhbmllbCAoMyBKYW51YXJ5IDIwMDEpCi0gUmVuYW1lZCBSRUFETUUubGliY3VybCB0byBMSUJDVVJMCgotIENoYW5nZWQgaGVhZGVycyBpbiBhbGwgc291cmNlcyBmaWxlcyB0byB0aGUgbmV3IGR1YWwgbGljZW5zZSBjb25jZXB0IG9mCiAgY3VybDogdXNlIHRoZSBNSVQvWCBkZXJpdmF0ZSBsaWNlbnNlICpvciogTVBMLiBUaGUgTEVHQUwgZmlsZSB3YXMgdXBkYXRlZAogIGFjY29yZGluZ2x5IGFuZCB0aGUgTVBMIDEuMSBhbmQgTUlUL1ggZGVyaXZhdGUgbGljZW5zZXMgYXJlIG5vdyBwYXJ0IG9mIHRoZQogIHJlbGVhc2UgYXJjaGl2ZS4KCkRhbmllbCAoMzAgRGVjZW1iZXIgMjAwMCkKLSBNYWRlIGFsbCBGVFAgY29tbWFuZHMgZ2V0IHNlbnQgd2l0aCB0aGUgdHJhaWxpbmcgQ1JMRiBpbiBvbmUgc2luZ2xlIHdyaXRlKCkKICBhcyBzcGxpdHRpbmcgdGhlbSB1cCBzZWVtcyB0byBjb25mdXNlIGF0IGxlYXN0IHNvbWUgZmlyZXdhbGxzIChGVy0xIGJlaW5nCiAgb25lIG1ham9yKS4KCkRhbmllbCAoMTkgRGVjZW1iZXIgMjAwMCkKLSBBZGRlZCBmaWxlIGRlc3JjaXB0b3IgYW5kIEZJTEUgaGFuZGxlIGxlYWsgZGV0ZWN0aW9uIHRvIHRoZSBtZW1kZWJ1ZyBzeXN0ZW0KICBhbmQgdGh1cyBJIGZvdW5kIGFuZCByZW1vdmVkIGEgZmlsZSBkZXNjcmlwdG9yIGxlYWthZ2UgaW4gdGhlIGZ0cCBwYXJ0cwogIHRoYXQgaGFwcGVuZWQgd2hlbiB5b3UgZGlkIFBPUlRlZCBkb3dubG9hZHMuCgotIEFkZGVkIGFuIGluY2x1ZGUgPHN0ZGlvLmg+IGluIDxjdXJsL2N1cmwuaD4gc2luY2UgaXQgdXNlcyBGSUxFICouCgpEYW5pZWwgKDEyIERlY2VtYmVyIDIwMDApCi0gTXVsdGlwbGUgVVJMIGRvd25sb2FkcyB3aXRoIC1PIHdhcyBzdGlsbCBidWdnaW5nLiBOb3QgYW55bW9yZSBJIHRoaW5rIG9yCiAgaG9wZSwgb3IgYXQgbGVhc3QgSSd2ZSB0cmllZC4uLiA6LU8KCi0gRnJhbmNvaXMgUGV0aXRqZWFuIGZpeGVkIGFub3RoZXIgLU8gcHJvYmxlbQoKVmVyc2lvbiA3LjUuMQoKRGFuaWVsICgxMSBEZWNlbWJlciAyMDAwKQotIENsZWFuZWQgdXAgYSBmZXcgb2YgdGhlIG1ha2VmaWxlcyB0byB1c2UgdW5peC1zdHlsZSBuZXdsaW5lcyBvbmx5LiBBcyBLZXZpbgogIFAgUm90aCBmb3VuZCBvdXQsIGF0IGxlYXN0IG9uZSBDVlMgY2xpZW50IGJlaGF2ZWQgd3JvbmdseSB3aGVuIGl0IGZvdW5kCiAgZGlmZmVyZW50IG5ld2xpbmUgY29udmVudGlvbnMgd2l0aGluIHRoZSBzYW1lIGZpbGUuCgotIEFsYmVydCBDaGluLUEtWW91bmcgY29ycmVjdGVkIHRoZSBMREZMQUdTIHVzZSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBmb3IKICB0aGUgU1NMIHN0dWZmLgoKRGFuaWVsICg2IERlY2VtYmVyIDIwMDApCi0gTWFzc2ltbyBTcXVpbGxhY2UgY29ycmVjdGx5IGRlc2NyaWJlZCBob3cgbGliY3VybCBjb3VsZCB1c2Ugc2Vzc2lvbiBpZHMgd2hlbgogIGRvaW5nIFNTTCBjb25uZWN0aW9ucy4KCi0gSmFtZXMgR3JpZmZpdGhzIGZvdW5kIG91dCB0aGF0IGN1cmwgd291bGQgY3Jhc2ggaWYgdGhlIGZpbGUgeW91IHNwZWNpZnkgd2l0aAogIC1vIGlzIHNob3J0ZXIgdGhhbiB0aGUgVVJMISBUaGlzIHRvb2sgc29tZSBob3VycyB0byBmdWxseSBodW50IGRvd24sIGJ1dCBpdAogIGlzIGZpeGVkIG5vdy4KCkRhbmllbCAoNSBEZWNlbWJlciAyMDAwKQotIEphZXBpbCBLaW0gc2VudCB1cyBtYWtlZmlsZXMgdGhhdCBidWlsZCBjdXJsIHVzaW5nIHRoZSBmcmVlIHdpbmRvd3MgYm9ybGFuZAogIGNvbXBpbGVyLiBUaGUgcm9vdCBtYWtlZmlsZSBub3cgYWNjZXB0cyAnbWFrZSBib3JsYW5kJyB0byBidWlsZCBjdXJsIHdpdGgKICB0aGF0IGNvbXBpbGVyLgoKLSBTdGVmYW4gUmFkbWFuIHBvaW50ZWQgb3V0IHRoYXQgdGhlIHRlc3QgbWFrZWZpbGVzIGRpZG4ndCB1c2UgdGhlIFBFUkwKICB2YXJpYWJsZSB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0cyBmaWd1cmUgb3V0LiBBY3R1YWxseSwgeW91IHN0aWxsIG5lZWQKICBwZXJsIGluIHRoZSBwYXRoIGZvciB0aGUgdGVzdCBzdWl0ZSB0byBydW4gb2suCgotIFJpY2ggR3JheSBmb3VuZCBudW1lcm91cyBwb3J0YWJpbGl0eSBwcm9ibGVtczoKICAqIFRoZSBTQ08gY29tcGlsZXIgZ290IGFuIGVycm9yIG9uIHRoZSBnZXRwYXNzX3IoKSBwcm90b3R5cGUgaW4gZ2V0cGFzcy5oCiAgICBzaW5jZSB0aGUgY3VybCBvbmUgZGlmZmVyZWQgZnJvbSB0aGUgU0NPIG9uZQogICogVGhlIEhQVVggY29tcGlsZXIgZ290IGFuIGVycm9yIGJlY2F1c2Ugb2YgaG93IGN1cmwgZGlkIHRoZSBzaWdhY3Rpb24KICAgIHN0dWZmIGFuZCB1c2VkIGEgZGVmaW5lIEhQVVggZG9lc24ndCBoYXZlIChvciBuZWVkKS4KICAqIEEgZmV3IG1vcmUgcHJvYmxlbXMgcmVtYWluIHRvIGJlIHJlc2VhcmNoZWQuCgotIFBhdWwgSGFycmluZ3RvbiBleHBlcmllbmNlZCBhIGNvcmUgZHVtcCB1c2luZyBodHRwcy4gTm90IG11Y2ggZGV0YWlscyB5ZXQuCgpEYW5pZWwgKDQgRGVjZW1iZXIgMjAwMCkKLSBK9nJuIEhhcnRyb3RoIGZpeGVkIGEgcHJvYmxlbSB3aXRoIG11bHRpcGxlIFVSTHMgYW5kIC1vLy1PLgoKVmVyc2lvbiA3LjUKCkRhbmllbCAoMSBEZWNlbWJlciAyMDAwKQotIENyYWlnIERhdmlzb24gZ2F2ZSB1cyBoaXMgdXBkYXRlcyBvbiB0aGUgVkMrKyBtYWtlZmlsZXMsIHNvIG5vdyBjdXJsIHNob3VsZAogIGJ1aWxkIGZpbmUgd2l0aCB0aGUgTWljcm9zb2Z0IGNvbXBpbGVyIG9uIHdpbmRvd3MgdG9vLgoKLSBGaXhlZCB0aGUgbGliY3VybCB2ZXJzaW9uaW5nIHNvIHRoYXQgd2UgZG9uJ3QgcnVpbiBvbGQgcHJvZ3JhbXMgd2hlbgogIHJlbGVhc2luZyBuZXcgc2hhcmVkIGxpYnJhcnkgaW50ZXJmYWNlcy4KCkRhbmllbCAoMzAgTm92ZW1iZXIgMjAwMCkKLSBSZW5hbWVkIGRvY3MvUkVBRE1FLmN1cmwgdG8gZG9jcy9NQU5VQUwgdG8gYmV0dGVyIHJlZmxlY3Qgd2hhdCB0aGUgZG9jdW1lbnQKICBhY3R1YWxseSBjb250YWlucy4KCkRhbmllbCAoMjkgTm92ZW1iZXIgMjAwMCkKLSBJIHJlbW92ZWQgYSBidW5jaCBvZiAnI2lmIDAnIHNlY3Rpb25zIGZyb20gdGhlIGNvZGUuIFRoZXkgb25seSBtYWtlIHRoaW5ncwogIGhhcmRlciB0byBmb2xsb3cuIEFmdGVyIGFsbCwgd2UgZG8gaGF2ZSBhbGwgb2xkZXIgdmVyc2lvbnMgaW4gdGhlIENWUy4KClZlcnNpb24gNy41LXByZTUKCkRhbmllbCAoMjggTm92ZW1iZXIgMjAwMCkKLSBJIGZpbGxlZCBpbiBtb3JlIGVycm9yIGNvZGVzIGluIHRoZSBtYW4gcGFnZSBlcnJvciBjb2RlIGxpc3QgdGhhdCBoYWQgYmVlbgogIGxhZ2dpbmcuCgotIEphbWVzIEdyaWZmaXRocyBtYWlsZWQgbWUgYSBmaW5lIHBhdGNoIHRoYXQgaW50cm9kdWNlcyB0aGUgQ1VSTE9QVF9NQVhSRURJUlMKICBsaWJjdXJsIG9wdGlvbi4gV2hlbiB1c2VkLCBpdCdsbCBwcmV2ZW50IGxvY2F0aW9uIGZvbGxvd2luZyBtb3JlIHRoYW4gdGhlCiAgc2V0IG51bWJlciBvZiB0aW1lcy4gSXQgaXMgdXNlZnVsIHRvIGJyZWFrIG91dCBvZiBlbmRsZXNzIHJlZGlyZWN0LWxvb3BzLgoKRGFuaWVsICgyNyBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIHR3byB0ZXN0IGNhc2VzIGZvciBmaWxlOi8vLgoKRGFuaWVsICgyMiBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIHRoZSBsaWJjdXJsIENVUkxPUFRfRklMRVRJTUUgc2V0b3B0LCB3aGVuIHNldCBpdCB0cmllcyB0byBnZXQgdGhlCiAgbW9kaWZpZWQgdGltZSBvZiB0aGUgcmVtb3RlIGRvY3VtZW50LiBUaGlzIGlzIGEgc3BlY2lhbCBvcHRpb24gc2luY2UgaXQKICBpbnZvbHZlcyBhbiBleHRyYSBzZXQgb2YgY29tbWFuZHMgb24gRlRQIHNlcnZlcnMuIChVc2luZyB0aGUgTURUTSBjb21tYW5kCiAgd2hpY2ggaXMgbm90IGluIHRoZSBSRkM5NTkpCgogIGN1cmxfZWFzeV9nZXRpbmZvKCkgZ290IGEgY29ycmVzcG9uZGluZyBDVVJMSU5GT19GSUxFVElNRSB0byBnZXQgdGhlIHRpbWUKICBhZnRlciBhIHRyYW5zZmVyLiBJdCdsbCByZXR1cm4gYSB6ZXJvIGlmIENVUkxPUFRfRklMRVRJTUUgd2Fzbid0IHVzZWQgb3IgaWYKICB0aGUgdGltZSB3YXNuJ3QgcG9zc2libGUgdG8gZ2V0LgoKICAtLWhlYWQvLUkgdXNlZCBvbiBhIEZUUCBzZXJ2ZXIgd2lsbCBub3cgcHJlc2VudCBhICdMYXN0LU1vZGlmaWVkOicgaGVhZGVyCiAgaWYgY3VybCBjb3VsZCBnZXQgdGhlIHRpbWUgb2YgdGhlIHNwZWNpZmllZCBmaWxlLgoKLSBBZGRlZCB0aGUgb3B0aW9uICctLWNhY2VydCBbZmlsZV0nIHRvIGN1cmwsIHdoaWNoIGFsbG93cyBhIHNwZWNpZmllZCBQRU0KICBmaWxlIHRvIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBwZWVyJ3MgY2VydGlmaWNhdGUgd2hlbiBkb2luZyBIVFRQUwogIGNvbm5lY3Rpb25zLiBUaGlzIGhhcyBiZWVuIHJlcXVlc3RlZCwgcmF0aGVyIHJlY2VudGx5IGJ5IEh1bGthIEJvaHVzbGF2IGJ1dAogIG90aGVycyBoYXZlIGFza2VkIGZvciBpdCBiZWZvcmUgYXMgd2VsbC4KCkRhbmllbCAoMjEgTm92ZW1iZXIgMjAwMCkKLSBOdW1lcm91cyBmaXhlcyB0aGUgdGVzdCBzdWl0ZSBoYXMgYnJvdWdodCBpbnRvIHRoZSBkYXlsaWdodDoKCiAgICogY3VybF91bmVzY2FwZSgpIGNvdWxkIHJldHVybiBhIHRvbyBsb25nIHN0cmluZwogICAqIG9uIGZ0cCB0cmFuc2ZlciBmYWlsdXJlcywgdGhlcmUgY291bGQgYmUgbWVtb3J5IGxlYWtzCiAgICogZnRwIENXRCBjb3VsZCB1c2UgYmFkIGRpcmVjdG9yeSBuYW1lcwogICAqIG1lbWRlYnVnIG5vdyB1c2VzIHRoZSBtcHJpbnRmKCkgcm91dGluZXMgZm9yIGJldHRlciBwb3J0YWJpbGl0eQogICAqIGZyZWUoTlVMTCkgcmVtb3ZlZCB3aGVuIGRvaW5nIHJlc3VtZWQgdHJhbnNmZXJzCgotIEFkZGVkIGEgYnVuY2ggb2YgdGVzdCBjYXNlcyBmb3IgRlRQLgoKLSBHZW5lcmFsIGNsZWFudXBzIHRvIG1ha2UgbGVzcyB3YXJuaW5ncyB3aXRoIGdjYyAtV2FsbCAtcGVkYW50aWMuCgotIEkgbWFkZSB0aGUgdGVzdHMvZnRwc2VydmVyLnBsIHdvcmsgd2l0aCB0aGUgbW9zdCBjb21tb25seSB1c2VkIGZ0cAogIG9wZXJhdGlvbnMuIFBPUlQsIFBBU1YsIFJFVFIsIFNUT1IsIExJU1QsIFNJWkUsIFVTRVIsIFBBU1MgYWxsIHdvcmsgbm93LiBOb3cKICBhbGwgSSBoYXZlIHRvIGRvIGlzIGludGVncmF0ZSB0aGUgZnRwIHNlcnZlciBkb2luZ3MgaW4gdGhlIHJ1bnRlc3RzLnBsCiAgc2NyaXB0IHNvIHRoYXQgZnRwIHRlc3RzIGNhbiBiZSBydW4gdGhlIHNhbWUgd2F5IGh0dHAgdGVzdHMgYWxyZWFkeSBydW4uCgpEYW5pZWwgKDIwIE5vdmVtYmVyIDIwMDApCi0gTWFkZSBsaWJjdXJsIGNhcGFibGUgb2YgZGVhbGluZyB3aXRoIGFueS1sZW5ndGggVVJMcy4gVGhlIGZvcm1lciBsaW1pdCBvZgogIDQwOTYgYnl0ZXMgd2FzIGEgYml0IGFubm95aW5nIHdoZW4gcGVvcGxlIHdhbnRlZCB0byB1c2UgY3VybCB0byByZWFsbHkgbWFrZQogIGxpZmUgdG91Z2ggb24gYSB3ZWIgc2VydmVyLiBOb3csIHRoZSBjb21tYW5kIGxpbmUgbGltaXQgaXMgdGhlIG1vc3QgYW5ub3lpbmcKICBidXQgdGhhdCBjYW4gYmUgY2lyY3VtdmVudGVkIGJ5IHVzaW5nIGEgY29uZmlnIGZpbGUuCgogIE5PVEU6IHRoZXJlIGlzIHN0aWxsIGEgNDA5Ni1ieXRlIGxpbWl0IG9uIFVSTHMgZXh0cmFjdGVkIGZyb20gTG9jYXRpb246CiAgaGVhZGVycy4KCi0gQ29ycmVjdGVkIHRoZSBzcGVsbGluZyBvZiAncmVzb2x2ZScgaW4gdHdvIGVycm9yIG1lc3NhZ2VzLgoKLSBBbGV4YW5kZXIgS291cmFrb3MgcG9zdGVkIGEgYnVnIHJlcG9ydCBhbmQgYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCBpdCEgSXQKICB0dXJuZWQgb3V0IHRoYXQgbHlueCBhbmQgd2dldCBzdXBwb3J0IGxvd2VyY2FzZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lcwogIHdoZXJlIGN1cmwgb25seSBsb29rZWQgZm9yIHRoZSB1cHBlcmNhc2UgdmVyc2lvbnMuIE5vdyBjdXJsIHdpbGwgdXNlIHRoZQogIGxvd2VyY2FzZSB2ZXJzaW9ucyBpZiB0aGV5IGV4aXN0LCBidXQgaWYgdGhleSBkb24ndCwgaXQnbGwgdXNlIHRoZSB1cHBlcmNhc2UKICB2ZXJzaW9ucy4KCkRhbmllbCAoMTcgTm92ZW1iZXIgMjAwMCkKLSBjdXJsX2Zvcm1mcmVlKCkgd2FzIGFkZGVkLiBIb3cgY29tZSBubyBvbmUgbWlzc2VkIHRoYXQgb25lIGJlZm9yZT8gSSByYW4gdGhlCiAgdGVzdCBzdWl0ZSB3aXRoIHRoZSBtYWxsb2MgZGVidWcgZW5hYmxlZCBhbmQgZ290IGxvdHMgb2YgIm5pY2UiIHdhcm5pbmdzIG9uCiAgbWVtb3J5IGxlYWtzLiBUaGUgbW9zdCBzZXJpb3VzIG9uZSB3YXMgdGhpcy4gVGhlcmUgd2VyZSBhbHNvIGxlYWtzIGluIHRoZQogIGNvb2tpZSBoYW5kbGluZywgYW5kIGEgZmV3IGVycm9ycyB3aGVuIGN1cmwgZmFpbGVkIHRvIGNvbm5lY3QgYW5kIHNpbWlsYXIKICB0aGluZ3MuIE1vcmUgdGVzdHMgY2FzZXMgd2VyZSBhZGRlZCB0byBjb3ZlciB1cCBhbmQgdG8gdmVyaWZ5IHRoYXQgdGhlc2UKICBwcm9ibGVtcyBoYXZlIGJlZW4gcmVtb3ZlZC4KCi0gTXVjaG8gdXBkYXRlZCBjb25maWcgZmlsZSBwYXJzZXIgKEknbSBkZWFkIHRpcmVkIG9mIGFsbCB0aGUgYnVnIHJlcG9ydHMgYW5kCiAgd2VpcmQgYmVoYXZpb3VyIEkgZ2V0IG9uIHRoZSBmb3JtZXIgb25lKS4gSXQgd29ya3Mgc2xpZ2h0bHkgZGlmZmVyZW50bHkgbm93LAogIGFsdGhvdWdoIEkgZG91YnQgbWFueSBwZW9wbGUgd2lsbCBub3RpY2UgdGhlIGRpZmZlcmVuY2VzLiBUaGUgbWFpbgogIGRpZmZlcmVuY2UgYmVpbmcgdGhhdCBpZiB5b3UgdXNlIG9wdGlvbnMgdGhhdCByZXF1aXJlIHBhcmFtZXRlcnMsIHRoZXkgbXVzdAogIGJvdGggYmUgc3BlY2lmaWVkIG9uIHRoZSBzYW1lIGxpbmUuIFdpdGggdGhpcyBuZXcgcGFyc2VyLCB5b3UgY2FuIGFsc28KICBzcGVjaWZ5IGxvbmcgb3B0aW9ucyB3aXRob3V0ICctLScgYW5kIHlvdSBtYXkgc2VwYXJhdGUgb3B0aW9ucyBhbmQKICBwYXJhbWV0ZXJzIHdpdGggOiBvciA9LiBJdCBtYWtlcyBhIGNvbmZpZyBmaWxlIGxpbmUgY291bGQgbG9vayBsaWtlOgoKICAgICAgICB1c2VyLWFnZW50ID0gImZvb2JhciBhbmQgc29tZXRoaW5nIgoKICBQYXJhbWV0ZXJzIHdpdGhpbiBxdW90ZXMgbWF5IGNvbnRhaW4gc3BhY2VzLiBXaXRob3V0IHF1b3RlcywgdGhleSdyZQogIGV4cGVjdGVkIHRvIGJlIGEgc2luZ2xlIG5vbi1zcGFjZSB3b3JkLgoKICBIYWQgdG8gcGF0Y2ggdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudCBwYXJzZXIgYSBsaXR0bGUgdG8gbWFrZSB0aGlzIHdvcmsuCgotIEFkZGVkIC0tdXJsIGFzIGFuIG9wdGlvbiB0byBhbGxvdyB0aGUgVVJMIHRvIGJlIHNwZWNpZmllZCB0aGlzIHdheS4gSXQgbWFrZXMKICB3YXkgbmljZXIgY29uZmlnIGZpbGVzLiBUaGUgcHJldmlvdXMgd2F5IG9mIHNwZWNpZnlpbmcgVVJMcyBpbiB0aGUgY29uZmlnCiAgZmlsZSBkb2Vzbid0IHdvcmsgYW55bW9yZS4KCkRhbmllbCAoMTUgTm92ZW1iZXIgMjAwMCkKLSBVc2luZyBjZXJ0YWluIGNoYXJhY3RlcnMgaW4gdXNlcm5hbWVzIG9yIHBhc3N3b3JkcyBmb3IgSFRUUCBhdXRoZW50aWNhdGlvbgogIGZhaWxlZC4gVGhpcyB3YXMgZHVlIHRvIHRoZSBtcHJpbnRmKCkgdGhhdCBoYWQgYSBzaWxseSBjaGVjayBmb3IgbGV0dGVycywKICBhbmQgaWYgdGhleSB3ZXJlbid0IGlzcHJpbnQoKSB0aGV5IHdlcmVuJ3Qgb3V0cHV0ZWQgImFzLWlzIi4gVGhpcyBjYXVzZWQKICBwYXNzd29yZHMgYW5kIHVzZXJuYW1lcyB1c2luZyAnpycgKGZvciBleGFtcGxlKSB0byBmYWlsLgoKVmVyc2lvbiA3LjQuMgoKRGFuaWVsICgxNSBOb3ZlbWJlciAyMDAwKQotICd0ZXN0cy9ydW50ZXN0cy5wbCcgbm93IHNvcnRzIHRoZSB0ZXN0IGNhc2VzIHByb3Blcmx5IHdoZW4gJ2FsbCcgaXMgdXNlZC4KCkRhbmllbCAoMTQgTm92ZW1iZXIgMjAwMCkKLSBJIGZlbGwgb3ZlciB0aGUgZHJhZnQtaWV0Zi1mdHBleHQtbWxzdC0xMi50eHQgSW50ZXJuZXQgRHJhZnQgdGl0bGVkCiAgIkV4dGVuc2lvbnMgdG8gRlRQIiB0aGF0IGNvbnRhaW5zIGEgZGVmaW5lZCB3YXkgaG93IHRoZSBmdHAgY29tbWFuZCBTSVpFCiAgY291bGQgYmUgYXNzdW1lZCB0byB3b3JrLgoKLSBMYXVyZW50IFBhcGllciBwb3N0ZWQgYSBidWcgcmVwb3J0IGFib3V0IHVzaW5nICItQyAtIiBhbmQgRlRQIHVwbG9hZGluZyBhCiAgZmlsZSB0aGF0IGlzbid0IHByc2VudCBvbiB0aGUgc2VydmVyLiBUaGUgc2VydmVyIG1pZ2h0IHRoZW4gcmV0dXJuIGEgNTUwIGFuZAogIGN1cmwgd2lsbCBmYWlsLiBTaG91bGQgaXQgaW5zdGVhZCBhcyBMYXVyZW50IFBhcGllciBzdWdnZXN0cywgc3RhcnQKICB1cGxvYWRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIGFzIGEgbm9ybWFsIHVwbG9hZD8KCkRhbmllbCAoMTMgTm92ZW1iZXIgMjAwMCkKLSBGaXhlZCBhIGNyYXNoIHdpdGggdGhlIGZvbGxvd2xvY2F0aW9uIGNvdW50ZXIuCgotIFdoaWxlIHdyaXRpbmcgdGVzdCBjYXNlcyBmb3IgdGhlIHRlc3Qgc3VpdGUsIEkgZGlzY292ZXJlZCBhbiBvbGQgbGltaXRhdGlvbgogIHRoYXQgcHJldmVudGVkIC1vIGFuZCAtVCB0byBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUuIEkgcmVtb3ZlZCB0aGlzCiAgaW1tZWRpYXRlbHkgYXMgdGhpcyBoYXMgbm8gcmVsZXZhbmNlIGluIHRoZSBjdXJyZW50IGxpYmN1cmwuCiAgCi0gQ2hyaXMgRmFoZXJ0eSBmaXhlZCBhIGZyZWUtdHdpY2UgcHJvYmxlbSBpbiBsaWIvZmlsZS5jCgotIEkgZml4ZWQgdGhlIHBlcmwgaHR0cCBzZXJ2ZXIgcHJvYmxlbSBpbiB0aGUgdGVzdCBzdWl0ZS4KClZlcnNpb24gNy40LjIgcHJlNAoKRGFuaWVsICgxMCBOb3ZlbWJlciAyMDAwKQotIEkndmUgKGZpbmFsbHkpIHN0YXJ0ZWQgd29ya2luZyBvbiB0aGUgY3VybCB0ZXN0IHN1aXRlLiBJdCBpcyBpbiB0aGUgbmV3CiAgdGVzdHMvIGRpcmVjdG9yeS4gSXQgcmVxdWlyZXMgc2ggYW5kIHBlcmwuIFRoZXJlJ3MgYSBUQ1Agc2VydmVyIGluIHBlcmwgYW5kCiAgbW9zdCBvZiB0aGUgb3RoZXIgc3R1ZmYgcnVubmluZyBhIHByZXR0eSBzaW1wbGUgc2hlbGwgc2NyaXB0LgoKICBJJ3ZlIG9ubHkgbWFkZSBmb3VyIHRlc3QgY2FzZXMgc28gZmFyLCBidXQgaXQgcHJvdmVzIHRoZSBzeXN0ZW0gY2FuIHdvcmsuCgotIExhdXJlbnQgUGFwaWVyIG5vdGljZWQgdGhhdCBjdXJsIGRpZG4ndCBzZXQgVFlQRSB3aGVuIGRvaW5nIC0taGVhZCBjaGVja3MKICBmb3Igc2l6ZXMgb24gRlRQIHNlcnZlcnMuIFNvbWUgc2VydmVycyBzZWVtIHRvIHJldHVybiBkaWZmZXJlbnQgc2l6ZXMKICBkZXBlbmRpbmcgb24gd2hldGhlciBBU0NJSSBvciBCSU5BUlkgaXMgdXNlZCEKCi0gTGF1cmVudCBQYXBpZXIgZGV0ZWN0ZWQgdGhhdCBpZiB5b3UgYXBwZW5kZWQgYSBGVFAgdXBsb2FkIGFuZCBldmVyeXRoaW5nIHdhcwogIGFscmVhZHkgdXBsb2FkZWQsIGN1cmwgd291bGQgaGFuZy4KCi0gQW5ndXMgTWFja2F5J3MgZ2V0cGFzc19yKCkgaW4gbGliL2dldHBhc3MuYyBpcyBub3cgY29tcGxpYW50IHdpdGggdGhlCiAgZ2V0cGFzc19yKCkgZnVuY3Rpb24gaXQgc2VlbXMgc29tZSBzeXN0ZW1zIGFjdHVhbGx5IGhhdmUuCiAgCi0gVmVua2F0YXJhbWFuYSBNb2trYXBhdGkgZGV0ZWN0ZWQgYSBidWcgaW4gdGhlIGNvb2tpZSBwYXJzZXIgYW5kIGNvcnJlY3RlZAogIGl0LiAgSWYgdGhlIGNvb2tpZSB3YXMgc2V0IGZvciB0aGUgZnVsbCBob3N0IG5hbWUgKGRvbWFpbj1mdWxsLmhvc3QuY29tKSwKICB0aGUgY29va2llIHdhcyBuZXZlciBzZW50IGJhY2sgYmVjYXVzZSBvZiBhIGZhdWx0eSBsZW5ndGggY29tcGFyaXNvbiBiZXR3ZWVuCiAgdGhlIHNldCBkb21haW4gbGVuZ3RoIGFuZCB0aGUgY3VycmVudCBob3N0IG5hbWUuCgpEYW5pZWwgKDkgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCBhIGNvbmZpZ3VyZSBjaGVjayBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbHNvY2tldCAoT1MvMiBzZWVtcyB0byBuZWVkCiAgaXQpLiBBZGRlZCBhIGNoZWNrIGZvciBSU0FnbHVlL3JzYXJlZiBmb3IgdGhlIGNhc2VzIHdoZXJlIGxpYmNyeXB0byBpcyBmb3VuZAogIGJ1dCBsaWJzc2wgaXNuJ3QuIEkgaGF2ZW4ndCB2ZXJpZmllZCB0aGlzIGZpeCB5ZXQgdGhvdWdoLCBhcyBJIGhhdmUgbm8KICBzeXN0ZW0gdGhhdCByZXF1aXJlcyB0aG9zZSBsaWJzIHRvIGJ1aWxkLgogIApWZXJzaW9uIDcuNC4yIHByZTMKCkRhbmllbCAoNyBOb3ZlbWJlciAyMDAwKQotIFJlbW92ZWQgcGVycm9yKCkgb3V0cHV0cyBmcm9tIGdldHBhc3MuYy4gQW5ndXMgTWFja2F5IGFsc28gYWdyZWVkIHRvIGEKICBzbGlnaHRseSBtb2RpZmllZCBsaWNlbnNlIG9mIHRoZSBnZXRwYXNzLmMgZmlsZSBhcyB0aGUgcHJvdG90eXBlIHdhcyBjaGFuZ2VkLgoKRGFuaWVsICg2IE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgcG9zc2liaWxpdHkgdG8gc2V0IGEgcGFzc3dvcmQgY2FsbGJhY2sgdG8gdXNlIGluc3RlYWQgb2YgdGhlIGJ1aWx0LWluLgogIFRoZXkncmUgY29udHJvbGVkIHdpdGggY3VybF9lYXN5X3NldG9wdCgpIG9mIGNvdXJzZSwgdGhlIHRhZ3MgYXJlCiAgQ1VSTE9QVF9QQVNTV0RGVU5DVElPTiBhbmQgQ1VSTE9QVF9QQVNTV0REQVRBLgoKLSBVc2VkIFQuIEJoYXJhdGgncyB0aGlua2luZyBhbmQgZml4ZWQgdGhlIHRpbWVycyB0aGF0IHNob3dlZCB0ZXJyaWJseSB3cm9uZwogIHRpbWVzIHdoZW4gbG9jYXRpb246IGhlYWRlcnMgd2VyZSBmb2xsb3dlZC4KCi0gRW1tYW51ZWwgVHljaG9uIGRpc2NvdmVyZWQgdGhhdCBjdXJsIGRpZG4ndCByZWFsbHkgbGlrZSB1c2VyIG5hbWVzIG9ubHkgaW4KICB0aGUgVVJMLiBJIGNvcnJlY3RlZCB0aGlzIGFuZCBJIGFsc28gZml4ZWQgdGhlIHNpbmNlIGxvbmcgbGl2aW5nIHByb2JsZW0KICB3aXRoIFVSTCBlbmNvZGVkIHVzZXIgbmFtZXMgYW5kIHBhc3N3b3JkcyBpbiB0aGUgVVJMcy4gVGhleSBzaG91bGQgd29yayBub3cuCiAgCkRhbmllbCAoMiBOb3ZlbWJlciAyMDAwKQotIFdoZW4gSSBhZGRlZCAtLWludGVyZmFjZSwgdGhlIG5ldyBlcnJvciBjb2RlIHRoYXQgd2FzIGFkZGVkIHdpdGggaXQgd2FzCiAgaW5zZXJ0ZWQgaW4gdGhlIHdyb25nIHBsYWNlIGFuZCB0aHVzIGFsbCBlcnJvciBjb2RlcyBmcm9tIDM1IGFuZCB1cHdhcmRzIGdvdAogIGluY3JlYXNlZCBvbmUgc3RlcC4gVGhpcyBpcyBub3cgY29ycmVjdGVkLCB3ZSdyZSBiYWNrIGF0IHRoZSBwcmV2aW91cwogIG51bWJlcnMuIEFsbCBuZXcgZXhpdCBjb2RlcyBzaG91bGQgYmUgYWRkZWQgYXQgdGhlIGVuZC4KCkRhbmllbCAoMSBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIGEgY2hlY2sgZm9yIHNpZ25hbCgpIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHNvIHRoYXQgaWYgc2lnYWN0aW9uKCkKICBpc24ndCBwcmVzZW50LCB3ZSBjYW4gdXNlIHNpZ25hbCgpIGluc3RlYWQuCgotIEknbSBoYXZpbmcgYSBsaWNlbnNlIGRpc2N1c3Npb24gZ29pbmcgb24gcHJpdmF0ZWx5LiBUaGUgaXNzdWUgaXMgeWV0IGFnYWluCiAgR1BMLWxpY2Vuc2VkIHByb2dyYW1zIHRoYXQgaGF2ZSBwcm9ibGVtcyB3aXRoIE1QTC4gSSBhbSBsZWFuaW5nIHRvd2FyZHMKICBtYWtpbmcgYSBraW5kIG9mIGR1YWwtbGljZW5zZSB0aGF0IHdpbGwgc29sdmUgdGhpcyBvbmNlIGFuZCBmb3IgYWxsLi4uCgpEYW5pZWwgKDMxIE9jdG9iZXIgMjAwMCkKLSBBZGRlZCB0aGUgcGFja2FnZXMvIGRpcmVjdG9yeS4gSSBpbnRlbmQgdG8gbGV0IHRoaXMgY29udGFpbiBzb21lIGRvY3MgYW5kCiAgdGVtcGxhdGVzIG9uIGhvdyB0byBnZW5lcmF0ZSBjdXN0b20tZm9ybWF0IHBhY2thZ2VzIGZvciB2YXJpb3VzIHBsYXRmb3Jtcy4KICBJJ3ZlIG5vdyByZW1vdmVkIHRoZSBSUE0gcmVsYXRlZCBjdXJsLnNwZWMgZmlsZXMgZnJvbSB0aGUgYXJjaGl2ZSByb290LgoKRGFuaWVsICgzMCBPY3RvYmVyIDIwMDApCi0gVC4gQmhhcmF0aCBicm91Z2h0IGEgc2V0IG9mIHBhdGNoZXMgdGhhdCBicmluZyBuZXcgZnVuY3Rpb25hbGl0eSB0bwogIGN1cmxfZWFzeV9nZXRpbmZvKCkgYW5kIGN1cmxfZWFzeV9zZXRvcHQoKS4gTm93IHlvdSBjYW4gcmVxdWVzdCBwZWVyCiAgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIHdpdGggdGhlICpzZXRvcHQoKSBDVVJMT1BUX1NTTF9WRVJJRllQRUVSIG9wdGlvbgogIGFuZCB0aGVuIHVzZSB0aGUgQ1VSTE9QVF9DQUlORk8gdG8gc2V0IHRoZSBjZXJ0aWZpY2F0ZSB0byB2ZXJpZnkgdGhlIHJlbW90ZQogIHBlZXIgYWdhaW5zdC4gQWZ0ZXIgYW4gc3VjaCBhbiBvcGVyYXRpb24gd2l0aCBhIHZlcmlmaWNhdGlvbiByZXF1ZXN0LCB0aGUKICAqX2dldGluZm8oKSBvcHRpb24gQ1VSTElORk9fU1NMX1ZFUklGWVJFU1VMVCB3aWxsIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dAogIHdoZXRoZXIgdGhlIHZlcmlmaWNhdGlvbiBzdWNjZWVkZWQgb3Igbm90LiAgCgpEYW5pZWwgKDI3IE9jdG9iZXIgMjAwMCkKLSBHZW9yZyBIb3JuIGJyb3VnaHQgdXMgYSBzcGxlbmRpZCBwYXRjaCB0aGF0IHNvbHZlcyB0aGUgbG9uZy1zdGFuZGluZwogIGFubm95aW5nIHByb2JsZW0gd2l0aCB0aW1lb3V0cyB0aGF0IG1hZGUgY3VybCBleGl0IHdpdGggc2lsbHkgZXhpdCBjb2RlcwogICh3aGljaCBhcyBiZWVuIGNvbW1lbnRlZCBvdXQgbGF0ZWx5KS4gVGhpcyBzb2x1dGlvbiBpcyBzaWdhY3Rpb24oKSBiYXNlZCBhbmQKICBvZiBjb3Vyc2UgdGhlbiBvbmx5IHdvcmtzIGZvciB1bml4ZXMgKGFuZCBvbmx5IHRob3NlIHVuaXhlcyB0aGF0IGFjdHVhbGx5CiAgaGF2ZSB0aGUgc2lnYWN0aW9uKCkgZnVuY3Rpb24pLgoKRGFuaWVsICgyNiBPY3RvYmVyIDIwMDApCi0gQmr2cm4gU3RlbmJlcmcgc3VwcGxpZWQgYSBwYXRjaCB0aGF0IGZpeGVkIHRoZSBmbGF3IG1lbnRpb25lZCBieSBLZXZpbiBSb3RoCiAgdGhhdCBtYWRlIHRoZSBwYXNzd29yZCBnZXQgZWNob2VkIHdoZW4gcHJvbXB0ZWQgZm9yIGludGVyYWN0aXZlbHkuIFRoZQogIGdldHBhc3MoKSBmdW5jdGlvbiAobm93IGtub3duIGFzIG15X2dldHBhc3MoKSkgd2FzIGFsc28gZml4ZWQgdG8gbm90IHVzZSBhbnkKICBzdGF0aWMgYnVmZmVycy4gVGhpcyBhbHNvIG1lYW5zIHdlIGNhbm5vdCB1c2UgdGhlICJzdGFuZGFyZCIgZ2V0cGFzcygpCiAgZnVuY3Rpb24gZXZlbiBmb3IgdGhvc2Ugc3lzdGVtcyB0aGF0IGhhdmUgaXQsIHNpbmNlIGl0IGlzbid0IHRocmVhZC1zYWZlLgogIAotIEtldmluIFJvdGggZm91bmQgb3V0IHRoYXQgaWYgeW91J2Qgd3JpdGUgYSBjb25maWcgZmlsZSB3aXRoICctdiB1cmwnLCB0aGUKICB1cmwgd291bGQgbm90IGJlIHVzZWQgYXMgImRlZmF1bHQgVVJMIiBhcyBkb2N1bWVudGVkLCBhbHRob3VnaCBpZiB5b3Ugd3JvdGUKICBpdCAndXJsIC12JyBpdCB3b3JrZWQhIFRoaXMgaGFzIGJlZW4gY29ycmVjdGVkIG5vdy4KCi0gS2V2aW4gUm90aCdzIGlkZWEgb2YgdXNpbmcgbXVsdGlwbGUgLWQgb3B0aW9ucyBvbiB0aGUgc2FtZSBjb21tYW5kIGxpbmUgd2FzCiAganVzdCBicmlsbGlhbnQsIGFuZCBJIGNvdWxkbid0IHJlYWxseSB0aGluayBvZiBhbnkgcmVhc29uIHdoeSB3ZSBzaG91bGRuJ3QKICBzdXBwb3J0IGl0ISBUaGUgYXBwZW5kIGZ1bmN0aW9uIGFsd2F5cyBhcHBlbmQgJyYnIGFuZCB0aGVuIHRoZSBuZXcgLWQKICBjaHVuay4gVGhpcyBlbmFibGVzIGNvbnN0cnVjdHMgbGlrZSB0aGUgZm9sbG93aW5nOgoKICAgICAgICBjdXJsIC1kIG5hbWU9ZGFuaWVsIC1kIGFnZT11bmtub3duIGZvb2JhcnNpdGUuY29tCgpEYW5pZWwgKDI0IE9jdG9iZXIgMjAwMCkKLSBJIGZpeGVkIHRoZSBsaWIvbWVtZGVidWcuYyBzb3VyY2Ugc28gdGhhdCBpdCBjb21waWxlcyBvbiBMaW51eCBhbmQgb3RoZXIKICBzeXN0ZW1zLiBJdCB3aWxsIGJlIHVzZWZ1bCBvbmUgZGF5IHdoZW4gc29tZW9uZSBlbHNlIGJ1dCBtZSB3YW50cyB0byBydW4gdGhlCiAgbWVtb3J5IGRlYnVnZ2luZyBzeXN0ZW0uCgpEYW5pZWwgKDIzIE9jdG9iZXIgMjAwMCkKLSBJIG1vZGlmaWVkIHRoZSBtYWtldGd6IGFuZCBjb25maWd1cmUgc2NyaXB0cywgc28gdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdAogIHdpbGwgZmV0Y2ggdGhlIHZlcnNpb24gbnVtYmVyIGZyb20gdGhlIGluY2x1ZGUvY3VybC9jdXJsLmggaGVhZGVyIGZpbGVzLCBhbmQKICB0aGVuIHRoZSBtYWtldGd6IGRvZXNuJ3QgaGF2ZSB0byByZWJ1aWxkIHRoZSBjb25maWd1cmUgc2NyaXB0IHdoZW4gSSBidWlsZAogIHJlbGVhc2UtYXJjaGl2ZXMuCgotIEJq9nJuIFN0ZW5iZXJnIGFuZCBMaW51cyBOaWVsc2VuIGNvcnJlY3RseSBwb2ludGVkIG91dCB0aGF0IGN1cmwgd2FzIHNpbGx5CiAgZW5vdWdoIHRvIG5vdCBhbGxvdyBALWxldHRlcnMgaW4gcGFzc3dvcmRzIHdoZW4gdGhleSB3ZXJlIHNwZWNpZmllZCB3aXRoIHRoZQogIC11IG9yIC1VIGZsYWdzIChDVVJMT1BUX1VTRVJQV0QgYW5kIENVUkxPUFRfUFJPWFlVU0VSUFdEKS4gVGhpcyBhbHNvCiAgc3VnZ2VzdHMgdGhhdCBjdXJsIHByb2JhYmx5IHNob3VsZCB1cmwtZGVjb2RlIHRoZSBwYXNzd29yZCBwaWVjZSBvZiBhbiBVUkwKICBzbyB0aGF0IHlvdSBjb3VsZCBwYXNzIGFuIGVuY29kZWQgQC1sZXR0ZXIgdGhlcmUuLi4KICAKRGFuaWVsICgyMCBPY3RvYmVyIDIwMDApCi0gWWV0IGFub3RoZXIgaHR0cCBzZXJ2ZXIgYmFyZmVkIG9uIGN1cmwncyByZXF1ZXN0IHRoYXQgaW5jbHVkZSB0aGUgcG9ydAogIG51bWJlciBpbiB0aGUgSG9zdDogaGVhZGVyIGFsd2F5cy4gSSBub3cgb25seSBpbmNsdWRlIHRoZSBwb3J0IG51bWJlciBpZiBpdAogIGlzbid0IHRoZSBkZWZhdWx0ICg4MCBmb3IgSFRUUCwgNDQzIGZvciBIVFRQUykuIHd3dy5wZXJsLmNvbSB0dXJuZWQgb3V0IHRvCiAgcnVuIG9uZSBvZiB0aG9zZSBuYXN0eSBzZXJ2ZXJzLgoKLSBUaGUgUEhQNCBtb2R1bGUgZm9yIGN1cmwgaGFkIHByb2JsZW1zIHdpdGggcmVmZXJlciB0aGF0IHNlZW1zIHRvIGhhdmUgYmVlbgogIGNvcnJlY3RlZCBqdXN0IHllc3RlcmRheS4gKFN0ZXJsaW5nIEh1Z2hlcyBvZiB0aGUgUEhQIHRlYW0gY29uZmlybWVkIHRoaXMpCgpEYW5pZWwgKDE3IE9jdG9iZXIgMjAwMCkKLSBWbGFkaW1pciBPYmxvbW92IHJlcG9ydGVkIHRoYXQgdGhlIC1ZIGFuZCAteSBvcHRpb25zIGRpZG4ndCB3b3JrLiBUaGV5CiAgZGlkbid0IHdvcmsgZm9yIG1lIGVpdGhlci4gVGhpcyBvbmNlIGFnYWluIHByb3ZlcyB3ZSBzaG91bGQgaGF2ZSB0aGF0IHRlc3QKICBzdWl0ZS4uLgogIAotIEkgZmluYWxseSBjaGFuZ2VkIHRoZSBlcnJvciBtZXNzYWdlIGxpYmN1cmwgcmV0dXJucyBpZiB5b3UgdHJ5IGEgaHR0cHM6Ly8KICBVUkwgd2hlbiB0aGUgbGlicmFyeSB3YXNuJ3QgYnVpbGQgd2l0aCBTU0wgZW5hYmxlZC4gSXQgd2lsbCBub3cgcmV0dXJuIHRoaXMKICBlcnJvcjoKICAgICAgICAibGliY3VybCB3YXMgYnVpbHQgd2l0aCBTU0wgZGlzYWJsZWQsIGh0dHBzOiBub3Qgc3VwcG9ydGVkISIKCiAgSSByZWFsbHkgaG9wZSBpdCB3aWxsIG1ha2UgaXQgYSBiaXQgY2xlYXJlciB0byB1c2VycyB3aGVyZSB0aGUgYWN0dWFsCiAgcHJvYmxlbSBsaWVzLgoKVmVyc2lvbiA3LjQuMQoKRGFuaWVsICgxNiBPY3RvYmVyIDIwMDApCi0gSSBmb3Jnb3QgdG8gcmVtb3ZlIHNvbWUgb2YgdGhlIG1hbGxvYyBkZWJ1ZyBkZWZpbmVzIGZyb20gdGhlIG1ha2VmaWxlcyBpbgogIHRoZSByZWxlYXNlIGFyY2hpdmUgKG9mIGNvdXJzZSkuCgpWZXJzaW9uIDcuNAoKRGFuaWVsICgxNiBPY3RvYmVyIDIwMDApCi0gVGhlIGJ1ZmZlciBvdmVyZmxvdyBtZW50aW9uZWQgYmVsb3cgd2FzIHBvc3RlZCB0byBidWd0cmFxIG9uIEZyaWRheSAxM3RoLgoKRGFuaWVsICgxMiBPY3RvYmVyIDIwMDApCi0gQ29saW4gUm9iZXJ0IFBoaXBwcyBlbGVnYW50bHkgY29ycmVjdGVkIGEgYnVmZmVyIG92ZXJmbG93LiBJdCBjb3VsZCBiZSB1c2VkCiAgYnkgYW4gZXZpbCBmdHAgc2VydmVyIHRvIGNyYXNoIGN1cmwuIEkgdG9vayB0aGUgb3Bwb3J0dW5pdHkgb2YgcmVwbGFjaW5nIGEKICBmZXcgb3RoZXIgc3ByaW50ZigpcyBpbnRvIHNucHJpbnRmKClzIGFzIHdlbGwuCgpEYW5pZWwgKDExIE9jdG9iZXIgMjAwMCkKLSBGb3VuZCBzb21lIG1vcmUgbWVtb3J5IGxlYWtzLiBUaGlzIG5ldyBzaW1wbGUgbWVtb3J5IGRlYnVnZ2VyIGhhcyB0dXJuZWQgb3V0CiAgcmVhbGx5IHVzZWZ1bCEKClZlcnNpb24gNy40IHByZTYKCkRhbmllbCAoOSBPY3RvYmVyIDIwMDApCi0gRmxvcmlhbiBLb2VuaWcgcG9pbnRlZCBvdXQgdGhhdCB0aGUgYm9vbCB0eXBlZGVmIGluIHRoZSBjdXJsL2N1cmwuaCBpbmNsdWRlCiAgZmlsZSB3YXMgYnJlYWtpbmcgUEhQIDQuMC4zIGNvbXBpbGluZy4gVGhlIGJvb2wgdHlwZWRlZiBpcyBub3QgdXNlZCBpbiB0aGUKICBwdWJsaWMgaW50ZXJmYWNlIGFuZCB3YXMgd3JvbmdseSBpbnNlcnRlZCBpbiB0aGF0IGhlYWRlciBmaWxlLgoKLSBK9nJnIEhhcnRyb3RoIGNvcnJlY3RlZCBhIG1pbm9yIG1lbW9yeSBsZWFrIGluIHRoZSBzcmMvdXJsZ2xvYi5jIHN0dWZmLiBJdAogIGRpZG4ndCBoYXJtIGFueW9uZSBzaW5jZSB0aGUgbWVtb3J5IGlzIGZyZWUoKWVkIG9uIGV4aXQgYW55d2F5LgoKLSBDb3JyZWN0ZWQgdGhlIHNyYy9tYWluLmMuIFdlIHVzZSB0aGUgX01QUklOVEZfUkVQTEFDRSAjZGVmaW5lIHRvIHVzZSBvdXIKICBsaWJjdXJsLXByaW50ZigpIGZ1bmN0aW9ucy4gVGhpcyBnaXZlcyB1cyBzbnByaW50ZigpIGV0IGFsIG9uIGFsbAogIHBsYXRmb3Jtcy4gSSBjb252ZXJ0ZWQgdGhlIGFsbG9jYXRlZCB1c2VyYWdlbnQgc3RyaW5nIHRvIG9uZSB0aGF0IHVzZXMgYQogIGxvY2FsIGJ1ZmZlci4KCi0gSSd2ZSBzZXQgYW4gI2lmIDAgc2VjdGlvbiBhcm91bmQgdGhlIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcgaGVhZGVyCiAgZ2VuZXJhdGVkIGluIGxpYi9mb3JtZGF0YS5jLiBUaGlzIHdpbGwgaG9wZWZ1bGx5IG1ha2UgY3VybCBkbyBtb3JlCiAgUEhQLWZyaWVuZGx5IG11bHRpLXBhcnQgcG9zdHMuCgpWZXJzaW9uIDcuNCBwcmU1CgpEYW5pZWwgKDkgT2N0b2JlciAyMDAwKQotIE5pY28gQmFnZ3VzIGZvdW5kIG91dCB0aGF0IGN1cmwncyBhYmlsaXR5IHRvIGZvcmNlIGEgQVNDSUkgZG93bmxvYWQgd2hlbgogIHVzaW5nIEZUUCB3YXMgbm8gbG9uZ2VyIHdvcmtpbmchIEkgY29ycmVjdGVkIHRoaXMuIFRoaXMgcHJvYmxlbSB3YXMgcHJvYmFibHkKICBpbnRyb2R1Y2VkIHdoZW4gSSByZWRlc2lnbmVkIGxpYmN1cmwgZm9yIHZlcnNpb24gNy4KCi0gR2VvcmcgSG9ybiBwcm92aWRlZCBhIHNvdXJjZSBleGFtcGxlIHRoYXQgcHJvdmVkIGEgbWVtb3J5IGxlYWsgaW4gbGliY3VybC4KICBJIGFkZGVkIHNpbXBsZSBtZW1vcnkgZGVidWdnaW5nIGZhY2lsaXRpZXMgYW5kIG5vdyB3ZSBjYW4gbWFrZSBsaWJjdXJsIGxvZwogIGFsbCBtZW1vcnkgZmlkZGxpbmcgZnVuY3Rpb25zLiBBbiBhZGRpdGlvbmFsIHBlcmwgc2NyaXB0IGlzIHVzZWQgdG8gYW5hbHl6ZQogIHRoZSBvdXRwdXQgbG9nZmlsZSBhbmQgdG8gbWF0Y2ggbWFsbG9jKClzIHdpdGggZnJlZSgpcyBldGMuIFRoZSBtZW1vcnkgbGVhawogIEdlb3JnIGZvdW5kIHR1cm5lZCBvdXQgdG8gYmUgdGhlIG1haW4gY29va2llIHN0cnVjdCB0aGF0IGNvb2tpZV9jbGVhbnVwKCkKICBkaWRuJ3QgZnJlZSEgVGhlIHBlcmwgc2NyaXB0IGlzIG5hbWVkIG1lbWFuYWx5emUucGwgYW5kIGl0IGlzIGF2YWlsYWJsZSBpbgogIHRoZSBDVlMgcmVzcG9zaXRvcnksIG5vdCBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKRGFuaWVsICg4IE9jdG9iZXIgMjAwMCkKLSBHZW9yZyBIb3JuIGZvdW5kIGEgR2V0SG9zdCgpIHByb2JsZW0uIEl0IHR1cm5lZCBvdXQgaXQgbmV2ZXIgYXNzaWduZWQgdGhlCiAgcG9pbnRlciBpbiB0aGUgdGhpcmQgYXJndW1lbnQgcHJvcGVybHkhIFRoaXMgY291bGQgbWFrZSBhIGNyYXNoLCBvciBhdCBiZXN0CiAgYSBtZW1vcnkgbGVhayEKClZlcnNpb24gNy40IHByZTQKCkRhbmllbCAoNiBPY3RvYmVyIDIwMDApCi0gSXMgdGhlIC1GIHBvc3QgZm9sbG93aW5nIHRoZSBSRkMgMTg2NyBzcGVjPyBXZSBoYWQgdGhpcyBkaWN1c3Npb24gb24gdGhlCiAgbWFpbGluZyBsaXN0IHNpbmNlIGl0IGFwcGVhcnMgY3VybCBjYW4ndCBwb3N0IC1GIGZvcm0gcG9zdHMgdG8gYSBQSFAKICByZWNlaXZlci4uLiBJJ3ZlIGJlZW4gaW4gdG91Y2ggd2l0aCB0aGUgUEhQIGRldmVsb3BlcnMgYWJvdXQgdGhpcy4KCi0gRG9tZW5pY28gQW5kcmVvbGkgZm91bmQgb3V0IHRoYXQgdGhlIGxvbmcgb3B0aW9uICctLXByb3h5JyB3YXNuJ3Qgd29ya2luZwogIGFueW1vcmUhIFRoZSBvcHRpb24gcGFyc2VyIGdvdCBjb25mdXNlZCB3aGVuIEkgYWRkZWQgdGhlIC0tcHJveHl0dW5uZWwgZm9yCiAgNy4zLiBUaGlzIHdhcyBpbmRlZWQgYSB2ZXJ5IG9sZCBmbGF3IHRoYXQgaGFzbid0IHR1cm5lZCB1cCB1bnRpbCBub3cuLi4KCi0gSvZybiBIYXJ0cm90aCBwcm92aWRlZCBwYXRjaGVzLCB1cGRhdGVkIG1ha2VmaWxlcyBhbmQgdHdvIG5ldyBmaWxlcyBmb3IgRExMCiAgc3R1ZmYgb24gd2luMzIuIEhlIGFsc28gcG9pbnRlZCBvdXQgdGhhdCBsaWIgc291cmNlIGZpbGVzIHdlcmUgY29tcGlsZWQgd2l0aAogIC1JLi4vc3JjIHdoaWNoIGlzbid0IG9ubHkgd3JvbmcgYnV0IHBsYWluIHN0dXBpZCEKCi0gVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIGZpeGVkIGEgcHJvYmxlbSB3aXRoIEhUVFAgcmVzdW1lLiBDdXJsIHByZXZpb3VzbHkgdXNlZAogIGEgbG9jYWwgdmFyaWFibGUgYmFkbHksIHRoYXQgY291bGQgbGVhZCB0byBjcmFzaGVzLgoKVmVyc2lvbiA3LjQgcHJlMwoKRGFuaWVsICg0IE9jdG9iZXIgMjAwMCkKLSBNb3JlIGRvY3Mgd3JpdHRlbi4gVGhlIGN1cmxfZWFzeV9nZXRpbmZvLjMgbWFuIHBhZ2UgaXMgbm93IHByZXR0eSBhY2N1cmF0ZSwKICBhcyBpcyB0aGUgLXcgc2VjdGlvbiBpbiBjdXJsLjEuIEkgYWRkZWQgdHdvIG9wdGlvbnMgdG8gZW5hYmxlIHRoZSB1c2VyIHRvCiAgZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWNlaXZlZCBoZWFkZXJzJyBzaXplIGFuZCB0aGUgc2l6ZSBvZiB0aGUgSFRUUAogIHJlcXVlc3QuIFQuIEJoYXJhdGggcmVxdWVzdGVkIHRoZW0uCiAgCkRhbmllbCAoMyBPY3RvYmVyIDIwMDApCi0gQ29ycmVjdGVkIGEgc2V2ZXIgZnJlZSgpIGJlZm9yZSB1c2UgaW4gdGhlIG5ldyBhZGRfYnVmZmVyX3NlbmQoKSEgOy0pCgpWZXJzaW9uIDcuNCBwcmUyCgpEYW5pZWwgKDMgT2N0b2JlciAyMDAwKQotIEphc29uIFMuIFByaWViZSBzZW50IG1lIHBhdGNoZXMgdGhhdCBjaGFuZ2VkIHRoZSB3YXkgY3VybCBpc3N1ZXMgSFRUUAogIHJlcXVlc3RzLiBUaGUgZW50aXJlIHJlcXVlc3QgaXMgbm93IGlzc3VlZCBpbiBvbmUgc2luZ2xlIHNob3QuIEl0IGRpZG4ndCBkbwogIHRoaXMgcHJldmlvdXNseSwgYW5kIGl0IGhhcyB0dXJuZWQgb3V0IHRoYXQgc2luY2UgdGhlIGNvbW1vbiBicm93c2VycyBkbyBpdAogIHRoaXMgd2F5LCBzb21lIHNpdGVzIGhhdmUgdHVybmVkIG91dCB0byB3b3JrIHdpdGggYnJvd3NlcnMgYnV0IG5vdCB3aXRoCiAgY3VybCEgQWx0aG91Z2ggdGhpcyBpcyBub3QgYSBjbGllbnQtc2lkZSBwcm9ibGVtLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8KICBmdWxseSBlbXVsYXRlIGJyb3dzZXJzLCBhbmQgdGh1cyB3ZSBoYXZlIG5vdyBhZGp1c3RlZCB0aGUgbmV0d29ya2luZyBsYXllcgogIHRvIHNsaWdodGx5IG1vcmUgYXBwZWFyIGFzIGEgYnJvd3Nlci4gSSBhZGp1c3RlZCBKYXNvbidzIHBhdGNoLCB0aGUgZmF1bHRzCiAgYXJlIHByb2JhYmx5IG1pbmUuCgpEYW5pZWwgKDIgT2N0b2JlciAyMDAwKQotIEFueW9uZSB3aG8gZXZlciB1cGxvYWRlZCBkYXRhIHdpdGggY3VybCBvbiBhIHNsb3cgbGluayBoYXMgbm90aWNlZCB0aGF0IHRoZQogIHByb2dlc3MgbWV0ZXIgaXMgdXBkYXRlZCB2ZXJ5IGluZnJlcXVlbnRseS4gVGhhdCBpcyBkdWUgdG8gdGhlIGxhcmdlIGJ1ZmZlcgogIHNpemUgY3VybCBpcyB1c2luZy4gSXQgcmVhZHMgNTBLYiBhbmQgc2VuZHMgaXQsIHVwZGF0ZXMgdGhlIHByb2dyZXNzIG1ldGVyCiAgYW5kIGxvb3BzLiA1MEtiIGlzIHZlcnkgbXVjaCBvbiBhIHNsb3cgbGluaywgYWx0aG91Z2ggaXQgaXMgcHJldHR5IG5lYXQgdG8KICB1c2Ugb24gYSBmYXN0IG9uZS4KCiAgSSd2ZSBub3cgbWFkZSBhbiBhZGp1c3RtZW50IHRoYXQgbWFrZXMgY3VybCB1c2UgYSAyS2IgYnVmZmVyIGZvciB1cGxvYWRzIHRvCiAgc3RhcnQgd2l0aC4gSWYgY3VybCdzIGF2ZXJhZ2UgdXBsb2FkIHNwZWVkIGlzIGZhc3RlciB0aGFuIGJ1ZmZlciBzaXplIGJ5dGVzCiAgcGVyIHNlY29uZCwgY3VybCB3aWxsIGluY3JlYXNlIHRoZSB1c2VkIGJ1ZmZlciBzaXplIHVwIHRvIG1heCA1MEtiLiBJdAogIHNob3VsZCBtYWtlIHRoZSBwcm9ncmVzcyBtZXRlciB3b3JrIGJldHRlci4KICAKVmVyc2lvbiA3LjQgcHJlMQoKRGFuaWVsICgyOSBTZXB0ZW1iZXIgMjAwMCkKLSBSaXBwZWQgb3V0IHRoZSAtdyBzdHVmZiBmcm9tIHRoZSBsaWJyYXJ5IGFuZCBwdXQgaW4gdGhlIGN1cmwgdG9vbC4gSXQgZ2V0cwogIGFsbCB0aGUgcmVsZXZhbnQgaW5mbyBmcm9tIHRoZSBsaWJyYXJ5IHVzaW5nIHRoZSBuZXcgY3VybF9lYXN5X2dldGluZm8oKQogIGZ1bmN0aW9uLgoKLSBicmFkIGF0IG9wZW5ic2Qub3JnIG1haWxlZCBtZSBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIG15IGtlcmJlcm9zIG1pc3Rha2UgYW5kCiAgcmVtb3ZlZCBhIGNvbXBpbGVyIHdhcm5pbmcgZnJvbSBob3N0aXAuYyB0aGF0IE9wZW5CU0QgcGVvcGxlIGdldC4KCkRhbmllbCAoMjggU2VwdGVtYmVyIDIwMDApCi0gT2YgY291cnNlIChJIHNob3VsZCBwcm9iYWJseSBnZXQgcHVuaXNoZWQgc29tZWhvdykgSSBkaWRuJ3QgcHJvcGVybHkgY29ycmVjdAogIHRoZSAjaW5jbHVkZSBsaW5lcyBmb3IgdGhlIGJhc2U2NCBzdHVmZiBpbiB0aGUga2VyYmVyb3Mgc291cmNlcyBpbiB0aGUganVzdAogIHJlbGVhc2VkIDcuMyBwYWNrYWdlLiBUaGV5IHN0aWxsIGluY2x1ZGUgdGhlICpfa3JiLmggZmlsZXMhIE5vdywgdGhlIGVycm9yCiAgaXMgc29vbyB2ZXJ5IGVhc3kgdG8gc3BvdCBhbmQgZml4IHNvIEkgd29uJ3QgYm90aGVyIHdpdGggYSBxdWljayBidWcgZml4CiAgcmVsZWFzZS4gSSdsbCBwb3N0IGEgcGF0Y2ggd2hlbmV2ZXIgb25lIGlzIG5lZWRlZCBpbnN0ZWFkLiBJdCdsbCBiZQogIGF2YWlsYWJsZSBpbiB0aGUgQ1ZTIGluIGEgZmV3IG1pbnV0ZXMgYW55d2F5LgoKVmVyc2lvbiA3LjMKCkRhbmllbCAoMjggU2VwdGVtYmVyIDIwMDApCi0gUmVtb3ZlZCB0aGUgYmFzZTY0X2tyYi5bY2hdIGZpbGVzLiBUaGV5J3ZlIG5vdyByZXBsYWNlZCB0aGUgZm9ybWVyCiAgYmFzZTY0LltjaF0gZmlsZXMuCgpEYW5pZWwgKDI2IFNlcHRlbWJlciAyMDAwKQotIFVwZGF0ZWQgc29tZSBkb2NzLgoKLSBJIGNoYW5nZWQgdGhlIE9wZW5TU0wgZml4IHRvIHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBhcyB3ZWxsLiBUaGUgcG9zdGVkCiAgcGF0Y2ggd2FzIG9ubHkgd29ya2luZyB3aXRoIDAuOS42IGFuZCBubyBvbGRlciBvbmVzLgogIApWZXJzaW9uIDcuMy1wcmU4CgpEYW5pZWwgKDI1IFNlcHRlbWJlciAyMDAwKQotIEVyZG11dCBQZmVpZmVyIGluZm9ybWVkIHVzIHRoYXQgY3VybCBkaWRuJ3QgYnVpbGQgd2l0aCBPcGVuU1NMIDAuOS42IGFuZAogIHNob3dlZCB1cyB3aGF0IG5lZWRlZCB0byBnZXQgcGF0Y2hlZCBpbiBvcmRlciB0byBtYWtlIGl0IGJ1aWxkIHByb3Blcmx5CiAgYWdhaW4uCgotIERpcmsgS3J1c2NoZXdza2kgZm91bmQgYSBidWcgaW4gdGhlIGNvb2tpZSBwYXJzZXIuIEkgbWFkZSBhbiBhbHRlcm5hdGl2ZQogIGFwcHJvYWNoIHRvIHRoZSBzb2x1dGlvbiBEaXJrIGhpbXNlbGYgc3VnZ2VzdGVkLiBUaGUgYnVnIG1hZGUgYSBjb29raWUKICBoZWFkZXIgdGhhdCBkaWRuJ3QgZW5kIHdpdGggYSB0cmFpbGluZyBzZW1pY29sb24gdG8gbm90IGdldCBwYXJzZWQuCgotIEkndmUgbWFya2VkIC1jIGFuZCAtdCBkZXByZWNhdGVkIG5vdy4gSWYgeW91IHVzZSBhbnkgb2YgdGhlbSwgY3VybCB3aWxsIHRlbGwKICB5b3UgdG8gdXNlICItQyAtIiBvciAiLVQgLSIgaW5zdGVhZC4gSSBkb24ndCB0aGluayBvY2N1cHlpbmcgdHdvIGxldHRlcnMgZm9yCiAgbmVhcmx5IGlkZW50aWNhbCBmdW5jdGlvbnMgaXMgZ29vZCB1c2UuIEFsc28sIC1UIC0ga2luZCBvZiBmb2xsb3dzIHRoZSBjdXJsCiAgdHJhZGl0aW9uIG9mIHVzaW5nIC0gZm9yIHN0ZGluIHdoZXJlIGEgZmlsZSBuYW1lIGlzIGV4cGVjdGVkLgoKRGFuaWVsICgyMyBTZXB0ZW1iZXIgMjAwMCkKLSBNYXJ0aW4gSGVkZW5mYWxrIHByb3ZpZGVkIHRoZSBwYXRjaCB0aGF0IGZpbmFsbHkgbWFkZSB0aGUga3JiNCBmdHAgdXBsb2FkCiAgd29yayEKCkRhbmllbCAoMjEgU2VwdGVtYmVyIDIwMDApCi0gVGhlIGtlcmJlcm9zIGNvZGUgaXMgbm90IHF1aXRlIHRocmVhZC1zYWZlIHlldC4gVGhlcmUgYXJlIGEgZmV3IG1vcmUgZ2xvYmFscwogIHRoYXQgbmVlZCB0byBiZSB0YWtlIGNhcmUgb2YuIExldCdzIGdldCB0aGUgdXBsb2FkIHdvcmtpbmcgZmlyc3QhCgpEYW5pZWwgKDIwIFNlcHRlbWJlciAyMDAwKQotIFJpY2hhcmQgUHJlc2NvdHQgc29sdmVkIGFub3RoZXIgbmFtZSBsb29rdXAgYnVmZmVyIHNpemUgcHJvYmxlbS4gSSB0b29rIHRoaXMKICBvcHBvcnR1bml0eSB0byByZXdyaXRlIHRoZSBHZXRIb3N0KCkgZnVuY3Rpb24uIFdpdGggdGhlc2UgbGFyZ2UgYnVmZmVyCiAgc2l6ZXMsIEkgdGhpbmsga2VlcGluZyB0aGVtIGFzIGxvY2FsIGFycmF5cyBxdWlja2x5IHR1cm4gdWdseS4gSSBub3cgdXNlCiAgbWFsbG9jKCkgdG8gZ2V0IHRoZSBidWZmZXIgbWVtb3J5LiBUaGFua3MgdG8gdGhpcywgSSBub3cgY2FuIHJlYWxsb2MoKSB0byBhCiAgbGFyZ2UgYnVmZmVyIGluIGNhc2Ugb2YgZGVtYW5kIChlcnJubyA9PSBFUkFOR0UpIGluIGNhc2UgYSBzb2x1dGlvbiBsaWtlCiAgdGhhdCB3b3VsZCBiZWNvbWUgbmVjZXNzYXJ5LiBJIHN0aWxsIHdhbnQgdG8gYXZvaWQgdGhhdCBraW5kIG9mIG5hc3RpbmVzcy4KCi0gVHJpZWQgdG8gY29tcGlsZSBhbmQgcnVuIGN1cmwgb24gTGludXggZm9yIGFscGhhIGFuZCBGcmVlQlNEIGZvciBhbHBoYS4gV2VudAogIGFzIHNtb290aCBhcyBpdCBjb3VsZC4KCi0gQWRkZWQgYSBkb2NzL2V4YW1wbGVzIGRpcmVjdG9yeSB3aXRoIHR3byB0aW55IGV4YW1wbGUgc291cmNlcyB0aGF0IHNob3cgaG93CiAgdG8gdXNlIGxpYmN1cmwuIEkgaG9wZSB1c2VycyB3aWxsIHN1cHBseSBtZSB3aXRoIG1vcmUgdXNlZnVsIGV4YW1wbGVzCiAgZnVydGhlciBvbi4KCi0gQXBwbGllZCBhIHBhdGNoIGJ5IEr2cm4gSGFydHJvdGggdG8gbm8gbG9uZ2VyIHVzZSB0aGUgd29yZCAnaW50ZWZhY2UnIGluIHRoZQogIGNvbmZpZyBzdHJ1Y3QgaW4gdGhlIHNyYy9tYWluLmMgZmlsZSBzaW5jZSBjZXJ0YWluIGNvbXBpbGVycyBoYXZlIHRoYXQgd29yZAogICJyZXNlcnZlcmVkIi4gIEkgZmlndXJlIHRoYXQgaXMgc29tZSBraW5kIG9mIEMrKyBkZWNlYXNlLgoKLSBVcGRhdGVkIHRoZSBjdXJsLjEgbWFuIHBhZ2Ugd2l0aCAtLWludGVyZmFjZSBhbmQgLS1rcmI0LgoKLSBNb2RpZmllZCB0aGUgYmFzZTY0RW5jb2RlKCkgZnVuY3Rpb24gdG8gd29yayBsaWtlIHRoZSBrZXJiZXJvcyBvbmUsIHNvIHRoYXQKICBJIGNvdWxkIHJlbW92ZSB0aGUgdXNlIG9mIHRoYXQuIFRoZXJlIGlzIG5vIG5lZWQgZm9yICp0d28qIGJhc2U2NCBlbmNvZGluZwogIGZ1bmN0aW9ucyEgOy0pCgpWZXJzaW9uIDcuM3ByZTUKCkRhbmllbCAoMTkgU2VwdGVtYmVyIDIwMDApCi0gVGhlIGtlcmJlcm9zNC1sYXllciBzb3VyY2UgY29kZSB0aGF0IGlzIG11Y2ggImluZmx1ZW5jZWQiIGJ5IHRoZSBvcmlnaW5hbAogIGtyYjQgc291cmNlIGNvZGUsIHRocm91Z2ggeWFmYyBpbnRvIGN1cmwsIHdhcyB1c2luZyBxdWl0ZSBhIGxvdCBvZiBnbG9iYWwKICB2YXJpYWJsZXMuIGxpYmN1cmwgY2FuJ3Qgd29yayBwcm9wZXJseSB3aXRoIGdsb2JhbHMgbGlrZSB0aGF0IHdoeSBJIGhhZCB0bwogIGNsZWFuIHVwIGFsbW9zdCBldmVyeSBmdW5jdGlvbiBpbiB0aGUgbmV3IHNlY3VyaXR5LmMgdG8gbWFrZSB0aGVtIHVzZQogIGNvbm5lY3Rpb24gc3BlY2lmaWMgdmFyaWFibGVzIGluc3RlYWQgb2YgdGhlIGdsb2JhbHMuIEkganVzdCBob3BlIEkgZGlkbid0CiAgZGVzdHJveSBhbnl0aGluZyBub3cuLi4gOi0pIGNvbmZpZ3VyZSB1cGRhdGVkLCB2ZXJzaW9uIHN0cmluZyBub3cgcmVmbGVjdHMKICBrcmI0IGJ1aWx0LWluLiBJdCBhbG1vc3Qgd29ya3Mgbm93LiBPbmx5IHVwbG9hZHMgYXJlIHN0aWxsIGJlaW5nIG5hdWdodHkuCgpWZXJzaW9uIDcuM3ByZTMKCkRhbmllbCAoMTggU2VwdGVtYmVyIDIwMDApCi0gTWFydGluIEhlZGVuZmFsayBzdXBwbGllZCBhIG1ham9yIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBrcmI0LWZ0cCBzdXBwb3J0IHRvCiAgY3VybC4gTWFydGluIGlzIHRoZSBwcmltYXJ5IGF1dGhvciBvZiB0aGUgZnRwIGNsaWVudCBuYW1lZCB5YWZjIGFuZCBoZSBkaWQKICBub3QgaGVzaXRhdGUgdG8gaGVscCB1cyBpbXBsZW1lbnQgdGhpcyB3aGVuIEkgYXNrZWQgaGltLiBNYW55IGFuZCBzaW5jZXJlCiAgdGhhbmtzIHRvIGEgc3BsZW5kaWQgZWZmb3J0LiBJdCBkaWRuJ3QgZXZlbiB0YWtlIG1hbnkgaG91cnMhCgotIFN0ZXBoZW4gS2ljayBzdXBwbGllZCBhIGJpZyBwYXRjaCB0aGF0IGludHJvZHVjZXMgdGhlIC0taW50ZXJmYWNlIGZsYWcgdG8KICB0aGUgY3VybCB0b29sIGFuZCBDVVJMT1BUX0lOVEVSRkFDRSBmb3IgbGliY3VybC4gSXQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGFuCiAgb3V0Z29pbmcgaW50ZXJmYWNlIHRvIHVzZSBmb3IgeW91ciByZXF1ZXN0LiBUaGlzIG1heSBub3Qgd29yayBvbiBhbGwKICBwbGF0Zm9ybXMuIFRoaXMgbmVlZHMgdGVzdGluZy4KCi0gUmljaGFyZCBQcmVzY290dCBub3RpY2VkIHRoYXQgY3VybCBvbiBUcnU2NCB1bml4IGNvdWxkIGNvcmUgZHVtcGVkIGlmIHRoZQogIG5hbWUgZGlkbid0IHJlc29sdmUgcHJvcGVybHkuIFRoaXMgd2FzIGR1ZSB0byB0aGUgR2V0SG9zdCgpIGZ1bmN0aW9uIG5vdAogIHJldHVybmluZyBhbiBlcnJvciBldmVuIHRob3VnaCBpdCBmYWlsZWQgb24gc29tZSBwbGF0Zm9ybXMhCgpEYW5pZWwgKDE1IFNlcHRlbWJlciAyMDAwKQotIFVwZGF0ZWQgYWxsIHNvcnRzIG9mIGRvY3VtZW50cyBpbiByZWdhcmRzIHRvIHRoZSBuZXcgcHJveHl0dW5uZWwgc3VwcG9ydC4KClZlcnNpb24gNy4zcHJlMgoKRGFuaWVsICgxNSBTZXB0ZW1iZXIgMjAwMCkKLSBLYWktVXdlIFJvbW1lbCBwb2ludGVkIG91dCBhIHByb2JsZW0gaW4gdGhlIGh0dHBwcm94eXR1bm5lbCBzdHVmZiBmb3IgZnRwLgogIEFkanVzdGVkIGl0LiBBZGRlZCBiZXR0ZXIgaW5mbyBtZXNzYWdlIHdoZW4gc2V0dGluZyB1cCB0aGUgdHVubmVsIGFuZCB0aGUKICBwYXN2IG1lc3NhZ2Ugd2hlbiBkb2luZyB0aGUgc2Vjb25kIGNvbm5lY3QuCiAgClZlcnNpb24gNy4zcHJlMQoKRGFuaWVsICgxNSBTZXB0ZW1iZXIgMjAwMCkKLSBsaWJjdXJsIG5vdyBhbGxvd3MgImh0dHBwcm94eXR1bm5lbCIgdG8gYW4gYXJiaXRyYXJ5IGhvc3QgYW5kIHBvcnQgbmFtZS4gVGhlCiAgc2Vjb25kIGNvbm5lY3Rpb24gb24gZnRwIG5lZWRlZCB0aGF0LgoKLSBUaGVBcnRPZkhUVFBTY3JpcHRpbmcgd2FzIGNvcnJlY3RlZCBhbGwgb3Zlci4gSSBib3RoIHR5cGUgYW5kIHNwZWxsIHJlYWxseQogIGJhZCBhdCB0aW1lcyEKICAKRGFuaWVsICgxNCBTZXB0ZW1iZXIgMjAwMCkKLSAtcC8tLXByb3h5dHVubmVsIHdhcyBhZGRlZCB0byAnY3VybCcuIEl0IHVzZXMgdGhlIG5ldwogIENVUkxPUFRfSFRUUFBST1hZVFVOTkVMIGxpYmN1cmwgb3B0aW9uIHRoYXQgYWxsb3dzICJhbnkiIHByb3RvY29sIHRvIHR1bm5lbAogIHRocm91Z2ggdGhlIHNwZWNpZmllZCBodHRwIHByb3h5LiBBdCB0aGUgbW9tZW50LCB0aGlzIHNob3VsZCB3b3JrIHdpdGggZnRwLgoKRGFuaWVsICgxMyBTZXB0ZW1iZXIgMjAwMCkKLSBKb2NoZW4gU2NoYWV1YmxlIGZvdW5kIHRoYXQgZmlsZTovLyBkaWRuJ3Qgd29yayBhcyBleHBlY3RlZC4gQ29ycmVjdGVkIHRoaXMKICBhbmQgbWFpbGVkIHRoZSBwYXRjaCB0byB0aGUgbWFpbGluZyBsaXN0LgoKRGFuaWVsICg3IFNlcHRlbWJlciAyMDAwKQotIEkgY2hhbmdlZCB0aGUgI2RlZmluZSBUKCkgaW4gY3VybC5oIHNpbmNlIGl0IHR1cm5lZCBvdXQgaXQgd2Fzbid0IHJlYWxseQogIGEgZ29vZCBzeW1ib2wgdG8gdXNlICh3aGVuIHlvdSBjb21waWxlZCBQSFAgd2l0aCBjdXJsIGFzIGEgbW9kdWxlLCB0aGF0CiAgZGVmaW5lIGNvbGxpZGVkIHdpdGggc29tZSBJTUFQIGRlZmluZSBvciBzb21ldGhpbmcpLiBUaGlzIHdhcyBwb3N0ZWQgdG8gdGhlCiAgUEhQIGJ1ZyB0cmFja2VyLgoKLSBJIGFkZGVkIGV4dGVybiAiQyIgc3R1ZmYgaW4gdHdvIGhlYWRlciBmaWxlcyB0byBiZXR0ZXIgYWxsb3cgbGliY3VybCB1c2FnZQogIGluIEMrKyBzb3JjZXMuIERpc2N1c3Npb25zIG9uIHRoZSBsaWJjdXJsIGxpc3Qgd2l0aCBEYW5ueSBIb3Jzd2VsbCBsZWFkIHRvCiAgdGhpcy4KClZlcnNpb24gNy4yLjEKCkRhbmllbCAoMzEgQXVndXN0IDIwMDApCi0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBmaXhlZCB0aGUgY29uZmlndXJlIHNjcmlwdCAqYWdhaW4qIGFuZCBub3cgaXQgc2VlbXMgdG8KICBkZXRlY3QgTGludXggbmFtZSByZXNvbHZpbmcgcHJvcGVybHkhIChoZWFyZCB0aGF0IGJlZm9yZT8pCgotIFRyb2VscyBXYWxzdGVkIEhhbnNlbiBwb2ludGVkIG91dCB0aGF0IGRvd25sb2FkaW5nIGEgZmlsZSBjb250YWluaW5nIHRoZQogIGxldHRlciAnKycgZnJvbSBhbiBmdHAgc2VydmVyIGRpZG4ndCB3b3JrLiBJdCBkaWQgd29yayBmcm9tIEhUVFAgdGhvdWdoIGFuZAogIHRoZSByZWFzb24gd2FzIG15IGxhbWUgVVJMIGRlY29kZXIuCgotIEkgaGFwcGVuZWQgdG8gbm90aWNlIHRoYXQgLUkgZGlkbid0IGF0IGFsbCB3b3JrIG9uIGZ0cCBhbnltb3JlLiBJIGNvcnJlY3RlZAogIHRoYXQuCgpWZXJzaW9uIDcuMgoKRGFuaWVsICgzMCBBdWd1c3QgMjAwMCkKLSBVbmRlcnN0YW5kaW5nIEFJWCBpcyBhIGhhcmQgdGFzay4gSSBiZWxpZXZlIEknbGwgbmV2ZXIgZmlndXJlIG91dCB3aHkgdGhleQogIHNvbHZlIHRoaW5ncyBzbyBkaWZmZXJlbnRseSBmcm9tIHRoZSBvdGhlciB1bml4ZXMuIE5vdywgSSdtIGxlZnQgd2l0aCB0aGUKICBBSVggNC4zIHJ1bi10aW1lIHdhcm5pbmdzIGFib3V0IGR1cGxpY2F0ZSBzeW1ib2xzIHRoYXQgYWNjb3JkaW5nIHRvIHRoaXMKICBhcnRpY2xlIChodHRwOi8vd3d3Lmdlb2NyYXdsZXIuY29tL2FyY2hpdmVzLzMvNDA1LzE5OTkvOS8wLzI1OTM0MjgvKSBpcyBhCiAgbGlidG9vbCBmbGF3LiBJIHRyaWVkIHRoZSBtZW50aW9uZWQgcGF0Y2gsIGFsdGhvdWdoIHRoYXQgc3RvcHMgdGhlIGxpbmtpbmcKICBjb21wbGV0ZWx5LgoKICBTbywgaWYgSSBzZWxlY3QgdG8gaWdub3JlIHRoZSBsZCB3YXJuaW5ncyB0aGVyZSBhcmUgY29tcGlsZXIgd2FybmluZ3MgdGhhdAogIGZpbGwgdGhlIHNjcmVlbiBwcmV0dHkgYmFkIHdoZW4gY3VybCBjb21waWxlcy4gSXQgdHVybnMgb3V0IHRoYXQgaWYgSSB3YW50CiAgdG8gJyNpbmNsdWRlIDxhcnBhL2luZXQuaD4nLCBJIGNhbiBnZXQgdGlkIG9mIHRoZSB3YXJuaW5ncyBieSBpbmNsdWRlIHRoZQogIGZvbGxvd2luZyB0aHJlZSBpbmNsdWRlIGZpbGVzIGJlZm9yZSB0aGF0IG9uZToKCiAgICAgICAgI2luY2x1ZGUgPG5ldC9pZl9kbC5oPgogICAgICAgICNpbmNsdWRlIDxzeXMvbWJ1Zi5oPgogICAgICAgICNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CgogIE5vdywgaXMgaXQgcmVhbGx5IHNhbmUgdG8gYWRkIHRob3NlIGluY2x1ZGUgZmlsZXMgYmVmb3JlIGFycGEvaW5ldC5oIGluIGFsbAogIHRoZSBzb3VyY2UgZmlsZXMgdGhhdCBpbmNsdWRlIGl0PwoKICBUaGFua3MgdG8gQWxiZXJ0IENoaW4tQS1Zb3VuZyBhdCB0aGV3cml0dGVud29yZC5jb20gd2hvIGdhdmUgbWUgdGhlIEFJWAogIGxvZ2luIHRvIHRyeSBldmVyeXRoaW5nIG9uLgoKRGFuaWVsICgyNCBBdWd1c3QgMjAwMCkKLSBKYW4gU2NobWlkdCBzdXBwbGllZCB1cyBhIG5ldyBWQzYgbWFrZWZpbGUgZm9yIFdpbmRvd3MgYXMgdGhlIHByZXZpb3VzIG9uZQogIHdhcyBub3QgdXAgdG8gZGF0ZSBidXQgbGFja2VkIHNldmVyYWwgb2JqZWN0IGZpbGVzLgoKLSBNb3JlIHdvcmsgb24gdGhlIG5hbWluZy4KCi0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBwcm92aWRlZCBhIGNvbmZpZ3VyZS1jaGVjayBmb3IgbGFyZ2UgZmlsZSBzdXBwb3J0LCBhcwogIHNvbWUgc3lzdGVtcyBzZWVtIHRvIG5lZWQgdGhhdCBmb3IgdGhlbSB0byB3b3JrLiBIYWQgdG8gY2hhbmdlIHRoZSBwb3NpdGlvbgogIGZvciB0aGUgY29uZmlnLmggaW5jbHVkZSBmaWxlIGluIGV2ZXJ5IC5jIGZpbGUgaW4gdGhlIGxpYmN1cmwgZGlyLi4uCgotIEFzIHN1Z2dlc3RlZCBvbiB0aGUgbWFpbGluZyBsaXN0IChieSBUcm95IEVuZ2VsKSwgSSBkaWQgdXNlIGEgLS1kYXRhLWJpbmFyeQogIG9wdGlvbiBpbnN0ZWFkIG9mIHRoZSBtZXNzeSB3YXkgSSd2ZSBsZWZ0IGRlc2NyaWJlZCBiZWxvdy4gSXQgc2VlbXMgdG8KICB3b3JrLiBUaGUgbGliY3VybCBmaXggcmVtYWluZWQgdGhlIHNhbWUgYXMgeWVzdGVyZGF5LgoKRGFuaWVsICgyMyBBdWd1c3QgMjAwMCkKLSBCYWNrIG9uIHRoZSAtZCBzdHJpcHBpbmcgbmV3bGluZXMgdGhpbmcuIFRoZSAncGxhaW4gcG9zdCcgdGhpbmcgd2FzIGFkZGVkCiAgd2hlbiBJIGhhZCBubyB0aG91Z2h0IG9mIHRoYXQgb25lIGNvdWxkIGFjdHVhbGx5IHBvc3QgYmluYXJ5IGRhdGEgd2l0aAogIGl0LiBOb3csIEkgaGF2ZSB0byBhZGQgdGhpcyBmdW5jdGlvbmFsaXR5IGluIGEgZ3JhY2VmdWwgbWFubmVyIGFuZCBJIHRoaW5rCiAgSSd2ZSBtYW5hZ2VkIHRvIGNvbWUgdXAgd2l0aCBhIHdheTogJy1kIEBmaWxlO2JpbmFyeScgd2lsbCB0aHVzIHBvc3QgdGhlCiAgZmlsZSBiaW5hcnksIGV4YWN0bHkgYXMgaXRzIGNvbnRlbnRzIGFyZS4gSXQgaXMgaW1wbGVtZW50ZWQgd2l0aCBhIG5ldwogICpzZXRvcHQoKSBvcHRpb24gKENVUkxPUFRfUE9TVEZJRUxEU0laRSkgdG8gc2V0IHRoZSBwb3N0ZmllbGQgc2l6ZSwgc2luY2UKICBsaWJjdXJsIGNhbid0IHN0cmxlbigpIHRoZSBkYXRhIGluIHRoZXNlIGNhc2VzLgoKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIG1hZGUgc29tZSB2ZXJ5IHNlcmlvdXMgZWZmb3J0cyBhbmQgYWxsIHRoZSBuYW1lCiAgcmVzb2x2aW5nIHByb2JsZW1zIHNlZW0gdG8gaGF2ZSBiZWVuIHNvcnRlZCBvdXQgbm93IG9uIGFsbCB0aGUgcGxhdGZvcm1zCiAgdGhhdCBwcmV2aW91c2x5IHNob3dlZCB0aGVtLiBJJ2xsIG1ha2UgYW5vdGhlciByZWxlYXNlIG5vdyBhbnlkYXkgYmVjYXVzZSBvZgogIHRoaXMuCgotIFRoZSBGQVEgd2FzIG11Y2ggZW5oYW5jZWQgd2hlbiBpdCBjb21lcyB0byB0aGUgbGljZW5zaW5nIGlzc3VlcyB0aGFua3MgdG8KICBCam9ybiBSZWVzZS4KCkRhbmllbCAoMjEgQXVndXN0IDIwMDApCi0gUmljayBXZWx5a29jaHkgcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdoZW4geW91IHVzZSAtZCB0byBwb3N0IGFuZCB5b3Ugd2FudCB0bwogIGtlZXAgdGhlIG5ld2xpbmVzLCBhcyBjdXJsIHN0cmlwcyB0aGVtIG9mZiBhcyBhIGJvbnVzIGJlZm9yZSBwb3N0aW5nLi4uCiAgVGhpcyBuZWVkcyB0byBiZSBhZGRyZXNzZWQuCgpWZXJzaW9uIDcuMS4xCgpEYW5pZWwgKDIxIEF1Z3VzdCAyMDAwKQotIEdvdCBtb3JlIHBlb3BsZSBpbnZvbHZlZCBpbiB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgbWVzcy4gQ2FvbGFuIE1jTmFtYXJhIHNlbnQKICBtZSBjb25maWd1cmUtY29kZSB0aGF0IHR1cm5lZCBvdXQgdG8gYmUgdmVyeSBzaW1pbGFyIHRvIG15IGV4aXN0aW5nIHRlc3RzCiAgd2hpY2ggb25seSBtYWtlIG1lIG1vcmUgc3VyZSBJJ20gb24gdGhlIHJpZ2h0IHBhdGguIEkgY2hhbmdlZCB0aGUgb3JkZXIgb2YKICB0aGUgdGVzdHMgc2xpZ2h0bHksIGFzIGl0IHNlZW1zIHRoYXQgc29tZSBjb21waWxlcnMgZG9uJ3QgeWVsbCBlcnJvciBpZiBhCiAgZnVuY3Rpb24gaXMgdXNlZCB3aXRoIHRvbyBtYW55IHBhcmFtZXRlcnMuIFRodXMsIHRoZSBmaXJzdCB0ZXN0ZWQgZnVuY3Rpb24KICB3aWxsIHNlZW0gb2suLi4gTGV0J3MgaG9wZSBtb3JlIGNvbXBpbGVycyB0aGluayBvZiB0b28tZmV3IHBhcmFtZXRlcnMgYXMgYmFkCiAgbWFubmVycywgYXMgd2UncmUgbm93IHRyeWluZyB0aGUgZnVuY3Rpb25zIGluIHRoYXQgb3JkZXI7IGZld2VyIGZpcnN0LiBJCiAgc2hvdWxkIGFsc28gYWRkIHRoYXQgTGFycyBIZWNraW5nIG1haWxlZCBtZSBhbmQgdm9sdW50ZWVyZWQgdG8gcnVuIHRlc3RzIG9uCiAgYSBmZXcgb2RkIHN5c3RlbXMuIENvYWxhbiBpcyBrZWVwaW5nIGhpcyB3b3JrIG92ZXIgYXQKICBodHRwOi8vd3d3LmNzbi51bC5pZS9+Y2FvbGFuL3B1YmxpbmsvZ2V0aG9zdGJ5bmFtZV9yLy4gTWlnaHQgYmUgaGFuZHkgaW4gdGhlCiAgZnV0dXJlIGFzIHdlbGwuCgpEYW5pZWwgKDE4IEF1Z3VzdCAyMDAwKQotIEkgbm90aWNlZCBJIGhhZG4ndCBpbmNyZWFzZWQgdGhlIG5hbWUgbG9va3VwIGJ1ZmZlciBpbiBsaWIvZnRwLmMuIEkgZG9uJ3QKICB0aGluayB0aGlzIGlzIHRoZSByZWFzb24gZm9yIHRoZSBjb250aW51ZWQgdHJvdWJsZSB0aG91Z2guCgpEYW5pZWwgKDE3IEF1Z3VzdCAyMDAwKQotIEZyZWQgTm96IGNvcnJlY3RlZCBteSBzdHVwaWQgbWlzdGFrZXMgaW4gdGhlIGdldGhvc3RieW5hbWVfcigpIGZsdWZmLiBJdAogIHNob3VsZCBhZmZlY3Qgc29tZSBBSVgsIERpZ2l0YWwgVW5peCBhbmQgSFBVWCAxMCBzeXN0ZW1zLgoKRGFuaWVsICgxNSBBdWd1c3QgMjAwMCkKLSBNYXRoaWV1IExlZ2FyZSBjb21waWxlZCBhbmQgYnVpbGQgNy4xIHdpdGhvdXQgZXJyb3JzIG9uIGJvdGggQUlYIDQuMiBhcyB3ZWxsCiAgYXMgQUlYIDQuMy4gTm93IHdoeSBkaWQgcHJvYmxlbXMgb2NjdXIgYmVmb3JlPwoKLSBGcmVkIE5veiByZXBvcnRlZCBhIC13Ly0td3JpdGUtb3V0IGJ1ZyB0aGF0IGNhdXNlZCBpdCB0byBtYWxmdW5jdGlvbiB3aGVuCiAgdXNlZCBjb21iaW5lZCB3aXRoIG11bHRpcGxlIFVSTCByZXRyaWV2YWxlcy4gQWxsIGJ1dCB0aGUgZmlyc3QgZGlzcGxheSBnb3QKICBzY3Jld2VkIHVwIQoKRGFuaWVsICgxMSBBdWd1c3QgMjAwMCkKLSBKYXNvbiBQcmllYmUgYW5kIGFuIGFub255bW91cyBmcmllbmQgZm91bmQgc29tZSBob3N0IG5hbWVzIHRoZSBMaW51eCB2ZXJzaW9uCiAgb2YgY3VybCBjb3VsZCBub3QgcmVzb2x2ZS4gSXQgdHVybmVkIG91dCB0aGUgYnVmZmVyIHVzZWQgdG8gcmV0cmlldmUgdGhhdAogIGluZm9ybWF0aW9uIHdhcyB0b28gc21hbGwuIEZpeGVkLiBPbmUgY291bGQgYXJndWUgYWJvdXQgdGhlIHVzZWZ1bG5lc3Mgb2YKICBub3QgaGF2aW5nIHRoZSBzbGlnaHRlc3QgdHJhY2Ugb2YgYSBtYW4gcGFnZSBmb3IgZ2V0aG9zdGJ5bmFtZV9yKCkgb24gbXkKICBMaW51eCBSZWRoYXQgaW5zdGFsbGF0aW9uLi4uCgpEYW5pZWwgKDEwIEF1Z3VzdCAyMDAwKQotIEJhbGFqaSBTIFJhbyB3YXMgZmlyc3QgaW4gbGluZSB0byBub3RlIHRoZSBtaXNzaW5nIHBvc3NpYmlsaXR5IHRvIHJlcGxhY2UKICB0aGUgQ29udGVudC1UeXBlOiBhbmQgQ29udGVudC1MZW5ndGg6IGhlYWRlcnMgd2hlbiBkb2luZyAtZCBwb3N0cy4gSSBhZGRlZAogIHRoZSBwb3NzaWJpbGl0eSBqdXN0IG5vdy4gSXQgc2VlbXMgc29tZSBwZW9wbGUgd2FudHMgdG8gZG8gc3RhbmRhcmQgcG9zdHMKICB1c2luZyBjdXN0b20gQ29udGVudC1UeXBlcy4KCkRhbmllbCAoOCBBdWd1c3QgMjAwMCkKLSBNaWtlIERvd2VsbCBjb3JyZWN0bHkgZGlzY292ZXJlZCB0aGF0IGN1cmwgZGlkIG5vdCBhcHByb3ZlIG9mIFVSTHMgd2l0aCBubwogIHVzZXIgbmFtZSBidXQgcGFzc3dvcmQuIEFzIGluICdodHRwOi8vOmZvb0BoYXh4LnNlJy4gSSBjb3JyZWN0ZWQgdGhpcy4KClZlcnNpb24gNy4xCgpEYW5pZWwgKDcgQXVndXN0IDIwMDApCi0gTXkgQUlYIDQgZml4IGRvZXMgbm90IHdvcmsuIEkgbmVlZCBoZWxwIGZyb20gYSBBSVggNCBoYWNrZXIuCgotIEkgYWRkZWQgbXkgbmV3IGRvY3VtZW50IGluIHRoZSBkb2NzIGRpcmVjdG9yeS4gSXQgaXMgYWltZWQgdG8gYmVjb21lIGEgc29ydAogIG9mIHR1dG9yaWFsIG9uIGhvdyB0byBkbyBIVFRQIHNjcmlwdGluZyB3aXRoIGN1cmwuCgpEYW5pZWwgKDQgQXVndXN0IDIwMDApCi0gV29ya2luZyB3aXRoIFJpY2ggR3JheSBvbiBjb21waWxpbmcgY3VybCBmb3IgbG90cyBvZiBkaWZmZXJlbnQgcGxhdGZvcm1zLgogIE15IGZpeCBmb3IgQUlYIDMuMiB3YXMgbm90IGdvb2QgZW5vdWdoIGFuZCB3YXMgc2xpZ2h0bHkgY2hhbmdlZCwgSSBoYWQgdG8KICBtb3ZlIGFuIGluY2x1ZGUgZmlsZSBiZWZvcmUgYW5vdGhlciwgYXMgaXMgbm93IGRlc2NyaWJlZCBpbiB0aGUgc291cmNlLgoKICBBSVggNC4yICg0Llg/KSBoYXMgZGlmZmVyZW50IGdldGhvc3RieW5hbWVfcigpIGFuZCBnZXRob3N0YnlhZGRyX3IoKQogIGZ1bmN0aW9ucyB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGRpZG4ndCBjaGVjayBmb3IgYW5kIHRodXMgdGhlIGNvbXBpbGUKICBicm9rZSB3aXRoIGFuIGVycm9yLiBJIGhhdmUgbm93IGNoYW5nZWQgdGhlIGdldGhvc3RieW5hbWVfcigpIGNoZWNrIGluIHRoZQogIGNvbmZpZ3VyZSBmaWxlIHRvIHN1cHBvcnQgYWxsIHRocmVlIHZlcnNpb25zIG9mIGJvdGggdGhlc2UgZnVuY3Rpb25zLiBNeQogIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyB0aGUgQUlYLXN0eWxlIGlzIHRob3VnaCBub3QgeWV0IHZlcmlmaWVkIGFuZCBJIG1heQogIGdldCBwcm9ibGVtcyB0byBmaXggaXQgaWYgaXQgdHVybnMgb3V0IHRvIGJ1ZyBzaW5jZSBJIGRvbid0IGhhdmUgYWNjZXNzIHRvCiAgYW55IHN5c3RlbSB1c2luZyB0aGF0LgoKICBGb3IgcHJvYmxlbXMgbGlrZSB0aGF0LCBJIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYWxsb3cgLS1kaXNhYmxlLXRocmVhZAogIHRvIGNvbXBsZXRlbHkgc3dpdGNoIG9mZiB0aGUgY2hlY2sgZm9yIHRocmVhZHNhZmUgdmVyc2lvbnMgb2YgYSBmZXcKICBmdW5jdGlvbnMgYW5kIHRodXMgZ28gd2l0aCB0aGUgImdvb2Qgb2xkIHZlcnNpb25zIiB0aGF0IHRlbmQgdG8gd29yawogIGFsdGhvdWdoIHdpbGwgYnJlYWsgdGhyZWFkLXNhZmVuZXNzIGZvciBsaWJjdXJsLiBNb3N0IHBlb3BsZSB3b24ndCB1c2UKICBsaWJjdXJsIGZvciBvdGhlciB0aGluZ3MgdGhhbiBjdXJsIHRob3VnaCwgYW5kIGN1cmwgZG9lc24ndCBuZWVkIGEKICB0aHJlYWQtc2FmZSBsaWIuCgotIFdvcmtpbmcgb24gbXkgYmlnIHR1dG9yaWFsIGFib3V0IEhUVFAgc2NyaXB0aW5nIHdpdGggY3VybC4KCkRhbmllbCAoMSBBdWd1c3QgMjAwMCkKLSBSaWNoIEdyYXkgc3BvdHRlZCBhIHByb2JsZW0gaW4gc3JjL3NldHVwLmggY2F1c2VkIGJ5IGEgI2RlZmluZSBzdHJlcXVhbCgpCiAgdGhhdCB3YXMganVzdCBhIGxlZnQtb3ZlciBmcm9tIHBhc3NlZCB0aW1lcy4gVGhlIHN0cmVxdWFsKCkgaXMgbm93IGEgdHJ1ZQogIGZ1bmN0aW9uIHN1cHBsaWVkIGJ5IGxpYmN1cmwgZm9yIGEgcG9ydGFibGUgY2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmcKICBjb21wYXJpc29uLiBJIGFkZGVkIHRoZSBwcm90b3R5cGVzIGluIGluY2x1ZGUvY3VybC5oIGFuZCByZW1vdmVkIHRoZQogIG5vdyBvYnNvbGV0ZSAjZGVmaW5lLgoKLSBJZ29yIEtocmlzdG9waG9yb3YgbWFkZSBhIGZpeCB0byBhbGxvdyByZXN1bWVkIGRvd25sb2FkIGZyb20gU3VuJ3MKICBKYXZhV2ViU2VydmVyLzEuMS4xLiBJdCBzZWVtcyB0aGF0IHRoZWlyIHNlcnZlciBzZW5kcyBiYWQgQ29udGVudC1SYW5nZQogIGhlYWRlcnMuCgotIFRoZSBtYWtlZmlsZXMgZm9yY2VkIGEgc3RhdGljIGxpYnJhcnkgYnVpbGQsIHdoaWNoIGlzIGJhZCBzaW5jZSB3ZSBub3cgdXNlCiAgbGlidG9vbCBhbmQgdGh1cyBoYXZlIGV4Y2VsbGVudCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0ISBBbGJlcnQgQ2hpbi1BLVlvdW5nCiAgZm91bmQgb3V0LgoKVmVyc2lvbiA3LjAuMTFiZXRhCgpEYW5pZWwgKDEgQXVndXN0IDIwMDApCi0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBwb2ludGVkIG91dCB0aGF0ICdtYWtlIGluc3RhbGwnIGRpZCBub3QgcHJvcGVybHkgY3JlYXRlCiAgdGhlIGhlYWRlciBpbmNsdWRlIGRpcmVjdG9yeSwgd2h5IGl0IGZhaWxlZCB0byBpbnN0YWxsIHRoZSBoZWFkZXIgZmlsZXMgYXMKICBpdCBzaG91bGQuIEF1dG9tYWtlIGlzbid0IHJlYWxseSBlcXVpcHBlZCB0byBkZWFsIHdpdGggc3ViZGlyZWN0b3JpZXMKICB3aXRob3V0IE1ha2VmaWxlcyBpbiBhbnkgbmljZSB3YXkuIEkgaGFkIHRvIHJ1biBhaGVhZCBhbmQgYWRkIE1ha2VmaWxlcyBpbgogIGJvdGggaW5jbHVkZSBhbmQgaW5jbHVkZS9jdXJsIGJlZm9yZSBJIG1hbmFnZWQgdG8gY3JlYXRlIGEgdG9wLWxldmVsCiAgbWFrZWZpbGUgdGhhdCBzdWNjZWVkcyBpbiBpbnN0YWxsIGV2ZXJ5dGhpbmcgcHJvcGVybHkhCgotIE9rLCBubyBtb3JlICJmZWF0dXJlcyIgYWRkZWQgbm93LiBMZXQncyBqdXN0IHZlcmlmeSB0aGF0IHRoZXJlJ3Mgbm8gbWFqb3IKICBmbGF3cyBhZGRlZCBub3cuCgpEYW5pZWwgKDMxIEp1bHkgMjAwMCkKLSBCb3RoIEplZmYgU2NoYXNueSBhbmQgS2V0aWwgRnJveW4gYXNrZWQgbWUgaG93IHRvIHRlbGwgY3VybCBub3QgdG8gc2VuZCBvbmUKICBvZiB0aG9zZSBpbnRlcm5hbGx5IGdlbmVyYXRlZCBoZWFkZXJzLiBUaGV5IGRpZG4ndCBzZXR0bGUgd2l0aCB0aGUgYmxhbmsKICBvbmVzIHlvdSBjb3VsZCB0ZWxsIGN1cmwgdG8gdXNlLiBJIHJld3JvdGUgdGhlIGhlYWRlci1yZXBsYWNlIHN0dWZmIGEKICBsaXR0bGUuIE5vdywgaWYgeW91IHJlcGxhY2UgYW4gaW50ZXJuYWwgaGVhZGVyIHdpdGggeW91ciBvd24gYW5kIHRoYXQgbmV3CiAgb25lIGlzIGEgYmxhbmsgaGVhZGVyIHlvdSB3aWxsIG9ubHkgcmVtb3ZlIHRoZSBpbnRlcm5hbCBvbmUgYW5kIG5vdCBnZXQgYW55CiAgYmxhbmsuIEkgY291bGRuJ3QgZmlndXJlIG91dCBhbnkgY2FzZSB3aGVuIHlvdSB3YW50IHRoYXQgYmxhbmsgaGVhZGVyLgoKRGFuaWVsICgyOSBKdWx5IDIwMDApCi0gSXQgc3RydWNrIG1lIHRoYXQgdGhlIGxpYiB1c2VkIGxvY2FsdGltZSgpIHdoaWNoIGlzIG5vdCB0aHJlYWQtc2FmZSwgc28gbm93CiAgSSB1c2UgbG9jYWx0aW1lX3IoKSBpbiB0aGUgc3lzdGVtcyB0aGF0IGhhcyBpdC4KCi0gSSB3ZW50IHRocm91Z2ggdGhpcyBlbnRpcmUgZG9jdW1lbnQgYW5kIHJlbW92ZWQgYWxsIGVtYWlsIGFkZHJlc3NlcyBhbmQgbGVmdAogIG5hbWVzIG9ubHkuIEkndmUgcmVhbGx5IG1hZGUgYW4gZWZmb3J0IHRvIGFsd2F5cyBub3RlIHdobyBicm91Z2h0IGJlIGJ1ZwogIHJlcG9ydHMgb3IgZml4ZXMsIGJ1dCBtb3JlIGFuZCBtb3JlIHBlb3BsZSBhc2sgbWUgdG8gcmVtb3ZlIHRoZSBlbWFpbAogIGFkZHJlc3NlcyBzaW5jZSB0aGV5IGJlY29tZSB2aWN0aW1zIGZvciBzcGFtcyB0aGlzIHdheS4gR29yZG9uIEJlYXRvbiBnb3QgbWUKICB3b3JraW5nIG9uIHRoaXMuCgpEYW5pZWwgKDI3IEp1bHkgMjAwMCkKLSBK9nJuIEhhcnRyb3RoIGZvdW5kIG91dCB0aGF0IHdoZW4geW91IHNwZWNpZmllZCBhIEhUVFAgcHJveHkgaW4gYW4KICBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgdXNlZCAtTCwgY3VybCBmYWlsZWQgaW4gdGhlIHNlY29uZCBmZXRjaC4gSQogIGNvcnJlY3RlZCB0aGlzIHByb2JsZW0gYW5kIHBvc3RlZCBhIHBhdGNoIHRvIHRoZSBsaXN0LiBObyBuZWVkIGZvciBhbiBleHRyYQogIGJldGEgcmVsZWFzZSBqdXN0IGZvciB0aGlzLgoKVmVyc2lvbiA3LjAuMTBiZXRhCgpEYW5pZWwgKDI3IEp1bHkgMjAwMCkKLSBTbywgbGlidG9vbCByZXBsYWNlZCB0d28gb2YgbXkgZmlsZXMgd2l0aCBzeW1ib2xpYyBsaW5rcyBhbmQgSSBmb3Jnb3QgdG8gYWRkCiAgdGhlIHR3byBuZXcgbGlidG9vbCBmaWxlcyB0byB0aGUgcmVsZWFzZSBhcmNoaXZlIChhbmQgdGhleSB3ZXJlIGFkZGVkIGFzCiAgc3ltbGlua3MgYXMgd2VsbCEpIFRoaXMgb2YgY291cnNlIGxlYWQgdG8gdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBmYWlsZWQKICBvbiA3LjAuOS4uLgoKVmVyc2lvbiA3LjAuOWJldGEKCkRhbmllbCAoMjUgSnVseSAyMDAwKQotIEtyaXN0aWFuIEv2aG50b3BwIDxrcmlzIGF0IGtvZWhudG9wcC5kZT4gYnJvdWdodCBhIGZpeCB0aGF0IG1ha2VzIGxpYmN1cmwKICBsaWJ0b29saWZpZWQsIGp1c3QgYXMgd2UndmUgd2FudGVkIGZvciBhIHdoaWxlIG5vdy4gSGUgYWxzbyBtYWRlIHRoZQogIHJlY2VudGx5IGFkZGVkIG1hbiBwYWdlcyBnZXQgaW5zdGFsbGVkIHByb3Blcmx5IG9uICdtYWtlIGluc3RhbGwnIGFuZCBzb21lCiAgb3RoZXIgbmljZSBjbGVhbnVwcy4KCi0gSW4gYSBkaXNjdXNzaW9uIHdpdGggRWV0dSBPamFuZW4gaXQgc3RydWNrIG1lIHRoYXQgaWYgd2UgdXNlIGN1cmwgdG8gZ2V0IGEKICBwYWdlIHVzaW5nIGEgcGFzc3dvcmQsIGFuZCB0aGF0IHBhZ2UgdGhlbiBzZW5kcyBhIExvY2F0aW9uOiB0byBhbm90aGVyCiAgc2VydmVyIHRoYXQgY3VybCBmb2xsb3dzLCBjdXJsIHdpbGwgc2VuZCB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZCB0byB0aGF0CiAgc2VydmVyIGFzIHdlbGwuCgogIE5vdywgSSdsbCBuZXZlciBiZSBhYmxlIHRvIG1ha2UgY3VybCBkbyBMb2NhdGlvbjogZm9sbG93aW5nIGFsbCB0aGF0IHBlcmZlY3QKICBhbmQgeW91J3JlIGFsbCBzb29uZXIgb3IgbGF0ZXIgcmVxdWlyZWQgdG8gd3JpdGUgYSBzY3JpcHQgdG8gZG8gc2V2ZXJhbAogIGZldGNoZXMgd2hlbiB5b3UncmUgZG9pbmcgYWR2YW5jZWQgc3R1ZmYsIGJ1dCBub3cgSSd2ZSBtb2RpZmllZCBjdXJsIHRvIGF0CiAgbGVhc3QgKm9ubHkqIHNlbmQgdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgdG8gdGhlIG9yaWdpbmFsIHNlcnZlci4gV2hpY2gKICBtZWFucyB0aGF0IGlmIGdldCBhIHBhZ2UgZnJvbSBzZXJ2ZXIgQSB3aXRoIGEgcGFzc3dvcmQsIHRoYXQgZm9yd2FyZHMgY3VybAogIHRvIHNlcnZlciBCLCBjdXJsIHdvbid0IHVzZSB0aGUgcGFzc3dvcmQgdGhlcmUuIElmIHNlcnZlciBCIHRoZW4gZm9yd2FyZHMKICBjdXJsIGJhY2sgdG8gc2VydmVyIEEgYWdhaW4sIHRoZSBwYXNzd29yZCB3aWxsIGJlIHVzZWQgYWdhaW4uCgogIFRoaXMgaXMgbm90IGEgcGVyZmVjdCBpbXBsZW1lbnRhdGlvbiwgYXMgaW4gYSBicm93c2VyIGNhc2UgaXQgd291bGQgb25seSB1c2UKICB0aGUgcGFzc3dvcmQgaWYgdGhlIGxlZnQtcHJlZml4IG9mIHRoZSBmaXJzdCBwYXRoIGlzIHRoZSBzYW1lLiBJIGp1c3QgdGhpbmsKICB0aGF0IHRoaXMgZml4IHByZXZlbnRzIGEgc29tZXdoYXQgbHVya3kgInNlY3VyaXR5IGhvbGUiLgoKICBBcyBhIHNpZGUtbm90ZSBpbiB0aGlzIHN1YmplY3Q6IEhUVFAgcGFzc3dvcmRzIGFyZSBzZW50IGluIGNsZWFydGV4dCBhbmQKICB3aWxsIG5ldmVyIGJlIGNvbnNpZGVyZWQgdG8gYmUgc2FmZSBvciBzZWN1cmUuIFVzZSBIVFRQUyBmb3IgdGhhdC4KCi0gQXMgZGlzY3Vzc2VkIG9uIHRoZSBtYWlsaW5nIGxpc3QsIEkgY29udmVydGVkIHRoZSBGVFAgcmVzcG9uc2UgcmVhZGluZwogIGZ1bmN0aW9uIGludG8gdXNpbmcgc2VsZWN0KCkgd2hpY2ggdGhlbiBhbGxvd3MgdGltZW91dHMgKGV2ZW4gdW5kZXIgd2luMzIhKQogIGlmIHRoZSBjb21tYW5kLXJlcGx5IHNlc3Npb24gZ2V0cyB0b28gc2xvdyBvciBkaWVzIGNvbXBsZXRlbHkuIEkgbWFkZSBhCiAgZGVmYXVsdCB0aW1lb3V0IG9uIDM2MDAgc2Vjb25kcyB1bmxlc3MgYW55dGhpbmcgZWxzZSBpcyBzcGVjaWZpZWQsIHNpbmNlIEkKICBkb24ndCB0aGluayBhbnlvbmUgd2FudHMgdG8gd2FpdCBtb3JlIHRoYW4gdGhhdCBmb3IgYSBzaW5nbGUgY2hhcmFjdGVyIHRvCiAgZ2V0IHJlY2VpdmVkLi4uCgotIFRvcnN0ZW4gRm9lcnRzY2ggPHRvcnN0ZW4uZm9lcnRzY2ggYXQgZ214Lm5ldD4gYnJvdWdodCBhIHNldCBvZiBmaXhlcyBmb3IKICB0aGUgcmZjMTg2NyBmb3JtIHBvc3RzLiBIZSBpbnRyb2R1Y2VkICduYW1lPTxmaWxlJyB3aGljaCBicmluZ3MgYSBtZWFucyB0bwogIHN1dXBseSB2ZXJ5IGxhcmdlIHRleHQgY2h1bmtzIHJlYWQgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBuYW1lLiBJdCBkaWZmZXJzIGZyb20KICAnbmFtZT1AZmlsZScgaW4gdGhlIHdheSB0aGF0IHRoaXMgbGF0dGVyIHRoaW5nIGlzIG1hcmtlZCBpbiB0aGUgdXBsb2FkZWQKICBjb250ZW50cyBhcyBhIGZpbGUgdXBsb2FkLCB3aGlsZSB0aGUgZmlyc3QgaXMganVzdCB0ZXh0IChhcyBpbiBhIGlucHV0IG9yCiAgdGV4dGFyZWEgZmllbGQpLiBUb3JzdGVuIGFsc28gY29ycmVjdGVkIGEgYnVnIHRoYXQgd291bGQgaGFwcGVuIGlmIHlvdSB1c2VkCiAgJXMgb3Igc2ltaWxhciBpbiBhIC1GIGZpbGUgbmFtZS4KCi0gQXMgZGlzY292ZXJlZCBieSBOaWNvIEJhZ2d1cyA8Tmljby5CYWdndXMgYXQgbWFpbC5pbmcubmw+LCB3aGVuIHRyYW5zZmVycmluZwogIGZpbGVzIHRvL2Zyb20gRlRQIHVzaW5nIHR5cGUgQVNDSUkgY3VybCBzaG91bGQgbm90IGV4cGVjdCB0aGUgdHJhbnNmZXIgdG8gYmUKICB0aGUgZXhhY3Qgc2l6ZSByZXBvcnRlZCBieSB0aGUgc2VydmVyIGFzIHRoZSBmaWxlIHNpemUuIFNpbmNlIEFTQ0lJIG1heSB2ZXJ5CiAgd2VsbCBtZWFuIHRoYXQgdGhlIGNvbnRlbnQgaXMgdHJhbnNsYXRlZCB3aGlsZSB0cmFuc2ZlcmVkLCB0aGUgZmluYWwgc2l6ZQogIG1heSB2ZXJ5IHdlbGwgZGlmZmVyLiBUaGVyZWZvciwgY3VybCBub3cgaWdub3JlcyB0aGUgZmlsZSBzaXplIHdoZW4gZG9pbmcKICBBU0NJSSB0cmFuc2ZlcnMgaW4gRlRQLgoKRGFuaWVsICgyNCBKdWx5IDIwMDApCi0gQWRkZWQgQ1VSTE9QVF9QUk9YWVBPUlQgdG8gdGhlIGN1cmxfZWFzeV9zZXRvcHQoKSBjYWxsIHRvIGFsbG93IHRoZSBwcm94eQogIHBvcnQgbnVtYmVyIHRvIGJlIHNldCBzZXBhcmF0ZWx5IGZyb20gdGhlIHByb3h5IGhvc3QgbmFtZS4KCi0gQW5kcmV3IDxhbmRyZXcgYXQgdWdoLm5ldC5hdT4gcG9pbnRlZCBvdXQgYSBuZXRyYyBtYW51YWwgYnVnLgoKLSBUaGUgRlRQIHRyYW5zZmVyIGNvZGUgbm93IGFjY2VwdHMgYSAyNTAtY29kZSBhcyB3ZWxsIGFzIHRoZSBwcmV2aW91c2x5CiAgYWNjZXB0ZWQgMjI2LCBhZnRlciBhIHN1Y2Nlc3NmdWwgZmlsZSB0cmFuc2Zlci4gTW9oYW4gPG1uYWlyIGF0CiAgZXZlcmdyZWVuLWZ1bmRzLmNvbT4gcG9pbnRlZCB0aGlzIG91dC4KCi0gVGhlIGNoZWNrIGZvciAqYm90aCogbnNsIGFuZCBzb2NrZXQgd2FzIG5ldmVyIGFkZGVkIGluIHRoZSB2NyBjb25maWd1cmUuaW4KICB3aGVuIEkgbW92ZWQgdGhlIG1haW4gYnJhbmNoLiBJIHJlLWFkZGVkIHRoYXQgY2hlY2sgdG8gY29uZmlndXJlLmluLiBUaGlzIHdhcwogIGRpc2NvdmVyZWQgYnkgUmljaCBHcmF5LgoKLSBIb3dhcmQsIEJsYWlzZSA8QmxhaXNlLkhvd2FyZCBhdCBmYWN0aXZhLmNvbT4gcG9pbnRlZCBvdXQgYSBtaXNzaW5nIGZyZWUoKSBpbgogIGN1cmxfZGlzY29ubmVjdCgpIHdoaWNoIG9mIGNvdXJzZSBtZWFudCBsaWJjdXJsIGF0ZSBtZW1vcnkuCgotIEJyaWFuIEUuIEdhbGxldyBub3RlZCB0aGF0IHRoZSBIVFRQICdIb3N0OicgaGVhZGVyIGN1cmwgc2VudCBkaWQgbm90CiAgcHJvcGVybHkgaW5jbHVkZSB0aGUgcG9ydCBudW1iZXIgaWYgbm9uLWRlZmF1bHQgcG9ydHMgd2VyZSB1c2VkLiBUaGlzIHNob3VsZAogIG5vdyBoYXZlIGJlZW4gZml4ZWQuCgotIEhUVFAgY29ubmVjdCBlcnJvcnMgbm93IHJldHVybiBlcnJvcnMgZWFybGllci4gVGhpcyB3YXMgbW9zdCBub3RhYmx5IGNhdXNpbmcKICBwcm9ibGVtcyB3aGVuIHRoZSBIVFRQUyBjZXJ0aWZpY2F0ZSBoYWQgcHJvYmxlbXMgYW5kIGxhdGVyIGNhdXNlZCBhIGNyYXNoLgogIE1hbnkgdGhhbmtzIHRvIEdyZWdvcnkgTmljaG9sbHMgPGduaWNob2xscyBhdCBsZXZlbDguY29tPiBmb3IgZGlzY292ZXJpbmcKICBhbmQgc3VnZ2VzdGluZyBhIGZpeC4uLgoKRGFuaWVsICgyMSBKdW5lIDIwMDApCi0gQWZ0ZXIgYSAiYnVnIHJlcG9ydCIgSSByZWNlaXZlZCB3aGVyZSB0aGUgdXNlciB3YXMgdXNpbmcgYm90aCAtRiBhbmQgLUkgaW4gYQogIEhUVFAgcmVxdWVzdCAoaXQgc2V2ZXJseSBjb25mdXNlZCB0aGUgbGlicmFyeSBJIHNob3VsZCBhZGQpLCBJIGFkZGVkIHNvbWUKICBjaGVja3MgdG8gc3JjL21haW4uYyB0aGF0IHByZXZlbnRzIHNldHRpbmcgbW9yZSB0aGFuIG9uZSBIVFRQIHJlcXVlc3QKICBjb21tYW5kLCBubyBtYXR0ZXIgd2hhdCB0aGUgdXNlciB3YW50cyEgOy0pCgpWZXJzaW9uIDcuMC44YmV0YQoKRGFuaWVsICgyMCBKdW5lIDIwMDApCi0gSSBkaWQgYSBtYWpvciByZXBsYWNlIGluIG1hbnkgZmlsZXMgdG8gdXNlIHRoZSBuZXcgY3VybCBkb21haW4gaGF4eC5zZQogIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIG9uZS4KCi0gQXMgRWV0dSBPamFuZW4gc3VnZ2VzdGVkLCBJIGZpbmFsbHkgdG9vayB0aGUgc3RlcCBhbmQgbm93IGxpYmN1cmwgbm8gbG9uZ2VyCiAgbWFrZXMgYSBQT1NUIGFmdGVyIGl0IGhhcyBmb2xsb3dlZCBhIGxvY2F0aW9uLiBXaGVuIHRoZSBpbml0aWFsIFBPU1QgaGFzCiAgYmVlbiBkb25lLCBpdCdsbCB0dXJuZWQgaW50byBhIEdFVCBmb3IgdGhlIGZ1cnRoZXIgcmVxdWVzdHMuIFRoaXMgaXMgb25seQogIGludGVyZXN0aW5nIHdoZW4gdXNpbmcgLUwvLS1sb2NhdGlvbiAqYW5kKiBkb2luZyBhIFBPU1QgYXQgdGhlIHNhbWUgdGltZS4KCiAgV2hpbGUgbWVzc2luZyB3aXRoIHRoaXMsIEkgYWRkZWQgYW5vdGhlciB3ZWlyZCBmZWF0dXJlIEkgY2FsbCAnYXV0bwogIHJlZmVyZXInLiBJZiB5b3UgYXBwZW5kICc7YXV0bycgdG8gdGhlIHJpZ2h0IG9mIGEgZ2l2ZW4gcmVmZXJlciBzdHJpbmcgKG9yCiAgb25seSB1c2UgdGhhdCBzdHJpbmcgYXMgcmVmZXJlciksIGxpYmN1cmwgd2lsbCBhdXRvbWF0aWNhbGx5IHNldCB0aGUKICBwcmV2aW91ZCBVUkwgYXMgcmVmZXJlZCB3aGVuIGl0IGZvbGxvd3MgYSBMb2NhdGlvbjogYW5kIGdldHMgYSBzdWNjZWVkaW5nCiAgZG9jdW1lbnQuCgotIE15IGhlcm8gUmljaCBHcmF5IGZvdW5kIHRoZSB2ZXJ5IG9ic2N1cmUgRlRQIGJ1ZyB0aGF0IGhhcHBlbmVkIHRvIGhpbSBvbmx5CiAgd2hlbiBwYXNzaW5nIHRocm91Z2ggYSBwYXJ0aWN1bGFyIGZpcmV3YWxsIGFuZCB1c2luZyB0aGUgUE9SVCBjb21tYW5kLiBJdAogIHR1cm5lZCBvdXQgdGhhdCBQT1JUIHdhcyB0aGUgb25seSBjb21tYW5kIGluIHRoZSBsaWIvZnRwLmMgc291cmNlIHRoYXQKICBkaWRuJ3Qgc2VuZCBhIHByb3BlciBcclxuIHNlcXVlbmNlIGJ1dCBpbnN0ZWFkIHVzZWQgdGhlIGZhdWx0eSBcbiB3aGljaCBhcwogIGl0IHNlZW1lZCBpcyBzdXBwb3J0ZWQgYnkgbW9zdCBtYWpvciBmdHAgc2VydmVycy4uLiA6LU8KClZlcnNpb24gNy4wLjdiZXRhCgpEYW5pZWwgKDE2IEp1bmUgMjAwMCkKLSBJIGhhZCBhdm9pZGVkIHRoaXMgbG9uZyBlbm91Z2ggbm93LCBzbyBJIG1vdmVkIHRoZSBhbHRlcm5hdGl2ZSBwcm9ncmVzcyBiYXIKICBzdHVmZiBmcm9tIHRoZSBsaWIgYW5kIGFkZGVkIGl0IHRvIHRoZSBjbGllbnQgY29kZS4gVGhpcyBpcyBub3cgdXNpbmcgdGhlCiAgcmVjZW50bHkgYWRkZWQgcHJvZ3Jlc3MgY2FsbGJhY2sgYW5kIGl0IHNlZW1zIHRvIHdvcmsgcHJldHR5IG11Y2ggbGlrZQogIGJlZm9yZS4gU2luY2UgaXQgaXMgb25seSBvbmUgcHJvZ3Jlc3MgYmFyIGFuZCB5b3UgYW5kIGRvd25sb2FkIGFuZCB1cGxvYWQgYXQKICB0aGUgc2FtZSB0aW1lLCB0aGlzIGJhciBzaG93cyB0aGUgY29tYmluZWQgcHJvZ3Jlc3Mgb2YgYm90aCBkaXJlY3Rpb25zLiBUaGlzCiAgY29kZSB3YXMganVzdCBwb3J0ZWQgZnJvbSB0aGUgb2xkIHBsYWNlIHRvIHRoaXMsIExhcnMgaXMgc3RpbGwgb3VyIHNhdmlvdXIhCiAgOy0pIFRoaXMgYWxzbyBtYWRlIHRoZSBkb2N1bWVudGF0aW9uIG1vcmUgYWNjdXJhdGUgc2luY2UgSSBuZXZlciByZW1vdmVkCiAgdGhpcyBmdW5jdGlvbiBmcm9tIGFueSBkb2NzISBBbHRob3VnaCBJIG5vdyByZW1vdmVkIHRoZSBDVVJMT1BUX1BST0dSRVNTTU9ERQogIGZyb20gdGhlIGxpYnJhcnkgc2luY2UgdGhlIGxpYiBoYXMgb25seSBvbmUgaW50ZXJuYWwgcHJvZ3Jlc3MgbWV0ZXIgYW5kIGl0CiAgd2lsbCBuZXZlciBnZXQgYW5vdGhlci4gSXQgaXMgYWx0aG91Z2ggbGlrZWx5IHRoYXQgdGhlIGludGVybmFsIG9uZSBhbHNvCiAgd2lsbCBiZSBtb3ZlZCB0byB0aGUgY2xpZW50IGNvZGUgaW4gdGhlIGZ1dHVyZSAod2hlbiBJIGhhdmUgb3RoZXIgbWVhbnMgb2YKICBnZXR0aW5nIHRoZSB3cml0ZW91dCBkYXRhIGFuZCBtb3ZlIHRoYXQgdG9vIHRvIHRoZSBjbGllbnQpLgoKLSBJIHRvb2sgdGhlIG9wcG9ydHVuaXR5IHRvIHZlcmlmeSB0aGF0IHN0YW5kYXJkIHByb2dyZXNzIG1ldGVyIHdvcmtzIGFuZCBJCiAgZm91bmQgb3V0IGl0IGRpZG4ndCBnZXQgaW5pdGVkIHByb3Blcmx5LiBHcnJyLiBJIGNvcnJlY3RlZCB0aGF0IGFzIHdlbGwuCgpEYW5pZWwgKDE1IEp1bmUgMjAwMCkKLSBJIHRob3VnaHQgSSdkIGJldHRlciB2ZXJpZnkgdGhhdCB0aGUgLUYgb3B0aW9uIHN0aWxsIHdvcmtzIGluIHY3IGFuZCBvZgogIGNvdXJzZSBpdCBkaWRuJ3QuLi4gOi0vIEFueXdheSwgSSBoYWQgdGhlIHByb2JsZW1zIEkgY291bGQgZGlzY292ZXIKICBjb3JyZWN0ZWQuIEFib3V0IG9uZSBtb250aCBvZiBiZXRhIHRlc3RpbmcgYW5kIG5vdCBhIHNpbmdsZSBwZXJzb24gaGFzIHVzZWQKICB0aGlzIGZlYXR1cmUgd2l0aCB2Nz8KCi0gQmr2cm4gY29ycmVjdGx5IHBvaW50ZWQgb3V0IHRoYXQgdGhlIC0tcHJvZ3Jlc3MtYmFyIHN0aWxsIGRvZXNuJ3Qgd29yayBpbgogIHY3LiBIbS4KCkRhbmllbCAoMTQgSnVuZSAyMDAwKQotIFRpbSBUYXNzb25pcyBkaXNjb3ZlcmVkIHRoYXQgY3VybCA3IGRpZG4ndCBoYW5kbGUgbm9ybWFsIGh0dHAgUE9TVCBhcyBpdAogIHNob3VsZC4gSSBjb3JyZWN0ZWQgdGhpcy4KClZlcnNpb24gNy4wLjZiZXRhCgpEYW5pZWwgKDE0IEp1bmUgMjAwMCkKLSBCavZybiBTdGVuYmVyZyBwb2ludGVkIG91dCBzZXZlcmFsIHByb2JsZW1zIChyZWxhdGVkIHRvIHdpbjMyIGNvbXBpbGluZyk6CiAgbGliL3N0cmVxdWFsLmMgaGFkIGEgYmFkICNpZmRlZiBmb3Igb25lIG9mIHRoZSBzdHJpbmcgY29tcGFyaXNvbnMgKHdpbjMyKQogIHNyYy9tYWluLmMgaGFkIHNldmVyYWwgbWlub3IgcHJvYmxlbXMKICBsaWIvbWFrZWZpbGUubTMyIGhhZCBnZXRwYXNzLltjb10gdHdpY2UKICBzcmMvY29uZmlnLXdpbjMyLmggbGFja2VkIHRoZSBIQVZFX0ZDTlRMX0ggZGVmaW5lCiAgYm90aCBjb25maWctd2luMzIuaCBmaWxlcyBub3cgb25seSBzZXQgdGhlIEhBVkVfVU5JU1REX0ggZGVmaW5lIGlmIHRoZQogIGRlZmluZSBNSU5HVzMyIGlzIHNldCwgYW5kIEkgbW9kaWZpZWQgc3JjL21ha2VmaWxlLm0zMiBhbmQgbGliL21ha2VmaWxlLm0zMgogIHRvIHNldCBpdC4KClZlcnNpb24gNy4wLjViZXRhCgpEYW5pZWwgKDE0IEp1bmUgMjAwMCkKLSBBcHBsaWVkIEx1b25nIERpbmggRHVuZydzIGNvbW1lbnRzIGFib3V0IGEgZmV3IHdpbjMyIGNvbXBpbGUgcHJvYmxlbXMuCgotIEFwcGxpZWQgQmr2cm4gU3RlbmJlcmcncyBzdWdnZXN0ZWQgZml4IHRoYXQgdHVybnMgdGhlIHdpbjMyIHN0ZG91dCB0bwogIGJpbmFyeS4gSXQgd29uJ3QgZG8gaXQgaWYgdGhlIC1CIC8gLS11c2UtYXNjaWkgb3B0aW9uIGlzIHVzZWQuIFRoYXQgb3B0aW9uCiAgaXMgbm93IGFuIGV4dGVuZGVkIHZlcnNpb24gb2YgdGhlIHByZXZpb3VzIC1CIC8tLWZ0cC0tYXNjaWkuIFRoZSBmbGFnIHdhcwogIGFscmVhZHkgaW4gdXNlIGJlIHRoZSBsZGFwIGFzIHdlbGwgc28gdGhlIG5ldyBuYW1lIGZpdHMgcHJldHR5IGdvb2QuIFRoZQogIGxpYmN5cmwgQ1VSTE9QVF9UUkFOU0ZFUlRFWFQgd2FzIGFsc28gaW50cm9kdWNlZCBhcyBhbiBhbGlhcyB0byB0aGUgbm93CiAgb2Jzb2xldGUgQ1VSTE9QVF9GVFBBU0NJSS4gQ2FuJ3QgdmVyaWZ5IHRoaXMgZml4IG15c2VsZiBhcyBJIGhhdmUgbm8gd2luMzIKICBjb21waWxlciBhcm91bmQuCgpEYW5pZWwgKDEzIEp1bmUgMjAwMCkKLSBMdW9uZyBEaW5oIER1bmcgPGR1bmcgYXQgc2NoLmJtZS5odT4gZm91bmQgYSBwcm9ibGVtIGluIGN1cmxfZWFzeV9jbGVhbnVwKCkKICBzaW5jZSBpdCBmcmVlKCllZCB0aGUgbWFpbiBjdXJsIHN0cnVjdCAqdHdpY2UqLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQuCgpEYW5pZWwgKDkgSnVuZSAyMDAwKQotIFVwZGF0ZWQgdGhlIFJFU09VUkNFUyBmaWxlLCBhZGRlZCBhIFJFQURNRS53aW4zMiBmaWxlLgoKRGFuaWVsICg4IEp1bmUgMjAwMCkKLSBTbyBJIGZpbmFsbHkgYWRkZWQgdGhlIHByb2dyZXNzIGNhbGxiYWNrIHRvIHRoZSAqc2V0b3B0KCkgb3B0aW9ucyBhbmQgaXQKICBzaG91bGQgd29yayBub3cuIEkgZG9uJ3QgaGF2ZSB0aGUgZW5lcmd5IHRvIHdyaXRlIGFueSB0ZXN0IHByb2dyYW0gZm9yIGl0CiAgcmlnaHQgbm93LgotIE1hZGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHR5cGVkZWZzIHB1YmxpYyBpbiBjdXJsL2N1cmwuaCBmb3IgY29tZm9ydC4gSnVzdAogIGluIGNhc2UgYW55b25lIHdhbm5hIGZpZGRsZSB3aXRoIHN1Y2ggcG9pbnRlcnMuCi0gVXBkYXRlZCB0aGUgY3VybF9lYXN5X3NldG9wdCgpIG1hbiBwYWdlIGFjY29yZGluZ2x5LgoKVmVyc2lvbiA3LjAuNGJldGEKCkRhbmllbCAoMiBKdW5lIDIwMDApCi0gSSBub3RpY2VkIHRoYXQgd2hlbiBkb2luZyBMb2NhdGlvbjogZm9sbG93aW5nLCB3ZSBsb3N0IGN1c3RvbSBoZWFkZXJzIGluIGFsbAogIGJ1dCB0aGUgZmlyc3QgcmVxdWVzdC4KLSBSZW1vdmVkIHRoZSAnSHR0cFBvc3QnIHN0cnVjdCBhbmQgbW92ZWQgdGhlIGhlYWRlciBzdHVmZiB0byB0aGUgbW9yZSBnZW5lcmljCiAgY3VybF9zbGlzdC4KLSBBZGRlZCBzb21lIGJldHRlciBzbGlzdC1jbGVhbnVwcyBpbiBzcmMvbWFpbi5jCgpWZXJzaW9uIDcuMC4zYmV0YQoKRGFuaWVsICgzMSBNYXkgMjAwMCkKLSBTbyBJIGRpc2NvdmVyZWQgdGhhdCBJIHJlbGVhc2VkIHRoZSA3LjAuMmJldGEgd2l0aG91dCBpdCBiZWluZyBhYmxlIHRvCiAgY29tcGlsZSB1bmRlciBMaW51eC4gZ2V0aG9zdGJ5bmFtZV9yKCkgYW5kIGdldGhvc3RieWFkZHJfcigpIHR1cm5lZCBvdXQgdG8KICBmZWF0dXJlIGEgZGlmZmVyZW50IGFtb3VudCBvZiBhcmd1bWVudHMgb24gZGlmZmVyZW50IHN5c3RlbXMgc28gSSBoYWQgdG8gYWRkCiAgYSBjb25maWd1cmUgY2hlY2sgZm9yIHRoaXMgYW5kIGFkanVzdCB0aGUgY29kZSBzbGlnaHRseS4KClZlcnNpb24gNy4wLjJiZXRhCgpEYW5pZWwgKDI5IE1heSAyMDAwKQotIENvcnJlY3RlZCB0aGUgYml0cy4qIGFzc2lnbm1lbnRzIHdoZW4gdXNpbmcgQ1VSTE9QVCBvcHRpb25zIHRoYXQgb25seQogIHRvZ2dsZXMgb25lIG9mIHRob3NlIGJpdHMuCgotIEFwcGxpZWQgdGhlIGh1Z2UgcGF0Y2hlcyBmcm9tIERhdmlkIExlQmxhbmMgPGRsZWJsYW5jIGF0IHFueC5jb20+IHRoYXQgYWRkCiAgdXNhZ2Ugb2YgdGhlIGdldGhvc3RieW5hbWVfcigpIGFuZCBzaW1pbGFyIGZ1bmN0aW9ucyBpbiBjYXNlIHRoZXkncmUgYXJvdW5kLAogIHNpbmNlIHRoYXQgbWFrZSBsaWJjdXJsIG11Y2ggYmV0dGVyIHRocmVhZHNhZmUgaW4gbWFueSBzeXN0ZW1zIChzdWNoIGFzCiAgc29sYXJpcykuIEkgYWRkZWQgdGhlIGNoZWNrcyBmb3IgdGhlc2UgZnVuY3Rpb25zIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKICBJIGNhbid0IGV4cGxhaW4gd2h5LCBidXQgdGhlIGluZXRfbnRvYV9yKCkgZnVuY3Rpb24gZGlkIG5vdCBhcHBlYXIgaW4gbXkKICBTb2xhcmlzIGluY2x1ZGUgZmlsZXMsIEkgaGFkIHRvIGFkZCBteSBvd24gaW5jbHVkZSBmaWxlIGZvciB0aGlzIGZvciBub3cuCgpEYW5pZWwgKDIyIE1heSAyMDAwKQotIEr2cm4gSGFydHJvdGggYnJvdWdodCBtZSBmaXhlcyB0byBtYWtlIHRoZSB3aW4zMiB2ZXJzaW9uIGNvbXBpbGUgcHJvcGVybHkgYXMKICB3ZWxsIGFzIGEgcmVuYW1lIG9mIHRoZSAnaW50ZXJmYWNlJyBmaWVsZCBpbiB0aGUgdXJsZGF0YSBzdHJ1Y3QsIGFzIGl0IHNlZW1zCiAgdG8gYmUgcmVzZXJ2ZWQgaW4gc29tZSBnY2MgdmVyc2lvbnMhCgotIFJpY2ggR3JheSBzdHJ1Y2sgYmFjayB3aXRoIHlldCBzb21lIHBvcnRhYmlsaXR5IHJlcG9ydHMuIERhdGEgR2VuZXJhbCBERy9VWAogIG5lZWRlZCBhIGxpdHRsZSBmaXggaW4gbGliL2xkYXAuYyBzaW5jZSBpdCBkb2Vzbid0IGhhdmUgUlRMRF9HTE9CQUwgZGVmaW5lZC4KICBNb3JlIGZpeGVzIGFyZSBleHBlY3RlZCBhcyBhIHJlc3VsdCBvZiBSaWNoaWVzIHZlcnkgaGVscGZ1bCB3b3JrLgoKVmVyc2lvbiA3LjAuMWJldGEKCkRhbmllbCAoMjEgTWF5IDIwMDApCi0gVXBkYXRlZCBsb3RzIG9mICNkZWZpbmVzLCBlbnVtcyBhbmQgdmFyaWFibGUgdHlwZSBuYW1lcyBpbiB0aGUgbGlicmFyeS4gTm8KICBtb3JlIHdlaXJkIFVSRyBvciBVUkxUQUcgcHJlZml4ZXMuIEFsbCB0eXBlcyBhbmQgbmFtZXMgc2hvdWxkIGJlIGN1cmwtCiAgcHJlZml4ZWQgdG8gYXZvaWQgbmFtZSBzcGFjZSBjbGFzaGVzLiBUaGUgRkxBR1MtcGFyYW1ldGVyIHRvIHRoZSBmb3JtZXIKICBjdXJsX3VybGdldCgpIGhhcyBiZWVuIGNvbnZlcnRlZCBpbnRvIGEgYnVuY2ggb2YgZmxhZ3MgdG8gdXNlIGluIHNlcGFyYXRlCiAgc2V0b3B0IGNhbGxzLiBJJ20gc3RpbGwgZm9jdXNpbmcgb24gdGhlIGVhc3ktaW50ZXJmYWNlLCBhcyB0aGUgY3VybCB0b29sIGlzCiAgbm93IHVzaW5nIHRoYXQuCgotIEJqb3JuIFJlZXNlIGhhcyBwcm92aWRlZCBtZSB3aXRoIGFuIGFzeW5jaHJvbm91cyBuYW1lIHJlc29sdmVyIHRoYXQgSSBwbGFuCiAgdG8gdXNlIGluIHVwY29taW5nIHZlcnNpb25zIG9mIGN1cmwgdG8gYmUgYWJsZSB0byBncmFjZWZ1bGx5IHRpbWVvdXQgbmFtZQogIGxvb2t1cHMuCgpWZXJzaW9uIDcuMGJldGEKCkRhbmllbCAoMTggTWF5IDIwMDApCi0gSW50cm9kdWNlZCBMSUJDVVJMX1ZFUlNJT05fTlVNIHRvIHRoZSBjdXJsLmggaW5jbHVkZSBmaWxlIHRvIGJldHRlciBhbGxvdwogIHNvdXJjZSBjb2RlcyB0byBiZSBkZXBlbmRlbnQgb24gdGhlIGxpYiB2ZXJzaW9uLiBUaGlzIGRlZmluZSBpcyBub3cgc2V0IHRvCiAgYSBkZXhhZGVjaW1hbCBudW1iZXIsIHdpdGggOCBiaXRzIGVhY2ggZm9yIG1ham9yIG51bWJlciwgbWlub3IgbnVtYmVyIGFuZAogIHBhdGNoIG51bWJlci4gSW4gb3RoZXIgd29yZHMsIHZlcnNpb24gMS4yLjMgd291bGQgbWFrZSBpdCAweDAxMDIwMy4gSXQgYWxzbwogIG1ha2VzIGEgbGFyZ2VyIG51bWJlciBhIG5ld2VyIHZlcnNpb24uCgpEYW5pZWwgKDE3IE1heSAyMDAwKQotIE1hcnRpbiBLYW1tZXJob2ZlciBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgc2V2ZXJhbCBmbGF3cyBpbiB0aGUgRlRQIHJhbmdlCiAgb3B0aW9uLiBJIGNvcnJlY3RlZCB0aGVtLgotIFJlbW92ZWQgdGhlIHdpbjMyIHdpbnNvY2sgaW5pdCBjcmFwIGZyb20gdGhlIGxpYiB0byB0aGUgc3JjL21haW4uYyBmaWxlCiAgaW4gdGhlIGFwcGxpY2F0aW9uIGluc3RlYWQuIFRoZXkgY2FuJ3QgYmUgaW4gdGhlIGxpYiwgZXNwZWNpYWxseSBub3QgZm9yCiAgbXVsdGl0aHJlYWRlZCBwdXJwb3Nlcy4KCkRhbmllbCAoMTYgTWF5IDIwMDApCi0gUmV3cm90ZSB0aGUgc3JjL21haW4uYyBzb3VyY2UgdG8gdXNlIHRoZSBuZXcgZWFzeS1pbnRlcmZhY2UgdG8gbGliY3VybCA3LgogIFRoZXJlIGlzIHN0aWxsIG1vcmUgd29yayB0byBkbywgYnV0IHRoZSBmaXJzdCBzdGVwIGlzIG5vdyB0YWtlbi4KICA8Y3VybC9lYXN5Lmg+IGlzIHRoZSBpbmNsdWRlIGZpbGUgdG8gdXNlLgoKRGFuaWVsICgxNCBNYXkgMjAwMCkKLSBGVFAgVVJMcyBhcmUgbm93IHRyZWF0ZWQgc2xpZ2h0bHkgZGlmZmVyZW50LCBtb3JlIGFjY29yZGluZyB0byBSRkMgMTczOC4KLSBGVFAgc2Vzc2lvbnMgYXJlIG5vdyBwZXJmb3JtZWQgZGlmZmVyZW50bHksIHdpdGggQ1dEIGNvbW1hbmRzIHRvIGNoYW5nZQogIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIFJFVFIvU1RPUi9MSVNUIHdpdGggdGhlIGZ1bGwgcGF0aC4gRGlzY3Vzc2lvbnMgd2l0aAogIFJpY2ggR3JheSBtYWRlIG1lIG5vdGljZSB0aGVzZSBwcm9ibGVtcy4KLSBKYW5uZSBKb2hhbnNzb24gZGlzY292ZXJlZCBhbmQgY29ycmVjdGVkIGEgYnVmZmVyIG92ZXJmbG93IGluIHRoZQogIHNyYy91c3JnbG9iLmMgZmlsZS4KLSBJIGhhZCB0byBhZGQgYSBsaWIvc3RyZXF1YWwuYyBmaWxlIGZvciBkb2luZyBjYXNlIGluc2Vuc2l0aXZlIHN0cmluZwogIGNvbXBhcmVzIG9uIGFsbCBwbGF0Zm9ybXMuCgpEYW5pZWwgKDggTWF5IDIwMDApOgotIEJlZW4gd29ya2luZyBsb3RzIG9uIHRoZSBuZXcgbGliLgotIFRvZ2V0aGVyIHdpdGggUmljaCBHcmF5LCBJJ3ZlIHRyaWVkIHRvIGFkanVzdCB0aGUgY29uZmlndXJlIHNjcmlwdCB0byB3b3JrCiAgYmV0dGVyIG9uIHRoZSBOQ1IgTVAtUkFTIFVuaXguCgpEYW5pZWwgKDIgTWF5IDIwMDApOgotIEFsYmVydCBDaGluLUEtWW91bmcgcG9pbnRlZCBvdXQgdGhhdCBJIGhhZCBhIGZldyB0b28gbWFueSBpbnN0cnVjdGlvbnMgaW4KICBjb25maWd1cmUuaW4gdGhhdCBkaWRuJ3QgZG8gYW55IGdvb2QuCgpEYW5pZWwgKDI0IEFwcmlsIDIwMDApOgotIEFkZGVkIGEgbmV3IHBhcmFncmFwaCB0byB0aGUgRkFRIGFib3V0IHdoYXQgdG8gZG8gd2hlbiBjb25maWd1cmUgY2FuJ3QKICBmaW5kIE9wZW5TU0wgZXZlbiB0aG91Z2ggaXQgaXMgaW5zdGFsbGVkLiBTdXBwbGllZCBieSBCb2IgQWxsaXNvbgoKRGFuaWVsICgxMiBBcHJpbCAyMDAwKToKLSBTdGFydGVkIG1lc3NpbmcgYXJvdW5kIGJpZy10aW1lIHRvIGNvbnZlcnQgdGhlIG9sZCBsaWJyYXJ5IGludGVyZmFjZSB0byBhCiAgYmV0dGVyIG9uZS4uLgoKRGFuaWVsICg4IEFwcmlsIDIwMDApOgotIE1hZGUgdGhlIHByb2dyZXNzIGJhciBsb29rIGJldHRlciBmb3IgZmlsZSBzaXplcyBiZXR3ZWVuIDk5OTkga2lsb2J5dGVzCiAgYW5kIDEwMCBtZWdhYnl0ZXMuIFRoZXkncmUgbm93IGRpc3BsYXllZCBYWC5YTS4KLSBJIGFsc28gbm90aWNlZCB0aGF0IGZ0cCBmZXRjaGVzIHRocm91Z2ggSFRUUCBwcm94aWVzIGRpZG4ndCBhZGQgdGhlIHVzZXIKICBhZ2VudCBzdHJpbmcuIEl0IGRvZXMgbm93LgotIEhhYmliaWUgPGhhYmliaWUgYXQgTWFpbGFuZE5ld3MuY29tPiBzdXBwbGllZCBhIHByZXR0eSBnb29kIHdheSB0byBidWlsZCBSUE1zCiAgb24gYSBMaW51eCBtYWNoaW5lLiBJdCBzdGlsbCBhKSByZXF1aXJlcyBtZSB0byBiZSByb290IHRvIGRvIGl0LCBiKSBsZWF2ZXMKICB0aGUgcnBtIHBhY2thZ2VzIGxheWluZyBhdCBzb21lIG9kZCBwbGFjZSBvbiBteSBkaXNrIGMpIGRvZXNuJ3Qgd29yayB0bwogIGJ1aWxkIHRoZSBzc2wgdmVyc2lvbiBvZiBjdXJsIHNpbmNlIEkgZGlkbid0IGluc3RhbGwgb3BlbnNzbCBmcm9tIGFuIHJwbQogIHBhY2thZ2Ugc28gbm93IHRoZSBycG0gY3JhcCB0aGlua3MgSSBkb24ndCBoYXZlIG9wZW5zc2wgYW5kIHJlZnVzZXMgdG8gYnVpbGQKICBhIHBhY2thZ2UgdGhhdCBkZXBlbmRzIG9uIHNzbC4uLiBEaWQgSSBtZW50aW9uIEkgZG9uJ3QgZ2V0IGFsb25nIHdpdGggUlBNPwotIE9uY2UgYWdhaW4gSSByZWNlaXZlZCBhIGJ1ZyByZXBvcnQgYWJvdXQgYXV0b2NvbmYgbm90IHNldHRpbmcgLUwgcHJpb3IgdG8gLWwKICBvbiB0aGUgY29tbWFuZCBsaW5lIHdoZW4gY2hlY2tpbmcgZm9yIGxpYnMuIEluIHRoaXMgY2FzZSBpdCBtYWRlIHRoZSBuYXRpdmUKICBjYyBjb21waWxlciBvbiBTb2xhcmlzIDcgdG8gZmFpbCB0aGUgT3BlblNTTCBjaGVjay4gVGhpcyBoYXMgcHJldmlvdXNseSBiZWVuCiAgcmVwb3J0ZWQgdG8gY2F1c2UgcHJvYmxlbXMgb24gSFAtVVggYW5kIGlzIGEga25vd24gZmxhdyBpbiBhdXRvY29uZiAyLjEzLiBJdAogIGlzIGEgcGl0eSB0aGVyZSdzIG5vIG5ld2VyIHJlbGVhc2UgYXJvdW5kLi4uCgpEYW5pZWwgKDQgQXByaWwgMjAwMCk6Ci0gTWFyY28gRy4gU2FsdmFnbm8gc3VwcGxpZWQgbWUgd2l0aCB0d28gZml4ZXMgdGhhdAogIGFwcGVhcmFudGx5IG1ha2VzIHRoZSBPUy8yIHBvcnQgd29yayBiZXR0ZXIgd2l0aCBtdWx0aXBsZSBVUkxzLgoKRGFuaWVsICgyIEFwcmlsIDIwMDApOgotIEFub3RoZXIgTG9jYXRpb246IGZpeC4gVGhpcyB0aW1lLCB3aGVuIGN1cmwgY29ubmVjdGVkIHRvIGEgcG9ydCBhbmQgdGhlbgogIGZvbGxvd2VkIGEgbG9jYXRpb24gd2l0aCBhbiBhYnNvbHV0ZSBVUkwgdG8gYW5vdGhlciBwb3J0LCBpdCBtaXNiZWhhdmVkLgoKRGFuaWVsICgyNyBNYXJjaCAyMDAwKToKLSBILiBEYXBobmUgTHVvbmcgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIHdhcyB3cm9uZ2x5CiAgbWVzc2luZyB1cCB0aGUgcHJveHkgc3RyaW5nIHdoZW4gZmV0Y2hpbmcgYSBkb2N1bWVudCB0aHJvdWdoIGEgaHR0cCBwcm94eSwKICB3aGljaCBzY3Jld2VkIHVwIG11bHRpcGxlIGZldGNoZXMgc3VjaCBhcyBpbiBsb2NhdGlvbjogZm9sbG93aW5ncy4KCkRhbmllbCAoMjMgTWFyY2ggMjAwMCk6Ci0gTWFyY28gRy4gU2FsdmFnbm8gY29ycmVjdGVkIG15IGJhZGx5IGFwcGxpZWQgcGF0Y2ggaGUKICBhY3R1YWxseSBhbHJlYWR5IHRvbGQgbWUgYWJvdXQhCgotIEguIERhcGhuZSBMdW9uZyBicm91Z2h0IG1lIGEgZml4IHRoYXQgbm93IG1ha2VzIGN1cmwKICBpZ25vcmUgc2VsZWN0KCkgZXJyb3JzIGluIHRoZSBkb3dubG9hZCBpZiBlcnJubyBpcyBFSU5UUiwgd2hpY2ggdHVybnMgb3V0IHRvCiAgaGFwcGVuIGV2ZXJ5IG5vdyBhbmQgdGhlbiB3aGVuIHVzaW5nIGxpYmN1cmwgbXVsdGktdGhyZWFkZWQuLi4KCkRhbmllbCAoMjIgTWFyY2ggMjAwMCk6Ci0gV2hhbSBCYW5nIHN1cHBsaWVkIGEgY291cGxlIG9mIHdpbjMyIGZpeGVzLiBIQVZFX1VOQU1FCiAgd2FzIGFjY2lkZW50YWxseSAjZGVmaW5lZCBpbiBjb25maWctd2luMzIuaCwgd2hpY2ggaXQgc2hvdWxkbid0IGhhdmUgYmVlbi4KICBUaGUgSEFWRV9VTklTVERfSCBpcyBub3QgZGVmaW5lZCB3aGVuIGNvbXBpbGluZyB3aXRoIHRoZSBNYWtlZmlsZS52YzYKICBtYWtlZmlsZSBmb3IgTVMgVkMrKy4KCkRhbmllbCAoMjEgTWFyY2ggMjAwMCk6Ci0gSSByZW1vdmVkIHRoZSBBQ19QUk9HX0lOU1RBTEwgbWFjcm8gZnJvbSBjb25maWd1cmUuaW4sIHNpbmNlIGl0IGFwcGVhcnMgdGhhdAogIG9uZSBvZiB0aGUgQU1fKiBtYWNyb3Mgc2VhcmNoZXMgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCBhbHJlYWR5LiBKYW5uZQogIEpvaGFuc3NvbiBtYWRlIG1lIGF3YXJlIG9mIHRoaXMuCgpWZXJzaW9uIDYuNS4yCgpEYW5pZWwgKDIxIE1hcmNoIDIwMDApOgotIFBhdWwgSGFycmluZ3RvbiBxdWlja2x5IHBvaW50ZWQgb3V0IHRvIG1lIHRoYXQgNi41LjEKICBjcmFzaGVzIGhhcmQuIEkgdXBsb2FkIDYuNS4yIG5vdyBhcyBxdWlja2x5IGFzIHBvc3NpYmxlISBUaGUgcHJvYmxlbSB3YXMKICB0aGUgLUQgYWRqdXN0bWVudHMgaW4gc3JjL21haW4uYy4KClZlcnNpb24gNi41LjEKCkRhbmllbCAoMjAgTWFyY2ggMjAwMCk6Ci0gQW4gYW5vbnltb3VzIHBvc3Qgb24gc291cmNlZm9yZ2UgY29ycmVjdGx5IHBvaW50ZWQgb3V0IGEgcG9zc2libGUgYnVmZmVyCiAgb3ZlcmZsb3cgaW4gdGhlIGN1cmxfdW5lc2NhcGUoKSBmdW5jdGlvbiBmb3IgVVJMIGNvbnZlcnNpb25zLiBUaGUgbWFpbgogIHByb2JsZW0gd2l0aCB0aGlzIGJ1ZyBpcyB0aGF0IHRoZSBmdHAgZG93bmxvYWQgdXNlcyB0aGF0IGZ1bmN0aW9uIGFuZCB0aGlzCiAgc2luZ2xlLSBieXRlIG92ZXJmbG93IGNvdWxkIGxlYWQgdG8gdmVyeSBvZGQgYnVncyAoYXMgb25lIHJlcG9ydGVkIGJ5IEphbm5lCiAgSm9oYW5zc29uKS4KCkRhbmllbCAoMTkgTWFyY2ggMjAwMCk6Ci0gTWFyY28gRy4gU2FsdmFnbm8gc3VwcGxpZWQgbWUgd2l0aCBhIHNlcmllcyBvZiBwYXRjaGVzCiAgdGhhdCBub3cgYWxsb3dzIGN1cmwgdG8gZ2V0IGNvbXBpbGVkIG9uIE9TLzIuIEl0IGV2ZW4gaW5jbHVkZXMgYSBzZWN0aW9uIGluCiAgdGhlIElOU1RBTEwgZmlsZS4gVmVyeSBuaWNlIGpvYiEKCkRhbmllbCAoMTcgTWFyY2ggMjAwMCk6Ci0gV2hhbSBCYW5nIHN1cHBsaWVkIGEgcGF0Y2ggZm9yIHRoZSBsaWIvTWFrZWZpbGUudmM2CiAgZmlsZS4gV2Ugc3RpbGwgbmVlZCBzb21lIGZpeGVzIGZvciB0aGUgY29uZmlnLXdpbjMyLmggc2luY2UgaXQgYXBwZWFycyB0aGF0CiAgVkMrKyBhbmQgbWluZ3czMiBoYXZlIGRpZmZlcmVudCBvcGluaW9ucyBhYm91dCAoYXQgbGVhc3QpIHVuaXN0ZC5oJ3MKICBleGlzdGVuY2UuCgpEYW5pZWwgKDE1IE1hcmNoIDIwMDApOgotIEkgbW9kaWZpZWQgdGhlIC1ELy0tZHVtcC1oZWFkZXIgd29ya2luZ3Mgc28gdGhhdCBpdCBkb2Vzbid0IHdyaXRlIGFueXRoaW5nCiAgdG8gdGhlIGZpbGUgdW50aWwgaXQgbmVlZHMgdG8uIFRoaXMgd2F5LCB5b3UgY2FuIGFjdHVhbGx5IHVzZSAtYiBhbmQgLUQKICBvbiB0aGUgc2FtZSBmaWxlIGlmIHlvdSB3YW50IHJlcGVhdGVkIGludm9rZXMgdG8gc3RvcmUgYW5kIHJlYWQgdGhlIGNvb2tpZXMKICBpbiB0aGF0IG9uZSBzaW5nbGUgZmlsZS4KCi0gUG9rZWQgYXJvdW5kIGluIGxvdHMgb2YgdGV4dHMuIEFkZGVkIHRoZSBCVUdTIGZpbGUgZm9yIGJ1ZyByZXBvcnRpbmcgc3R1ZmYuCiAgQWRkZWQgdGhlIGNsYXNzaWMgSFRUUCBQT1NUIHF1ZXN0aW9uIHRvIHRoZSBGQVEsIHJlbW92ZWQgc29tZSAjaWZkZWYgV0lOMzIKICBzdHVmZiBmcm9tIHRoZSBzb3VyY2VzICh0aGV5J3JlIGNvdmVyZWQgYnkgdGhlIGNvbmZpZy13aW4zMi5oIG5vdykuCgotIFBhc2NhbCBHYXVkZXR0ZSBmaXhlZCBhIG1pc3NpbmcgbGRhcC5jIHByb2JsZW0gaW4gdGhlCiAgTWFrZWZpbGUudmM2IGZpbGUuIEhlIGFsc28gYWRkcmVzc2VkIGEgcHJvYmxlbSBpbiBzcmMvY29uZmlnLXdpbjMyLmguCgpEYW5pZWwgKDE0IE1hcmNoIDIwMDApOgotIFBhdWwgSGFycmluZ3RvbiBwb2ludGVkIG91dCB0aGF0IHRoZSAnaHR0cF9jb2RlJyB2YXJpYWJsZSBpbiB0aGUgLXcgb3V0cHV0CiAgd2FzIG5ldmVyIHdyaXR0ZW4uIEkgZml4ZWQgaXQgbm93LgoKLSBKYW5uZSBKb2hhbnNzb24gcmVwb3J0ZWQgdGhlIGNvbXBsYWludHMgdGhhdCBPcGVuQlNEIGRvZXMKICB3aGVuIGdldGRhdGUuYyAjaW5jbHVkZXMgbWFsbG9jLmguIEl0IGNsYWltcyBzdGRsaWIuaCBzaG91bGQgYmUgaW5jbHVkZWQKICBpbnN0ZWFkLiBJIGFkZGVkICNpZmRlZiBIQVZFX01BTExPQ19IIGNvZGUgaW4gZ2V0ZGF0ZS55IGFuZCB0d28gY2hlY2tzIGluCiAgdGhlIGNvbmZpZ3VyZS5pbiBmb3IgbWFsbG9jLmggYW5kIHN0ZGxpYi5oLgoKVmVyc2lvbiA2LjUKCkRhbmllbCAoMTMgTWFyY2ggMjAwMCk6Ci0gPGN1cmwgYXQgc3BhbS53b2x2ZXNiYW5lLm5ldD4gcG9pbnRlZCBvdXQgdGhhdCB0aGUgd2F5IGN1cmwgc2VudCBjb29raWVzIGluIGEKICBzaW5nbGUgbGluZSB3YXNuJ3QgZW5qb3llZCBieSBJSVM0LjAgc2VydmVycy4gSW4gbXkgdmlldywgdGhhdCBpcyBub3Qgd2hhdAogIHRoZSBzdGFuZGFyZHMgc2F5LCBidXQgSSBhZGRlZCBhIHdoaXRlIHNwYWNlIGJldHdlZW4gdGhlIG5hbWUvdmFsdWUgcGFpcnMgdG8KICBwZXJoYXBzIG1ha2UgdGhlbSB3b3JrIGJldHRlci4KCi0gQWRkZWQgdGhlIHBlcmwgY2hlY2sgYmFjayBpbiB0aGUgY29uZmlndXJlLmluIGFnYWluIHNpbmNlIHRoZSBta2hlbHAucGwKICBzY3JpcHQgbmVlZHMgaXQhCgotIE1hZGUgc29tZSBiZWF1dGlmaWNhdGlvbnMgaW4gdGhlIGN1cmwgbWFuIHBhZ2UuCgpEYW5pZWwgKDMgTWFyY2ggMjAwMCk6Ci0gSvZybiBoZWxwZWQgbWUgdXBkYXRlIHRoZSBjb25maWctd2luMzIuaCBmaWxlcyB3aXRoIEhBVkVfU0VUVkJVRiBhbmQKICBIQVZFX1NUUkRVUC4KCkRhbmllbCAoMyBNYXJjaCAyMDAwKToKLSBVcGxvYWRlZCB0aGUgNi41cHJlMiBwYWNrYWdlLgoKRGFuaWVsICgyIE1hcmNoIDIwMDApOgotIFJlbW92ZWQgdGhlIHBlcmwtcHJvZ3JhbXMgZnJvbSB0aGUgZGlzdHJpYnV0aW9uLCB0aGV5IG5ldmVyIG1hZGUgbWFueSBwZW9wbGUKICBoYXBweSBhbmQgSSdsbCBzdGlsbCBrZWVwIHRoZW0gYXZhaWxhYmxlIG9uIHRoZSB3ZWIuCgotIEFkZGVkIHRoZSAtdyBhbmQgLU4gc3R1ZmYgdG8gdGhlIG1hbiBwYWdlLiBEb2N1bWVudGVkIHRoZSBuZXcgcHJvZ3Jlc3MgbWV0ZXIKICBkaXNwbGF5IGluIFJFQURNRS5jdXJsLgoKLSBK9nJuIEhhcnRyb3RoLCBDaHJpcyA8Y2JheWxpc3MgYXQgY3NjLmNvbWU+IGFuZCBVbGYKICBN9mxsZXIgZnJvbSB0aGUgb3BlbnNzbCBkZXZlbG9wbWVudCB0ZWFtIGhlbHBlZCBicmluZ2luZyBtZSB0aGUgZGV0YWlscyBmb3IKICBmaXhpbmcgYW4gT3BlblNTTCB1c2FnZSBmbGF3LiBJdCBiZWNhbWUgYXBwYXJlbnQgd2hlbiB0aGV5IHJlbGVhc2VkIG9wZW5zc2wKICAwLjkuNSBzaW5jZSB0aGF0IGJhcmZlZCBvbiBjdXJsJ3MgYmFkIGJlaGF2aW9yIChub3Qgc2VlZGluZyBhIHJhbmRvbSBudW1iZXIKICB0aGluZykuCgotIFlldCBhbm90aGVyIG9wdGlvbjogLU4vLS1uby1idWZmZXIgZGlzYWJsZXMgYnVmZmVyaW5nIGluIHRoZSBvdXRwdXQgc3RyZWFtLgogIFByb2JhYmx5IG1vc3QgdXNlZnVsIGZvciB2ZXJ5IHNsb3cgdHJhbnNmZXJzIHdoZW4geW91IHJlYWxseSB3YW50IHRvIGdldAogIGV2ZXJ5IGJ5dGUgY3VybCByZWNlaXZlcyB3aXRoaW4gc29tZSBwcmVmZXJyZWQgdGltZS4gQW5kcmV3IDx0bXIgYXQgZ2NpLm5ldD4KICBzdWdnZXN0ZWQgdGhpcy4KCi0gRGFtaWVuIEFkYW50IG1haWxlZCBtZSBoaXMgZml4ZXMgZm9yIG1ha2luZyBjdXJsIGNvbXBpbGUgb24gVWx0cml4LgoKRGFuaWVsICgyNCBGZWJydWFyeSAyMDAwKToKLSBBcHBsaWVkIEr2cm4gSGFydHJvdGgncyBmaXhlcyBmb3IgY29uZmlnLXdpbjMyLmggYW5kIGxpYi9NYWtlZmlsZS53MzIuCgogIEkgc2hvdWxkIGFsc28gbWFrZSBhIG5vdGUgaGVyZSwgaWYgbm90aGluZyBlbHNlIHRvIG15c2VsZiwgdGhhdCB3aGVuIHVzaW5nCiAgdGhlICUtc3ludGF4IGZvciB2YXJpYWJsZXMgaW4gRE9TIGNvbW1hbmQgcHJvbXB0cywgeW91IG11c3QgdXNlIHR3byAlLQogIGxldHRlcnMgZm9yIGVhY2ggb25lIHNpbmNlIHRoYXQgaXMgYW4gZXNjYXBlIGxldHRlciB0aGVyZSEgTWF5YmUgSSBzaG91bGQKICB1c2UgYW5vdGhlciBsZXR0ZXIgaW5zdGVhZCEKCi0gQWRkZWQgbW9yZSB2YXJpYWJsZXMgdG8gLXc6CgogICdodHRwX2NvZGUnCiAgJ3RpbWVfbmFtZWxvb2t1cCcKICAndGltZV9jb25uZWN0JwogICd0aW1lX3ByZXRyYW5zZmVyJwogICd1cmxfZWZmZWN0aXZlJwoKLSBNYWRlIC13QGZpbGVuYW1lIHJlYWQgdGhlIHN5bnRheCBmcm9tIGEgZmlsZSBhbmQgLXdALSByZWFkcyB0aGUgc3ludGF4IGZyb20KICBzdGRpbiBpbiB0aGUgZ29vZCBvbGQgInN0YW5kYXJkIiBjdXJsIHdheS4KCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwMCk6Ci0gUmVsZWFzZWQgYSA2LjVwcmUxIHZlcnNpb24gdG8gZ2V0IHNvbWUgdGVzdCBhbmQgdXNlciBmZWVkYmFjay4KCkRhbmllbCAoMjEgRmVicnVhcnkgMjAwMCk6CgotIEkgYWRkZWQgdGhlIC13Ly0td3JpdGUtb3V0IGZsYWcgYW5kIHNvbWUgdmFyaWFibGVzIHRvIGdvIHdpdGggaXQuIC13IGlzIGEKICBzaW5nbGUgc3RyaW5nLCB3aGF0ZXZlciB5b3UgZW50ZXIgdGhlcmUgd2lsbCBiZSB3cml0dGVuIG91dCB3aGVuIGN1cmwgaGFzCiAgY29tcGxldGVkIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0LiBUaGVyZSBhcmUgc29tZSB2YXJpYWJsZSBzdWJzdGl0dXRpb25zIGFuZAogIHRoZXkgYXJlIHNwZWNpZmllZCBhcyAnJXt2YXJpYWJsZX0nICh3aXRob3V0IHRoZSBxdW90ZXMpLiBWYXJpYWJsZXMgdGhhdAogIGV4aXN0IGFzIG9mIHRoaXMgbW9tZW50IGFyZToKCiAgICAgICAgdG90YWxfdGltZSAgICAgLSB0b3RhbCB0cmFuc2ZlciB0aW1lIGluIHNlY29uZHMgKHdpdGggMiBkZWNpbWFscykKICAgICAgICBzaXplX2Rvd25sb2FkICAtIHRvdGFsIGRvd25sb2FkZWQgYW1vdW50IG9mIGJ5dGVzCiAgICAgICAgc2l6ZV91cGxvYWQgICAgLSB0b3RhbCB1cGxvYWRlZCBhbW91bnQgb2YgYnl0ZXMKICAgICAgICBzcGVlZF9kb3dubG9hZCAtIHRoZSBhdmVyYWdlIHNwZWVkIG9mIHRoZSBlbnRpcmUgZG93bmxvYWQKICAgICAgICBzcGVlZF91cGxvYWQgICAtIHRoZSBhdmVyYWdlIHNwZWVkIG9mIHRoZSBlbnRpcmUgdXBsb2FkCgogIEkgd2lsbCBvZiBjb3Vyc2UgYWRkIG1vcmUgdmFyaWFibGVzLCBidXQgSSBuZWVkIGlucHV0IG9uIHRoZXNlIGFuZCBvdGhlcnMuCgotIEl0IHN0cnVjayBtZSB0aGF0IHRoZSAtIyBwcm9ncmVzcyBiYXIgd2lsbCBiZSBoYXJkIHRvIGp1c3QgYXBwbHkgb24gdGhlIG5ldwogIHByb2dyZXNzIGJhciBjb25jZXB0LiBJIG5lZWQgc29tZSBmZWVkYmFjayBvbiB0aGlzIGJlZm9yZSB0aGF0J2xsIGdldCByZS0KICBpbnRyb2R1Y2VkISA6LS8KCkRhbmllbCAoMTYgRmVicnVhcnkgMjAwMCk6Ci0gSvZybiBIYXJ0cm90aCBicm91Z2h0IG1lIHNvbWUgZml4ZXMgZm9yIHRoZSBwcm9ncmVzcyBtZXRlciBhbmQgSSBjb250aW51ZWQKICB3b3JraW5nIG9uIGl0LiBJdCBzZWVtcyB0byB3b3JrIGZvciBodHRwIGRvd25sb2FkLCBodHRwIHBvc3QsIGZ0cCBkb3dubG9hZAogIGFuZCBmdHAgdXBsb2FkLiBJdCBzaG91bGQgYmUgYSBwcmV0dHkgZ29vZCB0ZXN0IGl0IHdvcmtzIGdlbmVyYWxseSBnb29kLgoKLSBTdGlsbCBuZWVkIHRvIGFkZCB0aGUgLSMgcHJvZ3Jlc3MgYmFyIGludG8gdGhlIG5ldyBzdHlsZSBwcm9ncmVzcyBpbnRlcmZhY2UuCgotIEdvbm5hIGhhdmUgYSBnbyBhdCBteSBuZXcgb3V0cHV0IG9wdGlvbiBwYXJhbWV0ZXIgbmV4dC4KCkRhbmllbCAoMTUgRmVicnVhcnkgMjAwMCk6Ci0gVGhlIHByb2dyZXNzIG1ldGVyIHN0dWZmIGlzIHNsb3dseSB0YWtpbmcgcGxhY2UuIFRoZXJlJ3MgbW9yZSBsZWZ0IGJlZm9yZSBpdAogIGlzIHdvcmtpbmcgb2sgYW5kIGV2ZXJ5dGhpbmcgaXMgdGVzdGVkLCBidXQgd2UncmUgcmVhY2hpbmcgdGhlcmUuIFNsb3dseSEKCkRhbmllbCAoMTEgRmVicnVhcnkgMjAwMCk6Ci0gUGF1bCBNYXJxdWlzIGZpeGVkIHRoZSBjb25maWcgZmlsZSBwYXJzaW5nIG9mIGN1cmwgdG8KICBkZWFsIHdpdGggYW55LWxlbmd0aCBsaW5lcywgcmVtb3ZpbmcgdGhlIHByZXZpb3VzIGxpbWl0IG9mIDRLLgoKLSBFZXR1IE9qYW5lbidzIHN1Z2dlc3Rpb24gb2Ygc3VwcG9ydGluZyB0aGUgQC1zdHlsZSBmb3IgLWIKICBpcyBpbXBsZW1lbnRlZC4gTm93IC1iQDxmaWxlbmFtZT4gd29ya3MgYXMgd2VsbCBhcyB0aGUgb2xkIHN0eWxlLiAtYkAtIGFsc28KICBzaW1pbGFybHkgcmVhZHMgdGhlIGNvb2tpZXMgZnJvbSBzdGRpbi4KCi0gUmVtaW5kZXI6IC1EIHNob3VsZCBub3Qgd3JpdGUgdG8gdGhlIGZpbGUgdW50aWwgaXQgbmVlZHMgdG8sIGluIHRoZSBzYW1lIHdheQogIC1vIGRvZXMuIFRoYXQgd291bGQgZW5hYmxlIGN1cmwgdG8gdXNlIC1iIGFuZCAtRCBvbiB0aGUgc2FtZSBmaWxlLi4uCgotIEVsbGlzIFByaXRjaGFyZCBtYWRlIGdldGRhdGUueSB3b3JrIGZvciBNYWNPUyBYLgoKLSBQYXVsIEhhcnJpbmd0b24gaGVscGVkIG1lIG91dCBmaW5kaW5nIHRoZSBjcmFzaCBpbiB0aGUKICBjb29raWUgcGFyc2VyLiBIZSBhbHNvIHBvaW50ZWQgb3V0IGN1cmwncyBoYWJpdCBvZiBzZW5kaW5nIGVtcHR5IGNvb2tpZXMgdG8KICB0aGUgc2VydmVyLgoKRGFuaWVsICg4IEZlYnJ1YXJ5IDIwMDApOgogLSBSb24gWmFwcCBjb3JyZWN0ZWQgYSBwcm9ibGVtIGluIHNyYy91cmxnbG9iLmMgdGhhdAogICBwcmV2ZW50ZWQgY3VybCBmcm9tIGdldHRpbmcgY29tcGlsZWQgb24gc3Vub3MgNC4gVGhlIHByb2JsZW0gaGFkIHRvIGRvCiAgIHdpdGggdGhlIGRpZmZlcmVuY2UgaW4gc3ByaW50ZigpIHJldHVybiBjb2RlIHR5cGVzLgoKIC0gVHJhbnNmZXIoKSBzaG91bGQgbm93IGJlIGFibGUgdG8gZG93bmxvYWQgYW5kIHVwbG9hZCBzaW11bHRhbmVvdXNseS4gTGV0J3MKICAgZG8gc29tZSBwcm9ncmVzcyBtZXRlciBmaXhlcyBsYXRlciB0aGlzIHdlZWsuCgpEYW5pZWwgKDMxIEphbnVhcnkgMjAwMCk6CiAtIFBhdWwgSGFycmluZ3RvbiBmb3VuZCBhbm90aGVyIGNvcmUgZHVtcCBpbiB0aGUgY29va2llCiAgIHBhcnNlci4gQ3VybCBkb2Vzbid0IHByb3Blcmx5IHJlY29nbml6ZSB0aGUgJ3ZlcnNpb24nIGtleXdvcmQgYW5kIEkgdGhpbmsKICAgdGhhdCBpcyB3aGF0IGNhdXNlZCB0aGlzLiBJIG5lZWQgdG8gcmVmcmVzaCBzb21lIHNwZWNzIG9uIGNvb2tpZXMgYW5kIHNlZQogICB3aGF0IGVsc2UgY3VybCBsYWNrcyB0byBpbXByb3ZlIHRoaXMgYSBiaXQgbW9yZSBvbmNlIGFuZCBmb3IgYWxsLgoKICAgUkZDIDIxMDkgY2xlYXJseSBzcGVjaWZpZXMgaG93IGNvb2tpZXMgc2hvdWxkIGJlIGRlYWx0IHdpdGggd2hlbiB0aGV5IGFyZQogICBjb21wbGlhbnQgd2l0aCB0aGF0IHNwZWMuIEkgZG9uJ3QgdGhpbmsgbWFueSBzZXJ2ZXJzIGFyZSB0aG91Z2guLi4KCiAtIE1hcmsgVy4gRWljaGluIGZvdW5kIHRoYXQgd2hpbGUgY3VybCBpcyB1cGxvYWRpbmcgYSBmb3JtCiAgIHRvIGEgd2ViIHNpdGUsIGl0IGRvZXNuJ3QgcmVhZCBpbmNvbWluZyBkYXRhIHdoeSBpdCdsbCBoYW5nIGFmdGVyIGEgd2hpbGUKICAgc2luY2UgdGhlIHNvY2tldCAicGlwZSIgYmVjb21lcyBmdWxsLgoKICAgSXQgdG9vayBtZSB0d28gaG91cnMgdG8gcmV3cml0ZSBEb3dubG9hZCgpIGFuZCBVcGxvYWQoKSBpbnRvIHRoZSBuZXcKICAgc2luZ2xlIGZ1bmN0aW9uIFRyYW5zZmVyKCkuIEl0IGV2ZW4gc2VlbXMgdG8gd29yayEgTW9yZSB0ZXN0aW5nIGlzIHJlcXVpcmVkCiAgIG9mIGNvdXJzZS4uLiBJIHNob3VsZCBnZXQgdGhlIGhlYWRlci1zZW5kaW5nIHRvZ2V0aGVyIGluIGEga2luZCBvZiBxdWV1ZQogICBhbmQgbGV0IHRoZW0gZ2V0ICJ1cGxvYWRlZCIgaW4gVHJhbnNmZXIoKSBhcyB3ZWxsLgoKIC0gWmhpYmlhbyBXdSBwb2ludGVkIG91dCBhIGN1cmwgYnVnIGluIHRoZSBsb2NhdGlvbjogYXJlYSwKICAgYWx0aG91Z2ggSSBkaWQgbm90IGdldCBhIHJlcHJvZHVjaWJsZSB3YXkgdG8gZG8gdGhpcyB3aHkgSSBoYXZlIHRvIHdhaXQKICAgd2l0aCBmaXhpbmcgYW55dGhpbmcuCgogLSBCb2IgU2NoYWRlciBzdWdnZXN0ZWQgSSBzaG91bGQgaW1wbGVtZW50IHJlc3VtZQogICBzdXBwb3J0IGZvciB0aGUgSFRUUCBQVVQgb3BlcmF0aW9uLCBhbmQgYXMgSSB0aGluayBpdCBpcyBhIHZhbGlkIHN1Z2dlc3Rpb24KICAgSSdsbCB3b3JrIG9uIGl0LgoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDApOgogLSBNIFRyYXZpcyBPYmVuaGF1cyBwb2ludGVkIG91dCBhIG1hbnVhbCBtaXh1cCB3aXRoIC15IGFuZCAtWSB0aGF0IHdhcwogICBjb3JyZWN0ZWQuCgogLSBKZW5zIFNjaGxldXNlbmVyIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB0byBjb21waWxlCiAgIGN1cmwgb24gQUlYIDQuMS40IGFuZCBnYXZlIG1lIGEgc29sdXRpb24uIFRoaXMgcHJvYmxlbSB3YXMgYWxyZWFkeSBmaXhlZAogICBieSBK9nJuJ3MgcmVjZW50ICNpbmNsdWRlIG1vZGlmaWNhdGlvbnMhCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwMCk6CiAtIE9za2FyIExpbGplYmxhZCBwb2ludGVkIG91dCBhbmQgY29ycmVjdGVkIGEgcHJvYmxlbQogICBpbiB0aGUgTG9jYXRpb246IGZvbGxvd2luZyBzeXN0ZW0gdGhhdCBtYWRlIGN1cmwgZm9sbG93aW5nIGEgbG9jYXRpb246IHRvIGEKICAgZGlmZmVyZW50IHByb3RvY29sIHRvIGZhaWwuCgogICBBdCBKYW51YXJ5IDMxc3QgSSByZS1jb25zaWRlcmVkIHRoaXMgZml4IGFuZCB0aGUgc3Vycm91bmRpbmcgc291cmNlIGNvZGUuIEkKICAgY291bGQgbm90IHJlYWxseSBzZWUgdGhhdCB0aGUgcGF0Y2ggZGlkIGFueSBkaWZmZXJlbmNlLCB3aHkgSSByZW1vdmVkIGl0CiAgIGFnYWluIGZvciBmdXJ0aGVyIHJlc2VhcmNoIGFuZCBkZWJ1Z2dpbmcuIChJdCBkaXNhYmxlZCBsb2NhdGlvbjogZm9sbG93aW5nCiAgIG9uIHNlcnZlciBub3QgcnVubmluZyBvbiBkZWZhdWx0IHBvcnRzLikKCiAtIEr2cm4gSGFydHJvdGggYnJvdWdodCBhIGZpeCB0aGF0IG9uY2UgYWdhaW4KICAgbWFkZSBpdCBwb3NzaWJsZSB0byBzZWxlY3QgcHJvZ3Jlc3MgYmFyLgoKIC0gSvZybiBhbHNvIGZpeGVkIGEgZmV3IGluY2x1ZGUgcHJvYmxlbXMuCgpWZXJzaW9uIDYuNAoKRGFuaWVsICgxNyBKYW51YXJ5IDIwMDApOgogLSBCYXNlZCBvbiBzdWdnZXN0aW9ucyBmcm9tIEJq9nJuIFN0ZW5iZXJnLCBJIG1hZGUgdGhlCiAgIHByb2dyZXNzIGRlYWwgYmV0dGVyIHdpdGggbGFyZ2VyIGZpbGVzIGFuZCBhZGRlZCBhICJUaW1lIiBmaWVsZCB3aGljaCBzaG93cwogICB0aGUgdGltZSBzcGVudCBvbiB0aGUgZG93bmxvYWQgc28gZmFyLgogLSBJJ20gbm93IHVzaW5nIHRoZSBDVlMgcmVwb3NpdG9yeSBvbiBzb3VyY2Vmb3JnZS5uZXQsIHdoaWNoIGFsc28gYWxsb3dzIHdlYgogICBicm93c2luZy4gU2VlIGh0dHA6Ly9jdXJsLmhheHgubnUuCgpEYW5pZWwgKDEwIEphbnVhcnkgMjAwMCk6CiAtIFJlbnVtYmVyZWQgc29tZSBlbnVtcyBpbiBjdXJsL2N1cmwuaCBzaW5jZSB0YWcgbnVtYmVyIDM1IHdhcyB1c2VkIHR3aWNlIQogLSBBZGRlZCAicG9zdHF1b3RlIiBzdXBwb3J0IHRvIHRoZSBmdHAgc2VjdGlvbiB0aGF0IGVuYWJsZXMgcG9zdC1mdHAtdHJhbnNmZXIKICAgcXVvdGUgY29tbWFuZHMuCiAtIE5vdyBtYWRlIHRoZSAtUS8tLXF1b3RlIHBhcmFtZXRlciByZWNvZ25pemUgJy0nIGFzIGEgcHJlZml4LCB3aGljaCBtZWFucwogICB0aGF0IGNvbW1hbmQgd2lsbCBiZSBpc3N1ZWQgQUZURVIgYSBzdWNjZXNzZnVsIGZ0cCB0cmFuc2Zlci4gVGhpcyBjYW4gb2YKICAgY291cnNlIGJlIHVzZWQgdG8gZGVsZXRlIG9yIHJlbmFtZSBhIGZpbGUgYWZ0ZXIgaXQgaGFzIGJlZW4gdXBsb2FkZWQgb3IKICAgZG93bmxvYWRlZC4gVXNlIHlvdXIgaW1hZ2luYXRpb24hIDstKQogLSBTaW5jZSBJIGRvIHRoZSBtYWluIGRldmVsb3BtZW50IG9uIHNvbGFyaXMgMi42IG5vdywgSSBoYWQgdG8gZG93bmxvYWQgYW5kCiAgIGluc3RhbGwgR05VIGdyb2ZmIHRvIGdlbmVyYXRlIHRoZSBodWdlaGVscC5jIGZpbGUuIFRoZSBzb2xhcmlzIG5yb2ZmIGNvcmVzCiAgIG9uIHRoZSBtYW4gcGFnZSEgU28sIGluIG9yZGVyIHRvIG1ha2UgdGhlIHNvbGFyaXMgY29uZmlndXJlIHNjcmlwdCBmaW5kIGEKICAgYmV0dGVyIHJlc3VsdCBJIG1hZGUgZ25yb2ZmIGdldCBjaGVja2VkIHByaW9yIHRvIHRoZSByZWd1bGFyIG5yb2ZmLgogLSBBZGRlZCBhbGwgdGhlIGN1cmwgZXhpdCBjb2RlcyB0byB0aGUgbWFuIHBhZ2UuCiAtIEppbSBHYWxsYWdoZXIgcHJvcGVybHkgdHJhY2tlZCBkb3duIGEgYnVnIGluIGF1dG9jb25mCiAgIDIuMTMuIFRoZSBBQ19DSEVDS19MSUIoKSBtYWNybyB3cm9uZ2Z1bGx5IHVzZXMgdGhlIC1sIGZsYWcgYmVmb3JlIHRoZSAtTAogICBmbGFnIHRvICdsZCcgd2hpY2ggY2F1c2VzIHRoZSBIUC1VWCAxMC4yMCBmbGF2b3VyIHRvIGZhaWwgb24gYWxsIGxpYmNoZWNrcwogICBhbmQgdGhlcmVmb3JlIHlvdSBjYW4ndCBtYWtlIHRoZSBjb25maWd1cmUgc2NyaXB0IGZpbmQgdGhlIG9wZW5zc2wgbGlicyEKCg==