PCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KPGh0bWw+CjxoZWFkPgogICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNSBbZW5dIChXaW5OVDsgSSkgW05ldHNjYXBlXSI+CiAgIDx0aXRsZT5Vc2luZyBJbWFnZXMgaW4gdGhlIEVjbGlwc2UgVUk8L3RpdGxlPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2RlZmF1bHRfc3R5bGUuY3NzIj4KPC9oZWFkPgo8Ym9keT4KCjxkaXYgYWxpZ249cmlnaHQ+Jm5ic3A7IDxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiwgVGltZXMsIHNlcmlmIj48Zm9udCBzaXplPS0xPkNvcHlyaWdodCAKICAmY29weTsgMjAwMSwgMjAwMiBPYmplY3QgVGVjaG5vbG9neSBJbnRlcm5hdGlvbmFsLCBJbmMuPC9mb250PjwvZm9udD48L2Rpdj4KCjx0YWJsZSBCT1JERVI9MCBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTIgV0lEVEg9IjEwMCUiID4KPHRyPgo8dGQgQUxJR049TEVGVCBWQUxJR049VE9QIENPTFNQQU49IjIiIEJHQ09MT1I9IiMwMDgwQzAiPjxiPjxmb250IGZhY2U9IkFyaWFsLEhlbHZldGljYSI+PGZvbnQgY29sb3I9IiNGRkZGRkYiPiZuYnNwO0VjbGlwc2UKQ29ybmVyIEFydGljbGU8L2ZvbnQ+PC9mb250PjwvYj48L3RkPgo8L3RyPgo8L3RhYmxlPgoKPGgxPiA8aW1nIFNSQz0iLi4vaW1hZ2VzL0lkZWEuanBnIiBoZWlnaHQ9ODYgd2lkdGg9MTIwIGFsaWduPUNFTlRFUj48L2gxPgoKPGNlbnRlcj4KPGgxPgpVc2luZyBJbWFnZXMgaW4gdGhlIEVjbGlwc2UgVUk8L2gxPjwvY2VudGVyPgoKPGJsb2NrcXVvdGU+PGI+U3VtbWFyeTwvYj4KPGJyPgogIE1hbmFnaW5nIGltYWdlcyBpbiBhIGxhcmdlIGdyYXBoaWNhbCBhcHBsaWNhdGlvbiBjYW4gYmUgYSBkYXVudGluZyB0YXNrLiBTaW5jZSAKICBtb2Rlcm4gb3BlcmF0aW5nIHN5c3RlbXMgc3VjaCBhcyBXaW5kb3dzJnJlZzsgb25seSBzdXBwb3J0IGEgc21hbGwgbnVtYmVyIG9mIGltYWdlcyAKICBpbiBtZW1vcnkgYXQgb25jZSwgYW4gYXBwbGljYXRpb26ScyBpY29ucyBhbmQgYmFja2dyb3VuZCBpbWFnZXMgbXVzdCBiZSBjYXJlZnVsbHkgCiAgbWFuYWdlZCBhbmQgc29tZXRpbWVzIHNoYXJlZCBiZXR3ZWVuIHdpZGdldHMuIFRoaXMgYXJ0aWNsZSBkZXNjcmliZXMgdGhlIGltYWdlIAogIG1hbmFnZW1lbnQgZmFjaWxpdGllcyBwcm92aWRlZCBieSB0aGUgRWNsaXBzZSBQbGF0Zm9ybSwgYWxvbmcgd2l0aCBzb21lIGJlc3QgCiAgcHJhY3RpY2UgZ3VpZGVsaW5lcyB0byBrZWVwIGluIG1pbmQgd2hlbiB3cml0aW5nIHlvdXIgb3duIEVjbGlwc2UgVUkgcGx1Zy1pbnMuIAogIFdlIGFzc3VtZSB0aGUgcmVhZGVyIGFscmVhZHkgaGFzIGEgYmFzaWMgdW5kZXJzdGFuZGluZyBvZiBFY2xpcHNlLCB0aGUgVUkgZXh0ZW5zaW9uIAogIHBvaW50cyBkZWZpbmVkIGJ5IHRoZSBFY2xpcHNlIFBsYXRmb3JtLCBhbmQgdGhlIFN0YW5kYXJkIFdpZGdldCBUb29sa2l0IChTV1QpLiAKICA8cD48Yj5CeSBKb2huIEFydGhvcm5lLCBPVEk8L2I+PGJyPgogICAgQXByaWwgMjAsIDIwMDE7IHVwZGF0ZWQgU2VwdGVtYmVyIDEyLCAyMDAyIGZvciBFY2xpcHNlIDIuMDwvYmxvY2txdW90ZT4KCjxoMj4gVGhlIFVzdWFsIFN1c3BlY3RzIDwvaDI+CjxwPldlIGJlZ2luIGJ5IGRlc2NyaWJpbmcgdGhlIGludGVyZXN0aW5nIGNsYXNzZXMgdG8ga25vdyBhYm91dCB3aGVuIHdyaXRpbmcgVUkgCiAgcGx1Zy1pbnMgdGhhdCBkZWZpbmUgdGhlaXIgb3duIGltYWdlcy4gSnVzdCBhYm91dCBhbnlib2R5IHdyaXRpbmcgc3Vic3RhbnRpYWwgCiAgVUkgY29tcG9uZW50cyBmb3IgYSBwbHVnLWluIG5lZWRzIHRvIHVuZGVyc3RhbmQgdGhlc2UgYmFzaWMgaW1hZ2UgbWFuYWdlbWVudCAKICBvYmplY3RzLiA8L3A+CjxwPgogIDx1bD4KICAgIDxsaT4gCiAgICAgIDxwPjxiPjx0dD5vcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U8L3R0PjwvYj4uIEluc3RhbmNlcyBvZiA8dHQ+SW1hZ2U8L3R0PiAKICAgICAgICBhcmUgcmVhZHkgZm9yIGRpc3BsYXkgb24gdGhlIHNjcmVlbi4gVGhleSBoYXZlIGFsbCB0aGVpciBkYXRhIGluIG1lbW9yeSwgCiAgICAgICAgYW5kIHRoZXkgbWFpbnRhaW4gYSBoYW5kbGUgdG8gYW4gdW5kZXJseWluZyBPUyByZXNvdXJjZS4gVGhlc2UgYXJlIGhlYXZ5LXdlaWdodCAKICAgICAgICBvYmplY3RzIHRoYXQgZ2VuZXJhbGx5IHNob3VsZCBub3QgYmUgaGVsZCBvbnRvIGluZGVmaW5pdGVseS4gV2hlbiBubyBsb25nZXIgCiAgICAgICAgbmVlZGVkLCB0aGUgdXNlciBtdXN0IGNhbGwgPHR0PmRpc3Bvc2UoKTwvdHQ+IG9uIHRoZSBJbWFnZSB0byBmcmVlIHRoZSAKICAgICAgICB1bmRlcmx5aW5nIHJlc291cmNlLiBUaGUgY3J1Y2lhbCBwb2ludCB0byB1bmRlcnN0YW5kIGhlcmUgaXMgdGhhdCB0aGVzZSAKICAgICAgICBvYmplY3RzIGFyZSB2ZXJ5IGV4cGVuc2l2ZSB0byBsZWF2ZSBseWluZyBhcm91bmQuIFRoZSBvcGVyYXRpbmcgc3lzdGVtIAogICAgICAgIHR5cGljYWxseSBvbmx5IGFsbG93cyBhIGZpeGVkIG51bWJlciBvZiBpbWFnZXMgYXQgb25jZS4gRm9yIGV4YW1wbGUsIFdpbmRvd3MgCiAgICAgICAgOTggb25seSBhbGxvd3MgYWJvdXQgMTAwMCBpbWFnZXMgaW4gbWVtb3J5IGJlZm9yZSBpdCBiZWdpbnMgdG8gZmFpbC4gV2hlbmV2ZXIgCiAgICAgICAgeW91IGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBJbWFnZSwgdGhpbmsgYWJvdXQgaG93IGxvbmcgaXQgd2lsbCBiZSBuZWVkZWQsIAogICAgICAgIGFuZCBtYWtlIHN1cmUgdGhhdCBhIG1lY2hhbmlzbSBpcyBpbiBwbGFjZSB0byBkaXNwb3NlIG9mIGl0IHdoZW4gbm8gbG9uZ2VyIAogICAgICAgIG5lZWRlZC4gWW91IDxiPmNhbm5vdDwvYj4gcmVseSBvbiB0aGUgSmF2YSZ0cmFkZTsgZ2FyYmFnZSBjb2xsZWN0b3IgdG8gZG8gdGhpcyAKICAgICAgICBmb3IgeW91LCBzaW5jZSBJbWFnZXMgcmVmZXJlbmNlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIE9TLCBub3QgdGhlIEphdmEgCiAgICAgICAgdmlydHVhbCBtYWNoaW5lLiZuYnNwOyBBbiBpbnRlcmVzdGluZyBjaGFyYWN0ZXJpc3RpYyBvZiBJbWFnZXMgaXMgdGhhdCAKICAgICAgICBvbmUgPHR0PkltYWdlPC90dD4gaW5zdGFuY2UgY2FuIGJlIHBsYWNlZCBpbiBtdWx0aXBsZSB3aWRnZXRzLCBhIHRlY2huaXF1ZSAKICAgICAgICBjYWxsZWQgaW1hZ2Ugc2hhcmluZy4mbmJzcDsgQSBtYWpvciBjaGFsbGVuZ2Ugb2YgaW1hZ2UgbWFuYWdlbWVudCBpcyB0byAKICAgICAgICB0YWtlIGFkdmFudGFnZSBvZiB0aGlzIHNoYXJpbmcgYXMgbXVjaCBhcyBwb3NzaWJsZSwgYnV0IHRvIHN0aWxsIGtub3cgCiAgICAgICAgd2hlbiBpdCBpcyBzYWZlIHRvIGRpc3Bvc2UgdGhlIGltYWdlLjwvcD4KICAgIDwvbGk+CiAgICA8bGk+IDxiPjx0dD5vcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I8L3R0PjwvYj4uIFRoZXNlIG9iamVjdHMgCiAgICAgIGFyZSB2ZXJ5IGxpZ2h0LXdlaWdodCBkZXNjcmlwdGlvbnMgb2YgaW1hZ2VzLiBUaGV5IGtub3cgaG93IHRvIGZpbmQgdGhlIAogICAgICBpbWFnZSBkYXRhIGFuZCBsb2FkIHRoZSBpbWFnZSBpbnRvIG1lbW9yeSwgYnV0IHRoZXkgZG8gbm90IGhvbGQgb250byBhbnkgCiAgICAgIGxhcmdlIHN0cnVjdHVyZXMgdGhlbXNlbHZlcy4gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGZhY3RvcnkgbWV0aG9kcyBvbiBJbWFnZURlc2NyaXB0b3IgCiAgICAgIGZvciBjcmVhdGluZyBkZXNjcmlwdG9ycyBmcm9tIEphdmEgcmVzb3VyY2UgZmlsZXMsIG5vcm1hbCBmaWxlcywgYW5kIFVSTHMuIAogICAgICBJdCBpcyBva2F5IHRvIGNyZWF0ZSBJbWFnZURlc2NyaXB0b3JzIGZvciBhbGwgdGhlIGltYWdlcyBpbiB5b3VyIHBsdWctaW4sIAogICAgICBhbmQga2VlcCB0aGVtIGFyb3VuZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBVSS4mbmJzcDsgQW4gU1dUIEltYWdlIGNhbiAKICAgICAgYmUgY3JlYXRlZCBmcm9tIGFuIEltYWdlRGVzY3JpcHRvciBieSBjYWxsaW5nIGl0cyA8dHQ+Y3JlYXRlSW1hZ2U8L3R0PiBtZXRob2QuJm5ic3A7IAogICAgICBFYWNoIGNhbGwgdG8gY3JlYXRlSW1hZ2UgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiBJbWFnZSwgYW5kIGl0IGlzIHRoZSAKICAgICAgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhlIGNyZWF0ZWQgaW1hZ2UgZ2V0cyBkaXNwb3NlZC48L2xpPgogICAgPGxpPiA8Yj48dHQ+b3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTwvdHQ+PC9iPi4gU29tZSBpbWFnZXMgYXJlIAogICAgICB1c2VkIHZlcnkgZnJlcXVlbnRseSBieSBhIHBsdWctaW4sIGFuZCBhcmUgd29ydGggcGxhY2luZyBpbiBhIGdsb2JhbCBwb29sIAogICAgICBzbyB0aGF0IHRoZXkgY2FuIGJlIHNoYXJlZCBhbmQgcmV1c2VkIHRocm91Z2hvdXQgdGhlIFVJLiBUaGVzZSBpbWFnZXMgc2hvdWxkIAogICAgICBiZSBwbGFjZWQgaW4geW91ciBwbHVnLWluJ3MgSW1hZ2VSZWdpc3RyeS4gSXQgaXMgaW1wb3J0YW50IHRvIGtlZXAgdGhlIG51bWJlciAKICAgICAgb2YgaW1hZ2VzIGluIHlvdXIgcmVnaXN0cnkgc21hbGwsIHNvIHRoYXQgeW91IGRvbid0IHVubmVjZXNzYXJpbHkgaG9nIE9TIAogICAgICByZXNvdXJjZXMgdGhhdCBtYXkgYmUgbmVlZGVkIGJ5IG90aGVyIHBsdWctaW5zLjwvbGk+CiAgPC91bD4KICBBcyBhIGdlbmVyYWwgcnVsZSBvZiB0aHVtYiwgSW1hZ2VEZXNjcmlwdG9ycyBzaG91bGQgYmUgdXNlZCB3aGVyZXZlciBwb3NzaWJsZSAKaW4geW91ciBVSSBjb2RlLiZuYnNwOyBIb3dldmVyLCBpbiBwbGFjZXMgd2hlcmUgeW91IGFyZSBjcmVhdGluZyByZWFsIHdpZGdldHMsIApzdWNoIGFzIHN1YmNsYXNzZXMgb2YgPHR0Pm9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDwvdHQ+LCBvciA8dHQ+b3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzwvdHQ+LCAKeW91IG5lZWQgdG8gYmUgbWFuaXB1bGF0aW5nIFNXVCBpbWFnZXMuJm5ic3A7IEdlbmVyYWxseSwgdGhlIGNvZGUgdGhhdCBjcmVhdGVzIAp0aGUgd2lkZ2V0IHNob3VsZCBhbHNvIGNyZWF0ZSB0aGUgSW1hZ2VzIHRvIGdvIGluIGl0LCBhbmQgdGhlIGNvZGUgdGhhdCBkaXNwb3NlcyAKdGhlIHdpZGdldCBzaG91bGQgYWxzbyBkaXNwb3NlIG9mIGl0cyBpbWFnZXMuJm5ic3A7IEFuIGV4Y2VwdGlvbiB0byB0aGlzIHJ1bGUgCmlzIGlmIHlvdSBhcmUgdXNpbmcgSW1hZ2VzIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIG11bHRpcGxlIHdpZGdldHMuJm5ic3A7IEltYWdlIApzaGFyaW5nIHNob3VsZCBiZSBhcHByb2FjaGVkIHdpdGggY2F1dGlvbiwgYmVjYXVzZSBhcyB3ZSBkaXNjdXNzZWQgZWFybGllciwgc2hhcmluZyAKbWFrZXMgaXQgZGlmZmljdWx0IHRvIGZpZ3VyZSBvdXQgd2hlbiB0byBkaXNwb3NlIG9mIHRoZSBpbWFnZXMuJm5ic3A7IDx0dD5vcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyPC90dD4gCihkZXNjcmliZWQgbGF0ZXIpLCBhbmQgPHR0Pm9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk8L3R0PiwgYXJlIHR3byAKbWVjaGFuaXNtcyBwcm92aWRlZCBieSBKRmFjZSB0aGF0IGhlbHAgdG8gYWNoaWV2ZSBpbWFnZSBzaGFyaW5nIGluIGEgY29udHJvbGxlZCAKbWFubmVyLiAKPGgyPkRlZmluaW5nIEltYWdlcyBUaHJvdWdoIFlvdXIgcGx1Z2luLnhtbCBGaWxlPC9oMj4KICBUaGUgc2ltcGxlc3QgYW5kIG1vc3QgZnJlcXVlbnQgd2F5IGltYWdlcyBnZXQgYWRkZWQgdG8gYSBVSSBwbHVnLWluIGlzIHZpYSB0aGVpciAKICBwbHVnaW4ueG1sIGZpbGUuJm5ic3A7IE1hbnkgVUkgZXh0ZW5zaW9uIHBvaW50cyBhbGxvdyBhbiBpbWFnZSBmaWxlbmFtZSB0byBiZSAKICBwcm92aWRlZCBkaXJlY3RseSBpbiB5b3VyIGV4dGVuc2lvbiBkZWZpbml0aW9uLCBuYW1lbHk6IAogIDx1bD4KICA8bGk+ICJhY3Rpb25zIiBlbGVtZW50cyBvbiB0aGUgb3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyBleHRlbnNpb24gcG9pbnQ8L2xpPgogIDxsaT4gImVkaXRvciIgZWxlbWVudHMgb24gdGhlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMgZXh0ZW5zaW9uIHBvaW50PC9saT4KICA8bGk+ICJhY3Rpb24iIGVsZW1lbnRzIG9uIHRoZSBvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zIGV4dGVuc2lvbiBwb2ludDwvbGk+CiAgPGxpPiAid2l6YXJkIiBlbGVtZW50cyBvbiB0aGUgb3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyBleHRlbnNpb24gcG9pbnQ8L2xpPgogIDxsaT4gIndpemFyZCIgZWxlbWVudHMgb24gdGhlIG9yZy5lY2xpcHNlLnVpLmltcG9ydFdpemFyZHMgZXh0ZW5zaW9uIHBvaW50PC9saT4KICA8bGk+ICJ3aXphcmQiIGVsZW1lbnRzIG9uIHRoZSBvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIGV4dGVuc2lvbiBwb2ludDwvbGk+CiAgPGxpPiAicGVyc3BlY3RpdmUiIGVsZW1lbnRzIG9uIHRoZSBvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMgZXh0ZW5zaW9uIHBvaW50PC9saT4KICA8bGk+ICJhY3Rpb24iIGVsZW1lbnRzIG9uIHRoZSBvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIGV4dGVuc2lvbiBwb2ludDwvbGk+CiAgPGxpPiAicGFnZSIgZWxlbWVudHMgb24gdGhlIG9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMgZXh0ZW5zaW9uIHBvaW50PC9saT4KICA8bGk+ICJhY3Rpb24iIGVsZW1lbnRzIG9uIHRoZSBvcmcuZWNsaXBzZS51aS52aWV3QWN0aW9ucyBleHRlbnNpb24gcG9pbnQ8L2xpPgogIDxsaT4gInZpZXciIGVsZW1lbnRzIG9uIHRoZSBvcmcuZWNsaXBzZS51aS52aWV3cyBleHRlbnNpb24gcG9pbnQ8L2xpPgogIDxsaT4gImltYWdlIiBlbGVtZW50cyBvbiB0aGUgb3JnLmVjbGlwc2UudWkucHJvamVjdE5hdHVyZUltYWdlcyBleHRlbnNpb24gcG9pbnQgKHNpbmNlIEVjbGlwc2UgMi4wKTwvbGk+CiAgPGxpPiAid29ya2luZ1NldCIgZWxlbWVudHMgb24gdGhlIG9yZy5lY2xpcHNlLnVpLndvcmtpbmdTZXRzIGV4dGVuc2lvbiBwb2ludCAoc2luY2UgRWNsaXBzZSAyLjApPC9saT4KCgogIDwvdWw+CiAgRm9yIGFsbCBvZiB0aGVzZSBlbGVtZW50IHR5cGVzLCB0aGUgd2F5IHlvdSBzcGVjaWZ5IGltYWdlcyBpcyB0aGUgc2FtZS4mbmJzcDsgClRoZXJlIGlzIGFuIGF0dHJpYnV0ZSBjYWxsZWQgImljb24iLCB3aG9zZSB2YWx1ZSBtdXN0IGJlIGFuIGltYWdlIGZpbGVuYW1lIHJlbGF0aXZlIAp0byB5b3VyIHBsdWctaW4ncyBpbnN0YWxsIGxvY2F0aW9uLiZuYnNwOyBUbyBnaXZlIGEgcXVpY2sgZXhhbXBsZSwgaGVyZSBpcyBhbiAKWE1MIGRlZmluaXRpb24gb2YgYW4gaW1wb3J0IHdpemFyZCwgdGFrZW4gZnJvbSB0aGUgZXh0ZW5zaW9uIHBvaW50IGRvY3VtZW50YXRpb246IAo8cHJlPjx0dD4mbHQ7ZXh0ZW5zaW9uPC90dD4gCiAgIDx0dD5wb2ludD0ib3JnLmVjbGlwc2UudWkuaW1wb3J0Ij48L3R0PiAKPHR0PiZuYnNwOyZuYnNwOyAmbHQ7d2l6YXJkPC90dD4gCjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaWQ9ImNvbS54eXouSW1wb3J0V2l6YXJkMSI8L3R0PiAgICAgIAo8dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IG5hbWU9IlhZWiBXZWIgU2NyYXBlciI8L3R0PiAgICAgIAo8dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGNsYXNzPSJjb20ueHl6LmltcG9ydHMuSW1wb3J0V2l6YXJkMSI8L3R0PiAgICAgIAo8dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGljb249Ii4vaW1hZ2VzL2ltcG9ydDEuZ2lmIj48L3R0PiAgICAgIAo8dHQ+Jm5ic3A7Jm5ic3A7ICZsdDsvd2l6YXJkPjwvdHQ+IAo8dHQ+Jmx0Oy9leHRlbnNpb24+PC90dD4gICAgPC9wcmU+CjxwPkhlcmUsIHRoZSB3aXphcmQgaXMgZ2l2ZW4gYW4gaW1hZ2UgY2FsbGVkICJpbXBvcnQxLmdpZiIsIGZvdW5kIGluIGEgc3ViZGlyZWN0b3J5IAogIG9mIHRoZSBwbHVnLWluJ3MgYmFzZSBkaXJlY3RvcnkgY2FsbGVkICJpbWFnZXMiLiZuYnNwOyBTZWUgdGhlIGRvY3VtZW50YXRpb24gCiAgZm9yIGVhY2ggb2YgdGhlIGFib3ZlIGV4dGVuc2lvbiBwb2ludHMgZm9yIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZXMgb2YgdGhlaXIgCiAgdXNlLiA8L3A+CjxwPlRoZXJlIGFyZSBtYW55IGFkdmFudGFnZXMgdG8gc3BlY2lmeWluZyBpbWFnZXMgZGlyZWN0bHkgaW4geW91ciBYTUwgZmlsZSwgb3ZlciAKICBkZWZpbmluZyBpbWFnZXMgcHJvZ3JhbW1hdGljYWxseSBpbiB5b3VyIFVJIGNvZGU6IAo8dWw+CiAgICA8bGk+IFlvdSBjYW4gbGV0IHRoZSBQbGF0Zm9ybSB3b3JyeSBhYm91dCBsb2FkaW5nIHRoZSBpbWFnZSwgc3RvcmluZyBpdCwgYW5kIAogICAgICBkaXNwb3Npbmcgb2YgaXQgd2hlbiBubyBsb25nZXIgbmVlZGVkLCB3aGljaCBtZWFucyBsZXNzIGNvZGUgYW5kIGxlc3MgYnVncyAKICAgICAgZm9yIHlvdSB0byB3b3JyeSBhYm91dC48L2xpPgogICAgPGxpPiBNb3N0IG9mIHlvdXIgaW1hZ2UgZmlsZW5hbWVzIGFyZSBlbmNvZGVkIGluIG9uZSBwbGFjZSwgbWFraW5nIGl0IGVhc2llciAKICAgICAgdG8gY2hhbmdlIGFuZCBtb2RpZnkgdGhlbS48L2xpPgogICAgPGxpPiBZb3VyIHBsdWctaW4gd2lsbCB0YWtlIGFkdmFudGFnZSBvZiB0aGUgUGxhdGZvcm0ncyBsYXp5IHBsdWctaW4gbG9hZGluZyAKICAgICAgbWVjaGFuaXNtLiZuYnNwOyBZb3VyIGNsYXNzZXMgYW5kIGltYWdlcyB3aWxsIG9ubHkgYmUgbG9hZGVkIHdoZW4gdGhleSBhcmUgCiAgICAgIHJlZmVyZW5jZWQgYnkgdGhlIHVzZXIsIGFuZCBub3QgYmVmb3JlLiZuYnNwOyBJbiBmYWN0LCB0aGlzIGlzIHdoeSBleHRlbnNpb24gCiAgICAgIHBvaW50cyBhbHdheXMgYXNrIGZvciBhIG5hbWUgYW5kIGljb24gZm9yIHlvdXIgYWN0aW9ucywgdmlld3MsIGV0Yy4mbmJzcDsgCiAgICAgIFRoYXQgd2F5LCB0aGUgUGxhdGZvcm0gY2FuIHByZXNlbnQgdGhlbSBpbiBtZW51cyBhbmQgdG9vbGJhcnMgd2l0aG91dCBoYXZpbmcgCiAgICAgIHRvIGxvYWQgeW91ciBjbGFzc2VzIHVudGlsIHRoZXkgYXJlIHJlYWxseSBuZWVkZWQuPC9saT4KICA8L3VsPgogIDxoMj4gQWRkaW5nIEltYWdlcyB0byBDdXN0b20gVUk8L2gyPgogIFlvdSBoYXZlIGJlZ3VuIGV4cGVyaW1lbnRpbmcgd2l0aCBwbGF0Zm9ybSBleHRlbnNpb24gcG9pbnRzLCBtYXliZSBjb250cmlidXRpbmcgCiAgc29tZSBhY3Rpb25zIHRvIHBvcHVwIG1lbnVzIG9yIHRvb2xiYXJzLCBvciBtYXliZSB5b3UndmUgZXZlbiBkZWZpbmVkIHlvdXIgb3duIAogIGN1c3RvbSB2aWV3LiBJbiBtYW55IG9mIHRoZXNlIGNhc2VzLCBzcGVjaWZ5aW5nIGFuIGltYWdlIGZpbGUgaW4gdGhlIFhNTCBmaWxlIAogIGZvciB5b3VyIHBsdWctaW4gaXMgYWxsIHRoYXQgaXMgcmVxdWlyZWQsIGFuZCB0aGUgUGxhdGZvcm0gdGFrZXMgY2FyZSBvZiB0aGUgCiAgcmVzdC4mbmJzcDsgSG93ZXZlciwgd2hlbiB5b3UgbW92ZSBvbiB0byB3cml0aW5nIG1vcmUgYWR2YW5jZWQgVUkgY29tcG9uZW50cywgCiAgeW91IG1heSBuZWVkIHRvIGRlZmluZSBpbWFnZXMgZnJvbSB3aXRoaW4geW91ciBjb2RlLiZuYnNwOyBUaGUgZm9sbG93aW5nIGV4YW1wbGUgCiAgZGVtb25zdHJhdGVzIHRoZSBzaW1wbGVzdCB3YXkgdG8gZGVmaW5lIGltYWdlcyB3aXRoaW4gVUkgY29kZS4gSW4gdGhpcyBleGFtcGxlIAogIHdlIGhhdmUgYSBVSSBwbHVnLWluIGNhbGxlZCBNeVBsdWdpbiwgYW5kIHNvbWUgYWN0aW9uIGNhbGxlZCBNeUFjdGlvbi4gV2Ugd291bGQgCiAgbGlrZSB0byBhc3NvY2lhdGUgYW4gaW1hZ2Ugd2l0aCBNeUFjdGlvbi4gCiAgPHA+U3RlcCAxOiBDcmVhdGUgYW4gaW1hZ2UgdXNpbmcgeW91ciBmYXZvcml0ZSBpbWFnZSBlZGl0aW5nIHByb2dyYW0uIEZvciBhY3Rpb24gCiAgICBpY29ucywgdGhlIHJlY29tbWVuZGVkIGZvcm1hdCBpcyBhIDE2eDE2IHBpeGVsIGltYWdlIGluIHRoZSBHSUYgZm9ybWF0LiBGb3IgCiAgICB0aGlzIGV4YW1wbGUsIHdlJ2xsIGNhbGwgdGhlIGltYWdlICJteV9hY3Rpb24uZ2lmIiwgYW5kIHBsYWNlIGl0IGluIGEgc3ViZGlyZWN0b3J5IAogICAgb2YgdGhlIHBsdWctaW4gYmFzZSBkaXJlY3RvcnkgY2FsbGVkICJpbWFnZXMiLiAKICA8cD5TdGVwIDI6IERlZmluZSBhbiBJbWFnZURlc2NyaXB0b3IgaW4geW91ciBNeUFjdGlvbiBjbGFzcy4gSXQncyBhIGdvb2QgaWRlYSAKICAgIHRvIG1ha2UgdGhpcyBmaWVsZCBzdGF0aWMgc28gdGhhdCBpdCBjYW4gYmUgc2hhcmVkIGFjcm9zcyBpbnN0YW5jZXMgb2YgdGhlIAogICAgYWN0aW9uLiAKICAKPHByZT5wdWJsaWMgY2xhc3MgTXlBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewogIHByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBpbWFnZTsKICBzdGF0aWMgewogICAgVVJMIHVybCA9IG51bGw7CiAgICB0cnkgewogICAgdXJsID0gbmV3IFVSTChNeVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldERlc2NyaXB0b3IoKS5nZXRJbnN0YWxsVVJMKCksCiAgICAgICAgICAgICAgICAgICJpbWFnZXMvbXlfYWN0aW9uLmdpZiIpOwogICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKICAgIH0KICAgIGltYWdlID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKICB9CgkgIC4uLiBvdGhlciBtZXRob2RzIGFuZCBmaWVsZHMgZGVmaW5lZCBoZXJlIC4uLgp9CiAgPC9wcmU+CiAgPHA+QmVjYXVzZSBwbHVnLWlucyBjYW4gYmUgc3RvcmVkIGFueXdoZXJlLCB3ZSB1c2UgVVJMcyB0byBkZXNjcmliZSB0aGVpciBsb2NhdGlvbi4gCiAgICBUaGUgaW1hZ2UgbG9jYXRpb24gd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4gbG9jYXRpb24sIAogICAgc28gd2UgdXNlIHRoYXQgYXMgdGhlIGJhc2Ugb2YgdGhlIGltYWdlJ3MgVVJMLiBXZSB0aGVuIHVzZSB0aGUgZmFjdG9yeSBtZXRob2QgCiAgICBkZWZpbmVkIG9uIHRoZSBJbWFnZURlc2NyaXB0b3IgY2xhc3MgdG8gY3JlYXRlIG91ciBkZXNjcmlwdG9yLiBUaGUgbWV0aG9kIAogICAgSW1hZ2VEZXNjcmlwdG9yI2NyZWF0ZUZyb21VUkwoKSB3aWxsIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhIG51bGwgVVJMIGlzIHBhc3NlZCAKICAgIHRvIGl0LCBzbyB3ZSBkb24ndCBuZWVkIHRvIGhhbmRsZSB0aGUgcG9zc2libGUgVVJMIGV4Y2VwdGlvbi4gSW1hZ2VzIHRoYXQgCiAgICBjb3VsZCBub3QgYmUgbG9hZGVkIGFyZSB2aXNpYmxlIGluIHRoZSBVSSBhcyBzbWFsbCByZWQgc3F1YXJlcy4gSWYgeW91IHNlZSAKICAgIGEgcmVkIHNxdWFyZSBuZXh0IHRvIHlvdXIgYWN0aW9uIGluIHRoZSBwb3B1cCBtZW51LCBpdCBwcm9iYWJseSBtZWFucyB5b3UgCiAgICBnb3QgdGhlIGltYWdlIGxvY2F0aW9uIHdyb25nLCBvciB0aGUgaW1hZ2UgaXMgbWlzc2luZy4gCiAgPHA+U3RlcCAzOiBTZXQgdGhlIEltYWdlRGVzY3JpcHRvciBhcyB0aGUgYWN0aW9uJ3MgaW1hZ2UgaW4gdGhlIGNvbnN0cnVjdG9yOiAKICAKPHByZT5wdWJsaWMgTXlBY3Rpb24oKSB7IAogICAgc3VwZXIoIk15IEFjdGlvbiIsIGltYWdlKTsKfTwvcHJlPgo8cD5UaGF0J3MgaXQhIE5vdywgd2hlbiB5b3Ugc3RhcnR1cCB0aGUgRWNsaXBzZSBVSSBhbmQgZmluZCB5b3VyIGFjdGlvbiBpbiBhIG1lbnUgCiAgb3IgdG9vbGJhciwgeW91ciBpbWFnZSB3aWxsIGFwcGVhciBuZXh0IHRvIGl0LiBUaGUgc2FtZSBhcHByb2FjaCBjYW4gYmUgdXNlZCAKICB0byBkZWZpbmUgaW1hZ2VzIHdpdGhpbiBjdXN0b20gdmlld3MgYW5kIHdpemFyZHMuJm5ic3A7IE5vdGUgdGhhdCBzaW5jZSB5b3UgCiAgb25seSBoYWQgdG8gZGVhbCB3aXRoIEltYWdlRGVzY3JpcHRvcnMgaW4gdGhpcyBleGFtcGxlLCBubyBkaXNwb3NhbCB3YXMgcmVxdWlyZWQuJm5ic3A7IAogIEluIHRoaXMgY2FzZSB0aGUgcGxhdGZvcm0gaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nLCBtYW5hZ2luZywgYW5kIGRpc3Bvc2luZyAKICBhbnkgU1dUIEltYWdlIGl0IGNyZWF0ZXMgZnJvbSB0aGUgaW1hZ2UgZGVzY3JpcHRvciB5b3Ugc3VwcGxpZWQuIDwvcD4KPGgyPiBWaWV3ZXJzIGFuZCBMYWJlbCBQcm92aWRlcnM8L2gyPgogIEFkZGluZyBpbWFnZXMgdG8gYWN0aW9ucyBhbmQgdmlldyB0aXRsZXMgaXMgZmFpcmx5IHNpbXBsZSBpbiBFY2xpcHNlLiBJbiB0aGVzZSAKY2FzZXMsIHRoZSBwbGF0Zm9ybSBoYW5kbGVzIHRoZSBjcmVhdGlvbiBhbmQgbWFuYWdlbWVudCBvZiB0aGUgcmVhbCwgdW5kZXJseWluZyAKU1dUIGltYWdlLiBXaGVuIHlvdSBzdGFydCB0byBhZGQgeW91ciBvd24gb2JqZWN0cyB0byB2aWV3ZXJzLCB0aGluZ3MgZ2V0IGEgbGl0dGxlIApiaXQgbW9yZSBjb21wbGljYXRlZC4gVGhpcyBpcyBtYWlubHkgYmVjYXVzZSBtYW55IG9iamVjdHMgaW4gdmlld2VycyB0ZW5kIHRvIGhhdmUgCnRoZSBzYW1lIGljb24uIEZvciBleGFtcGxlLCBhbGwgZmlsZXMgaW4gdGhlIE5hdmlnYXRvciBoYXZlIHRoZSBzYW1lIGljb24sIGFzIApkbyBhbGwgcHVibGljIEphdmEgZmllbGRzIGluIHRoZSBKYXZhIERldmVsb3BtZW50IFRvb2xpbmcgKEpEVCkgdmlld3MuIFRvIG1ha2UgCnRoaXMgZWZmaWNpZW50LCB3ZSB3YW50IHRvIHJldXNlIHRoZSBzYW1lIFNXVCBpbWFnZSBvYmplY3QgZm9yIGFsbCB0aGVzZSBpdGVtcy4gClRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IGNyZWF0aW5nIGEgbGFiZWwgcHJvdmlkZXIgZm9yIHlvdXIgdmlld2VyLiAKPHA+WW91IGNhbiB0aGluayBvZiBsYWJlbCBwcm92aWRlcnMgYXMgY29udGFpbmluZyBhIHBvb2wgb2YgaW1hZ2VzIHRoYXQgbGFzdHMgCiAgICBmb3IgdGhlIGxpZmV0aW1lIG9mIGEgcGFydGljdWxhciB2aWV3ZXIuJm5ic3A7IFRoZXkgYWxsb3cgdGhlIHNhbWUgU1dUIEltYWdlcyAKICAgIHRvIGJlIHJldXNlZCB0aHJvdWdob3V0IHRoZSB0aW1lIHRoYXQgdmlld2VyJ3Mgd2lkZ2V0IGlzIG9wZW4uJm5ic3A7IE5vdGUgCiAgICB0aGF0IElMYWJlbFByb3ZpZGVycyBkb24ndCBwcm92aWRlIGEgd2F5IHRvIHNoYXJlIHRoZSBzYW1lIEltYWdlIGFjcm9zcyBtdWx0aXBsZSAKICAgIHZpZXdlcnMsIHdoaWNoIGlzIGZpbmUgYmVjYXVzZSB0aGVyZSBhcmUgcmFyZWx5IG1vcmUgdGhhbiBhIGNvdXBsZSBvZiB2aWV3ZXJzIAogICAgb3BlbiBhdCBhbnkgZ2l2ZW4gdGltZSB0aGF0IGNvdWxkIHNoYXJlIGltYWdlcyBhbnl3YXkuJm5ic3A7IEdlbmVyYWxseSwgc2hhcmluZyAKICAgIGltYWdlcyBhY3Jvc3MgbXVsdGlwbGUgdmlld2VycyBpbnRyb2R1Y2VzIGEgZ3JlYXQgZGVhbCBvZiBjb21wbGV4aXR5IGZvciB2ZXJ5IAogICAgbGl0dGxlIGdhaW4uIAogIDxwPlRvIGdpdmUgeW91IGFuIGlkZWEgb2YgaG93IElMYWJlbFByb3ZpZGVycyB3b3JrLCBpdCBpcyBpbnN0cnVjdGl2ZSB0byBzdGVwIAogICAgdGhyb3VnaCB0aGUgbGlmZXRpbWUgb2YgYW4gSUxhYmVsUHJvdmlkZXIgaW5zdGFuY2UuIAogIDx1bD4KICAgIDxsaT4gPGI+Q3JlYXRpb246PC9iPiBUaGUgY29kZSB0aGF0IGNyZWF0ZXMgYSB2aWV3ZXIgaW5zdGFuY2Ugc2hvdWxkIGFsc28gCiAgICAgIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBJTGFiZWxQcm92aWRlciB0byBzdXBwbHkgaW1hZ2VzIGZvciBvYmplY3RzIGluIHRoYXQgCiAgICAgIHZpZXdlci4mbmJzcDsgVGhlIGxhYmVsIHByb3ZpZGVyIGlzIHRoZW4gc2V0IGludG8gdGhlIHZpZXdlciBieSBjYWxsaW5nIAogICAgICA8dHQ+b3JnLmVjbGlwc2UuamZhY2Uudmlld2VyLkNvbnRlbnRWaWV3ZXIjc2V0TGFiZWxQcm92aWRlcihJQmFzZUxhYmVsUHJvdmlkZXIpPGI+LiAKICAgICAgPC9iPjwvdHQ+PGI+SW1wb3J0YW50OjwvYj4mbmJzcDsgT25jZSBhIGxhYmVsIHByb3ZpZGVyIGhhcyBiZWVuIHNldCBpbnRvIAogICAgICBhIHZpZXdlciwgdGhhdCB2aWV3ZXIgdGFrZXMgb3ZlciBvd25lcnNoaXAgb2YgdGhlIGluc3RhbmNlLiZuYnNwOyBBIGxhYmVsIAogICAgICBwcm92aWRlciBpbnN0YW5jZSBtdXN0IG5ldmVyIGJlIHBhc3NlZCB0byBhbm90aGVyIHZpZXdlciwgb3IgaGF2ZSBhbnkgb2YgCiAgICAgIGl0cyBtZXRob2RzIGludm9rZWQsIG9uY2UgaXQgaGFzIGJlZW4gYWxsb2NhdGVkIHRvIGEgdmlld2VyLjwvbGk+CiAgICA8bGk+IDxiPkRpc3Bvc2FsOjwvYj4mbmJzcDsgVGhlIHZpZXdlciBpcyByZXNwb25zaWJsZSBmb3IgaW52b2tpbmcgZGlzcG9zZSgpIAogICAgICBvbiBpdHMgbGFiZWwgcHJvdmlkZXIgd2hlbiB0aGUgdW5kZXJseWluZyB3aWRnZXQgaXMgY2xvc2VkLiZuYnNwOyBUaGlzIDx0dD5kaXNwb3NlKCk8L3R0PiAKICAgICAgbWV0aG9kIG11c3QgZGlzcG9zZSBvZiBhbnkgaW1hZ2VzIHRoYXQgd2VyZSBldmVyIGRpc3BlbnNlZCBieSB0aGF0IGxhYmVsIAogICAgICBwcm92aWRlciBpbnN0YW5jZS48L2xpPgogIDwvdWw+CiAgTm93IHRoYXQgeW91IGhhdmUgYW4gaWRlYSBvZiBob3cgbGFiZWwgcHJvdmlkZXJzIGFyZSBjcmVhdGVkIGFuZCB1c2VkLCBsZXQncyAKICB0YWtlIGEgbG9vayBhdCBob3cgdG8gaW1wbGVtZW50IG9uZSBmb3IgeW91ciB2aWV3ZXIuJm5ic3A7IDx0dD5JTGFiZWxQcm92aWRlcjwvdHQ+IAogIGRlZmluZXMgdGhlIGZvbGxvd2luZyBtZXRob2QgZm9yIGNyZWF0aW5nIGltYWdlczogCiAgCjxwcmU+cHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpOzwvcHJlPgo8cD5UaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHZpZXdlciBmcmFtZXdvcmsgZm9yIGVhY2ggaXRlbSBpbiB0aGUgdmlld2VyLiAKICAgIEFzIGEgc2lsbHkgZXhhbXBsZSwgbGV0J3Mgc2F5IHlvdSBoYXZlIGEgZnJ1aXQgdmlldyB0aGF0IHdhbnRzIHRvIGRpc3BsYXkgCiAgICB2YXJpb3VzIGZydWl0cy4gWW91ciBsYWJlbCBwcm92aWRlciBtaWdodCBsb29rIGFzIGZvbGxvd3M6IAogIDxwPjx0dD5wdWJsaWMgY2xhc3MgRnJ1aXRMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7PC90dD4gPGJyPgogICAgPHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwcml2YXRlIEltYWdlIGFwcGxlSW1hZ2UgPSBuZXcgSW1hZ2UohSk7PC90dD4gPGJyPgogICAgPHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwcml2YXRlIEltYWdlIGtpd2lJbWFnZSA9IG5ldyBJbWFnZSiFKTs8L3R0PiA8YnI+CiAgICA8dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7PC90dD4gPGJyPgogICAgPHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBpZiAob2JqZWN0LmdldENsYXNzKCkgPT0gQXBwbGUuY2xhc3MpIAogICAgezwvdHQ+IDxicj4KICAgIDx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcmV0dXJuIAogICAgYXBwbGVJbWFnZTs8L3R0PiA8YnI+CiAgICA8dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08L3R0PiA8YnI+CiAgICA8dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGlmIChvYmplY3QuZ2V0Q2xhc3MoKSA9PSBLaXdpLmNsYXNzKSAKICAgIHs8L3R0PiA8YnI+CiAgICA8dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHJldHVybiAKICAgIGtpd2lJbWFnZTs8L3R0PiA8YnI+CiAgICA8dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IH08L3R0PiA8YnI+CiAgICA8dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHJldHVybiBudWxsOzwvdHQ+IDxicj4KICAgIDx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgfTwvdHQ+IDxicj4KICAgIDx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgezwvdHQ+IDxicj4KICAgIDx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgLy9yZXR1cm4gYXBwcm9wcmlhdGUgbGFiZWxzIAogICAgZm9yIHRoZSB2YXJpb3VzIGZydWl0czwvdHQ+IDxicj4KICAgIDx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgfTwvdHQ+IDxicj4KICAgIDx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgcHVibGljIHZvaWQgZGlzcG9zZSgpIHs8L3R0PiA8YnI+CiAgICA8dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGFwcGxlSW1hZ2UuZGlzcG9zZSgpOzwvdHQ+IAogICAgPGJyPgogICAgPHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBhcHBsZUltYWdlID0gbnVsbDs8L3R0PiA8YnI+CiAgICA8dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGtpd2lJbWFnZS5kaXNwb3NlKCk7PC90dD4gPGJyPgogICAgPHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBraXdpSW1hZ2UgPSBudWxsOzwvdHQ+IDxicj4KICAgIDx0dD4mbmJzcDsmbmJzcDsmbmJzcDsgfTwvdHQ+IDxicj4KICAgIDx0dD59PC90dD4gCiAgPHA+U29tZSBpbnRlcmVzdGluZyB0aGluZ3MgdG8gbm90ZSBhYm91dCB0aGlzIGxhYmVsIHByb3ZpZGVyOiAKICA8dWw+CiAgICA8bGk+IElmIGl0IGZhaWxlZCB0byBmaW5kIGFuIGFwcHJvcHJpYXRlIGltYWdlLCBpdCBqdXN0IHJldHVybmVkIG51bGwuIFRoaXMgCiAgICAgIGlzIGFsbG93ZWQgYnkgdGhlIHNwZWMsIGFuZCBpdCBhbHNvIG1lYW5zIHlvdXIgY29kZSB3b24ndCBibG93IHVwIGlmIHlvdSAKICAgICAgdGhyb3cgaW4gc29tZSBleHRyYSBmcnVpdHMgbGF0ZXIgb24uIFdoZW4gZGVhbGluZyB3aXRoIGltYWdlcywgaXQncyBnZW5lcmFsbHkgCiAgICAgIGJldHRlciB0byBoYXZlIG5vIGltYWdlIHRoYW4gZm9yIHlvdXIgY29kZSB0byBmYWlsLjwvbGk+CiAgICA8bGk+IFRoZSBpbWFnZXMgd2VyZSBkaXNwb3NlZCBpbiB0aGUgbGFiZWwgcHJvdmlkZXIncyBkaXNwb3NlIG1ldGhvZC4gVGhpcyAKICAgICAgaXMgVkVSWSBJTVBPUlRBTlQhIEFueXdoZXJlIGFuIFNXVCBJbWFnZSBpcyBkZWZpbmVkLCB0aGVyZSBtdXN0IGJlIGNvcnJlc3BvbmRpbmcgCiAgICAgIGNvZGUgdG8gZGlzcG9zZSB0aGUgaW1hZ2UuIEV2ZW4gdGhvdWdoIHRoaXMgaXMgSmF2YSwgeW91IGNhbid0IHJlbHkgb24gdGhlIAogICAgICBnYXJiYWdlIGNvbGxlY3RvciB0byBmcmVlIHVwIHVudXNlZCBpbWFnZXMuPC9saT4KICAgIAogIDxsaT4gVGhlIGNsYXNzIGV4dGVuZGVkIExhYmVsUHJvdmlkZXIgcmF0aGVyIHRoYW4gaW1wbGVtZW50aW5nIHRoZSBpbnRlcmZhY2UgCiAgICBJTGFiZWxQcm92aWRlciBkaXJlY3RseS4gVGhpcyBpcyBoYW5keSBiZWNhdXNlIGl0IG1lYW5zIHlvdSBkb24ndCBoYXZlIHRvIAogICAgaW1wbGVtZW50IHRoZSBtZXRob2RzIG9uIElMYWJlbFByb3ZpZGVyIGZvciB3aGljaCB5b3UgYXJlbid0IGludGVyZXN0ZWQuPC9saT4KICA8L3VsPgogIDxoMj4gVGhlIEltYWdlUmVnaXN0cnk8L2gyPgogIFRoZSA8dHQ+SW1hZ2VSZWdpc3RyeTwvdHQ+IGlzIG9ubHkgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgSW1hZ2VzIHRoYXQgYXBwZWFyIAogIGZyZXF1ZW50bHkgKGFuZCBpbiBsYXJnZSBudW1iZXJzKSBpbiB0aGUgVUkuIFNpbmNlIHRoZXNlIGhpZ2gtdXNlIGltYWdlcyBuZWVkIAogIHRvIGJlIHNoYXJlZCwgdGhleSBjYW5ub3QgYmUgZGlzcG9zZWQgYnkgdGhvc2UgdXNpbmcgdGhlbS4gRm9yIHRoaXMgcmVhc29uLCAKICB0aGUgPHR0PkltYWdlUmVnaXN0cnk8L3R0PiBpcyBwcm92aWRlZCB0byBhdXRvbWF0aWNhbGx5IG1hbmFnZSB0aGVzZSBpbWFnZXMsIAogIGFuZCB0byBkaXNwb3NlIG9mIHRoZW0gd2hlbiB0aGUgcGx1Zy1pbiBpcyBzaHV0ZG93bi4gTWFueSBvZiB0aGUgaW1hZ2VzIHVzZWQgCiAgYnkgYSBwbHVnLWluIHNob3VsZCBub3QgYmUgcGxhY2VkIGluIHRoZSByZWdpc3RyeSwgc2luY2UgT1MgbGltaXRhdGlvbnMgb24gdGhlIAogIG51bWJlciBvZiBpbWFnZXMgaW4gbWVtb3J5IGNhbiBlYXNpbHkgYmUgcmVhY2hlZC4gTG93ZXItZnJlcXVlbmN5IGltYWdlcyBzaG91bGQgCiAgaW5zdGVhZCBiZSBtYW5hZ2VkIGJ5IGhhdmluZyBhIHRhYmxlIG9mIDx0dD5JbWFnZURlc2NyaXB0b3I8L3R0PiBpbnN0YW5jZXMgaW4gCiAgeW91ciBwbHVnLWluLCBhbmQgdG8gY3JlYXRlIG5ldyBpbWFnZXMgZWFjaCB0aW1lIHRoZXkgYXJlIG5lZWRlZCBmcm9tIHRoZSBpbmZvcm1hdGlvbiAKICBpbiB0aGUgdGFibGUgb2YgZGVzY3JpcHRvcnMuIAogIDxwPlRoZSBlYXNpZXN0IHdheSB0byB1c2UgYW4gPHR0PkltYWdlUmVnaXN0cnk8L3R0PiBpbiB5b3VyIHBsdWctaW4gaXMgdG8gbWFrZSAKICAgIHlvdXIgPHR0PlBsdWdpbjwvdHQ+IGNsYXNzIGEgc3ViY2xhc3Mgb2YgPHR0Pm9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luPC90dD4uJm5ic3A7IAogICAgVGhpcyBjbGFzcyBjcmVhdGVzIGFuIDx0dD5JbWFnZVJlZ2lzdHJ5PC90dD4gYXV0b21hdGljYWxseSAob25lIHBlciBwbHVnLWluIAogICAgaW5zdGFuY2UpLCBpZiByZXF1ZXN0ZWQgdXNpbmcgdGhlIDx0dD5nZXRJbWFnZVJlZ2lzdHJ5KCk8L3R0PiBtZXRob2QuJm5ic3A7IAogICAgVGhpcyByZWdpc3RyeSBjYW4gdGhlbiBiZSBwb3B1bGF0ZWQgd2l0aCBJbWFnZURlc2NyaXB0b3JzIGluIHlvdXIgcGx1Zy1pbiAKICAgIGJ5IG92ZXJyaWRpbmcgdGhlIDx0dD5pbml0aWFsaXplSW1hZ2VSZWdpc3RyeShJbWFnZVJlZ2lzdHJ5KTwvdHQ+IG1ldGhvZC4mbmJzcDsgCiAgICBUaGUgcmVnaXN0cnkgd2lsbCB0aGVuIGxhemlseSBnZW5lcmF0ZSBhbmQgbWFuYWdlIFNXVCBpbWFnZXMgYXMgdGhleSBhcmUgcmVxdWVzdGVkLiZuYnNwOyAKICAgIFRoZSByZWdpc3RyeSBrbm93cyBob3cgdG8gZGlzcG9zZSBvZiBpdHNlbGYgd2hlbiB0aGUgVUkgc2h1dHMgZG93bi4gCiAgPHA+SXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIGluc3RhbmNlcyBvZiA8dHQ+SW1hZ2VSZWdpc3RyeTwvdHQ+IG1hbnVhbGx5LCB3aXRob3V0IAogICAgdXNpbmcgdGhlIDx0dD5BYnN0cmFjdFVJUGx1Z2luPC90dD4ncyBtZWNoYW5pc20uIEhvd2V2ZXIsIHRoaXMgc2hvdWxkIGJlIGRvbmUgCiAgICB3aXRoIGNhdXRpb24uJm5ic3A7IEFuIDx0dD5JbWFnZVJlZ2lzdHJ5PC90dD4sIG9uY2UgY3JlYXRlZCwgY2Fubm90IGJlIGNsb3NlZCAKICAgIHVudGlsIHRoZSB3aG9sZSBVSSBzaHV0cyBkb3duLiZuYnNwOyBUaGV5IHNob3VsZCBvbmx5IGJlIGNyZWF0ZWQgYW5kIHVzZWQgCiAgICBpZiB5b3UgZ2VudWluZWx5IGhhdmUgbmVlZCBmb3IgaW1hZ2VzIHRoYXQgbGFzdCBmb3IgdGhlIHdob2xlIGxpZmV0aW1lIG9mIAogICAgeW91ciBwbHVnLWluLiAKICAKPGgyPiBVc2luZyBHbG9iYWwgSW1hZ2VzIFByb3ZpZGVkIGJ5IE90aGVyIFBsdWctaW5zPC9oMj4KICBTb21lIHBsdWctaW5zIG1heSBleHBvc2UgdGhlaXIgZ2xvYmFsIGltYWdlcyBzbyB0aGF0IG90aGVyIHBsdWctaW5zIGNhbiBtYWtlIAp1c2Ugb2YgdGhlbS4mbmJzcDsgTm90IG9ubHkgZG9lcyB0aGlzIGltcHJvdmUgZWZmaWNpZW5jeSBieSBhbGxvd2luZyBhIHNpbmdsZSAKSW1hZ2UgaW5zdGFuY2UgdG8gYmUgdXNlZCBhY3Jvc3Mgc2V2ZXJhbCBwbHVnLWlucywgaXQgYWxzbyBoZWxwcyB0byBwcm92aWRlZCAKYSBjb25zaXN0ZW50IGFuZCBpbnRlZ3JhdGVkIGZlZWwgdG8gdGhlIHdvcmtiZW5jaC4mbmJzcDsgSWYgYSBmaWxlLCBmb2xkZXIgb3IgCmJvb2ttYXJrIGxvb2tlZCBkaWZmZXJlbnQgZnJvbSBwbHVnLWluIHRvIHBsdWctaW4gaXQgd291bGQgcmVzdWx0IGluIGEgY29uZnVzaW5nIApleHBlcmllbmNlIGZvciBlbmQtdXNlcnMuIAo8cD5UaGUgdGVjaG5pcXVlIHVzZWQgZm9yIG1ha2luZyBJbWFnZXMgYXZhaWxhYmxlIGluIGEgcGx1Zy1pbidzIEFQSSBtYXkgdmFyeSAKICBiZXR3ZWVuIHBsdWctaW5zLiZuYnNwOyBUaGUgUGxhdGZvcm0gVUkgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGNhbGxlZCA8dHQ+b3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczwvdHQ+LCAKICBhY2Nlc3NpYmxlIGZyb20gdGhlIHdvcmtiZW5jaC4mbmJzcDsgVGhpcyBpbnRlcmZhY2Ugc3VwcGxpZXMgaW1hZ2VzIGFuZCBpbWFnZSAKICBkZXNjcmlwdG9ycyBjb3JyZXNwb25kaW5nIHRvIGEgc2V0IG9mIGtleXMgZGVmaW5lZCBpbiBJU2hhcmVkSW1hZ2VzLiZuYnNwOyBTZWUgCiAgdGhlIEphdmFEb2MgZm9yIHRoYXQgY2xhc3MgZm9yIGRlc2NyaXB0aW9ucyBvZiBhbGwgdGhlIGF2YWlsYWJsZSBtZXRob2RzLiZuYnNwOyAKICBUbyBnaXZlIGFuIGV4YW1wbGUsIHNheSB5b3Ugd2FudCB0byBvYnRhaW4gdGhlIGltYWdlIGZvciBhIGZpbGUgb2JqZWN0LiZuYnNwOyAKICBZb3Ugd291bGQgaW52b2tlIHRoZSBmb2xsb3dpbmc6IAo8cD48dHQ+UGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpfRklMRSk7PC90dD4gCiAgPHA+VGhlIHdvcmtiZW5jaCBpcyBhbHNvIGFjY2Vzc2libGUgZnJvbSA8dHQ+QWJzdHJhY3RVSVBsdWdpbjwvdHQ+LCB3aGljaCB5b3VyIAogICAgcGx1Zy1pbiBjbGFzcyB3aWxsIHR5cGljYWxseSBzdWJjbGFzcy4mbmJzcDsgT3RoZXIgcGx1Zy1pbnMgdXNlIGEgc2ltaWxhciAKICAgIGFwcHJvYWNoIGZvciBzaGFyaW5nIHRoZWlyIGltYWdlcy4mbmJzcDsgRm9yIGV4YW1wbGUsIHRoZSBKYXZhIERldmVsb3BtZW50IAogICAgVG9vbGluZyBzdXBwbGllcyA8dHQ+b3JnLmVjbGlwc2UuamR0LnVpLlNoYXJlZEltYWdlczwvdHQ+IGluIGl0cyBBUEkuIAogIDxwPjxiPkltcG9ydGFudDogPC9iPkltYWdlcyBwcm92aWRlZCBieSB0aGVzZSBBUElzIGFyZSBzaGFyZWQsIHdoaWNoIG1lYW5zIHlvdSAKICAgIDxiPm11c3Qgbm90IDwvYj5kaXNwb3NlIG9mIHRoZW0uJm5ic3A7IEFnYWluLCBmb2xsb3dpbmcgdGhlIGdlbmVyYWwgcnVsZSwgCiAgICBzaW5jZSB5b3UgZGlkbid0IGNyZWF0ZSB0aGUgaW1hZ2UsIGl0J3Mgbm90IHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gZGlzcG9zZSAKICAgIG9mIGl0LiAKICA8cD5JZiB5b3VyIHBsdWctaW4gZGVmaW5lcyBpbWFnZXMgdGhhdCBtYXkgYmUgdXNlZnVsIHRvIG90aGVycywgeW91IG1heSB3YW50IAogICAgdG8gdXNlIGEgc2ltaWxhciBhcHByb2FjaCB0byBtYWtlIHRoZW0gYXZhaWxhYmxlIGluIHlvdXIgQVBJLiZuYnNwOyBLZWVwIGluIAogICAgbWluZCB0aGF0IHRoZSBudW1iZXIgb2YgU1dUIEltYWdlcyBzaGFyZWQgYnkgeW91ciBwbHVnLWluIHNob3VsZCBiZSBzbWFsbCwgCiAgICBzaW5jZSB0aGVzZSBpbWFnZXMgd2lsbCBoYXZlIHRvIHN0YXkgYXJvdW5kIGZvciB0aGUgbGlmZXRpbWUgb2YgeW91ciBwbHVnLWluLiAKICA8aDI+IFdoZXJlIEVsc2UgQ2FuIEkgTG9vayBGb3IgSW5mb3JtYXRpb24gQWJvdXQgSW1hZ2VzPzwvaDI+CiAgSWYgdGhpcyBhcnRpY2xlIGhhcyBsZWZ0IHlvdSBzY3JhdGNoaW5nIHlvdXIgaGVhZCwgZG9uJ3Qgd29ycnkuJm5ic3A7IEVjbGlwc2UgCmhhcyBtYW55IGxheWVycyBvZiBjb21wbGV4aXR5LCBhbmQgaXQgY2FuIHRha2Ugc29tZSB0aW1lIHRvIHdyYXAgeW91ciBoZWFkIGFyb3VuZCAKdGhlIGlzc3VlcyBpbnZvbHZlZC4mbmJzcDsgVGhlIGJlc3QgdGhpbmcgdG8gZG8gaXMgc3RhcnQgd2l0aCBvbmUgb2YgdGhlIGV4YW1wbGVzLCAKc3VjaCBhcyB0aGUgcmVhZG1lIGV4YW1wbGUsIGFuZCBzZWUgd2hhdCBpdCdzIGRvaW5nLiZuYnNwOyBUaGUgZXh0ZW5zaW9uIHBvaW50IApkb2N1bWVudGF0aW9uIGlzIGFuIGV4Y2VsbGVudCBwbGFjZSB0byBsZWFybiBhYm91dCB0aGUgdmFyaW91cyB3YXlzIHRoZSBiYXNlIFVJIApjYW4gYmUgZXh0ZW5kZWQuJm5ic3A7IEFsc28sIHRoZSBlbnRpcmUgUGxhdGZvcm0gaGFzIGV4dGVuc2l2ZSBKYXZhRG9jIHRoYXQgZGVzY3JpYmVzIAplYWNoIGNsYXNzIGFuZCBtZXRob2QgaW4gZGV0YWlsLCB3aGljaCBtYWtlcyBpdCBlYXN5IHRvIGp1c3QgZGl2ZSBpbiBhbmQgc3RhcnRpbmcgCmxlYXJuaW5nIGhvdyBpdCBhbGwgd29ya3MuJm5ic3A7IEFuZCBvZiBjb3Vyc2UsIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Vjb3JuZXIub3JnIj5FY2xpcHNlIApDb3JuZXI8L2E+IGZvcnVtcyBjYW4gYmUgdXNlZCB0byBwb3NlIHF1ZXN0aW9ucyBhbmQgZ2V0IGFuc3dlcnMgZnJvbSBleHBlcmllbmNlZCAKRWNsaXBzZSBkZXZlbG9wZXJzLiAKCjxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFuZCBsb2dvcyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkCnRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvcgpib3RoLjwvc21hbGw+PC9wPgo8cD48c21hbGw+TWljcm9zb2Z0LCBXaW5kb3dzLCBXaW5kb3dzIE5ULCBhbmQgdGhlIFdpbmRvd3MgbG9nbyBhcmUgdHJhZGVtYXJrcyBvZiBNaWNyb3NvZnQgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KPC9ib2R5Pgo8L2h0bWw+