ICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgIElOU1RBTExJTkcgU1VCVkVSU0lPTgogICAgICAgICAgICAgICAgICAgICAgICAgIEEgUXVpY2sgR3VpZGUKICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiRMYXN0Q2hhbmdlZERhdGUkCgoiSXMgU3VidmVyc2lvbiBzdGFibGUgZW5vdWdoIGZvciBtZSB0byB1c2UgZm9yIG15IG93biBwcm9qZWN0cz8iCgpXZSB0aGluayBzbyEgIFJlYWQgdGhlIGZ1bGwgRkFRIGFuc3dlciBvbiB0aGUgd2Vic2l0ZToKICBodHRwOi8vc3VidmVyc2lvbi50aWdyaXMub3JnL2ZhcS5odG1sI3N0YWJsZQoKCkNvbnRlbnRzOgoKICAgICBJLiBCVUlMRCBSRVFVSVJFTUVOVFMKCiAgICBJSS4gSU5TVEFMTEFUSU9OCiAgICAgQS4gQnVpbGRpbmcgZnJvbSBhIFRhcmJhbGwgb3IgUlBNCiAgICAgQi4gQnVpbGRpbmcgdGhlIExhdGVzdCBTb3VyY2UgdW5kZXIgVW5peAogICAgIEMuIEJ1aWxkaW5nIHVuZGVyIFVuaXggaW4gRGlmZmVyZW50IERpcmVjdG9yaWVzCiAgICAgRC4gSW5zdGFsbGluZyBmcm9tIGEgWmlwIG9yIEluc3RhbGxlciBGaWxlIHVuZGVyIFdpbmRvd3MKICAgICBFLiBCdWlsZGluZyB0aGUgTGF0ZXN0IFNvdXJjZSB1bmRlciBXaW5kb3dzCgogICBJSUkuIEJVSUxESU5HIEEgU1VCVkVSU0lPTiBTRVJWRVIKICAgICBBLiBTZXR0aW5nIFVwIEFwYWNoZQogICAgIEIuIE1ha2luZyBhbmQgSW5zdGFsbGluZyB0aGUgU3VidmVyc2lvbiBTZXJ2ZXIKICAgICBDLiBDb25maWd1cmluZyBBcGFjaGUgZm9yIFN1YnZlcnNpb24KICAgICBELiBSdW5uaW5nIGFuZCBUZXN0aW5nCiAgICAgRS4gQWx0ZXJuYXRpdmU6ICAnc3Zuc2VydmUnIGFuZCByYV9zdm4KCiAgICBJVi4gUExBVEZPUk0tU1BFQ0lGSUMgSVNTVUVTCiAgICAgQS4gV2luZG93cyBYUAogICAgIEIuIE1hYyBPUyBYCgogICAgIFYuIFBST0dSQU1NSU5HIExBTkdVQUdFIEJJTkRJTkdTIChQWVRIT04sIFBFUkwsIFJVQlksIEpBVkEpCgoKDApJLiAgICBCVUlMRCBSRVFVSVJFTUVOVFMKICAgICAgPT09PT09PT09PT09PT09PT09CgogICAgICBTdWJ2ZXJzaW9uIGRlcGVuZHMgb24gYSBudW1iZXIgb2YgdGhpcmQgcGFydHkgdG9vbHMgYW5kIGxpYnJhcmllcy4KICAgICAgSWYgeW91IGFyZSBib290c3RyYXBwaW5nIGZyb20gYSB0YXJiYWxsLCB6aXBmaWxlIG9yIGFuIFJQTSB0aGVuCiAgICAgIHlvdSB3aWxsIGFscmVhZHkgaGF2ZSBldmVyeXRoaW5nIHlvdSByZXF1aXJlIHRvIGdldCBhIFN1YnZlcnNpb24KICAgICAgY2xpZW50LiAgU28gbG9uZyBhcyB5b3UgZG9uJ3QgcGxhbiB0byBidWlsZCBhIG5ldyBjbGllbnQgZnJvbSB0aGUKICAgICAgbGF0ZXN0IHNvdXJjZSBvciB0byBidWlsZCBhIFN1YnZlcnNpb24gc2VydmVyLCB5b3UgY2FuIGdvIGRpcmVjdGx5CiAgICAgIHRvIHNlY3Rpb24gSUkuQS4KCiAgICAgIE90aGVyd2lzZSwgeW91IG5lZWQgdG8gcmVhZCB0aGUgZm9sbG93aW5nIHNvIHRoYXQgeW91IGNhbiBkZXRlcm1pbmUKICAgICAgd2hhdCBvdGhlciB0b29scyBhbmQgbGlicmFyaWVzIHdpbGwgYmUgcmVxdWlyZWQgc28gdGhhdCBTdWJ2ZXJzaW9uCiAgICAgIGNhbiBiZSBidWlsdCB3aXRoIHRoZSBzZXQgb2YgZmVhdHVyZXMgeW91IHdhbnQuCgogICAgICBPbiBVbml4IHN5c3RlbXMsIHRoZSAnLi9jb25maWd1cmUnIHNjcmlwdCB3aWxsIHRlbGwgeW91IGlmIHlvdSBhcmUKICAgICAgbWlzc2luZyB0aGUgY29ycmVjdCB2ZXJzaW9uIG9mIGFueSBvZiB0aGUgcmVxdWlyZWQgbGlicmFyaWVzIG9yCiAgICAgIHRvb2xzLCBzbyBpZiB5b3UgYXJlIGluIGEgcmVhbCBodXJyeSB0byBnZXQgYnVpbGRpbmcsIHlvdSBjYW4gc2tpcAogICAgICBzdHJhaWdodCB0byBzZWN0aW9uIElJLiAgSWYgeW91IHdhbnQgdG8gZ2F0aGVyIHRoZSBwaWVjZXMgeW91IHdpbGwKICAgICAgbmVlZCBiZWZvcmUgc3RhcnRpbmcgb3V0LCBob3dldmVyLCB5b3Ugc2hvdWxkIHJlYWQgdGhlIGZvbGxvd2luZy4KCiAgICAgIE5vdGU6IEJlY2F1c2UgcHJldmlvdXMgYnVpbGRzIG9mIFN1YnZlcnNpb24gbWF5IGhhdmUgaW5zdGFsbGVkIG9sZGVyCiAgICAgIHZlcnNpb25zIG9mIHRoZXNlIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIHJ1biBzb21lIG9mIHRoZSBjbGVhbnVwCiAgICAgIGNvbW1hbmRzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIElJLkIgYmVmb3JlIGluc3RhbGxpbmcgdGhlIGZvbGxvd2luZy4KCgogICAgICAxLiAgQXBhY2hlIFBvcnRhYmxlIFJ1bnRpbWUgMC45LjUgKGh0dHA6Ly9hcHIuYXBhY2hlLm9yZy8pCgogICAgICBXaGVuZXZlciB5b3Ugd2FudCB0byBidWlsZCBhbnkgcGFydCBvZiBTdWJ2ZXJzaW9uLCB5b3UgbmVlZCB0aGUKICAgICAgQXBhY2hlIFBvcnRhYmxlIFJ1bnRpbWUgKEFQUikgYW5kIHRoZSBBUFIgVXRpbGl0eSAoQVBSLXV0aWwpCiAgICAgIGxpYnJhcmllcy4gVGhlc2UgYXJlIGluY2x1ZGVkIGluIFN1YnZlcnNpb24gc291cmNlIHRhcmJhbGwgcmVsZWFzZXMgLQogICAgICBpZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gYSBzb3VyY2UgdGFyYmFsbCwgYW5kIHdpc2ggdG8gdXNlIHRoZQogICAgICBpbmNsdWRlZCB2ZXJzaW9ucywgeW91IG1heSBza2lwIGFoZWFkIHRvIHRoZSBuZXh0IHJlcXVpcmVtZW50LgoKICAgICAgSWYgeW91IGFyZSBub3QgYnVpbGRpbmcgZnJvbSBhIHRhcmJhbGwsIHlvdSB3aWxsIG5lZWQgdG8gZ2V0IHRoZXNlCiAgICAgIHlvdXJzZWxmLiBWaXNpdCB0aGlzIHBhZ2UsIGFuZCBiZSBzdXJlIHRvIGRvd25sb2FkIHRoZSAwLjkueCB2ZXJzaW9uOgoKICAgICAgICAgIGh0dHA6Ly9hcHIuYXBhY2hlLm9yZy9kb3dubG9hZC5jZ2kKCiAgICAgIE9uIFVuaXggc3lzdGVtcywgaWYgeW91IGFscmVhZHkgaGF2ZSB0aGUgQVBSIGxpYnJhcmllcyBjb21waWxlZCBhbmQgZG8KICAgICAgbm90IHdpc2ggdG8gcmVnZW5lcmF0ZSB0aGVtIGZyb20gc291cmNlIGNvZGUsIHRoZW4gU3VidmVyc2lvbiBuZWVkcyB0bwogICAgICBiZSBhYmxlIHRvIGZpbmQgdGhlbS4KCiAgICAgIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiBvcHRpb25zIHRvICIuL2NvbmZpZ3VyZSIgdGhhdCB0ZWxsIGl0IHdoZXJlCiAgICAgIHRvIGxvb2sgZm9yIHRoZSBBUFIgYW5kIEFQUi11dGlsIGxpYnJhcmllcy4gQnkgZGVmYXVsdCwgaXQgd2lsbCBmaXJzdAogICAgICBsb29rIGZvciBidW5kbGVkIHZlcnNpb25zIG9mIEFQUiBhbmQgQVBSLXV0aWwsIGFuZCB0aGVuIHRyeSB0byBsb2NhdGUKICAgICAgYWxyZWFkeSBpbnN0YWxsZWQgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcmllcyB1c2luZyB0aGUgYXByLWNvbmZpZyBhbmQKICAgICAgYXB1LWNvbmZpZyBzY3JpcHRzLiBUaGVzZSBzY3JpcHRzIHByb3ZpZGUgYWxsIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbgogICAgICBmb3IgdGhlIEFQUiBhbmQgQVBSLXV0aWwgaW5zdGFsbGF0aW9ucy4KCiAgICAgIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSBBUFIgbGlicmFyeSwgeW91IGNhbiB1c2UKICAgICAgdGhlICItLXdpdGgtYXByPSIgb3B0aW9uIG9mICIuL2NvbmZpZ3VyZSIuIEl0IHNob3VsZCBiZSBhYmxlIHRvIGZpbmQKICAgICAgdGhlIGFwci1jb25maWcgc2NyaXB0IGluIHRoZSBzdGFuZGFyZCBsb2NhdGlvbiB1bmRlciB0aGF0IGRpcmVjdG9yeQogICAgICAoZS5nLiAke3ByZWZpeH0vYmluKS4KCiAgICAgIFNpbWlsYXJseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBBUFItdXRpbCB1c2luZyB0aGUKICAgICAgIi0td2l0aC1hcHItdXRpbD0iIG9wdGlvbiB0byAiLi9jb25maWd1cmUiLiBJdCB3aWxsIGxvb2sgZm9yIHRoZQogICAgICBhcHUtY29uZmlnIHNjcmlwdCByZWxhdGl2ZSB0byB0aGF0IGRpcmVjdG9yeS4KCiAgICAgIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIEFQUiBsaWJyYXJpZXMgeW91IGJ1aWx0CiAgICAgIHdpdGggdGhlIEFwYWNoZSBodHRwZCAyLjAgc2VydmVyLCB5b3UgY291bGQgcnVuOgoKICAgICAgICAgICQgLi9jb25maWd1cmUgLS13aXRoLWFwcj0vdXNyL2xvY2FsL2FwYWNoZTIgXAogICAgICAgICAgICAtLXdpdGgtYXByLXV0aWw9L3Vzci9sb2NhbC9hcGFjaGUyICAuLi4KCiAgICAgIElmIHlvdSB3YW50IFN1YnZlcnNpb24gdG8gYnVpbGQgdGhlIEFQUiBsaWJyYXJpZXMgZnJvbSBzb3VyY2UKICAgICAgY29kZSBhcyBwYXJ0IG9mIHRoZSBTdWJ2ZXJzaW9uIGJ1aWxkIHByb2Nlc3MsIHlvdSBjYW4gcHV0IHRoZWlyCiAgICAgIHNvdXJjZSBjb2RlIGludG8gdGhlICIuL2FwciIgYW5kICIuL2Fwci11dGlsIiBkaXJlY3Rvcmllcy4KCiAgICAgIFlvdSBkb24ndCBuZWVkIHRoZSBsYXRlc3QgZGV2ZWxvcG1lbnQgdmVyc2lvbnMsIHNpbmNlIFN1YnZlcnNpb24gaXMKICAgICAgZ3VhcmFudGVlZCB0byBjb21waWxlIGFnYWluc3QgdGhlIGxhdGVzdCByZWxlYXNlZCBBUFIgYW5kIEFQUi11dGlsLgogICAgICBIb3dldmVyLCBpZiB5b3UgcmVhbGx5IHdhbnQgdG8sIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgdHdvCiAgICAgIGNvbW1hbmRzLiBJZiB5b3UgcnVuIHRoZW0gZnJvbSB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdSd2ZSBjaGVja2VkIG91dAogICAgICBTdWJ2ZXJzaW9uLCB0aGVuIHRoZSBBUFIgc291cmNlIGNvZGUgd2lsbCBiZSBpbiAiLi9hcHIiIGFuZAogICAgICAiLi9hcHItdXRpbCIsIHdoZXJlIFN1YnZlcnNpb24gd2FudHMgaXQ6CgogICAgICAkIHN2biBjbyBcCiAgICAgICAgaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hcHIvYXByL2JyYW5jaGVzLzAuOS54IGFwcgogICAgICAkIHN2biBjbyBcCiAgICAgICAgaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hcHIvYXByLXV0aWwvYnJhbmNoZXMvMC45LnggYXByLXV0aWwKCiAgICAgIE5PVEU6IE9uIFdpbmRvd3MgeW91IHdpbGwgYWxzbyBuZWVkIGFwci1pY29udi4gIENoZWNrIGl0IG91dCBuZXh0IHRvCiAgICAgIHRoZSBhcHIgYW5kIGFwci11dGlsIGRpcmVjdG9yaWVzOgoKICAgICAgJCBzdm4gY28gXAogICAgICAgIGh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXByL2Fwci1pY29udi9icmFuY2hlcy8wLjkueCBhcHItaWNvbnYKCiAgICAgIEJlIHN1cmUgdG8gdXNlIGEgbmF0aXZlIFdpbmRvd3MgU1ZOIGNsaWVudCAoYXMgb3Bwb3NlZCB0bwogICAgICBDeWd3aW4ncyB2ZXJzaW9uKSBzbyB0aGF0IHRoZSAuZHNwIGZpbGVzIGdldCBjYXJyaWFnZS1yZXR1cm5zIGF0CiAgICAgIHRoZSBlbmRzIG9mIHRoZWlyIGxpbmVzLiAgT3RoZXJ3aXNlIFZpc3VhbCBTdHVkaW8gd2lsbCBjb21wbGFpbgogICAgICB0aGF0IGl0IGRvZXNuJ3QgcmVjb2duaXplIHRoZSAuZHNwIGZpbGVzLgoKCiAgICAgIDIuICBhdXRvY29uZiAyLjUwIG9yIG5ld2VyIChVbml4IG9ubHkpCgogICAgICBUaGlzIGlzIHJlcXVpcmVkIG9ubHkgaWYgeW91IHBsYW4gdG8gYnVpbGQgZnJvbSB0aGUgbGF0ZXN0IHNvdXJjZQogICAgICAoc2VlIHNlY3Rpb24gSUkuQikuIEdlbmVyYWxseSBvbmx5IGRldmVsb3BlcnMgd291bGQgYmUgZG9pbmcgdGhpcy4KCgogICAgICAzLiAgbGlidG9vbCAxLjQgb3IgbmV3ZXIgKFVuaXggb25seSkKCiAgICAgIFRoaXMgaXMgcmVxdWlyZWQgb25seSBpZiB5b3UgcGxhbiB0byBidWlsZCBmcm9tIHRoZSBsYXRlc3Qgc291cmNlCiAgICAgIChzZWUgc2VjdGlvbiBJSS5CKS4KCiAgICAgIE5vdGU6IFNvbWUgc3lzdGVtcyAoU29sYXJpcywgZm9yIGV4YW1wbGUpIHJlcXVpcmUgbGlidG9vbCAxLjQuMyBvcgogICAgICBuZXdlci4gVGhlIGF1dG9nZW4uc2ggc2NyaXB0IGtub3dzIGFib3V0IHRoYXQuCgoKICAgICAgNC4gIE5lb24gbGlicmFyeSAwLjI0Ljcgb3IgMC4yNS4wIChodHRwOi8vd3d3LndlYmRhdi5vcmcvbmVvbi8pCgogICAgICBUaGUgTmVvbiBsaWJyYXJ5IGFsbG93cyBhIFN1YnZlcnNpb24gY2xpZW50IHRvIGludGVyYWN0IHdpdGggcmVtb3RlCiAgICAgIHJlcG9zaXRvcmllcyBvdmVyIHRoZSBJbnRlcm5ldCB2aWEgYSBXZWJEQVYgYmFzZWQgcHJvdG9jb2wuICBJZiB5b3UKICAgICAgd2FudCB0byB1c2UgU3VidmVyc2lvbiB0byBjb25uZWN0IHRvIGEgc2VydmVyIG92ZXIgcmFfZGF2ICh2aWEgYQogICAgICBodHRwOi8vIG9yIGh0dHBzOi8vIHVybCksIHlvdSB3aWxsIHJlcXVpcmUgTmVvbi4KCiAgICAgIFRoZSBOZW9uIGxpYnJhcnkgc291cmNlIGNvZGUgY2FuIGJlIGluc3RhbGxlZCBpbiAiLi9uZW9uIiBpZiB5b3UKICAgICAgd2FudCBTdWJ2ZXJzaW9uIHRvIGJ1aWxkIGl0IGFzIHBhcnQgb2YgdGhlIFN1YnZlcnNpb24gYnVpbGQgcHJvY2Vzcy4KICAgICAgVGhlIHNvdXJjZSBjb2RlIGlzIGluY2x1ZGVkIHdpdGggdGhlIGxhdGVzdCBTdWJ2ZXJzaW9uIHRhcmJhbGwsIGFuZCBpdAogICAgICBjYW4gYWxzbyBiZSBvYnRhaW5lZCBmcm9tOgoKICAgICAgICAgIGh0dHA6Ly93d3cud2ViZGF2Lm9yZy9uZW9uL25lb24tMC4yNC43LnRhci5negogICAgICAgICAgICAtb3ItCiAgICAgICAgICBodHRwOi8vd3d3LndlYmRhdi5vcmcvbmVvbi9uZW9uLTAuMjUuMC50YXIuZ3oKCiAgICAgIFVucGFjayB0aGUgYXJjaGl2ZSB1c2luZyB0YXIvZ3VuemlwIGFuZCByZW5hbWUgdGhlIHJlc3VsdGluZwogICAgICBkaXJlY3RvcnkgZnJvbSAuL25lb24tMC5YWC5ZIHRvIGp1c3QgIi4vbmVvbiIuCgogICAgICBXaXRob3V0IHNvdXJjZSBjb2RlLCBhIHByZXZpb3VzbHkgY29tcGlsZWQgbGlicmFyeSBjYW4gYmUgcGlja2VkIHVwCiAgICAgIGZyb20gdGhlIHN0YW5kYXJkIGxvY2F0aW9ucy4gSWYgeW91IHdhbnQgdG8gc3BlY2lmeSBhIG5vbnN0YW5kYXJkCiAgICAgIGxvY2F0aW9uLCB5b3UgbmVlZCB0byB1c2UgdGhlIExERkxBR1MgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbgogICAgICB5b3UgcnVuICIuL2NvbmZpZ3VyZSIuIFlvdSBtYXkgYWxzbyBoYXZlIHRvIHNwZWNpZnkgd2hlcmUgdGhlCiAgICAgIG5lb24tY29uZmlnIHNjcmlwdCAod2hpY2ggaWRlbnRpZmllcyB2YXJpb3VzIGZlYXR1cmVzIG9mIHRoZSBOZW9uCiAgICAgIGxpYnJhcnkpIGlzIGtlcHQgYnkgZ2l2aW5nIHRoZSAiLS13aXRoLW5lb249IiBvcHRpb24gdG8KICAgICAgIi4vY29uZmlndXJlIi4gTm90ZSB0aGF0IHRoZSBzY3JpcHQgc2hvdWxkIGJlIGtlcHQgaW4gYSAiYmluIgogICAgICBzdWJkaXJlY3RvcnkgYmVuZWF0aCB3aGVyZXZlciAiLS13aXRoLW5lb24iIGlzIHBvaW50ZWQuCgoKICAgICAgNS4gIEJlcmtlbGV5IERCIDQuWAoKICAgICAgQmVya2VsZXkgREIgaXMgbmVlZGVkIHRvIGJ1aWxkIGEgU3VidmVyc2lvbiBzZXJ2ZXIgdGhhdCBzdXBwb3J0cwogICAgICB0aGUgYmRiIHJlcG9zaXRvcnkgZmlsZXN5c3RlbSwgb3IgdG8gYWNjZXNzIGEgYmRiIHJlcG9zaXRvcnkgb24KICAgICAgbG9jYWwgZGlzay4gIElmIHlvdSB3aWxsIG9ubHkgdXNlIHRoZSBmc2ZzIHJlcG9zaXRvcnkgZmlsZXN5c3RlbSwKICAgICAgb3IgaWYgeW91IGFyZSBidWlsZGluZyBhIFN1YnZlcnNpb24gY2xpZW50IHRoYXQgd2lsbCBvbmx5IHNwZWFrCiAgICAgIHRvIHJlbW90ZSAobmV0d29ya2VkKSByZXBvc2l0b3JpZXMsIHlvdSBkb24ndCBuZWVkIGl0LgoKICAgICAgVGhlIGN1cnJlbnQgcmVjb21tZW5kZWQgdmVyc2lvbiBpcyA0LjMuMjcuIFdlICpzdHJvbmdseSogcmVjb21tZW5kCiAgICAgIHVzaW5nIDQuMyBvciA0LjIgb3ZlciA0LjEgb3IgNC4wLiAgTm90IG9ubHkgYXJlIHRoZXNlIHRoZSBmYXN0ZXN0CiAgICAgIGFuZCBtb3N0IHN0YWJsZSB3ZSd2ZSBzZWVuLCBidXQgdGhleSBhbHNvIGVuYWJsZSBTdWJ2ZXJzaW9uCiAgICAgIHJlcG9zaXRvcmllcyB0byBhdXRvbWF0aWNhbGx5IGNsZWFuIHVwIGRhdGFiYXNlIGpvdXJuYWwgZmlsZXMgdG8KICAgICAgc2F2ZSBkaXNrIHNwYWNlLgoKICAgICAgWW91J2xsIG5lZWQgQmVya2VsZXkgREIgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLiAgWW91IGNhbgogICAgICBnZXQgaXQgZnJvbToKCiAgICAgICAgICBodHRwOi8vd3d3LnNsZWVweWNhdC5jb20vZG93bmxvYWQvaW5kZXguc2h0bWwKCiAgICAgIElmIHlvdSBoYXZlIEJlcmtlbGV5IERCIGluc3RhbGxlZCBpbiBhIHBsYWNlIG5vdCBzZWFyY2hlZCBieSBkZWZhdWx0CiAgICAgIGZvciBpbmNsdWRlcyBhbmQgbGlicmFyaWVzLCBhZGQgc29tZXRoaW5nIGxpa2UgdGhpczoKCiAgICAgICAgICAtLXdpdGgtYmVya2VsZXktZGI9L3Vzci9sb2NhbC9CZXJrZWxleURCLjQuMwoKICAgICAgdG8geW91ciBgY29uZmlndXJlJyBzd2l0Y2hlcywgYW5kIHRoZSBidWlsZCBwcm9jZXNzIHdpbGwgdXNlIHRoZQogICAgICBCZXJrZWxleSBsaWJyYXJ5IGluIHRoZSBuYW1lZCBkaXJlY3RvcnkuICBZb3UgbWF5IG5lZWQgdG8gdXNlIGEKICAgICAgZGlmZmVyZW50IHBhdGgsIG9mIGNvdXJzZS4gIE5vdGUgdGhhdCBpbiBvcmRlciBmb3IgdGhlIGRldGVjdGlvbgogICAgICB0byBzdWNjZWVkLCB0aGUgZHluYW1pYyBsaW5rZXIgbXVzdCBiZSBhYmxlIHRvIGZpbmQgdGhlIGxpYnJhcmllcwogICAgICBhdCBjb25maWd1cmUgdGltZS4KCiAgICAgIElmIHlvdSBhcmUgb24gdGhlIFdpbmRvd3MgcGxhdGZvcm0gYW5kIHdhbnQgdG8gYnVpbGQgU3VidmVyc2lvbiwKICAgICAgYSBwcmVjb21waWxlZCB2ZXJzaW9uIG9mIHRoZSBCZXJrZWxleSBEQiBsaWJyYXJ5IGlzIGF2YWlsYWJsZSBmb3IKICAgICAgZG93bmxvYWQgYXQgdGhlIFN1YnZlcnNpb24gd2ViIHNpdGUgIkRvY3VtZW50cyAmIGZpbGVzIiBhcmVhOgoKICAgICAgICAgIGh0dHA6Ly9zdWJ2ZXJzaW9uLnRpZ3Jpcy5vcmcvc2VydmxldHMvUHJvamVjdERvY3VtZW50TGlzdAoKICAgICAgTG9vayBpbiB0aGUgIlJlbGVhc2VzID4gV2luZG93cyA+IFdpbmRvd3MgQkRCIiBzZWN0aW9uLgoKCiAgICAgIDYuICBBcGFjaGUgV2ViIFNlcnZlciAyLjAuNDkgb3IgbmV3ZXIKICAgICAgICAgIChodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb3dubG9hZC5jZ2kpCgogICAgICBUaGUgQXBhY2hlIGh0dHBkIHNlcnZlciBpcyBvbmUgb2YgdHdvIG1ldGhvZHMgdG8gbWFrZSB5b3VyIFN1YnZlcnNpb24KICAgICAgcmVwb3NpdG9yeSBhdmFpbGFibGUgb3ZlciBhIG5ldHdvcmsgLSB0aGUgb3RoZXIgaXMgYSBjdXN0b20gc2VydmVyCiAgICAgIHByb2dyYW0gY2FsbGVkIHN2bnNlcnZlLCB3aGljaCByZXF1aXJlcyBubyBleHRyYSBzb2Z0d2FyZSBwYWNrYWdlcy4KICAgICAgQnVpbGRpbmcgU3VidmVyc2lvbiwgdGhlIEFwYWNoZSBzZXJ2ZXIsIGFuZCB0aGUgbW9kdWxlcyB0aGF0IEFwYWNoZQogICAgICBuZWVkcyB0byBjb21tdW5pY2F0ZSB3aXRoIFN1YnZlcnNpb24gYXJlIGNvbXBsaWNhdGVkIGVub3VnaCB0aGF0IHRoZXJlCiAgICAgIGlzIGEgd2hvbGUgc2VjdGlvbiBhdCB0aGUgZW5kIG9mIHRoaXMgZG9jdW1lbnQgdGhhdCBkZXNjcmliZXMgaG93IGl0CiAgICAgIGlzIGRvbmU6IFNlZSBzZWN0aW9uIElJSSBmb3IgZGV0YWlscy4KCiAgICAgIDYuMSBBcGFjaGUgV2ViIFNlcnZlciAyLjAuNTQgb3IgbmV3ZXIgKFdpbmRvd3Mgb25seSkKICAgICAgICAgIChodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb3dubG9hZC5jZ2kpCgogICAgICBJZiB5b3UgYXJlIG9uIFdpbmRvd3MsIHlvdSB3aWxsIG5lZWQgYXQgbGVhc3QgdmVyc2lvbiAyLjAuNTQgb2YKICAgICAgdGhlIEFwYWNoZSBXZWIgc2VydmVyLiBFYXJsaWVyIHZlcnNpb25zIGRvbid0IHN1cHBvcnQgZmlsZSBsb2NraW5nLAogICAgICB3aGljaCB3YXMgaW50cm9kdWNlZCBpbiBTdWJ2ZXJzaW9uIDEuMi4KCgogICAgICA3LiAgUHl0aG9uIDIuMCAoaHR0cDovL3d3dy5weXRob24ub3JnLykKCiAgICAgIElmIHlvdSB3YW50IHRvIHJ1biAibWFrZSBjaGVjayIgb3IgYnVpbGQgZnJvbSB0aGUgbGF0ZXN0IHNvdXJjZQogICAgICB1bmRlciBVbml4IGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIElJLkIgYW5kIElJSS5ELCBpbnN0YWxsCiAgICAgIFB5dGhvbiAyLjAgb3IgaGlnaGVyIG9uIHlvdXIgc3lzdGVtLiBUaGUgbWFqb3JpdHkgb2YgdGhlIHRlc3QKICAgICAgc3VpdGUgaXMgd3JpdHRlbiBpbiBQeXRob24sIGFzIGlzIHBhcnQgb2YgU3VidmVyc2lvbidzIGJ1aWxkCiAgICAgIHN5c3RlbS4gIE5vdGUgdGhhdCBjb21waWxpbmcgdW5kZXIgV2luZG93cyByZXF1aXJlcyBQeXRob24gMi4yCiAgICAgIG9yIG5ld2VyLgoKCiAgICAgIDguICBWaXN1YWwgQysrIDYuMCBvciBuZXdlciAoV2luZG93cyBPbmx5KQoKICAgICAgVG8gYnVpbGQgU3VidmVyc2lvbiB1bmRlciBhbnkgb2YgdGhlIE1TIFdpbmRvd3MgcGxhdGZvcm1zLCB5b3UKICAgICAgd2lsbCBuZWVkIGEgY29weSBvZiBNaWNyb3NvZnQgVmlzdWFsIEMrKy4gIFlvdSBjYW4gZ2VuZXJhdGUgdGhlCiAgICAgIHByb2plY3QgZmlsZXMgdXNpbmcgdGhlIGdlbi1tYWtlLnB5IHNjcmlwdC4KCgogICAgICA5LiBQZXJsIDUuOCBvciBuZXdlciAoV2luZG93cyBvbmx5KQoKICAgICAgVG8gYnVpbGQgU3VidmVyc2lvbiB1bmRlciBhbnkgb2YgdGhlIE1TIFdpbmRvd3MgcGxhdGZvcm1zLCB5b3UKICAgICAgd2lsbCBhbHNvIG5lZWQgUGVybCA1Ljggb3IgbmV3ZXIgdG8gcnVuIGFwci11dGlsJ3MgdzMybG9jYXRlZGIucGwKICAgICAgc2NyaXB0LgoKCiAgICAgIDEwLiBNQVNNIDYgb3IgbmV3ZXIgKFdpbmRvd3Mgb25seSwgb3B0aW9uYWwpCgogICAgICBUaGUgV2luZG93cyBidWlsZCBzY3JpcHRzIGZvciBTdWJ2ZXJzaW9uIGNhbiB1c2UgdGhlIE1pY3Jvc29mdAogICAgICBNYWNybyBBc3NlbWJsZXIgKE1BU00pIHRvIGJ1aWxkIGFuIG9wdGltaXplZCB2ZXJzaW9uIG9mIHRoZSBaTGliCiAgICAgIGxpYnJhcnkuIE1ha2Ugc3VyZSB0aGF0IHRoZSB2ZXJzaW9uIG9mIE1BU00geW91IHVzZSBpcyBjb21wYXRpYmxlCiAgICAgIHdpdGggdGhlIEMgY29tcGlsZXIuIElmIHlvdSdyZSB1c2luZyBNU1ZDIDYsIGFuZCBkb24ndCBoYXZlIE1BU00gNiwKICAgICAgYSBmcmVlIE1BU00tY29tcGF0aWJsZSBhc3NlbWJsZXIgaXMgYXZhaWxhYmxlIGhlcmU6CgogICAgICAgICAgaHR0cDovL3d3dy5tYXNtMzIub3JnLwoKICAgICAgWW91IG9ubHkgbmVlZCBNTC5FWEUgYW5kIE1MLkVSUiBmcm9tIHRoaXMgZGlzdHJpYnV0aW9uLgoKICAgICAgVGhlIFZTLk5FVCBpbnN0YWxsYXRpb24gYWxyZWFkeSBjb250YWlucyBNQVNNIChidXQgbm90ZSwgdGhhdAogICAgICB2ZXJzaW9uIGlmIE1BU00gaXMgbm90IGNvbXBhdGlibGUgd2l0aCBNU1ZDIDYpLgoKCiAgICAgIDExLiBMaWJyYXJpZXMgZm9yIG91ciBsaWJyYXJpZXMKCiAgICAgIFNvbWUgb2YgdGhlIGxpYnJhcmllcyB0aGF0IFN1YnZlcnNpb24gZGVwZW5kcyBvbiB0aGVtc2VsdmVzIGhhdmUKICAgICAgb3B0aW9uYWwgZGVwZW5kZW5jaWVzIHRoYXQgY2FuIGFkZCBmZWF0dXJlcyB0byB3aGF0IFN1YnZlcnNpb24KICAgICAgY2FuIGRvLiAgSGVyZSBhcmUgc29tZSBleGFtcGxlcy4KCiAgICAgIFRoZSBOZW9uIGxpYnJhcnkgaGFzIHN1cHBvcnQgZm9yIFNTTCBlbmNyeXB0aW9uIGJ5IHJlbHlpbmcgb24gdGhlCiAgICAgIE9wZW5TU0wgbGlicmFyeS4gIFdoZW4gTmVvbiBpcyBjcmVhdGVkIHdpdGggdGhpcyBkZXBlbmRlbmN5LCB0aGVuCiAgICAgIHRoZSBTdWJ2ZXJzaW9uIGNsaWVudCBpbmhlcml0cyB0aGUgYWJpbGl0eSB0byBzdXBwb3J0IFNTTAogICAgICBjb25uZWN0aW9ucy4gIE5lb24gYWxzbyBoYXMgc3VwcG9ydCBmb3Igc2VuZGluZyBjb21wcmVzc2VkIGRhdGEKICAgICAgdXNpbmcgdGhlIHpsaWIgbGlicmFyeSB3aGljaCBhIFN1YnZlcnNpb24gY2xpZW50IGNhbiB0YWtlCiAgICAgIGFkdmFudGFnZSBvZi4KCiAgICAgIE9uIFVuaXggc3lzdGVtcywgaWYgeW91IGFyZSBidWlsZGluZyBuZW9uIGFzIHBhcnQgb2YgdGhlIFN1YnZlcnNpb24KICAgICAgYnVpbGQgcHJvY2VzcyAoYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gSS40IGFib3ZlKSwgeW91IGNhbiBwYXNzIGZsYWdzCiAgICAgIHRvIFN1YnZlcnNpb24ncyAiLi9jb25maWd1cmUiLCBhbmQgdGhleSB3aWxsIGJlIHBhc3NlZCBvbiB0byBuZW9uJ3MKICAgICAgIi4vY29uZmlndXJlIi4gIFlvdSBuZWVkIE9wZW5TU0wgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLCBhbmQgeW91CiAgICAgIG11c3QgYWRkICItLXdpdGgtc3NsIiBhcyBhICIuL2NvbmZpZ3VyZSIgcGFyYW1ldGVyLiAgSWYgeW91ciBPcGVuU1NMCiAgICAgIGluc3RhbGxhdGlvbiBpcyBoYXJkIGZvciBOZW9uIHRvIGZpbmQsIHlvdSBtYXkgbmVlZCB0byB1c2UKICAgICAgIi0td2l0aC1saWJzPS9wYXRoL3RvL2xpYiIgaW4gYWRkaXRpb24uICBJbiBwYXJ0aWN1bGFyLCBvbiBSZWQgSGF0CiAgICAgIChidXQgbm90IEZlZG9yYSBDb3JlKSBpdCBpcyBuZWNlc3NhcnkgdG8gc3BlY2lmeQogICAgICAiLS13aXRoLWxpYnM9L3Vzci9rZXJiZXJvcyIgZm9yIE9wZW5TU0wgdG8gYmUgZm91bmQuICBUaGUgemxpYiBsaWJyYXJ5CiAgICAgIGlzIGluY2x1ZGVkIGluIE5lb24gYnkgZGVmYXVsdCwgYnV0IHlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgcGF0aCB0byB0aGUKICAgICAgbGlicmFyeSB1c2luZyAiLS13aXRoLWxpYnMiLiAgQ29uc3VsdCB0aGUgTmVvbiBkb2N1bWVudGF0aW9uIGZvciBtb3JlCiAgICAgIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2UgdGhlc2UgcGFyYW1ldGVycyBhbmQgdmVyc2lvbnMgb2YgbGlicmFyaWVzCiAgICAgIHlvdSBuZWVkLgoKICAgICAgVW5kZXIgV2luZG93cywgeW91IGNhbiBzcGVjaWZ5IHRoZSBwYXRocyB0byB0aGVzZSBsaWJyYXJpZXMgYnkKICAgICAgcGFzc2luZyB0aGUgb3B0aW9ucyAtLXdpdGgtemxpYiBhbmQgLS13aXRoLW9wZW5zc2wgdG8gZ2VuLW1ha2UucHkuCgogICAgICBZb3UgY2FuIGFsc28gYWRkIHN1cHBvcnQgZm9yIHRoZXNlIGZlYXR1cmVzIHRvIGFuIEFwYWNoZSBodHRwZCBzZXJ2ZXIKICAgICAgdG8gYmUgdXNlZCBmb3IgU3VidmVyc2lvbiB1c2luZyB0aGUgc2FtZSBzdXBwb3J0IGxpYnJhcmllcy4gIFRoZQogICAgICBTdWJ2ZXJzaW9uIGJ1aWxkIHN5c3RlbSB3aWxsIG5vdCBwcm92aWRlIHRoZW0sIGhvd2V2ZXIuICBZb3UgYWRkIHRoZW0KICAgICAgYnkgc3BlY2lmeWluZyBwYXJhbWV0ZXJzIHRvIHRoZSAiLi9jb25maWd1cmUiIHNjcmlwdCBvZiB0aGUgQXBhY2hlCiAgICAgIFNlcnZlciBpbnN0ZWFkLgoKICAgICAgRm9yIGdldHRpbmcgU1NMIG9uIHlvdXIgc2VydmVyLCB5b3Ugd291bGQgYWRkIHRoZSAiLS1lbmFibGUtc3NsIgogICAgICBvciAiLS13aXRoLXNzbD0vcGF0aC90by9saWIiIG9wdGlvbiB0byBBcGFjaGUncyAiLi9jb25maWd1cmUiCiAgICAgIHNjcmlwdC4gIEFwYWNoZSBlbmFibGVzIHpsaWIgc3VwcG9ydCBieSBkZWZhdWx0LCBidXQgeW91IGNhbgogICAgICBzcGVjaWZ5IGEgbm9uc3RhbmRhcmQgbG9jYXRpb24gZm9yIHRoZSBsaWJyYXJ5IHdpdGggdGhlCiAgICAgICItLXdpdGgtej0vcGF0aC90by9kaXIiIG9wdGlvbi4gIENvbnN1bHQgdGhlIEFwYWNoZSBkb2N1bWVudGF0aW9uCiAgICAgIGZvciBtb3JlIGRldGFpbHMsIGFuZCBmb3Igb3RoZXIgbW9kdWxlcyB5b3UgbWF5IHdpc2ggdG8gaW5zdGFsbAogICAgICB0byBlbmhhbmNlIHlvdXIgU3VidmVyc2lvbiBzZXJ2ZXIuCgogICAgICBJZiB5b3UgZG9uJ3QgYWxyZWFkeSBoYXZlIGl0LCB5b3UgY2FuIGdldCBhIGNvcHkgb2YgT3BlblNTTCwKICAgICAgaW5jbHVkaW5nIGluc3RydWN0aW9ucyBmb3IgYnVpbGRpbmcgYW5kIHBhY2thZ2luZyBvbiBib3RoIFVuaXgKICAgICAgc3lzdGVtcyBhbmQgV2luZG93cywgYXQ6CgogICAgICAgICAgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8KCiAgICAgIE1hbnkgVW5peCBzeXN0ZW1zIGFscmVhZHkgY29tZSB3aXRoIHpsaWIsIGJ1dCBpZiB5b3UgbmVlZCBpdCwgaXQKICAgICAgaXMgYXZhaWxhYmxlIGZyb206CgogICAgICAgICAgaHR0cDovL3d3dy5nemlwLm9yZy96bGliLwoKICAgICAgV2luZG93cyB1c2VycyBzaG91bGQgZ2V0IHRoZSBzb3VyY2UgZm9yIFpMaWIgdmVyc2lvbiAxLjIgb3IgbGF0ZXI6CgogICAgICAgICAgaHR0cDovL3d3dy5nemlwLm9yZy96bGliL3psaWIxMjIuemlwCgogICAgICBUaGUgV2luZG93cyBidWlsZCBzY3JpcHRzIHdpbGwgY29tcGlsZSB0aGUgWkxpYiBzb3VyY2VzLgoKCiAgICAgIDExLiBCdWlsZGluZyBUaGUgRG9jdW1lbnRhdGlvbgoKICAgICAgVGhlIG1hc3RlciBzb3VyY2UgZm9ybWF0IGZvciBTdWJ2ZXJzaW9uJ3MgZG9jdW1lbnRhdGlvbiBpcwogICAgICBEb2Nib29rIExpdGUuICBTZWUgZG9jL2Jvb2svUkVBRE1FIGZvciBpbnN0cnVjdGlvbnMgaG93IHRvCiAgICAgIGNvbXBpbGUgdGhlIGJvb2sgaW50byBhIHVzZWZ1bCBmb3JtYXQuCgogICAgICBUaGUgcHJlZmVycmVkIGRvY3VtZW50YXRpb24gc291cmNlIGZvcm1hdCB1c2VkIHRvIGJlIFRleGluZm8uIFdlIGFyZQogICAgICBpbiB0aGUgcHJvY2VzcyBvZiBtaWdyYXRpbmcgYWxsIHRleGluZm8gZmlsZXMgdG8gRG9jQm9vayBMaXRlLiBUaGUKICAgICAgb25saW5lIGRvY3VtZW50YXRpb24gZm9yIHRleGluZm8gaXMgYXQKCiAgICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9tYW51YWwvdGV4aW5mby00LjAvaHRtbF9jaGFwdGVyL3RleGluZm9fdG9jLmh0bWwKCiAgICAgIERlcGVuZGluZyBvbiBleGFjdGx5IHdoaWNoIGRvYyB0YXJnZXRzIHlvdSBtYWtlLCB5b3UnbGwgbmVlZCBvbmUKICAgICAgb3IgbW9yZSBvZjoKCiAgICAgICAgICogdGhlIGBtYWtlaW5mbycgcHJvZ3JhbSBmcm9tIHRoZSBsYXRlc3QgdGV4aW5mbyBwYWNrYWdlIGluCiAgICAgICAgICAgZnRwOi8vZnRwLmdudS5vcmcvcHViL2dudS90ZXhpbmZvLwoKICAgICAgICAgKiB0aGUgYHRleGkyZHZpJyBvciBgdGV4aTJodG1sJyBwcm9ncmFtcwoKICAgICAgICAgKiB0aGUgYGR2aXBkZicgc2NyaXB0IGZyb20gR2hvc3RzY3JpcHQgKHBpcGVzIGR2aSB8IHBzIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdob3N0c2NyaXB0KQoKICAgICAgSWYgYG1ha2VpbmZvJyBpcyBub3QgaW5zdGFsbGVkIGJlZm9yZSBgY29uZmlndXJlJyBpcyBydW4sIHRoZW4KICAgICAgdGhlIGRvY3VtZW50YXRpb24gd2hpY2ggcmVxdWlyZXMgaXQgd2lsbCBub3QgYmUgY3JlYXRlZCBhbmQgaW5zdGFsbGVkLgoKCgwKSUkuICAgSU5TVEFMTEFUSU9OCiAgICAgID09PT09PT09PT09PQoKICBBLiAgQnVpbGRpbmcgZnJvbSBhIFRhcmJhbGwgb3IgUlBNCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgMS4gIEJ1aWxkaW5nIGZyb20gYSBUYXJiYWxsCgogICAgICBEb3dubG9hZCB0aGUgbW9zdCByZWNlbnQgZGlzdHJpYnV0aW9uIHRhcmJhbGwgZnJvbToKCiAgICAgICAgICBodHRwOi8vc3VidmVyc2lvbi50aWdyaXMub3JnL3NlcnZsZXRzL1Byb2plY3REb2N1bWVudExpc3QKCiAgICAgIFVucGFjayBpdCwgYW5kIHVzZSB0aGUgc3RhbmRhcmQgR05VIHByb2NlZHVyZSB0byBjb21waWxlOgoKICAgICAgICAgICQgLi9jb25maWd1cmUKICAgICAgICAgICQgbWFrZQogICAgICAgICAgIyBtYWtlIGluc3RhbGwKCiAgICAgIFlvdSBjYW4gYWxzbyBydW4gdGhlIGZ1bGwgdGVzdCBzdWl0ZSBieSBydW5uaW5nICdtYWtlIGNoZWNrJy4KCgogICAgICAyLiAgQnVpbGRpbmcgZnJvbSBhbiBSUE0KCiAgICAgIElmIHlvdSBhcmUgdXNpbmcgTGludXggKG9yIGFueSBPUyB0aGF0IGNhbiB1c2UgUlBNKSB0aGVuIGFub3RoZXIKICAgICAgcG9zc2liaWxpdHkgaXMgdG8gZG93bmxvYWQgdGhlIGJpbmFyeSBSUE0gZnJvbSB0aGUKICAgICAgaHR0cDovL3N1bW1lcnNvZnQuZmF5LmFyLnVzL3B1Yi9zdWJ2ZXJzaW9uIGRpcmVjdG9yeS4KCiAgICAgIEN1cnJlbnRseSBvbmx5IExpbnV4IG9uIHRoZSBpMzg2IHBsYXRmb3JtIGlzIHN1cHBvcnRlZAogICAgICB1c2luZyB0aGlzIG1ldGhvZC4gIFlvdSBtaWdodCBhbHNvIHJlcXVpcmUgYWRkaXRpb25hbCBSUE1TCiAgICAgICh3aGljaCBjYW4gYmUgZm91bmQgaW4gdGhlIGFib3ZlIG1lbnRpb25lZCBkaXJlY3RvcnkpIHRvIHVzZSB0aGUKICAgICAgc3VidmVyc2lvbiBSUE0gZGVwZW5kaW5nIG9uIHdoYXQgcGFja2FnZXMgeW91IGFscmVhZHkgaGF2ZSBpbnN0YWxsZWQ6CgogICAgICAgICAgc3VidmVyc2lvbiouaTM4Ni5ycG0KICAgICAgICAgIGFwYWNoZSouaTM4Ni5ycG0gKFZlcnNpb24gMi4wLjQ5IG9yIGdyZWF0ZXIpCiAgICAgICAgICBkYiouaTM4Ni5ycG0gICAgIChWZXJzaW9uIDQuMC4xNCBvciBncmVhdGVyOyB2ZXJzaW9uIDQuMy4yNyBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgNC4yLjUyIGlzIHByZWZlcnJlZCBob3dldmVyKQogICAgICAgICAgZXhwYXQgICAgICAgICAgICAoQ29tZXMgd2l0aCBSZWRIYXQpCiAgICAgICAgICBuZW9uICAgICAgICAgICAgIChWZXJzaW9uIDAuMjQuNykKCiAgICAgIEFmdGVyIGRvd25sb2FkaW5nLCBpbnN0YWxsIGl0IChhcyByb290IHVzZXIpOgoKICAgICAgICAgICMgcnBtIC1pdmggc3VidmVyc2lvbiouMzg2LnJwbSAoYWRkIG90aGVyIHBhY2thZ2VzIGFzIG5lY2Vzc2FyeSkKCiAgICAgIE5vdGU6IEZvciBhbiBlYXN5IHdheSB0byBnZW5lcmF0ZSBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBSUE0KICAgICAgc291cmNlIGFuZCBiaW5hcnkgcGFja2FnZSBmcm9tIHRoZSBsYXRlc3Qgc291cmNlIGNvZGUgeW91CiAgICAgIGp1c3QgY2hlY2tlZCBvdXQsIHNlZSB0aGUgcGFja2FnZXMvcnBtL1JFQURNRSBmaWxlIGZvciBhCiAgICAgIG9uZS1saW5lIGJ1aWxkIHByb2NlZHVyZS4KCgogIEIuICBCdWlsZGluZyB0aGUgTGF0ZXN0IFNvdXJjZSB1bmRlciBVbml4CiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgIFRoZXNlIGluc3RydWN0aW9ucyBhc3N1bWUgeW91IGhhdmUgYWxyZWFkeSBpbnN0YWxsZWQgU3VidmVyc2lvbgogICAgICBhbmQgY2hlY2tlZCBvdXQgYSB3b3JraW5nIGNvcHkgb2YgU3VidmVyc2lvbidzIG93biBjb2RlIC0tCiAgICAgIGVpdGhlciB0aGUgbGF0ZXN0IC90cnVuayBjb2RlLCBvciBzb21lIGJyYW5jaCBvciB0YWcuCgogICAgICBZb3UgY2FuIGRpc2NhcmQgdGhlIGRpcmVjdG9yeSBjcmVhdGVkIGJ5IHRoZSB0YXJiYWxsOyB5b3UncmUKICAgICAgYWJvdXQgdG8gYnVpbGQgdGhlIGxhdGVzdCwgZ3JlYXRlc3QgU3VidmVyc2lvbiBjbGllbnQuICBUaGlzIGlzCiAgICAgIHRoZSBwcm9jZWR1cmUgU3VidmVyc2lvbiBkZXZlbG9wZXJzIHVzZS4KCiAgICAgIEZpcnN0IG9mZiwgaWYgeW91IGhhdmUgYW55IFN1YnZlcnNpb24gbGlicmFyaWVzIGx5aW5nIGFyb3VuZAogICAgICBmcm9tIHByZXZpb3VzICdtYWtlIGluc3RhbGxzJywgY2xlYW4gdGhlbSB1cCBmaXJzdCEKCiAgICAgICAgICAjIHJtIC1mIC91c3IvbG9jYWwvbGliL2xpYnN2bioKICAgICAgICAgICMgcm0gLWYgL3Vzci9sb2NhbC9saWIvbGliYXByKgogICAgICAgICAgIyBybSAtZiAvdXNyL2xvY2FsL2xpYi9saWJleHBhdCoKICAgICAgICAgICMgcm0gLWYgL3Vzci9sb2NhbC9saWIvbGlibmVvbioKCiAgICAgIFN0YXJ0IHRoZSBwcm9jZXNzIGJ5IHJ1bm5pbmcgImF1dG9nZW4uc2giOgoKICAgICAgICAgICQgc2ggLi9hdXRvZ2VuLnNoCgogICAgICBUaGlzIHNjcmlwdCB3aWxsIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhbGwgdGhlIG5lY2Vzc2FyeSBjb21wb25lbnRzCiAgICAgIGF2YWlsYWJsZSB0byBidWlsZCBTdWJ2ZXJzaW9uLiAgSWYgYW55IGFyZSBtaXNzaW5nLCB5b3Ugd2lsbCBiZQogICAgICB0b2xkIHdoZXJlIHRvIGdldCB0aGVtIGZyb20uICAoU2VlIHRoZSAnQnVpbGQgUmVxdWlyZW1lbnRzJyBpbgogICAgICBzZWN0aW9uIEkuKQoKICAgICAgTm90ZTogaWYgdGhlIGNvbW1hbmQgImF1dG9jb25mIiBvbiB5b3VyIG1hY2hpbmUgZG9lcyBub3QgcnVuCiAgICAgIGF1dG9jb25mIDIuNTAgb3IgbGF0ZXIsIGJ1dCB5b3UgZG8gaGF2ZSBhIG5ldyBlbm91Z2ggYXV0b2NvbmYKICAgICAgYXZhaWxhYmxlLCB0aGVuIHlvdSBjYW4gc3BlY2lmeSB0aGUgY29ycmVjdCBvbmUgd2l0aCB0aGUKICAgICAgQVVUT0NPTkYgdmFyaWFibGUuICAoVGhlIEFVVE9IRUFERVIgdmFyaWFibGUgaXMgc2ltaWxhci4pICBUaGlzCiAgICAgIG1heSBiZSByZXF1aXJlZCBvbiBEZWJpYW4gR05VL0xpbnV4LCB3aGVyZSAiYXV0b2NvbmYiIGlzCiAgICAgIGFjdHVhbGx5IGEgUGVybCBzY3JpcHQgdGhhdCBhdHRlbXB0cyB0byBndWVzcyB3aGljaCB2ZXJzaW9uIGlzCiAgICAgIHJlcXVpcmVkIC0tIGJlY2F1c2Ugb2YgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gU3VidmVyc2lvbidzIGFuZAogICAgICBBUFIncyBjb25maWd1cmF0aW9uIHN5c3RlbXMsIHRoZSBQZXJsIHNjcmlwdCBtYXkgZ2V0IGl0IHdyb25nLgogICAgICBTbyBmb3IgZXhhbXBsZSwgeW91IG1pZ2h0IG5lZWQgdG8gZG86CgogICAgICAgICAgJCBBVVRPQ09ORj1hdXRvY29uZjIuNTAgc2ggLi9hdXRvZ2VuLnNoCgogICAgICBPbmNlIHlvdSd2ZSBwcmVwYXJlZCB0aGUgd29ya2luZyBjb3B5IGJ5IHJ1bm5pbmcgYXV0b2dlbi5zaCwKICAgICAganVzdCBmb2xsb3cgdGhlIHVzdWFsIGNvbmZpZ3VyYXRpb24gYW5kIGJ1aWxkIHByb2NlZHVyZToKCiAgICAgICAgICAkIC4vY29uZmlndXJlCiAgICAgICAgICAkIG1ha2UKICAgICAgICAgICMgbWFrZSBpbnN0YWxsCgogICAgICAoT3B0aW9uYWxseSwgeW91IG1pZ2h0IHdhbnQgdG8gcGFzcyAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgdG8KICAgICAgdGhlIC4vY29uZmlndXJlIHNjcmlwdC4gIFRoaXMgZW5hYmxlcyBkZWJ1Z2dpbmcgc3ltYm9scyBpbiB5b3VyCiAgICAgIGJpbmFyaWVzIChhbW9uZyBvdGhlciB0aGluZ3MpIGFuZCBtb3N0IFN1YnZlcnNpb24gZGV2ZWxvcGVycyB1c2UgaXQuKQoKICAgICAgVW5saWtlIHRoZSBwcmUtcGFja2FnZWQgdGFyYmFsbCAod2hpY2ggaW5jbHVkZXMgYXByLCBhcHItdXRpbCwKICAgICAgYW5kIG5lb24gc3ViZGlyZWN0b3JpZXMpLCAuL2NvbmZpZ3VyZSB3aWxsIGZhaWwgaWYgaXQgY2Fubm90CiAgICAgIGZpbmQgYXByLCBhcHItdXRpbCwgYW5kIG5lb24gbGlicmFyaWVzIGFscmVhZHkgaW5zdGFsbGVkIG9uIHlvdXIKICAgICAgc3lzdGVtLgoKICAgICAgU2luY2UgdGhlIHJlc3VsdGluZyBiaW5hcnkgZGVwZW5kcyBvbiBzaGFyZWQgbGlicmFyaWVzLCB0aGUKICAgICAgZGVzdGluYXRpb24gbGlicmFyeSBkaXJlY3RvcnkgbXVzdCBiZSBpZGVudGlmaWVkIGluIHlvdXIKICAgICAgb3BlcmF0aW5nIHN5c3RlbSdzIGxpYnJhcnkgc2VhcmNoIHBhdGguIFRoYXQgaXMgaW4gZWl0aGVyCiAgICAgIC9ldGMvbGQuc28uY29uZiBvciAkTERfTElCUkFSWV9QQVRIIGZvciBMaW51eCBzeXN0ZW1zIGFuZCBpbgogICAgICAvZXRjL3JjLmNvbmYgZm9yIEZyZWVCU0QsIGZvbGxvd2VkIGJ5IGEgcnVuIG9mIHRoZSAnbGRjb25maWcnCiAgICAgIHByb2dyYW0uIENoZWNrIHlvdXIgc3lzdGVtIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuIEJ5CiAgICAgIGlkZW50aWZ5aW5nIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIFN1YnZlcnNpb24gd2lsbCBiZSBhYmxlCiAgICAgIHRvIGR5bmFtaWNhbGx5IGxvYWQgcmVwb3NpdG9yeSBhY2Nlc3MgcGx1Z2lucy4gIElmIHlvdSB0cnkgdG8gZG8KICAgICAgYSBjaGVja291dCBhbmQgc2VlIGFuIGVycm9yIGxpa2U6CgogICAgICBzdWJ2ZXJzaW9uL2xpYnN2bl9yYS9yYV9sb2FkZXIuYzoyMDk6IChhcHJfZXJyPTE3MDAwMCkKICAgICAgc3ZuOiBVbnJlY29nbml6ZWQgVVJMIHNjaGVtZSAnaHR0cDovL3N2bi5jb2xsYWIubmV0L3JlcG9zL3N2bi90cnVuaycKCiAgICAgIEl0IHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIGR5bmFtaWMgbG9hZGVyL2xpbmtlciBjYW4ndCBmaW5kIGFsbAogICAgICBvZiB0aGUgbGlic3ZuXyogbGlicmFyaWVzLgoKICAgICAgTm90ZSB0aGF0IGlmIHlvdSBjb21tb25seSBidWlsZCB3aXRoIHRoZSAtak4gb3B0aW9uIHRvIG1ha2UsIHRoZQogICAgICBtYWtlIHN0ZXAgYWJvdmUgbWF5IGZhaWwsIGJlY2F1c2Ugd2UgZG9uJ3QgZW5zdXJlIHRoYXQgdGhpcmQKICAgICAgcGFydHkgbGlicmFyaWVzIGluIG91ciBzb3VyY2UgdHJlZSB3aWxsIGZpbmlzaCBidWlsZGluZyBiZWZvcmUKICAgICAgc3VidmVyc2lvbiBpdHNlbGYuICBJZiB5b3Ugd2FudCB0byB1c2UgLWpOLCB1c2UgdGhlIGZvbGxvd2luZwogICAgICBpbnN0ZWFkOgoKICAgICAgICAgICQgLi9jb25maWd1cmUKICAgICAgICAgICQgbWFrZSAtak4gZXh0ZXJuYWwtYWxsCiAgICAgICAgICAkIG1ha2UgLWpOIGxvY2FsLWFsbAogICAgICAgICAgJCBtYWtlIGNoZWNrCiAgICAgICAgICAjIG1ha2UgaW5zdGFsbAoKCiAgQy4gIEJ1aWxkaW5nIHVuZGVyIFVuaXggaW4gRGlmZmVyZW50IERpcmVjdG9yaWVzCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICBJdCBpcyBwb3NzaWJsZSB0byBjb25maWd1cmUgYW5kIGJ1aWxkIFN1YnZlcnNpb24gb24gVW5peCBpbiBhCiAgICAgIGRpcmVjdG9yeSBvdGhlciB0aGFuIHRoZSB3b3JraW5nIGNvcHkuIEZvciBleGFtcGxlCgogICAgICAgICAgJCBzdm4gY28gaHR0cDovL3N2bi5jb2xsYWIubmV0L3JlcG9zL3N2bi90cnVuayBzdm4KICAgICAgICAgICQgY2Qgc3ZuCiAgICAgICAgICAkICMgZ2V0IG5lb24vYXByIGFzIHJlcXVpcmVkCiAgICAgICAgICAkIGNobW9kICt4IGF1dG9nZW4uc2gKICAgICAgICAgICQgLi9hdXRvZ2VuLnNoCiAgICAgICAgICAkIG1rZGlyIC4uL29iagogICAgICAgICAgJCBjZCAuLi9vYmoKICAgICAgICAgICQgLi4vc3ZuL2NvbmZpZ3VyZSBbLi4ud2l0aCBvcHRpb25zIGFzIGFwcHJvcHJpYXRlLi4uXQogICAgICAgICAgJCBtYWtlCgogICAgICBwdXRzIHRoZSBTdWJ2ZXJzaW9uIHdvcmtpbmcgY29weSBpbiB0aGUgZGlyZWN0b3J5IHN2biBhbmQgYnVpbGRzCiAgICAgIGl0IGluIGEgc2VwYXJhdGUsIHBhcmFsbGVsIGRpcmVjdG9yeSBvYmouCgogICAgICBXaHkgd291bGQgeW91IHdhbnQgdG8gZG8gdGhpcz8gV2VsbCB0aGVyZSBhcmUgYSBudW1iZXIgb2YKICAgICAgcmVhc29ucy4uLgoKICAgICAgICAgICogIFlvdSBtYXkgcHJlZmVyIHRvIGF2b2lkICJwb2xsdXRpbmciIHRoZSB3b3JraW5nIGNvcHkgd2l0aAogICAgICAgICAgICAgZmlsZXMgZ2VuZXJhdGVkIGR1cmluZyB0aGUgYnVpbGQuCgogICAgICAgICAgKiAgWW91IG1heSB3YW50IHRvIHB1dCB0aGUgYnVpbGQgZGlyZWN0b3J5IGFuZCB0aGUgd29ya2luZwogICAgICAgICAgICAgY29weSBvbiBkaWZmZXJlbnQgcGh5c2ljYWwgZGlza3MgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KCiAgICAgICAgICAqICBZb3UgbWF5IHdhbnQgdG8gc2VwYXJhdGUgc291cmNlIGFuZCBvYmplY3QgY29kZSBhbmQgb25seQogICAgICAgICAgICAgYmFja3VwIHRoZSBzb3VyY2UuCgogICAgICAgICAgKiAgWW91IG1heSB3YW50IHRvIHJlbW90ZSBtb3VudCB0aGUgd29ya2luZyBjb3B5IG9uIG11bHRpcGxlCiAgICAgICAgICAgICBtYWNoaW5lcywgYW5kIGJ1aWxkIGZvciBkaWZmZXJlbnQgbWFjaGluZXMgZnJvbSB0aGUgc2FtZQogICAgICAgICAgICAgd29ya2luZyBjb3B5LgoKICAgICAgICAgICogIFlvdSBtYXkgd2FudCB0byBidWlsZCBtdWx0aXBsZSBjb25maWd1cmF0aW9ucyBmcm9tIHRoZQogICAgICAgICAgICAgc2FtZSB3b3JraW5nIGNvcHkuCgogICAgICBUaGUgbGFzdCByZWFzb24gYWJvdmUgaXMgcG9zc2libHkgdGhlIG1vc3QgdXNlZnVsLiAgRm9yIGluc3RhbmNlCiAgICAgIHlvdSBjYW4gaGF2ZSBzZXBhcmF0ZSBkZWJ1ZyBhbmQgb3B0aW1pemVkIGJ1aWxkcyBlYWNoIHVzaW5nIHRoZQogICAgICBzYW1lIHdvcmtpbmcgY29weS4gT3IgeW91IG1heSB3YW50IGEgY2xpZW50LW9ubHkgYnVpbGQgYW5kIGEKICAgICAgY2xpZW50LXNlcnZlciBidWlsZC4gVXNpbmcgbXVsdGlwbGUgYnVpbGQgZGlyZWN0b3JpZXMgeW91IGNhbgogICAgICByZWJ1aWxkIGFueSBvciBhbGwgY29uZmlndXJhdGlvbnMgYWZ0ZXIgYW4gZWRpdCB3aXRob3V0IHRoZSBuZWVkCiAgICAgIHRvIGVpdGhlciBjbGVhbiBhbmQgcmVjb25maWd1cmUsIG9yIGlkZW50aWZ5IGFuZCBjb3B5IGNoYW5nZXMKICAgICAgaW50byBhbm90aGVyIHdvcmtpbmcgY29weS4KCgogIEQuICBJbnN0YWxsaW5nIGZyb20gYSBaaXAgb3IgSW5zdGFsbGVyIEZpbGUgdW5kZXIgV2luZG93cwogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgT2YgYWxsIHRoZSB3YXlzIG9mIGdldHRpbmcgYSBTdWJ2ZXJzaW9uIGNsaWVudCwgdGhpcyBpcyB0aGUKICAgICAgZWFzaWVzdC4gIERvd25sb2FkIGEgWmlwICgqLnppcCkgb3Igc2VsZi1leHRyYWN0aW5nIGluc3RhbGxlcgogICAgICAoKi1zZXR1cC5leGUpIGZpbGUgZnJvbToKCiAgICAgIGh0dHA6Ly9zdWJ2ZXJzaW9uLnRpZ3Jpcy5vcmcvc2VydmxldHMvUHJvamVjdERvY3VtZW50TGlzdD9mb2xkZXJJRD05MQoKICAgICAgRm9yIGEgWmlwIGZpbGUsIHJ1biB5b3VyIHVuemlwcGluZyB1dGlsaXR5IChXaW5aSVAsIFppcEdlbml1cywKICAgICAgVWx0aW1hdGVaSVAsIEZyZWVaSVAsIHdoYXRldmVyKSBhbmQgZXh0cmFjdCB0aGUgRExMcyBhbmQgRVhFcyB0bwogICAgICBhIGRpcmVjdG9yeSBvZiB5b3VyIGNob2ljZS4gSW5jbHVkZWQgaW4gdGhlIGRvd25sb2FkIGlzIHRoZSBTVk4KICAgICAgY2xpZW50LCB0aGUgU1ZOQURNSU4gYWRtaW5pc3RyYXRpb24gdG9vbCwgYW5kIHRoZSBTVk5MT09LCiAgICAgIHJlcG9ydGluZyB0b29sLgoKICAgICAgVG8gdGVzdCB0aGUgaW5zdGFsbGF0aW9uLCBvcGVuIGEgRE9TIGJveCAocnVuIGVpdGhlciAiY21kIiBvcgogICAgICAiY29tbWFuZCIgZnJvbSB0aGUgU3RhcnQgbWVudSdzICJSdW4uLi4iIG1lbnUgb3B0aW9uKSwgY2hhbmdlIHRvCiAgICAgIHRoZSBkaXJlY3RvcnkgeW91IGluc3RhbGxlZCB0aGUgZXhlY3V0YWJsZXMgaW50bywgYW5kIHJ1bjoKCiAgICAgICAgICBDOlx0ZXN0PnN2biBjbyBodHRwOi8vc3ZuLmNvbGxhYi5uZXQvcmVwb3Mvc3ZuL3RydW5rIHN2bgoKICAgICAgVGhpcyB3aWxsIGdldCB0aGUgbGF0ZXN0IFN1YnZlcnNpb24gc291cmNlcyBhbmQgcHV0IHRoZW0gaW50byB0aGUKICAgICAgInN2biIgc3ViZGlyZWN0b3J5LgoKICAgICAgSWYgdXNpbmcgYSBzZWxmLWV4dHJhY3RpbmcgLmV4ZSBmaWxlLCBqdXN0IHJ1biBpdCBpbnN0ZWFkIG9mCiAgICAgIHVuemlwcGluZyBpdCwgdG8gaW5zdGFsbCBTdWJ2ZXJzaW9uLgoKCiAgRS4gIEJ1aWxkaW5nIHRoZSBMYXRlc3QgU291cmNlIHVuZGVyIFdpbmRvd3MKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICBFLjEgUHJlcmVxdWlzaXRlcwoKICAgICAgKiBWaXN1YWwgU3R1ZGlvIDYgYW5kIHNlcnZpY2UgcGFjay4gSXQgY2FuIGJlIGJ1aWx0IHdpdGggVmlzdWFsIFN0dWRpbwogICAgICAgIDcgKGFrYSBWaXN1YWwgU3R1ZGlvLk5FVCBha2EgVmlzdWFsIFN0dWRpby5ORVQgMjAwMikgYnV0IHRoZXNlCiAgICAgICAgaW5zdHJ1Y3Rpb25zIGFzc3VtZSBWUzYuCiAgICAgICogQSByZWNlbnQgV2luZG93cyBTREssIHRoZSBvbmUgcHJvdmlkZWQgd2l0aCBWaXN1YWwgU3R1ZGlvIDYgaXMKICAgICAgICB0b28gb2xkLiBZb3Ugb25seSBuZWVkIHRoZSAnQ29yZSBTREsnLiBZb3UgY2FuIGdldCBpdCBmcm9tIE1TRE4KICAgICAgICBpZiB5b3UgaGF2ZSBpdCBvciBmcm9tCiAgICAgICAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL21zZG93bmxvYWQvcGxhdGZvcm1zZGsvc2RrdXBkYXRlLyBpZiB5b3UKICAgICAgICBkb24ndC4KICAgICAgKiBQeXRob24gMi4yIG9yIGhpZ2hlciwgZG93bmxvYWRlZCBmcm9tIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8gd2hpY2ggaXMKICAgICAgICB1c2VkIHRvIGdlbmVyYXRlIHRoZSBwcm9qZWN0IGZpbGVzLgogICAgICAqIFBlcmwgNS44IG9yIGhpZ2hlciBmcm9tIGh0dHA6Ly93d3cuYWN0aXZlc3RhdGUuY29tLwogICAgICAqIEF3aywgZnJvbSBodHRwOi8vY20uYmVsbC1sYWJzLmNvbS9jbS9jcy93aG8vYndrL2F3azk1LmV4ZQogICAgICAgIFRoaXMgaXMgbmVlZGVkIHRvIGNvbXBpbGUgQXBhY2hlIG9yIEFQUi4gIE5vdGUgdGhhdCB0aGlzIGlzIHRoZQogICAgICAgIGFjdHVhbCBhd2sgcHJvZ3JhbSwgbm90IGFuIGluc3RhbGxlciAtIGp1c3QgcmVuYW1lIGl0IHRvIGF3ay5leGUKICAgICAgICBhbmQgaXQgaXMgcmVhZHkgdG8gdXNlLgogICAgICAqIE5lb24gMC4yNC43IG9yIGhpZ2hlciwgZG93bmxvYWRlZCBmcm9tCiAgICAgICAgaHR0cDovL3d3dy53ZWJkYXYub3JnL25lb24vbmVvbi0wLjI0LjcudGFyLmd6IHdoaWNoIGlzIHJlcXVpcmVkCiAgICAgICAgZm9yIGJ1aWxkaW5nIHRoZSBjbGllbnQgY29tcG9uZW50cy4gIE5lb24gaXMgaW5jbHVkZWQgaW4gdGhlIHppcCBmaWxlCiAgICAgICAgZGlzdHJpYnV0aW9uLgogICAgICAqIEJlcmtlbGV5IERCIGlzIHJlcXVpcmVkIGZvciBzdXBwb3J0IGZvciBsb2NhbCBzZXJ2ZXIgY29tcG9uZW50cywKICAgICAgICB2ZXJzaW9uIDQuMy4yNyBpcyBhdmFpbGFibGUgZnJvbQogICAgICAgIGh0dHA6Ly9zdWJ2ZXJzaW9uLnRpZ3Jpcy5vcmcvc2VydmxldHMvUHJvamVjdERvY3VtZW50TGlzdCBhcwogICAgICAgIGRiLTQuMy4yNy13aW4zMi56aXAuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBTZWN0aW9uIEkuNS4KICAgICAgKiBBcGFjaGUgMiBzb3VyY2UsIGRvd25sb2FkZWQgZnJvbQogICAgICAgIGh0dHA6Ly9odHRwZC5hcGFjaGUub3JnL2Rvd25sb2FkLmNnaSwgdGhlc2UgaW5zdHJ1Y3Rpb25zIGFzc3VtZQogICAgICAgIHZlcnNpb24gMi4wLjU0LiAgT25seSBuZWVkZWQgZm9yIGJ1aWxkaW5nIHRoZSBzZXJ2ZXIgZHNvIG1vZHVsZXMuCiAgICAgICogQXBhY2hlIDIgbXNpIGluc3RhbGwgZmlsZSwgYWxzbyBmcm9tCiAgICAgICAgaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG93bmxvYWQuY2dpIChyZXF1aXJlZCBmb3IgcnVubmluZyB0aGUKICAgICAgICB0ZXN0cykuICBPbmx5IG5lZWRlZCBmb3IgdGVzdGluZyB0aGUgc2VydmVyIGRzbyBtb2R1bGVzLgogICAgICAqIEFwYWNoZSBhcHIsIGFwci11dGlsLCBhbmQgYXByLWljb252IGxpYnJhcmllcywgdmVyc2lvbiAwLjkuNS4KICAgICAgICBJbmNsdWRlZCBpbiBib3RoIHRoZSBTdWJ2ZXJzaW9uIFpJUCBmaWxlIGFuZCB0aGUgQXBhY2hlIDIgc291cmNlCiAgICAgICAgdGFyYmFsbC4gIElmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSBhIFN1YnZlcnNpb24gY2hlY2tvdXQgYW5kIGhhdmUKICAgICAgICBub3QgZG93bmxvYWRlZCBBcGFjaGUgMiwgdGhlbiBnZXQgdGhlc2UgMyBsaWJyYXJpZXMgZnJvbQogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2Fwci8KICAgICAgKiBaTGliIDEuMiBvciBoaWdoZXIgc291cmNlcyBmcm9tIGh0dHA6Ly93d3cuemxpYi5vcmcvCiAgICAgICogT3BlbnNzbCAwLjkuN2Ygb3IgaGlnaGVyIG9idGFpbmVkIGZyb20KICAgICAgICBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9vcGVuc3NsLTAuOS43Zi50YXIuZ3oKICAgICAgKiBBIG1vZGlmaWVkIHZlcnNpb24gb2YgR05VIGxpYmludGwsIGNhbGxlZCBzdm4td2luMzItbGliaW50bC56aXAsCiAgICAgICAgZm9yIGRpc3BsYXlpbmcgbG9jYWxpemVkIG1lc3NhZ2VzLiBBdmFpbGFibGUgaW4KICAgICAgICBodHRwOi8vc3VidmVyc2lvbi50aWdyaXMub3JnL3NlcnZsZXRzL1Byb2plY3REb2N1bWVudExpc3Q/Zm9sZGVySUQ9MjYyNwogICAgICAqIEdOVSBnZXR0ZXh0IGZvciBnZW5lcmF0aW5nIG1lc3NhZ2UgY2F0YWxvZyAoLm1vKSBmaWxlcyBmcm9tCiAgICAgICAgbWVzc2FnZSB0cmFuc2xhdGlvbnMuIEdldCB0aGUgbGF0ZXN0IGJpbmFyaWVzIGZyb20KICAgICAgICBodHRwOi8vZ251d2luMzIuc291cmNlZm9yZ2UubmV0Ly4gWW91J2xsIG5lZWQgdGhlIGJpbmFyaWVzCiAgICAgICAgKGdldHRleHQtMC4xNC4xLWJpbi56aXApIGFuZCBkZXBlbmRlbmNpZXMgKGdldHRleHQtMC4xNC4xLWRlcC56aXApLgogICAgICAqIEVpdGhlciBhIFN1YnZlcnNpb24gY2xpZW50IGJpbmFyeSBmcm9tIGh0dHA6Ly9zdWJ2ZXJzaW9uLnRpZ3Jpcy5vcmcvIHRvCiAgICAgICAgZG8gdGhlIGluaXRpYWwgY2hlY2tvdXQgb2YgdGhlIFN1YnZlcnNpb24gc291cmNlIG9yIHRoZSB6aXAgZmlsZQogICAgICAgIHNvdXJjZSBkaXN0cmlidXRpb24uIFNlZSB0aGUgc2VjdGlvbiAiQm9vdHN0cmFwcGluZyBmcm9tIGEgWmlwIG9yCiAgICAgICAgSW5zdGFsbGVyIEZpbGUgdW5kZXIgV2luZG93cyIgYWJvdmUgZm9yIG1vcmUuCiAgICAgICogQSBtZWFucyBvZiB1bnBhY2tpbmcgdGhlIGZpbGVzLCBlLmcuLCBXaW5aSVAgb3Igc2ltaWxhci4KICAgICAgKiBbT3B0aW9uYWxdIEFuIGFzc2VtYmxlciwgZS5nLiwgTUFTTTMyIGZyb20gaHR0cDovL3d3dy5tYXMzMi5jb20vCiAgICAgICAgb3IgbmFzbSB3aGljaCBpcyBhdmFpbGFibGUgZnJvbQogICAgICAgIGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvZGV2ZWwvbmFzbS9iaW5hcmllcy93aW4zMi8KCiAgIEUuMiBOb3RlcwoKICAgICAgVGhlIE5lb24gbGlicmFyeSBzdXBwb3J0cyBzZWN1cmUgY29ubmVjdGlvbnMgd2l0aCBPcGVuU1NMIGFuZAogICAgICBvbi10aGUtd2lyZSBjb21wcmVzc2lvbiB3aXRoIHpsaWIuIElmIHlvdSB3YW50IHRvIHVzZSB0aG9zZQogICAgICBmZWF0dXJlcywgeW91IHNob3VsZCBwYXNzIHRoZSBvcHRpb25zICItLXdpdGgtemxpYiIgYW5kCiAgICAgICItLXdpdGgtb3BlbnNzbCIgdG8gdGhlIGdlbi1tYWtlLnB5IHNjcmlwdC4gU2VlIFNlY3Rpb24gSS4xMSBmb3IKICAgICAgbW9yZSBkZXRhaWxzLgoKICAgICAgVmVyc2lvbnMgb2YgTmVvbiB1cCB0byBhbmQgaW5jbHVkaW5nIDAuMjQuNyBmYWlsIHRvIGRlZmluZSB0aGUKICAgICAgSEFWRV9TRVRTT0NLT1BUIHN5bWJvbC4gTWFrZSBzdXJlIHRoYXQgdGhlIGZpbGUgY29uZmlnLmh3IGF0IHRoZQogICAgICByb290IG9mIHRoZSBOZW9uIHNvdXJjZXMgY29udGFpbnMgdGhlIGxpbmUKCiAgICAgICAgICAjZGVmaW5lIEhBVkVfU0VUU09DS09QVAoKICAgICAgSWYgeW91IGFyZSBpbnN0YWxsaW5nIHVuZGVyIFdpbjl4IG9yIE5UNCAoYW5kIGRvIG5vdCBoYXZlIEludGVybmV0CiAgICAgIEV4cGxvcmVyIDUgb3IgbGF0ZXIpIGFuZCBzdm4uZXhlIGRvZXNuJ3QgcnVuLCB0cnkgaW5zdGFsbGluZwogICAgICBzaGZvbGRlci5kbGwgZnJvbSBoZXJlICh3cmFwcGVkIHVybCk6CgogICAgICAgICAgaHR0cDovL2Rvd25sb2FkLm1pY3Jvc29mdC5jb20vZG93bmxvYWQvcGxhdGZvcm1zZGsvUmVkaXN0LwogICAgICAgICAgNS41MC40MDI3LjMwMC9XOVhOVDQvRU4tVVMvc2hmaW5zdC5FWEUKCiAgIEUuMyBQcmVwYXJhdGlvbgoKICAgICAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBob3cgdG8gdW5wYWNrIHRoZSBmaWxlcyB0byBtYWtlIGEgYnVpbGQgdHJlZS4KCiAgICAgICogTWFrZSBhIGRpcmVjdG9yeSBTVk4gYW5kIGNkIGludG8gaXQuCiAgICAgICogRWl0aGVyIGNoZWNrb3V0IFN1YnZlcnNpb246CgogICAgICAgICAgc3ZuIGNvIGh0dHA6Ly9zdm4uY29sbGFiLm5ldC9yZXBvcy9zdm4vdHJ1bmsvIHNyYy10cnVuawoKICAgICAgICBvciB1bnBhY2sgdGhlIHppcCBmaWxlIGRpc3RyaWJ1dGlvbiBhbmQgcmVuYW1lIHRoZSBkaXJlY3RvcnkgdG8KICAgICAgICBzcmMtdHJ1bmsuCgogICAgICAqIEluc3RhbGwgVmlzdWFsIFN0dWRpbyA2LiBZb3UgZWl0aGVyIGhhdmUgdG8gdGVsbCB0aGUgaW5zdGFsbGVyIHRvCiAgICAgICAgcmVnaXN0ZXIgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9yIHJ1biBWQ1ZBUlMzMi5CQVQgYmVmb3JlIGJ1aWxkaW5nCiAgICAgICAgYW55dGhpbmcuCiAgICAgICogSW5zdGFsbCBhIHJlY2VudCBXaW5kb3dzIENvcmUgU0RLCiAgICAgICogUmVnaXN0ZXIgdGhlIFNESyB3aXRoIFZpc3VhbCBTdHVkaW8gNi4gVGhpcyBpcyBhIHF1b3RlIGZyb20gdGhlCiAgICAgICAgTWljcm9zb2Z0IEZlYnJ1YXJ5IDIwMDMgU0RLIGRvY3VtZW50YXRpb246CgogICAgICAgIlRvIHJlZ2lzdGVyIHRoZSBTREsgYmluLCBpbmNsdWRlLCBhbmQgbGlicmFyeSBkaXJlY3RvcmllcyB3aXRoCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW+uIHZlcnNpb24gNi4wIGFuZCBWaXN1YWwgU3R1ZGlvIC5ORVQsCiAgICAgICAgY2xpY2sgU3RhcnQsIHBvaW50IHRvIEFsbCBQcm9ncmFtcywgcG9pbnQgdG8gTWljcm9zb2Z0IFBsYXRmb3JtCiAgICAgICAgU0RLIEZlYnJ1YXJ5IDIwMDMsIHBvaW50IHRvIFZpc3VhbCBTdHVkaW8gUmVnaXN0cmF0aW9uLCBhbmQgdGhlbgogICAgICAgIGNsaWNrIFJlZ2lzdGVyIFBTREsgRGlyZWN0b3JpZXMgd2l0aCBWaXN1YWwgU3R1ZGlvLiBUaGlzCiAgICAgICAgcmVnaXN0cmF0aW9uIHByb2Nlc3MgcGxhY2VzIHRoZSBTREsgYmluLCBpbmNsdWRlLCBhbmQgbGlicmFyeQogICAgICAgIGRpcmVjdG9yaWVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlYXJjaCBwYXRocywgd2hpY2ggZW5zdXJlcwogICAgICAgIHRoYXQgdGhlIGxhdGVzdCBoZWFkZXJzIGFuZCBsaWJyYXJpZXMgYXJlIHVzZWQgd2hlbiBidWlsZGluZwogICAgICAgIGFwcGxpY2F0aW9ucyBpbiB0aGUgSURFLiBOb3RlIHRoYXQgZm9yIFZpc3VhbCBTdHVkaW8gNi4wCiAgICAgICAgaW50ZWdyYXRpb24gdG8gc3VjY2VlZCwgVmlzdWFsIFN0dWRpbyA2LjAgbXVzdCBydW4gYXQgbGVhc3Qgb25jZQogICAgICAgIGJlZm9yZSB5b3Ugc2VsZWN0IFJlZ2lzdGVyIFBTREsgRGlyZWN0b3JpZXMgd2l0aCBWaXN1YWwKICAgICAgICBTdHVkaW8uIEFsc28gbm90ZSB0aGF0IHdoZW4gdGhpcyBvcHRpb24gaXMgcnVuLCB0aGUgSURFcyBzaG91bGQKICAgICAgICBub3QgYmUgcnVubmluZy4iCgogICAgICAqIEluc3RhbGwgUHl0aG9uIGFuZCBhZGQgaXQgdG8geW91ciBwYXRoCiAgICAgICogSW5zdGFsbCBQZXJsIChpdCBzaG91bGQgYWRkIGl0c2VsZiB0byB0aGUgcGF0aCkKICAgICAgKiBDb3B5IEFXSyAoYXdrOTUuZXhlKSB0byBhd2suZXhlIChlLmcuIFNWTlxhd2tcYXdrLmV4ZSkgYW5kIGFkZAogICAgICAgIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBpdCAoZS5nLiBTVk5cYXdrKSB0byB0aGUgcGF0aC4KICAgICAgKiBJbnN0YWxsIEFwYWNoZSAyIHVzaW5nIHRoZSBtc2kgZmlsZSBpZiB5b3UgYXJlIGdvaW5nIHRvIHRlc3QgdGhlCiAgICAgICAgc2VydmVyIGRzbyBtb2R1bGVzLgogICAgICAqIElmIHlvdSBjaGVja2VkIG91dCBTdWJ2ZXJzaW9uIGZyb20gdGhlIHJlcG9zaXRvcnkgdGhlbiBleHRyYWN0IG5lb24KICAgICAgICBpbnRvIFNWTlxzcmMtdHJ1bmtcbmVvbiwgdGhlIHppcCBmaWxlIHNvdXJjZSBkaXN0cmlidXRpb24gaW5jbHVkZXMKICAgICAgICBuZW9uLgogICAgICAqIEV4dHJhY3QgdGhlIEJlcmtlbGV5IERCIGZpbGVzIGludG8gU1ZOXHNyYy10cnVua1xkYjQtd2luMzIuIEl0J3MgYQogICAgICAgIGdvb2QgaWRlYSB0byBhZGQgU1ZOXHNyYy10cnVua1xkYjQtd2luMzJcYmluIHRvIHlvdXIgUEFUSCwgc28gdGhhdAogICAgICAgIFN1YnZlcnNpb24gY2FuIGZpbmQgdGhlIEJlcmtlbGV5IERCIERMTHMuCgogICAgICAgIFtOT1RFOiBUaGlzIGJpbmFyeSBwYWNrYWdlIG9mIEJlcmtlbGV5IERCIGlzIHByb3ZpZGVkIGZvcgogICAgICAgICAgICBjb252ZW5pZW5jZSBvbmx5LiBQbGVhc2UgZG9uJ3QgYWRkcmVzcyBxdWVzdGlvbnMgYWJvdXQKICAgICAgICAgICAgQmVya2VsZXkgREIgdGhhdCBhcmVuJ3QgZGlyZWN0bHkgcmVsYXRlZCB0byB1c2luZyBTdWJ2ZXJzaW9uCiAgICAgICAgICAgIHRvIHRoZSBwcm9qZWN0IG1haWxpbmcgbGlzdC5dCgogICAgICAgIElmIHlvdSBidWlsZCBCZXJrZWxleSBEQiBmcm9tIHRoZSBzb3VyY2UsIHlvdSB3aWxsIGhhdmUgdG8gY29weQogICAgICAgIHRoZSBmaWxlIGRiLTQuMy4yN1xidWlsZF93aW4zMlxkYi5oIHRvCiAgICAgICAgU1ZOXHNyYy10cnVua1xkYjQtd2luMzJcaW5jbHVkZSwgYW5kIGFsbCB0aGUgaW1wb3J0IGxpYnJhcmllcyB0bwogICAgICAgIFNWTlxzcmMtdHJ1bmtcZGI0LXdpbjMyXGxpYi4gQWdhaW4sIHRoZSBETExzIHNob3VsZCBiZSBzb21ld2hlcmUgaW4KICAgICAgICB5b3VyIHBhdGguCgogICAgICAqIEV4dHJhY3QgQXBhY2hlIHNvdXJjZSBpbnRvIFNWTlxodHRwLTIuMC41NCBpZiB5b3Ugd2lzaCB0byBidWlsZCB0aGUKICAgICAgICBzZXJ2ZXIgZHNvIG1vZHVsZXMuCiAgICAgICogSWYgeW91IGFyZSBidWlsZGluZyBmcm9tIGEgY2hlY2tvdXQgb2YgU3VidmVyc2lvbiwgYW5kIHlvdSBhcmUgTk9UCiAgICAgICAgYnVpbGRpbmcgQXBhY2hlLCB0aGVuIHlvdSB3aWxsIG5lZWQgdGhlIEFQUiBsaWJyYXJpZXMuICBEZXBlbmRpbmcKICAgICAgICBvbiBob3cgeW91IGdvdCB5b3VyIHZlcnNpb24gb2YgQVBSLCBlaXRoZXI6CiAgICAgICAgICAtIEV4dHJhY3QgdGhlIEFQUiwgQVBSLXV0aWwgYW5kIEFQUi1pY29udiBzb3VyY2UgZGlzdHJpYnV0aW9ucyBpbnRvCiAgICAgICAgICAgIFNWTlxhcHIsIFNWTlxhcHItdXRpbCwgYW5kIFNWTlxhcHItaWNvbnYgcmVzcGVjdGl2ZWx5LgogICAgICAgIE9yOgogICAgICAgICAgLSBFeHRyYWN0IHRoZSBhcHIsIGFwci11dGlsIGFuZCBhcHItaWNvbnYgZGlyZWN0b3JpZXMgZnJvbSB0aGUKICAgICAgICAgICAgc3JjbGliIGZvbGRlciBpbiB0aGUgQXBhY2hlIGh0dHBkIHNvdXJjZSBpbnRvIFNWTlxhcHIsCiAgICAgICAgICAgIFNWTlxhcHItdXRpbCwgYW5kIFNWTlxhcHItaWNvbnYgcmVzcGVjdGl2ZWx5LgogICAgICAqIEV4dHJhY3QgdGhlIFpMaWIgc291cmNlcyBpbnRvIFNWTlx6bGliLgogICAgICAqIEV4dHJhY3Qgb3BlbnNzbCBpbnRvIFNWTlxvcGVuc3NsLTAuOS43ZgogICAgICAqIEV4dHJhY3Qgc3ZuLXdpbjMyLWxpYmludGwuemlwIGludG8gU1ZOXHN2bi13aW4zMi1saWJpbnRsLgogICAgICAgIEFkZCBTVk5cc3ZuLXdpbjMyLWxpYmludGxcaW5jIHRvIHlvdXIgSU5DTFVERSBwYXRoIGFuZAogICAgICAgIFNWTlxzdm4td2luMzItbGliaW50bFxsaWIgdG8geW91ciBMSUIgcGF0aCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCiAgICAgICAgWW91IGNhbiBhZGQgdGhlc2Ugb24gdGhlIGNvbW1hbmQgbGluZSBhcyBzaG93biBiZWxvdy4KICAgICAgKiBFeHRyYWN0IGdldHRleHQtMC4xNC4xLWJpbi56aXAgYW5kIGdldHRleHQtMC4xNC4xLWRlcC56aXAgaW50bwogICAgICAgIFNWTlxnZXR0ZXh0LTAuMTQuMS1iaW4uIEFkZCBTVk5cZ2V0dGV4dC0wLjE0LjEtYmluXGJpbiB0byB5b3VyIHBhdGguCiAgICAgICogW09wdGlvbmFsXSBFeHRyYWN0IE1BU00zMiAob25seSB0aGUgTUwuRVhFIGFuZCBNTC5FUlIgZmlsZXMpIGludG8KICAgICAgICBTVk5cYXNtIChvciBleHRyYWN0IG5hc20gaW50byBTVk5cYXNtKSBhbmQgcHV0IGl0IGluIHlvdXIgcGF0aC4KCiAgIEUuNCBCdWlsZGluZyB0aGUgQmluYXJpZXMKCiAgICBUbyBidWlsZCB0aGUgYmluYXJpZXMgZWl0aGVyIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGhlcmUgb3IgdXNlCiAgICBidWlsZFx3aW4zMlx2YzYtYnVpbGQuYmF0LmluIGFmdGVyIGVkaXRpbmcgaXQncyBkZWZhdWx0IHBhdGhzIHRvIG1hdGNoCiAgICB5b3VycyBhbmQgc2F2aW5nIGl0IGFzIHZjNi1idWlsZC5iYXQuICBUaGUgdmM2LWJ1aWxkLmJhdCBkb2VzIGEgZnVsbCBidWlsZAogICAgc28gaXQgcmVxdWlyZXMgQXBhY2hlIDIgc291cmNlIGFuZCBpZiB0aGUgdGVzdHMgYXJlIHRvIGJlIHJ1biB0aGUKICAgIEFwYWNoZSAyIGluc3RhbGwuCgogICAgU3RhcnQgaW4gdGhlIFNWTiBkaXJlY3RvcnkgeW91IGNyZWF0ZWQuCgogICAgU2V0IHVwIHRoZSBlbnZpcm9ubWVudCAoY29tbWFuZHMgc2hvdWxkIGJlIG9uZSBsaW5lIGV2ZW4gaWYgd3JhcHBlZCBoZXJlKS4KCiAgICBDOj5zZXQgVkVSPXRydW5rCiAgICBDOj5zZXQgRElSPXRydW5rCiAgICBDOj5zZXQgRFJJVkU9QwogICAgQzo+c2V0IFBZVEhPTkRJUj1DOlxQeXRob24yMgogICAgQzo+c2V0IEFXS0RJUj1DOlxTVk5cQXdrCiAgICBDOj5zZXQgQVNNRElSPUM6XFNWTlxhc20KICAgIEM6PnNldCBTREtJTkM9QzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU0RLXGluY2x1ZGUKICAgIEM6PnNldCBTREtMSUI9QzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU0RLXGxpYgogICAgQzo+c2V0IExJQklOVExJTkM9QzpcU1ZOXHN2bi13aW4zMi1saWJpbnRsXGluYwogICAgQzo+c2V0IExJQklOVExMSUI9QzpcU1ZOXHN2bi13aW4zMi1saWJpbnRsXGxpYgogICAgQzo+c2V0IEdFVFRFWFRCSU49QzpcU1ZOXGdldHRleHQtMC4xNC4xLWJpblxiaW4KICAgIEM6PlBBVEg9JVBBVEglOyVEUklWRSU6XFNWTlxzcmMtJURJUiVcZGI0LXdpbjMyOyVBU01ESVIlOwogICAgICAgICAgICAlUFlUSE9ORElSJTslQVdLRElSJTslR0VUVEVYVEJJTiUKICAgIEM6PnNldCBJTkNMVURFPSVTREtJTkMlOyVJTkNMVURFJTslTElCSU5UTElOQyUKICAgIEM6PnNldCBMSUI9JVNES0xJQiU7JUxJQiU7JUxJQklOVExMSUIlCgogICAgT3BlblNTTAoKICAgIEM6PmNkIG9wZW5zc2wtMC45LjdmCiAgICBDOj5wZXJsIENvbmZpZ3VyZSBWQy1XSU4zMgpbKl0gQzo+Y2FsbCBtc1xkb19tYXNtCiAgICBDOj5ubWFrZSAtZiBtc1xudGRsbC5tYWsKICAgIEM6PmNkIG91dDMyZGxsCiAgICBDOj5jYWxsIC4uXG1zXHRlc3QKICAgIEM6PmNkIC4uXC4uCgogICAgKk5vdGU6IFVzZSAiY2FsbCBtc1xkb19uYXNtIiBvZiB5b3UgaGF2ZSBuYXNtIGluc3RlYWQgb2YgTUFTTSwgb3IKICAgICAgICAgICAiY2FsbCBtc1xkb19tcyIgaWYgeW91IGRvbid0IGhhdmUgYW4gYXNzZW1ibGVyLgoKICAgIEFwYWNoZSAyCgogICAgVGhpcyBzdGVwIGlzIG9ubHkgcmVxdWlyZWQgZm9yIGJ1aWxkaW5nIHRoZSBzZXJ2ZXIgZHNvIG1vZHVsZXMuCgogICAgVGhlIFN1YnZlcnNpb24gZ2VuLW1ha2UucHkgc2NyaXB0IG11c3QgYmUgcnVuIGJlZm9yZSBidWlsZGluZyBBcGFjaGUgb3IKICAgIEFwYWNoZSBhbmQgU3VidmVyc2lvbiB3aWxsIGJlIHJ1bm5pbmcgaW5jb21wYXRpYmxlIHZlcnNpb25zIG9mIGFwci4KCiAgICBDOj5jZCBzcmMtJURJUiUKICAgIEM6PnB5dGhvbiBnZW4tbWFrZS5weSAtdCBkc3AgLS13aXRoLWh0dHBkPS4uXGh0dHBkLTIuMC41NAogICAgICAgLS13aXRoLWJlcmtlbGV5LWRiPWRiNC13aW4zMiAtLXdpdGgtb3BlbnNzbD0uLlxvcGVuc3NsLTAuOS43ZgogICAgICAgLS13aXRoLXpsaWI9Li5cemxpYiAtLWVuYWJsZS1ubHMgLS1lbmFibGUtYmRiLWluLWFwci11dGlsCiAgICBDOj5jZCAuLgogICAgQzo+c2V0IEFQQUNIRURJUj1DOlxQcm9ncmFtIEZpbGVzXEFwYWNoZSBHcm91cFxBcGFjaGUyCiAgICBDOj5tc2RldiBodHRwZC0yLjAuNTRcYXBhY2hlLmRzdyAvTUFLRSAiQnVpbGRCaW4gLSBXaW4zMiBSZWxlYXNlIgoKICAgIFN1YnZlcnNpb24KCiAgICBUaGluZ3MgdG8gbm90ZToKCiAgICAgICogSWYgeW91IGRvbid0IHdhbnQgdG8gYnVpbGQgbW9kX2Rhdl9zdm4sIG9taXQgdGhlIC0td2l0aC1odHRwZAogICAgICAgIG9wdGlvbi4gIFRoZSB6aXAgZmlsZSBzb3VyY2UgZGlzdHJpYnV0aW9uIGNvbnRhaW5zIGFwciwgYXByLXV0aWwgYW5kCiAgICAgICAgYXByLWljb252IGluIHRoZSBkZWZhdWx0IGJ1aWxkIGxvY2F0aW9uLiBJZiB5b3UgaGF2ZSBkb3dubG9hZGVkIHRoZQogICAgICAgIGFwciBmaWxlcyB5b3Vyc2VsZiB5b3Ugd2lsbCBoYXZlIHRvIHRlbGwgdGhlIGdlbmVyYXRvciB3aGVyZSB0byBmaW5kCiAgICAgICAgdGhlIEFQUiBsaWJyYXJpZXM7IHRoZSBvcHRpb25zIGFyZSAtLXdpdGgtYXByLCAtLXdpdGgtYXByLXV0aWwgYW5kCiAgICAgICAgLS13aXRoLWFwci1pY29udi4KICAgICAgKiBZb3UgY2FuIHNraXAgc2V0dGluZyB0aGUgTElCSU5UTElOQyBhbmQgTElCSU5UTExJQiB2YXJpYWJsZXMsIGFuZAogICAgICAgIGFkZCAiLS13aXRoLWxpYmludGw9Li5cc3ZuLXdpbjMyLWxpYmludGwiIHRvIHRoZSBnZW4tbWFrZS5weSBjb21tYW5kCiAgICAgICAgbGluZSBpbnN0ZWFkLgogICAgICAqIElmIHlvdSB3b3VsZCBsaWtlIGEgZGVidWcgYnVpbGQgc3Vic3RpdHV0ZSBEZWJ1ZyBmb3IgUmVsZWFzZSBpbgogICAgICAgIHRoZSBtc2RldiBjb21tYW5kcy4KICAgICAgKiBUaGVyZSBoYXZlIGJlZW4gcnVtb3JzIHRoYXQgU3VidmVyc2lvbiBvbiBXaW4zMiBjYW4gYmUgYnVpbHQKICAgICAgICB1c2luZyB0aGUgbGF0ZXN0IGN5Z3dpbiwgeW91IHByb2JhYmx5IGRvbid0IHdhbnQgdGhlIHppcCBmaWxlIHNvdXJjZQogICAgICAgIGRpc3RyaWJ1dGlvbiB0aG91Z2guIHltbXYuCiAgICAgICogVGhlIC9VU0VFTlYgc3dpdGNoIHRvIG1zZGV2IG1ha2VzIGl0IHRha2Ugbm90aWNlIG9mIHRoZSBJTkNMVURFIGFuZAogICAgICAgIExJQiBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIGl0IGFsc28gbWFrZXMgaXQgaWdub3JlIGl0J3Mgb3duIGxpYiBhbmQKICAgICAgICBpbmNsdWRlIHNldHRpbmdzIHNvIHlvdSBuZWVkIHRvIGhhdmUgdGhlIFdpbmRvd3MgU0RLIGxpYiBhbmQgaW5jbHVkZQogICAgICAgIGRpcmVjdG9yaWVzIGluIHRoZSBMSUIgYW5kIElOQ0xVREUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgRG8gKm5vdCoKICAgICAgICB1c2UgdGhpcyBzd2l0Y2ggd2hlbiBzdGFydGluZyB1cCB0aGUgbXNkZXYgVmlzdWFsIGVudmlyb25tZW50LiAgSWYgeW91CiAgICAgICAgd2lzaCB0byBidWlsZCBpbiB0aGUgVmlzdWFsIGVudmlyb25tZW50IHRoZSBTREsgbGliIGFuZCBpbmNsdWRlCiAgICAgICAgZGlyZWN0b3JpZXMgbXVzdCBiZSBpbiB0aGUgVG9vbHMvT3B0aW9ucy9EaXJlY3RvcmllcyBzZXR0aW5ncyAoaWYgeW91CiAgICAgICAgZm9sbG93ZWQgdGhlICdSZWdpc3RlciB0aGUgU0RLIHdpdGggVmlzdWFsIFN0dWRpbyA2JyBpbnN0cnVjdGlvbnMKICAgICAgICBhYm92ZSB0aGlzIGhhcyBiZWVuIGRvbmUgZm9yIHlvdSkuCiAgICAgICogSWYgeW91IGFyZSB1c2luZyBWaXN1YWwgU3R1ZGlvIC5ORVQgY2hhbmdlIC10IGRzdyBpbnRvIC10IHZjcHJvaiBvbgogICAgICAgIHRoZSBnZW4tbWFrZS5weSBjb21tYW5kLiAgSW4gdGhpcyBjYXNlIHlvdSB3aWxsIGFsc28gaGF2ZSB0bwogICAgICAgIGRpc3RyaWJ1dGUgdGhlIEMgcnVudGltZSBkbGwgd2l0aCB0aGUgYmluYXJpZXMuCiAgICAgICogSWYgdGhlIHNlcnZlciBkc28gbW9kdWxlcyBhcmUgYmVpbmcgYnVpbHQgYW5kIHRlc3RlZCBBcGFjaGUgbXVzdCBub3QKICAgICAgICBiZSBydW5uaW5nIG9yIHRoZSBjb3B5IG9mIHRoZSBkc28gbW9kdWxlcyB3aWxsIGZhaWwuCgogICAgQzo+Y2Qgc3JjLSVESVIlCgogICAgSWYgQXBhY2hlIDIgaGFzIGJlZW4gYnVpbHQgYW5kIHRoZSBzZXJ2ZXIgbW9kdWxlcyBhcmUgcmVxdWlyZWQgdGhlbgogICAgZ2VuLW1ha2UucHkgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBydW4uIElmIHRoZSBzb3VyY2UgaXMgZnJvbSB0aGUgemlwCiAgICBmaWxlLCBBcGFjaGUgMiBoYXMgbm90IGJlZW4gYnVpbHQgc28gZ2VuLW1ha2UucHkgbXVzdCBiZSBydW46CgogICAgQzo+cHl0aG9uIGdlbi1tYWtlLnB5IC10IGRzcCAtLXdpdGgtYmVya2VsZXktZGI9ZGI0LXdpbjMyCiAgICAgICAgLS13aXRoLW9wZW5zc2w9Li5cb3BlbnNzbC0wLjkuN2YgLS13aXRoLXpsaWI9Li5cemxpYgogICAgICAgIC0tZW5hYmxlLWJkYi1pbi1hcHItdXRpbCAtLXdpdGgtbGliaW50bD0uLlxzdm4td2luMzItbGliaW50bAoKICAgIFRoZW4gYnVpbGQgc3VidmVyc2lvbjoKCiAgICBDOj5tc2RldiBzdWJ2ZXJzaW9uX21zdmMuZHN3IC9VU0VFTlYgL01BS0UgIl9fQUxMX1RFU1RTX18gLSBXaW4zMiBSZWxlYXNlIgogICAgQzo+Y2QgLi4KCiAgICBPciwgd2l0aCBWaXN1YWwgQysrLk5FVDoKCiAgICBDOj5kZXZlbnYgc3VidmVyc2lvbl92Y25ldC5zbG4gL1VTRUVOViAvYnVpbGQgIkRlYnVnIgogICAgICAgIC9wcm9qZWN0ICJfX0FMTF9URVNUU19fIgogICAgQzo+Y2QgLi4KCiAgICBUaGUgYmluYXJpZXMgaGF2ZSBub3cgYmVlbiBidWlsdC4KCiAgIEUuNSBQYWNrYWdpbmcgdGhlIGJpbmFyaWVzCgogICAgWW91IG5vdyBuZWVkIHRvIGNvcHkgdGhlIGJpbmFyaWVzIHJlYWR5IHRvIG1ha2UgdGhlIHJlbGVhc2UgemlwCiAgICBmaWxlLiBZb3UgYWxzbyBuZWVkIHRvIGRvIHRoaXMgdG8gcnVuIHRoZSB0ZXN0cyBhcyB0aGUgbmV3IGJpbmFyaWVzCiAgICBuZWVkIHRvIGJlIGluIHlvdXIgcGF0aC4gWW91IGNhbiB1c2UgdGhlIGJ1aWxkL3dpbjMyL21ha2VfZGlzdC5weQogICAgc2NyaXB0IGluIHRoZSBTdWJ2ZXJzaW9uIHNvdXJjZSBkaXJlY3RvcnkgdG8gZG8gdGhhdC4KCiAgICBbVEJEOiBEZXNjcmliZSBob3cgdG8gZG8gdGhpcy4gTm90ZSBkZXBlbmRlbmNpZXMgb24gemlwLCBqYXIsIGRveHlnZW4uXQoKCiAgIEUuNiBUZXN0aW5nIHRoZSBCaW5hcmllcwogICAgW1RCRDogSXQncyBiZWVuIGEgbG9uZywgbG9uZyB3aGlsZSBzaW5jZSBpdCB3YXMgbmVjZXNzYXJ5IHRvIG1vdmUKICAgICAgICAgIGJpbmFyaWVzIGFyb3VuZCBmb3IgdGVzdGluZy4gd2luLXRlc3RzLnB5IGRvZXMgdGhhdCBhdXRvbWFnaWNhbGx5LgogICAgICAgICAgRml4IHRoaXMgc2VjdGlvbiBhY2NvcmRpbmdseSwgYW5kIHByb2JhYmx5IHJlb3JkZXIsIHB1dHRpbmcKICAgICAgICAgIHRoZSBwYWNrYWdpbmcgYXQgdGhlIGVuZC5dCgogICAgVGhlIGJ1aWxkIHByb2Nlc3MgY3JlYXRlcyB0aGUgYmluYXJ5IHRlc3QgcHJvZ3JhbXMgYnV0IGl0IGRvZXMgbm90CiAgICBjb3B5IHRoZSBjbGllbnQgdGVzdHMgaW50byB0aGUgcmVsZWFzZSB0ZXN0IGFyZWEuCgogICAgQzo+Y2Qgc3JjLSVESVIlCiAgICBDOj5ta2RpciBSZWxlYXNlXHN1YnZlcnNpb25cdGVzdHNcY2xpZW50cwogICAgQzo+eGNvcHkgL1MgL1kgc3VidmVyc2lvblx0ZXN0c1xjbGllbnRzIFJlbGVhc2Vcc3VidmVyc2lvblx0ZXN0c1xjbGllbnRzCgogICAgSWYgdGhlIHNlcnZlciBkc28gbW9kdWxlcyAgaGF2ZSBiZWVuIGJ1aWx0IHRoZW4gY29weSB0aGUgZHNvIGZpbGVzIGFuZAogICAgZGxscyBpbnRvIHRoZSBBcGFjaGUgbW9kdWxlcyBkaXJlY3RvcnkuCgogICAgQzo+Y29weSBSZWxlYXNlXHN1YnZlcnNpb25cbW9kX2Rhdl9zdm5cbW9kX2Rhdl9zdm4uc28gIiVBUEFDSEVESVIlIlxtb2R1bGVzCiAgICBDOj5jb3B5IFJlbGVhc2Vcc3VidmVyc2lvblxtb2RfYXV0aHpfc3ZuXG1vZF9hdXRoel9zdm4uc28KICAgICAgICIlQVBBQ0hFRElSJSJcbW9kdWxlcwogICAgQzo+Y29weSBzdm4td2luMzItJVZFUiVcYmluXGludGwuZGxsICIlQVBBQ0hFRElSJVxiaW4iCiAgICBDOj5jb3B5IHN2bi13aW4zMi0lVkVSJVxiaW5caWNvbnYuZGxsICIlQVBBQ0hFRElSJVxiaW4iCiAgICBDOj5jb3B5IHN2bi13aW4zMi0lVkVSJVxiaW5cbGliZGI0Mi5kbGwgIiVBUEFDSEVESVIlXGJpbiIKICAgIEM6PmNkIC4uCgogICAgUHV0IHRoZSBzdm4td2luMzItdHJ1bmtcYmluIGRpcmVjdG9yeSBhdCB0aGUgc3RhcnQgb2YgeW91ciBwYXRoIHNvCiAgICB5b3UgcnVuIHRoZSBuZXdseSBidWlsdCBiaW5hcmllcyBhbmQgbm90IGFub3RoZXIgdmVyc2lvbiB5b3UgbWlnaHQKICAgIGhhdmUgaW5zdGFsbGVkLgoKICAgIFRoZW4gcnVuIHRoZSBjbGllbnQgdGVzdHM6CgogICAgQzo+UEFUSD0lRFJJVkUlOlxTVk5cc3ZuLXdpbjMyLSVWRVIlXGJpbjslUEFUSCUKICAgIEM6PmNkIHNyYy0lRElSJQogICAgQzo+cHl0aG9uIHdpbi10ZXN0cy5weSAtYyAtciAtdgoKICAgIElmIHRoZSBzZXJ2ZXIgZHNvIG1vZHVsZXMgd2VyZSBidWlsdCBjb25maWd1cmUgQXBhY2hlIHRvIHVzZSB0aGUKICAgIG1vZF9kYXZfc3ZuIGFuZCBtb2RfYXV0aHpfc3ZuIG1vZHVsZXMgYnkgbWFraW5nIHN1cmUgdGhlc2UgbGluZXMgYXBwZWFyCiAgICB1bmNvbW1lbnRlZCBpbiBodHRwZC5jb25mOgoKICAgICAgTG9hZE1vZHVsZSBkYXZfbW9kdWxlICAgICAgICAgbW9kdWxlcy9tb2RfZGF2LnNvCiAgICAgIExvYWRNb2R1bGUgZGF2X2ZzX21vZHVsZSAgICAgIG1vZHVsZXMvbW9kX2Rhdl9mcy5zbwogICAgICBMb2FkTW9kdWxlIGRhdl9zdm5fbW9kdWxlICAgICBtb2R1bGVzL21vZF9kYXZfc3ZuLnNvCiAgICAgIExvYWRNb2R1bGUgYXV0aHpfc3ZuX21vZHVsZSAgIG1vZHVsZXMvbW9kX2F1dGh6X3N2bi5zbwoKICAgIEFuZCBmdXJ0aGVyIGRvd24gdGhlIGZpbGUgYWRkIGxvY2F0aW9uIGRpcmVjdGl2ZXMgdG8gcG9pbnQgdG8gdGhlCiAgICB0ZXN0IHJlcG9zaXRvcmllcy4gQ2hhbmdlIHRoZSBwYXRocyB0byB0aGUgU1ZOIGRpcmVjdG9yeSB5b3UgY3JlYXRlZAogICAgKHBhdGhzIHNob3VsZCBiZSBvbiBvbmUgbGluZSBldmVuIGlmIHdyYXBwZWQgaGVyZSk6CgogICAgICA8TG9jYXRpb24gL3N2bi10ZXN0LXdvcmsvcmVwb3NpdG9yaWVzPgogICAgICAgREFWIHN2bgogICAgICAgU1ZOUGFyZW50UGF0aCBDOi9TVk4vc3JjLXRydW5rL1JlbGVhc2Uvc3VidmVyc2lvbi90ZXN0cy9jbGllbnRzL2NtZGxpbmUvCiAgICAgICAgICAgICAgICAgICAgIHN2bi10ZXN0LXdvcmsvcmVwb3NpdG9yaWVzCiAgICAgIDwvTG9jYXRpb24+CgogICAgICA8TG9jYXRpb24gL3N2bi10ZXN0LXdvcmsvbG9jYWxfdG1wL3JlcG9zPgogICAgICAgREFWIHN2bgogICAgICAgU1ZOUGF0aCBjOi9TVk4vc3JjLXRydW5rL1JlbGVhc2Uvc3VidmVyc2lvbi90ZXN0cy9jbGllbnRzL2NtZGxpbmUvCiAgICAgICAgICAgICAgIHN2bi10ZXN0LXdvcmsvbG9jYWxfdG1wL3JlcG9zCiAgICAgIDwvTG9jYXRpb24+CgogICAgVGhlbiByZXN0YXJ0IEFwYWNoZSBhbmQgcnVuIHRoZSB0ZXN0czoKCiAgICBDOj5weXRob24gd2luLXRlc3RzLnB5IC1jIC1yIC12IC11IGh0dHA6Ly9sb2NhbGhvc3QKICAgIEM6PmNkIC4uCgwKSUlJLiAgQlVJTERJTkcgQSBTVUJWRVJTSU9OIFNFUlZFUgogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIEEuICBTZXR0aW5nIFVwIEFwYWNoZQogICAgICAtLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgKEZvbGxvd2luZyB0aGUgQk9PVFNUUkFQUElORyBGUk9NIFJQTSBwcm9jZWR1cmVzIGFib3ZlIHdpbGwgaW5zdGFsbCBhbmQKICAgICAgYnVpbGQgdGhlIGxhdGVzdCBTdWJ2ZXJzaW9uIHNlcnZlciBmb3IgTGludXggUmVkSGF0IDcuMSwgNy4yLCBhbmQgUFBDCiAgICAgIExpbnV4IHN5c3RlbXMgKklGKiB0aGUgYXBhY2hlLWRldmVsLTIuMC40MSBvciBncmVhdGVyIHBhY2thZ2UgaXMgYWxyZWFkeQogICAgICBpbnN0YWxsZWQgd2hlbiB0aGUgU1VCVkVSU0lPTiBSUE0gaXMgYnVpbHQuKQoKCiAgICAgIDEuICBPYnRhaW5pbmcgYW5kIEluc3RhbGxpbmcgQXBhY2hlIDIuMAoKICAgICAgU3VidmVyc2lvbiB0cmllcyB0byBjb21waWxlIGFnYWluc3QgdGhlIGxhdGVzdCByZWxlYXNlZCB2ZXJzaW9uCiAgICAgIG9mIEFwYWNoZSBodHRwZC0yLjAuICBUaGUgZWFzaWVzdCB0aGluZyBmb3IgeW91IHRvIGRvIGlzCiAgICAgIGRvd25sb2FkIGEgc291cmNlIHRhcmJhbGwgb2YgdGhlIGxhdGVzdCByZWxlYXNlIGFuZCB1bnBhY2sgdGhhdC4KCiAgICAgIEFsdGVybmF0ZWx5LCBpZiB5b3UnZCByYXRoZXIgdXNlIHRoZSBsYXRlc3QgU1ZOIHZlcnNpb25zIG9mCiAgICAgIGV2ZXJ5dGhpbmcsIGNoZWNrb3V0IHRoZSAiaHR0cGQgMi4wLngiICBicmFuY2ggZnJvbSBhcGFjaGUub3JnLgogICAgICBJZiB5b3UgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgdGhlIEFwYWNoZSBodHRwZCAyLjAgYnVpbGQsIHBsZWFzZSBjb25zdWx0CiAgICAgIHRoZSBodHRwZCBpbnN0YWxsIGRvY3VtZW50YXRpb246CgogICAgICAgICAgaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy0yLjAvaW5zdGFsbC5odG1sCgogICAgICBQbGFjZSB0aGlzIG1vZHVsZSB3aGVyZXZlciB5b3Ugd2lzaDsgaXQncyBhbiBpbmRlcGVuZGVudCBwcm9qZWN0LgoKICAgICAgJCBzdm4gY28gXAogICAgICAgIGh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvaHR0cGQvaHR0cGQvYnJhbmNoZXMvMi4wLnggaHR0cGQtMi4wCgogICAgICBDaGVja291dCB0aGUgImFwciIgYW5kICJhcHItdXRpbCIgbW9kdWxlcyBpbnRvIHRoZSBzcmNsaWIvIGRpcmVjdG9yeToKCiAgICAgICQgY2QgaHR0cGQtMi4wL3NyY2xpYgogICAgICAkIHN2biBjbyBcCiAgICAgICAgaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hcHIvYXByL2JyYW5jaGVzLzAuOS54IGFwcgogICAgICAkIHN2biBjbyBcCiAgICAgICAgaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9hcHIvYXByLXV0aWwvYnJhbmNoZXMvMC45LnggYXByLXV0aWwKCiAgICAgIEF0IHRoZSB0b3Agb2YgdGhlIGh0dHBkLTIuMCB0cmVlOgoKICAgICAgICAgICQgLi9idWlsZGNvbmYKICAgICAgICAgICQgLi9jb25maWd1cmUgLS1lbmFibGUtZGF2IC0tZW5hYmxlLXNvIC0tZW5hYmxlLW1haW50YWluZXItbW9kZQoKICAgICAgVGhlIGZpcnN0IGFyZyBzYXlzIHRvIGJ1aWxkIG1vZF9kYXYuCgogICAgICBUaGUgc2Vjb25kIGFyZyBzYXlzIHRvIGVuYWJsZSBzaGFyZWQgbW9kdWxlIHN1cHBvcnQgd2hpY2ggaXMgbmVlZGVkCiAgICAgIGZvciBhIHR5cGljYWwgY29tcGlsZSBvZiBtb2RfZGF2X3N2biAoc2VlIGJlbG93KS4KCiAgICAgIFRoZSB0aGlyZCBhcmcgc2F5cyB0byBpbmNsdWRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIElmIHlvdQogICAgICBidWlsdCBTdWJ2ZXJzaW9uIHdpdGggLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlLCB0aGVuIHlvdSBzaG91bGQKICAgICAgZG8gdGhlIHNhbWUgZm9yIEFwYWNoZTsgdGhlcmUgY2FuIGJlIHByb2JsZW1zIGlmIG9uZSB3YXMKICAgICAgY29tcGlsZWQgd2l0aCBkZWJ1Z2dpbmcgYW5kIHRoZSBvdGhlciB3aXRob3V0LgoKICAgICAgTm90ZTogaWYgeW91IGhhdmUgbXVsdGlwbGUgZGIgdmVyc2lvbnMgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLAogICAgICBBcGFjaGUgbWlnaHQgbGluayB0byBhIGRpZmZlcmVudCBvbmUgdGhhbiBTdWJ2ZXJzaW9uLCBjYXVzaW5nCiAgICAgIGZhaWx1cmVzIHdoZW4gYWNjZXNzaW5nIHRoZSByZXBvc2l0b3J5IHRocm91Z2ggQXBhY2hlLiAgVG8gcHJldmVudAogICAgICB0aGlzIGZyb20gaGFwcGVuaW5nLCB5b3UgaGF2ZSB0byB0ZWxsIEFwYWNoZSB3aGljaCBkYiB2ZXJzaW9uIHRvCiAgICAgIHVzZSBhbmQgd2hlcmUgdG8gZmluZCBkYi4gIEFkZCAtLXdpdGgtZGJtPWRiNCBhbmQKICAgICAgLS13aXRoLWJlcmtlbGV5LWRiPS91c3IvbG9jYWwvQmVya2VsZXlEQi40LjIgdG8gdGhlIGNvbmZpZ3VyZQogICAgICBsaW5lLiAgTWFrZSBzdXJlIHRoaXMgaXMgdGhlIHNhbWUgZGIgYXMgdGhlIG9uZSBTdWJ2ZXJzaW9uIHVzZXMuCiAgICAgIFRoaXMgbm90ZSBhc3N1bWVzIHlvdSBoYXZlIGluc3RhbGxlZCBCZXJrZWxleSBEQiA0LjIuNTIKICAgICAgYXQgaXRzIGRlZmF1bHQgbG9jYXRpb25zLiAgRm9yIG1vcmUgaW5mbyBhYm91dCB0aGUgZGIgcmVxdWlyZW1lbnQsCiAgICAgIHNlZSBzZWN0aW9uIEkuNS4KCiAgICAgIFlvdSBtYXkgYWxzbyB3YW50IHRvIGluY2x1ZGUgb3RoZXIgbW9kdWxlcyBpbiB5b3VyIGJ1aWxkLiBBZGQKICAgICAgLS1lbmFibGUtc3NsIHRvIHR1cm4gb24gU1NMIHN1cHBvcnQsIGFuZCAtLWVuYWJsZS1kZWZsYXRlIHRvIHR1cm4gb24KICAgICAgY29tcHJlc3Npb24gc3VwcG9ydCwgZm9yIGV4YW1wbGUuICBDb25zdWx0IHRoZSBBcGFjaGUgZG9jdW1lbnRhdGlvbgogICAgICBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgQWxsIGluc3RydWN0aW9ucyBiZWxvdyBhc3N1bWUgeW91IGNvbmZpZ3VyZWQgQXBhY2hlIHRvIGluc3RhbGwKICAgICAgaW4gaXRzIGRlZmF1bHQgbG9jYXRpb24sIC91c3IvbG9jYWwvYXBhY2hlMi87IHN1YnN0aXR1dGUKICAgICAgYXBwcm9wcmlhdGVseSBpZiB5b3UgY2hvc2Ugc29tZSBvdGhlciBsb2NhdGlvbi4KCiAgICAgIENvbXBpbGUgYW5kIGluc3RhbGwgYXBhY2hlOgoKICAgICAgICAgICQgbWFrZSAmJiBtYWtlIGluc3RhbGwKCgogIEIuICBNYWtpbmcgYW5kIEluc3RhbGxpbmcgdGhlIFN1YnZlcnNpb24gU2VydmVyCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgIEdvIGJhY2sgaW50byB5b3VyIHN1YnZlcnNpb24gd29ya2luZyBjb3B5IGFuZCBydW4gLi9hdXRvZ2VuLnNoIGlmCiAgICAgIHlvdSBuZWVkIHRvLiAgVGhlbiwgYXNzdW1pbmcgQXBhY2hlIGh0dHBkIDIuMCBpcyBpbnN0YWxsZWQgaW4gdGhlCiAgICAgIHN0YW5kYXJkIGxvY2F0aW9uLCBydW46CgogICAgICAgICAgJCAuL2NvbmZpZ3VyZQoKICAgICAgTm90ZTogZG8gKm5vdCogY29uZmlndXJlIHN1YnZlcnNpb24gd2l0aCAiLS1kaXNhYmxlLXNoYXJlZCIhCiAgICAgIG1vZF9kYXZfc3ZuICptdXN0KiBiZSBidWlsdCBhcyBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgaXQgd2lsbAogICAgICBsb29rIGZvciBvdGhlciBsaWJzdm5fKi5zbyBsaWJyYXJpZXMgb24geW91ciBzeXN0ZW0uCgogICAgICBJZiB5b3Ugc2VlIGEgd2FybmluZyBtZXNzYWdlIHRoYXQgdGhlIGJ1aWxkIG9mIG1vZF9kYXZfc3ZuIGlzIGJlaW5nCiAgICAgIHNraXBwZWQsIHRoaXMgbWF5IGJlIGJlY2F1c2UgeW91IGhhdmUgQXBhY2hlIGh0dHBkIDIuMCBpbnN0YWxsZWQKICAgICAgaW4gYSBub24tc3RhbmRhcmQgbG9jYXRpb24uICBZb3UgY2FuIHVzZSB0aGUgIi0td2l0aC1hcHhzPSIgb3B0aW9uCiAgICAgIHRvIGxvY2F0ZSB0aGUgYXB4cyBzY3JpcHQ6CgogICAgICAgICAgJCAuL2NvbmZpZ3VyZSAtLXdpdGgtYXB4cz0vdXNyL2xvY2FsL2FwYWNoZTIvYmluL2FweHMKCiAgICAgIE5vdGU6IGl0ICppcyogcG9zc2libGUgdG8gYnVpbGQgbW9kX2Rhdl9zdm4gYXMgYSBzdGF0aWMgbGlicmFyeQogICAgICBhbmQgbGluayBpdCBkaXJlY3RseSBpbnRvIEFwYWNoZS4gUG9zc2libGUsIGJ1dCBwYWluZnVsLiBTdGljawogICAgICB3aXRoIHRoZSBzaGFyZWQgbGlicmFyeSBmb3Igbm93OyBpZiB5b3UgY2FuJ3QsIHRoZW4gYXNrLgoKICAgICAgICAgICQgcm0gL3Vzci9sb2NhbC9saWIvbGlic3ZuKgoKICAgICAgSWYgeW91IGhhdmUgb2xkIHN1YnZlcnNpb24gbGlicmFyaWVzIHNpdHRpbmcgb24geW91ciBzeXN0ZW0sCiAgICAgIGxpYnRvb2wgd2lsbCBsaW5rIHRoZW0gaW5zdGVhZCBvZiB0aGUgYGZyZXNoJyBvbmVzIGluIHlvdXIgdHJlZS4KICAgICAgUmVtb3ZlIHRoZW0gYmVmb3JlIGJ1aWxkaW5nIHN1YnZlcnNpb24uCgogICAgICAgICAgJCBtYWtlIGNsZWFuICYmIG1ha2UgJiYgbWFrZSBpbnN0YWxsCgogICAgICBBZnRlciB0aGUgbWFrZSBpbnN0YWxsLCB0aGUgU3VidmVyc2lvbiBzaGFyZWQgbGlicmFyaWVzIGFyZSBpbgogICAgICAvdXNyL2xvY2FsL2xpYi8uICBtb2RfZGF2X3N2bi5zbyBzaG91bGQgYmUgaW5zdGFsbGVkIGluCiAgICAgIC91c3IvbG9jYWwvYXBhY2hlMi9tb2R1bGVzLy4KCgogICAgICBTZWN0aW9uIElJLkUgZXhwbGFpbnMgaG93IHRvIGJ1aWxkIHRoZSBzZXJ2ZXIgb24gV2luZG93cy4KCgogIEMuICBDb25maWd1cmluZyBBcGFjaGUgZm9yIFN1YnZlcnNpb24KICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICBUaGUgZm9sbG93aW5nIHNlY3Rpb24gaXMgYW4gYWJicmV2aWF0ZWQgdmVyc2lvbiBvZiB0aGUKICAgICAgaW5mb3JtYXRpb24gaW4gdGhlIFN1YnZlcnNpb24gQm9vawogICAgICAoaHR0cDovL3N2bmJvb2sucmVkLWJlYW4uY29tKS4gIFBsZWFzZSByZWFkIGNoYXB0ZXIgNiBmb3IgbW9yZQogICAgICBkZXRhaWxzLgoKICAgICAgVGhlIGZvbGxvd2luZyBhc3N1bWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCBhIHJlcG9zaXRvcnkuCiAgICAgIEZvciBkb2N1bWVudGF0aW9uIG9uIGhvdyB0byBkbyB0aGF0LCBzZWUgUkVBRE1FLgoKICAgICAgVGhlIGZvbGxvd2luZyBhbHNvIGFzc3VtZXMgdGhhdCB5b3UgaGF2ZSBtb2RpZmllZAogICAgICAvdXNyL2xvY2FsL2FwYWNoZTIvY29uZi9odHRwZC5jb25mIHRvIHJlZmxlY3QgeW91ciBzZXR1cC4KICAgICAgQXQgYSBtaW5pbXVtIHlvdSBzaG91bGQgbG9vayBhdCB0aGUgVXNlciwgR3JvdXAgYW5kIFNlcnZlck5hbWUKICAgICAgZGlyZWN0aXZlcy4gIEZ1bGwgZGV0YWlscyBvbiBzZXR0aW5nIHVwIGFwYWNoZSBjYW4gYmUgZm91bmQgYXQ6CiAgICAgIGh0dHA6Ly9odHRwZC5hcGFjaGUub3JnL2RvY3MtMi4wLwoKICAgICAgRmlyc3QsIHlvdXIgaHR0cGQuY29uZiBuZWVkcyB0byBsb2FkIHRoZSBtb2RfZGF2X3N2biBtb2R1bGUuCiAgICAgIFN1YnZlcnNpb24ncyAnbWFrZSBpbnN0YWxsJyB0YXJnZXQgc2hvdWxkIGF1dG9tYXRpY2FsbHkgYWRkIHRoaXMKICAgICAgbGluZSBmb3IgeW91LiAgQnV0IGlmIGFwYWNoZSBnaXZlcyB5b3UgYW4gZXJyb3IgbGlrZSAiVW5rbm93bgogICAgICBEQVYgcHJvdmlkZXI6IHN2biIsIHRoZW4geW91IG1heSB3YW50IHRvIHZlcmlmeSB0aGF0IHRoaXMgbGluZQogICAgICBleGlzdHMgaW4geW91ciBodHRwZC5jb25mOgoKICAgICAgICAgTG9hZE1vZHVsZSBkYXZfc3ZuX21vZHVsZSAgICAgbW9kdWxlcy9tb2RfZGF2X3N2bi5zbwoKICAgICAgTk9URTogaWYgeW91IGJ1aWx0IG1vZF9kYXYgYXMgYSBkeW5hbWljIG1vZHVsZSBhcyB3ZWxsLCBtYWtlIHN1cmUKICAgICAgdGhlIGFib3ZlIGxpbmUgYXBwZWFycyBhZnRlciB0aGUgb25lIHRoYXQgbG9hZHMgbW9kX2Rhdi5zby4KCiAgICAgIE5leHQsIGFkZCB0aGlzIHRvIHRoZSAqYm90dG9tKiBvZiB5b3VyIGh0dHBkLmNvbmY6CgogICAgICA8TG9jYXRpb24gL3N2bi9yZXBvcz4KICAgICAgICAgIERBViBzdm4KICAgICAgICAgIFNWTlBhdGggL2Fic29sdXRlL3BhdGgvdG8vcmVwb3NpdG9yeQogICAgICA8L0xvY2F0aW9uPgoKICAgICAgVGhpcyB3aWxsIGdpdmUgYW55b25lIHVucmVzdHJpY3RlZCBhY2Nlc3MgdG8gdGhlIHJlcG9zaXRvcnkuICBJZgogICAgICB5b3Ugd2FudCBsaW1pdGVkIGFjY2VzcywgcmVhZCBvciB3cml0ZSwgeW91IGFkZCB0aGVzZSBsaW5lcyB0bwogICAgICB0aGUgTG9jYXRpb24gYmxvY2s6CgogICAgICAgICAgQXV0aFR5cGUgQmFzaWMKICAgICAgICAgIEF1dGhOYW1lICJTdWJ2ZXJzaW9uIHJlcG9zaXRvcnkiCiAgICAgICAgICBBdXRoVXNlckZpbGUgL215L3N2bi91c2VyL3Bhc3N3ZC9maWxlCgogICAgICBBbmQ6CgogICAgICAgICAgYSkgRm9yIGEgcmVhZC93cml0ZSByZXN0cmljdGVkIHJlcG9zaXRvcnk6CgogICAgICAgICAgICAgUmVxdWlyZSB2YWxpZC11c2VyCgogICAgICAgICAgYikgRm9yIGEgd3JpdGUgcmVzdHJpY3RlZCByZXBvc2l0b3J5OgoKICAgICAgICAgICAgIDxMaW1pdEV4Y2VwdCBHRVQgUFJPUEZJTkQgT1BUSU9OUyBSRVBPUlQ+CiAgICAgICAgICAgICAgICAgUmVxdWlyZSB2YWxpZC11c2VyCiAgICAgICAgICAgICA8L0xpbWl0RXhjZXB0PgoKICAgICAgICAgIGMpIEZvciBzZXBhcmF0ZSByZXN0cmljdGVkIHJlYWQgYW5kIHdyaXRlIGFjY2VzczoKCiAgICAgICAgICAgICBBdXRoR3JvdXBGaWxlIC9teS9zdm4vZ3JvdXAvZmlsZQoKICAgICAgICAgICAgIDxMaW1pdEV4Y2VwdCBHRVQgUFJPUEZJTkQgT1BUSU9OUyBSRVBPUlQ+CiAgICAgICAgICAgICAgICAgUmVxdWlyZSBncm91cCBzdm5fY29tbWl0dGVycwogICAgICAgICAgICAgPC9MaW1pdEV4Y2VwdD4KCiAgICAgICAgICAgICA8TGltaXQgR0VUIFBST1BGSU5EIE9QVElPTlMgUkVQT1JUPgogICAgICAgICAgICAgICAgIFJlcXVpcmUgZ3JvdXAgc3ZuX2NvbW1pdHRlcnMKICAgICAgICAgICAgICAgICBSZXF1aXJlIGdyb3VwIHN2bl9yZWFkZXJzCiAgICAgICAgICAgICA8L0xpbWl0PgoKICAgICAgVGhlc2UgYXJlIG9ubHkgYSBmZXcgc2ltcGxlIGV4YW1wbGVzLiAgRm9yIGEgY29tcGxldGUgdHV0b3JpYWwKICAgICAgb24gQXBhY2hlIGFjY2VzcyBjb250cm9sLCBwbGVhc2UgY29uc2lkZXIgdGFraW5nIGEgbG9vayBhdCB0aGUKICAgICAgdHV0b3JpYWxzIGZvdW5kIHVuZGVyICJTZWN1cml0eSIgb24gdGhlIGZvbGxvd2luZyBwYWdlOgogICAgICBodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzLTIuMC9taXNjL3R1dG9yaWFscy5odG1sCgogICAgICBJbiBvcmRlciBmb3IgJ3N2biBjcCcgdG8gd29yayAod2hpY2ggaXMgYWN0dWFsbHkgaW1wbGVtZW50ZWQgYXMgYQogICAgICBEQVYgQ09QWSBjb21tYW5kKSwgbW9kX2RhdiBuZWVkcyB0byBiZSBhYmxlIHRvIGRldGVybWluZSB0aGUKICAgICAgaG9zdG5hbWUgb2YgdGhlIHNlcnZlci4gIEEgc3RhbmRhcmQgd2F5IG9mIGRvaW5nIHRoaXMgaXMgdG8gdXNlCiAgICAgIEFwYWNoZSdzIFNlcnZlck5hbWUgZGlyZWN0aXZlIHRvIHNldCB0aGUgc2VydmVyJ3MgaG9zdG5hbWUuICBFZGl0CiAgICAgIHlvdXIgL3Vzci9sb2NhbC9hcGFjaGUyL2NvbmYvaHR0cGQuY29uZiB0byBpbmNsdWRlOgoKICAgICAgU2VydmVyTmFtZSBzdm4ubXlzZXJ2ZXIub3JnCgogICAgICBJZiB5b3UgYXJlIHVzaW5nIHZpcnR1YWwgaG9zdGluZyB0aHJvdWdoIEFwYWNoZSdzIE5hbWVWaXJ0dWFsSG9zdAogICAgICBkaXJlY3RpdmUsIHlvdSBtYXkgbmVlZCB0byB1c2UgdGhlIFNlcnZlckFsaWFzIGRpcmVjdGl2ZSB0byBzcGVjaWZ5CiAgICAgIGFkZGl0aW9uYWwgbmFtZXMgdGhhdCB5b3VyIHNlcnZlciBpcyBrbm93biBieS4KCiAgICAgIElmIHlvdSBoYXZlIGNvbmZpZ3VyZWQgbW9kX2RlZmxhdGUgdG8gYmUgaW4gdGhlIHNlcnZlciwgeW91IGNhbiBlbmFibGUKICAgICAgY29tcHJlc3Npb24gc3VwcG9ydCBmb3IgeW91ciByZXBvc2l0b3J5IGJ5IGFkZGluZyB0aGUgZm9sbG93aW5nIGxpbmUKICAgICAgdG8geW91ciBMb2NhdGlvbiBibG9jazoKCiAgICAgICAgICBTZXRPdXRwdXRGaWx0ZXIgREVGTEFURQoKCiAgICAgIE5PVEU6IElmIHlvdSBhcmUgdW5mYW1pbGlhciB3aXRoIGFuIEFwYWNoZSBkaXJlY3RpdmUsIG9yIG5vdCBleGFjdGx5CiAgICAgIHN1cmUgYWJvdXQgd2hhdCBpdCBkb2VzLCBkb24ndCBoZXNpdGF0ZSB0byBsb29rIGl0IHVwIGluIHRoZQogICAgICBkb2N1bWVudGF0aW9uOiBodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzLTIuMC9tb2QvZGlyZWN0aXZlcy5odG1sLgoKICAgICAgTk9URTogTWFrZSBzdXJlIHRoYXQgdGhlIHVzZXIgJ25vYm9keScgKG9yIHdoYXRldmVyIFVJRCB0aGUKICAgICAgaHR0cGQgcHJvY2VzcyBydW5zIGFzKSBoYXMgcGVybWlzc2lvbiB0byByZWFkIGFuZCB3cml0ZSB0aGUKICAgICAgQmVya2VsZXkgREIgZmlsZXMhICBUaGlzIGlzIGEgdmVyeSBjb21tb24gcHJvYmxlbS4KCgogIEQuICBSdW5uaW5nIGFuZCBUZXN0aW5nCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgIEZpcmUgdXAgYXBhY2hlIDIuMDoKCiAgICAgICAgICAkIC91c3IvbG9jYWwvYXBhY2hlMi9iaW4vYXBhY2hlY3RsIHN0b3AKICAgICAgICAgICQgL3Vzci9sb2NhbC9hcGFjaGUyL2Jpbi9hcGFjaGVjdGwgc3RhcnQKCiAgICAgIENoZWNrIC91c3IvbG9jYWwvYXBhY2hlMi9sb2dzL2Vycm9yX2xvZyB0byBtYWtlIHN1cmUgaXQgc3RhcnRlZAogICAgICB1cCBva2F5LgoKICAgICAgVHJ5IGRvaW5nIGEgbmV0d29yayBjaGVja291dCBmcm9tIHRoZSByZXBvc2l0b3J5OgoKICAgICAgICAgICQgc3ZuIGNvIGh0dHA6Ly9sb2NhbGhvc3Qvc3ZuL3JlcG9zIHdjCgogICAgICBUaGUgbW9zdCBjb21tb24gcmVhc29uIHRoaXMgbWlnaHQgZmFpbCBpcyBwZXJtaXNzaW9uIHByb2JsZW1zCiAgICAgIHJlYWRpbmcgdGhlIHJlcG9zaXRvcnkgZGIgZmlsZXMuICBJZiB0aGUgY2hlY2tvdXQgZmFpbHMsIG1ha2UKICAgICAgc3VyZSB0aGF0IHRoZSBodHRwZCBwcm9jZXNzIGhhcyBwZXJtaXNzaW9uIHRvIHJlYWQgYW5kIHdyaXRlIHRvCiAgICAgIHRoZSByZXBvc2l0b3J5LiAgWW91IGNhbiBzZWUgYWxsIG9mIG1vZF9kYXZfc3ZuJ3MgY29tcGxhaW50cyBpbgogICAgICB0aGUgQXBhY2hlIGVycm9yIGxvZ2ZpbGUsIC91c3IvbG9jYWwvYXBhY2hlMi9sb2dzL2Vycm9yX2xvZy4KCiAgICAgIFRvIHJ1biB0aGUgcmVncmVzc2lvbiB0ZXN0IHN1aXRlIGZvciBuZXR3b3JrZWQgU3VidmVyc2lvbiwgc2VlCiAgICAgIHRoZSBpbnN0cnVjdGlvbnMgaW4gc3VidmVyc2lvbi90ZXN0cy9jbGllbnRzL2NtZGxpbmUvUkVBRE1FLgogICAgICBGb3IgYWR2aWNlIGFib3V0IHRyYWNpbmcgcHJvYmxlbXMsIHNlZSAiRGVidWdnaW5nIHRoZSBzZXJ2ZXIiIGluCiAgICAgIHRoZSBIQUNLSU5HIGZpbGUuCgoKICBFLiAgQWx0ZXJuYXRpdmU6ICAnc3Zuc2VydmUnIGFuZCByYV9zdm4KICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgIEFuIGFsdGVybmF0aXZlIG5ldHdvcmsgbGF5ZXIgaXMgbGlic3ZuX3JhX3N2biAob24gdGhlIGNsaWVudAogICAgICBzaWRlKSBhbmQgdGhlICdzdm5zZXJ2ZScgcHJvY2VzcyBvbiB0aGUgc2VydmVyLiAgVGhpcyBpcyBhCiAgICAgIHNpbXBsZSBuZXR3b3JrIGxheWVyIHRoYXQgc3BlYWtzIGEgY3VzdG9tIHByb3RvY29sIG92ZXIgcGxhaW4KICAgICAgVENQIChkb2N1bWVudGVkIGluIGxpYnN2bl9yYV9zdm4vcHJvdG9jb2wpOgoKICAgICAgICAgJCBzdm5zZXJ2ZSAtZCAgICAgIyBiZWNvbWVzIGEgYmFja2dyb3VuZCBkYWVtb24KICAgICAgICAgJCBzdm4gY2hlY2tvdXQgc3ZuOi8vbG9jYWxob3N0L3Vzci9sb2NhbC9zdm4vcmVwb3NpdG9yeQoKICAgICAgWW91IGNhbiB1c2UgdGhlICItciIgb3B0aW9uIHRvIHN2bnNlcnZlIHRvIHNldCBhIGxvZ2ljYWwgcm9vdAogICAgICBmb3IgcmVwb3NpdG9yaWVzLCBhbmQgdGhlICItUiIgb3B0aW9uIHRvIHJlc3RyaWN0IGNvbm5lY3Rpb25zIHRvCiAgICAgIHJlYWQtb25seSBhY2Nlc3MuICAoIlJlYWQtb25seSIgaXMgYSBsb2dpY2FsIHRlcm0gaGVyZTsgc3Zuc2VydmUKICAgICAgc3RpbGwgbmVlZHMgd3JpdGUgYWNjZXNzIHRvIHRoZSBkYXRhYmFzZSBpbiB0aGlzIG1vZGUsIGJ1dCB3aWxsCiAgICAgIG5vdCBhbGxvdyBjb21taXRzIG9yIHJldnByb3AgY2hhbmdlcy4pCgogICAgICAnc3Zuc2VydmUnIGhhcyBidWlsdC1pbiBDUkFNLU1ENSBhdXRoZW50aWNhdGlvbiAoc28geW91IGNhbgogICAgICB1c2Ugbm9uLXN5c3RlbSBhY2NvdW50cyksIGFuZCBjYW4gYWxzbyBiZSB0dW5uZWxlZCBvdmVyIFNTSAogICAgICAoc28geW91IGNhbiB1c2UgZXhpc3Rpbmcgc3lzdGVtIGFjY291bnRzKS4gIFBsZWFzZSByZWFkIGNoYXB0ZXIKICAgICAgNiBpbiB0aGUgU3VidmVyc2lvbiBCb29rIChodHRwOi8vc3ZuYm9vay5yZWQtYmVhbi5jb20pIGZvcgogICAgICBkZXRhaWxzIG9uIHRoZXNlIGZlYXR1cmVzLgoKCgwKSVYuICAgUExBVEZPUk0tU1BFQ0lGSUMgSVNTVUVTCiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PQoKICBBLiAgV2luZG93cyBYUAogICAgICAtLS0tLS0tLS0tCgogICAgICBUaGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgV2luZG93cyBYUCBUQ1AvSVAgc3RhY2sgd2hpY2ggY2F1c2VzCiAgICAgIGNvcnJ1cHRpb24gaW4gY2VydGFpbiBjYXNlcy4gIFRoaXMgcHJvYmxlbSBpcyBleHBvc2VkIG9ubHkKICAgICAgdGhyb3VnaCByYV9kYXYuCgogICAgICBUaGUgcm9vdCBvZiB0aGUgbWF0dGVyIGlzIGNhdXNlZCBieSBkdXBsaWNhdGluZyBmaWxlIGhhbmRsZXMKICAgICAgYmV0d2VlbiBwYXJlbnQgYW5kIGNoaWxkIHByb2Nlc3Nlcy4gIFRoZSBodHRwZCBBcGFjaGUgZ3JvdXAKICAgICAgZXhwbGFpbnMgdGhpcyBhIGxvdCBiZXR0ZXI6CgogICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvaHR0cGQvYmluYXJpZXMvd2luMzIvI3hwYnVnCgogICAgICBBbmQgdGhlcmUncyBhbiBpdGVtIGFib3V0IHRoaXMgaW4gdGhlIFN1YnZlcnNpb24gRkFROgoKICAgICAgICAgIGh0dHA6Ly9zdWJ2ZXJzaW9uLnRpZ3Jpcy5vcmcvZmFxLmh0bWwjd2luZG93cy14cC1zZXJ2ZXIKCiAgICAgIFRoZSBvbmx5IGtub3duIHdvcmthcm91bmQgZm9yIG5vdyBpcyB0byB1cGRhdGUgdG8gV2luZG93cyBYUAogICAgICBTUDEgKG9yIGhpZ2hlcikuCgoKICBCLiAgTWFjIE9TIFgKICAgICAgLS0tLS0tLS0KCiAgICAgIFtUQkQ6IERlc2NyaWJlIEJEQiA0LjAueCBwcm9ibGVtXQoKCgwKVi4gICAgUFJPR1JBTU1JTkcgTEFOR1VBR0UgQklORElOR1MgKFBZVEhPTiwgUEVSTCwgUlVCWSwgSkFWQSkKICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAKICAgICAgRm9yIFB5dGhvbiwgUGVybCBhbmQgUnVieSBiaW5kaW5ncywgc2VlIHRoZSBmaWxlICAgICAKCiAgICAgICAgICAuL3N1YnZlcnNpb24vYmluZGluZ3Mvc3dpZy9JTlNUQUxMCgogICAgICBGb3IgSmF2YSBiaW5kaW5ncywgc2VlIHRoZSBmaWxlCgogICAgICAgICAgLi9zdWJ2ZXJzaW9uL2JpbmRpbmdzL2phdmEvUkVBRE1FCg==