LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogQ09QWVJJR0hUOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgIChDKSBDb3B5cmlnaHQgVGFsaWdlbnQsIEluYy4sICAxOTk2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCAgMTk5Ni0xOTk5ICAgICAqCiogICBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb2dyYW0tUHJvcGVydHkgb2YgSUJNIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICoKKiAgIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uLCBvciBkaXNjbG9zdXJlICAgKgoqICAgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuICAgICAgICAgICAgICAgICAgICAqCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogRmlsZSB0Ymxjb2xsLmgKKgoqIENyZWF0ZWQgYnk6IEhlbGVuYSBTaGloCioKKiBNb2RpZmljYXRpb24gSGlzdG9yeToKKgoqICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgoqICAyLzUvOTcgICAgICBhbGl1ICAgICAgICBBZGRlZCBzdHJlYW1JbiBhbmQgc3RyZWFtT3V0IG1ldGhvZHMuICBBZGRlZAoqICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciB3aGljaCByZWFkcyBSdWxlQmFzZWRDb2xsYXRvciBvYmplY3QgZnJvbQoqICAgICAgICAgICAgICAgICAgICAgICAgICBhIGJpbmFyeSBmaWxlLiAgQWRkZWQgd3JpdGVUb0ZpbGUgbWV0aG9kIHdoaWNoIHN0cmVhbXMKKiAgICAgICAgICAgICAgICAgICAgICAgICAgUnVsZUJhc2VkQ29sbGF0b3Igb3V0IHRvIGEgYmluYXJ5IGZpbGUuICBUaGUgc3RyZWFtSW4KKiAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHN0cmVhbU91dCBtZXRob2RzIHVzZSBpc3RyZWFtIGFuZCBvc3RyZWFtIG9iamVjdHMKKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYmluYXJ5IG1vZGUuCiogIDIvMTIvOTcgICAgIGFsaXUgICAgICAgIE1vZGlmaWVkIHRvIHVzZSBUYWJsZUNvbGxhdGlvbkRhdGEgc3ViLW9iamVjdCB0bwoqICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkIGludmFyaWFudCBkYXRhLgoqICAyLzEzLzk3ICAgICBhbGl1ICAgICAgICBNb3ZlZCBzZXZlcmFsIG1ldGhvZHMgaW50byB0aGlzIGNsYXNzIGZyb20gQ29sbGF0aW9uLgoqICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBhIHByaXZhdGUgUnVsZUJhc2VkQ29sbGF0b3IoTG9jYWxlJikgY29uc3RydWN0b3IsCiogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHVzZWQgYnkgQ29sbGF0b3I6OmNyZWF0ZURlZmF1bHQoKS4gIEdlbmVyYWwKKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW4gdXAuCiogIDIvMjAvOTcgICAgIGhlbGVuYSAgICAgIEFkZGVkIGNsb25lLCBvcGVyYXRvcj09LCBvcGVyYXRvciE9LCBvcGVyYXRvcj0sIGFuZCBjb3B5CiogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yIGFuZCBnZXREeW5hbWljQ2xhc3NJRC4KKiAgMy81Lzk3ICAgICAgYWxpdSAgICAgICAgTW9kaWZpZWQgY29uc3RydWN0RnJvbUZpbGUoKSB0byBhZGQgcGFyYW1ldGVyCiogICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnlpbmcgd2hldGhlciBvciBub3QgYmluYXJ5IGxvYWRpbmcgaXMgdG8gYmUKKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdGVkLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IgZHluYW1pYyBydWxlIGxvYWRpbmcuCiogMDUvMDcvOTcgICAgIGhlbGVuYSAgICAgIEFkZGVkIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIGRldGVjdGlvbi4KKiAgNi8xNy85NyAgICAgaGVsZW5hICAgICAgQWRkZWQgSURFTlRJQ0FMIHN0cmVuZ3RoIGZvciBjb21wYXJlLCBjaGFuZ2VkIGdldFJ1bGVzIHRvIAoqICAgICAgICAgICAgICAgICAgICAgICAgICB1c2UgTWVyZ2VDb2xsYXRpb246OmdldFBhdHRlcm4uCiogIDYvMjAvOTcgICAgIGhlbGVuYSAgICAgIEphdmEgY2xhc3MgbmFtZSBjaGFuZ2UuCiogIDgvMTgvOTcgICAgIGhlbGVuYSAgICAgIEFkZGVkIGludGVybmFsIEFQSSBkb2N1bWVudGF0aW9uLgoqIDA5LzAzLzk3ICAgICBoZWxlbmEgICAgICBBZGRlZCBjcmVhdGVDb2xsYXRpb25LZXlWYWx1ZXMoKS4KKiAwMi8xMC85OCAgICAgZGFtaWJhICAgICAgQWRkZWQgY29tcGFyZSB3aXRoICJsZW5ndGgiIHBhcmFtZXRlcgoqIDA4LzA1Lzk4ICAgICBlcm0gICAgICAgICBTeW5jaGVkIHdpdGggMS4yIHZlcnNpb24gb2YgUnVsZUJhc2VkQ29sbGF0b3IuamF2YQoqIDA0LzIzLzk5ICAgICBzdGVwaGVuICAgICBSZW1vdmVkIEVEZWNvbXBvc2l0aW9uTW9kZSwgbWVyZ2VkIHdpdGgKKiAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ybWFsaXplcjo6RU1vZGUKKiAwNi8xNC85OSAgICAgc3RlcGhlbiAgICAgUmVtb3ZlZCBrUmVzb3VyY2VCdW5kbGVTdWZmaXgKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgojaWZuZGVmIFRCTENPTExfSAojZGVmaW5lIFRCTENPTExfSAoKI2luY2x1ZGUgInV0eXBlcy5oIgojaW5jbHVkZSAiY29sbC5oIgojaW5jbHVkZSAiY2hhcml0ZXIuaCIKI2luY2x1ZGUgInVuaXN0ci5oIgojaW5jbHVkZSAic29ydGtleS5oIgojaW5jbHVkZSAibm9ybWx6ci5oIgoKY2xhc3MgVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQ7CmNsYXNzIFZlY3Rvck9mSW50OwpjbGFzcyBWZWN0b3JPZlBUb0NvbnRyYWN0VGFibGU7CmNsYXNzIFZlY3Rvck9mUFRvRXhwYW5kVGFibGU7CmNsYXNzIE1lcmdlQ29sbGF0aW9uOwpjbGFzcyBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I7CmNsYXNzIFJ1bGVCYXNlZENvbGxhdG9yU3RyZWFtZXI7CgovKioKICogVGhlIFJ1bGVCYXNlZENvbGxhdG9yIGNsYXNzIHByb3ZpZGVzIHRoZSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgQ29sbGF0b3IsCiAqIHVzaW5nIGRhdGEtZHJpdmVuIHRhYmxlcy4gIFRoZSB1c2VyIGNhbiBjcmVhdGUgYSBjdXN0b21pemVkIHRhYmxlLWJhc2VkCiAqIGNvbGxhdGlvbi4KICogPFA+CiAqIFJ1bGVCYXNlZENvbGxhdG9yIG1hcHMgY2hhcmFjdGVycyB0byBjb2xsYXRpb24ga2V5cy4KICogPHA+CiAqIFRhYmxlIENvbGxhdGlvbiBoYXMgdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnMgZm9yIGVmZmljaWVuY3kgKG90aGVyCiAqIHN1YmNsYXNzZXMgbWF5IGJlIHVzZWQgZm9yIG1vcmUgY29tcGxleCBsYW5ndWFnZXMpIDoKICogICAgICAgPHA+MS4gSWYgdGhlIEZyZW5jaCBzZWNvbmRhcnkgb3JkZXJpbmcgaXMgc3BlY2lmaWVkIGluIGEgY29sbGF0aW9uIG9iamVjdCwgCiAqICAgICAgICAgICAgIGl0IGlzIGFwcGxpZWQgdG8gdGhlIHdob2xlIG9iamVjdC4KICogICAgICAgPHA+Mi4gQWxsIG5vbi1tZW50aW9uZWQgVW5pY29kZSBjaGFyYWN0ZXJzIGFyZSBhdCB0aGUgZW5kIG9mIHRoZQogKiAgICAgICAgICAgICBjb2xsYXRpb24gb3JkZXIuCiAqICAgICAgIDxwPjMuIFByaXZhdGUgdXNlIGNoYXJhY3RlcnMgYXJlIHRyZWF0ZWQgYXMgaWRlbnRpY2FsLiAgVGhlIHByaXZhdGUKICogICAgICAgICAgICAgdXNlIGFyZWEgaW4gVW5pY29kZSBpcyAweEU4MDAtMHhGOEZGLgogKiA8cD5UaGUgY29sbGF0aW9uIHRhYmxlIGlzIGNvbXBvc2VkIG9mIGEgbGlzdCBvZiBjb2xsYXRpb24gcnVsZXMsIHdoZXJlIGVhY2gKICogcnVsZSBpcyBvZiB0aHJlZSBmb3JtczoKICogPHByZT4KICogLiAgICAmbHQ7IG1vZGlmaWVyID4KICogLiAgICAmbHQ7IHJlbGF0aW9uID4gJmx0OyB0ZXh0LWFyZ3VtZW50ID4KICogLiAgICAmbHQ7IHJlc2V0ID4gJmx0OyB0ZXh0LWFyZ3VtZW50ID4KICogPC9wcmU+CiAqIFRoZSBmb2xsb3dpbmcgZGVtb25zdHJhdGVzIGhvdyB0byBjcmVhdGUgeW91ciBvd24gY29sbGF0aW9uIHJ1bGVzOgogKiA8VUwgVHlwZT1yb3VuZD4KICogICAgPExJPjxzdHJvbmc+VGV4dCBBcmd1bWVudDwvc3Ryb25nPjogQSB0ZXh0IGFyZ3VtZW50IGlzIGFueSBzZXF1ZW5jZSBvZgogKiAgICAgICAgY2hhcmFjdGVycywgZXhjbHVkaW5nIHNwZWNpYWwgY2hhcmFjdGVycyAodGhhdCBpcywgd2hpdGVzcGFjZQogKiAgICAgICAgY2hhcmFjdGVycyBhbmQgdGhlIGNoYXJhY3RlcnMgdXNlZCBpbiBtb2RpZmllciwgcmVsYXRpb24gYW5kIHJlc2V0KS4KICogICAgICAgIElmIHRob3NlIGNoYXJhY3RlcnMgYXJlIGRlc2lyZWQsIHlvdSBjYW4gcHV0IHRoZW0gaW4gc2luZ2xlIHF1b3RlcwogKiAgICAgICAgKGUuZy4gYW1wZXJzYW5kID0+ICcmJykuPFA+CiAqICAgIDxMST48c3Ryb25nPk1vZGlmaWVyPC9zdHJvbmc+OiBUaGVyZSBpcyBhIHNpbmdsZSBtb2RpZmllciwKICogICAgICAgIHdoaWNoIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGF0IGFsbCBzZWNvbmRhcnkgZGlmZmVyZW5jZXMgYXJlCiAqICAgICAgICBzb3J0ZWQgYmFja3dhcmRzLgogKiAgICAgICAgPHA+J0AnIDogSW5kaWNhdGVzIHRoYXQgc2Vjb25kYXJ5IGRpZmZlcmVuY2VzLCBzdWNoIGFzIGFjY2VudHMsIGFyZSAKICogICAgICAgICAgICAgICAgIHNvcnRlZCBiYWNrd2FyZHMsIGFzIGluIEZyZW5jaC48UD4KICogICAgPExJPjxzdHJvbmc+UmVsYXRpb248L3N0cm9uZz46IFRoZSByZWxhdGlvbnMgYXJlIHRoZSBmb2xsb3dpbmc6CiAqICAgICAgICA8VUwgVHlwZT1zcXVhcmU+CiAqICAgICAgICAgICAgPExJPicmbHQ7JyA6IEdyZWF0ZXIsIGFzIGEgbGV0dGVyIGRpZmZlcmVuY2UgKHByaW1hcnkpCiAqICAgICAgICAgICAgPExJPic7JyA6IEdyZWF0ZXIsIGFzIGFuIGFjY2VudCBkaWZmZXJlbmNlIChzZWNvbmRhcnkpCiAqICAgICAgICAgICAgPExJPicsJyA6IEdyZWF0ZXIsIGFzIGEgY2FzZSBkaWZmZXJlbmNlICh0ZXJ0aWFyeSkKICogICAgICAgICAgICA8TEk+Jz0nIDogRXF1YWwKICogICAgICAgIDwvVUw+PFA+CiAqICAgIDxMST48c3Ryb25nPlJlc2V0PC9zdHJvbmc+OiBUaGVyZSBpcyBhIHNpbmdsZSByZXNldCwKICogICAgICAgIHdoaWNoIGlzIHVzZWQgcHJpbWFyaWx5IGZvciBjb250cmFjdGlvbnMgYW5kIGV4cGFuc2lvbnMsIGJ1dCB3aGljaAogKiAgICAgICAgY2FuIGFsc28gYmUgdXNlZCB0byBhZGQgYSBtb2RpZmljYXRpb24gYXQgdGhlIGVuZCBvZiBhIHNldCBvZiBydWxlcy4KICogICAgICAgIDxwPicmJyA6IEluZGljYXRlcyB0aGF0IHRoZSBuZXh0IHJ1bGUgZm9sbG93cyB0aGUgcG9zaXRpb24gdG8gd2hlcmUKICogICAgICAgICAgICB0aGUgcmVzZXQgdGV4dC1hcmd1bWVudCB3b3VsZCBiZSBzb3J0ZWQuCiAqCiAqIDxwPgogKiBUaGlzIHNvdW5kcyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gaXQgaXMgaW4gcHJhY3RpY2UuIEZvciBleGFtcGxlLCB0aGUKICogZm9sbG93aW5nIGFyZSBlcXVpdmFsZW50IHdheXMgb2YgZXhwcmVzc2luZyB0aGUgc2FtZSB0aGluZzoKICogPHByZT4KICogLiAgICBhICZsdDsgYiAmbHQ7IGMKICogLiAgICBhICZsdDsgYiAmIGIgJmx0OyBjCiAqIC4gICAgYSAmbHQ7IGMgJiBhICZsdDsgYgogKiA8L3ByZT4KICogTm90aWNlIHRoYXQgdGhlIG9yZGVyIGlzIGltcG9ydGFudCwgYXMgdGhlIHN1YnNlcXVlbnQgaXRlbSBnb2VzIGltbWVkaWF0ZWx5CiAqIGFmdGVyIHRoZSB0ZXh0LWFyZ3VtZW50LiBUaGUgZm9sbG93aW5nIGFyZSBub3QgZXF1aXZhbGVudDoKICogPHByZT4KICogLiAgICBhICZsdDsgYiAmIGEgJmx0OyBjCiAqIC4gICAgYSAmbHQ7IGMgJiBhICZsdDsgYgogKiA8L3ByZT4KICogRWl0aGVyIHRoZSB0ZXh0LWFyZ3VtZW50IG11c3QgYWxyZWFkeSBiZSBwcmVzZW50IGluIHRoZSBzZXF1ZW5jZSwgb3Igc29tZQogKiBpbml0aWFsIHN1YnN0cmluZyBvZiB0aGUgdGV4dC1hcmd1bWVudCBtdXN0IGJlIHByZXNlbnQuIChlLmcuICJhICZsdDsgYiAmIGFlICZsdDsKICogZSIgaXMgdmFsaWQgc2luY2UgImEiIGlzIHByZXNlbnQgaW4gdGhlIHNlcXVlbmNlIGJlZm9yZSAiYWUiIGlzIHJlc2V0KS4gSW4KICogdGhpcyBsYXR0ZXIgY2FzZSwgImFlIiBpcyBub3QgZW50ZXJlZCBhbmQgdHJlYXRlZCBhcyBhIHNpbmdsZSBjaGFyYWN0ZXI7CiAqIGluc3RlYWQsICJlIiBpcyBzb3J0ZWQgYXMgaWYgaXQgd2VyZSBleHBhbmRlZCB0byB0d28gY2hhcmFjdGVyczogImEiCiAqIGZvbGxvd2VkIGJ5IGFuICJlIi4gVGhpcyBkaWZmZXJlbmNlIGFwcGVhcnMgaW4gbmF0dXJhbCBsYW5ndWFnZXM6IGluCiAqIHRyYWRpdGlvbmFsIFNwYW5pc2ggImNoIiBpcyB0cmVhdGVkIGFzIHRob3VnaCBpdCBjb250cmFjdHMgdG8gYSBzaW5nbGUKICogY2hhcmFjdGVyIChleHByZXNzZWQgYXMgImMgJmx0OyBjaCAmbHQ7IGQiKSwgd2hpbGUgaW4gdHJhZGl0aW9uYWwgR2VybWFuICLkIgogKiAoYS11bWxhdXQpIGlzIHRyZWF0ZWQgYXMgdGhvdWdoIGl0IGV4cGFuZHMgdG8gdHdvIGNoYXJhY3RlcnMgKGV4cHJlc3NlZCBhcwogKiAiYSAmIGFlIDsg5CAmbHQ7IGIiKS4KICogPHA+PHN0cm9uZz5JZ25vcmFibGUgQ2hhcmFjdGVyczwvc3Ryb25nPgogKiA8cD5Gb3IgaWdub3JhYmxlIGNoYXJhY3RlcnMsIHRoZSBmaXJzdCBydWxlIG11c3Qgc3RhcnQgd2l0aCBhIHJlbGF0aW9uICh0aGUKICogZXhhbXBsZXMgd2UgaGF2ZSB1c2VkIGFib3ZlIGFyZSByZWFsbHkgZnJhZ21lbnRzOyAiYSAmbHQ7IGIiIHJlYWxseSBzaG91bGQgYmUKICogIiZsdDsgYSAmbHQ7IGIiKS4gSWYsIGhvd2V2ZXIsIHRoZSBmaXJzdCByZWxhdGlvbiBpcyBub3QgIiZsdDsiLCB0aGVuIGFsbCB0aGUgCiAqIHRleHQtYXJndW1lbnRzIHVwIHRvIHRoZSBmaXJzdCAiJmx0OyIgYXJlIGlnbm9yYWJsZS4gRm9yIGV4YW1wbGUsICIsIC0gJmx0OyBhICZsdDsgYiIKICogbWFrZXMgIi0iIGFuIGlnbm9yYWJsZSBjaGFyYWN0ZXIsIGFzIHdlIHNhdyBlYXJsaWVyIGluIHRoZSB3b3JkCiAqICJibGFjay1iaXJkcyIuIEluIHRoZSBzYW1wbGVzIGZvciBkaWZmZXJlbnQgbGFuZ3VhZ2VzLCB5b3Ugc2VlIHRoYXQgbW9zdAogKiBhY2NlbnRzIGFyZSBpZ25vcmFibGUuCiAqIDxwPjxzdHJvbmc+Tm9ybWFsaXphdGlvbiBhbmQgQWNjZW50czwvc3Ryb25nPgogKiA8cD5UaGUgQ29sbGF0b3Igb2JqZWN0IGF1dG9tYXRpY2FsbHkgbm9ybWFsaXplcyB0ZXh0IGludGVybmFsbHkgdG8gc2VwYXJhdGUKICogYWNjZW50cyBmcm9tIGJhc2UgY2hhcmFjdGVycyB3aGVyZSBwb3NzaWJsZS4gVGhpcyBpcyBkb25lIGJvdGggd2hlbgogKiBwcm9jZXNzaW5nIHRoZSBydWxlcywgYW5kIHdoZW4gY29tcGFyaW5nIHR3byBzdHJpbmdzLiBDb2xsYXRvciBhbHNvIHVzZXMKICogdGhlIFVuaWNvZGUgY2Fub25pY2FsIG1hcHBpbmcgdG8gZW5zdXJlIHRoYXQgY29tYmluaW5nIHNlcXVlbmNlcyBhcmUgc29ydGVkCiAqIHByb3Blcmx5IChmb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXcuY29tL2RldnByZXNzIj4KICogVGhlIFVuaWNvZGUgU3RhbmRhcmQsIFZlcnNpb24gMi4wPC9BPi4pPC9QPgogKiA8cD48c3Ryb25nPkVycm9yczwvc3Ryb25nPgogKiA8cD5UaGUgZm9sbG93aW5nIGFyZSBlcnJvcnM6CiAqIDxVTCBUeXBlPXJvdW5kPgogKiAgICAgPExJPkEgdGV4dC1hcmd1bWVudCBjb250YWlucyB1bnF1b3RlZCBwdW5jdHVhdGlvbiBzeW1ib2xzCiAqICAgICAgICAoZS5nLiAiYSAmbHQ7IGItYyAmbHQ7IGQiKS4KICogICAgIDxMST5BIHJlbGF0aW9uIG9yIHJlc2V0IGNoYXJhY3RlciBub3QgZm9sbG93ZWQgYnkgYSB0ZXh0LWFyZ3VtZW50CiAqICAgICAgICAoZS5nLiAiYSAmbHQ7ICwgYiIpLgogKiAgICAgPExJPkEgcmVzZXQgd2hlcmUgdGhlIHRleHQtYXJndW1lbnQgKG9yIGFuIGluaXRpYWwgc3Vic3RyaW5nIG9mIHRoZQogKiAgICAgICAgIHRleHQtYXJndW1lbnQpIGlzIG5vdCBhbHJlYWR5IGluIHRoZSBzZXF1ZW5jZS4KICogICAgICAgICAoZS5nLiAiYSAmbHQ7IGIgJiBlICZsdDsgZiIpCiAqIDwvVUw+CiAqIDxwcmU+CiAqIC4gICAgRXhhbXBsZXM6CiAqIC4gICAgU2ltcGxlOiAgICAgIiZsdDsgYSAmbHQ7IGIgJmx0OyBjICZsdDsgZCIKICogLiAgICBOb3J3ZWdpYW46ICAiJmx0OyBhLEEmbHQ7IGIsQiZsdDsgYyxDJmx0OyBkLEQmbHQ7IGUsRSZsdDsgZixGJmx0OyBnLEcmbHQ7IGgsSCZsdDsgaSxJJmx0OyBqLEoKICogLiAgICAgICAgICAgICAgICAgJmx0OyBrLEsmbHQ7IGwsTCZsdDsgbSxNJmx0OyBuLE4mbHQ7IG8sTyZsdDsgcCxQJmx0OyBxLFEmbHQ7IHIsUiZsdDsgcyxTJmx0OyB0LFQKICogLiAgICAgICAgICAgICAgICAgJmx0OyB1LFUmbHQ7IHYsViZsdDsgdyxXJmx0OyB4LFgmbHQ7IHksWSZsdDsgeixaCiAqIC4gICAgICAgICAgICAgICAgICZsdDsg5T1hsCzFPUGwCiAqIC4gICAgICAgICAgICAgICAgIDthYSxBQSZsdDsg5izGJmx0OyD4LNgiCiAqIDwvcHJlPgogKiA8cD5UbyBjcmVhdGUgYSB0YWJsZS1iYXNlZCBjb2xsYXRpb24gb2JqZWN0LCBzaW1wbHkgc3VwcGx5IHRoZSBjb2xsYXRpb24KICogcnVsZXMgdG8gdGhlIFJ1bGVCYXNlZENvbGxhdG9yIGNvbnRydWN0b3IuICBGb3IgZXhhbXBsZToKICogPHByZT4KICogLiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFpFUk9fRVJST1I7CiAqIC4gICAgUnVsZUJhc2VkQ29sbGF0b3IgKm15U2ltcGxlID0gbmV3IFJ1bGVCYXNlZENvbGxhdG9yKFNpbXBsZSwgc3RhdHVzKTsKICogPC9wcmU+CiAqIDxwPkFub3RoZXIgZXhhbXBsZToKICogPHByZT4KICogLiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFpFUk9fRVJST1I7CiAqIC4gICAgUnVsZUJhc2VkQ29sbGF0b3IgKm15Tm9yd2VnaWFuID0gbmV3IFJ1bGVCYXNlZENvbGxhdG9yKE5vcndlZ2lhbiwgc3RhdHVzKTsKICogPC9wcmU+CiAqIFRvIGFkZCBydWxlcyBvbiB0b3Agb2YgYW4gZXhpc3RpbmcgdGFibGUsIHNpbXBseSBzdXBwbHkgdGhlIG9yZ2luYWwgcnVsZXMKICogYW5kIG1vZGlmaWNhdGlvbnMgdG8gUnVsZUJhc2VkQ29sbGF0b3IgY29uc3RydWN0b3IuICBGb3IgZXhhbXBsZSwKICogPHByZT4KICogLiAgICAgVHJhZGl0aW9uYWwgU3BhbmlzaCAoZnJhZ21lbnQpOiAuLi4gJiBDICZsdDsgY2ggLCBjSCAsIENoICwgQ0ggLi4uCiAqIC4gICAgIEdlcm1hbiAoZnJhZ21lbnQpIDogLi4uJmx0OyB5ICwgWSAmbHQ7IHogLCBaCiAqIC4gICAgICAgICAgICAgICAgICAgICAgICAgJiBBRSwgxCAmIEFFLCDkIAogKiAuICAgICAgICAgICAgICAgICAgICAgICAgICYgT0UgLCDWICYgT0UsIPYgCiAqIC4gICAgICAgICAgICAgICAgICAgICAgICAgJiBVRSAsINwgJiBVRSwg/CAKICogLiAgICAgU3ltYm9scyAoZnJhZ21lbnQpOiAuLi4mbHQ7IHksIFkgJmx0OyB6ICwgWgogKiAuICAgICAgICAgICAgICAgICAgICAgICAgICYgUXVlc3Rpb24tbWFyayA7ICc/JwogKiAuICAgICAgICAgICAgICAgICAgICAgICAgICYgQW1wZXJzYW5kIDsgJyYnCiAqIC4gICAgICAgICAgICAgICAgICAgICAgICAgJiBEb2xsYXItc2lnbiA7ICckJwogKiA8cD5UbyBjcmVhdGUgYSBjb2xsYXRpb24gb2JqZWN0IGZvciB0cmFkaXRpb25hbCBTcGFuaXNoLCB0aGUgdXNlciBjYW4gdGFrZQogKiB0aGUgRW5nbGlzaCBjb2xsYXRpb24gcnVsZXMgYW5kIGFkZCB0aGUgYWRkaXRpb25hbCBydWxlcyB0byB0aGUgdGFibGUuCiAqIEZvciBleGFtcGxlOgogKiA8cHJlPgogKiAuICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFpFUk9fRVJST1I7CiAqIC4gICAgIFVuaWNvZGVTdHJpbmcgcnVsZXMoREVGQVVMVFJVTEVTKTsKICogLiAgICAgcnVsZXMgKz0gIiYgQyAmbHQ7IGNoLCBjSCwgQ2gsIENIIjsKICogLiAgICAgUnVsZUJhc2VkQ29sbGF0b3IgKm15U3BhbmlzaCA9IG5ldyBSdWxlQmFzZWRDb2xsYXRvcihydWxlcywgc3RhdHVzKTsKICogPC9wcmU+CiAqIDxwPkluIG9yZGVyIHRvIHNvcnQgc3ltYm9scyBpbiB0aGUgc2ltaWxpYXIgb3JkZXIgb2Ygc29ydGluZyB0aGVpcgogKiBhbHBoYWJldGljIGVxdWl2YWxlbnRzLCB5b3UgY2FuIGRvIHRoZSBmb2xsb3dpbmcsCiAqIDxwcmU+CiAqIC4gICAgIFVFcnJvckNvZGUgc3RhdHVzID0gWkVST19FUlJPUjsKICogLiAgICAgVW5pY29kZVN0cmluZyBydWxlcyhERUZBVUxUUlVMRVMpOwogKiAuICAgICBydWxlcyArPSAiJiBRdWVzdGlvbi1tYXJrIDsgJz8nICYgQW1wZXJzYW5kIDsgJyYnICYgRG9sbGFyLXNpZ24gOyAnJCcgIjsKICogLiAgICAgUnVsZUJhc2VkQ29sbGF0b3IgKm15VGFibGUgPSBuZXcgUnVsZUJhc2VkQ29sbGF0b3IocnVsZXMsIHN0YXR1cyk7CiAqIDwvcHJlPgogKiA8cD5Bbm90aGVyIHdheSBvZiBjcmVhdGluZyB0aGUgdGFibGUtYmFzZWQgY29sbGF0aW9uIG9iamVjdCwgbXlTaW1wbGUsCiAqIGlzOgogKiA8cHJlPgogKiAuICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFpFUk9fRVJST1I7CiAqIC4gICAgIFJ1bGVCYXNlZENvbGxhdG9yICpteVNpbXBsZSA9IG5ldwogKiAuICAgICAgICAgICBSdWxlQmFzZWRDb2xsYXRvcigiICZsdDsgYSAmbHQ7IGIgJiBiICZsdDsgYyAmIGMgJmx0OyBkIiwgc3RhdHVzKTsKICogPC9wcmU+CiAqIE9yLAogKiA8cHJlPgogKiAuICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFpFUk9fRVJST1I7CiAqIC4gICAgIFJ1bGVCYXNlZENvbGxhdG9yICpteVNpbXBsZSA9IG5ldwogKiAuICAgICAgICAgICBSdWxlQmFzZWRDb2xsYXRvcigiICZsdDsgYSAmbHQ7IGIgJmx0OyBkICYgYiAmbHQ7IGMiLCBzdGF0dXMpOwogKiA8L3ByZT4KICogQmVjYXVzZSAiICZsdDsgYSAmbHQ7IGIgJmx0OyBjICZsdDsgZCIgaXMgdGhlIHNhbWUgYXMgImEgJmx0OyBiICZsdDsgZCAmIGIgJmx0OyBjIiBvcgogKiAiJmx0OyBhICZsdDsgYiAmIGIgJmx0OyBjICYgYyAmbHQ7IGQiLgogKgogKiA8cD5UbyBjb21iaW5lIGNvbGxhdGlvbnMgZnJvbSB0d28gbG9jYWxlcywgKHdpdGhvdXQgZXJyb3IgaGFuZGxpbmcgZm9yIGNsYXJpdHkpCiAqIDxwcmU+CiAqIC4gICAgLy8gQ3JlYXRlIGFuIGVuX1VTIENvbGxhdG9yIG9iamVjdAogKiAuICAgIExvY2FsZSBsb2NhbGVfZW5fVVMoImVuIiwgIlVTIiwgIiIpOwogKiAuICAgIFJ1bGVCYXNlZENvbGxhdG9yKiBlbl9VU0NvbGxhdG9yID0gKFJ1bGVCYXNlZENvbGxhdG9yKikKICogLiAgICAgICAgQ29sbGF0b3I6OmNyZWF0ZUluc3RhbmNlKCBsb2NhbGVfZW5fVVMsIHN1Y2Nlc3MgKTsKICogLgogKiAuICAgIC8vIENyZWF0ZSBhIGRhX0RLIENvbGxhdG9yIG9iamVjdAogKiAuICAgIExvY2FsZSBsb2NhbGVfZGFfREsoImRhIiwgIkRLIiwgIiIpOwogKiAuICAgIFJ1bGVCYXNlZENvbGxhdG9yKiBkYV9ES0NvbGxhdG9yID0gKFJ1bGVCYXNlZENvbGxhdG9yKikKICogLiAgICAgICAgQ29sbGF0b3I6OmNyZWF0ZUluc3RhbmNlKCBsb2NhbGVfZGFfREssIHN1Y2Nlc3MgKTsKICogLgogKiAuICAgIC8vIENvbWJpbmUgdGhlIHR3bwogKiAuICAgIC8vIEZpcnN0LCBnZXQgdGhlIGNvbGxhdGlvbiBydWxlcyBmcm9tIGVuX1VTQ29sbGF0b3IKICogLiAgICBVbmljb2RlU3RyaW5nIHJ1bGVzID0gZW5fVVNDb2xsYXRvci0+Z2V0UnVsZXMoKTsKICogLiAgICAvLyBTZWNvbmQsIGdldCB0aGUgY29sbGF0aW9uIHJ1bGVzIGZyb20gZGFfREtDb2xsYXRvcgogKiAuICAgIHJ1bGVzICs9IGRhX0RLQ29sbGF0b3ItPmdldFJ1bGVzKCk7CiAqIC4gICAgUnVsZUJhc2VkQ29sbGF0b3IqIG5ld0NvbGxhdG9yID0gbmV3IFJ1bGVCYXNlZENvbGxhdG9yKCBydWxlcywgc3VjY2VzcyApOwogKiAuICAgIC8vIG5ld0NvbGxhdG9yIGhhcyB0aGUgY29tYmluZWQgcnVsZXMKICogPC9wcmU+CiAqIDxwPkFub3RoZXIgbW9yZSBpbnRlcmVzdGluZyBleGFtcGxlIHdvdWxkIGJlIHRvIG1ha2UgY2hhbmdlcyBvbiBhbiBleGlzdGluZwogKiB0YWJsZSB0byBjcmVhdGUgYSBuZXcgY29sbGF0aW9uIG9iamVjdC4gIEZvciBleGFtcGxlLCBhZGQKICogIiYgQyAmbHQ7IGNoLCBjSCwgQ2gsIENIIiB0byB0aGUgZW5fVVNDb2xsYXRpb24gb2JqZWN0IHRvIGNyZWF0ZSB5b3VyIG93bgogKiBFbmdsaXNoIGNvbGxhdGlvbiBvYmplY3QsCiAqIDxwcmU+CiAqIC4gICAgLy8gQ3JlYXRlIGEgbmV3IENvbGxhdG9yIG9iamVjdCB3aXRoIGFkZGl0aW9uYWwgcnVsZXMKICogLiAgICBydWxlcyA9IGVuX1VTQ29sbGF0b3ItPmdldFJ1bGVzKCk7CiAqIC4gICAgcnVsZXMgKz0gIiYgQyA8IGNoLCBjSCwgQ2gsIENIIjsKICogLiAgICBSdWxlQmFzZWRDb2xsYXRvciogbXlDb2xsYXRvciA9IG5ldyBSdWxlQmFzZWRDb2xsYXRvciggcnVsZXMsIHN1Y2Nlc3MgKTsKICogLiAgICAvLyBteUNvbGxhdG9yIGNvbnRhaW5zIHRoZSBuZXcgcnVsZXMKICogPC9wcmU+CiAqCiAqIDxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGNoYW5nZSB0aGUgb3JkZXIgb2YKICogbm9uLXNwYWNpbmcgYWNjZW50cywKICogPHByZT4KICogLiAgICAgVUNoYXIgY29udGVudHNbXSA9IHsKICogLiAgICAgICAgICc9JywgMHgwMzAxLCAnOycsIDB4MDMwMCwgJzsnLCAweDAzMDIsCiAqIC4gICAgICAgICAnOycsIDB4MDMwOCwgJzsnLCAweDAzMjcsICcsJywgMHgwMzAzLCAgICAvLyBtYWluIGFjY2VudHMKICogLiAgICAgICAgICc7JywgMHgwMzA0LCAnOycsIDB4MDMwNSwgJzsnLCAweDAzMDYsICAgIC8vIG1haW4gYWNjZW50cwogKiAuICAgICAgICAgJzsnLCAweDAzMDcsICc7JywgMHgwMzA5LCAnOycsIDB4MDMwQSwgICAgLy8gbWFpbiBhY2NlbnRzCiAqIC4gICAgICAgICAnOycsIDB4MDMwQiwgJzsnLCAweDAzMEMsICc7JywgMHgwMzBELCAgICAvLyBtYWluIGFjY2VudHMKICogLiAgICAgICAgICc7JywgMHgwMzBFLCAnOycsIDB4MDMwRiwgJzsnLCAweDAzMTAsICAgIC8vIG1haW4gYWNjZW50cwogKiAuICAgICAgICAgJzsnLCAweDAzMTEsICc7JywgMHgwMzEyLCAgICAgICAgICAgICAgICAgLy8gbWFpbiBhY2NlbnRzCiAqIC4gICAgICAgICAnJmx0OycsICdhJywgJywnLCAnQScsICc7JywgJ2EnLCAnZScsICcsJywgJ0EnLCAnRScsCiAqIC4gICAgICAgICAnOycsIDB4MDBlNiwgJywnLCAweDAwYzYsICcmbHQ7JywgJ2InLCAnLCcsICdCJywKICogLiAgICAgICAgICcmbHQ7JywgJ2MnLCAnLCcsICdDJywgJyZsdDsnLCAnZScsICcsJywgJ0UnLCAnJicsIAogKiAuICAgICAgICAgJ0MnLCAnJmx0OycsICdkJywgJywnLCAnRCcsIDAgfTsKICogLiAgICAgVW5pY29kZVN0cmluZyBvbGRSdWxlcyhjb250ZW50cyk7CiAqIC4gICAgIFVFcnJvckNvZGUgc3RhdHVzID0gWkVST19FUlJPUjsKICogLiAgICAgLy8gY2hhbmdlIHRoZSBvcmRlciBvZiBhY2NlbnQgY2hhcmFjdGVycwogKiAuICAgICBVQ2hhciBhZGRPbltdID0geyAnJicsICcsJywgMHgwMzAwLCAnOycsIDB4MDMwOCwgJzsnLCAweDAzMDIsIDAgfTsKICogLiAgICAgb2xkUnVsZXMgKz0gYWRkT247CiAqIC4gICAgIFJ1bGVCYXNlZENvbGxhdG9yICpteUNvbGxhdGlvbiA9IG5ldyBSdWxlQmFzZWRDb2xsYXRvcihvbGRSdWxlcywgc3RhdHVzKTsKICogPC9wcmU+CiAqCiAqIDxwPiBUaGUgbGFzdCBleGFtcGxlIHNob3dzIGhvdyB0byBwdXQgbmV3IHByaW1hcnkgb3JkZXJpbmcgaW4gYmVmb3JlIHRoZQogKiBkZWZhdWx0IHNldHRpbmcuIEZvciBleGFtcGxlLCBpbiBKYXBhbmVzZSBjb2xsYXRpb24sIHlvdSBjYW4gZWl0aGVyIHNvcnQKICogRW5nbGlzaCBjaGFyYWN0ZXJzIGJlZm9yZSBvciBhZnRlciBKYXBhbmVzZSBjaGFyYWN0ZXJzLAogKiA8cHJlPgogKiAuICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFpFUk9fRVJST1I7CiAqIC4gICAgIC8vIGdldCBlbl9VUyBjb2xsYXRpb24gcnVsZXMKICogLiAgICAgUnVsZUJhc2VkQ29sbGF0b3IqIGVuX1VTQ29sbGF0aW9uID0gCiAqIC4gICAgICAgICAoUnVsZUJhc2VkQ29sbGF0b3IqKSBDb2xsYXRvcjo6Y3JlYXRlSW5zdGFuY2UoTG9jYWxlOjpVUywgc3RhdHVzKTsKICogLiAgICAgLy8gQWx3YXlzIGNoZWNrIHRoZSBlcnJvciBjb2RlIGFmdGVyIGVhY2ggY2FsbC4KICogLiAgICAgaWYgKEZBSUxVUkUoc3RhdHVzKSkgcmV0dXJuOwogKiAuICAgICAvLyBhZGQgYSBmZXcgSmFwYW5lc2UgY2hhcmFjdGVyIHRvIHNvcnQgYmVmb3JlIEVuZ2xpc2ggY2hhcmFjdGVycwogKiAuICAgICAvLyBzdXBwb3NlIHRoZSBsYXN0IGNoYXJhY3RlciBiZWZvcmUgdGhlIGZpcnN0IGJhc2UgbGV0dGVyICdhJyBpbgogKiAuICAgICAvLyB0aGUgRW5nbGlzaCBjb2xsYXRpb24gcnVsZSBpcyAweDIyMTIKICogLiAgICAgVUNoYXIgamFTdHJpbmdbXSA9IHsgJyYnLCAweDIyMTIsICcmbHQ7JywgMHgzMDQxLCAnLCcsIDB4MzA0MiwgJyZsdDsnLCAweDMwNDMsICcsJywgMHgzMDQ0LCAwIH07CiAqIC4gICAgIFVuaWNvZGVTdHJpbmcgcnVsZXMoIGVuX1VTQ29sbGF0aW9uLT5nZXRSdWxlcygpICk7CiAqIC4gICAgIHJ1bGVzICs9IGphU3RyaW5nOwogKiAuICAgICBSdWxlQmFzZWRDb2xsYXRvciAqbXlKYXBhbmVzZUNvbGxhdGlvbiA9IG5ldyBSdWxlQmFzZWRDb2xsYXRvcihydWxlcywgc3RhdHVzKTsKICogPC9wcmU+CiAqIDxwPjxzdHJvbmc+Tk9URTwvc3Ryb25nPjogVHlwaWNhbGx5LCBhIGNvbGxhdGlvbiBvYmplY3QgaXMgY3JlYXRlZCB3aXRoCiAqIENvbGxhdG9yOjpjcmVhdGVJbnN0YW5jZSgpLgogKiA8cD4KICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiA8Y29kZT5SdWxlQmFzZWRDb2xsYXRvcjwvY29kZT5zIHdpdGggZGlmZmVyZW50IExvY2FsZSwKICogQ29sbGF0aW9uU3RyZW5ndGggYW5kIERlY29tcG9zaXRpb24gbW9kZSBzZXR0aW5ncyB3aWxsIHJldHVybiBkaWZmZXJlbnQKICogc29ydCBvcmRlcnMgZm9yIHRoZSBzYW1lIHNldCBvZiBzdHJpbmdzLiBMb2NhbGVzIGhhdmUgc3BlY2lmaWMgCiAqIGNvbGxhdGlvbiBydWxlcywgYW5kIHRoZSB3YXkgaW4gd2hpY2ggc2Vjb25kYXJ5IGFuZCB0ZXJ0aWFyeSBkaWZmZXJlbmNlcyAKICogYXJlIHRha2VuIGludG8gYWNjb3VudCwgZm9yIGV4YW1wbGUsIHdpbGwgcmVzdWx0IGluIGEgZGlmZmVyZW50IHNvcnRpbmcgb3JkZXIKICogZm9yIHNhbWUgc3RyaW5ncy4KICogPHA+CiAqIEBzZWUgICAgICAgIENvbGxhdG9yCiAqIEB2ZXJzaW9uICAgIDEuMjcgNC84Lzk3CiAqIEBhdXRob3IgICAgIEhlbGVuYSBTaGloCiAqLwpjbGFzcyBVX0kxOE5fQVBJIFJ1bGVCYXNlZENvbGxhdG9yIDogcHVibGljIENvbGxhdG9yIAp7CnB1YmxpYyA6IAoKICAvLyBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yCiAgLyoqCiAgICogUnVsZUJhc2VkQ29sbGF0b3IgY29uc3RydWN0b3IuICBUaGlzIHRha2VzIHRoZSB0YWJsZSBydWxlcyBhbmQgYnVpbGRzCiAgICogYSBjb2xsYXRpb24gdGFibGUgb3V0IG9mIHRoZW0uICBQbGVhc2Ugc2VlIFJ1bGVCYXNlZENvbGxhdG9yIGNsYXNzCiAgICogZGVzY3JpcHRpb24gZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgY29sbGF0aW9uIHJ1bGUgc3ludGF4LgogICAqIEBzZWUgTG9jYWxlCiAgICogQHBhcmFtIHJ1bGVzIHRoZSBjb2xsYXRpb24gcnVsZXMgdG8gYnVpbGQgdGhlIGNvbGxhdGlvbiB0YWJsZSBmcm9tLgogICAgICovCiAgUnVsZUJhc2VkQ29sbGF0b3IoICBjb25zdCAgIFVuaWNvZGVTdHJpbmcmICBydWxlcywKICAgICAgICAgICAgICBVRXJyb3JDb2RlJiAgICAgIHN0YXR1cyk7CgogIFJ1bGVCYXNlZENvbGxhdG9yKCAgY29uc3QgICBVbmljb2RlU3RyaW5nJiAgcnVsZXMsCiAgICAgICAgICAgICAgRUNvbGxhdGlvblN0cmVuZ3RoIGNvbGxhdGlvblN0cmVuZ3RoLAogICAgICAgICAgICAgIFVFcnJvckNvZGUmICAgICAgc3RhdHVzKTsKCiAgUnVsZUJhc2VkQ29sbGF0b3IoICBjb25zdCAgIFVuaWNvZGVTdHJpbmcmICBydWxlcywKICAgICAgICAgICAgICBOb3JtYWxpemVyOjpFTW9kZSBkZWNvbXBvc2l0aW9uTW9kZSwKICAgICAgICAgICAgICBVRXJyb3JDb2RlJiAgICAgIHN0YXR1cyk7CgogIFJ1bGVCYXNlZENvbGxhdG9yKCAgY29uc3QgICBVbmljb2RlU3RyaW5nJiAgcnVsZXMsCiAgICAgICAgICAgICAgRUNvbGxhdGlvblN0cmVuZ3RoIGNvbGxhdGlvblN0cmVuZ3RoLAogICAgICAgICAgICAgIE5vcm1hbGl6ZXI6OkVNb2RlICBkZWNvbXBvc2l0aW9uTW9kZSwKICAgICAgICAgICAgICBVRXJyb3JDb2RlJiAgICAgIHN0YXR1cyk7CgogIC8qKiBEZXN0cnVjdG9yCiAgICAgKi8KICB2aXJ0dWFsICAgICAgICAgICAgICAgICAgICAgICAgIH5SdWxlQmFzZWRDb2xsYXRvcigpOwoKCiAgLyoqIENvcHkgY29uc3RydWN0b3IKICAgICAqLwogIFJ1bGVCYXNlZENvbGxhdG9yKGNvbnN0IFJ1bGVCYXNlZENvbGxhdG9yJiBvdGhlcik7CgogIC8qKgogICAgICogQXNzaWdubWVudCBvcGVyYXRvci4KICAgICAqLwogIFJ1bGVCYXNlZENvbGxhdG9yJiAgICAgIG9wZXJhdG9yPShjb25zdCBSdWxlQmFzZWRDb2xsYXRvciYgb3RoZXIpOwogICAgCiAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgIm90aGVyIiBpcyB0aGUgc2FtZSBhcyAidGhpcyIuCiAgICAgKi8KICB2aXJ0dWFsIGJvb2xfdCAgICAgICAgICAgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgQ29sbGF0b3ImIG90aGVyKSBjb25zdDsKCiAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgIm90aGVyIiBpcyBub3QgdGhlIHNhbWUgYXMgInRoaXMiLgogICAgICovCiAgdmlydHVhbCBib29sX3QgICAgICAgICAgICAgICAgICBvcGVyYXRvciE9KGNvbnN0IENvbGxhdG9yJiBvdGhlcikgY29uc3Q7CgogIC8qKgogICAgICogTWFrZXMgYSBkZWVwIGNvcHkgb2YgdGhlIG9iamVjdC4gIFRoZSBjYWxsZXIgb3ducyB0aGUgcmV0dXJuZWQgb2JqZWN0LgogICAgICogQHJldHVybiB0aGUgY2xvbmVkIG9iamVjdC4KICAgICAqLwogIHZpcnR1YWwgQ29sbGF0b3IqICAgICAgICAgICAgICAgY2xvbmUodm9pZCkgY29uc3Q7CgogIC8qKgogICAgICogQ3JlYXRlcyBhIGNvbGxhdGlvbiBlbGVtZW50IGl0ZXJhdG9yIGZvciB0aGUgc291cmNlIHN0cmluZy4gIFRoZSAKICAgICAqIGNhbGxlciBvZiB0aGlzIG1ldGhvZCBpcyByZXNwb25zaWJsZSBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IG9mIAogICAgICogdGhlIHJldHVybiBwb2ludGVyLgogICAgICogQHBhcmFtIHNvdXJjZSB0aGUgc3RyaW5nIG92ZXIgd2hpY2ggdGhlIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciB3aWxsIGl0ZXJhdGUuCiAgICAgKiBAcmV0dXJuIHRoZSBjb2xsYXRpb24gZWxlbWVudCBpdGVyYXRvciBvZiB0aGUgc291cmNlIHN0cmluZyB1c2luZyB0aGlzIGFzCiAgICAgKiB0aGUgYmFzZWQgY29sbGF0b3IuCiAgICAgKi8KICB2aXJ0dWFsIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciogICAgICAgY3JlYXRlQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yKGNvbnN0IFVuaWNvZGVTdHJpbmcmIHNvdXJjZSkgY29uc3Q7CgogIC8qKgogICAgICogQ3JlYXRlcyBhIGNvbGxhdGlvbiBlbGVtZW50IGl0ZXJhdG9yIGZvciB0aGUgc291cmNlLiAgVGhlIAogICAgICogY2FsbGVyIG9mIHRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgb2YgCiAgICAgKiB0aGUgcmV0dXJuZWQgcG9pbnRlci4KICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIENoYXJhY3Rlckl0ZXJhdG9yIHdoaWNoIHByb2R1Y2VzIHRoZSBjaGFyYWN0ZXJzIG92ZXIgd2hpY2ggdGhlCiAgICAgKiBDb2xsYXRpb25FbGVtZW50SXRnZXJhdG9yIHdpbGwgaXRlcmF0ZS4KICAgICAqIEByZXR1cm4gdGhlIGNvbGxhdGlvbiBlbGVtZW50IGl0ZXJhdG9yIG9mIHRoZSBzb3VyY2UgdXNpbmcgdGhpcyBhcwogICAgICogdGhlIGJhc2VkIGNvbGxhdG9yLgogICAgICovCiAgdmlydHVhbCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IqICAgICAgIGNyZWF0ZUNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcihjb25zdCBDaGFyYWN0ZXJJdGVyYXRvciYgc291cmNlKSBjb25zdDsKCiAgLyoqCiAgICAgKiBDb21wYXJlcyBhIHJhbmdlIG9mIGNoYXJhY3RlciBkYXRhIHN0b3JlZCBpbiB0d28gZGlmZmVyZW50IHN0cmluZ3MKICAgICAqIGJhc2VkIG9uIHRoZSBjb2xsYXRpb24gcnVsZXMuICBSZXR1cm5zCiAgICAgKiBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyIGEgc3RyaW5nIGlzIGxlc3MgdGhhbiwgZ3JlYXRlciB0aGFuIG9yCiAgICAgKiBlcXVhbCB0byBhbm90aGVyIHN0cmluZyBpbiBhIGxhbmd1YWdlLgogICAgICogVGhpcyBjYW4gYmUgb3ZlcnJpZGVuIGluIGEgc3ViY2xhc3MuCiAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2Ugc3RyaW5nLgogICAgICogQHBhcmFtIHRhcmdldCB0aGUgdGFyZ2V0IHN0cmluZyB0byBiZSBjb21wYXJlZCB3aXRoIHRoZSBzb3VyY2Ugc3Rpcm5nLgogICAgICogQHJldHVybiB0aGUgY29tcGFyaXNvbiByZXN1bHQuICBHUkVBVEVSIGlmIHRoZSBzb3VyY2Ugc3RyaW5nIGlzIGdyZWF0ZXIKICAgICAqIHRoYW4gdGhlIHRhcmdldCBzdHJpbmcsIExFU1MgaWYgdGhlIHNvdXJjZSBpcyBsZXNzIHRoYW4gdGhlIHRhcmdldC4gIE90aGVyd2lzZSwKICAgICAqIHJldHVybnMgRVFVQUwuCiAgICAgKi8KICB2aXJ0dWFsICAgICBFQ29tcGFyaXNvblJlc3VsdCAgIGNvbXBhcmUoICAgIGNvbnN0ICAgVW5pY29kZVN0cmluZyYgIHNvdXJjZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBVbmljb2RlU3RyaW5nJiAgdGFyZ2V0KSBjb25zdDsKICAgICAgICAKICAgICAgICAKICAvKioKICAgICAqIENvbXBhcmVzIGEgcmFuZ2Ugb2YgY2hhcmFjdGVyIGRhdGEgc3RvcmVkIGluIHR3byBkaWZmZXJlbnQgc3RyaW5ncwogICAgICogYmFzZWQgb24gdGhlIGNvbGxhdGlvbiBydWxlcyB1cCB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4gIFJldHVybnMKICAgICAqIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgYSBzdHJpbmcgaXMgbGVzcyB0aGFuLCBncmVhdGVyIHRoYW4gb3IKICAgICAqIGVxdWFsIHRvIGFub3RoZXIgc3RyaW5nIGluIGEgbGFuZ3VhZ2UuCiAgICAgKiBUaGlzIGNhbiBiZSBvdmVycmlkZW4gaW4gYSBzdWJjbGFzcy4KICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBzdHJpbmcuCiAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQgc3RyaW5nIHRvIGJlIGNvbXBhcmVkIHdpdGggdGhlIHNvdXJjZSBzdHJpbmcuCiAgICAgKiBAcGFyYW0gbGVuZ3RoIGNvbXBhcmVzIHVwIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoCiAgICAgKiBAcmV0dXJuIHRoZSBjb21wYXJpc29uIHJlc3VsdC4gIEdSRUFURVIgaWYgdGhlIHNvdXJjZSBzdHJpbmcgaXMgZ3JlYXRlcgogICAgICogdGhhbiB0aGUgdGFyZ2V0IHN0cmluZywgTEVTUyBpZiB0aGUgc291cmNlIGlzIGxlc3MgdGhhbiB0aGUgdGFyZ2V0LiAgT3RoZXJ3aXNlLAogICAgICogcmV0dXJucyBFUVVBTC4KICAgICAqLyAKICB2aXJ0dWFsICAgICBFQ29tcGFyaXNvblJlc3VsdCAgIGNvbXBhcmUoICAgIGNvbnN0ICAgVW5pY29kZVN0cmluZyYgIHNvdXJjZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBVbmljb2RlU3RyaW5nJiAgdGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVuZ3RoKSBjb25zdDsKCiAgLyoqIFRyYW5zZm9ybXMgYSBzcGVjaWZpZWQgcmVnaW9uIG9mIHRoZSBzdHJpbmcgaW50byBhIHNlcmllcyBvZiBjaGFyYWN0ZXJzCiAgICAgKiB0aGF0IGNhbiBiZSBjb21wYXJlZCB3aXRoIENvbGxhdGlvbktleS5jb21wYXJlLiBVc2UgYSBDb2xsYXRpb25LZXkgd2hlbgogICAgICogeW91IG5lZWQgdG8gZG8gcmVwZWF0ZWQgY29tcGFyaXNpb25zIG9uIHRoZSBzYW1lIHN0cmluZy4gRm9yIGEgc2luZ2xlIGNvbXBhcmlzb24KICAgICAqIHRoZSBjb21wYXJlIG1ldGhvZCB3aWxsIGJlIGZhc3Rlci4KICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBzdHJpbmcuCiAgICAgKiBAcGFyYW0ga2V5IHRoZSB0cmFuc2Zvcm1lZCBrZXkgb2YgdGhlIHNvdXJjZSBzdHJpbmcuCiAgICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBjb2RlIHN0YXR1cy4KICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVkIGtleS4KICAgICAqIEBzZWUgQ29sbGF0aW9uS2V5CiAgICAgKi8KICB2aXJ0dWFsICAgICBDb2xsYXRpb25LZXkmICAgICAgIGdldENvbGxhdGlvbktleSggICAgY29uc3QgICBVbmljb2RlU3RyaW5nJiAgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsYXRpb25LZXkmICAga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlJiAgc3RhdHVzKSBjb25zdDsKICAvKioKICAgICAqIEdlbmVyYXRlcyB0aGUgaGFzaCBjb2RlIGZvciB0aGUgcnVsZS1iYXNlZCBjb2xsYXRpb24gb2JqZWN0LgogICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlLgogICAgICovCiAgdmlydHVhbCAgICAgaW50MzJfdCAgICAgICAgICAgICBoYXNoQ29kZSh2b2lkKSBjb25zdDsKCiAgLyoqCiAgICAgKiBHZXRzIHRoZSB0YWJsZS1iYXNlZCBydWxlcyBmb3IgdGhlIGNvbGxhdGlvbiBvYmplY3QuCiAgICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGNvbGxhdGlvbiBydWxlcyB0aGF0IHRoZSB0YWJsZSBjb2xsYXRpb24gb2JqZWN0CiAgICAgKiB3YXMgY3JlYXRlZCBmcm9tLgogICAgICovCiAgY29uc3QgICAgICAgVW5pY29kZVN0cmluZyYgICAgICBnZXRSdWxlcyh2b2lkKSBjb25zdDsKCiAgLyoqCiAgICAgKiAgUmV0dXJuIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhbnkgZXhwYW5zaW9uIHNlcXVlbmNlcyB0aGF0IGVuZAogICAgICogIHdpdGggdGhlIHNwZWNpZmllZCBjb21wYXJpc29uIG9yZGVyLgogICAgICogCiAgICAgKiAgQHBhcmFtIG9yZGVyIGEgY29sbGF0aW9uIG9yZGVyIHJldHVybmVkIGJ5IHByZXZpb3VzIG9yIG5leHQuCiAgICAgKiAgQHJldHVybiB0aGUgbWF4aW11bSBsZW5ndGggb2YgYW55IGV4cGFuc2lvbiBzZXVlbmNlcyBlbmRpbmcKICAgICAqICAgICAgICAgIHdpdGggdGhlIHNwZWNpZmllZCBvcmRlci4KICAgICAqIAogICAgICogIEBzZWUgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yI2dldE1heEV4cGFuc2lvbgogICAgICovCiAgaW50MzJfdCAgICAgICAgICAgICAgICBnZXRNYXhFeHBhbnNpb24oaW50MzJfdCBvcmRlcikgY29uc3Q7CgogIC8qKgogICAgICogUmV0dXJucyBhIHVuaXF1ZSBjbGFzcyBJRCBQT0xZTU9SUEhJQ0FMTFkuICBQdXJlIHZpcnR1YWwgb3ZlcnJpZGUuCiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0byBpbXBsZW1lbnQgYSBzaW1wbGUgdmVyc2lvbiBvZiBSVFRJLCBzaW5jZSBub3QgYWxsCiAgICAgKiBDKysgY29tcGlsZXJzIHN1cHBvcnQgZ2VudWluZSBSVFRJLiAgUG9seW1vcnBoaWMgb3BlcmF0b3I9PSgpIGFuZAogICAgICogY2xvbmUoKSBtZXRob2RzIGNhbGwgdGhpcyBtZXRob2QuCiAgICAgKgogICAgICogQHJldHVybiAgICAgICAgICBUaGUgY2xhc3MgSUQgZm9yIHRoaXMgb2JqZWN0LiBBbGwgb2JqZWN0cyBvZiBhCiAgICAgKiAgICAgICAgICAgICAgICAgIGdpdmVuIGNsYXNzIGhhdmUgdGhlIHNhbWUgY2xhc3MgSUQuICBPYmplY3RzIG9mCiAgICAgKiAgICAgICAgICAgICAgICAgIG90aGVyIGNsYXNzZXMgaGF2ZSBkaWZmZXJlbnQgY2xhc3MgSURzLgogICAgICovCiAgdmlydHVhbCBDbGFzc0lEIGdldER5bmFtaWNDbGFzc0lEKHZvaWQpIGNvbnN0CiAgICB7IHJldHVybiBSdWxlQmFzZWRDb2xsYXRvcjo6Z2V0U3RhdGljQ2xhc3NJRCgpOyB9CgoKICAvKioKICAgICAqIFJldHVybnMgdGhlIGNsYXNzIElEIGZvciB0aGlzIGNsYXNzLiAgVGhpcyBpcyB1c2VmdWwgb25seSBmb3IKICAgICAqIGNvbXBhcmluZyB0byBhIHJldHVybiB2YWx1ZSBmcm9tIGdldER5bmFtaWNDbGFzc0lEKCkuICBGb3IgZXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgIEJhc2UqIHBvbHltb3JwaGljX3BvaW50ZXIgPSBjcmVhdGVQb2x5bW9ycGhpY09iamVjdCgpOwogICAgICogICAgICBpZiAocG9seW1vcnBoaWNfcG9pbnRlci0+Z2V0RHluYW1pY0NsYXNzSUQoKSA9PQogICAgICogICAgICAgICAgRGVyaXZlZDo6Z2V0U3RhdGljQ2xhc3NJRCgpKSAuLi4KICAgICAqCiAgICAgKiBAcmV0dXJuICAgICAgICAgIFRoZSBjbGFzcyBJRCBmb3IgYWxsIG9iamVjdHMgb2YgdGhpcyBjbGFzcy4KICAgICAqLwogIHN0YXRpYyBDbGFzc0lEIGdldFN0YXRpY0NsYXNzSUQodm9pZCkgeyByZXR1cm4gKENsYXNzSUQpJmZnQ2xhc3NJRDsgfQoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUFJJVkFURQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnByaXZhdGU6CiAgc3RhdGljICAgICAgY2hhciAgICAgICAgICAgICAgICBmZ0NsYXNzSUQ7CgogICAgICAgIC8vIFN0cmVhbWVyIHVzZWQgdG8gcmVhZC93cml0ZSBiaW5hcnkgY29sbGF0aW9uIGRhdGEgZmlsZXMuCiAgZnJpZW5kICAgICAgICBjbGFzcyAgICAgICAgICAgICAgICBSdWxlQmFzZWRDb2xsYXRvclN0cmVhbWVyOwoKICAvLyBVc2VkIHRvIGl0ZXJhdGUgb3ZlciBjb2xsYXRpb24gZWxlbWVudHMgaW4gYSBjaGFyYWN0ZXIgc291cmNlLgogIGZyaWVuZCAgICAgIGNsYXNzICAgICAgICAgICAgICAgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOwogICAgICAgIAogIC8vIENvbGxhdG9yIE9OTFkgbmVlZHMgYWNjZXNzIHRvIFJ1bGVCYXNlZENvbGxhdG9yKGNvbnN0IExvY2FsZSYsIFVFcnJvckNvZGUmKQogIGZyaWVuZCBjbGFzcyBDb2xsYXRvcjsKICAgICAgICAKICAvLyBUYWJsZUNvbGxhdGlvbkRhdGEgT05MWSBuZWVkcyBhY2Nlc3MgdG8gVU5NQVBQRUQKICBmcmllbmQgY2xhc3MgVGFibGVDb2xsYXRpb25EYXRhOwoKCiAgLyoqIERlZmF1bHQgY29uc3RydWN0b3IKICAgICAqLwogIFJ1bGVCYXNlZENvbGxhdG9yKCk7CgogIC8qKgogICAgICogQ3JlYXRlIGEgbmV3IGVudHJ5IGluIHRoZSBleHBhbnNpb24gdGFibGUgdGhhdCBjb250YWlucyB0aGUgb3JkZXJpbmdzCiAgICAgKiBmb3IgdGhlIGdpdmVuIGNoYXJhY2Vycy4gIElmIGFuT3JkZXIgaXMgdmFsaWQsIGl0IGlzIGFkZGVkIHRvIHRoZQogICAgICogYmVnaW5uaW5nIG9mIHRoZSBleHBhbmRlZCBsaXN0IG9mIG9yZGVycy4KICAgICAqLwogIGludDMyX3QgICAgICAgICAgICAgICAgYWRkRXhwYW5zaW9uKGludDMyX3QgYW5PcmRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbmljb2RlU3RyaW5nICZleHBhbmRDaGFycyk7CiAgLyoqCiAgICAgKiBDcmVhdGUgYSB0YWJsZS1iYXNlZCBjb2xsYXRpb24gb2JqZWN0IHdpdGggdGhlIGdpdmVuIHJ1bGVzLgogICAgICogQHNlZSBSdWxlQmFzZWRDb2xsYXRvciNSdWxlQmFzZWRDb2xsYXRvcgogICAgICogQGV4Y2VwdGlvbiBGb3JtYXRFeGNlcHRpb24gSWYgdGhlIHJ1bGVzIGZvcm1hdCBpcyBpbmNvcnJlY3QuCiAgICAgKi8KICB2b2lkICAgICAgICAgICAgICAgIGJ1aWxkKCAgY29uc3QgICBVbmljb2RlU3RyaW5nJiAgcnVsZXMsCiAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmICAgICAgc3VjY2Vzcyk7CgogIC8qKiBBZGQgZXhwYW5kaW5nIGVudHJpZXMgZm9yIHByZS1jb21wb3NlZCB1bmljb2RlIGNoYXJhY3RlcnMgc28gdGhhdCB0aGlzCiAgICAgKiBjb2xsYXRvciBjYW4gYmUgdXNlZCByZWFzb25hYmx5IHdlbGwgd2l0aCBkZWNvbXBvc2l0aW9uIHR1cm5lZCBvZmYuCiAgICAgKi8KICB2b2lkICAgICAgICAgICAgICAgIGFkZENvbXBvc2VkQ2hhcnModm9pZCk7CgogIC8qKgogICAgICogTG9vayB1cCBmb3IgdW5tYXBwZWQgdmFsdWVzIGluIHRoZSBleHBhbmRlZCBjaGFyYWN0ZXIgdGFibGUuCiAgICAgKi8KICB2b2lkICAgICAgICAgICAgICAgIGNvbW1pdCh2b2lkKTsKICAvKioKICAgICAqIEluY3JlbWVudCBvZiB0aGUgbGFzdCBvcmRlciBiYXNlZCBvbiB0aGUgY29sbGF0aW9uIHN0cmVuZ3RoLgogICAgICogQHBhcmFtIHMgdGhlIGNvbGxhdGlvbiBzdHJlbmd0aC4KICAgICAqIEBwYXJhbSBsYXN0T3JkZXIgdGhlIGxhc3QgY29sbGF0aW9uIG9yZGVyLgogICAgICogQHJldHVybiB0aGUgbmV3IGNvbGxhdGlvbiBvcmRlci4KICAgICAqLwogIGludDMyX3QgICAgICAgICAgICAgaW5jcmVtZW50KCAgQ29sbGF0b3I6OkVDb2xsYXRpb25TdHJlbmd0aCAgICBzLCAKICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0T3JkZXIpOwogIC8qKgogICAgICogQWRkcyBhIGNoYXJhY3RlciBhbmQgaXRzIGRlc2lnbmF0ZWQgb3JkZXIgaW50byB0aGUgY29sbGF0aW9uIHRhYmxlLgogICAgICogQHBhcmFtIGNoIHRoZSBVbmljb2RlIGNoYXJhY3RlciwKICAgICAqIEBwYXJhbSBhbk9yZGVyIHRoZSBvcmRlci4KICAgICAqIEBwYXJhbSBzdGF0dXMgdGhlIGVycm9yIGNvZGUgc3RhdHVzLgogICAgICovCiAgdm9pZCAgICAgICAgICAgICAgICBhZGRPcmRlciggICBVQ2hhciAgICAgICAgY2gsIAogICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICBhbk9yZGVyLCAKICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgIHN0YXR1cyk7CiAgLyoqCiAgICAgKiBBZGRzIHRoZSBleHBhbmRpbmcgc3RyaW5nIGludG8gdGhlIGNvbGxhdGlvbiB0YWJsZSwgZm9yIGV4YW1wbGUsIGEtdW1sYXV0IGluIEdlcm1hbi4KICAgICAqIEBwYXJhbSBncm91cENoYXJzIHRoZSBjb250cmFjdGluZyBjaGFyYWN0ZXJzLgogICAgICogQHBhcmFtIGV4cENoYXJzIHRoZSBleHBhbmRpbmcgY2hhcmFjdGVycy4KICAgICAqIEBwYXJhbSBhbk9yZGVyIHRoZSBvcmRlci4KICAgICAqIEBwYXJhbSBzdGF0dXMgdGhlIGVycm9yIGNvZGUgc3RhdHVzLgogICAgICovCiAgdm9pZCAgICAgICAgICAgICAgICBhZGRFeHBhbmRPcmRlcihjb25zdCAgICBVbmljb2RlU3RyaW5nJiAgICAgICAgICBncm91cENoYXJzLCAKICAgICAgICAgICAgICAgICAgICAgY29uc3QgICAgVW5pY29kZVN0cmluZyYgICAgICAgICAgZXhwQ2hhcnMsIAogICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuT3JkZXIsCiAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUmICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwogIC8qKgogICAgICogQWRkcyB0aGUgY29udHJhY3Rpbmcgc3RyaW5nIGludG8gdGhlIGNvbGxhdGlvbiB0YWJsZSwgZm9yIGV4YW1wbGUsIGNoIGluIFNwYW5pc2guCiAgICAgKiBAcGFyYW0gZ3JvdXBDaGFycyB0aGUgY29udHJhY3RpbmcgY2hhcmFjdGVycy4KICAgICAqIEBwYXJhbSBhbk9yZGVyIHRoZSBvcmRlci4KICAgICAqIEBwYXJhbSBzdGF0dXMgdGhlIGVycm9yIGNvZGUgc3RhdHVzLgogICAgICovCiAgdm9pZCAgICAgICAgICAgICAgICBhZGRDb250cmFjdE9yZGVyKGNvbnN0ICBVbmljb2RlU3RyaW5nJiAgICAgICAgICBncm91cENoYXJzLCAKICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgYW5PcmRlciwKICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlJiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CiAgLyoqCiAgICAgKiBBZGRzIHRoZSBjb250cmFjdGluZyBzdHJpbmcgaW50byB0aGUgY29sbGF0aW9uIHRhYmxlLCBmb3IgZXhhbXBsZSwgY2ggaW4gU3BhbmlzaC4KICAgICAqIEBwYXJhbSBncm91cENoYXJzIHRoZSBjb250cmFjdGluZyBjaGFyYWN0ZXJzLgogICAgICogQHBhcmFtIGFuT3JkZXIgdGhlIG9yZGVyLgogICAgICogQHBhcmFtIGZ3ZCBUUlVFIGlmIHRoaXMgaXMgZm9yIHRoZSBmb3J3YXJkIGRpcmVjdGlvbgogICAgICogQHBhcmFtIHN0YXR1cyB0aGUgZXJyb3IgY29kZSBzdGF0dXMuCiAgICAgKi8KICB2b2lkICAgICAgICAgICAgICAgIGFkZENvbnRyYWN0T3JkZXIoY29uc3QgIFVuaWNvZGVTdHJpbmcmICAgICAgICAgIGdyb3VwQ2hhcnMsIAogICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBhbk9yZGVyLAogICAgICAgICAgICAgICAgICAgICAgIGJvb2xfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBmd2QsCiAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwogIC8qKgogICAgICogSWYgdGhlIGdpdmVuIHN0cmluZyBoYXMgYmVlbiBzcGVjaWZpZWQgYXMgYSBjb250cmFjdGluZyBzdHJpbmcKICAgICAqIGluIHRoaXMgY29sbGF0aW9uIHRhYmxlLCByZXR1cm4gaXRzIG9yZGVyaW5nLCBvdGhlcndpc2UgcmV0dXJuIFVOTUFQUEVELgogICAgICogQHBhcmFtIGdyb3VwQ2hhcnMgdGhlIHN0cmluZwogICAgICogQHJldHVybiB0aGUgb3JkZXIgb2YgdGhlIGNvbnRyYWN0ZWQgY2hhcmFjdGVyLCBvciBVTk1BUFBFRCBpZgogICAgICogdGhlcmUgaXNuJ3Qgb25lLgogICAgICovCiAgaW50MzJfdCAgICAgICAgICAgICAgICBnZXRDb250cmFjdE9yZGVyKGNvbnN0ICAgIFVuaWNvZGVTdHJpbmcgICAgICAgICAgICAmZ3JvdXBDaGFycykgY29uc3Q7CiAgLyoqCiAgICAgKiAgR2V0cyB0aGUgZW50cnkgb2YgbGlzdCBvZiB0aGUgY29udHJhY3Rpbmcgc3RyaW5nIGluIHRoZSBjb2xsYXRpb24KICAgICAqICB0YWJsZS4KICAgICAqICBAcGFyYW0gY2ggdGhlIHN0YXJ0aW5nIGNoYXJhY3RlciBvZiB0aGUgY29udHJhY3Rpbmcgc3RyaW5nCiAgICAgKiAgQHJldHVybiB0aGUgZW50cnkgb2YgY29udHJhY3RpbmcgZWxlbWVudCB3aGljaCBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkCiAgICAgKiAgY2hhcmFjdGVyIGluIHRoZSBsaXN0IG9mIGNvbnRyYWN0aW5nIGVsZW1lbnRzLgogICAgICovCiAgVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQqIAogIGdldENvbnRyYWN0VmFsdWVzKFVDaGFyICAgICBjaCkgY29uc3Q7CiAgLyoqCiAgICogIEdlcyB0aGUgZW50cnkgb2YgbGlzdCBvZiB0aGUgY29udHJhY3Rpbmcgc3RyaW5nIGluIHRoZSBjb2xsYXRpb24KICAgKiAgdGFibGUuCiAgICogIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGNvbnRyYWN0IGNoYXJhY3RlciBsaXN0CiAgICogIEByZXR1cm4gdGhlIGVudHJ5IG9mIHRoZSBjb250cmFjdGluZyBlbGVtZW50IG9mIHRoZSBzcGVjaWZpZWQgaW5kZXggaW4gdGhlCiAgICogIGxpc3QuCiAgICAgKi8KICBWZWN0b3JPZlBUb0NvbnRyYWN0RWxlbWVudCogCiAgZ2V0Q29udHJhY3RWYWx1ZXMoaW50MzJfdCAgICAgaW5kZXgpIGNvbnN0OwogIC8qKgogICAqICBHZXRzIHRoZSBlbnRyeSBvZiB2YWx1ZSBsaXN0IG9mIHRoZSBleHBhbmRpbmcgc3RyaW5nIGluIHRoZSBjb2xsYXRpb24KICAgKiAgdGFibGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KICAgKiAgQHBhcmFtIG9yZGVyIHRoZSBvcmRlciBvZiB0aGUgZXhwYW5kaW5nIHN0cmluZyB2YWx1ZSBsaXN0CiAgICogIEByZXR1cm4gdGhlIGVudHJ5IG9mIHRoZSBleHBhbmRpbmctY2hhciBlbGVtZW50IG9mIHRoZSBzcGVjaWZpZWQgaW5kZXggaW4gCiAgICogIHRoZSBsaXN0LgogICAgICovCiAgVmVjdG9yT2ZJbnQqICAgICAgICBnZXRFeHBhbmRWYWx1ZUxpc3QoaW50MzJfdCAgICAgb3JkZXIpIGNvbnN0OwogIC8qKgogICAgICogIEdldHMgdGhlIGNvbWFyaXNvbiBvcmRlciBvZiBhIGNoYXJhY3RlciBmcm9tIHRoZSBjb2xsYXRpb24gdGFibGUuCiAgICAgKiAgQHBhcmFtIGNoIHRoZSBVbmljb2RlIGNoYXJhY3RlcgogICAgICogIEByZXR1cm4gdGhlIGNvbXBhcmlzb24gb3JkZXIgb2YgYSBjaGFyYWN0ZXIuCiAgICAgKi8KICBpbnQzMl90ICAgICAgICAgICAgIGdldFVuaWNvZGVPcmRlcihVQ2hhciAgICAgY2gpIGNvbnN0OwoKICAvKioKICAgICAqICBHZXRzIHRoZSBjb21hcmlzb24gb3JkZXIgb2YgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgY29sbGF0aW9uIHRhYmxlLgogICAgICogIEBwYXJhbSBjaCB0aGUgVW5pY29kZSBjaGFyYWN0ZXIKICAgICAqICBAcmV0dXJuIHRoZSBjb21wYXJpc29uIG9yZGVyIG9mIGEgY2hhcmFjdGVyLgogICAgICovCiAgaW50MzJfdCAgICAgICAgICAgICAgICBnZXRDaGFyT3JkZXIoVUNoYXIgY2gpIGNvbnN0OwoKICAvKioKICAgICAqICBHZXRzIHRoZSBjb21hcmlzb24gb3JkZXIgb2YgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgY29sbGF0aW9uIHRhYmxlLgogICAgICogIEBwYXJhbSBsaXN0IHRoZSBjb250cmFjdGluZyBlbGVtZW50IHRhYmxlLgogICAgICogIEBwYXJhbSBuYW1lIHRoZSBjb250cmFjdGluZyBjaGFyIHN0cmluZy4KICAgICAqICBAcmV0dXJuIHRoZSBjb21wYXJpc29uIG9yZGVyIG9mIHRoZSBjb250cmFjdGluZyBjaGFyYWN0ZXIuCiAgICAgKi8KICBzdGF0aWMgICAgICAgIGludDMyX3QgICAgICAgICAgICAgZ2V0RW50cnkoICAgVmVjdG9yT2ZQVG9Db250cmFjdEVsZW1lbnQqICAgICBsaXN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBVbmljb2RlU3RyaW5nJiAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBib29sX3QgICAgICAgICAgICAgICAgICAgIGZ3ZCk7CgogIC8qKgogICAgICogRmxhdHRlbnMgdGhlIGdpdmVuIG9iamVjdCBwZXJzaXN0ZW50bHkgdG8gYSBmaWxlLiAgVGhlIGZpbGUgbmFtZQogICAgICogYXJndW1lbnQgc2hvdWxkIGJlIGEgcGF0aCBuYW1lIHRoYXQgY2FuIGJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUKICAgICAqIHVuZGVybHlpbmcgT1MuICBPbmNlIGEgUnVsZUJhc2VkQ29sbGF0b3IgaGFzIGJlZW4gd3JpdHRlbiB0byBhIGZpbGUsCiAgICAgKiBpdCBjYW4gYmUgcmVzdXJyZWN0ZWQgYnkgY2FsbGluZyB0aGUgUnVsZUJhc2VkQ29sbGF0b3IoY29uc3QgY2hhciopCiAgICAgKiBjb25zdHJ1Y3Rvciwgd2hpY2ggb3BlcmF0ZXMgdmVyeSBxdWlja2x5LgogICAgICogQHBhcmFtIGZpbGVOYW1lIHRoZSBvdXRwdXQgZmlsZSBuYW1lLgogICAgICogQHJldHVybiBUUlVFIGlmIHdyaXRpbmcgdG8gdGhlIGZpbGUgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4KICAgICAqLwogIGJvb2xfdCAgICAgICAgICAgICAgd3JpdGVUb0ZpbGUoY29uc3QgY2hhciogZmlsZU5hbWUpIGNvbnN0OyAvLyBUcnVlIG9uIHN1Y2Nlc3MKCiAgLyoqCiAgICAgKiBBZGQgdGhpcyB0YWJsZSBjb2xsYXRpb24gdG8gdGhlIGNhY2hlLiAgVGhpcyBpbnZvbHZlcyBhZGRpbmcgdGhlCiAgICAgKiBlbmNsb3NlZCBUYWJsZUNvbGxhdGlvbkRhdGEgdG8gdGhlIGNhY2hlLCBhbmQgdGhlbiBtYXJraW5nIG91cgogICAgICogcG9pbnRlciBhcyAibm90IG93bmVkIiBieSBzZXR0aW5nIGRhdGFJc093bmVkIHRvIGZhbHNlLgogICAgICogQHBhcmFtIGtleSB0aGUgdW5pcXVlIHRoYXQgcmVwcmVzZW50cyB0aGlzIGNvbGxhdGlvbiBkYXRhIG9iamVjdC4KICAgICAqLwogIHZvaWQgICAgICAgICAgICAgICAgYWRkVG9DYWNoZSggICAgICAgICBjb25zdCBVbmljb2RlU3RyaW5nJiBrZXkpOwoKICAvKioKICAgICAqIFJ1bGVCYXNlZENvbGxhdG9yIGNvbnN0cnVjdG9yLiAgVGhpcyBjb25zdHJ1Y3RvciB0YWtlcyBhIGxvY2FsZS4gIFRoZSBvbmx5CiAgICAgKiBjYWxsZXIgb2YgdGhpcyBjbGFzcyBzaG91bGQgYmUgQ29sbGF0b3I6OmNyZWF0ZUluc3RhbmNlKCkuICBJZiBjcmVhdGVJbnN0YW5jZSgpCiAgICAgKiBoYXBwZW5zIHRvIGtub3cgdGhhdCB0aGUgcmVxdWVzdGVkIGxvY2FsZSdzIGNvbGxhdGlvbiBpcyBpbXBsZW1lbnRlZCBhcwogICAgICogYSBSdWxlQmFzZWRDb2xsYXRvciwgaXQgY2FuIHRoZW4gY2FsbCB0aGlzIGNvbnN0cnVjdG9yLiAgT1RIRVJXSVNFIElUIFNIT1VMRE4nVCwKICAgICAqIHNpbmNlIHRoaXMgY29uc3RydWN0b3IgQUxXQVlTIFJFVFVSTlMgQSBWQUxJRCBDT0xMQVRJT04gVEFCTEUuICBJdCBkb2VzIHRoaXMKICAgICAqIGJ5IGZhbGxpbmcgYmFjayB0byBkZWZhdWx0cy4KICAgICAqLwogIFJ1bGVCYXNlZENvbGxhdG9yKCAgICAgIGNvbnN0IExvY2FsZSYgZGVzaXJlZExvY2FsZSwKICAgICAgICAgICAgICBVRXJyb3JDb2RlJiBzdGF0dXMpOwogIC8qKgogICAgICogSW50ZXJuYWwgY29uc3RydWN0RnJvbVh5eCgpIG1ldGhvZHMuICBUaGVzZSBtZXRob2RzIGRvIG9iamVjdCBjb25zdHJ1Y3Rpb24KICAgICAqIGZyb20gdmFyaW91cyBzb3VyY2VzLiAgVGhleSBhY3QgbGlrZSBhc3NpZ25tZW50IG9wZXJhdG9yczsgd2hhdGV2ZXIgdXNlZAogICAgICogdG8gYmUgaW4gdGhpcyBvYmplY3QgaXMgZGlzY2FyZGVkLiAgPFA+RlJPTSBSVUxFUy4gIFRoaXMgY29uc3RydWN0b3IgdHVybnMKICAgICAqIGFyb3VuZCBhbmQgY2FsbHMgYnVpbGQoKS4gIDxQPkZST00gQ0FDSEUuICBUaGlzIGNvbnN0cnVjdG9yIHRyaWVzIHRvIGdldCB0aGUKICAgICAqIHJlcXVlc3RlZCBjYWNoZWQgVGFibGVDb2xsYXRpb25EYXRhIG9iamVjdCwgYW5kIHdyYXAgdXMgYXJvdW5kIGl0LiAgPFA+RlJPTSBGSUxFLgogICAgICogVGhlcmUgYXJlIHR3byBjb25zdHJ1Y3RvcnMgbmFtZWQgY29uc3RydWN0RnJvbUZpbGUoKS4gIE9uZSB0YWtlcyBhIGNvbnN0IGNoYXIqOgogICAgICogdGhpcyBpcyBhIHBhdGggbmFtZSB0byBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGhvc3QgT1MsIHdoZXJlIGEgZmxhdHRlbmVkCiAgICAgKiB0YWJsZSBjb2xsYXRpb24gKHByb2R1Y2VkIGJ5IHdyaXRlVG9GaWxlKCkpIHJlc2lkZXMuICBUaGUgb3RoZXIgbWV0aG9kIHRha2VzCiAgICAgKiBhIExvY2FsZSwgYW5kIGEgVW5pY29kZVN0cmluZyBsb2NhbGUgZmlsZSBuYW1lLiAgVGhlIGRpc3RpbmN0aW9uIGlzIHRoaXM6CiAgICAgKiB0aGUgTG9jYWxlIGlzIHRoZSBsb2NhbGUgd2UgYXJlIHNlZWtpbmcuICBUaGUgZmlsZSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICogZGF0YSBmaWxlIChlaXRoZXIgYmluYXJ5LCBhcyBwcm9kdWNlZCBieSB3cml0ZVRvRmlsZSgpLCBvciBBU0NJSSwgYXMgcmVhZAogICAgICogYnkgUmVzb3VyY2VCdW5kbGUpLiAgV2l0aGluIHRoZSBmaWxlLCBpZiBpdCBpcyBmb3VuZCwgdGhlIG1ldGhvZCB3aWxsIGxvb2sKICAgICAqIGZvciB0aGUgZ2l2ZW4gTG9jYWxlLgogICAgICovCiAgdm9pZCAgICAgICAgICAgICAgICBjb25zdHJ1Y3RGcm9tUnVsZXMoIGNvbnN0IFVuaWNvZGVTdHJpbmcmIHJ1bGVzLAogICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKTsKICB2b2lkICAgICAgICAgICAgICAgIGNvbnN0cnVjdEZyb21GaWxlKCAgY29uc3QgTG9jYWxlJiAgICAgICAgICAgbG9jYWxlLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5pY29kZVN0cmluZyYgICAgbG9jYWxlRmlsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICBib29sX3QgICAgICAgICAgICAgICAgICB0cnlCaW5hcnlGaWxlLAogICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgICAgICAgICAgICAgIHN0YXR1cyk7CiAgdm9pZCAgICAgICAgICAgICAgICBjb25zdHJ1Y3RGcm9tRmlsZSggIGNvbnN0IGNoYXIqIGZpbGVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKTsKICB2b2lkICAgICAgICAgICAgICAgIGNvbnN0cnVjdEZyb21DYWNoZSggY29uc3QgVW5pY29kZVN0cmluZyYga2V5LAogICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEludGVybmFsIFN0YXRpYyBVdGlsaXR5IE1ldGhvZHMKICAvKioKICAgICAqIENyZWF0ZXMgdGhlIHBhdGggbmFtZSB3aXRoIGdpdmVuIGluZm9ybWF0aW9uLgogICAgICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4IG9mIHRoZSBmaWxlIG5hbWUuCiAgICAgKiBAcGFyYW0gbmFtZSB0aGUgYWN0dWFsIGZpbGUgbmFtZS4KICAgICAqIEBwYXJhbSBzdWZmaXggdGhlIHN1ZmZpeCBvZiB0aGUgZmlsZSBuYW1lLgogICAgICogQHJldHVybiB0aGUgZ2VuZXJhdGVkIGZpbGUgbmFtZS4KICAgICAqLwogIHN0YXRpYyAgY2hhciogICAgICAgICAgICAgICBjcmVhdGVQYXRoTmFtZSggY29uc3QgVW5pY29kZVN0cmluZyYgICAgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaWNvZGVTdHJpbmcmICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5pY29kZVN0cmluZyYgICAgc3VmZml4KTsKCiAgLyoqCiAgICAgKiBDaG9wcyBvZmYgdGhlIGxhc3QgcG9ydGlvbiBvZiB0aGUgbG9jYWxlIG5hbWUuICBGb3IgZXhhbXBsZSwgZnJvbSAiZW5fVVNfQ0EiCiAgICAgKiB0byAiZW5fVVMiIGFuZCAiZW5fVVMiIHRvICJlbiIuCiAgICAgKiBAcGFyYW0gbG9jYWxlTmFtZSB0aGUgbG9jYWxlIG5hbWUuCiAgICAgKi8KICBzdGF0aWMgIHZvaWQgICAgICAgICAgICAgICAgY2hvcExvY2FsZShVbmljb2RlU3RyaW5nJiAgIGxvY2FsZU5hbWUpOwoKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gQ29uc3RhbnRzCgogIHN0YXRpYyAgY29uc3QgICBpbnQzMl90ICAgICAgICAgICAgIFVOTUFQUEVEOwogIHN0YXRpYyAgY29uc3QgICBpbnQzMl90ICAgICAgICAgICAgIENIQVJJTkRFWDsgIC8vIG5lZWQgbG9vayB1cCBpbiAuY29tbWl0KCkKICBzdGF0aWMgIGNvbnN0ICAgaW50MzJfdCAgICAgICAgICAgICBFWFBBTkRDSEFSSU5ERVg7IC8vIEV4cGFuZCBpbmRleCBmb2xsb3dzCiAgc3RhdGljICBjb25zdCAgIGludDMyX3QgICAgICAgICAgICAgQ09OVFJBQ1RDSEFSSU5ERVg7ICAvLyBjb250cmFjdCBpbmRleGVzIGZvbGxvdwoKICBzdGF0aWMgIGNvbnN0ICAgaW50MzJfdCAgICAgICAgICAgICBQUklNQVJZT1JERVJJTkNSRU1FTlQ7CiAgc3RhdGljICBjb25zdCAgIGludDMyX3QgICAgICAgICAgICAgTUFYSUdOT1JBQkxFOwogIHN0YXRpYyAgY29uc3QgICBpbnQzMl90ICAgICAgICAgICAgIFNFQ09OREFSWU9SREVSSU5DUkVNRU5UOwogIHN0YXRpYyAgY29uc3QgICBpbnQzMl90ICAgICAgICAgICAgIFRFUlRJQVJZT1JERVJJTkNSRU1FTlQ7CiAgc3RhdGljICBjb25zdCAgIGludDMyX3QgICAgICAgICAgICAgUFJJTUFSWU9SREVSTUFTSzsKICBzdGF0aWMgIGNvbnN0ICAgaW50MzJfdCAgICAgICAgICAgICBTRUNPTkRBUllPUkRFUk1BU0s7CiAgc3RhdGljICBjb25zdCAgIGludDMyX3QgICAgICAgICAgICAgVEVSVElBUllPUkRFUk1BU0s7CiAgc3RhdGljICBjb25zdCAgIGludDMyX3QgICAgICAgICAgICAgU0VDT05EQVJZUkVTRVRNQVNLOwogIHN0YXRpYyAgY29uc3QgICBpbnQzMl90ICAgICAgICAgICAgIElHTk9SQUJMRU1BU0s7CiAgc3RhdGljICBjb25zdCAgIGludDMyX3QgICAgICAgICAgICAgUFJJTUFSWURJRkZFUkVOQ0VPTkxZOwogIHN0YXRpYyAgY29uc3QgICBpbnQzMl90ICAgICAgICAgICAgIFNFQ09OREFSWURJRkZFUkVOQ0VPTkxZOwogIHN0YXRpYyAgY29uc3QgICBpbnQzMl90ICAgICAgICAgICAgIFBSSU1BUllPUkRFUlNISUZUOwogIHN0YXRpYyAgY29uc3QgICBpbnQzMl90ICAgICAgICAgICAgIFNFQ09OREFSWU9SREVSU0hJRlQ7CiAgc3RhdGljICBjb25zdCAgIGludDMyX3QgICAgICAgICAgICAgU09SVEtFWU9GRlNFVDsKICBzdGF0aWMgIGNvbnN0ICAgaW50MzJfdCAgICAgICAgICAgICBDT05UUkFDVENIQVJPVkVSRkxPVzsKCiAgc3RhdGljIGNvbnN0IGludDE2X3QgICAgICAgICAgICAgICAgRklMRUlEOwoKICBzdGF0aWMgICAgICAgVW5pY29kZVN0cmluZyAgICAgIERFRkFVTFRSVUxFUzsKCiAgc3RhdGljICBjb25zdCBjaGFyKiAgICAgICAgICAgICBrRmlsZW5hbWVTdWZmaXg7CgogICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAvLyBEYXRhIE1lbWJlcnMKCiAgYm9vbF90ICAgICAgICAgICAgICBpc092ZXJJZ25vcmU7CiAgVUNoYXIgICAgICAgICAgICAgbGFzdENoYXI7CiAgTWVyZ2VDb2xsYXRpb24qICAgICBtUGF0dGVybjsKICBVbmljb2RlU3RyaW5nICAgICAgIHNidWZmZXI7CiAgVW5pY29kZVN0cmluZyAgICAgICB0YnVmZmVyOwogIFVuaWNvZGVTdHJpbmcgICAgICAga2V5OwogIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciAqc291cmNlQ3Vyc29yOwogIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciAqdGFyZ2V0Q3Vyc29yOwogIGJvb2xfdCAgICAgICAgICAgICAgZGF0YUlzT3duZWQ7CiAgVGFibGVDb2xsYXRpb25EYXRhKiBkYXRhOwp9OwoKCmlubGluZSBib29sX3QKUnVsZUJhc2VkQ29sbGF0b3I6Om9wZXJhdG9yIT0oY29uc3QgQ29sbGF0b3ImIG90aGVyKSBjb25zdAp7CiAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwp9CgppbmxpbmUgdm9pZApSdWxlQmFzZWRDb2xsYXRvcjo6YWRkQ29udHJhY3RPcmRlcihjb25zdCBVbmljb2RlU3RyaW5nICZncm91cENoYXJzLAogICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgYW5PcmRlciwKICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgICAgICAgJnN0YXR1cykKewogIGFkZENvbnRyYWN0T3JkZXIoZ3JvdXBDaGFycywgYW5PcmRlciwgVFJVRSwgc3RhdHVzKTsKfQoKI2VuZGlmCg==