Files
fx-serverless/packer/a_packer-packr.go
2019-11-11 15:35:52 +08:00

46 lines
234 KiB
Go

// Code generated by github.com/gobuffalo/packr. DO NOT EDIT.
package packer
import "github.com/gobuffalo/packr"
// You can use the "packr clean" command to clean up this,
// and any other packr generated files.
func init() {
packr.PackJSONBytes("./images", "d/Dockerfile", "\"RlJPTSBtZXRydWUvZngtZC1iYXNlCgpDT1BZIC4gLgpFWFBPU0UgMzAwMApDTUQgWyJyZG1kIiwgIi12ZXJzaW9uPWVtYmVkZGVkX2h0dHBkIiwgImFwcCIsICItLXBvcnQiLCAiMzAwMCJd\"")
packr.PackJSONBytes("./images", "d/app.d", "\"aW1wb3J0IHN0ZC5qc29uOwppbXBvcnQgYXJzZC5jZ2k7CmltcG9ydCBmeDsgCgp2b2lkIGhhbmRsZShDZ2kgY2dpKSAKewogICAgaWYgKGNnaS5yZXF1ZXN0TWV0aG9kID09IENnaS5SZXF1ZXN0TWV0aG9kLlBPU1QgJiYgY2dpLnBhdGhJbmZvID09ICIvIikKICAgIHsKICAgICAgICBhdXRvIGlucHV0ID0gcGFyc2VKU09OKGNnaS5wb3N0SnNvbik7CiAgICAgICAgYXV0byByZXN1bHQgPSBKU09OVmFsdWUoZXhlY3V0ZUZ4KGlucHV0KSk7CiAgICAgICAgY2dpLnNldFJlc3BvbnNlQ29udGVudFR5cGUoImFwcGxpY2F0aW9uL2pzb24iKTsKICAgICAgICBjZ2kud3JpdGUodG9KU09OKHJlc3VsdCkpOwogICAgfQp9CgptaXhpbiBHZW5lcmljTWFpbiFoYW5kbGU7\"")
packr.PackJSONBytes("./images", "d/arsd/cgi.d", "\"Ly8gRklYTUU6IGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHdlIHNob3VsZG4ndCBuZWNlc3NhcmlseSBjYWNoZS4uLgovLyBGSVhNRTogdGhlcmUncyBzb21lIGFubm95aW5nIGR1cGxpY2F0aW9uIG9mIGNvZGUgaW4gdGhlIHZhcmlvdXMgdmVyc2lvbmVkIG1haW5zCgovLyBOb3RlOiBzcGF3bi1mY2dpIGNhbiBoZWxwIHdpdGggZmFzdGNnaSBvbiBuZ2lueAoKLy8gRklYTUU6IHRvIGRvOiBhZGQgb3BlbnNzbCBvcHRpb25hbGx5Ci8vIG1ha2Ugc3VyZSBlbWJlZGRlZF9odHRwZCBkb2Vzbid0IHNlbmQgdHdvIGFuc3dlcnMgaWYgb25lIHdyaXRlcygpIHRoZW4gZGllcwoKLysrCglQcm92aWRlcyBhIHVuaWZvcm0gc2VydmVyLXNpZGUgQVBJIGZvciBDR0ksIEZhc3RDR0ksIFNDR0ksIGFuZCBIVFRQIHdlYiBhcHBsaWNhdGlvbnMuCgoJLS0tCglpbXBvcnQgYXJzZC5jZ2k7CgoJLy8gSW5zdGVhZCBvZiB3cml0aW5nIHlvdXIgb3duIG1haW4oKSwgeW91IHNob3VsZCB3cml0ZSBhIGZ1bmN0aW9uCgkvLyB0aGF0IHRha2VzIGEgQ2dpIHBhcmFtLCBhbmQgdXNlIG1peGluIEdlbmVyaWNNYWluCgkvLyBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5IHdpdGggZGlmZmVyZW50IHdlYiBzZXJ2ZXJzLgoJdm9pZCBoZWxsbyhDZ2kgY2dpKSB7CgkJY2dpLnNldFJlc3BvbnNlQ29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKCgkJaWYoIm5hbWUiIGluIGNnaS5nZXQpCgkJCWNnaS53cml0ZSgiSGVsbG8sICIgfiBjZ2kuZ2V0WyJuYW1lIl0pOwoJCWVsc2UKCQkJY2dpLndyaXRlKCJIZWxsbywgd29ybGQhIik7Cgl9CgoJbWl4aW4gR2VuZXJpY01haW4haGVsbG87CgktLS0KCgoJQ29tcGlsZV9hbmRfcnVuOgoJCglGb3IgQ0dJLCBgZG1kIHlvdXJmaWxlLmQgY2dpLmRgIHRoZW4gcHV0IHRoZSBleGVjdXRhYmxlIGluIHlvdXIgY2dpLWJpbiBkaXJlY3RvcnkuCgoJRm9yIEZhc3RDR0k6IGBkbWQgeW91cmZpbGUuZCBjZ2kuZCAtdmVyc2lvbj1mYXN0Y2dpYCBhbmQgcnVuIGl0LiBzcGF3bi1mY2dpIGhlbHBzIG9uIG5naW54LiBZb3UgY2FuIHB1dCB0aGUgZmlsZSBpbiB0aGUgZGlyZWN0b3J5IGZvciBBcGFjaGUuIE9uIElJUywgcnVuIGl0IHdpdGggYSBwb3J0IG9uIHRoZSBjb21tYW5kIGxpbmUuCgoJRm9yIFNDR0k6IGBkbWQgeW91cmZpbGUuZCBjZ2kuZCAtdmVyc2lvbj1zY2dpYCBhbmQgcnVuIHRoZSBleGVjdXRhYmxlLCBwcm92aWRpbmcgYSBwb3J0IG51bWJlciBvbiB0aGUgY29tbWFuZCBsaW5lLgoKCUZvciBhbiBlbWJlZGRlZCBIVFRQIHNlcnZlciwgcnVuIGBkbWQgeW91cmZpbGUuZCBjZ2kuZCAtdmVyc2lvbj1lbWJlZGRlZF9odHRwZGAgYW5kIHJ1biB0aGUgZ2VuZXJhdGVkIHByb2dyYW0uIEl0IGxpc3RlbnMgb24gcG9ydCA4MDg1IGJ5IGRlZmF1bHQuIFlvdSBjYW4gY2hhbmdlIHRoaXMgb24gdGhlIGNvbW1hbmQgbGluZSB3aXRoIHRoZSAtLXBvcnQgb3B0aW9uIHdoZW4gcnVubmluZyB5b3VyIHByb2dyYW0uCgoJWW91IGNhbiBhbHNvIHNpbXVsYXRlIGEgcmVxdWVzdCBieSBwYXNzaW5nIHBhcmFtZXRlcnMgb24gdGhlIGNvbW1hbmQgbGluZSwgbGlrZToKCgkkKENPTlNPTEUKCS4veW91cnByb2dyYW0gR0VUIC8gbmFtZT1hZHIKCSkKCglBbmQgaXQgd2lsbCBwcmludCB0aGUgcmVzdWx0IHRvIHN0ZG91dC4KCglDR0lfU2V0dXBfdGlwczoKCglPbiBBcGFjaGUsIHlvdSBtYXkgZG8gYFNldEhhbmRsZXIgY2dpLXNjcmlwdGAgaW4geW91ciBgLmh0YWNjZXNzYCBmaWxlLgoKCUludGVncmF0aW9uX3RpcHM6CgoJY2dpLmQgd29ya3Mgd2VsbCB3aXRoIGRvbS5kIGZvciBnZW5lcmF0aW5nIGh0bWwuIFlvdSBtYXkgYWxzbyB1c2Ugd2ViLmQgZm9yIG90aGVyIHV0aWxpdGllcyBhbmQgYXV0b21hdGljIGFwaSB3cmFwcGluZy4KCglkb20uZCB1c2FnZToKCgktLS0KCQlpbXBvcnQgYXJzZC5jZ2k7CgkJaW1wb3J0IGFyc2QuZG9tOwoKCQl2b2lkIGhlbGxvX2RvbShDZ2kgY2dpKSB7CgkJCWF1dG8gZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoKTsKCgkJCXN0YXRpYyBpbXBvcnQgc3RkLmZpbGU7CgkJCS8vIHBhcnNlIHRoZSBmaWxlIGluIHN0cmljdCBtb2RlLCByZXF1aXJpbmcgaXQgdG8gYmUgd2VsbC1mb3JtZWQgVVRGLTggWEhUTUwKCQkJLy8gKFlvdSdsbCBhcHByZWNpYXRlIHRoaXMgaWYgeW91J3ZlIGV2ZXIgaGFkIHRvIGRlYWwgd2l0aCBhIG1pc3NpbmcgPC9kaXY+CgkJCS8vIG9yIHNvbWV0aGluZyBpbiBhIHBocCBvciBlcmIgdGVtcGxhdGUgYmVmb3JlIHRoYXQgd291bGQgcmFuZG9tbHkgbWVzcyB1cAoJCQkvLyB0aGUgb3V0cHV0IGluIHlvdXIgYnJvd3Nlci4gSnVzdCBjaGVjayBpdCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uIGVhcmx5ISkKCQkJLy8KCQkJLy8gWW91IGNvdWxkIGFsc28gaGFyZC1jb2RlIGEgdGVtcGxhdGUgb3IgbG9hZCBvbmUgYXQgY29tcGlsZSB0aW1lIHdpdGggYW4KCQkJLy8gaW1wb3J0IGV4cHJlc3Npb24sIGJ1dCB5b3UgbWlnaHQgYXBwcmVjaWF0ZSBtYWtpbmcgaXQgYSByZWd1bGFyIGZpbGUKCQkJLy8gYmVjYXVzZSB0aGF0IG1lYW5zIGl0IGNhbiBiZSBtb3JlIGVhc2lseSBlZGl0ZWQgYnkgdGhlIGZyb250ZW5kIHRlYW0gYW5kCgkJCS8vIHRoZXkgY2FuIHNlZSB0aGVpciBjaGFuZ2VzIHdpdGhvdXQgbmVlZGluZyB0byByZWNvbXBpbGUgdGhlIHByb2dyYW0uCgkJCS8vCgkJCS8vIE5vdGUgb24gQ1RGRTogaWYgeW91IGRvIGNob29zZSB0byBsb2FkIGEgc3RhdGljIGZpbGUgYXQgY29tcGlsZSB0aW1lLAoJCQkvLyB5b3UgKmNhbiogcGFyc2UgaXQgaW4gQ1RGRSB1c2luZyBlbnVtLCB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIHRocm93IGF0CgkJCS8vIGNvbXBpbGUgdGltZSwgd2hpY2ggaXMga2luZGEgY29vbCB0b28uIEJlIGNhcmVmdWwgaW4gbW9kaWZ5aW5nIHRoYXQgZG9jdW1lbnQsCgkJCS8vIHRob3VnaCwgYXMgaXQgd2lsbCBiZSBhIHN0YXRpYyBpbnN0YW5jZS4gWW91IG1pZ2h0IHdhbnQgdG8gY2xvbmUgb24gb24gZGVtYW5kLAoJCQkvLyBvciBwZXJoYXBzIG1vZGlmeSBpdCBsYXppbHkgYXMgeW91IHByaW50IGl0IG91dC4gKFRyeSBlbGVtZW50LnRyZWUsIGl0IHJldHVybnMKCQkJLy8gYSByYW5nZSBvZiBlbGVtZW50cyB3aGljaCB5b3UgY291bGQgc2VuZCB0aHJvdWdoIHN0ZC5hbGdvcml0aG0gZnVuY3Rpb25zLiBCdXQKCQkJLy8gc2luY2UgbXkgc2VsZWN0b3IgaW1wbGVtZW50YXRpb24gZG9lc24ndCB3b3JrIG9uIHRoYXQgbGV2ZWwgeWV0LCB5b3UnbGwgZmluZCB0aGF0CgkJCS8vIGhhcmRlciB0byB1c2UuIE9mIGNvdXJzZSwgeW91IGNvdWxkIG1ha2UgYSBzdGF0aWMgbGlzdCBvZiBtYXRjaGluZyBlbGVtZW50cyBhbmQKCQkJLy8gdGhlbiB1c2UgYSBzaW1wbGUgZSBpcyBlMiBwcmVkaWNhdGUuLi4gOikgKQoJCQlkb2N1bWVudC5wYXJzZVV0Zjgoc3RkLmZpbGUucmVhZCgieW91cl90ZW1wbGF0ZS5odG1sIiksIHRydWUsIHRydWUpOwoKCQkJLy8gZmlsbCBpbiBkYXRhIHVzaW5nIERPTSBmdW5jdGlvbnMsIHNvIHBsYWNpbmcgaXQgaXMgaW4gdGhlIGhhbmRzIG9mIEhUTUwKCQkJLy8gYW5kIGl0IHdpbGwgYmUgcHJvcGVybHkgZW5jb2RlZCBhcyB0ZXh0IHRvby4KCQkJLy8KCQkJLy8gUGxhaW4gaHRtbCB0ZW1wbGF0ZXMgY2FuJ3QgcnVuIHNlcnZlciBzaWRlIGxvZ2ljLCBidXQgSSB0aGluayB0aGF0J3MgYQoJCQkvLyBnb29kIHRoaW5nIC0gaXQga2VlcHMgdGhlbSBzaW1wbGUuIFlvdSBtYXkgY2hvb3NlIHRvIGV4dGVuZCB0aGUgaHRtbCwKCQkJLy8gYnV0IEkgdGhpbmsgaXQgaXMgYmVzdCB0byB0cnkgdG8gc3RpY2sgdG8gc3RhbmRhcmQgZWxlbWVudHMgYW5kIGZpbGwgdGhlbQoJCQkvLyBpbiB3aXRoIHJlcXVlc3RlZCBkYXRhIHdpdGggSURzIG9yIGNsYXNzIG5hbWVzLiBBIGZ1cnRoZXIgYmVuZWZpdCBvZgoJCQkvLyB0aGlzIGlzIHRoZSBkZXNpZ25lciBjYW4gYWxzbyBoaWdobGlnaHQgZGF0YSBiYXNlZCBvbiBzb3VyY2VzIGluIHRoZSBDU1MuCgkJCS8vCgkJCS8vIEhvd2V2ZXIsIGFsbCBvZiBkb20uZCBpcyBhdmFpbGFibGUsIHNvIHlvdSBjYW4gZm9ybWF0IHlvdXIgZGF0YSBob3dldmVyCgkJCS8vIHlvdSBsaWtlLiBZb3UgY2FuIGRvIHBhcnRpYWwgdGVtcGxhdGVzIHdpdGggaW5uZXJIVE1MIHRvbywgb3IgcGVyaGFwcyBiZXR0ZXIsCgkJCS8vIGluamVjdGluZyBjbG9uZWQgbm9kZXMgZnJvbSBhIHBhcnRpYWwgZG9jdW1lbnQuCgkJCS8vCgkJCS8vIFRoZXJlJ3MgYSBsb3Qgb2YgcG9zc2liaWxpdGllcy4KCQkJZG9jdW1lbnRbIiNuYW1lIl0uaW5uZXJUZXh0ID0gY2dpLnJlcXVlc3QoIm5hbWUiLCAiZGVmYXVsdCBuYW1lIik7CgoJCQkvLyBzZW5kIHRoZSBkb2N1bWVudCB0byB0aGUgYnJvd3Nlci4gVGhlIHNlY29uZCBhcmd1bWVudCB0byBgY2dpLndyaXRlYAoJCQkvLyBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIGFsbCB0aGUgZGF0YSBhdCBvbmNlLCBlbmFibGluZyBhIGZldyBzbWFsbAoJCQkvLyBvcHRpbWl6YXRpb25zLgoJCQljZ2kud3JpdGUoZG9jdW1lbnQudG9TdHJpbmcoKSwgdHJ1ZSk7CgkJfQoJLS0tCgoJQ29uY2VwdHM6CgkJSW5wdXQ6IFtDZ2kuZ2V0XSwgW0NnaS5wb3N0XSwgW0NnaS5yZXF1ZXN0XSwgW0NnaS5maWxlc10sIFtDZ2kuY29va2llc10sIFtDZ2kucGF0aEluZm9dLCBbQ2dpLnJlcXVlc3RNZXRob2RdLAoJCSAgICAgICBhbmQgSFRUUCBoZWFkZXJzIChbQ2dpLmhlYWRlcnNdLCBbQ2dpLnVzZXJBZ2VudF0sIFtDZ2kucmVmZXJyZXJdLCBbQ2dpLmFjY2VwdF0sIFtDZ2kuYXV0aG9yaXphdGlvbl0sIFtDZ2kubGFzdEV2ZW50SWRdCgoJCU91dHB1dDogW0NnaS53cml0ZV0sIFtDZ2kuaGVhZGVyXSwgW0NnaS5zZXRSZXNwb25zZVN0YXR1c10sIFtDZ2kuc2V0UmVzcG9uc2VDb250ZW50VHlwZV0sIFtDZ2kuZ3ppcFJlc3BvbnNlXQoKCQlDb29raWVzOiBbQ2dpLnNldENvb2tpZV0sIFtDZ2kuY2xlYXJDb29raWVdLCBbQ2dpLmNvb2tpZV0sIFtDZ2kuY29va2llc10KCgkJQ2FjaGluZzogW0NnaS5zZXRSZXNwb25zZUV4cGlyZXNdLCBbQ2dpLnVwZGF0ZVJlc3BvbnNlRXhwaXJlc10sIFtDZ2kuc2V0Q2FjaGVdCgoJCVJlZGlyZWN0aW9uczogW0NnaS5zZXRSZXNwb25zZUxvY2F0aW9uXQoKCQlPdGhlciBJbmZvcm1hdGlvbjogW0NnaS5yZW1vdGVBZGRyZXNzXSwgW0NnaS5odHRwc10sIFtDZ2kucG9ydF0sIFtDZ2kuc2NyaXB0TmFtZV0sIFtDZ2kucmVxdWVzdFVyaV0sIFtDZ2kuZ2V0Q3VycmVudENvbXBsZXRlVXJpXSwgW0NnaS5vblJlcXVlc3RCb2R5RGF0YVJlY2VpdmVkXQoKCQlPdmVycmlkaW5nIGJlaGF2aW9yOiBbQ2dpLmhhbmRsZUluY29taW5nRGF0YUNodW5rXSwgW0NnaS5wcmVwYXJlRm9ySW5jb21pbmdEYXRhQ2h1bmtzXSwgW0NnaS5jbGVhblVwUG9zdERhdGFTdGF0ZV0KCgkJSW5zdGFsbGluZzogQXBhY2hlLCBJSVMsIENHSSwgRmFzdENHSSwgU0NHSSwgZW1iZWRkZWQgSFRUUEQgKG5vdCByZWNvbW1lbmRlZCBmb3IgcHJvZHVjdGlvbiB1c2UpCgoJR3VpZGVfZm9yX1BIUF91c2VyczoKCQlJZiB5b3UgYXJlIGNvbWluZyBmcm9tIFBIUCwgaGVyZSdzIGEgcXVpY2sgZ3VpZGUgdG8gaGVscCB5b3UgZ2V0IHN0YXJ0ZWQ6CgoJCWBgYAoJCSRfR0VUWyJ2YXIiXSA9PSBjZ2kuZ2V0WyJ2YXIiXQoJCSRfUE9TVFsidmFyIl0gPT0gY2dpLnBvc3RbInZhciJdCgkJJF9DT09LSUVbInZhciJdID09IGNnaS5jb29raWVzWyJ2YXIiXQoJCWBgYAoKCQlJbiBQSFAsIHlvdSBjYW4gZ2l2ZSBhIGZvcm0gZWxlbWVudCBhIG5hbWUgbGlrZSBgInNvbWV0aGluZ1tdImAsIGFuZCB0aGVuCgkJYCRfUE9TVFsic29tZXRoaW5nIl1gIGdpdmVzIGFuIGFycmF5LiBJbiBELCB5b3UgY2FuIHVzZSB3aGF0ZXZlciBuYW1lCgkJeW91IHdhbnQsIGFuZCBhY2Nlc3MgYW4gYXJyYXkgb2YgdmFsdWVzIHdpdGggdGhlIGBjZ2kuZ2V0QXJyYXlbIm5hbWUiXWAgYW5kCgkJYGNnaS5wb3N0QXJyYXlbIm5hbWUiXWAgbWVtYmVycy4KCgkJYGBgCgkJZWNobygiaGVsbG8iKTsgPT0gY2dpLndyaXRlKCJoZWxsbyIpOwoKCQkkX1NFUlZFUlsiUkVNT1RFX0FERFIiXSA9PSBjZ2kucmVtb3RlQWRkcmVzcwoJCSRfU0VSVkVSWyJIVFRQX0hPU1QiXSA9PSBjZ2kuaG9zdAoJCWBgYAoKCVNlZV9BbHNvOgoKCVlvdSBtYXkgYWxzbyB3YW50IHRvIHNlZSBkb20uZCwgd2ViLmQsIGFuZCBodG1sLmQgZm9yIG1vcmUgY29kZSBmb3IgbWFraW5nCgl3ZWIgYXBwbGljYXRpb25zLiBkYXRhYmFzZS5kLCBteXNxbC5kLCBwb3N0Z3Jlcy5kLCBhbmQgc3FsaXRlLmQgY2FuIGhlbHAgaW4KCWFjY2Vzc2luZyBkYXRhYmFzZXMuCgoJSWYgeW91IGFyZSBsb29raW5nIHRvIGFjY2VzcyBhIHdlYiBhcHBsaWNhdGlvbiB2aWEgSFRUUCwgdHJ5IGN1cmwuZC4KCglDb3B5cmlnaHQ6CgoJY2dpLmQgY29weXJpZ2h0IDIwMDgtMjAxNiwgQWRhbSBELiBSdXBwZS4gUHJvdmlkZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UuCgoJWWVzLCB0aGlzIGZpbGUgaXMgYWxtb3N0IGVpZ2h0IHllYXJzIG9sZCwgYW5kIHllcywgaXQgaXMgc3RpbGwgYWN0aXZlbHkgbWFpbnRhaW5lZCBhbmQgdXNlZC4KKy8KbW9kdWxlIGFyc2QuY2dpOwoKc3RhdGljIGltcG9ydCBzdGQuZmlsZTsKCnZlcnNpb24oZW1iZWRkZWRfaHR0cGQpIHsKCXZlcnNpb24obGludXgpCgkJdmVyc2lvbj1lbWJlZGRlZF9odHRwZF9wcm9jZXNzZXM7CgllbHNlCgkJdmVyc2lvbj1lbWJlZGRlZF9odHRwZF90aHJlYWRzOwoKCS8qCgl2ZXJzaW9uKHdpdGhfb3BlbnNzbCkgewoJCXByYWdtYShsaWIsICJjcnlwdG8iKTsKCQlwcmFnbWEobGliLCAic3NsIik7Cgl9CgkqLwp9CgplbnVtIGxvbmcgZGVmYXVsdE1heENvbnRlbnRMZW5ndGggPSA1XzAwMF8wMDA7CgovKgoKCVRvIGRvIGEgZmlsZSBkb3dubG9hZCBvZmZlciBpbiB0aGUgYnJvd3NlcjoKCiAgICBjZ2kuc2V0UmVzcG9uc2VDb250ZW50VHlwZSgidGV4dC9jc3YiKTsKICAgIGNnaS5oZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiY3VzdG9tZXJzLmNzdlwiIik7CiovCgovLyBGSVhNRTogdGhlIGxvY2F0aW9uIGhlYWRlciBpcyBzdXBwb3NlZCB0byBiZSBhbiBhYnNvbHV0ZSB1cmwgSSBndWVzcy4KCi8vIEZJWE1FOiB3b3VsZCBiZSBjb29sIHRvIGZsdXNoIHBhcnQgb2YgYSBkb20gZG9jdW1lbnQgYmVmb3JlIGNvbXBsZXRlCi8vIHNvbWVob3cgaW4gaGVyZSBhbmQgZG9tLmQuCgoKLy8gRklYTUU6IDEwMCBDb250aW51ZSBpbiB0aGUgbnBoIHNlY3Rpb24/IFByb2JhYmx5IGJlbG9uZ3Mgb24gdGhlCi8vIGh0dHBkIGNsYXNzIHRob3VnaC4KCi8vIHRoZXNlIGFyZSBwdWJsaWMgc28geW91IGNhbiBtaXhpbiBHZW5lcmljTWFpbi4KLy8gRklYTUU6IHVzZSBhIGZ1bmN0aW9uIGxldmVsIGltcG9ydCBpbnN0ZWFkIQpwdWJsaWMgaW1wb3J0IHN0ZC5zdHJpbmc7CnB1YmxpYyBpbXBvcnQgc3RkLnN0ZGlvOwpwdWJsaWMgaW1wb3J0IHN0ZC5jb252OwppbXBvcnQgc3RkLnVyaTsKaW1wb3J0IHN0ZC5leGNlcHRpb247CmltcG9ydCBzdGQuYmFzZTY0OwpzdGF0aWMgaW1wb3J0IHN0ZC5hbGdvcml0aG07CmltcG9ydCBzdGQuZGF0ZXRpbWU7CmltcG9ydCBzdGQucmFuZ2U7CgppbXBvcnQgc3RkLnByb2Nlc3M7CgppbXBvcnQgc3RkLnpsaWI7CgoKVFtdIGNvbnN1bWUoVCkoVFtdIHJhbmdlLCBpbnQgY291bnQpIHsKCWlmKGNvdW50ID4gcmFuZ2UubGVuZ3RoKQoJCWNvdW50ID0gcmFuZ2UubGVuZ3RoOwoJcmV0dXJuIHJhbmdlW2NvdW50Li4kXTsKfQoKaW50IGxvY2F0aW9uT2YoVCkoVFtdIGRhdGEsIHN0cmluZyBpdGVtKSB7Cgljb25zdCh1Ynl0ZVtdKSBkID0gY2FzdChjb25zdCh1Ynl0ZVtdKSkgZGF0YTsKCWNvbnN0KHVieXRlW10pIGkgPSBjYXN0KGNvbnN0KHVieXRlW10pKSBpdGVtOwoKCWZvcihpbnQgYSA9IDA7IGEgPCBkLmxlbmd0aDsgYSsrKSB7CgkJaWYoYSArIGkubGVuZ3RoID4gZC5sZW5ndGgpCgkJCXJldHVybiAtMTsKCQlpZihkW2EuLmEraS5sZW5ndGhdID09IGkpCgkJCXJldHVybiBhOwoJfQoKCXJldHVybiAtMTsKfQoKLy8vIElmIHlvdSBhcmUgZG9pbmcgYSBjdXN0b20gY2dpIGNsYXNzLCBtaXhpbmcgdGhpcyBpbiBjYW4gdGFrZSBjYXJlIG9mCi8vLyB0aGUgcmVxdWlyZWQgY29uc3RydWN0b3JzIGZvciB5b3UKbWl4aW4gdGVtcGxhdGUgRm9yd2FyZENnaUNvbnN0cnVjdG9ycygpIHsKCXRoaXMobG9uZyBtYXhDb250ZW50TGVuZ3RoID0gZGVmYXVsdE1heENvbnRlbnRMZW5ndGgsCgkJc3RyaW5nW3N0cmluZ10gZW52ID0gbnVsbCwKCQljb25zdCh1Ynl0ZSlbXSBkZWxlZ2F0ZSgpIHJlYWRkYXRhID0gbnVsbCwKCQl2b2lkIGRlbGVnYXRlKGNvbnN0KHVieXRlKVtdKSBfcmF3RGF0YU91dHB1dCA9IG51bGwsCgkJdm9pZCBkZWxlZ2F0ZSgpIF9mbHVzaCA9IG51bGwKCQkpIHsgc3VwZXIobWF4Q29udGVudExlbmd0aCwgZW52LCByZWFkZGF0YSwgX3Jhd0RhdGFPdXRwdXQsIF9mbHVzaCk7IH0KCgl0aGlzKHN0cmluZ1tdIGFyZ3MpIHsgc3VwZXIoYXJncyk7IH0KCgl0aGlzKAoJCUJ1ZmZlcmVkSW5wdXRSYW5nZSBpbnB1dERhdGEsCgkJc3RyaW5nIGFkZHJlc3MsIHVzaG9ydCBfcG9ydCwKCQlpbnQgcGF0aEluZm9TdGFydHMgPSAwLAoJCWJvb2wgX2h0dHBzID0gZmFsc2UsCgkJdm9pZCBkZWxlZ2F0ZShjb25zdCh1Ynl0ZSlbXSkgX3Jhd0RhdGFPdXRwdXQgPSBudWxsLAoJCXZvaWQgZGVsZWdhdGUoKSBfZmx1c2ggPSBudWxsLAoJCS8vIHRoaXMgcG9pbnRlciB0ZWxscyBpZiB0aGUgY29ubmVjdGlvbiBpcyBzdXBwb3NlZCB0byBiZSBjbG9zZWQgYWZ0ZXIgd2UgaGFuZGxlIHRoaXMKCQlib29sKiBjbG9zZUNvbm5lY3Rpb24gPSBudWxsKQoJewoJCXN1cGVyKGlucHV0RGF0YSwgYWRkcmVzcywgX3BvcnQsIHBhdGhJbmZvU3RhcnRzLCBfaHR0cHMsIF9yYXdEYXRhT3V0cHV0LCBfZmx1c2gsIGNsb3NlQ29ubmVjdGlvbik7Cgl9CgoJdGhpcyhCdWZmZXJlZElucHV0UmFuZ2UgaXIsIGJvb2wqIGNsb3NlQ29ubmVjdGlvbikgeyBzdXBlcihpciwgY2xvc2VDb25uZWN0aW9uKTsgfQp9CgoKIAp2ZXJzaW9uKFdpbmRvd3MpIHsKLy8gRklYTUU6IHVnbHkgaGFjayB0byBzb2x2ZSBzdGRpbiBleGNlcHRpb24gcHJvYmxlbXMgb24gV2luZG93czoKLy8gcmVhZGluZyBzdGRpbiByZXN1bHRzIGluIFN0ZGlvRXhjZXB0aW9uIChCYWQgZmlsZSBkZXNjcmlwdG9yKQovLyB0aGlzIGlzIHByb2JhYmx5IGR1ZSB0byBodHRwOi8vZC5wdXJlbWFnaWMuY29tL2lzc3Vlcy9zaG93X2J1Zy5jZ2k/aWQ9MzQyNQpwcml2YXRlIHN0cnVjdCBzdGRpbiB7CglzdHJ1Y3QgQnlDaHVuayB7IC8vIFJlcGxpY2F0ZXMgc3RkLnN0ZGlvLkJ5Q2h1bmsKCXByaXZhdGU6CgkJdWJ5dGVbXSBjaHVua187CglwdWJsaWM6CgkJdGhpcyhzaXplX3Qgc2l6ZSkKCQlpbiB7CgkJCWFzc2VydChzaXplLCAic2l6ZSBtdXN0IGJlIGxhcmdlciB0aGFuIDAiKTsKCQl9CgkJYm9keSB7CgkJCWNodW5rXyA9IG5ldyB1Ynl0ZVtdKHNpemUpOwoJCQlwb3BGcm9udCgpOwoJCX0KCgkJQHByb3BlcnR5IGJvb2wgZW1wdHkoKSBjb25zdCB7CgkJCXJldHVybiAhc3RkLnN0ZGlvLnN0ZGluLmlzT3BlbiB8fCBzdGQuc3RkaW8uc3RkaW4uZW9mOyAvLyBVZ2x5LCBidXQgc2VlbXMgdG8gZG8gdGhlIGpvYgoJCX0KCQlAcHJvcGVydHkgbm90aHJvdyB1Ynl0ZVtdIGZyb250KCkgewlyZXR1cm4gY2h1bmtfOyB9CgkJdm9pZCBwb3BGcm9udCgpCXsKCQkJZW5mb3JjZSghZW1wdHksICJDYW5ub3QgY2FsbCBwb3BGcm9udCBvbiBlbXB0eSByYW5nZSIpOwoJCQljaHVua18gPSBzdGRpbi5yYXdSZWFkKGNodW5rXyk7CgkJfQoJfQoKCWltcG9ydCBjb3JlLnN5cy53aW5kb3dzLndpbmRvd3M7CnN0YXRpYzoKCglzdGF0aWMgdGhpcygpIHsKCQkvLyBTZXQgc3RkaW4gdG8gYmluYXJ5IG1vZGUKCQl2ZXJzaW9uKFdpbjY0KQoJCV9zZXRtb2RlKHN0ZC5zdGRpby5zdGRpbi5maWxlbm8oKSwgMHg4MDAwKTsKCQllbHNlCgkJc2V0bW9kZShzdGQuc3RkaW8uc3RkaW4uZmlsZW5vKCksIDB4ODAwMCk7Cgl9CgoJVFtdIHJhd1JlYWQoVCkoVFtdIGJ1ZikgewoJCXVpbnQgYnl0ZXNSZWFkOwoJCWF1dG8gcmVzdWx0ID0gUmVhZEZpbGUoR2V0U3RkSGFuZGxlKFNURF9JTlBVVF9IQU5ETEUpLCBidWYucHRyLCBjYXN0KGludCkgKGJ1Zi5sZW5ndGggKiBULnNpemVvZiksICZieXRlc1JlYWQsIG51bGwpOwoKCQlpZiAoIXJlc3VsdCkgewoJCQlhdXRvIGVyciA9IEdldExhc3RFcnJvcigpOwoJCQlpZiAoZXJyID09IDM4LypFUlJPUl9IQU5ETEVfRU9GKi8gfHwgZXJyID09IDEwOS8qRVJST1JfQlJPS0VOX1BJUEUqLykgLy8gJ2dvb2QnIGVycm9ycyBtZWFuaW5nIGVuZCBvZiBpbnB1dAoJCQkJcmV0dXJuIGJ1ZlswLi4wXTsKCQkJLy8gU29tZSBvdGhlciBlcnJvciwgdGhyb3cgaXQKCgkJCWNoYXIqIGJ1ZmZlcjsKCQkJc2NvcGUoZXhpdCkgTG9jYWxGcmVlKGJ1ZmZlcik7CgoJCQkvLyBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIJPSAweDAwMDAwMTAwCgkJCS8vIEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNCQk9IDB4MDAwMDEwMDAKCQkJRm9ybWF0TWVzc2FnZUEoMHgxMTAwLCBudWxsLCBlcnIsIDAsIGNhc3QoY2hhciopJmJ1ZmZlciwgMjU2LCBudWxsKTsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbih0byFzdHJpbmcoYnVmZmVyKSk7CgkJfQoJCWVuZm9yY2UoIShieXRlc1JlYWQgJSBULnNpemVvZiksICJJL08gZXJyb3IiKTsKCQlyZXR1cm4gYnVmWzAuLmJ5dGVzUmVhZCAvIFQuc2l6ZW9mXTsKCX0KCglhdXRvIGJ5Q2h1bmsoc2l6ZV90IHN6KSB7IHJldHVybiBCeUNodW5rKHN6KTsgfQp9Cn0KCi8vLyBUaGUgbWFpbiBpbnRlcmZhY2Ugd2l0aCB0aGUgd2ViIHJlcXVlc3QKY2xhc3MgQ2dpIHsKICBwdWJsaWM6CgkvLy8gdGhlIG1ldGhvZHMgYSByZXF1ZXN0IGNhbiBiZQoJZW51bSBSZXF1ZXN0TWV0aG9kIHsgR0VULCBIRUFELCBQT1NULCBQVVQsIERFTEVURSwgLy8gR0VUIGFuZCBQT1NUIGFyZSB0aGUgb25lcyB0aGF0IHJlYWxseSB3b3JrCgkJLy8gdGhlc2UgYXJlIGRlZmluZWQgaW4gdGhlIHN0YW5kYXJkLCBidXQgaWRrIGlmIHRoZXkgYXJlIHVzZWZ1bCBmb3IgYW55dGhpbmcKCQlPUFRJT05TLCBUUkFDRSwgQ09OTkVDVCwKCQkvLyBUaGVzZSBzZWVtIG5ldywgSSBoYXZlIG9ubHkgcmVjZW50bHkgc2VlbiB0aGVtCgkJUEFUQ0gsIE1FUkdFLAoJCS8vIHRoaXMgaXMgYW4gZXh0ZW5zaW9uIGZvciB3aGVuIHRoZSBtZXRob2QgaXMgbm90IHNwZWNpZmllZCBhbmQgeW91IHdhbnQgdG8gYXNzdW1lCgkJQ29tbWFuZExpbmUgfQoKCgkvKwoJLysrCgkJQ2dpIHByb3ZpZGVzIGEgcGVyLXJlcXVlc3QgbWVtb3J5IHBvb2wKCgkrLwoJdm9pZFtdIGFsbG9jYXRlTWVtb3J5KHNpemVfdCBuQnl0ZXMpIHsKCgl9CgoJLy8vIGRpdHRvCgl2b2lkW10gcmVhbGxvY2F0ZU1lbW9yeSh2b2lkW10gb2xkLCBzaXplX3QgbkJ5dGVzKSB7CgoJfQoKCS8vLyBkaXR0bwoJdm9pZCBmcmVlTWVtb3J5KHZvaWRbXSBtZW1vcnkpIHsKCgl9CgkrLwoKCi8qCglpbXBvcnQgY29yZS5ydW50aW1lOwoJYXV0byBhcmdzID0gUnVudGltZS5hcmdzKCk7CgoJd2UgY2FuIGNhbGwgdGhlIGFwcCBhIGZldyB3YXlzOgoKCTEpIHNldCB1cCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBjYWxsIHRoZSBhcHAgKG1hbnVhbGx5IHNpbXVsYXRpbmcgQ0dJKQoJMikgc2ltdWxhdGUgYSBjYWxsIGF1dG9tYXRpY2FsbHk6CgkJLi9hcHAgbWV0aG9kICd1cmknCgoJCWZvciBleGFtcGxlOgoJCQkuL2FwcCBnZXQgL3BhdGg/YXJnIGFyZzI9c29tZXRoaW5nCgoJICBBbnl0aGluZyBvbiB0aGUgdXJpIGlzIHRyZWF0ZWQgYXMgcXVlcnkgc3RyaW5nIGV0YwoKCSAgb24gZ2V0IG1ldGhvZCwgZnVydGhlciBhcmdzIGFyZSBhcHBlbmRlZCB0byB0aGUgcXVlcnkgc3RyaW5nIChlbmNvZGVkIGF1dG9tYXRpY2FsbHkpCgkgIG9uIHBvc3QgbWV0aG9kLCBmdXJ0aGVyIGFyZ3MgYXJlIGRvbmUgYXMgcG9zdAoKCgkgIEBuYW1lIG1lYW5zIGltcG9ydCBmcm9tIGZpbGUgIm5hbWUiLiBpZiBuYW1lID09IC0sIGl0IHVzZXMgc3RkaW4KCSAgKHNvIGluZm89QC0gbWVhbnMgc2V0IGluZm8gdG8gdGhlIHZhbHVlIG9mIHN0ZGluKQoKCgkgIE90aGVyIGFyZ3VtZW50cyBpbmNsdWRlOgoJICAJLS1jb29raWUgbmFtZT12YWx1ZSAodGhlc2UgYXJlIGFsbCBjb25jYXRlZCB0b2dldGhlcikKCQktLWhlYWRlciAnWC1Tb21ldGhpbmc6IGNvb2wnCgkJLS1yZWZlcnJlciAnc29tZXRoaW5nJwoJCS0tcG9ydCA4MAoJCS0tcmVtb3RlLWFkZHJlc3Mgc29tZS5pcC5hZGRyZXNzLmhlcmUKCQktLWh0dHBzIHllcwoJCS0tdXNlci1hZ2VudCAnc29tZXRoaW5nJwoJCS0tdXNlcnBhc3MgJ3VzZXI6cGFzcycKCQktLWF1dGhvcml6YXRpb24gJ0Jhc2ljIGJhc2U2NGVuY29kZWRfdXNlcjpwYXNzJwoJCS0tYWNjZXB0ICdjb250ZW50JyAvLyBGSVhNRTogYmV0dGVyIGV4YW1wbGUKCQktLWxhc3QtZXZlbnQtaWQgJ3NvbWV0aGluZycKCQktLWhvc3QgJ3NvbWV0aGluZy5jb20nCgoJICBOb24tc2ltdWxhdGlvbiBhcmd1bWVudHM6CgkgIAktLXBvcnQgeHh4IGxpc3RlbmluZyBwb3J0IGZvciBub24tY2dpIHRoaW5ncyAodmFsaWQgZm9yIHRoZSBjZ2kgaW50ZXJmYWNlcykKCQktLWxpc3RlbmluZy1ob3N0ICB0aGUgaXAgYWRkcmVzcyB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGxpc3RlbiBvbiAob25seSBpbXBsZW1lbnRlZCBmb3IgZmFzdGNnaSByaWdodCBub3cpCgoqLwoKCS8qKiBJbml0aWFsaXplcyBpdCB3aXRoIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgKGZvciBlYXN5IHRlc3RpbmcpICovCgl0aGlzKHN0cmluZ1tdIGFyZ3MpIHsKCQkvLyB0aGVzZSBhcmUgYWxsIHNldCBsb2NhbGx5IHNvIHRoZSBsb29wIHdvcmtzCgkJLy8gd2l0aG91dCB0cmlnZ2VyaW5nIGVycm9ycyBpbiBkbWQgMi4wNjQKCQkvLyB3ZSBnbyBhaGVhZCBhbmQgc2V0IHRoZW0gYXQgdGhlIGVuZCBvZiBpdCB0byB0aGUgdGhpcyB2ZXJzaW9uCgkJaW50IHBvcnQ7CgkJc3RyaW5nIHJlZmVycmVyOwoJCXN0cmluZyByZW1vdGVBZGRyZXNzOwoJCXN0cmluZyB1c2VyQWdlbnQ7CgkJc3RyaW5nIGF1dGhvcml6YXRpb247CgkJc3RyaW5nIG9yaWdpbjsKCQlzdHJpbmcgYWNjZXB0OwoJCXN0cmluZyBsYXN0RXZlbnRJZDsKCQlib29sIGh0dHBzOwoJCXN0cmluZyBob3N0OwoJCVJlcXVlc3RNZXRob2QgcmVxdWVzdE1ldGhvZDsKCQlzdHJpbmcgcmVxdWVzdFVyaTsKCQlzdHJpbmcgcGF0aEluZm87CgkJc3RyaW5nIHF1ZXJ5U3RyaW5nOwoKCQlib29sIGxvb2tpbmdGb3JNZXRob2Q7CgkJYm9vbCBsb29raW5nRm9yVXJpOwoJCXN0cmluZyBuZXh0QXJnSXM7CgoJCXN0cmluZyBfY29va2llOwoJCXN0cmluZyBfcXVlcnlTdHJpbmc7CgkJc3RyaW5nW11bc3RyaW5nXSBfcG9zdDsKCQlzdHJpbmdbc3RyaW5nXSBfaGVhZGVyczsKCgkJc3RyaW5nW10gYnJlYWtVcChzdHJpbmcgcykgewoJCQlzdHJpbmcgaywgdjsKCQkJYXV0byBpZHggPSBzLmluZGV4T2YoIj0iKTsKCQkJaWYoaWR4ID09IC0xKSB7CgkJCQlrID0gczsKCQkJfSBlbHNlIHsKCQkJCWsgPSBzWzAgLi4gaWR4XTsKCQkJCXYgPSBzW2lkeCArIDEgLi4gJF07CgkJCX0KCgkJCXJldHVybiBbaywgdl07CgkJfQoKCQlsb29raW5nRm9yTWV0aG9kID0gdHJ1ZTsKCgkJc2NyaXB0TmFtZSA9IGFyZ3NbMF07CgkJc2NyaXB0RmlsZU5hbWUgPSBhcmdzWzBdOwoKCQllbnZpcm9ubWVudFZhcmlhYmxlcyA9IGNhc3QoY29uc3QpIGVudmlyb25tZW50LnRvQUE7CgoJCWZvcmVhY2goYXJnOyBhcmdzWzEgLi4gJF0pIHsKCQkJaWYoYXJnLnN0YXJ0c1dpdGgoIi0tIikpIHsKCQkJCW5leHRBcmdJcyA9IGFyZ1syIC4uICRdOwoJCQl9IGVsc2UgaWYobmV4dEFyZ0lzLmxlbmd0aCkgewoJCQkJc3dpdGNoKG5leHRBcmdJcykgewoJCQkJCWNhc2UgImNvb2tpZSI6CgkJCQkJCWF1dG8gaW5mbyA9IGJyZWFrVXAoYXJnKTsKCQkJCQkJaWYoX2Nvb2tpZS5sZW5ndGgpCgkJCQkJCQlfY29va2llIH49ICI7ICI7CgkJCQkJCV9jb29raWUgfj0gc3RkLnVyaS5lbmNvZGVDb21wb25lbnQoaW5mb1swXSkgfiAiPSIgfiBzdGQudXJpLmVuY29kZUNvbXBvbmVudChpbmZvWzFdKTsKCQkJCQlicmVhazsKCQkJCQljYXNlICJwb3J0IjoKCQkJCQkJcG9ydCA9IHRvIWludChhcmcpOwoJCQkJCWJyZWFrOwoJCQkJCWNhc2UgInJlZmVycmVyIjoKCQkJCQkJcmVmZXJyZXIgPSBhcmc7CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAicmVtb3RlLWFkZHJlc3MiOgoJCQkJCQlyZW1vdGVBZGRyZXNzID0gYXJnOwoJCQkJCWJyZWFrOwoJCQkJCWNhc2UgInVzZXItYWdlbnQiOgoJCQkJCQl1c2VyQWdlbnQgPSBhcmc7CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAiYXV0aG9yaXphdGlvbiI6CgkJCQkJCWF1dGhvcml6YXRpb24gPSBhcmc7CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAidXNlcnBhc3MiOgoJCQkJCQlhdXRob3JpemF0aW9uID0gIkJhc2ljICIgfiBCYXNlNjQuZW5jb2RlKGNhc3QoaW1tdXRhYmxlKHVieXRlKVtdKSAoYXJnKSkuaWR1cDsKCQkJCQlicmVhazsKCQkJCQljYXNlICJvcmlnaW4iOgoJCQkJCQlvcmlnaW4gPSBhcmc7CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAiYWNjZXB0IjoKCQkJCQkJYWNjZXB0ID0gYXJnOwoJCQkJCWJyZWFrOwoJCQkJCWNhc2UgImxhc3QtZXZlbnQtaWQiOgoJCQkJCQlsYXN0RXZlbnRJZCA9IGFyZzsKCQkJCQlicmVhazsKCQkJCQljYXNlICJodHRwcyI6CgkJCQkJCWlmKGFyZyA9PSAieWVzIikKCQkJCQkJCWh0dHBzID0gdHJ1ZTsKCQkJCQlicmVhazsKCQkJCQljYXNlICJoZWFkZXIiOgoJCQkJCQlzdHJpbmcgdGhpbmcsIG90aGVyOwoJCQkJCQlhdXRvIGlkeCA9IGFyZy5pbmRleE9mKCI6Iik7CgkJCQkJCWlmKGlkeCA9PSAtMSkKCQkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIm5lZWQgYSBjb2xvbiBpbiBhIGh0dHAgaGVhZGVyIik7CgkJCQkJCXRoaW5nID0gYXJnWzAgLi4gaWR4XTsKCQkJCQkJb3RoZXIgPSBhcmdbaWR4ICsgMS4uICRdOwoJCQkJCQlfaGVhZGVyc1t0aGluZy5zdHJpcC50b0xvd2VyKCldID0gb3RoZXIuc3RyaXA7CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAiaG9zdCI6CgkJCQkJCWhvc3QgPSBhcmc7CgkJCQkJYnJlYWs7CgkJCQkJZGVmYXVsdDoKCQkJCQkJLy8gc2tpcCwgd2UgZG9uJ3Qga25vdyBpdCBidXQgdGhhdCdzIG9rLCBpdCBtaWdodCBiZSB1c2VkIGVsc2V3aGVyZSBzbyBubyBlcnJvcgoJCQkJfQoKCQkJCW5leHRBcmdJcyA9IG51bGw7CgkJCX0gZWxzZSBpZihsb29raW5nRm9yTWV0aG9kKSB7CgkJCQlsb29raW5nRm9yTWV0aG9kID0gZmFsc2U7CgkJCQlsb29raW5nRm9yVXJpID0gdHJ1ZTsKCgkJCQlpZihhcmcudG9Mb3dlcigpID09ICJjb21tYW5kbGluZSIpCgkJCQkJcmVxdWVzdE1ldGhvZCA9IFJlcXVlc3RNZXRob2QuQ29tbWFuZExpbmU7CgkJCQllbHNlCgkJCQkJcmVxdWVzdE1ldGhvZCA9IHRvIVJlcXVlc3RNZXRob2QoYXJnLnRvVXBwZXIoKSk7CgkJCX0gZWxzZSBpZihsb29raW5nRm9yVXJpKSB7CgkJCQlsb29raW5nRm9yVXJpID0gZmFsc2U7CgoJCQkJcmVxdWVzdFVyaSA9IGFyZzsKCgkJCQlhdXRvIGlkeCA9IGFyZy5pbmRleE9mKCI/Iik7CgkJCQlpZihpZHggPT0gLTEpCgkJCQkJcGF0aEluZm8gPSBhcmc7CgkJCQllbHNlIHsKCQkJCQlwYXRoSW5mbyA9IGFyZ1swIC4uIGlkeF07CgkJCQkJX3F1ZXJ5U3RyaW5nID0gYXJnW2lkeCArIDEgLi4gJF07CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkvLyBpdCBpcyBhbiBhcmd1bWVudCBvZiBzb21lIHNvcnQKCQkJCWlmKHJlcXVlc3RNZXRob2QgPT0gQ2dpLlJlcXVlc3RNZXRob2QuUE9TVCkgewoJCQkJCWF1dG8gcGFydHMgPSBicmVha1VwKGFyZyk7CgkJCQkJX3Bvc3RbcGFydHNbMF1dIH49IHBhcnRzWzFdOwoJCQkJfSBlbHNlIHsKCQkJCQlpZihfcXVlcnlTdHJpbmcubGVuZ3RoKQoJCQkJCQlfcXVlcnlTdHJpbmcgfj0gIiYiOwoJCQkJCWF1dG8gcGFydHMgPSBicmVha1VwKGFyZyk7CgkJCQkJX3F1ZXJ5U3RyaW5nIH49IHN0ZC51cmkuZW5jb2RlQ29tcG9uZW50KHBhcnRzWzBdKSB+ICI9IiB+IHN0ZC51cmkuZW5jb2RlQ29tcG9uZW50KHBhcnRzWzFdKTsKCQkJCX0KCQkJfQoJCX0KCgkJYWNjZXB0c0d6aXAgPSBmYWxzZTsKCQlrZWVwQWxpdmVSZXF1ZXN0ZWQgPSBmYWxzZTsKCQlyZXF1ZXN0SGVhZGVycyA9IGNhc3QoaW1tdXRhYmxlKSBfaGVhZGVyczsKCgkJY29va2llID0gX2Nvb2tpZTsKCQljb29raWVzQXJyYXkgPSAgZ2V0Q29va2llQXJyYXkoKTsKCQljb29raWVzID0ga2VlcExhc3RPZihjb29raWVzQXJyYXkpOwoKCQlxdWVyeVN0cmluZyA9IF9xdWVyeVN0cmluZzsKCQlnZXRBcnJheSA9IGNhc3QoaW1tdXRhYmxlKSBkZWNvZGVWYXJpYWJsZXMocXVlcnlTdHJpbmcpOwoJCWdldCA9IGtlZXBMYXN0T2YoZ2V0QXJyYXkpOwoKCQlwb3N0QXJyYXkgPSBjYXN0KGltbXV0YWJsZSkgX3Bvc3Q7CgkJcG9zdCA9IGtlZXBMYXN0T2YoX3Bvc3QpOwoKCQkvLyBGSVhNRQoJCWZpbGVzQXJyYXkgPSBudWxsOwoJCWZpbGVzID0gbnVsbDsKCgkJaXNDYWxsZWRXaXRoQ29tbWFuZExpbmVBcmd1bWVudHMgPSB0cnVlOwoKCQl0aGlzLnBvcnQgPSBwb3J0OwoJCXRoaXMucmVmZXJyZXIgPSByZWZlcnJlcjsKCQl0aGlzLnJlbW90ZUFkZHJlc3MgPSByZW1vdGVBZGRyZXNzOwoJCXRoaXMudXNlckFnZW50ID0gdXNlckFnZW50OwoJCXRoaXMuYXV0aG9yaXphdGlvbiA9IGF1dGhvcml6YXRpb247CgkJdGhpcy5vcmlnaW4gPSBvcmlnaW47CgkJdGhpcy5hY2NlcHQgPSBhY2NlcHQ7CgkJdGhpcy5sYXN0RXZlbnRJZCA9IGxhc3RFdmVudElkOwoJCXRoaXMuaHR0cHMgPSBodHRwczsKCQl0aGlzLmhvc3QgPSBob3N0OwoJCXRoaXMucmVxdWVzdE1ldGhvZCA9IHJlcXVlc3RNZXRob2Q7CgkJdGhpcy5yZXF1ZXN0VXJpID0gcmVxdWVzdFVyaTsKCQl0aGlzLnBhdGhJbmZvID0gcGF0aEluZm87CgkJdGhpcy5xdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nOwoJCXRoaXMucG9zdEpzb24gPSBudWxsOwoJfQoKCS8qKiBJbml0aWFsaXplcyBpdCB1c2luZyBhIENHSSBvciBDR0ktbGlrZSBpbnRlcmZhY2UgKi8KCXRoaXMobG9uZyBtYXhDb250ZW50TGVuZ3RoID0gZGVmYXVsdE1heENvbnRlbnRMZW5ndGgsCgkJLy8gdXNlIHRoaXMgdG8gb3ZlcnJpZGUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGxpc3RpbmcKCQlpbiBzdHJpbmdbc3RyaW5nXSBlbnYgPSBudWxsLAoJCS8vIGFuZCB0aGlzIHNob3VsZCByZXR1cm4gYSBjaHVuayBvZiBkYXRhLiByZXR1cm4gZW1wdHkgd2hlbiBkb25lCgkJY29uc3QodWJ5dGUpW10gZGVsZWdhdGUoKSByZWFkZGF0YSA9IG51bGwsCgkJLy8gZmluYWxseSwgdXNlIHRoaXMgdG8gZG8gY3VzdG9tIG91dHB1dCBpZiBuZWVkZWQKCQl2b2lkIGRlbGVnYXRlKGNvbnN0KHVieXRlKVtdKSBfcmF3RGF0YU91dHB1dCA9IG51bGwsCgkJLy8gdG8gZmx1c2ggdGVoIGN1c3RvbSBvdXRwdXQKCQl2b2lkIGRlbGVnYXRlKCkgX2ZsdXNoID0gbnVsbAoJCSkKCXsKCgkJLy8gdGhlc2UgYXJlIGFsbCBzZXQgbG9jYWxseSBzbyB0aGUgbG9vcCB3b3JrcwoJCS8vIHdpdGhvdXQgdHJpZ2dlcmluZyBlcnJvcnMgaW4gZG1kIDIuMDY0CgkJLy8gd2UgZ28gYWhlYWQgYW5kIHNldCB0aGVtIGF0IHRoZSBlbmQgb2YgaXQgdG8gdGhlIHRoaXMgdmVyc2lvbgoJCWludCBwb3J0OwoJCXN0cmluZyByZWZlcnJlcjsKCQlzdHJpbmcgcmVtb3RlQWRkcmVzczsKCQlzdHJpbmcgdXNlckFnZW50OwoJCXN0cmluZyBhdXRob3JpemF0aW9uOwoJCXN0cmluZyBvcmlnaW47CgkJc3RyaW5nIGFjY2VwdDsKCQlzdHJpbmcgbGFzdEV2ZW50SWQ7CgkJYm9vbCBodHRwczsKCQlzdHJpbmcgaG9zdDsKCQlSZXF1ZXN0TWV0aG9kIHJlcXVlc3RNZXRob2Q7CgkJc3RyaW5nIHJlcXVlc3RVcmk7CgkJc3RyaW5nIHBhdGhJbmZvOwoJCXN0cmluZyBxdWVyeVN0cmluZzsKCgoKCQlpc0NhbGxlZFdpdGhDb21tYW5kTGluZUFyZ3VtZW50cyA9IGZhbHNlOwoJCXJhd0RhdGFPdXRwdXQgPSBfcmF3RGF0YU91dHB1dDsKCQlmbHVzaERlbGVnYXRlID0gX2ZsdXNoOwoJCWF1dG8gZ2V0ZW52ID0gZGVsZWdhdGUgc3RyaW5nKHN0cmluZyB2YXIpIHsKCQkJaWYoZW52IGlzIG51bGwpCgkJCQlyZXR1cm4gc3RkLnByb2Nlc3MuZW52aXJvbm1lbnQuZ2V0KHZhcik7CgkJCWF1dG8gZSA9IHZhciBpbiBlbnY7CgkJCWlmKGUgaXMgbnVsbCkKCQkJCXJldHVybiBudWxsOwoJCQlyZXR1cm4gKmU7CgkJfTsKCgkJZW52aXJvbm1lbnRWYXJpYWJsZXMgPSBlbnYgaXMgbnVsbCA/CgkJCWNhc3QoY29uc3QpIGVudmlyb25tZW50LnRvQUEgOgoJCQllbnY7CgoJCS8vIGZldGNoaW5nIGFsbCB0aGUgcmVxdWVzdCBoZWFkZXJzCgkJc3RyaW5nW3N0cmluZ10gcmVxdWVzdEhlYWRlcnNIZXJlOwoJCWZvcmVhY2goaywgdjsgZW52IGlzIG51bGwgPyBjYXN0KGNvbnN0KSBlbnZpcm9ubWVudC50b0FBKCkgOiBlbnYpIHsKCQkJaWYoay5zdGFydHNXaXRoKCJIVFRQXyIpKSB7CgkJCQlyZXF1ZXN0SGVhZGVyc0hlcmVbcmVwbGFjZShrWyJIVFRQXyIubGVuZ3RoIC4uICRdLnRvTG93ZXIoKSwgIl8iLCAiLSIpXSA9IHY7CgkJCX0KCQl9CgoJCXRoaXMucmVxdWVzdEhlYWRlcnMgPSBhc3N1bWVVbmlxdWUocmVxdWVzdEhlYWRlcnNIZXJlKTsKCgkJcmVxdWVzdFVyaSA9IGdldGVudigiUkVRVUVTVF9VUkkiKTsKCgkJY29va2llID0gZ2V0ZW52KCJIVFRQX0NPT0tJRSIpOwoJCWNvb2tpZXNBcnJheSA9IGdldENvb2tpZUFycmF5KCk7CgkJY29va2llcyA9IGtlZXBMYXN0T2YoY29va2llc0FycmF5KTsKCgkJcmVmZXJyZXIgPSBnZXRlbnYoIkhUVFBfUkVGRVJFUiIpOwoJCXVzZXJBZ2VudCA9IGdldGVudigiSFRUUF9VU0VSX0FHRU5UIik7CgkJcmVtb3RlQWRkcmVzcyA9IGdldGVudigiUkVNT1RFX0FERFIiKTsKCQlob3N0ID0gZ2V0ZW52KCJIVFRQX0hPU1QiKTsKCQlwYXRoSW5mbyA9IGdldGVudigiUEFUSF9JTkZPIik7CgoJCXF1ZXJ5U3RyaW5nID0gZ2V0ZW52KCJRVUVSWV9TVFJJTkciKTsKCQlzY3JpcHROYW1lID0gZ2V0ZW52KCJTQ1JJUFRfTkFNRSIpOwoJCXsKCQkJaW1wb3J0IGNvcmUucnVudGltZTsKCQkJYXV0byBzZm4gPSBnZXRlbnYoIlNDUklQVF9GSUxFTkFNRSIpOwoJCQlzY3JpcHRGaWxlTmFtZSA9IHNmbi5sZW5ndGggPyBzZm4gOiBSdW50aW1lLmFyZ3NbMF07CgkJfQoKCQlib29sIGlpcyA9IGZhbHNlOwoKCQkvLyBCZWNhdXNlIElJUyBkb2Vzbid0IHBhc3MgcmVxdWVzdFVyaSwgd2Ugc2ltdWxhdGUgaXQgaGVyZSBpZiBpdCdzIGVtcHR5LgoJCWlmKHJlcXVlc3RVcmkubGVuZ3RoID09IDApIHsKCQkJLy8gSUlTIHNvbWV0aW1lcyBpbmNsdWRlcyB0aGUgc2NyaXB0IG5hbWUgYXMgcGFydCBvZiB0aGUgcGF0aCBpbmZvIC0gd2UgZG9uJ3Qgd2FudCB0aGF0CgkJCWlmKHBhdGhJbmZvLmxlbmd0aCA+PSBzY3JpcHROYW1lLmxlbmd0aCAmJiAocGF0aEluZm9bMCAuLiBzY3JpcHROYW1lLmxlbmd0aF0gPT0gc2NyaXB0TmFtZSkpCgkJCQlwYXRoSW5mbyA9IHBhdGhJbmZvW3NjcmlwdE5hbWUubGVuZ3RoIC4uICRdOwoKCQkJcmVxdWVzdFVyaSA9IHNjcmlwdE5hbWUgfiBwYXRoSW5mbyB+IChxdWVyeVN0cmluZy5sZW5ndGggPyAoIj8iIH4gcXVlcnlTdHJpbmcpIDogIiIpOwoKCQkJaWlzID0gdHJ1ZTsgLy8gRklYTUUgSEFDSyAtIHVzZWQgaW4gYnlDaHVuayBiZWxvdyAtIHNlZSBidWd6aWxsYSA2MzM5CgoJCQkvLyBGSVhNRTogdGhpcyB3b3JrcyBmb3IgYXBhY2hlIGFuZCBpaXMuLi4gYnV0IHdoYXQgYWJvdXQgb3RoZXJzPwoJCX0KCgoJCWdldCA9IGdldEdldFZhcmlhYmxlcyhxdWVyeVN0cmluZyk7CgkJYXV0byB1Z2ggPSBkZWNvZGVWYXJpYWJsZXMocXVlcnlTdHJpbmcpOwoJCWdldEFycmF5ID0gYXNzdW1lVW5pcXVlKHVnaCk7CgoKCQkvLyBOT1RFOiBvbiBzaGl0cGFjaGUsIHlvdSBuZWVkIHRvIHNwZWNpZmljYWxseSBmb3J3YXJkIHRoaXMKCQlhdXRob3JpemF0aW9uID0gZ2V0ZW52KCJIVFRQX0FVVEhPUklaQVRJT04iKTsKCQkvLyB0aGlzIGlzIGEgaGFjayBiZWNhdXNlIEFwYWNoZSBpcyBhIHNoaXRsb2FkIG9mIGZ1Y2sgYW5kCgkJLy8gcmVmdXNlcyB0byBzZW5kIHRoZSByZWFsIGhlYWRlciB0byB1cy4gQ29tcGF0aWJsZQoJCS8vIHByb2dyYW1zIHNob3VsZCBzZW5kIGJvdGggdGhlIHN0YW5kYXJkIGFuZCBYLSB2ZXJzaW9ucwoKCQkvLyBOT1RFOiBpZiB5b3UgaGF2ZSBhY2Nlc3MgdG8gLmh0YWNjZXNzIG9yIGh0dHBkLmNvbmYsIHlvdSBjYW4gbWFrZSB0aGlzCgkJLy8gdW5uZWNlc3Nhcnkgd2l0aCBtb2RfcmV3cml0ZSwgc28gaXQgaXMgY29tbWVudGVkCgoJCS8vaWYoYXV0aG9yaXphdGlvbi5sZW5ndGggPT0gMCkgLy8gaWYgdGhlIHN0ZCBpcyB0aGVyZSwgdXNlIGl0CgkJLy8JYXV0aG9yaXphdGlvbiA9IGdldGVudigiSFRUUF9YX0FVVEhPUklaQVRJT04iKTsKCgkJLy8gdGhlIFJFRElSRUNUX0hUVFBTIGNoZWNrIGlzIGhlcmUgYmVjYXVzZSB3aXRoIGFuIEFwYWNoZSBoYWNrLCB0aGUgcG9ydCBjYW4gYmVjb21lIHdyb25nCgkJaWYoZ2V0ZW52KCJTRVJWRVJfUE9SVCIpLmxlbmd0aCAmJiBnZXRlbnYoIlJFRElSRUNUX0hUVFBTIikgIT0gIm9uIikKCQkJcG9ydCA9IHRvIWludChnZXRlbnYoIlNFUlZFUl9QT1JUIikpOwoJCWVsc2UKCQkJcG9ydCA9IDA7IC8vIHRoaXMgd2FzIHByb2JhYmx5IGNhbGxlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUKCgkJYXV0byBhZSA9IGdldGVudigiSFRUUF9BQ0NFUFRfRU5DT0RJTkciKTsKCQlpZihhZS5sZW5ndGggJiYgYWUuaW5kZXhPZigiZ3ppcCIpICE9IC0xKQoJCQlhY2NlcHRzR3ppcCA9IHRydWU7CgoJCWFjY2VwdCA9IGdldGVudigiSFRUUF9BQ0NFUFQiKTsKCQlsYXN0RXZlbnRJZCA9IGdldGVudigiSFRUUF9MQVNUX0VWRU5UX0lEIik7CgoJCWF1dG8ga2EgPSBnZXRlbnYoIkhUVFBfQ09OTkVDVElPTiIpOwoJCWlmKGthLmxlbmd0aCAmJiBrYS50b0xvd2VyKCkuaW5kZXhPZigia2VlcC1hbGl2ZSIpICE9IC0xKQoJCQlrZWVwQWxpdmVSZXF1ZXN0ZWQgPSB0cnVlOwoKCQlhdXRvIG9yID0gZ2V0ZW52KCJIVFRQX09SSUdJTiIpOwoJCQlvcmlnaW4gPSBvcjsKCgkJYXV0byBybSA9IGdldGVudigiUkVRVUVTVF9NRVRIT0QiKTsKCQlpZihybS5sZW5ndGgpCgkJCXJlcXVlc3RNZXRob2QgPSB0byFSZXF1ZXN0TWV0aG9kKGdldGVudigiUkVRVUVTVF9NRVRIT0QiKSk7CgkJZWxzZQoJCQlyZXF1ZXN0TWV0aG9kID0gUmVxdWVzdE1ldGhvZC5Db21tYW5kTGluZTsKCgkJCQkJCS8vIEZJWE1FOiBoYWNrIG9uIFJFRElSRUNUX0hUVFBTOyB0aGlzIGlzIHRoZXJlIGJlY2F1c2UgdGhlIHdvcmsgYXBwIHVzZXMgbW9kX3Jld3JpdGUgd2hpY2ggbG9zZXMgdGhlIGh0dHBzIGZsYWchIFNvIEkgc2V0IGl0IHdpdGggW0U9SFRUUFM9JUhUVFBTXSBvciB3aGF0ZXZlciBidXQgdGhlbiBpdCBnZXRzIHRyYW5zbGF0ZWQgdG8gaGVyZSBzbyBpIHdhbnQgaXQgdG8gc3RpbGwgd29yay4gVGhpcyBpcyBhcmd1YWJseSB3cm9uZyBidXQgbWVoLgoJCWh0dHBzID0gKGdldGVudigiSFRUUFMiKSA9PSAib24iIHx8IGdldGVudigiUkVESVJFQ1RfSFRUUFMiKSA9PSAib24iKTsKCgkJLy8gRklYTUU6IERPQ1VNRU5UX1JPT1Q/CgoJCS8vIEZJWE1FOiB3aGF0IGFib3V0IFBVVD8KCQlpZihyZXF1ZXN0TWV0aG9kID09IFJlcXVlc3RNZXRob2QuUE9TVCkgewoJCQl2ZXJzaW9uKHByZXNlcnZlRGF0YSkgLy8gYSBoYWNrIHRvIG1ha2UgZm9yd2FyZGluZyBzaW1wbGVyCgkJCQlpbW11dGFibGUodWJ5dGUpW10gZGF0YTsKCQkJc2l6ZV90IGFtb3VudFJlY2VpdmVkID0gMDsKCQkJYXV0byBjb250ZW50VHlwZSA9IGdldGVudigiQ09OVEVOVF9UWVBFIik7CgoJCQkvLyBGSVhNRTogaXMgdGhpcyBldmVyIG5vdCBnb2luZyB0byBiZSBzZXQ/IEkgZ3Vlc3MgaXQgZGVwZW5kcwoJCQkvLyBvbiBpZiB0aGUgc2VydmVyIGRlLWNodW5rcyBhbmQgYnVmZmVycy4uLiBzZWVtcyBsaWtlIGl0IGhhcyBwb3RlbnRpYWwKCQkJLy8gdG8gYmUgc2xvdyBpZiB0aGV5IGRpZCB0aGF0LiBUaGUgc3BlYyBzYXlzIGl0IGlzIGFsd2F5cyB0aGVyZSB0aG91Z2guCgkJCS8vIEFuZCBpdCBoYXMgd29ya2VkIHJlbGlhYmx5IGZvciBtZSBhbGwgeWVhciBpbiB0aGUgbGl2ZSBlbnZpcm9ubWVudCwKCQkJLy8gYnV0IHNvbWUgc2VydmVycyBtaWdodCBiZSBkaWZmZXJlbnQuCgkJCWF1dG8gY29udGVudExlbmd0aCA9IHRvIXNpemVfdChnZXRlbnYoIkNPTlRFTlRfTEVOR1RIIikpOwoKCQkJaW1tdXRhYmxlIG9yaWdpbmFsQ29udGVudExlbmd0aCA9IGNvbnRlbnRMZW5ndGg7CgkJCWlmKGNvbnRlbnRMZW5ndGgpIHsKCQkJCWlmKG1heENvbnRlbnRMZW5ndGggPiAwICYmIGNvbnRlbnRMZW5ndGggPiBtYXhDb250ZW50TGVuZ3RoKSB7CgkJCQkJc2V0UmVzcG9uc2VTdGF0dXMoIjQxMyBSZXF1ZXN0IGVudGl0eSB0b28gbGFyZ2UiKTsKCQkJCQl3cml0ZSgiWW91IHRyaWVkIHRvIHVwbG9hZCBhIGZpbGUgdGhhdCBpcyB0b28gbGFyZ2UuIik7CgkJCQkJY2xvc2UoKTsKCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJQT1NUIHRvbyBsYXJnZSIpOwoJCQkJfQoJCQkJcHJlcGFyZUZvckluY29taW5nRGF0YUNodW5rcyhjb250ZW50VHlwZSwgY29udGVudExlbmd0aCk7CgoKCQkJCWludCBwcm9jZXNzQ2h1bmsoaW4gdWJ5dGVbXSBjaHVuaykgewoJCQkJCWlmKGNodW5rLmxlbmd0aCA+IGNvbnRlbnRMZW5ndGgpIHsKCQkJCQkJaGFuZGxlSW5jb21pbmdEYXRhQ2h1bmsoY2h1bmtbMC4uY29udGVudExlbmd0aF0pOwoJCQkJCQlhbW91bnRSZWNlaXZlZCArPSBjb250ZW50TGVuZ3RoOwoJCQkJCQljb250ZW50TGVuZ3RoID0gMDsKCQkJCQkJcmV0dXJuIDE7CgkJCQkJfSBlbHNlIHsKCQkJCQkJaGFuZGxlSW5jb21pbmdEYXRhQ2h1bmsoY2h1bmspOwoJCQkJCQljb250ZW50TGVuZ3RoIC09IGNodW5rLmxlbmd0aDsKCQkJCQkJYW1vdW50UmVjZWl2ZWQgKz0gY2h1bmsubGVuZ3RoOwoJCQkJCX0KCQkJCQlpZihjb250ZW50TGVuZ3RoID09IDApCgkJCQkJCXJldHVybiAxOwoKCQkJCQlvblJlcXVlc3RCb2R5RGF0YVJlY2VpdmVkKGFtb3VudFJlY2VpdmVkLCBvcmlnaW5hbENvbnRlbnRMZW5ndGgpOwoJCQkJCXJldHVybiAwOwoJCQkJfQoKCgkJCQlpZihyZWFkZGF0YSBpcyBudWxsKSB7CgkJCQkJZm9yZWFjaCh1Ynl0ZVtdIGNodW5rOyBzdGRpbi5ieUNodW5rKGlpcyA/IGNvbnRlbnRMZW5ndGggOiA0MDk2KSkKCQkJCQkJaWYocHJvY2Vzc0NodW5rKGNodW5rKSkKCQkJCQkJCWJyZWFrOwoJCQkJfSBlbHNlIHsKCQkJCQkvLyB3ZSBoYXZlIGEgY3VzdG9tIGRhdGEgc291cmNlLi4KCQkJCQlhdXRvIGNodW5rID0gcmVhZGRhdGEoKTsKCQkJCQl3aGlsZShjaHVuay5sZW5ndGgpIHsKCQkJCQkJaWYocHJvY2Vzc0NodW5rKGNodW5rKSkKCQkJCQkJCWJyZWFrOwoJCQkJCQljaHVuayA9IHJlYWRkYXRhKCk7CgkJCQkJfQoJCQkJfQoKCQkJCW9uUmVxdWVzdEJvZHlEYXRhUmVjZWl2ZWQoYW1vdW50UmVjZWl2ZWQsIG9yaWdpbmFsQ29udGVudExlbmd0aCk7CgkJCQlwb3N0QXJyYXkgPSBhc3N1bWVVbmlxdWUocHBzLl9wb3N0KTsKCQkJCWZpbGVzQXJyYXkgPSBhc3N1bWVVbmlxdWUocHBzLl9maWxlcyk7CgkJCQlmaWxlcyA9IGtlZXBMYXN0T2YoZmlsZXNBcnJheSk7CgkJCQlwb3N0ID0ga2VlcExhc3RPZihwb3N0QXJyYXkpOwoJCQkJdGhpcy5wb3N0SnNvbiA9IHBwcy5wb3N0SnNvbjsKCQkJCWNsZWFuVXBQb3N0RGF0YVN0YXRlKCk7CgkJCX0KCgkJCXZlcnNpb24ocHJlc2VydmVEYXRhKQoJCQkJb3JpZ2luYWxQb3N0RGF0YSA9IGRhdGE7CgkJfQoJCS8vIGZpeG1lOiByZW1vdGVfdXNlciBzY3JpcHQgbmFtZQoKCgkJdGhpcy5wb3J0ID0gcG9ydDsKCQl0aGlzLnJlZmVycmVyID0gcmVmZXJyZXI7CgkJdGhpcy5yZW1vdGVBZGRyZXNzID0gcmVtb3RlQWRkcmVzczsKCQl0aGlzLnVzZXJBZ2VudCA9IHVzZXJBZ2VudDsKCQl0aGlzLmF1dGhvcml6YXRpb24gPSBhdXRob3JpemF0aW9uOwoJCXRoaXMub3JpZ2luID0gb3JpZ2luOwoJCXRoaXMuYWNjZXB0ID0gYWNjZXB0OwoJCXRoaXMubGFzdEV2ZW50SWQgPSBsYXN0RXZlbnRJZDsKCQl0aGlzLmh0dHBzID0gaHR0cHM7CgkJdGhpcy5ob3N0ID0gaG9zdDsKCQl0aGlzLnJlcXVlc3RNZXRob2QgPSByZXF1ZXN0TWV0aG9kOwoJCXRoaXMucmVxdWVzdFVyaSA9IHJlcXVlc3RVcmk7CgkJdGhpcy5wYXRoSW5mbyA9IHBhdGhJbmZvOwoJCXRoaXMucXVlcnlTdHJpbmcgPSBxdWVyeVN0cmluZzsKCX0KCgkvLy8gQ2xlYW5zIHVwIGFueSB0ZW1wb3JhcnkgZmlsZXMuIERvIG5vdCB1c2UgdGhlIG9iamVjdAoJLy8vIGFmdGVyIGNhbGxpbmcgdGhpcy4KCS8vLwoJLy8vIE5PVEU6IGl0IGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IEdlbmVyaWNNYWluCgkvLyBGSVhNRTogdGhpcyBzaG91bGQgYmUgY2FsbGVkIGlmIHRoZSBjb25zdHJ1Y3RvciBmYWlscyB0b28sIGlmIGl0IGhhcyBjcmVhdGVkIHNvbWUgZ2FyYmFnZS4uLgoJdm9pZCBkaXNwb3NlKCkgewoJCWZvcmVhY2goZmlsZTsgZmlsZXMpIHsKCQkJaWYoIWZpbGUuY29udGVudEluTWVtb3J5KQoJCQkJaWYoc3RkLmZpbGUuZXhpc3RzKGZpbGUuY29udGVudEZpbGVuYW1lKSkKCQkJCQlzdGQuZmlsZS5yZW1vdmUoZmlsZS5jb250ZW50RmlsZW5hbWUpOwoJCX0KCX0KCglwcml2YXRlIHsKCQlzdHJ1Y3QgUG9zdFBhcnNlclN0YXRlIHsKCQkJc3RyaW5nIGNvbnRlbnRUeXBlOwoJCQlzdHJpbmcgYm91bmRhcnk7CgkJCXN0cmluZyBsb2NhbEJvdW5kYXJ5OyAvLyB0aGUgb25lcyB1c2VkIGF0IHRoZSBlbmQgb3Igc29tZXRoaW5nIGxvbAoJCQlib29sIGlzTXVsdGlwYXJ0OwoJCQlib29sIGlzSnNvbjsKCgkJCXVsb25nIGV4cGVjdGVkTGVuZ3RoOwoJCQl1bG9uZyBjb250ZW50Q29uc3VtZWQ7CgkJCWltbXV0YWJsZSh1Ynl0ZSlbXSBidWZmZXI7CgoJCQkvLyBtdWx0aXBhcnQgcGFyc2luZyBzdGF0ZQoJCQlpbnQgd2hhdERvV2VXYW50OwoJCQlib29sIHdlSGF2ZUFQYXJ0OwoJCQlzdHJpbmdbXSB0aGlzT25lc0hlYWRlcnM7CgkJCWltbXV0YWJsZSh1Ynl0ZSlbXSB0aGlzT25lc0RhdGE7CgoJCQlzdHJpbmcgcG9zdEpzb247CgoJCQlVcGxvYWRlZEZpbGUgcGllY2U7CgkJCWJvb2wgaXNGaWxlID0gZmFsc2U7CgoJCQlzaXplX3QgbWVtb3J5Q29tbWl0dGVkOwoKCQkJLy8gZG8gTk9UIGtlZXAgbXV0YWJsZSByZWZlcmVuY2VzIHRvIHRoZXNlIGFueXdoZXJlIQoJCQkvLyBJIGFzc3VtZSB0aGV5IGFyZSB1bmlxdWUgaW4gdGhlIGNvbnN0cnVjdG9yIG9uY2Ugd2UncmUgYWxsIGRvbmUgZ2V0dGluZyBkYXRhLgoJCQlzdHJpbmdbXVtzdHJpbmddIF9wb3N0OwoJCQlVcGxvYWRlZEZpbGVbXVtzdHJpbmddIF9maWxlczsKCQl9CgoJCVBvc3RQYXJzZXJTdGF0ZSBwcHM7Cgl9CgoJLy8vIFRoaXMgcmVwcmVzZW50cyBhIGZpbGUgdGhlIHVzZXIgdXBsb2FkZWQgdmlhIGEgUE9TVCByZXF1ZXN0LgoJc3RhdGljIHN0cnVjdCBVcGxvYWRlZEZpbGUgewoJCS8vLyBJZiB5b3Ugd2FudCB0byBjcmVhdGUgb25lIG9mIHRoZXNlIHN0cnVjdHMgZm9yIHlvdXJzZWxmIGZyb20gc29tZSBkYXRhLAoJCS8vLyB1c2UgdGhpcyBmdW5jdGlvbi4KCQlzdGF0aWMgVXBsb2FkZWRGaWxlIGZyb21EYXRhKGltbXV0YWJsZSh2b2lkKVtdIGRhdGEsIHN0cmluZyBuYW1lID0gbnVsbCkgewoJCQlDZ2kuVXBsb2FkZWRGaWxlIGY7CgkJCWYuZmlsZW5hbWUgPSBuYW1lOwoJCQlmLmNvbnRlbnQgPSBjYXN0KGltbXV0YWJsZSh1Ynl0ZSlbXSkgZGF0YTsKCQkJZi5jb250ZW50SW5NZW1vcnkgPSB0cnVlOwoJCQlyZXR1cm4gZjsKCQl9CgoJCXN0cmluZyBuYW1lOyAJCS8vLyBUaGUgbmFtZSBvZiB0aGUgZm9ybSBlbGVtZW50LgoJCXN0cmluZyBmaWxlbmFtZTsgCS8vLyBUaGUgZmlsZW5hbWUgdGhlIHVzZXIgc2V0LgoJCXN0cmluZyBjb250ZW50VHlwZTsgCS8vLyBUaGUgTUlNRSB0eXBlIHRoZSB1c2VyJ3MgYnJvd3NlciByZXBvcnRlZC4gKE5vdCByZWxpYWJsZS4pCgoJCS8qKgoJCQlGb3Igc21hbGwgZmlsZXMsIGNnaS5kIHdpbGwgYnVmZmVyIHRoZSB1cGxvYWRlZCBmaWxlIGluIG1lbW9yeSwgYW5kIG1ha2UgaXQKCQkJZGlyZWN0bHkgYWNjZXNzaWJsZSB0byB5b3UgdGhyb3VnaCB0aGUgY29udGVudCBtZW1iZXIuIEkgZmluZCB0aGlzIHZlcnkgY29udmVuaWVudAoJCQlhbmQgc29tZXdoYXQgZWZmaWNpZW50LCBzaW5jZSBpdCBjYW4gYXZvaWQgaGl0dGluZyB0aGUgZGlzayBlbnRpcmVseS4gKEkKCQkJb2Z0ZW4gd2FudCB0byBpbnNwZWN0IGFuZCBtb2RpZnkgdGhlIGZpbGUgYW55d2F5ISkKCgkJCUkgZmluZCB0aGUgZmlsZSBpcyB2ZXJ5IGxhcmdlLCBpdCBpcyB1bmRlc2lyYWJsZSB0byBlYXQgdGhhdCBtdWNoIG1lbW9yeSBqdXN0CgkJCWZvciBhIGZpbGUgYnVmZmVyLiBJbiB0aG9zZSBjYXNlcywgaWYgeW91IHBhc3MgYSBsYXJnZSBlbm91Z2ggdmFsdWUgZm9yIG1heENvbnRlbnRMZW5ndGgKCQkJdG8gdGhlIGNvbnN0cnVjdG9yIHNvIHRoZXkgYXJlIGFjY2VwdGVkLCBjZ2kuZCB3aWxsIHdyaXRlIHRoZSBjb250ZW50IHRvIGEgdGVtcG9yYXJ5CgkJCWZpbGUgdGhhdCB5b3UgY2FuIHJlLXJlYWQgbGF0ZXIuCgoJCQlZb3UgY2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgYnkgc3ViY2xhc3NpbmcgQ2dpIGFuZCBvdmVycmlkaW5nIHRoZSBwcm90ZWN0ZWQKCQkJaGFuZGxlUG9zdENodW5rIG1ldGhvZC4gTm90ZSB0aGF0IHRoZSBvYmplY3QgaXMgbm90IGluaXRpYWxpemVkIHdoZW4geW91CgkJCXdyaXRlIHRoYXQgbWV0aG9kIC0gdGhlIGh0dHAgaGVhZGVycyBhcmUgYXZhaWxhYmxlLCBidXQgdGhlIGNnaS5wb3N0IG1ldGhvZAoJCQlpcyBub3QuIFlvdSBtYXkgcGFyc2UgdGhlIGZpbGUgYXMgaXQgc3RyZWFtcyBpbiB1c2luZyB0aGlzIG1ldGhvZC4KCgoJCQlBbnl3YXksIGlmIHRoZSBmaWxlIGlzIHNtYWxsIGVub3VnaCB0byBiZSBpbiBtZW1vcnksIGNvbnRlbnRJbk1lbW9yeSB3aWxsIGJlCgkJCXNldCB0byB0cnVlLCBhbmQgdGhlIGNvbnRlbnQgaXMgYXZhaWxhYmxlIGluIHRoZSBjb250ZW50IG1lbWJlci4KCgkJCUlmIG5vdCwgY29udGVudEluTWVtb3J5IHdpbGwgYmUgc2V0IHRvIGZhbHNlLCBhbmQgdGhlIGNvbnRlbnQgc2F2ZWQgaW4gYSBmaWxlLAoJCQl3aG9zZSBuYW1lIHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBjb250ZW50RmlsZW5hbWUgbWVtYmVyLgoKCgkJCVRpcDogaWYgeW91IGtub3cgeW91IGFyZSBhbHdheXMgZGVhbGluZyB3aXRoIHNtYWxsIGZpbGVzLCBhbmQgd2FudCB0aGUgY29udmVuaWVuY2UKCQkJb2YgaWdub3JpbmcgdGhpcyBtZW1iZXIsIGNvbnN0cnVjdCBDZ2kgd2l0aCBhIHNtYWxsIG1heENvbnRlbnRMZW5ndGguIFRoZW4sIGlmCgkJCWEgbGFyZ2UgZmlsZSBjb21lcyBpbiwgaXQgc2ltcGx5IHRocm93cyBhbiBleGNlcHRpb24gKGFuZCBIVFRQIGVycm9yIHJlc3BvbnNlKQoJCQlpbnN0ZWFkIG9mIHRyeWluZyB0byBoYW5kbGUgaXQuCgoJCQlUaGUgZGVmYXVsdCB2YWx1ZSBvZiBtYXhDb250ZW50TGVuZ3RoIGluIHRoZSBjb25zdHJ1Y3RvciBpcyBmb3Igc21hbGwgZmlsZXMuCgkJKi8KCQlib29sIGNvbnRlbnRJbk1lbW9yeSA9IHRydWU7IC8vIHRoZSBkZWZhdWx0IG91Z2h0IHRvIGFsd2F5cyBiZSB0cnVlCgkJaW1tdXRhYmxlKHVieXRlKVtdIGNvbnRlbnQ7IC8vLyBUaGUgYWN0dWFsIGNvbnRlbnQgb2YgdGhlIGZpbGUsIGlmIGNvbnRlbnRJbk1lbW9yeSA9PSB0cnVlCgkJc3RyaW5nIGNvbnRlbnRGaWxlbmFtZTsgLy8vIHRoZSBmaWxlIHdoZXJlIHdlIGR1bXBlZCB0aGUgY29udGVudCwgaWYgY29udGVudEluTWVtb3J5ID09IGZhbHNlLiBOb3RlIHRoYXQgaWYgeW91IHdhbnQgdG8ga2VlcCBpdCwgeW91IE1VU1QgbW92ZSB0aGUgZmlsZSwgc2luY2Ugb3RoZXJ3aXNlIGl0IGlzIGNvbnNpZGVyZWQgZ2FyYmFnZSB3aGVuIGNnaSBpcyBkaXNwb3NlZC4KCgoJCXZvaWQgd3JpdGVUb0ZpbGUoc3RyaW5nIGZpbGVuYW1lVG9TYXZlVG8pIHsKCQkJaW1wb3J0IHN0ZC5maWxlOwoJCQlpZihjb250ZW50SW5NZW1vcnkpCgkJCQlzdGQuZmlsZS53cml0ZShmaWxlbmFtZVRvU2F2ZVRvLCBjb250ZW50KTsKCQkJZWxzZQoJCQkJc3RkLmZpbGUucmVuYW1lKGNvbnRlbnRGaWxlbmFtZSwgZmlsZW5hbWVUb1NhdmVUbyk7CgkJfQoJfQoKCS8vIGdpdmVuIGEgY29udGVudCB0eXBlIGFuZCBsZW5ndGgsIGRlY2lkZSB3aGF0IHdlJ3JlIGdvaW5nIHRvIGRvIHdpdGggdGhlIGRhdGEuLgoJcHJvdGVjdGVkIHZvaWQgcHJlcGFyZUZvckluY29taW5nRGF0YUNodW5rcyhzdHJpbmcgY29udGVudFR5cGUsIHVsb25nIGNvbnRlbnRMZW5ndGgpIHsKCQlwcHMuZXhwZWN0ZWRMZW5ndGggPSBjb250ZW50TGVuZ3RoOwoKCQlhdXRvIHRlcm1pbmF0b3IgPSBjb250ZW50VHlwZS5pbmRleE9mKCI7Iik7CgkJaWYodGVybWluYXRvciA9PSAtMSkKCQkJdGVybWluYXRvciA9IGNvbnRlbnRUeXBlLmxlbmd0aDsKCgkJcHBzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGVbMCAuLiB0ZXJtaW5hdG9yXTsKCQlhdXRvIGIgPSBjb250ZW50VHlwZVt0ZXJtaW5hdG9yIC4uICRdOwoJCWlmKGIubGVuZ3RoKSB7CgkJCWF1dG8gaWR4ID0gYi5pbmRleE9mKCJib3VuZGFyeT0iKTsKCQkJaWYoaWR4ICE9IC0xKSB7CgkJCQlwcHMuYm91bmRhcnkgPSBiW2lkeCArICJib3VuZGFyeT0iLmxlbmd0aCAuLiAkXTsKCQkJCXBwcy5sb2NhbEJvdW5kYXJ5ID0gIlxyXG4tLSIgfiBwcHMuYm91bmRhcnk7CgkJCX0KCQl9CgoJCS8vIHdoaWxlIGEgY29udGVudCB0eXBlIFNIT1VMRCBiZSBzZW50IGFjY29yZGluZyB0byB0aGUgUkZDLCBpdCBpcwoJCS8vIG5vdCByZXF1aXJlZC4gV2UncmUgdG9sZCB3ZSBTSE9VTEQgZ3Vlc3MgYnkgbG9va2luZyBhdCB0aGUgY29udGVudAoJCS8vIGJ1dCBpdCBzZWVtcyB0byBtZSB0aGF0IHRoaXMgb25seSBoYXBwZW5zIHdoZW4gaXQgaXMgdXJsZW5jb2RlZC4KCQlpZihwcHMuY29udGVudFR5cGUgPT0gImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgfHwgcHBzLmNvbnRlbnRUeXBlID09ICIiKSB7CgkJCXBwcy5pc011bHRpcGFydCA9IGZhbHNlOwoJCX0gZWxzZSBpZihwcHMuY29udGVudFR5cGUgPT0gIm11bHRpcGFydC9mb3JtLWRhdGEiKSB7CgkJCXBwcy5pc011bHRpcGFydCA9IHRydWU7CgkJCWVuZm9yY2UocHBzLmJvdW5kYXJ5Lmxlbmd0aCwgIm5vIGJvdW5kYXJ5Iik7CgkJfSBlbHNlIGlmKHBwcy5jb250ZW50VHlwZSA9PSAiYXBwbGljYXRpb24vanNvbiIpIHsKCQkJcHBzLmlzSnNvbiA9IHRydWU7CgkJCXBwcy5pc011bHRpcGFydCA9IGZhbHNlOwoJCS8vfSBlbHNlIGlmKHBwcy5jb250ZW50VHlwZSA9PSAiYXBwbGljYXRpb24vanNvbiIpIHsKCQkJLy9wcHMuaXNKc29uID0gdHJ1ZTsKCQl9IGVsc2UgewoJCQkvLyBGSVhNRTogc2hvdWxkIHNldCBhIGh0dHAgZXJyb3IgY29kZSB0b28KCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigidW5rbm93biByZXF1ZXN0IGNvbnRlbnQgdHlwZTogIiB+IHBwcy5jb250ZW50VHlwZSk7CgkJfQoJfQoKCS8vIGhhbmRsZXMgc3RyZWFtaW5nIFBPU1QgZGF0YS4gSWYgeW91IGhhbmRsZSBzb21lIG90aGVyIGNvbnRlbnQgdHlwZSwgeW91IHNob3VsZAoJLy8gb3ZlcnJpZGUgdGhpcy4gSWYgdGhlIGRhdGEgaXNuJ3QgdGhlIGNvbnRlbnQgdHlwZSB5b3Ugd2FudCwgeW91IG91Z2h0IHRvIGNhbGwKCS8vIHN1cGVyLmhhbmRsZUluY29taW5nRGF0YUNodW5rIHNvIHJlZ3VsYXIgZm9ybXMgYW5kIGZpbGVzIHN0aWxsIHdvcmsuCgoJLy8gRklYTUU6IEkgZG8gc29tZSBjb3B5aW5nIGluIGhlcmUgdGhhdCBJJ20gcHJldHR5IHN1cmUgaXMgdW5uZWNlc3NhcnksIGFuZCB0aGUKCS8vIGZpbGUgc3R1ZmYgSSdtIHN1cmUgaXMgaW5lZmZpY2llbnQuIEJ1dCwgbXkgZ3Vlc3MgaXMgdGhlIHJlYWwgYm90dGxlbmVjayBpcyBuZXR3b3JrCgkvLyBpbnB1dCBhbnl3YXksIHNvIEknbSBub3QgZ29pbmcgdG8gZ2V0IHRvbyB3b3JrZWQgdXAgYWJvdXQgaXQgcmlnaHQgbm93LgoJcHJvdGVjdGVkIHZvaWQgaGFuZGxlSW5jb21pbmdEYXRhQ2h1bmsoY29uc3QodWJ5dGUpW10gY2h1bmspIHsKCQlpZihjaHVuay5sZW5ndGggPT0gMCkKCQkJcmV0dXJuOwoJCWFzc2VydChjaHVuay5sZW5ndGggPD0gMzIgKiAxMDI0ICogMTAyNCk7IC8vIHdlIHVzZSBjaHVuayBzaXplIGFzIGEgbWVtb3J5IGNvbnN0cmFpbnQgdGhpbmcsIHNvCgkJCQkJCQkvLyBpZiB3ZSdyZSBwYXNzZWQgYmlnIGNodW5rcywgaXQgbWlnaHQgdGhyb3cgdW5uZWNlc3NhcmlseS4KCQkJCQkJCS8vIGp1c3QgcGFzcyBpdCBzbWFsbGVyIGNodW5rcyBhdCBhIHRpbWUuCgkJaWYocHBzLmlzTXVsdGlwYXJ0KSB7CgkJCS8vIG11bHRpcGFydC9mb3JtLWRhdGEKCgoJCQl2b2lkIHBpZWNlSGFzTmV3Q29udGVudCgpIHsKCQkJCS8vIHdlIGp1c3QgZ3JldyB0aGUgcGllY2UncyBidWZmZXIuIERvIHdlIGhhdmUgdG8gc3dpdGNoIHRvIGZpbGUgYmFja2luZz8KCQkJCWlmKHBwcy5waWVjZS5jb250ZW50SW5NZW1vcnkpIHsKCQkJCQlpZihwcHMucGllY2UuY29udGVudC5sZW5ndGggPD0gMTAgKiAxMDI0ICogMTAyNCkKCQkJCQkJLy8gbWVoLCBJJ20gb2sgd2l0aCBpdC4KCQkJCQkJcmV0dXJuOwoJCQkJCWVsc2UgewoJCQkJCQkvLyB0aGlzIGlzIHRvbyBiaWcuCgkJCQkJCWlmKCFwcHMuaXNGaWxlKQoJCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiUmVxdWVzdCBlbnRpdHkgdG9vIGxhcmdlIik7IC8vIGEgdmFyaWFibGUgdGhpcyBiaWcgaXMga2luZGEgcmlkaWN1bG91cywganVzdCByZWplY3QgaXQuCgkJCQkJCWVsc2UgewoJCQkJCQkJLy8gYSBmaWxlIHRoaXMgbGFyZ2UgaXMgcHJvYmFibHkgYWNjZXB0YWJsZSB0aG91Z2guLi4gbGV0J3MgdXNlIGEgYmFja2luZyBmaWxlLgoJCQkJCQkJcHBzLnBpZWNlLmNvbnRlbnRJbk1lbW9yeSA9IGZhbHNlOwoJCQkJCQkJLy8gRklYTUU6IHNheS4uLiBob3cgZG8gd2UgaW50ZW5kIHRvIGRlbGV0ZSB0aGVzZSB0aGluZ3M/IGNnaS5kaXNwb3NlIHBlcmhhcHMuCgoJCQkJCQkJaW50IGNvdW50ID0gMDsKCQkJCQkJCXBwcy5waWVjZS5jb250ZW50RmlsZW5hbWUgPSBnZXRUZW1wRGlyZWN0b3J5KCkgfiAiYXJzZF9jZ2lfdXBsb2FkZWRfZmlsZV8iIH4gdG8hc3RyaW5nKGdldFV0Y1RpbWUoKSkgfiAiLSIgfiB0byFzdHJpbmcoY291bnQpOwoJCQkJCQkJLy8gb2RkcyBhcmUgdGhpcyBsb29wIHdpbGwgbmV2ZXIgYmUgZW50ZXJlZCwgYnV0IHdlIHdhbnQgaXQganVzdCBpbiBjYXNlLgoJCQkJCQkJd2hpbGUoc3RkLmZpbGUuZXhpc3RzKHBwcy5waWVjZS5jb250ZW50RmlsZW5hbWUpKSB7CgkJCQkJCQkJY291bnQrKzsKCQkJCQkJCQlwcHMucGllY2UuY29udGVudEZpbGVuYW1lID0gZ2V0VGVtcERpcmVjdG9yeSgpIH4gImFyc2RfY2dpX3VwbG9hZGVkX2ZpbGVfIiB+IHRvIXN0cmluZyhnZXRVdGNUaW1lKCkpIH4gIi0iIH4gdG8hc3RyaW5nKGNvdW50KTsKCQkJCQkJCX0KCQkJCQkJCS8vIEkgaG9wZSB0aGlzIGNyZWF0ZXMgdGhlIGZpbGUgcHJldHR5IHF1aWNrbHksIG9yIHRoZSBsb29wIG1pZ2h0IGJlIHVzZWxlc3MuLi4KCQkJCQkJCS8vIEZJWE1FOiBtYXliZSBJIHNob3VsZCB3cml0ZSBzb21lIGtpbmQgb2YgY3VzdG9tIHRyYW5zYWN0aW9uIGhlcmUuCgkJCQkJCQlzdGQuZmlsZS53cml0ZShwcHMucGllY2UuY29udGVudEZpbGVuYW1lLCBwcHMucGllY2UuY29udGVudCk7CgoJCQkJCQkJcHBzLnBpZWNlLmNvbnRlbnQgPSBudWxsOwoJCQkJCQl9CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQkvLyBpdCdzIGFscmVhZHkgaW4gYSBmaWxlLCBzbyBqdXN0IGFwcGVuZCBpdCB0byB3aGF0IHdlIGhhdmUKCQkJCQlpZihwcHMucGllY2UuY29udGVudC5sZW5ndGgpIHsKCQkJCQkJLy8gRklYTUU6IHRoaXMgaXMgc3VyZWx5IHZlcnkgaW5lZmZpY2llbnQuLi4gd2UnbGwgYmUgY2FsbGluZyB0aGlzIGJ5IDRrYiBjaHVuay4uLgoJCQkJCQlzdGQuZmlsZS5hcHBlbmQocHBzLnBpZWNlLmNvbnRlbnRGaWxlbmFtZSwgcHBzLnBpZWNlLmNvbnRlbnQpOwoJCQkJCQlwcHMucGllY2UuY29udGVudCA9IG51bGw7CgkJCQkJfQoJCQkJfQoJCQl9CgoKCQkJdm9pZCBjb21taXRQYXJ0KCkgewoJCQkJaWYoIXBwcy53ZUhhdmVBUGFydCkKCQkJCQlyZXR1cm47CgoJCQkJcGllY2VIYXNOZXdDb250ZW50KCk7IC8vIGJlIHN1cmUgdGhlIG5ldyBjb250ZW50IGlzIGhhbmRsZWQgZXZlcnkgdGltZQoKCQkJCWlmKHBwcy5pc0ZpbGUpIHsKCQkJCQkvLyBJJ20gbm90IHN1cmUgaWYgb3RoZXIgZW52aXJvbm1lbnRzIHB1dCBmaWxlcyBpbiBwb3N0IG9yIG5vdC4uLgoJCQkJCS8vIEkgdXNlZCB0byBub3QgZG8gaXQsIGJ1dCBJIHRoaW5rIEkgc2hvdWxkLCBzaW5jZSBpdCBpcyB0aGVyZS4uLgoJCQkJCXBwcy5fcG9zdFtwcHMucGllY2UubmFtZV0gfj0gcHBzLnBpZWNlLmZpbGVuYW1lOwoJCQkJCXBwcy5fZmlsZXNbcHBzLnBpZWNlLm5hbWVdIH49IHBwcy5waWVjZTsKCQkJCX0gZWxzZQoJCQkJCXBwcy5fcG9zdFtwcHMucGllY2UubmFtZV0gfj0gY2FzdChzdHJpbmcpIHBwcy5waWVjZS5jb250ZW50OwoKCQkJCS8qCgkJCQlzdGRlcnIud3JpdGVsbigiUkVDRUlWRUQ6ICIsIHBwcy5waWVjZS5uYW1lLCAiPSIsIAoJCQkJCXBwcy5waWVjZS5jb250ZW50Lmxlbmd0aCA8IDEwMDAKCQkJCQk/CgkJCQkJdG8hc3RyaW5nKHBwcy5waWVjZS5jb250ZW50KQoJCQkJCToKCQkJCQkidG9vIGxvbmciKTsKCQkJCSovCgoJCQkJLy8gRklYTUU6IHRoZSBsaW1pdCBoZXJlCgkJCQlwcHMubWVtb3J5Q29tbWl0dGVkICs9IHBwcy5waWVjZS5jb250ZW50Lmxlbmd0aDsKCgkJCQlwcHMud2VIYXZlQVBhcnQgPSBmYWxzZTsKCQkJCXBwcy53aGF0RG9XZVdhbnQgPSAxOwoJCQkJcHBzLnRoaXNPbmVzSGVhZGVycyA9IG51bGw7CgkJCQlwcHMudGhpc09uZXNEYXRhID0gbnVsbDsKCgkJCQlwcHMucGllY2UgPSBVcGxvYWRlZEZpbGUuaW5pdDsKCQkJCXBwcy5pc0ZpbGUgPSBmYWxzZTsKCQkJfQoKCQkJdm9pZCBhY2NlcHRDaHVuaygpIHsKCQkJCXBwcy5idWZmZXIgfj0gY2h1bms7CgkJCQljaHVuayA9IG51bGw7IC8vIHdlJ3ZlIGNvbnN1bWVkIGl0IGludG8gdGhlIGJ1ZmZlciwgc28ga2VlcGluZyBpdCBqdXN0IGJyaW5ncyBjb25mdXNpb24KCQkJfQoKCQkJaW1tdXRhYmxlKHVieXRlKVtdIGNvbnN1bWUoc2l6ZV90IGhvd011Y2gpIHsKCQkJCXBwcy5jb250ZW50Q29uc3VtZWQgKz0gaG93TXVjaDsKCQkJCWF1dG8gcmV0ID0gcHBzLmJ1ZmZlclswIC4uIGhvd011Y2hdOwoJCQkJcHBzLmJ1ZmZlciA9IHBwcy5idWZmZXJbaG93TXVjaCAuLiAkXTsKCQkJCXJldHVybiByZXQ7CgkJCX0KCgkJCWRhdGFDb25zdW1wdGlvbkxvb3A6IGRvIHsKCQkJc3dpdGNoKHBwcy53aGF0RG9XZVdhbnQpIHsKCQkJCWRlZmF1bHQ6IGFzc2VydCgwKTsKCQkJCWNhc2UgMDoKCQkJCQlhY2NlcHRDaHVuaygpOwoJCQkJCS8vIHRoZSBmb3JtYXQgYmVnaW5zIHdpdGggdHdvIGV4dHJhIGxlYWRpbmcgZGFzaGVzLCB0aGVuIHdlIHNob3VsZCBiZSBhdCB0aGUgYm91bmRhcnkKCQkJCQlpZihwcHMuYnVmZmVyLmxlbmd0aCA8IDIpCgkJCQkJCXJldHVybjsKCQkJCQlhc3NlcnQocHBzLmJ1ZmZlclswXSA9PSAnLScsICJubyBsZWFkaW5nIGRhc2giKTsKCQkJCQljb25zdW1lKDEpOwoJCQkJCWFzc2VydChwcHMuYnVmZmVyWzBdID09ICctJywgIm5vIHNlY29uZCBsZWFkaW5nIGRhc2giKTsKCQkJCQljb25zdW1lKDEpOwoKCQkJCQlwcHMud2hhdERvV2VXYW50ID0gMTsKCQkJCQlnb3RvIGNhc2UgMTsKCQkJCS8qIGZhbGx0aHJvdWdoICovCgkJCQljYXNlIDE6IC8vIGxvb2tpbmcgZm9yIGhlYWRlcnMKCQkJCQkvLyBoZXJlLCB3ZSBzaG91bGQgYmUgbGluZWQgdXAgcmlnaHQgYXQgdGhlIGJvdW5kYXJ5LCB3aGljaCBpcyBmb2xsb3dlZCBieSBhIFxyXG4KCgkJCQkJLy8gd2FudCB0byBrZWVwIHRoZSBidWZmZXIgdW5kZXIgY29udHJvbCBpbiBjYXNlIHdlJ3JlIHVuZGVyIGF0dGFjawoJCQkJCS8vc3RkZXJyLndyaXRlbG4oImhlcmUgb25jZSIpOwoJCQkJCS8vaWYocHBzLmJ1ZmZlci5sZW5ndGggKyBjaHVuay5sZW5ndGggPiA3MCAqIDEwMjQpIC8vIHRoZXkgc2hvdWxkIGJlIDwgMSBrYiByZWFsbHkuLi4uCgkJCQkJLy8JdGhyb3cgbmV3IEV4Y2VwdGlvbigid3RmIGlzIHVwIHdpdGggdGhlIGh1Z2UgbWltZSBwYXJ0IGhlYWRlcnMiKTsKCgkJCQkJYWNjZXB0Q2h1bmsoKTsKCgkJCQkJaWYocHBzLmJ1ZmZlci5sZW5ndGggPCBwcHMuYm91bmRhcnkubGVuZ3RoKQoJCQkJCQlyZXR1cm47IC8vIG5vdCBlbm91Z2ggZGF0YSwgc2luY2UgdGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhIGJvdW5kYXJ5IGhlcmUgYXQgbGVhc3QKCgkJCQkJaWYocHBzLmNvbnRlbnRDb25zdW1lZCArIHBwcy5ib3VuZGFyeS5sZW5ndGggKyA2ID09IHBwcy5leHBlY3RlZExlbmd0aCkgewoJCQkJCQlhc3NlcnQocHBzLmJ1ZmZlci5sZW5ndGggPT0gcHBzLmJvdW5kYXJ5Lmxlbmd0aCArIDQgKyAyKTsgLy8gLS0sIC0tLCBhbmQgXHJcbgoJCQkJCQkvLyB3ZSAqc2hvdWxkKiBiZSBhdCB0aGUgZW5kIGhlcmUhCgkJCQkJCWFzc2VydChwcHMuYnVmZmVyWzBdID09ICctJyk7CgkJCQkJCWNvbnN1bWUoMSk7CgkJCQkJCWFzc2VydChwcHMuYnVmZmVyWzBdID09ICctJyk7CgkJCQkJCWNvbnN1bWUoMSk7CgoJCQkJCQkvLyB0aGUgbWVzc2FnZSBpcyB0ZXJtaW5hdGVkIGJ5IC0tQk9VTkRBUlktLVxyXG4gKGFmdGVyIGEgXHJcbiBsZWFkaW5nIHRvIHRoZSBib3VuZGFyeSkKCQkJCQkJYXNzZXJ0KHBwcy5idWZmZXJbMCAuLiBwcHMuYm91bmRhcnkubGVuZ3RoXSA9PSBjYXN0KGNvbnN0KHVieXRlW10pKSBwcHMuYm91bmRhcnksCgkJCQkJCQkibm90IGxpbmVkIHVwIG9uIGJvdW5kYXJ5ICIgfiBwcHMuYm91bmRhcnkpOwoJCQkJCQljb25zdW1lKHBwcy5ib3VuZGFyeS5sZW5ndGgpOwoKCQkJCQkJYXNzZXJ0KHBwcy5idWZmZXJbMF0gPT0gJy0nKTsKCQkJCQkJY29uc3VtZSgxKTsKCQkJCQkJYXNzZXJ0KHBwcy5idWZmZXJbMF0gPT0gJy0nKTsKCQkJCQkJY29uc3VtZSgxKTsKCgkJCQkJCWFzc2VydChwcHMuYnVmZmVyWzBdID09ICdccicpOwoJCQkJCQljb25zdW1lKDEpOwoJCQkJCQlhc3NlcnQocHBzLmJ1ZmZlclswXSA9PSAnXG4nKTsKCQkJCQkJY29uc3VtZSgxKTsKCgkJCQkJCWFzc2VydChwcHMuYnVmZmVyLmxlbmd0aCA9PSAwKTsKCQkJCQkJYXNzZXJ0KHBwcy5jb250ZW50Q29uc3VtZWQgPT0gcHBzLmV4cGVjdGVkTGVuZ3RoKTsKCQkJCQkJYnJlYWsgZGF0YUNvbnN1bXB0aW9uTG9vcDsgLy8gd2UncmUgZG9uZSEKCQkJCQl9IGVsc2UgewoJCQkJCQkvLyB3ZSdyZSBub3QgZG9uZSB5ZXQuIFdlIHNob3VsZCBiZSBsaW5lZCB1cCBvbiBhIGJvdW5kYXJ5LgoKCQkJCQkJLy8gQnV0LCB3ZSB3YW50IHRvIGVuc3VyZSB0aGUgaGVhZGVycyBhcmUgaGVyZSBiZWZvcmUgd2UgY29uc3VtZSBhbnl0aGluZyEKCQkJCQkJYXV0byBoZWFkZXJFbmRMb2NhdGlvbiA9IGxvY2F0aW9uT2YocHBzLmJ1ZmZlciwgIlxyXG5cclxuIik7CgkJCQkJCWlmKGhlYWRlckVuZExvY2F0aW9uID09IC0xKQoJCQkJCQkJcmV0dXJuOyAvLyB0aGV5ICpzaG91bGQqIGFsbCBiZSBoZXJlLCBzbyB3ZSBjYW4gaGFuZGxlIHRoZW0gYWxsIGF0IG9uY2UuCgoJCQkJCQlhc3NlcnQocHBzLmJ1ZmZlclswIC4uIHBwcy5ib3VuZGFyeS5sZW5ndGhdID09IGNhc3QoY29uc3QodWJ5dGVbXSkpIHBwcy5ib3VuZGFyeSwKCQkJCQkJCSJub3QgbGluZWQgdXAgb24gYm91bmRhcnkgIiB+IHBwcy5ib3VuZGFyeSk7CgoJCQkJCQljb25zdW1lKHBwcy5ib3VuZGFyeS5sZW5ndGgpOwoJCQkJCQkvLyB0aGUgYm91bmRhcnkgaXMgYWx3YXlzIGZvbGxvd2VkIGJ5IGEgXHJcbgoJCQkJCQlhc3NlcnQocHBzLmJ1ZmZlclswXSA9PSAnXHInKTsKCQkJCQkJY29uc3VtZSgxKTsKCQkJCQkJYXNzZXJ0KHBwcy5idWZmZXJbMF0gPT0gJ1xuJyk7CgkJCQkJCWNvbnN1bWUoMSk7CgkJCQkJfQoKCQkJCQkvLyByZS1ydW5uaW5nIHNpbmNlIGJ5IGNvbnN1bWluZyB0aGUgYm91bmRhcnksIHdlIGludmFsaWRhdGUgdGhlIG9sZCBpbmRleC4KCQkJCQlhdXRvIGhlYWRlckVuZExvY2F0aW9uID0gbG9jYXRpb25PZihwcHMuYnVmZmVyLCAiXHJcblxyXG4iKTsKCQkJCQlhc3NlcnQoaGVhZGVyRW5kTG9jYXRpb24gPj0gMCwgIm5vIGhlYWRlciIpOwoJCQkJCWF1dG8gdGhpc09uZXNIZWFkZXJzID0gcHBzLmJ1ZmZlclswLi5oZWFkZXJFbmRMb2NhdGlvbl07CgoJCQkJCWNvbnN1bWUoaGVhZGVyRW5kTG9jYXRpb24gKyA0KTsgLy8gVGhlICs0IGlzIHRoZSBcclxuXHJcbiB0aGF0IGNhcHMgaXQgb2ZmCgoJCQkJCXBwcy50aGlzT25lc0hlYWRlcnMgPSBzcGxpdChjYXN0KHN0cmluZykgdGhpc09uZXNIZWFkZXJzLCAiXHJcbiIpOwoKCQkJCQkvLyBub3cgd2UnbGwgcGFyc2UgdGhlIGhlYWRlcnMKCQkJCQlmb3JlYWNoKGg7IHBwcy50aGlzT25lc0hlYWRlcnMpIHsKCQkJCQkJYXV0byBwID0gaC5pbmRleE9mKCI6Iik7CgkJCQkJCWFzc2VydChwICE9IC0xLCAibm8gY29sb24gaW4gaGVhZGVyLCBnb3QgIiB+IHRvIXN0cmluZyhwcHMudGhpc09uZXNIZWFkZXJzKSk7CgkJCQkJCXN0cmluZyBobiA9IGhbMC4ucF07CgkJCQkJCXN0cmluZyBodiA9IGhbcCsyLi4kXTsKCgkJCQkJCXN3aXRjaChobi50b0xvd2VyKSB7CgkJCQkJCQlkZWZhdWx0OiBhc3NlcnQoMCk7CgkJCQkJCQljYXNlICJjb250ZW50LWRpc3Bvc2l0aW9uIjoKCQkJCQkJCQlhdXRvIGluZm8gPSBodi5zcGxpdCgiOyAiKTsKCQkJCQkJCQlmb3JlYWNoKGk7IGluZm9bMS4uJF0pIHsgLy8gc2tpcHBpbmcgdGhlIGZvcm0tZGF0YQoJCQkJCQkJCQlhdXRvIG8gPSBpLnNwbGl0KCI9Iik7IC8vIEZJWE1FCgkJCQkJCQkJCXN0cmluZyBwbiA9IG9bMF07CgkJCQkJCQkJCXN0cmluZyBwdiA9IG9bMV1bMS4uJC0xXTsKCgkJCQkJCQkJCWlmKHBuID09ICJuYW1lIikgewoJCQkJCQkJCQkJcHBzLnBpZWNlLm5hbWUgPSBwdjsKCQkJCQkJCQkJfSBlbHNlIGlmIChwbiA9PSAiZmlsZW5hbWUiKSB7CgkJCQkJCQkJCQlwcHMucGllY2UuZmlsZW5hbWUgPSBwdjsKCQkJCQkJCQkJCXBwcy5pc0ZpbGUgPSB0cnVlOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICJjb250ZW50LXR5cGUiOgoJCQkJCQkJCXBwcy5waWVjZS5jb250ZW50VHlwZSA9IGh2OwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCXBwcy53aGF0RG9XZVdhbnQrKzsgLy8gbW92ZSB0byB0aGUgbmV4dCBzdGVwIC0gdGhlIGRhdGEKCQkJCWJyZWFrOwoJCQkJY2FzZSAyOgoJCQkJCS8vIHdoZW4gd2UgZ2V0IGhlcmUsIHBwcy5idWZmZXIgc2hvdWxkIGNvbnRhaW4gb3VyIGZpcnN0IGNodW5rIG9mIGRhdGEKCgkJCQkJaWYocHBzLmJ1ZmZlci5sZW5ndGggKyBjaHVuay5sZW5ndGggPiA4ICogMTAyNCAqIDEwMjQpIC8vIHdlIG1pZ2h0IGJ1ZmZlciBxdWl0ZSBhIGJpdCBidXQgbm90IG11Y2gKCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigid3RmIGlzIHVwIHdpdGggdGhlIGh1Z2UgbWltZSBwYXJ0IGJ1ZmZlciIpOwoKCQkJCQlhY2NlcHRDaHVuaygpOwoKCQkJCQkvLyBzbyB0aGUgdHJpY2sgaXMsIHdlIHdhbnQgdG8gcHJvY2VzcyBhbGwgdGhlIGRhdGEgdXAgdG8gdGhlIGJvdW5kYXJ5LAoJCQkJCS8vIGJ1dCB3aGF0IGlmIHRoZSBjaHVuaydzIGVuZCBjdXRzIHRoZSBib3VuZGFyeSBvZmY/IElmIHdlJ3JlIHVuc3VyZSwgd2UKCQkJCQkvLyB3YW50IHRvIHdhaXQgZm9yIHRoZSBuZXh0IGNodW5rLiBXZSBzdGFydCBieSBsb29raW5nIGZvciB0aGUgd2hvbGUgYm91bmRhcnkKCQkJCQkvLyBpbiB0aGUgYnVmZmVyIHNvbWV3aGVyZS4KCgkJCQkJYXV0byBib3VuZGFyeUxvY2F0aW9uID0gbG9jYXRpb25PZihwcHMuYnVmZmVyLCBwcHMubG9jYWxCb3VuZGFyeSk7CgkJCQkJLy8gYXNzZXJ0KGJvdW5kYXJ5TG9jYXRpb24gIT0gLTEsICJzaG91bGQgaGF2ZSBzZWVuICJ+dG8hc3RyaW5nKGNhc3QodWJ5dGVbXSkgcHBzLmxvY2FsQm91bmRhcnkpfiIgaW4gIiB+IHRvIXN0cmluZyhwcHMuYnVmZmVyKSk7CgkJCQkJaWYoYm91bmRhcnlMb2NhdGlvbiAhPSAtMSkgewoJCQkJCQkvLyB0aGlzIGlzIGVhc3kgLSB3ZSBjYW4gc2VlIGl0IGluIGl0J3MgZW50aXJldHkhCgoJCQkJCQlwcHMucGllY2UuY29udGVudCB+PSBjb25zdW1lKGJvdW5kYXJ5TG9jYXRpb24pOwoKCQkJCQkJYXNzZXJ0KHBwcy5idWZmZXJbMF0gPT0gJ1xyJyk7CgkJCQkJCWNvbnN1bWUoMSk7CgkJCQkJCWFzc2VydChwcHMuYnVmZmVyWzBdID09ICdcbicpOwoJCQkJCQljb25zdW1lKDEpOwoJCQkJCQlhc3NlcnQocHBzLmJ1ZmZlclswXSA9PSAnLScpOwoJCQkJCQljb25zdW1lKDEpOwoJCQkJCQlhc3NlcnQocHBzLmJ1ZmZlclswXSA9PSAnLScpOwoJCQkJCQljb25zdW1lKDEpOwoJCQkJCQkvLyB0aGUgYm91bmRhcnkgaGVyZSBpcyBhbHdheXMgcHJlY2VkZWQgYnkgXHJcbi0tLCB3aGljaCBpcyB3aHkgd2UgdXNlZCBsb2NhbEJvdW5kYXJ5IGluc3RlYWQgb2YgYm91bmRhcnkgdG8gbG9jYXRlIGl0LiBDdXQgdGhhdCBvZmYuCgkJCQkJCXBwcy53ZUhhdmVBUGFydCA9IHRydWU7CgkJCQkJCXBwcy53aGF0RG9XZVdhbnQgPSAxOyAvLyBiYWNrIHRvIGdldHRpbmcgaGVhZGVycyBmb3IgdGhlIG5leHQgcGFydAoKCQkJCQkJY29tbWl0UGFydCgpOyAvLyB3ZSdyZSBkb25lIGhlcmUKCQkJCQl9IGVsc2UgewoJCQkJCQkvLyB3ZSBjYW4ndCBzZWUgdGhlIHdob2xlIHRoaW5nLCBidXQgd2hhdCBpZiB0aGVyZSdzIGEgcGFydGlhbCBib3VuZGFyeT8KCgkJCQkJCWVuZm9yY2UocHBzLmxvY2FsQm91bmRhcnkubGVuZ3RoIDwgMTI4KTsgLy8gdGhlIGJvdW5kYXJ5IG91Z2h0IHRvIGJlIGxlc3MgdGhhbiBhIGxpbmUuLi4KCQkJCQkJYXNzZXJ0KHBwcy5sb2NhbEJvdW5kYXJ5Lmxlbmd0aCA+IDEpOyAvLyBzaG91bGQgYWxyZWFkeSBiZSBzYW5lIGJ1dCBqdXN0IGluIGNhc2UKCQkJCQkJYm9vbCBwb3RlbnRpYWxCb3VuZGFyeUZvdW5kID0gZmFsc2U7CgoJCQkJCQlib3VuZGFyeUNoZWNrOiBmb3IoaW50IGEgPSAxOyBhIDwgcHBzLmxvY2FsQm91bmRhcnkubGVuZ3RoOyBhKyspIHsKCQkJCQkJCS8vIHdlIGdyb3cgdGhlIGJvdW5kYXJ5IGEgYml0IGVhY2ggdGltZS4gSWYgd2UgdGhpbmsgaXQgbG9va3MgdGhlCgkJCQkJCQkvLyBzYW1lLCBiZXR0ZXIgcHVsbCBhbm90aGVyIGNodW5rIHRvIGJlIHN1cmUgaXQncyBub3QgdGhlIGVuZC4KCQkJCQkJCS8vIFN0YXJ0aW5nIHNtYWxsIGJlY2F1c2UgZXhpdGluZyB0aGUgbG9vcCBlYXJseSBpcyBkZXNpcmFibGUsIHNpbmNlCgkJCQkJCQkvLyB3ZSdyZSBub3Qga2VlcGluZyBhbnkgYW1iaWd1aXR5IGFuZCAxIC8gMjU2IGNoYW5jZSBvZiBleGl0aW5nIGlzCgkJCQkJCQkvLyB0aGUgYmVzdCB3ZSBjYW4gZG8uCgkJCQkJCQlpZihhID4gcHBzLmJ1ZmZlci5sZW5ndGgpCgkJCQkJCQkJYnJlYWs7IC8vIEZJWE1FOiBpcyB0aGlzIHJpZ2h0PwoJCQkJCQkJYXNzZXJ0KGEgPD0gcHBzLmJ1ZmZlci5sZW5ndGgpOwoJCQkJCQkJYXNzZXJ0KGEgPiAwKTsKCQkJCQkJCWlmKHN0ZC5hbGdvcml0aG0uZW5kc1dpdGgocHBzLmJ1ZmZlciwgcHBzLmxvY2FsQm91bmRhcnlbMCAuLiBhXSkpIHsKCQkJCQkJCQkvLyBvaywgdGhlcmUgKm1pZ2h0KiBiZSBhIGJvdW5kYXJ5IGhlcmUsIHNvIGxldCdzCgkJCQkJCQkJLy8gbm90IHRyZWF0IHRoZSBlbmQgYXMgZGF0YSB5ZXQuIFRoZSByZXN0IGlzIGdvb2QgdG8KCQkJCQkJCQkvLyB1c2UgdGhvdWdoLCBzaW5jZSBpZiB0aGVyZSB3YXMgYSBib3VuZGFyeSB0aGVyZSwgd2UnZAoJCQkJCQkJCS8vIGhhdmUgaGFuZGxlZCBpdCB1cCBhYm92ZSBhZnRlciBsb2NhdGlvbk9mLgoKCQkJCQkJCQlwcHMucGllY2UuY29udGVudCB+PSBwcHMuYnVmZmVyWzAgLi4gJCAtIGFdOwoJCQkJCQkJCWNvbnN1bWUocHBzLmJ1ZmZlci5sZW5ndGggLSBhKTsKCQkJCQkJCQlwaWVjZUhhc05ld0NvbnRlbnQoKTsKCQkJCQkJCQlwb3RlbnRpYWxCb3VuZGFyeUZvdW5kID0gdHJ1ZTsKCQkJCQkJCQlicmVhayBib3VuZGFyeUNoZWNrOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlpZighcG90ZW50aWFsQm91bmRhcnlGb3VuZCkgewoJCQkJCQkJLy8gd2UgY2FuIGNvbnN1bWUgdGhlIHdob2xlIHRoaW5nCgkJCQkJCQlwcHMucGllY2UuY29udGVudCB+PSBwcHMuYnVmZmVyOwoJCQkJCQkJcGllY2VIYXNOZXdDb250ZW50KCk7CgkJCQkJCQljb25zdW1lKHBwcy5idWZmZXIubGVuZ3RoKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCS8vIHdlIGZvdW5kIGEgcG9zc2libGUgYm91bmRhcnksIGJ1dCB0aGVyZSB3YXMKCQkJCQkJCS8vIGluc3VmZmljaWVudCBkYXRhIHRvIGJlIHN1cmUuCgkJCQkJCQlhc3NlcnQocHBzLmJ1ZmZlciA9PSBjYXN0KGNvbnN0KHVieXRlW10pKSBwcHMubG9jYWxCb3VuZGFyeVswIC4uIHBwcy5idWZmZXIubGVuZ3RoXSk7CgoJCQkJCQkJcmV0dXJuOyAvLyB3YWl0IGZvciB0aGUgbmV4dCBjaHVuay4KCQkJCQkJfQoJCQkJCX0KCQkJfQoJCQl9IHdoaWxlKHBwcy5idWZmZXIubGVuZ3RoKTsKCgkJCS8vIGJ0dyBhbGwgYm91bmRhcmllcyBleGNlcHQgdGhlIGZpcnN0IHNob3VsZCBoYXZlIGEgXHJcbiBiZWZvcmUgdGhlbQoJCX0gZWxzZSB7CgkJCS8vIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBhbmQgYXBwbGljYXRpb24vanNvbgoKCQkJCS8vIG5vdCB1c2luZyBtYXhDb250ZW50TGVuZ3RoIGJlY2F1c2UgdGhhdCBtaWdodCBiZSBjcmFua2VkIHVwIHRvIGFsbG93CgkJCQkvLyBsYXJnZSBmaWxlIHVwbG9hZHMuIFdlIGNhbiBoYW5kbGUgdGhlbSwgYnV0IGEgaHVnZSBwb3N0W10gaXNuJ3QgYW55IGdvb2QuCgkJCWlmKHBwcy5idWZmZXIubGVuZ3RoICsgY2h1bmsubGVuZ3RoID4gOCAqIDEwMjQgKiAxMDI0KSAvLyBzdXJlbHkgdGhpcyBpcyBwbGVudHkgYmlnIGVub3VnaAoJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigid3RmIGlzIHVwIHdpdGggc3VjaCBhIGdpZ2FudGljIGZvcm0gc3VibWlzc2lvbj8/Pz8iKTsKCgkJCXBwcy5idWZmZXIgfj0gY2h1bms7CgoJCQkvLyBzaW1wbGUgaGFuZGxpbmcsIGJ1dCBpdCB3b3Jrcy4uLiB1bnRpbCBzb21lb25lIGJvbWJzIHVzIHdpdGggZ2lnYWJ5dGVzIG9mIGNyYXAgYXQgbGVhc3QuLi4KCQkJaWYocHBzLmJ1ZmZlci5sZW5ndGggPT0gcHBzLmV4cGVjdGVkTGVuZ3RoKSB7CgkJCQlpZihwcHMuaXNKc29uKQoJCQkJCXBwcy5wb3N0SnNvbiA9IGNhc3Qoc3RyaW5nKSBwcHMuYnVmZmVyOwoJCQkJZWxzZQoJCQkJCXBwcy5fcG9zdCA9IGRlY29kZVZhcmlhYmxlcyhjYXN0KHN0cmluZykgcHBzLmJ1ZmZlcik7CgkJCQl2ZXJzaW9uKHByZXNlcnZlRGF0YSkKCQkJCQlvcmlnaW5hbFBvc3REYXRhID0gcHBzLmJ1ZmZlcjsKCQkJfSBlbHNlIHsKCQkJCS8vIGp1c3QgZm9yIGRlYnVnZ2luZwoJCQl9CgkJfQoJfQoKCXByb3RlY3RlZCB2b2lkIGNsZWFuVXBQb3N0RGF0YVN0YXRlKCkgewoJCXBwcyA9IFBvc3RQYXJzZXJTdGF0ZS5pbml0OwoJfQoKCS8vLyB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gc29tZWhvdyByZWFjdAoJLy8vIHRvIGFuIHVwbG9hZCBpbiBwcm9ncmVzcy4KCS8vLwoJLy8vIFRha2Ugbm90ZSB0aGF0IHBhcnRzIG9mIHRoZSBDR0kgb2JqZWN0IGlzIG5vdCB5ZXQKCS8vLyBpbml0aWFsaXplZCEgU3R1ZmYgZnJvbSBIVFRQIGhlYWRlcnMsIGluY2x1ZGluZyBnZXRbXSwgaXMgdXNhYmxlLgoJLy8vIEJ1dCwgbm9uZSBvZiBwb3N0W10gaXMgdXNhYmxlLCBhbmQgeW91IGNhbm5vdCB3cml0ZSBoZXJlLiBUaGF0J3MKCS8vLyB3aHkgdGhpcyBtZXRob2QgaXMgY29uc3QgLSBtdXRhdGluZyB0aGUgb2JqZWN0IHdvbid0IGRvIG11Y2ggYW55d2F5LgoJLy8vCgkvLy8gTXkgaWRlYSBoZXJlIHdhcyBzbyB5b3UgY2FuIG91dHB1dCBhIHByb2dyZXNzIGJhciBvcgoJLy8vIHNvbWV0aGluZyB0byBhIGNvb3BlcmF0aXZlIGNsaWVudCAoc2VlIGFyc2QucnR1ZCBmb3IgYSBwb3RlbnRpYWwgaGVscGVyKQoJLy8vCgkvLy8gVGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4gU3ViY2xhc3MgY2dpIGFuZCB1c2UgdGhlIAoJLy8vIEN1c3RvbUNnaU1haW4gbWl4aW4gdG8gZG8gc29tZXRoaW5nIGhlcmUuCgl2b2lkIG9uUmVxdWVzdEJvZHlEYXRhUmVjZWl2ZWQoc2l6ZV90IHJlY2VpdmVkU29GYXIsIHNpemVfdCB0b3RhbEV4cGVjdGVkKSBjb25zdCB7CgkJLy8gVGhpcyBzcGFjZSBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsuCgl9CgoJLy8vIEluaXRpYWxpemVzIHRoZSBjZ2kgZnJvbSBjb21wbGV0ZWx5IHJhdyBIVFRQIGRhdGEuIFRoZSBpciBtdXN0IGhhdmUgYSBTb2NrZXQgc291cmNlLgoJLy8vICpjbG9zZUNvbm5lY3Rpb24gd2lsbCBiZSBzZXQgdG8gdHJ1ZSBpZiB5b3Ugc2hvdWxkIGNsb3NlIHRoZSBjb25uZWN0aW9uIGFmdGVyIGhhbmRsaW5nIHRoaXMgcmVxdWVzdAoJdGhpcyhCdWZmZXJlZElucHV0UmFuZ2UgaXIsIGJvb2wqIGNsb3NlQ29ubmVjdGlvbikgewoJCWlzQ2FsbGVkV2l0aENvbW1hbmRMaW5lQXJndW1lbnRzID0gZmFsc2U7CgkJaW1wb3J0IGFsID0gc3RkLmFsZ29yaXRobTsKCgkJaW1tdXRhYmxlKHVieXRlKVtdIGRhdGE7CgoJCXZvaWQgcmRvKGNvbnN0KHVieXRlKVtdIGQpIHsKCQkJc2VuZEFsbChpci5zb3VyY2UsIGQpOwoJCX0KCgkJdGhpcyhpciwgaXIuc291cmNlLnJlbW90ZUFkZHJlc3MoKS50b1N0cmluZygpLCA4MCAvKiBGSVhNRSAqLywgMCwgZmFsc2UsICZyZG8sIG51bGwsIGNsb3NlQ29ubmVjdGlvbik7Cgl9CgoJLyoqCgkJSW5pdGlhbGl6ZXMgaXQgZnJvbSByYXcgSFRUUCByZXF1ZXN0IGRhdGEuIEdlbmVyaWNNYWluIHVzZXMgdGhpcyB3aGVuIHlvdSBjb21waWxlIHdpdGggLXZlcnNpb249ZW1iZWRkZWRfaHR0cGQuCgoJCU5PVEU6IElmIHlvdSBhcmUgYmVoaW5kIGEgcmV2ZXJzZSBwcm94eSwgdGhlIHZhbHVlcyBoZXJlIG1pZ2h0IG5vdCBiZSB3aGF0IHlvdSBleHBlY3QuLi4uIGl0IHdpbGwgdXNlIFgtRm9yd2FyZGVkLUZvciBmb3IgcmVtb3RlIElQIGFuZCBYLUZvcndhcmRlZC1Ib3N0IGZvciBob3N0CgoJCVBhcmFtczoKCQkJaW5wdXREYXRhID0gdGhlIGluY29taW5nIGRhdGEsIGluY2x1ZGluZyBoZWFkZXJzIGFuZCBvdGhlciByYXcgaHR0cCBkYXRhLgoJCQkJV2hlbiB0aGUgY29uc3RydWN0b3IgZXhpdHMsIGl0IHdpbGwgbGVhdmUgdGhpcyByYW5nZSBleGFjdGx5IGF0IHRoZSBzdGFydCBvZgoJCQkJdGhlIG5leHQgcmVxdWVzdCBvbiB0aGUgY29ubmVjdGlvbiAoaWYgdGhlcmUgaXMgb25lKS4KCgkJCWFkZHJlc3MgPSB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIHVzZXIKCQkJX3BvcnQgPSB0aGUgcG9ydCBudW1iZXIgb2YgdGhlIGNvbm5lY3Rpb24KCQkJcGF0aEluZm9TdGFydHMgPSB0aGUgb2Zmc2V0IGludG8gdGhlIHBhdGggY29tcG9uZW50IG9mIHRoZSBodHRwIGhlYWRlciB3aGVyZSB0aGUgU0NSSVBUX05BTUUgZW5kcyBhbmQgdGhlIFBBVEhfSU5GTyBiZWdpbnMuCgkJCV9odHRwcyA9IGlmIHRoaXMgY29ubmVjdGlvbiBpcyBlbmNyeXB0ZWQgKG5vdGUgdGhhdCB0aGUgaW5wdXQgZGF0YSBtdXN0IG5vdCBhY3R1YWxseSBiZSBlbmNyeXB0ZWQpCgkJCV9yYXdEYXRhT3V0cHV0ID0gZGVsZWdhdGUgdG8gYWNjZXB0IHJlc3BvbnNlIGRhdGEuIEl0IHNob3VsZCB3cml0ZSB0byB0aGUgc29ja2V0IG9yIHdoYXRldmVyOyBDZ2kgZG9lcyBhbGwgdGhlIG5lZWRlZCBwcm9jZXNzaW5nIHRvIHNwZWFrIGh0dHAuCgkJCV9mbHVzaCA9IGlmIF9yYXdEYXRhT3V0cHV0IGJ1ZmZlcnMsIHRoaXMgZGVsZWdhdGUgc2hvdWxkIGZsdXNoIHRoZSBidWZmZXIgZG93biB0aGUgd2lyZQoJCQljbG9zZUNvbm5lY3Rpb24gPSBpZiB0aGUgcmVxdWVzdCBhc2tzIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uLCAqY2xvc2VDb25uZWN0aW9uID09IHRydWUuCgkqLwoJdGhpcygKCQlCdWZmZXJlZElucHV0UmFuZ2UgaW5wdXREYXRhLAovLwkJc3RyaW5nW10gaGVhZGVycywgaW1tdXRhYmxlKHVieXRlKVtdIGRhdGEsCgkJc3RyaW5nIGFkZHJlc3MsIHVzaG9ydCBfcG9ydCwKCQlpbnQgcGF0aEluZm9TdGFydHMgPSAwLCAvLyB1c2UgdGhpcyBpZiB5b3Uga25vdyB0aGUgc2NyaXB0IG5hbWUsIGxpa2UgaWYgdGhpcyBpcyBpbiBhIGZvbGRlciBpbiBhIGJpZ2dlciB3ZWIgZW52aXJvbm1lbnQKCQlib29sIF9odHRwcyA9IGZhbHNlLAoJCXZvaWQgZGVsZWdhdGUoY29uc3QodWJ5dGUpW10pIF9yYXdEYXRhT3V0cHV0ID0gbnVsbCwKCQl2b2lkIGRlbGVnYXRlKCkgX2ZsdXNoID0gbnVsbCwKCQkvLyB0aGlzIHBvaW50ZXIgdGVsbHMgaWYgdGhlIGNvbm5lY3Rpb24gaXMgc3VwcG9zZWQgdG8gYmUgY2xvc2VkIGFmdGVyIHdlIGhhbmRsZSB0aGlzCgkJYm9vbCogY2xvc2VDb25uZWN0aW9uID0gbnVsbCkKCXsKCQkvLyB0aGVzZSBhcmUgYWxsIHNldCBsb2NhbGx5IHNvIHRoZSBsb29wIHdvcmtzCgkJLy8gd2l0aG91dCB0cmlnZ2VyaW5nIGVycm9ycyBpbiBkbWQgMi4wNjQKCQkvLyB3ZSBnbyBhaGVhZCBhbmQgc2V0IHRoZW0gYXQgdGhlIGVuZCBvZiBpdCB0byB0aGUgdGhpcyB2ZXJzaW9uCgkJaW50IHBvcnQ7CgkJc3RyaW5nIHJlZmVycmVyOwoJCXN0cmluZyByZW1vdGVBZGRyZXNzOwoJCXN0cmluZyB1c2VyQWdlbnQ7CgkJc3RyaW5nIGF1dGhvcml6YXRpb247CgkJc3RyaW5nIG9yaWdpbjsKCQlzdHJpbmcgYWNjZXB0OwoJCXN0cmluZyBsYXN0RXZlbnRJZDsKCQlib29sIGh0dHBzOwoJCXN0cmluZyBob3N0OwoJCVJlcXVlc3RNZXRob2QgcmVxdWVzdE1ldGhvZDsKCQlzdHJpbmcgcmVxdWVzdFVyaTsKCQlzdHJpbmcgcGF0aEluZm87CgkJc3RyaW5nIHF1ZXJ5U3RyaW5nOwoJCXN0cmluZyBzY3JpcHROYW1lOwoJCXN0cmluZ1tzdHJpbmddIGdldDsKCQlzdHJpbmdbXVtzdHJpbmddIGdldEFycmF5OwoJCWJvb2wga2VlcEFsaXZlUmVxdWVzdGVkOwoJCWJvb2wgYWNjZXB0c0d6aXA7CgkJc3RyaW5nIGNvb2tpZTsKCgoKCQllbnZpcm9ubWVudFZhcmlhYmxlcyA9IGNhc3QoY29uc3QpIGVudmlyb25tZW50LnRvQUE7CgoJCWlkbG9sID0gaW5wdXREYXRhOwoKCQlpc0NhbGxlZFdpdGhDb21tYW5kTGluZUFyZ3VtZW50cyA9IGZhbHNlOwoKCQlodHRwcyA9IF9odHRwczsKCQlwb3J0ID0gX3BvcnQ7CgoJCXJhd0RhdGFPdXRwdXQgPSBfcmF3RGF0YU91dHB1dDsKCQlmbHVzaERlbGVnYXRlID0gX2ZsdXNoOwoJCW5waCA9IHRydWU7CgoJCXJlbW90ZUFkZHJlc3MgPSBhZGRyZXNzOwoKCQkvLyBzdHJlYW1pbmcgcGFyc2VyCgkJaW1wb3J0IGFsID0gc3RkLmFsZ29yaXRobTsKCgkJCS8vIEZJWE1FOiB0aXMgY2FzdCBpcyB0ZWNobmljYWxseSB3cm9uZywgYnV0IFBob2JvcyBkZXByZWNhdGVkIGFsLmluZGV4T2YuLi4gZm9yIHNvbWUgcmVhc29uLgoJCWF1dG8gaWR4ID0gaW5kZXhPZihjYXN0KHN0cmluZykgaW5wdXREYXRhLmZyb250KCksICJcclxuXHJcbiIpOwoJCXdoaWxlKGlkeCA9PSAtMSkgewoJCQlpbnB1dERhdGEucG9wRnJvbnQoMCk7CgkJCWlkeCA9IGluZGV4T2YoY2FzdChzdHJpbmcpIGlucHV0RGF0YS5mcm9udCgpLCAiXHJcblxyXG4iKTsKCQl9CgoJCWFzc2VydChpZHggIT0gLTEpOwoKCgkJc3RyaW5nIGNvbnRlbnRUeXBlID0gIiI7CgkJc3RyaW5nW3N0cmluZ10gcmVxdWVzdEhlYWRlcnNIZXJlOwoKCQlzaXplX3QgY29udGVudExlbmd0aDsKCgkJYm9vbCBpc0NodW5rZWQ7CgoJCXsKCQkJaW1wb3J0IGNvcmUucnVudGltZTsKCQkJc2NyaXB0RmlsZU5hbWUgPSBSdW50aW1lLmFyZ3NbMF07CgkJfQoKCgkJaW50IGhlYWRlck51bWJlciA9IDA7CgkJZm9yZWFjaChsaW5lOyBhbC5zcGxpdHRlcihpbnB1dERhdGEuZnJvbnQoKVswIC4uIGlkeF0sICJcclxuIikpCgkJaWYobGluZS5sZW5ndGgpIHsKCQkJaGVhZGVyTnVtYmVyKys7CgkJCWF1dG8gaGVhZGVyID0gY2FzdChzdHJpbmcpIGxpbmUuaWR1cDsKCQkJaWYoaGVhZGVyTnVtYmVyID09IDEpIHsKCQkJCS8vIHJlcXVlc3QgbGluZQoJCQkJYXV0byBwYXJ0cyA9IGFsLnNwbGl0dGVyKGhlYWRlciwgIiAiKTsKCQkJCXJlcXVlc3RNZXRob2QgPSB0byFSZXF1ZXN0TWV0aG9kKHBhcnRzLmZyb250KTsKCQkJCXBhcnRzLnBvcEZyb250KCk7CgkJCQlyZXF1ZXN0VXJpID0gcGFydHMuZnJvbnQ7CgoJCQkJc2NyaXB0TmFtZSA9IHJlcXVlc3RVcmlbMCAuLiBwYXRoSW5mb1N0YXJ0c107CgoJCQkJYXV0byBxdWVzdGlvbiA9IHJlcXVlc3RVcmkuaW5kZXhPZigiPyIpOwoJCQkJaWYocXVlc3Rpb24gPT0gLTEpIHsKCQkJCQlxdWVyeVN0cmluZyA9ICIiOwoJCQkJCS8vIEZJWE1FOiBkb3VibGUgY2hlY2ssIHRoaXMgbWlnaHQgYmUgd3Jvbmcgc2luY2UgaXQgY291bGQgYmUgdXJsIGVuY29kZWQKCQkJCQlwYXRoSW5mbyA9IHJlcXVlc3RVcmlbcGF0aEluZm9TdGFydHMuLiRdOwoJCQkJfSBlbHNlIHsKCQkJCQlxdWVyeVN0cmluZyA9IHJlcXVlc3RVcmlbcXVlc3Rpb24rMS4uJF07CgkJCQkJcGF0aEluZm8gPSByZXF1ZXN0VXJpW3BhdGhJbmZvU3RhcnRzLi5xdWVzdGlvbl07CgkJCQl9CgoJCQkJZ2V0ID0gY2FzdChzdHJpbmdbc3RyaW5nXSkgZ2V0R2V0VmFyaWFibGVzKHF1ZXJ5U3RyaW5nKTsKCQkJCWF1dG8gdWdoID0gZGVjb2RlVmFyaWFibGVzKHF1ZXJ5U3RyaW5nKTsKCQkJCWdldEFycmF5ID0gY2FzdChzdHJpbmdbXVtzdHJpbmddKSBhc3N1bWVVbmlxdWUodWdoKTsKCgkJCQlpZihoZWFkZXIuaW5kZXhPZigiSFRUUC8xLjAiKSAhPSAtMSkgewoJCQkJCWh0dHAxMCA9IHRydWU7CgkJCQkJYXV0b0J1ZmZlciA9IHRydWU7CgkJCQkJaWYoY2xvc2VDb25uZWN0aW9uKQoJCQkJCQkqY2xvc2VDb25uZWN0aW9uID0gdHJ1ZTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCS8vIG90aGVyIGhlYWRlcgoJCQkJYXV0byBjb2xvbiA9IGhlYWRlci5pbmRleE9mKCI6Iik7CgkJCQlpZihjb2xvbiA9PSAtMSkKCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJIVFRQIGhlYWRlcnMgc2hvdWxkIGhhdmUgYSBjb2xvbiEiKTsKCQkJCXN0cmluZyBuYW1lID0gaGVhZGVyWzAuLmNvbG9uXS50b0xvd2VyOwoJCQkJc3RyaW5nIHZhbHVlID0gaGVhZGVyW2NvbG9uKzIuLiRdOyAvLyBza2lwIHRoZSBjb2xvbiBhbmQgdGhlIHNwYWNlCgoJCQkJcmVxdWVzdEhlYWRlcnNIZXJlW25hbWVdID0gdmFsdWU7CgoJCQkJc3dpdGNoKG5hbWUpIHsKCQkJCQljYXNlICJhY2NlcHQiOgoJCQkJCQlhY2NlcHQgPSB2YWx1ZTsKCQkJCQlicmVhazsKCQkJCQljYXNlICJvcmlnaW4iOgoJCQkJCQlvcmlnaW4gPSB2YWx1ZTsKCQkJCQlicmVhazsKCQkJCQljYXNlICJjb25uZWN0aW9uIjoKCQkJCQkJaWYodmFsdWUgPT0gImNsb3NlIiAmJiBjbG9zZUNvbm5lY3Rpb24pCgkJCQkJCQkqY2xvc2VDb25uZWN0aW9uID0gdHJ1ZTsKCQkJCQkJaWYodmFsdWUudG9Mb3dlcigpLmluZGV4T2YoImtlZXAtYWxpdmUiKSAhPSAtMSkKCQkJCQkJCWtlZXBBbGl2ZVJlcXVlc3RlZCA9IHRydWU7CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAidHJhbnNmZXItZW5jb2RpbmciOgoJCQkJCQlpZih2YWx1ZSA9PSAiY2h1bmtlZCIpCgkJCQkJCQlpc0NodW5rZWQgPSB0cnVlOwoJCQkJCWJyZWFrOwoJCQkJCWNhc2UgImxhc3QtZXZlbnQtaWQiOgoJCQkJCQlsYXN0RXZlbnRJZCA9IHZhbHVlOwoJCQkJCWJyZWFrOwoJCQkJCWNhc2UgImF1dGhvcml6YXRpb24iOgoJCQkJCQlhdXRob3JpemF0aW9uID0gdmFsdWU7CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAiY29udGVudC10eXBlIjoKCQkJCQkJY29udGVudFR5cGUgPSB2YWx1ZTsKCQkJCQlicmVhazsKCQkJCQljYXNlICJjb250ZW50LWxlbmd0aCI6CgkJCQkJCWNvbnRlbnRMZW5ndGggPSB0byFzaXplX3QodmFsdWUpOwoJCQkJCWJyZWFrOwoJCQkJCWNhc2UgIngtZm9yd2FyZGVkLWZvciI6CgkJCQkJCXJlbW90ZUFkZHJlc3MgPSB2YWx1ZTsKCQkJCQlicmVhazsKCQkJCQljYXNlICJ4LWZvcndhcmRlZC1ob3N0IjoKCQkJCQljYXNlICJob3N0IjoKCQkJCQkJaG9zdCA9IHZhbHVlOwoJCQkJCWJyZWFrOwoJCQkJCWNhc2UgImFjY2VwdC1lbmNvZGluZyI6CgkJCQkJCWlmKHZhbHVlLmluZGV4T2YoImd6aXAiKSAhPSAtMSkKCQkJCQkJCWFjY2VwdHNHemlwID0gdHJ1ZTsKCQkJCQlicmVhazsKCQkJCQljYXNlICJ1c2VyLWFnZW50IjoKCQkJCQkJdXNlckFnZW50ID0gdmFsdWU7CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAicmVmZXJlciI6CgkJCQkJCXJlZmVycmVyID0gdmFsdWU7CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAiY29va2llIjoKCQkJCQkJY29va2llIH49IHZhbHVlOwoJCQkJCWJyZWFrOwoJCQkJCWRlZmF1bHQ6CgkJCQkJCS8vIGlnbm9yZSBpdAoJCQkJfQoKCQkJfQoJCX0KCgkJaW5wdXREYXRhLmNvbnN1bWUoaWR4ICsgNCk7CgkJLy8gZG9uZQoKCQlyZXF1ZXN0SGVhZGVycyA9IGFzc3VtZVVuaXF1ZShyZXF1ZXN0SGVhZGVyc0hlcmUpOwoKCQlCeUNodW5rUmFuZ2UgZGF0YUJ5Q2h1bms7CgoJCS8vIHJlYWRpbmcgQ29udGVudC1MZW5ndGggdHlwZSBkYXRhCgkJLy8gV2UgbmVlZCB0byByZWFkIHVwIHRoZSBkYXRhIHdlIGhhdmUsIGFuZCB3cml0ZSBpdCBvdXQgYXMgYSBjaHVuay4KCQlpZighaXNDaHVua2VkKSB7CgkJCWRhdGFCeUNodW5rID0gYnlDaHVuayhpbnB1dERhdGEsIGNvbnRlbnRMZW5ndGgpOwoJCX0gZWxzZSB7CgkJCS8vIGNodW5rZWQgcmVxdWVzdHMgaGFwcGVuLCBidXQgbm90IGV2ZXJ5IGRheS4gU2luY2Ugd2UgbmVlZCB0byBrbm93CgkJCS8vIHRoZSBjb250ZW50IGxlbmd0aCAoZm9yIG5vdywgbWF5YmUgdGhhdCBzaG91bGQgY2hhbmdlKSwgd2UnbGwgYnVmZmVyCgkJCS8vIHRoZSB3aG9sZSB0aGluZyBoZXJlIGluc3RlYWQgb2YgcGFyc2Ugc3RyZWFtaW5nLiAoSSB0aGluayB0aGlzIGlzIHdoYXQgQXBhY2hlIGRvZXMgYW55d2F5IGluIGNnaSBtb2RlcykKCQkJYXV0byBkYXRhID0gZGVjaHVuayhpbnB1dERhdGEpOwoKCQkJLy8gc2V0IHRoZSByYW5nZSBoZXJlCgkJCWRhdGFCeUNodW5rID0gYnlDaHVuayhkYXRhKTsKCQkJY29udGVudExlbmd0aCA9IGRhdGEubGVuZ3RoOwoJCX0KCgkJYXNzZXJ0KGRhdGFCeUNodW5rICFpcyBudWxsKTsKCgkJaWYoY29udGVudExlbmd0aCkgewoJCQlwcmVwYXJlRm9ySW5jb21pbmdEYXRhQ2h1bmtzKGNvbnRlbnRUeXBlLCBjb250ZW50TGVuZ3RoKTsKCQkJZm9yZWFjaChkYXRhQ2h1bms7IGRhdGFCeUNodW5rKSB7CgkJCQloYW5kbGVJbmNvbWluZ0RhdGFDaHVuayhkYXRhQ2h1bmspOwoJCQl9CgkJCXBvc3RBcnJheSA9IGFzc3VtZVVuaXF1ZShwcHMuX3Bvc3QpOwoJCQlmaWxlc0FycmF5ID0gYXNzdW1lVW5pcXVlKHBwcy5fZmlsZXMpOwoJCQlmaWxlcyA9IGtlZXBMYXN0T2YoZmlsZXNBcnJheSk7CgkJCXBvc3QgPSBrZWVwTGFzdE9mKHBvc3RBcnJheSk7CgkJCXBvc3RKc29uID0gcHBzLnBvc3RKc29uOwoJCQljbGVhblVwUG9zdERhdGFTdGF0ZSgpOwoJCX0KCgkJdGhpcy5wb3J0ID0gcG9ydDsKCQl0aGlzLnJlZmVycmVyID0gcmVmZXJyZXI7CgkJdGhpcy5yZW1vdGVBZGRyZXNzID0gcmVtb3RlQWRkcmVzczsKCQl0aGlzLnVzZXJBZ2VudCA9IHVzZXJBZ2VudDsKCQl0aGlzLmF1dGhvcml6YXRpb24gPSBhdXRob3JpemF0aW9uOwoJCXRoaXMub3JpZ2luID0gb3JpZ2luOwoJCXRoaXMuYWNjZXB0ID0gYWNjZXB0OwoJCXRoaXMubGFzdEV2ZW50SWQgPSBsYXN0RXZlbnRJZDsKCQl0aGlzLmh0dHBzID0gaHR0cHM7CgkJdGhpcy5ob3N0ID0gaG9zdDsKCQl0aGlzLnJlcXVlc3RNZXRob2QgPSByZXF1ZXN0TWV0aG9kOwoJCXRoaXMucmVxdWVzdFVyaSA9IHJlcXVlc3RVcmk7CgkJdGhpcy5wYXRoSW5mbyA9IHBhdGhJbmZvOwoJCXRoaXMucXVlcnlTdHJpbmcgPSBxdWVyeVN0cmluZzsKCgkJdGhpcy5zY3JpcHROYW1lID0gc2NyaXB0TmFtZTsKCQl0aGlzLmdldCA9IGNhc3QoaW1tdXRhYmxlKSBnZXQ7CgkJdGhpcy5nZXRBcnJheSA9IGNhc3QoaW1tdXRhYmxlKSBnZXRBcnJheTsKCQl0aGlzLmtlZXBBbGl2ZVJlcXVlc3RlZCA9IGtlZXBBbGl2ZVJlcXVlc3RlZDsKCQl0aGlzLmFjY2VwdHNHemlwID0gYWNjZXB0c0d6aXA7CgkJdGhpcy5jb29raWUgPSBjb29raWU7CgoJCWNvb2tpZXNBcnJheSA9IGdldENvb2tpZUFycmF5KCk7CgkJY29va2llcyA9IGtlZXBMYXN0T2YoY29va2llc0FycmF5KTsKCgl9CglCdWZmZXJlZElucHV0UmFuZ2UgaWRsb2w7CgoJcHJpdmF0ZSBpbW11dGFibGUoc3RyaW5nW3N0cmluZ10pIGtlZXBMYXN0T2YoaW4gc3RyaW5nW11bc3RyaW5nXSBhcnIpIHsKCQlzdHJpbmdbc3RyaW5nXSBjYTsKCQlmb3JlYWNoKGssIHY7IGFycikKCQkJY2Fba10gPSB2WyQtMV07CgoJCXJldHVybiBhc3N1bWVVbmlxdWUoY2EpOwoJfQoKCS8vIEZJWE1FIGR1cGxpY2F0aW9uCglwcml2YXRlIGltbXV0YWJsZShVcGxvYWRlZEZpbGVbc3RyaW5nXSkga2VlcExhc3RPZihpbiBVcGxvYWRlZEZpbGVbXVtzdHJpbmddIGFycikgewoJCVVwbG9hZGVkRmlsZVtzdHJpbmddIGNhOwoJCWZvcmVhY2goaywgdjsgYXJyKQoJCQljYVtrXSA9IHZbJC0xXTsKCgkJcmV0dXJuIGFzc3VtZVVuaXF1ZShjYSk7Cgl9CgoKCXByaXZhdGUgaW1tdXRhYmxlKHN0cmluZ1tdW3N0cmluZ10pIGdldENvb2tpZUFycmF5KCkgewoJCWF1dG8gZm9yVGhlTG92ZU9mR29kID0gZGVjb2RlVmFyaWFibGVzKGNvb2tpZSwgIjsgIik7CgkJcmV0dXJuIGFzc3VtZVVuaXF1ZShmb3JUaGVMb3ZlT2ZHb2QpOwoJfQoKCS8vIHRoaXMgZnVuY3Rpb24gb25seSBleGlzdHMgYmVjYXVzZSBvZiB0aGUgd2l0aF9jZ2lfcGFja2VkIHRoaW5nLCB3aGljaCBpcwoJLy8gYSBmaWx0aHkgaGFjayBJIHB1dCBpbiBoZXJlIGZvciBhIHdvcmsgYXBwLiBXaGljaCBzdGlsbCBkZXBlbmRzIG9uIGl0LCBzbyBpdAoJLy8gc3RheXMgZm9yIG5vdy4gQnV0IEkgd2FudCB0byByZW1vdmUgaXQuCglwcml2YXRlIGltbXV0YWJsZShzdHJpbmdbc3RyaW5nXSkgZ2V0R2V0VmFyaWFibGVzKGluIHN0cmluZyBxdWVyeVN0cmluZykgewoJCWlmKHF1ZXJ5U3RyaW5nLmxlbmd0aCkgewoJCQlhdXRvIF9nZXQgPSBkZWNvZGVWYXJpYWJsZXNTaW5nbGUocXVlcnlTdHJpbmcpOwoKCQkJLy8gU29tZSBzaXRlcyBhcmUgc2hpdCBhbmQgZG9uJ3QgbGV0IHlvdSBoYW5kbGUgbXVsdGlwbGUgcGFyYW1ldGVycy4KCQkJLy8gSWYgc28sIGNvbXBpbGUgdGhpcyBpbiBhbmQgZW5jb2RlIGl0IGFzIGEgc2luZ2xlIHBhcmFtZXRlcgoJCQl2ZXJzaW9uKHdpdGhfY2dpX3BhY2tlZCkgewoJCQkJYXV0byBpZHggPSBwYXRoSW5mby5pbmRleE9mKCJQQUNLRUQiKTsKCQkJCWlmKGlkeCAhPSAtMSkgewoJCQkJCWF1dG8gcGkgPSBwYXRoSW5mb1tpZHggKyAiUEFDS0VEIi5sZW5ndGggLi4gJF07CgoJCQkJCWF1dG8gX3VucGFja2VkID0gZGVjb2RlVmFyaWFibGVzKAoJCQkJCQljYXN0KHN0cmluZykgYmFzZTY0VXJsRGVjb2RlKHBpKSk7CgoJCQkJCWZvcmVhY2goaywgdjsgX3VucGFja2VkKQoJCQkJCQlfZ2V0W2tdID0gdlskLTFdOwoJCQkJCS8vIHBvc3NpYmxlIHByb2JsZW06IGl0IHVzZWQgdG8gY3V0IFBBQ0tFRCBvZmYgdGhlIHBhdGggaW5mbwoJCQkJCS8vIGJ1dCBpdCBkb2Vzbid0IG5vdy4gSSB3YW50IHRvIGtpbGwgdGhpcyBjcmFwIGFueXdheSB0aG91Z2guCgkJCQl9CgoJCQkJaWYoImFyc2RfcGFja2VkX2RhdGEiIGluIGdldEFycmF5KSB7CgkJCQkJYXV0byBfdW5wYWNrZWQgPSBkZWNvZGVWYXJpYWJsZXMoCgkJCQkJCWNhc3Qoc3RyaW5nKSBiYXNlNjRVcmxEZWNvZGUoZ2V0QXJyYXlbImFyc2RfcGFja2VkX2RhdGEiXVswXSkpOwoKCQkJCQlmb3JlYWNoKGssIHY7IF91bnBhY2tlZCkKCQkJCQkJX2dldFtrXSA9IHZbJC0xXTsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGFzc3VtZVVuaXF1ZShfZ2V0KTsKCQl9CgoJCXJldHVybiBudWxsOwoJfQoJLy8vIFZlcnkgc2ltcGxlIG1ldGhvZCB0byByZXF1aXJlIGEgYmFzaWMgYXV0aCB1c2VybmFtZSBhbmQgcGFzc3dvcmQuCgkvLy8gSWYgdGhlIGh0dHAgcmVxdWVzdCBkb2Vzbid0IGluY2x1ZGUgdGhlIHJlcXVpcmVkIGNyZWRlbnRpYWxzLCBpdCB0aHJvd3MgYQoJLy8vIEhUVFAgNDAxIGVycm9yLCBhbmQgYW4gZXhjZXB0aW9uLgoJLy8vCgkvLy8gTm90ZTogYmFzaWMgYXV0aCBkb2VzIG5vdCBwcm92aWRlIGdyZWF0IHNlY3VyaXR5LCBlc3BlY2lhbGx5IG92ZXIgdW5lbmNyeXB0ZWQgSFRUUDsKCS8vLyB0aGUgdXNlcidzIGNyZWRlbnRpYWxzIGFyZSBzZW50IGluIHBsYWluIHRleHQgb24gZXZlcnkgcmVxdWVzdC4KCS8vLwoJLy8vIElmIHlvdSBhcmUgdXNpbmcgQXBhY2hlLCB0aGUgSFRUUF9BVVRIT1JJWkFUSU9OIHZhcmlhYmxlIG1heSBub3QgYmUgc2VudCB0byB0aGUKCS8vLyBhcHBsaWNhdGlvbi4gRWl0aGVyIHVzZSBBcGFjaGUncyBidWlsdCBpbiBtZXRob2RzIGZvciBiYXNpYyBhdXRoZW50aWNhdGlvbiwgb3IgYWRkCgkvLy8gc29tZXRoaW5nIGFsb25nIHRoZXNlIGxpbmVzIHRvIHlvdXIgc2VydmVyIGNvbmZpZ3VyYXRpb246CgkvLy8KCS8vLyAgICAgIFJld3JpdGVFbmdpbmUgT24gCgkvLy8gICAgICBSZXdyaXRlQ29uZCAle0hUVFA6QXV0aG9yaXphdGlvbn0gXiguKikgCgkvLy8gICAgICBSZXdyaXRlUnVsZSBeKC4qKSAtIFtFPUhUVFBfQVVUSE9SSVpBVElPTjolMV0KCS8vLwoJLy8vIFRvIGVuc3VyZSB0aGUgbmVjZXNzYXJ5IGRhdGEgaXMgYXZhaWxhYmxlIHRvIGNnaS5kLgoJdm9pZCByZXF1aXJlQmFzaWNBdXRoKHN0cmluZyB1c2VyLCBzdHJpbmcgcGFzcywgc3RyaW5nIG1lc3NhZ2UgPSBudWxsKSB7CgkJaWYoYXV0aG9yaXphdGlvbiAhPSAiQmFzaWMgIiB+IEJhc2U2NC5lbmNvZGUoY2FzdChpbW11dGFibGUodWJ5dGUpW10pICh1c2VyIH4gIjoiIH4gcGFzcykpKSB7CgkJCXNldFJlc3BvbnNlU3RhdHVzKCI0MDEgQXV0aG9yaXphdGlvbiBSZXF1aXJlZCIpOwoJCQloZWFkZXIgKCJXV1ctQXV0aGVudGljYXRlOiBCYXNpYyByZWFsbT1cIiJ+bWVzc2FnZX4iXCIiKTsKCQkJY2xvc2UoKTsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm90IGF1dGhvcml6ZWQ7IGdvdCAiIH4gYXV0aG9yaXphdGlvbik7CgkJfQoJfQoKCS8vLyBWZXJ5IHNpbXBsZSBjYWNoaW5nIGNvbnRyb2xzIC0gc2V0Q2FjaGUoZmFsc2UpIG1lYW5zIGl0IHdpbGwgbmV2ZXIgYmUgY2FjaGVkLiBHb29kIGZvciByYXBpZGx5IHVwZGF0ZWQgb3Igc2Vuc2l0aXZlIHNpdGVzLgoJLy8vIHNldENhY2hlKHRydWUpIG1lYW5zIGl0IHdpbGwgYWx3YXlzIGJlIGNhY2hlZCBmb3IgYXMgbG9uZyBhcyBwb3NzaWJsZS4gQmVzdCBmb3Igc3RhdGljIGNvbnRlbnQuCgkvLy8gVXNlIHNldFJlc3BvbnNlRXhwaXJlcyBhbmQgdXBkYXRlUmVzcG9uc2VFeHBpcmVzIGZvciBtb3JlIGNvbnRyb2wKCXZvaWQgc2V0Q2FjaGUoYm9vbCBhbGxvd0NhY2hpbmcpIHsKCQlub0NhY2hlID0gIWFsbG93Q2FjaGluZzsKCX0KCgkvLy8gU2V0IHRvIHRydWUgYW5kIHVzZSBjZ2kud3JpdGUoZGF0YSwgdHJ1ZSk7IHRvIHNlbmQgYSBnemlwcGVkIHJlc3BvbnNlIHRvIGJyb3dzZXJzCgkvLy8gd2hvIGNhbiBhY2NlcHQgaXQKCWJvb2wgZ3ppcFJlc3BvbnNlOwoKCWltbXV0YWJsZSBib29sIGFjY2VwdHNHemlwOwoJaW1tdXRhYmxlIGJvb2wga2VlcEFsaXZlUmVxdWVzdGVkOwoKCS8vLyBTZXQgdG8gdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIHdhcyBpbml0aWFsaXplZCB3aXRoIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKCWltbXV0YWJsZSBib29sIGlzQ2FsbGVkV2l0aENvbW1hbmRMaW5lQXJndW1lbnRzOwoKCS8vLyBUaGlzIGdldHMgYSBmdWxsIHVybCBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdCwgaW5jbHVkaW5nIHBvcnQsIHByb3RvY29sLCBob3N0LCBwYXRoLCBhbmQgcXVlcnkKCXN0cmluZyBnZXRDdXJyZW50Q29tcGxldGVVcmkoKSBjb25zdCB7CgkJdXNob3J0IGRlZmF1bHRQb3J0ID0gaHR0cHMgPyA0NDMgOiA4MDsKCgkJcmV0dXJuIGZvcm1hdCgiaHR0cCVzOi8vJXMlcyVzIiwKCQkJaHR0cHMgPyAicyIgOiAiIiwKCQkJaG9zdCwKCQkJKCFwb3J0IHx8IHBvcnQgPT0gZGVmYXVsdFBvcnQpID8gIiIgOiAiOiIgfiB0byFzdHJpbmcocG9ydCksCgkJCXJlcXVlc3RVcmkpOwoJfQoKCS8vLyBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgaWYgeW91ciBzaXRlIGJhc2UgdXJsIGlzbid0IHRoZSBzYW1lIGFzIHRoZSBzY3JpcHQgbmFtZQoJc3RyaW5nIGxvZ2ljYWxTY3JpcHROYW1lKCkgY29uc3QgewoJCXJldHVybiBzY3JpcHROYW1lOwoJfQoKCS8vLyBTZXRzIHRoZSBIVFRQIHN0YXR1cyBvZiB0aGUgcmVzcG9uc2UuIEZvciBleGFtcGxlLCAiNDA0IEZpbGUgTm90IEZvdW5kIiBvciAiNTAwIEludGVybmFsIFNlcnZlciBFcnJvciIuCgkvLy8gSXQgYXNzdW1lcyAiMjAwIE9LIiwgYW5kIGF1dG9tYXRpY2FsbHkgY2hhbmdlcyB0byAiMzAyIEZvdW5kIiBpZiB5b3UgY2FsbCBzZXRSZXNwb25zZUxvY2F0aW9uKCkuCgkvLy8gTm90ZSBzZXRSZXNwb25zZVN0YXR1cygpIG11c3QgYmUgY2FsbGVkICpiZWZvcmUqIHlvdSB3cml0ZSgpIGFueSBkYXRhIHRvIHRoZSBvdXRwdXQuCgl2b2lkIHNldFJlc3BvbnNlU3RhdHVzKHN0cmluZyBzdGF0dXMpIHsKCQlhc3NlcnQoIW91dHB1dHRlZFJlc3BvbnNlRGF0YSk7CgkJcmVzcG9uc2VTdGF0dXMgPSBzdGF0dXM7Cgl9Cglwcml2YXRlIHN0cmluZyByZXNwb25zZVN0YXR1cyA9IG51bGw7CgoJLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0byBvdXRwdXQgaGVhZGVycwoJYm9vbCBjYW5PdXRwdXRIZWFkZXJzKCkgewoJCXJldHVybiAhaXNDbG9zZWQgJiYgIW91dHB1dHRlZFJlc3BvbnNlRGF0YTsKCX0KCgkvLy8gU2V0cyB0aGUgbG9jYXRpb24gaGVhZGVyLCB3aGljaCB0aGUgYnJvd3NlciB3aWxsIHJlZGlyZWN0IHRoZSB1c2VyIHRvIGF1dG9tYXRpY2FsbHkuCgkvLy8gTm90ZSBzZXRSZXNwb25zZUxvY2F0aW9uKCkgbXVzdCBiZSBjYWxsZWQgKmJlZm9yZSogeW91IHdyaXRlKCkgYW55IGRhdGEgdG8gdGhlIG91dHB1dC4KCS8vLyBUaGUgb3B0aW9uYWwgaW1wb3J0YW50IGFyZ3VtZW50IGlzIHVzZWQgaWYgaXQncyBhIGRlZmF1bHQgc3VnZ2VzdGlvbiByYXRoZXIgdGhhbiBzb21ldGhpbmcgdG8gaW5zaXN0IHVwb24uCgl2b2lkIHNldFJlc3BvbnNlTG9jYXRpb24oc3RyaW5nIHVyaSwgYm9vbCBpbXBvcnRhbnQgPSB0cnVlLCBzdHJpbmcgc3RhdHVzID0gbnVsbCkgewoJCWlmKCFpbXBvcnRhbnQgJiYgaXNDdXJyZW50UmVzcG9uc2VMb2NhdGlvbkltcG9ydGFudCkKCQkJcmV0dXJuOyAvLyBpbXBvcnRhbnQgcmVkaXJlY3RzIGFsd2F5cyBvdmVycmlkZSB1bmltcG9ydGFudCBvbmVzCgoJCWlmKHVyaSBpcyBudWxsKSB7CgkJCXJlc3BvbnNlU3RhdHVzID0gIjIwMCBPSyI7CgkJCXJlc3BvbnNlTG9jYXRpb24gPSBudWxsOwoJCQlpc0N1cnJlbnRSZXNwb25zZUxvY2F0aW9uSW1wb3J0YW50ID0gaW1wb3J0YW50OwoJCQlyZXR1cm47IC8vIHRoaXMganVzdCBjYW5jZWxzIHRoZSByZWRpcmVjdAoJCX0KCgkJYXNzZXJ0KCFvdXRwdXR0ZWRSZXNwb25zZURhdGEpOwoJCWlmKHN0YXR1cyBpcyBudWxsKQoJCQlyZXNwb25zZVN0YXR1cyA9ICIzMDIgRm91bmQiOwoJCWVsc2UKCQkJcmVzcG9uc2VTdGF0dXMgPSBzdGF0dXM7CgoJCXJlc3BvbnNlTG9jYXRpb24gPSB1cmkuc3RyaXA7CgkJaXNDdXJyZW50UmVzcG9uc2VMb2NhdGlvbkltcG9ydGFudCA9IGltcG9ydGFudDsKCX0KCXByb3RlY3RlZCBzdHJpbmcgcmVzcG9uc2VMb2NhdGlvbiA9IG51bGw7Cglwcml2YXRlIGJvb2wgaXNDdXJyZW50UmVzcG9uc2VMb2NhdGlvbkltcG9ydGFudCA9IGZhbHNlOwoKCS8vLyBTZXRzIHRoZSBFeHBpcmVzOiBodHRwIGhlYWRlci4gU2VlIGFsc286IHVwZGF0ZVJlc3BvbnNlRXhwaXJlcywgc2V0UHVibGljQ2FjaGluZwoJLy8vIFRoZSBwYXJhbWV0ZXIgaXMgaW4gdW5peF90aW1lc3RhbXAgKiAxMDAwLiBUcnkgc2V0UmVzcG9uc2VFeHBpcmVzKGdldFVUQ3RpbWUoKSArIFNPTUUgQU1PVU5UKSBmb3Igbm9ybWFsIHVzZS4KCS8vLyBOb3RlOiB0aGUgd2hlbiBwYXJhbWV0ZXIgaXMgZGlmZmVyZW50IHRoYW4gc2V0Q29va2llJ3MgZXhwaXJlIHBhcmFtZXRlci4KCXZvaWQgc2V0UmVzcG9uc2VFeHBpcmVzKGxvbmcgd2hlbiwgYm9vbCBpc1B1YmxpYyA9IGZhbHNlKSB7CgkJcmVzcG9uc2VFeHBpcmVzID0gd2hlbjsKCQlzZXRDYWNoZSh0cnVlKTsgLy8gbmVlZCB0byBlbmFibGUgY2FjaGluZyBzbyB0aGUgZGF0ZSBoYXMgbWVhbmluZwoKCQlyZXNwb25zZUlzUHVibGljID0gaXNQdWJsaWM7Cgl9Cglwcml2YXRlIGxvbmcgcmVzcG9uc2VFeHBpcmVzID0gbG9uZy5taW47Cglwcml2YXRlIGJvb2wgcmVzcG9uc2VJc1B1YmxpYyA9IGZhbHNlOwoKCS8vLyBUaGlzIGlzIGxpa2Ugc2V0UmVzcG9uc2VFeHBpcmVzLCBidXQgaXQgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gVGhlIHNldHRpbmcgbW9zdCBpbiB0aGUgcGFzdCBpcyB0aGUgb25lIGtlcHQuCgkvLy8gSWYgeW91IGhhdmUgbXVsdGlwbGUgZnVuY3Rpb25zLCB0aGV5IGFsbCBtaWdodCBjYWxsIHVwZGF0ZVJlc3BvbnNlRXhwaXJlcyBhYm91dCB0aGVpciBvd24gcmV0dXJuIHZhbHVlLiBUaGUgcHJvZ3JhbQoJLy8vIG91dHB1dCBhcyBhIHdob2xlIGlzIGFzIGNhY2hlYWJsZSBhcyB0aGUgbGVhc3QgY2FjaGFibGUgcGFydCBpbiB0aGUgY2hhaW4uCgoJLy8vIHNldENhY2hlKGZhbHNlKSBhbHdheXMgb3ZlcnJpZGVzIHRoaXMgLSBpdCBpcywgYnkgZGVmaW5pdGlvbiwgdGhlIHN0cmljdGVzdCBhbnRpLWNhY2hlIHN0YXRlbWVudCBhdmFpbGFibGUuIElmIHlvdXIgc2l0ZSBvdXRwdXRzIHNlbnNpdGl2ZSB1c2VyIGRhdGEsIHlvdSBzaG91bGQgcHJvYmFibHkgY2FsbCBzZXRDYWNoZShmYWxzZSkgd2hlbiB5b3UgZG8sIHRvIGVuc3VyZSBubyBvdGhlciBmdW5jdGlvbnMgd2lsbCBjYWNoZSB0aGUgY29udGVudCwgYXMgaXQgbWF5IGJlIGEgcHJpdmFjeSByaXNrLgoJLy8vIENvbnZlcnNlbHksIHNldHRpbmcgaGVyZSBvdmVycmlkZXMgc2V0Q2FjaGUodHJ1ZSksIHNpbmNlIGFueSBleHBpcmF0aW9uIGRhdGUgaXMgaW4gdGhlIHBhc3Qgb2YgaW5maW5pdHkuCgl2b2lkIHVwZGF0ZVJlc3BvbnNlRXhwaXJlcyhsb25nIHdoZW4sIGJvb2wgaXNQdWJsaWMpIHsKCQlpZihyZXNwb25zZUV4cGlyZXMgPT0gbG9uZy5taW4pCgkJCXNldFJlc3BvbnNlRXhwaXJlcyh3aGVuLCBpc1B1YmxpYyk7CgkJZWxzZSBpZih3aGVuIDwgcmVzcG9uc2VFeHBpcmVzKQoJCQlzZXRSZXNwb25zZUV4cGlyZXMod2hlbiwgcmVzcG9uc2VJc1B1YmxpYyAmJiBpc1B1YmxpYyk7IC8vIGlmIGFueSBwYXJ0IG9mIGl0IGlzIHByaXZhdGUsIGl0IGFsbCBpcwoJfQoKCS8qCgkvLy8gU2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdGhlIHJlc3VsdCB0byBiZSBjYWNoZWQgcHVibGljYWxseSAtIHRoYXQgaXMsIGlzIHRoZSBjb250ZW50IHNoYXJlZD8KCS8vLyBTaG91bGQgZ2VuZXJhbGx5IGJlIGZhbHNlIGlmIHRoZSB1c2VyIGlzIGxvZ2dlZCBpbi4gSXQgYXNzdW1lcyBwcml2YXRlIGNhY2hlIG9ubHkuCgkvLy8gc2V0Q2FjaGUodHJ1ZSkgYWxzbyB0dXJucyBvbiBwdWJsaWMgY2FjaGluZywgYW5kIHNldENhY2hlKGZhbHNlKSBzZXRzIHRvIHByaXZhdGUuCgl2b2lkIHNldFB1YmxpY0NhY2hpbmcoYm9vbCBhbGxvd1B1YmxpY0NhY2hlcykgewoJCXB1YmxpY0NhY2hpbmcgPSBhbGxvd1B1YmxpY0NhY2hlczsKCX0KCXByaXZhdGUgYm9vbCBwdWJsaWNDYWNoaW5nID0gZmFsc2U7CgkqLwoKCS8vLyBTZXRzIGFuIEhUVFAgY29va2llLCBhdXRvbWF0aWNhbGx5IGVuY29kaW5nIHRoZSBkYXRhIHRvIHRoZSBjb3JyZWN0IHN0cmluZy4KCS8vLyBleHBpcmVzSW4gaXMgaG93IG1hbnkgbWlsbGlzZWNvbmRzIGluIHRoZSBmdXR1cmUgdGhlIGNvb2tpZSB3aWxsIGV4cGlyZS4KCS8vLyBUSVA6IHRvIG1ha2UgYSBjb29raWUgYWNjZXNzaWJsZSBmcm9tIHN1YmRvbWFpbnMsIHNldCB0aGUgZG9tYWluIHRvIC55b3VyZG9tYWluLmNvbS4KCS8vLyBOb3RlIHNldENvb2tpZSgpIG11c3QgYmUgY2FsbGVkICpiZWZvcmUqIHlvdSB3cml0ZSgpIGFueSBkYXRhIHRvIHRoZSBvdXRwdXQuCgl2b2lkIHNldENvb2tpZShzdHJpbmcgbmFtZSwgc3RyaW5nIGRhdGEsIGxvbmcgZXhwaXJlc0luID0gMCwgc3RyaW5nIHBhdGggPSBudWxsLCBzdHJpbmcgZG9tYWluID0gbnVsbCwgYm9vbCBodHRwT25seSA9IGZhbHNlLCBib29sIHNlY3VyZSA9IGZhbHNlKSB7CgkJYXNzZXJ0KCFvdXRwdXR0ZWRSZXNwb25zZURhdGEpOwoJCXN0cmluZyBjb29raWUgPSBzdGQudXJpLmVuY29kZUNvbXBvbmVudChuYW1lKSB+ICI9IjsKCQljb29raWUgfj0gc3RkLnVyaS5lbmNvZGVDb21wb25lbnQoZGF0YSk7CgkJaWYocGF0aCAhaXMgbnVsbCkKCQkJY29va2llIH49ICI7IHBhdGg9IiB+IHBhdGg7CgkJLy8gRklYTUU6IHNob3VsZCBJIGp1c3QgYmUgdXNpbmcgbWF4LWFnZSBoZXJlPyAoYWxzbyBpbiBjYWNoZSBiZWxvdykKCQlpZihleHBpcmVzSW4gIT0gMCkKCQkJY29va2llIH49ICI7IGV4cGlyZXM9IiB+IHByaW50RGF0ZShjYXN0KERhdGVUaW1lKSBDbG9jay5jdXJyVGltZShVVEMoKSkgKyBkdXIhIm1zZWNzIihleHBpcmVzSW4pKTsKCQlpZihkb21haW4gIWlzIG51bGwpCgkJCWNvb2tpZSB+PSAiOyBkb21haW49IiB+IGRvbWFpbjsKCQlpZihzZWN1cmUgPT0gdHJ1ZSkKCQkJY29va2llIH49ICI7IFNlY3VyZSI7CgkJaWYoaHR0cE9ubHkgPT0gdHJ1ZSApCgkJCWNvb2tpZSB+PSAiOyBIdHRwT25seSI7CgoJCWlmKGF1dG8gaWR4ID0gbmFtZSBpbiBjb29raWVJbmRleGVzKSB7CgkJCXJlc3BvbnNlQ29va2llc1sqaWR4XSA9IGNvb2tpZTsKCQl9IGVsc2UgewoJCQljb29raWVJbmRleGVzW25hbWVdID0gcmVzcG9uc2VDb29raWVzLmxlbmd0aDsKCQkJcmVzcG9uc2VDb29raWVzIH49IGNvb2tpZTsKCQl9Cgl9Cglwcml2YXRlIHN0cmluZ1tdIHJlc3BvbnNlQ29va2llczsKCXByaXZhdGUgc2l6ZV90W3N0cmluZ10gY29va2llSW5kZXhlczsKCgkvLy8gQ2xlYXJzIGEgcHJldmlvdXNseSBzZXQgY29va2llIHdpdGggdGhlIGdpdmVuIG5hbWUsIHBhdGgsIGFuZCBkb21haW4uCgl2b2lkIGNsZWFyQ29va2llKHN0cmluZyBuYW1lLCBzdHJpbmcgcGF0aCA9IG51bGwsIHN0cmluZyBkb21haW4gPSBudWxsKSB7CgkJYXNzZXJ0KCFvdXRwdXR0ZWRSZXNwb25zZURhdGEpOwoJCXNldENvb2tpZShuYW1lLCAiIiwgMSwgcGF0aCwgZG9tYWluKTsKCX0KCgkvLy8gU2V0cyB0aGUgY29udGVudCB0eXBlIG9mIHRoZSByZXNwb25zZSwgZm9yIGV4YW1wbGUgInRleHQvaHRtbCIgKHRoZSBkZWZhdWx0KSBmb3IgSFRNTCwgb3IgImltYWdlL3BuZyIgZm9yIGEgUE5HIGltYWdlCgl2b2lkIHNldFJlc3BvbnNlQ29udGVudFR5cGUoc3RyaW5nIGN0KSB7CgkJYXNzZXJ0KCFvdXRwdXR0ZWRSZXNwb25zZURhdGEpOwoJCXJlc3BvbnNlQ29udGVudFR5cGUgPSBjdDsKCX0KCXByaXZhdGUgc3RyaW5nIHJlc3BvbnNlQ29udGVudFR5cGUgPSBudWxsOwoKCS8vLyBBZGRzIGEgY3VzdG9tIGhlYWRlci4gSXQgc2hvdWxkIGJlIHRoZSBuYW1lOiB2YWx1ZSwgYnV0IHdpdGhvdXQgYW55IGxpbmUgdGVybWluYXRvci4KCS8vLyBGb3IgZXhhbXBsZTogaGVhZGVyKCJYLU15LUhlYWRlcjogU29tZSB2YWx1ZSIpOwoJLy8vIE5vdGUgeW91IHNob3VsZCB1c2UgdGhlIHNwZWNpYWxpemVkIGZ1bmN0aW9ucyBpbiB0aGlzIG9iamVjdCBpZiBwb3NzaWJsZSB0byBhdm9pZAoJLy8vIGR1cGxpY2F0ZXMgaW4gdGhlIG91dHB1dC4KCXZvaWQgaGVhZGVyKHN0cmluZyBoKSB7CgkJY3VzdG9tSGVhZGVycyB+PSBoOwoJfQoKCXByaXZhdGUgc3RyaW5nW10gY3VzdG9tSGVhZGVyczsKCXByaXZhdGUgYm9vbCB3ZWJzb2NrZXRNb2RlOwoKCXZvaWQgZmx1c2hIZWFkZXJzKGNvbnN0KHZvaWQpW10gdCwgYm9vbCBpc0FsbCA9IGZhbHNlKSB7CgkJc3RyaW5nW10gaGQ7CgkJLy8gRmx1c2ggdGhlIGhlYWRlcnMKCQlpZihyZXNwb25zZVN0YXR1cyAhaXMgbnVsbCkgewoJCQlpZihucGgpIHsKCQkJCWlmKGh0dHAxMCkKCQkJCQloZCB+PSAiSFRUUC8xLjAgIiB+IHJlc3BvbnNlU3RhdHVzOwoJCQkJZWxzZQoJCQkJCWhkIH49ICJIVFRQLzEuMSAiIH4gcmVzcG9uc2VTdGF0dXM7CgkJCX0gZWxzZQoJCQkJaGQgfj0gIlN0YXR1czogIiB+IHJlc3BvbnNlU3RhdHVzOwoJCX0gZWxzZSBpZiAobnBoKSB7CgkJCWlmKGh0dHAxMCkKCQkJCWhkIH49ICJIVFRQLzEuMCAyMDAgT0siOwoJCQllbHNlCgkJCQloZCB+PSAiSFRUUC8xLjEgMjAwIE9LIjsKCQl9CgoJCWlmKHdlYnNvY2tldE1vZGUpCgkJCWdvdG8gd2Vic29ja2V0OwoKCQlpZihucGgpIHsgLy8gd2UncmUgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgdGhlIGRhdGUgdG9vIGFjY29yZGluZyB0byBodHRwIDEuMQoJCQloZCB+PSAiRGF0ZTogIiB+IHByaW50RGF0ZShjYXN0KERhdGVUaW1lKSBDbG9jay5jdXJyVGltZShVVEMoKSkpOwoJCX0KCgkJLy8gRklYTUU6IHdoYXQgaWYgdGhlIHVzZXIgd2FudHMgdG8gc2V0IGhpcyBvd24gY29udGVudC1sZW5ndGg/CgkJLy8gVGhlIGN1c3RvbSBoZWFkZXIgZnVuY3Rpb24gY2FuIGRvIGl0LCBzbyBtYXliZSB0aGF0J3MgYmVzdC4KCQkvLyBPciB3ZSBjb3VsZCByZXVzZSB0aGUgaXNBbGwgcGFyYW0uCgkJaWYocmVzcG9uc2VMb2NhdGlvbiAhaXMgbnVsbCkgewoJCQloZCB+PSAiTG9jYXRpb246ICIgfiByZXNwb25zZUxvY2F0aW9uOwoJCX0KCQlpZighbm9DYWNoZSAmJiByZXNwb25zZUV4cGlyZXMgIT0gbG9uZy5taW4pIHsgLy8gYW4gZXhwbGljaXQgZXhwaXJhdGlvbiBkYXRlIGlzIHNldAoJCQlhdXRvIGV4cGlyZXMgPSBTeXNUaW1lKHVuaXhUaW1lVG9TdGRUaW1lKGNhc3QoaW50KShyZXNwb25zZUV4cGlyZXMgLyAxMDAwKSksIFVUQygpKTsKCQkJaGQgfj0gIkV4cGlyZXM6ICIgfiBwcmludERhdGUoCgkJCQljYXN0KERhdGVUaW1lKSBleHBpcmVzKTsKCQkJLy8gRklYTUU6IGFzc3VtaW5nIGV2ZXJ5dGhpbmcgaXMgcHJpdmF0ZSB1bmxlc3MgeW91IHVzZSBub2NhY2hlIC0gZ2VuZXJhbGx5IHJpZ2h0IGZvciBkeW5hbWljIHBhZ2VzLCBidXQgbm90IG5lY2Vzc2FyaWx5CgkJCWhkIH49ICJDYWNoZS1Db250cm9sOiAifihyZXNwb25zZUlzUHVibGljID8gInB1YmxpYyIgOiAicHJpdmF0ZSIpfiIsIG5vLWNhY2hlPVwic2V0LWNvb2tpZSwgc2V0LWNvb2tpZTJcIiI7CgkJfQoJCWlmKHJlc3BvbnNlQ29va2llcyAhaXMgbnVsbCAmJiByZXNwb25zZUNvb2tpZXMubGVuZ3RoID4gMCkgewoJCQlmb3JlYWNoKGM7IHJlc3BvbnNlQ29va2llcykKCQkJCWhkIH49ICJTZXQtQ29va2llOiAiIH4gYzsKCQl9CgkJaWYobm9DYWNoZSkgeyAvLyB3ZSBzcGVjaWZpY2FsbHkgZG8gbm90IHdhbnQgY2FjaGluZyAodGhpcyBpcyBhY3R1YWxseSB0aGUgZGVmYXVsdCkKCQkJaGQgfj0gIkNhY2hlLUNvbnRyb2w6IHByaXZhdGUsIG5vLWNhY2hlPVwic2V0LWNvb2tpZVwiIjsKCQkJaGQgfj0gIkV4cGlyZXM6IDAiOwoJCQloZCB+PSAiUHJhZ21hOiBuby1jYWNoZSI7CgkJfSBlbHNlIHsKCQkJaWYocmVzcG9uc2VFeHBpcmVzID09IGxvbmcubWluKSB7IC8vIGNhY2hpbmcgd2FzIGVuYWJsZWQsIGJ1dCB3aXRob3V0IGEgZGF0ZSBzZXQgLSB0aGF0IG1lYW5zIGFzc3VtZSBjYWNoZSBmb3JldmVyCgkJCQloZCB+PSAiQ2FjaGUtQ29udHJvbDogcHVibGljIjsKCQkJCWhkIH49ICJFeHBpcmVzOiBUdWUsIDMxIERlYyAyMDMwIDE0OjAwOjAwIEdNVCI7IC8vIEZJWE1FOiBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiBvbmUgeWVhciBpbiB0aGUgZnV0dXJlCgkJCX0KCQl9CgkJaWYocmVzcG9uc2VDb250ZW50VHlwZSAhaXMgbnVsbCkgewoJCQloZCB+PSAiQ29udGVudC1UeXBlOiAiIH4gcmVzcG9uc2VDb250ZW50VHlwZTsKCQl9IGVsc2UKCQkJaGQgfj0gIkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IjsKCgkJaWYoZ3ppcFJlc3BvbnNlICYmIGFjY2VwdHNHemlwICYmIGlzQWxsKSB7IC8vIEZJWE1FOiBpc0FsbCByZWFsbHkgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeQoJCQloZCB+PSAiQ29udGVudC1FbmNvZGluZzogZ3ppcCI7CgkJfQoKCgkJaWYoIWlzQWxsKSB7CgkJCWlmKG5waCAmJiAhaHR0cDEwKSB7CgkJCQloZCB+PSAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQiOwoJCQkJcmVzcG9uc2VDaHVua2VkID0gdHJ1ZTsKCQkJfQoJCX0gZWxzZSB7CgkJCWhkIH49ICJDb250ZW50LUxlbmd0aDogIiB+IHRvIXN0cmluZyh0Lmxlbmd0aCk7CgkJCWlmKG5waCAmJiBrZWVwQWxpdmVSZXF1ZXN0ZWQpIHsKCQkJCWhkIH49ICJDb25uZWN0aW9uOiBLZWVwLUFsaXZlIjsKCQkJfQoJCX0KCgkJd2Vic29ja2V0OgoJCWlmKGN1c3RvbUhlYWRlcnMgIWlzIG51bGwpCgkJCWhkIH49IGN1c3RvbUhlYWRlcnM7CgoJCS8vIEZJWE1FOiB3aGF0IGFib3V0IGR1cGxpY2F0ZWQgaGVhZGVycz8KCgkJZm9yZWFjaChoOyBoZCkgewoJCQlpZihyYXdEYXRhT3V0cHV0ICFpcyBudWxsKQoJCQkJcmF3RGF0YU91dHB1dChjYXN0KGNvbnN0KHVieXRlKVtdKSAoaCB+ICJcclxuIikpOwoJCQllbHNlCgkJCQl3cml0ZWxuKGgpOwoJCX0KCQlpZihyYXdEYXRhT3V0cHV0ICFpcyBudWxsKQoJCQlyYXdEYXRhT3V0cHV0KGNhc3QoY29uc3QodWJ5dGUpW10pICgiXHJcbiIpKTsKCQllbHNlCgkJCXdyaXRlbG4oIiIpOwoKCQlvdXRwdXR0ZWRSZXNwb25zZURhdGEgPSB0cnVlOwoJfQoKCS8vLyBXcml0ZXMgdGhlIGRhdGEgdG8gdGhlIG91dHB1dCwgZmx1c2hpbmcgaGVhZGVycyBpZiB0aGV5IGhhdmUgbm90IHlldCBiZWVuIHNlbnQuCgl2b2lkIHdyaXRlKGNvbnN0KHZvaWQpW10gdCwgYm9vbCBpc0FsbCA9IGZhbHNlLCBib29sIG1heWJlQXV0b0Nsb3NlID0gdHJ1ZSkgewoJCWFzc2VydCghY2xvc2VkLCAiT3V0cHV0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIik7CgoJCWlmKGd6aXBSZXNwb25zZSAmJiBhY2NlcHRzR3ppcCAmJiBpc0FsbCkgeyAvLyBGSVhNRTogaXNBbGwgcmVhbGx5IHNob3VsZG4ndCBiZSBuZWNlc3NhcnkKCQkJLy8gYWN0dWFsbHkgZ3ppcCB0aGUgZGF0YSBoZXJlCgoJCQlhdXRvIGMgPSBuZXcgQ29tcHJlc3MoSGVhZGVyRm9ybWF0Lmd6aXApOyAvLyB3YW50IGd6aXAKCgkJCWF1dG8gZGF0YSA9IGMuY29tcHJlc3ModCk7CgkJCWRhdGEgfj0gYy5mbHVzaCgpOwoKCQkJLy8gc3RkLmZpbGUud3JpdGUoIi90bXAvbGFzdC1pdGVtIiwgZGF0YSk7CgoJCQl0ID0gZGF0YTsKCQl9CgoJCWlmKCFvdXRwdXR0ZWRSZXNwb25zZURhdGEgJiYgKCFhdXRvQnVmZmVyIHx8IGlzQWxsKSkgewoJCQlmbHVzaEhlYWRlcnModCwgaXNBbGwpOwoJCX0KCgkJaWYocmVxdWVzdE1ldGhvZCAhPSBSZXF1ZXN0TWV0aG9kLkhFQUQgJiYgdC5sZW5ndGggPiAwKSB7CgkJCWlmIChhdXRvQnVmZmVyKSB7CgkJCQlvdXRwdXRCdWZmZXIgfj0gY2FzdCh1Ynl0ZVtdKSB0OwoJCQl9CgkJCWlmKCFhdXRvQnVmZmVyIHx8IGlzQWxsKSB7CgkJCQlpZihyYXdEYXRhT3V0cHV0ICFpcyBudWxsKQoJCQkJCWlmKG5waCAmJiByZXNwb25zZUNodW5rZWQpIHsKCQkJCQkJLy9yYXdEYXRhT3V0cHV0KG1ha2VDaHVuayhjYXN0KGNvbnN0KHVieXRlKVtdKSB0KSk7CgkJCQkJCS8vIHdlJ3JlIG1ha2luZyB0aGUgY2h1bmsgaGVyZSBpbnN0ZWFkIG9mIGluIGEgZnVuY3Rpb24KCQkJCQkJLy8gdG8gYXZvaWQgdW5uZWVkZWQgZ2MgcHJlc3N1cmUKCQkJCQkJcmF3RGF0YU91dHB1dChjYXN0KGNvbnN0KHVieXRlKVtdKSB0b0hleCh0Lmxlbmd0aCkpOwoJCQkJCQlyYXdEYXRhT3V0cHV0KGNhc3QoY29uc3QodWJ5dGUpW10pICJcclxuIik7CgkJCQkJCXJhd0RhdGFPdXRwdXQoY2FzdChjb25zdCh1Ynl0ZSlbXSkgdCk7CgkJCQkJCXJhd0RhdGFPdXRwdXQoY2FzdChjb25zdCh1Ynl0ZSlbXSkgIlxyXG4iKTsKCgoJCQkJCX0gZWxzZSB7CgkJCQkJCXJhd0RhdGFPdXRwdXQoY2FzdChjb25zdCh1Ynl0ZSlbXSkgdCk7CgkJCQkJfQoJCQkJZWxzZQoJCQkJCXN0ZG91dC5yYXdXcml0ZSh0KTsKCQkJfQoJCX0KCgkJaWYobWF5YmVBdXRvQ2xvc2UgJiYgaXNBbGwpCgkJCWNsb3NlKCk7IC8vIGlmIHlvdSBzYXkgaXQgaXMgYWxsLCB0aGF0IG1lYW5zIHdlJ3JlIGRlZmluaXRlbHkgZG9uZQoJCQkJLy8gbWF5YmVBdXRvQ2xvc2UgY2FuIGJlIGZhbHNlIHRob3VnaCB0byBhdm9pZCB0aGlzIChpbXBvcnRhbnQgaWYgeW91IGNhbGwgZnJvbSBpbnNpZGUgY2xvc2UoKSEKCX0KCgl2b2lkIGZsdXNoKCkgewoJCWlmKHJhd0RhdGFPdXRwdXQgaXMgbnVsbCkKCQkJc3Rkb3V0LmZsdXNoKCk7CgkJZWxzZSBpZihmbHVzaERlbGVnYXRlICFpcyBudWxsKQoJCQlmbHVzaERlbGVnYXRlKCk7Cgl9CgoJdmVyc2lvbihhdXRvQnVmZmVyKQoJCWJvb2wgYXV0b0J1ZmZlciA9IHRydWU7CgllbHNlCgkJYm9vbCBhdXRvQnVmZmVyID0gZmFsc2U7Cgl1Ynl0ZVtdIG91dHB1dEJ1ZmZlcjsKCgkvLy8gRmx1c2hlcyB0aGUgYnVmZmVycyB0byB0aGUgbmV0d29yaywgc2lnbmlmeWluZyB0aGF0IHlvdSBhcmUgZG9uZS4KCS8vLyBZb3Ugc2hvdWxkIGFsd2F5cyBjYWxsIHRoaXMgZXhwbGljaXRseSB3aGVuIHlvdSBhcmUgZG9uZSBvdXRwdXR0aW5nIGRhdGEuCgl2b2lkIGNsb3NlKCkgewoJCWlmKGNsb3NlZCkKCQkJcmV0dXJuOyAvLyBkb24ndCBkb3VibGUgY2xvc2UKCgkJaWYoIW91dHB1dHRlZFJlc3BvbnNlRGF0YSkKCQkJd3JpdGUoIiIsIGZhbHNlLCBmYWxzZSk7CgoJCS8vIHdyaXRpbmcgYXV0byBidWZmZXJlZCBkYXRhCgkJaWYocmVxdWVzdE1ldGhvZCAhPSBSZXF1ZXN0TWV0aG9kLkhFQUQgJiYgYXV0b0J1ZmZlcikgewoJCQlpZighbnBoKQoJCQkJc3Rkb3V0LnJhd1dyaXRlKG91dHB1dEJ1ZmZlcik7CgkJCWVsc2UKCQkJCXdyaXRlKG91dHB1dEJ1ZmZlciwgdHJ1ZSwgZmFsc2UpOyAvLyB0ZWxsIGl0IHRoaXMgaXMgZXZlcnl0aGluZwoJCX0KCgkJLy8gY2xvc2luZyB0aGUgbGFzdCBjaHVuay4uLgoJCWlmKG5waCAmJiByYXdEYXRhT3V0cHV0ICFpcyBudWxsICYmIHJlc3BvbnNlQ2h1bmtlZCkKCQkJcmF3RGF0YU91dHB1dChjYXN0KGNvbnN0KHVieXRlKVtdKSAiMFxyXG5cclxuIik7CgoJCWlmKGZsdXNoRGVsZWdhdGUpCgkJCWZsdXNoRGVsZWdhdGUoKTsKCgkJY2xvc2VkID0gdHJ1ZTsKCX0KCgkvLyBDbG9zZXMgd2l0aG91dCBkb2luZyBhbnl0aGluZywgc2hvdWxkbid0IGJlIHVzZWQgb2Z0ZW4KCXZvaWQgcmF3Q2xvc2UoKSB7CgkJY2xvc2VkID0gdHJ1ZTsKCX0KCgkvKysKCQlHZXRzIGEgcmVxdWVzdCB2YXJpYWJsZSBhcyBhIHNwZWNpZmljIHR5cGUsIG9yIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGl0IGlzbid0IHRoZXJlCgkJb3IgaXNuJ3QgY29udmVydGlibGUgdG8gdGhlIHJlcXVlc3QgdHlwZS4KCQkKCQlDaGVja3MgYm90aCBHRVQgYW5kIFBPU1QgdmFyaWFibGVzLCBwcmVmZXJyaW5nIHRoZSBQT1NUIHZhcmlhYmxlLCBpZiBhdmFpbGFibGUuCgoJCUEgbmljZSB0cmljayBpcyB1c2luZyB0aGUgZGVmYXVsdCB2YWx1ZSB0byBjaG9vc2UgdGhlIHR5cGU6CgoJCS0tLQoJCQkvKgoJCQkJVGhlIHJldHVybiB2YWx1ZSB3aWxsIG1hdGNoIHRoZSB0eXBlIG9mIHRoZSBkZWZhdWx0LgoJCQkJSGVyZSwgSSBnYXZlIDEwIGFzIGEgZGVmYXVsdCwgc28gdGhlIHJldHVybiB2YWx1ZSB3aWxsCgkJCQliZSBhbiBpbnQuCgoJCQkJSWYgdGhlIHVzZXItc3VwcGxpZWQgdmFsdWUgY2Fubm90IGJlIGNvbnZlcnRlZCB0byB0aGUKCQkJCXJlcXVlc3RlZCB0eXBlLCB5b3Ugd2lsbCBnZXQgdGhlIGRlZmF1bHQgdmFsdWUgYmFjay4KCQkJKi8KCQkJaW50IGEgPSBjZ2kucmVxdWVzdCgibnVtYmVyIiwgMTApOwoKCQkJaWYoY2dpLmdldFsibnVtYmVyIl0gPT0gIjExIikKCQkJCWFzc2VydChhID09IDExKTsgLy8gY29udmVyc2lvbiBzdWNjZWVkcwoKCQkJaWYoIm51bWJlciIgIWluIGNnaS5nZXQpCgkJCQlhc3NlcnQoYSA9PSAxMCk7IC8vIG5vIHZhbHVlIG1lYW5zIHlvdSBjYW4ndCBjb252ZXJ0IC0gZ2l2ZSB0aGUgZGVmYXVsdAoKCQkJaWYoY2dpLmdldFsibnVtYmVyIl0gPT0gInR3ZWx2ZSIpCgkJCQlhc3NlcnQoYSA9PSAxMCk7IC8vIGNvbnZlcnNpb24gZnJvbSBzdHJpbmcgdG8gaW50IHdvdWxkIGZhaWwsIHNvIHdlIGdldCB0aGUgZGVmYXVsdAoJCS0tLQoKCQlZb3UgY2FuIHVzZSBhbiBlbnVtIGFzIGFuIGVhc3kgd2hpdGVsaXN0LCB0b286CgoJCS0tLQoJCQllbnVtIE9wZXJhdGlvbnMgewoJCQkJYWRkLCByZW1vdmUsIHF1ZXJ5CgkJCX0KCgkJCWF1dG8gb3AgPSBjZ2kucmVxdWVzdCgib3AiLCBPcGVyYXRpb25zLnF1ZXJ5KTsKCgkJCWlmKGNnaS5nZXRbIm9wIl0gPT0gImFkZCIpCgkJCQlhc3NlcnQob3AgPT0gT3BlcmF0aW9ucy5hZGQpOwoJCQlpZihjZ2kuZ2V0WyJvcCJdID09ICJyZW1vdmUiKQoJCQkJYXNzZXJ0KG9wID09IE9wZXJhdGlvbnMucmVtb3ZlKTsKCQkJaWYoY2dpLmdldFsib3AiXSA9PSAicXVlcnkiKQoJCQkJYXNzZXJ0KG9wID09IE9wZXJhdGlvbnMucXVlcnkpOwoKCQkJaWYoY2dpLmdldFsib3AiXSA9PSAicmFuZG9tIHN0cmluZyIpCgkJCQlhc3NlcnQob3AgPT0gT3BlcmF0aW9ucy5xdWVyeSk7IC8vIHRoZSB2YWx1ZSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gdGhlIGVudW0sIHNvIHdlIGdldCB0aGUgZGVmYXVsdAoJCS0tLQoJKy8KCVQgcmVxdWVzdChUID0gc3RyaW5nKShpbiBzdHJpbmcgbmFtZSwgaW4gVCBkZWYgPSBULmluaXQpIGNvbnN0IG5vdGhyb3cgewoJCXRyeSB7CgkJCXJldHVybgoJCQkJKG5hbWUgaW4gcG9zdCkgPyB0byFUKHBvc3RbbmFtZV0pIDoKCQkJCShuYW1lIGluIGdldCkgID8gdG8hVChnZXRbbmFtZV0pIDoKCQkJCWRlZjsKCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7IHJldHVybiBkZWY7IH0KCX0KCgkvLy8gSXMgdGhlIG91dHB1dCBhbHJlYWR5IGNsb3NlZD8KCWJvb2wgaXNDbG9zZWQoKSBjb25zdCB7CgkJcmV0dXJuIGNsb3NlZDsKCX0KCgkvKiBIb29rcyBmb3IgcmVkaXJlY3RpbmcgaW5wdXQgYW5kIG91dHB1dCAqLwoJcHJpdmF0ZSB2b2lkIGRlbGVnYXRlKGNvbnN0KHVieXRlKVtdKSByYXdEYXRhT3V0cHV0ID0gbnVsbDsKCXByaXZhdGUgdm9pZCBkZWxlZ2F0ZSgpIGZsdXNoRGVsZWdhdGUgPSBudWxsOwoKCS8qIFRoaXMgaW5mbyBpcyB1c2VkIHdoZW4gaGFuZGxpbmcgYSBtb3JlIHJhdyBIVFRQIHByb3RvY29sICovCglwcml2YXRlIGJvb2wgbnBoOwoJcHJpdmF0ZSBib29sIGh0dHAxMDsKCXByaXZhdGUgYm9vbCBjbG9zZWQ7Cglwcml2YXRlIGJvb2wgcmVzcG9uc2VDaHVua2VkID0gZmFsc2U7CgoJdmVyc2lvbihwcmVzZXJ2ZURhdGEpIC8vIG5vdGU6IHRoaXMgY2FuIGVhdCBsb3RzIG9mIG1lbW9yeTsgZG9uJ3QgdXNlIHVubGVzcyB5b3UncmUgc3VyZSB5b3UgbmVlZCBpdC4KCWltbXV0YWJsZSh1Ynl0ZSlbXSBvcmlnaW5hbFBvc3REYXRhOwoKCXB1YmxpYyBpbW11dGFibGUgc3RyaW5nIHBvc3RKc29uOwoKCS8qIEludGVybmFsIHN0YXRlIGZsYWdzICovCglwcml2YXRlIGJvb2wgb3V0cHV0dGVkUmVzcG9uc2VEYXRhOwoJcHJpdmF0ZSBib29sIG5vQ2FjaGUgPSB0cnVlOwoKCWNvbnN0KHN0cmluZ1tzdHJpbmddKSBlbnZpcm9ubWVudFZhcmlhYmxlczsKCgkvKiogV2hhdCBmb2xsb3dzIGlzIGRhdGEgZ290dGVuIGZyb20gdGhlIEhUVFAgcmVxdWVzdC4gSXQgaXMgYWxsIGZ1bGx5IGltbXV0YWJsZSwKCSAgICBwYXJ0aWFsbHkgYmVjYXVzZSBpdCBsb2dpY2FsbHkgaXMgKHlvdXIgY29kZSBkb2Vzbid0IGNoYW5nZSB3aGF0IHRoZSB1c2VyIHJlcXVlc3RlZC4uLikKCSAgICBhbmQgcGFydGlhbGx5IGJlY2F1c2UgSSBoYXRlIGhvdyBiYWQgcHJvZ3JhbXMgaW4gUEhQIGNoYW5nZSB0aG9zZSBzdXBlcmdsb2JhbHMgdG8gZG8KCSAgICBhbGwga2luZHMgb2YgaGFyZCB0byBmb2xsb3cgdWdsaW5lc3MuIEkgZG9uJ3Qgd2FudCB0aGF0IHRvIGV2ZXIgaGFwcGVuIGluIEQuCgoJICAgIEZvciBzb21lIG9mIHRoZXNlLCB5b3UnbGwgd2FudCB0byByZWZlciB0byB0aGUgaHR0cCBvciBjZ2kgc3BlY3MgZm9yIG1vcmUgZGV0YWlscy4KCSovCglpbW11dGFibGUoc3RyaW5nW3N0cmluZ10pIHJlcXVlc3RIZWFkZXJzOyAvLy8gQWxsIHRoZSByYXcgaGVhZGVycyBpbiB0aGUgcmVxdWVzdCBhcyBuYW1lL3ZhbHVlIHBhaXJzLiBUaGUgbmFtZSBpcyBzdG9yZWQgYXMgYWxsIGxvd2VyIGNhc2UsIGJ1dCBvdGhlcndpc2UgdGhlIHNhbWUgYXMgaXQgaXMgaW4gSFRUUDsgd29yZHMgc2VwYXJhdGVkIGJ5IGRhc2hlcy4gRm9yIGV4YW1wbGUsICJjb29raWUiIG9yICJhY2NlcHQtZW5jb2RpbmciLiBNYW55IEhUVFAgaGVhZGVycyBoYXZlIHNwZWNpYWxpemVkIHZhcmlhYmxlcyBiZWxvdyBmb3IgbW9yZSBjb252ZW5pZW5jZSBhbmQgc3RhdGljIG5hbWUgY2hlY2tpbmc7IHlvdSBzaG91bGQgZ2VuZXJhbGx5IHRyeSB0byB1c2UgdGhlbS4KCglpbW11dGFibGUoY2hhcltdKSBob3N0OyAJLy8vIFRoZSBob3N0bmFtZSBpbiB0aGUgcmVxdWVzdC4gSWYgb25lIHByb2dyYW0gc2VydmVzIG11bHRpcGxlIGRvbWFpbnMsIHlvdSBjYW4gdXNlIHRoaXMgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZW0uCglpbW11dGFibGUoY2hhcltdKSBvcmlnaW47IAkvLy8gVGhlIG9yaWdpbiBoZWFkZXIgaW4gdGhlIHJlcXVlc3QsIGlmIHByZXNlbnQuIFNvbWUgSFRNTDUgY3Jvc3MtZG9tYWluIGFwaXMgc2V0IHRoaXMgYW5kIHlvdSBzaG91bGQgY2hlY2sgaXQgb24gdGhvc2UgY3Jvc3MgZG9tYWluIHJlcXVlc3RzIGFuZCB3ZWJzb2NrZXRzLgoJaW1tdXRhYmxlKGNoYXJbXSkgdXNlckFnZW50OyAJLy8vIFRoZSBicm93c2VyJ3MgdXNlci1hZ2VudCBzdHJpbmcuIENhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBicm93c2VyLgoJaW1tdXRhYmxlKGNoYXJbXSkgcGF0aEluZm87IAkvLy8gVGhpcyBpcyBhbnkgc3R1ZmYgc2VudCBhZnRlciB5b3VyIHByb2dyYW0ncyBuYW1lIG9uIHRoZSB1cmwsIGJ1dCBiZWZvcmUgdGhlIHF1ZXJ5IHN0cmluZy4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91ciBwcm9ncmFtIGlzIG5hbWVkICJhcHAiLiBJZiB0aGUgdXNlciBnb2VzIHRvIHNpdGUuY29tL2FwcCwgcGF0aEluZm8gaXMgZW1wdHkuIEJ1dCwgaGUgY2FuIGFsc28gZ28gdG8gc2l0ZS5jb20vYXBwL3NvbWUvc3ViL3BhdGg7IHRyZWF0aW5nIHlvdXIgcHJvZ3JhbSBsaWtlIGEgdmlydHVhbCBmb2xkZXIuIEluIHRoaXMgY2FzZSwgcGF0aEluZm8gPT0gIi9zb21lL3N1Yi9wYXRoIi4KCWltbXV0YWJsZShjaGFyW10pIHNjcmlwdE5hbWU7ICAgLy8vIFRoZSBmdWxsIGJhc2UgcGF0aCBvZiB5b3VyIHByb2dyYW0sIGFzIHNlZW4gYnkgdGhlIHVzZXIuIElmIHlvdXIgcHJvZ3JhbSBpcyBsb2NhdGVkIGF0IHNpdGUuY29tL3Byb2dyYW1zL2FwcHMsIHNjcmlwdE5hbWUgPT0gIi9wcm9ncmFtcy9hcHBzIi4KCWltbXV0YWJsZShjaGFyW10pIHNjcmlwdEZpbGVOYW1lOyAgIC8vLyBUaGUgcGh5c2ljYWwgZmlsZW5hbWUgb2YgeW91ciBzY3JpcHQKCWltbXV0YWJsZShjaGFyW10pIGF1dGhvcml6YXRpb247IC8vLyBUaGUgZnVsbCBhdXRob3JpemF0aW9uIHN0cmluZyBmcm9tIHRoZSBoZWFkZXIsIHVuZGlnZXN0ZWQuIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIGF1dGggc2NoZW1lcyBzdWNoIGFzIE9BdXRoIDEuMC4gTm90ZSB0aGF0IHNvbWUgd2ViIHNlcnZlcnMgZG8gbm90IGZvcndhcmQgdGhpcyB0byB0aGUgYXBwIHdpdGhvdXQgdGFraW5nIGV4dHJhIHN0ZXBzLiBTZWUgcmVxdWlyZUJhc2ljQXV0aCdzIGNvbW1lbnQgZm9yIG1vcmUgaW5mby4KCWltbXV0YWJsZShjaGFyW10pIGFjY2VwdDsgCS8vLyBUaGUgSFRUUCBhY2NlcHQgaGVhZGVyIGlzIHRoZSB1c2VyIGFnZW50IHRlbGxpbmcgd2hhdCBjb250ZW50IHR5cGVzIGl0IGlzIHdpbGxpbmcgdG8gYWNjZXB0LiBUaGlzIGlzIG9mdGVuICovKjsgdGhleSBhY2NlcHQgZXZlcnl0aGluZywgc28gaXQncyBub3QgdGVycmlibHkgdXNlZnVsLiAoVGhlIHNpbWlsYXIgc291bmRpbmcgQWNjZXB0LUVuY29kaW5nIGhlYWRlciBpcyBoYW5kbGVkIGF1dG9tYXRpY2FsbHkgZm9yIGNodW5raW5nIGFuZCBnemlwcGluZy4gU2ltcGx5IHNldCBnemlwUmVzcG9uc2UgPSB0cnVlIGFuZCBjZ2kuZCBoYW5kbGVzIHRoZSBkZXRhaWxzLCB6aXBwaW5nIGlmIHRoZSB1c2VyJ3MgYnJvd3NlciBpcyB3aWxsaW5nIHRvIGFjY2VwdCBpdC4KCWltbXV0YWJsZShjaGFyW10pIGxhc3RFdmVudElkOyAJLy8vIFRoZSBIVE1MIDUgZHJhZnQgaW5jbHVkZXMgYW4gRXZlbnRTb3VyY2UoKSBvYmplY3QgdGhhdCBjb25uZWN0cyB0byB0aGUgc2VydmVyLCBhbmQgcmVtYWlucyBvcGVuIHRvIHRha2UgYSBzdHJlYW0gb2YgZXZlbnRzLiBNeSBhcnNkLnJ0dWQgbW9kdWxlIGNhbiBoZWxwIHdpdGggdGhlIHNlcnZlciBzaWRlIHBhcnQgb2YgdGhhdC4gVGhlIExhc3QtRXZlbnQtSWQgaHR0cCBoZWFkZXIgaXMgZGVmaW5lZCBpbiB0aGUgZHJhZnQgdG8gaGVscCBoYW5kbGUgbG9zcyBvZiBjb25uZWN0aW9uLiBXaGVuIHRoZSBicm93c2VyIHJlY29ubmVjdHMgdG8geW91LCBpdCBzZXRzIHRoaXMgaGVhZGVyIHRvIHRoZSBsYXN0IGV2ZW50IGlkIGl0IHNhdywgc28geW91IGNhbiBjYXRjaCBpdCB1cC4gVGhpcyBtZW1iZXIgaGFzIHRoZSBjb250ZW50cyBvZiB0aGF0IGhlYWRlci4KCglpbW11dGFibGUoUmVxdWVzdE1ldGhvZCkgcmVxdWVzdE1ldGhvZDsgLy8vIFRoZSBIVFRQIHJlcXVlc3QgdmVyYjogR0VULCBQT1NULCBldGMuIEl0IGlzIHJlcHJlc2VudGVkIGFzIGFuIGVudW0gaW4gY2dpLmQgKHdoaWNoLCBsaWtlIG1hbnkgZW51bXMsIHlvdSBjYW4gY29udmVydCBiYWNrIHRvIHN0cmluZyB3aXRoIHN0ZC5jb252LnRvKCkpLiBBIEhUVFAgR0VUIGlzIHN1cHBvc2VkIHRvLCBhY2NvcmRpbmcgdG8gdGhlIHNwZWMsIG5vdCBoYXZlIHNpZGUgZWZmZWN0czsgYSB1c2VyIGNhbiBHRVQgc29tZXRoaW5nIG92ZXIgYW5kIG92ZXIgYWdhaW4gYW5kIGFsd2F5cyBoYXZlIHRoZSBzYW1lIHJlc3VsdC4gT24gYWxsIHJlcXVlc3RzLCB0aGUgZ2V0W10gYW5kIGdldEFycmF5W10gbWVtYmVycyBtYXkgYmUgZmlsbGVkIGluLiBUaGUgcG9zdFtdIGFuZCBwb3N0QXJyYXlbXSBtZW1iZXJzIGFyZSBvbmx5IGZpbGxlZCBpbiBvbiBQT1NUIG1ldGhvZHMuCglpbW11dGFibGUoY2hhcltdKSBxdWVyeVN0cmluZzsgCS8vLyBUaGUgdW5wYXJzZWQgY29udGVudCBvZiB0aGUgcmVxdWVzdCBxdWVyeSBzdHJpbmcgLSB0aGUgc3R1ZmYgYWZ0ZXIgdGhlID8gaW4geW91ciBVUkwuIFNlZSBnZXRbXSBhbmQgZ2V0QXJyYXlbXSBmb3IgYSBwYXJzZSB2aWV3IG9mIGl0LiBTb21ldGltZXMsIHRoZSB1bnBhcnNlZCBzdHJpbmcgaXMgdXNlZnVsIHRob3VnaCBpZiB5b3Ugd2FudCBhIGN1c3RvbSBmb3JtYXQgb2YgZGF0YSB1cCB0aGVyZSAocHJvYmFibHkgbm90IGEgZ29vZCBpZGVhLCB1bmxlc3MgaXQgaXMgcmVhbGx5IHNpbXBsZSwgbGlrZSAiP3VzZXJuYW1lIiBwZXJoYXBzLikKCWltbXV0YWJsZShjaGFyW10pIGNvb2tpZTsgCS8vLyBUaGUgdW5wYXJzZWQgY29udGVudCBvZiB0aGUgQ29va2llOiBoZWFkZXIgaW4gdGhlIHJlcXVlc3QuIFNlZSBhbHNvIHRoZSBjb29raWVzW3N0cmluZ10gbWVtYmVyIGZvciBhIHBhcnNlZCB2aWV3IG9mIHRoZSBkYXRhLgoJLyoqIFRoZSBSZWZlcmVyIGhlYWRlciBmcm9tIHRoZSByZXF1ZXN0LiAoSXQgaXMgbWlzc3BlbGxlZCBpbiB0aGUgSFRUUCBzcGVjLCBhbmQgdGh1cyB0aGUgYWN0dWFsIHJlcXVlc3QgYW5kIGNnaSBzcGVjcyB0b28sIGJ1dCBJIHNwZWxsZWQgdGhlIHdvcmQgY29ycmVjdGx5IGhlcmUgYmVjYXVzZSB0aGF0J3Mgc2FuZS4gVGhlIHNwZWMncyBtaXNzcGVsbGluZyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuKSBJdCBjb250YWlucyB0aGUgc2l0ZSB1cmwgdGhhdCByZWZlcnJlZCB0aGUgdXNlciB0byB5b3VyIHByb2dyYW07IHRoZSBzaXRlIHRoYXQgbGlua2VkIHRvIHlvdSwgb3IgaWYgeW91J3JlIHNlcnZpbmcgaW1hZ2VzLCB0aGUgc2l0ZSB0aGF0IGhhcyB5b3UgYXMgYW4gaW1hZ2UuIEFsc28sIGlmIHlvdSdyZSBpbiBhbiBpZnJhbWUsIHRoZSByZWZlcnJlciBpcyB0aGUgc2l0ZSB0aGF0IGlzIGZyYW1pbmcgeW91LgoKCUltcG9ydGFudCBub3RlOiBpZiB0aGUgdXNlciBjb3B5L3Bhc3RlcyB5b3VyIHVybCwgdGhpcyBpcyBibGFuaywgYW5kLCBqdXN0IGxpa2Ugd2l0aCBhbGwgb3RoZXIgdXNlciBkYXRhLCB0aGVpciBicm93c2VycyBjYW4gYWxzbyBsaWUgdG8geW91LiBEb24ndCByZWx5IG9uIGl0IGZvciByZWFsIHNlY3VyaXR5LgoJKi8KCWltbXV0YWJsZShjaGFyW10pIHJlZmVycmVyOwoJaW1tdXRhYmxlKGNoYXJbXSkgcmVxdWVzdFVyaTsgCS8vLyBUaGUgZnVsbCB1cmwgaWYgdGhlIGN1cnJlbnQgcmVxdWVzdCwgZXhjbHVkaW5nIHRoZSBwcm90b2NvbCBhbmQgaG9zdC4gcmVxdWVzdFVyaSA9PSBzY3JpcHROYW1lIH4gcGF0aEluZm8gfiAocXVlcnlTdHJpbmcubGVuZ3RoID8gIj8iIH4gcXVlcnlTdHJpbmcgOiAiIik7CgoJaW1tdXRhYmxlKGNoYXJbXSkgcmVtb3RlQWRkcmVzczsgLy8vIFRoZSBJUCBhZGRyZXNzIG9mIHRoZSB1c2VyLCBhcyB3ZSBzZWUgaXQuIChNaWdodCBub3QgbWF0Y2ggdGhlIElQIG9mIHRoZSB1c2VyJ3MgY29tcHV0ZXIgZHVlIHRvIHRoaW5ncyBsaWtlIHByb3hpZXMgYW5kIE5BVC4pIAoKCWltbXV0YWJsZSBib29sIGh0dHBzOyAJLy8vIFdhcyB0aGUgcmVxdWVzdCBlbmNyeXB0ZWQgdmlhIGh0dHBzPwoJaW1tdXRhYmxlIGludCBwb3J0OyAJLy8vIE9uIHdoYXQgVENQIHBvcnQgbnVtYmVyIGRpZCB0aGUgc2VydmVyIHJlY2VpdmUgdGhlIHJlcXVlc3Q/CgoJLyoqIEhlcmUgY29tZSB0aGUgcGFyc2VkIHJlcXVlc3QgdmFyaWFibGVzIC0gdGhlIHRoaW5ncyB0aGF0IGNvbWUgY2xvc2UgdG8gUEhQJ3MgX0dFVCwgX1BPU1QsIGV0Yy4gc3VwZXJnbG9iYWxzIGluIGNvbnRlbnQuICovCgoJaW1tdXRhYmxlKHN0cmluZ1tzdHJpbmddKSBnZXQ7IAkvLy8gVGhlIGRhdGEgZnJvbSB5b3VyIHF1ZXJ5IHN0cmluZyBpbiB0aGUgdXJsLCBvbmx5IHNob3dpbmcgdGhlIGxhc3Qgc3RyaW5nIG9mIGVhY2ggbmFtZS4gSWYgeW91IHdhbnQgdG8gaGFuZGxlIG11bHRpcGxlIHZhbHVlcyB3aXRoIHRoZSBzYW1lIG5hbWUsIHVzZSBnZXRBcnJheS4gVGhpcyBvbmx5IHdvcmtzIHJpZ2h0IGlmIHRoZSBxdWVyeSBzdHJpbmcgaXMgeC13d3ctZm9ybS11cmxlbmNvZGVkOyB0aGUgZGVmYXVsdCB5b3Ugc2VlIG9uIHRoZSB3ZWIgd2l0aCBuYW1lPXZhbHVlIHBhaXJzIHNlcGFyYXRlZCBieSB0aGUgJiBjaGFyYWN0ZXIuCglpbW11dGFibGUoc3RyaW5nW3N0cmluZ10pIHBvc3Q7IC8vLyBUaGUgZGF0YSBmcm9tIHRoZSByZXF1ZXN0J3MgYm9keSwgb24gUE9TVCByZXF1ZXN0cy4gSXQgcGFyc2VzIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBkYXRhICh1c2VkIGJ5IG1vc3Qgd2ViIHJlcXVlc3RzLCBpbmNsdWRpbmcgdHlwaWNhbCBmb3JtcyksIGFuZCBtdWx0aXBhcnQvZm9ybS1kYXRhIHJlcXVlc3RzICh1c2VkIGJ5IGZpbGUgdXBsb2FkcyBvbiB3ZWIgZm9ybXMpIGludG8gdGhlIHNhbWUgY29udGFpbmVyLCBzbyB5b3UgY2FuIGFsd2F5cyBhY2Nlc3MgdGhlbSB0aGUgc2FtZSB3YXkuIEl0IG1ha2VzIG5vIGF0dGVtcHQgdG8gcGFyc2Ugb3RoZXIgY29udGVudCB0eXBlcy4gSWYgeW91IHdhbnQgdG8gYWNjZXB0IGFuIFhNTCBQb3N0IGJvZHkgKGZvciBhIHdlYiBhcGkgcGVyaGFwcyksIHlvdSdsbCBuZWVkIHRvIGhhbmRsZSB0aGUgcmF3IGRhdGEgeW91cnNlbGYuCglpbW11dGFibGUoc3RyaW5nW3N0cmluZ10pIGNvb2tpZXM7IC8vLyBTZXBhcmF0ZXMgb3V0IHRoZSBjb29raWUgaGVhZGVyIGludG8gaW5kaXZpZHVhbCBuYW1lL3ZhbHVlIHBhaXJzICh3aGljaCBpcyBob3cgeW91IHNldCB0aGVtISkKCgkvKioKCQlSZXByZXNlbnRzIHVzZXIgdXBsb2FkZWQgZmlsZXMuCgkJCgkJV2hlbiBtYWtpbmcgYSBmaWxlIHVwbG9hZCBmb3JtLCBiZSBzdXJlIHRvIGZvbGxvdyB0aGUgc3RhbmRhcmQ6IHNldCBtZXRob2Q9IlBPU1QiIGFuZCBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBpbiB5b3VyIGh0bWwgPGZvcm0+IHRhZyBhdHRyaWJ1dGVzLiBUaGUga2V5IGludG8gdGhpcyBhcnJheSBpcyB0aGUgbmFtZSBhdHRyaWJ1dGUgb24geW91ciBpbnB1dCB0YWcsIGp1c3QgbGlrZSB3aXRoIG90aGVyIHBvc3QgdmFyaWFibGVzLiBTZWUgdGhlIGNvbW1lbnRzIG9uIHRoZSBVcGxvYWRlZEZpbGUgc3RydWN0IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRhIGluc2lkZSwgaW5jbHVkaW5nIGltcG9ydGFudCBub3RlcyBvbiBtYXggc2l6ZSBhbmQgY29udGVudCBsb2NhdGlvbi4KCSovCglpbW11dGFibGUoVXBsb2FkZWRGaWxlW11bc3RyaW5nXSkgZmlsZXNBcnJheTsKCWltbXV0YWJsZShVcGxvYWRlZEZpbGVbc3RyaW5nXSkgZmlsZXM7CgoJLy8vIFVzZSB0aGVzZSBpZiB5b3UgZXhwZWN0IG11bHRpcGxlIGl0ZW1zIHN1Ym1pdHRlZCB3aXRoIHRoZSBzYW1lIG5hbWUuIGJ0dywgYXNzZXJ0KGdldFtuYW1lXSBpcyBnZXRBcnJheVtuYW1lXVskLTEpOyBzaG91bGQgcGFzcy4gU2FtZSBmb3IgcG9zdCBhbmQgY29va2llcy4KCS8vLyB0aGUgb3JkZXIgb2YgdGhlIGFycmF5cyBpcyB0aGUgb3JkZXIgdGhlIGRhdGEgYXJyaXZlcwoJaW1tdXRhYmxlKHN0cmluZ1tdW3N0cmluZ10pIGdldEFycmF5OyAvLy8gbGlrZSBnZXQsIGJ1dCBhbiBhcnJheSBvZiB2YWx1ZXMgcGVyIG5hbWUKCWltbXV0YWJsZShzdHJpbmdbXVtzdHJpbmddKSBwb3N0QXJyYXk7IC8vLyBkaXR0byBmb3IgcG9zdAoJaW1tdXRhYmxlKHN0cmluZ1tdW3N0cmluZ10pIGNvb2tpZXNBcnJheTsgLy8vIGRpdHRvIGZvciBjb29raWVzCgoJLy8gY29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGFwcGVuZGluZyB0byBhIHVyaSB3aXRob3V0IGV4dHJhID8KCS8vIG1hdGNoZXMgdGhlIG5hbWUgYW5kIGVmZmVjdCBvZiBqYXZhc2NyaXB0J3MgbG9jYXRpb24uc2VhcmNoIHByb3BlcnR5CglzdHJpbmcgc2VhcmNoKCkgY29uc3QgewoJCWlmKHF1ZXJ5U3RyaW5nLmxlbmd0aCkKCQkJcmV0dXJuICI/IiB+IHF1ZXJ5U3RyaW5nOwoJCXJldHVybiAiIjsKCX0KCgkvLyBGSVhNRTogd2hhdCBhYm91dCBtdWx0aXBsZSBmaWxlcyB3aXRoIHRoZSBzYW1lIG5hbWU/CiAgcHJpdmF0ZToKCS8vUmVxdWVzdE1ldGhvZCBfcmVxdWVzdE1ldGhvZDsKfQoKLy8vIHVzZSB0aGlzIGZvciB0ZXN0aW5nIG9yIG90aGVyIGlzb2xhdGVkIHRoaW5ncwpDZ2kgZHVtbXlDZ2koQ2dpLlJlcXVlc3RNZXRob2QgbWV0aG9kID0gQ2dpLlJlcXVlc3RNZXRob2QuR0VULCBzdHJpbmcgdXJsID0gbnVsbCwgaW4gdWJ5dGVbXSBkYXRhID0gbnVsbCwgdm9pZCBkZWxlZ2F0ZShjb25zdCh1Ynl0ZSlbXSkgb3V0cHV0U2luayA9IG51bGwpIHsKCS8vIHdlIHdhbnQgdG8gaWdub3JlLCBub3QgdXNlIHN0ZG91dAoJaWYob3V0cHV0U2luayBpcyBudWxsKQoJCW91dHB1dFNpbmsgPSBkZWxlZ2F0ZSB2b2lkKGNvbnN0KHVieXRlKVtdKSB7IH07CgoJc3RyaW5nW3N0cmluZ10gZW52OwoJZW52WyJSRVFVRVNUX01FVEhPRCJdID0gdG8hc3RyaW5nKG1ldGhvZCk7CgllbnZbIkNPTlRFTlRfTEVOR1RIIl0gPSB0byFzdHJpbmcoZGF0YS5sZW5ndGgpOwoKCWF1dG8gY2dpID0gbmV3IENnaSgKCQkwLAoJCWVudiwKCQl7IHJldHVybiBkYXRhOyB9LAoJCW91dHB1dFNpbmssCgkJbnVsbCk7CgoJcmV0dXJuIGNnaTsKfQoKCi8vIHNob3VsZCB0aGlzIGJlIGEgc2VwYXJhdGUgbW9kdWxlPyBQcm9iYWJseSwgYnV0IHRoYXQncyBhIGhhc3NsZS4KCi8vLyBNYWtlcyBhIGRhdGE6Ly8gdXJpIHRoYXQgY2FuIGJlIHVzZWQgYXMgbGlua3MgaW4gbW9zdCBuZXdlciBicm93c2VycyAoSUU4KykuCnN0cmluZyBtYWtlRGF0YVVybChzdHJpbmcgbWltZVR5cGUsIGluIHZvaWRbXSBkYXRhKSB7CglhdXRvIGRhdGE2NCA9IEJhc2U2NC5lbmNvZGUoY2FzdChjb25zdCh1Ynl0ZVtdKSkgZGF0YSk7CglyZXR1cm4gImRhdGE6IiB+IG1pbWVUeXBlIH4gIjtiYXNlNjQsIiB+IGFzc3VtZVVuaXF1ZShkYXRhNjQpOwp9CgovLyBGSVhNRTogSSBkb24ndCB0aGluayB0aGlzIGNsYXNzIGNvcnJlY3RseSBkZWNvZGVzL2VuY29kZXMgdGhlIGluZGl2aWR1YWwgcGFydHMKLy8vIFJlcHJlc2VudHMgYSB1cmwgdGhhdCBjYW4gYmUgYnJva2VuIGRvd24gb3IgYnVpbHQgdXAgdGhyb3VnaCBwcm9wZXJ0aWVzCnN0cnVjdCBVcmkgewoJYWxpYXMgdG9TdHJpbmcgdGhpczsgLy8gYmxhcmdoIGlkayBhIHVybCByZWFsbHkgaXMgYSBzdHJpbmcsIGJ1dCBzaG91bGQgaXQgYmUgaW1wbGljaXQ/CgoJLy8gc2NoZW1lLy91c2VyaW5mb0Bob3N0OnBvcnQvcGF0aD9xdWVyeSNmcmFnbWVudAoKCXN0cmluZyBzY2hlbWU7IC8vLyBlLmcuICJodHRwIiBpbiAiaHR0cDovL2V4YW1wbGUuY29tLyIKCXN0cmluZyB1c2VyaW5mbzsgLy8vIHRoZSB1c2VybmFtZSAoYW5kIHBvc3NpYmx5IGEgcGFzc3dvcmQpIGluIHRoZSB1cmkKCXN0cmluZyBob3N0OyAvLy8gdGhlIGRvbWFpbiBuYW1lCglpbnQgcG9ydDsgLy8vIHBvcnQgbnVtYmVyLCBpZiBnaXZlbi4gV2lsbCBiZSB6ZXJvIGlmIGEgcG9ydCB3YXMgbm90IGV4cGxpY2l0bHkgZ2l2ZW4KCXN0cmluZyBwYXRoOyAvLy8gZS5nLiAiL2ZvbGRlci9maWxlLmh0bWwiIGluICJodHRwOi8vZXhhbXBsZS5jb20vZm9sZGVyL2ZpbGUuaHRtbCIKCXN0cmluZyBxdWVyeTsgLy8vIHRoZSBzdHVmZiBhZnRlciB0aGUgPyBpbiBhIHVyaQoJc3RyaW5nIGZyYWdtZW50OyAvLy8gdGhlIHN0dWZmIGFmdGVyIHRoZSAjIGluIGEgdXJpLgoKCS8vIGlkayBpZiBpIHdhbnQgdG8ga2VlcCB0aGVzZSwgc2luY2UgdGhlIGZ1bmN0aW9ucyB0aGV5IHdyYXAgYXJlIHVzZWQgbWFueSwgbWFueSwgbWFueSB0aW1lcyBpbiBleGlzdGluZyBjb2RlLCBzbyB0aGlzIGlzIGVpdGhlciBhbiB1bm5lY2Vzc2FyeSBhbGlhcyBvciBhIGdyYXR1aXRvdXMgYnJlYWsgb2YgY29tcGF0aWJpbGl0eQoJLy8gdGhlIGRlY29kZSBvbmVzIG5lZWQgdG8ga2VlcCBkaWZmZXJlbnQgbmFtZXMgYW55d2F5IGJlY2F1c2Ugd2UgY2FuJ3Qgb3ZlcmxvYWQgb24gcmV0dXJuIHZhbHVlcy4uLgoJc3RhdGljIHN0cmluZyBlbmNvZGUoc3RyaW5nIHMpIHsgcmV0dXJuIHN0ZC51cmkuZW5jb2RlQ29tcG9uZW50KHMpOyB9CglzdGF0aWMgc3RyaW5nIGVuY29kZShzdHJpbmdbc3RyaW5nXSBzKSB7IHJldHVybiBlbmNvZGVWYXJpYWJsZXMocyk7IH0KCXN0YXRpYyBzdHJpbmcgZW5jb2RlKHN0cmluZ1tdW3N0cmluZ10gcykgeyByZXR1cm4gZW5jb2RlVmFyaWFibGVzKHMpOyB9CgoJLy8vIEJyZWFrcyBkb3duIGEgdXJpIHN0cmluZyB0byBpdHMgY29tcG9uZW50cwoJdGhpcyhzdHJpbmcgdXJpKSB7CgkJcmVwYXJzZSh1cmkpOwoJfQoKCXByaXZhdGUgdm9pZCByZXBhcnNlKHN0cmluZyB1cmkpIHsKCQlpbXBvcnQgc3RkLnJlZ2V4OwoJCS8vIGZyb20gUkZDIDM5ODYKCgkJLy8gdGhlIGN0UmVnZXggdHJpcGxlcyB0aGUgY29tcGlsZSB0aW1lIGFuZCBtYWtlcyB1Z2x5IGVycm9ycyBmb3Igbm8gcmVhbCBiZW5lZml0CgkJLy8gaXQgd2FzIGEgbmljZSBleHBlcmltZW50IGJ1dCBqdXN0IG5vdCB3b3J0aCBpdC4KCQkvLyBlbnVtIGN0ciA9IGN0UmVnZXghciJeKChbXjovPyNdKyk6KT8oLy8oW14vPyNdKikpPyhbXj8jXSopKFw/KFteI10qKSk/KCMoLiopKT8iOwoJCWF1dG8gY3RyID0gcmVnZXgociJeKChbXjovPyNdKyk6KT8oLy8oW14vPyNdKikpPyhbXj8jXSopKFw/KFteI10qKSk/KCMoLiopKT8iKTsKCgkJYXV0byBtID0gbWF0Y2godXJpLCBjdHIpOwoJCWlmKG0pIHsKCQkJc2NoZW1lID0gbS5jYXB0dXJlc1syXTsKCQkJYXV0byBhdXRob3JpdHkgPSBtLmNhcHR1cmVzWzRdOwoKCQkJYXV0byBpZHggPSBhdXRob3JpdHkuaW5kZXhPZigiQCIpOwoJCQlpZihpZHggIT0gLTEpIHsKCQkJCXVzZXJpbmZvID0gYXV0aG9yaXR5WzAgLi4gaWR4XTsKCQkJCWF1dGhvcml0eSA9IGF1dGhvcml0eVtpZHggKyAxIC4uICRdOwoJCQl9CgoJCQlpZHggPSBhdXRob3JpdHkuaW5kZXhPZigiOiIpOwoJCQlpZihpZHggPT0gLTEpIHsKCQkJCXBvcnQgPSAwOyAvLyAwIG1lYW5zIG5vdCBzcGVjaWZpZWQ7IHdlIHNob3VsZCB1c2UgdGhlIGRlZmF1bHQgZm9yIHRoZSBzY2hlbWUKCQkJCWhvc3QgPSBhdXRob3JpdHk7CgkJCX0gZWxzZSB7CgkJCQlob3N0ID0gYXV0aG9yaXR5WzAgLi4gaWR4XTsKCQkJCXBvcnQgPSB0byFpbnQoYXV0aG9yaXR5W2lkeCArIDEgLi4gJF0pOwoJCQl9CgoJCQlwYXRoID0gbS5jYXB0dXJlc1s1XTsKCQkJcXVlcnkgPSBtLmNhcHR1cmVzWzddOwoJCQlmcmFnbWVudCA9IG0uY2FwdHVyZXNbOV07CgkJfQoJCS8vIHVyaUludmFsaWRhdGVkID0gZmFsc2U7Cgl9CgoJcHJpdmF0ZSBzdHJpbmcgcmVidWlsZFVyaSgpIGNvbnN0IHsKCQlzdHJpbmcgcmV0OwoJCWlmKHNjaGVtZS5sZW5ndGgpCgkJCXJldCB+PSBzY2hlbWUgfiAiOiI7CgkJaWYodXNlcmluZm8ubGVuZ3RoIHx8IGhvc3QubGVuZ3RoKQoJCQlyZXQgfj0gIi8vIjsKCQlpZih1c2VyaW5mby5sZW5ndGgpCgkJCXJldCB+PSB1c2VyaW5mbyB+ICJAIjsKCQlpZihob3N0Lmxlbmd0aCkKCQkJcmV0IH49IGhvc3Q7CgkJaWYocG9ydCkKCQkJcmV0IH49ICI6IiB+IHRvIXN0cmluZyhwb3J0KTsKCgkJcmV0IH49IHBhdGg7CgoJCWlmKHF1ZXJ5Lmxlbmd0aCkKCQkJcmV0IH49ICI/IiB+IHF1ZXJ5OwoKCQlpZihmcmFnbWVudC5sZW5ndGgpCgkJCXJldCB+PSAiIyIgfiBmcmFnbWVudDsKCgkJLy8gdXJpID0gcmV0OwoJCS8vIHVyaUludmFsaWRhdGVkID0gZmFsc2U7CgkJcmV0dXJuIHJldDsKCX0KCgkvLy8gQ29udmVydHMgdGhlIGJyb2tlbiBkb3duIHBhcnRzIGJhY2sgaW50byBhIGNvbXBsZXRlIHN0cmluZwoJc3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgewoJCS8vIGlmKHVyaUludmFsaWRhdGVkKQoJCQlyZXR1cm4gcmVidWlsZFVyaSgpOwoJfQoKCS8vLyBSZXR1cm5zIGEgbmV3IGFic29sdXRlIFVyaSBnaXZlbiBhIGJhc2UuIEl0IHRyZWF0cyB0aGlzIG9uZSBhcwoJLy8vIHJlbGF0aXZlIHdoZXJlIHBvc3NpYmxlLCBidXQgYWJzb2x1dGUgaWYgbm90LiAoSWYgcHJvdG9jb2wsIGRvbWFpbiwgb3IKCS8vLyBvdGhlciBpbmZvIGlzIG5vdCBzZXQsIHRoZSBuZXcgb25lIGluaGVyaXRzIGl0IGZyb20gdGhlIGJhc2UuKQoJLy8vCgkvLy8gQnJvd3NlcnMgdXNlIGEgZnVuY3Rpb24gbGlrZSB0aGlzIHRvIGZpZ3VyZSBvdXQgbGlua3MgaW4gaHRtbC4KCVVyaSBiYXNlZE9uKGluIFVyaSBiYXNlVXJsKSBjb25zdCB7CgkJVXJpIG4gPSB0aGlzOyAvLyBjb3BpZXMKCQkvLyBuLnVyaUludmFsaWRhdGVkID0gdHJ1ZTsgLy8gbWFrZSBzdXJlIHdlIHJlZ2VuZXJhdGUuLi4KCgkJLy8gdXNlcmluZm8gaXMgbm90IGluaGVyaXRlZC4uLiBpcyB0aGlzIHdyb25nPwoKCQkvLyBpZiBhbnl0aGluZyBpcyBnaXZlbiBpbiB0aGUgZXhpc3RpbmcgdXJsLCB3ZSBkb24ndCB1c2UgdGhlIGJhc2UgYW55bW9yZS4KCQlpZihuLnNjaGVtZS5lbXB0eSkgewoJCQluLnNjaGVtZSA9IGJhc2VVcmwuc2NoZW1lOwoJCQlpZihuLmhvc3QuZW1wdHkpIHsKCQkJCW4uaG9zdCA9IGJhc2VVcmwuaG9zdDsKCQkJCWlmKG4ucG9ydCA9PSAwKSB7CgkJCQkJbi5wb3J0ID0gYmFzZVVybC5wb3J0OwoJCQkJCWlmKG4ucGF0aC5sZW5ndGggPiAwICYmIG4ucGF0aFswXSAhPSAnLycpIHsKCQkJCQkJYXV0byBiID0gYmFzZVVybC5wYXRoWzAgLi4gYmFzZVVybC5wYXRoLmxhc3RJbmRleE9mKCIvIikgKyAxXTsKCQkJCQkJaWYoYi5sZW5ndGggPT0gMCkKCQkJCQkJCWIgPSAiLyI7CgkJCQkJCW4ucGF0aCA9IGIgfiBuLnBhdGg7CgkJCQkJfSBlbHNlIGlmKG4ucGF0aC5sZW5ndGggPT0gMCkgewoJCQkJCQluLnBhdGggPSBiYXNlVXJsLnBhdGg7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gbjsKCX0KCgkvLyBUaGlzIGNhbiBzb21ldGltZXMgYmUgYSBiaWcgcGFpbiBpbiB0aGUgYnV0dCBmb3IgbWUsIHNvIGxvdHMgb2YgY29weS9wYXN0ZSBoZXJlIHRvIGNvdmVyCgkvLyB0aGUgcG9zc2liaWxpdGllcy4KCXVuaXR0ZXN0IHsKCQlhdXRvIHVybCA9IFVyaSgiY29vbC5odG1sIik7IC8vIGNoZWNraW5nIHJlbGF0aXZlIGxpbmtzCgoJCWFzc2VydCh1cmwuYmFzZWRPbihVcmkoImh0dHA6Ly90ZXN0LmNvbS93aGF0L3Rlc3QuaHRtbCIpKSA9PSAiaHR0cDovL3Rlc3QuY29tL3doYXQvY29vbC5odG1sIik7CgkJYXNzZXJ0KHVybC5iYXNlZE9uKFVyaSgiaHR0cHM6Ly90ZXN0LmNvbS93aGF0L3Rlc3QuaHRtbCIpKSA9PSAiaHR0cHM6Ly90ZXN0LmNvbS93aGF0L2Nvb2wuaHRtbCIpOwoJCWFzc2VydCh1cmwuYmFzZWRPbihVcmkoImh0dHA6Ly90ZXN0LmNvbS93aGF0LyIpKSA9PSAiaHR0cDovL3Rlc3QuY29tL3doYXQvY29vbC5odG1sIik7CgkJYXNzZXJ0KHVybC5iYXNlZE9uKFVyaSgiaHR0cDovL3Rlc3QuY29tLyIpKSA9PSAiaHR0cDovL3Rlc3QuY29tL2Nvb2wuaHRtbCIpOwoJCWFzc2VydCh1cmwuYmFzZWRPbihVcmkoImh0dHA6Ly90ZXN0LmNvbSIpKSA9PSAiaHR0cDovL3Rlc3QuY29tL2Nvb2wuaHRtbCIpOwoJCWFzc2VydCh1cmwuYmFzZWRPbihVcmkoImh0dHA6Ly90ZXN0LmNvbS93aGF0L3Rlc3QuaHRtbD9hPWIiKSkgPT0gImh0dHA6Ly90ZXN0LmNvbS93aGF0L2Nvb2wuaHRtbCIpOwoJCWFzc2VydCh1cmwuYmFzZWRPbihVcmkoImh0dHA6Ly90ZXN0LmNvbS93aGF0L3Rlc3QuaHRtbD9hPWImYz1kIikpID09ICJodHRwOi8vdGVzdC5jb20vd2hhdC9jb29sLmh0bWwiKTsKCQlhc3NlcnQodXJsLmJhc2VkT24oVXJpKCJodHRwOi8vdGVzdC5jb20vd2hhdC90ZXN0Lmh0bWw/YT1iJmM9ZCN3aGF0IikpID09ICJodHRwOi8vdGVzdC5jb20vd2hhdC9jb29sLmh0bWwiKTsKCQlhc3NlcnQodXJsLmJhc2VkT24oVXJpKCJodHRwOi8vdGVzdC5jb20iKSkgPT0gImh0dHA6Ly90ZXN0LmNvbS9jb29sLmh0bWwiKTsKCgkJdXJsID0gVXJpKCIvc29tZXRoaW5nL2Nvb2wuaHRtbCIpOyAvLyBzYW1lIHNlcnZlciwgZGlmZmVyZW50IHBhdGgKCQlhc3NlcnQodXJsLmJhc2VkT24oVXJpKCJodHRwOi8vdGVzdC5jb20vd2hhdC90ZXN0Lmh0bWwiKSkgPT0gImh0dHA6Ly90ZXN0LmNvbS9zb21ldGhpbmcvY29vbC5odG1sIik7CgkJYXNzZXJ0KHVybC5iYXNlZE9uKFVyaSgiaHR0cHM6Ly90ZXN0LmNvbS93aGF0L3Rlc3QuaHRtbCIpKSA9PSAiaHR0cHM6Ly90ZXN0LmNvbS9zb21ldGhpbmcvY29vbC5odG1sIik7CgkJYXNzZXJ0KHVybC5iYXNlZE9uKFVyaSgiaHR0cDovL3Rlc3QuY29tL3doYXQvIikpID09ICJodHRwOi8vdGVzdC5jb20vc29tZXRoaW5nL2Nvb2wuaHRtbCIpOwoJCWFzc2VydCh1cmwuYmFzZWRPbihVcmkoImh0dHA6Ly90ZXN0LmNvbS8iKSkgPT0gImh0dHA6Ly90ZXN0LmNvbS9zb21ldGhpbmcvY29vbC5odG1sIik7CgkJYXNzZXJ0KHVybC5iYXNlZE9uKFVyaSgiaHR0cDovL3Rlc3QuY29tIikpID09ICJodHRwOi8vdGVzdC5jb20vc29tZXRoaW5nL2Nvb2wuaHRtbCIpOwoJCWFzc2VydCh1cmwuYmFzZWRPbihVcmkoImh0dHA6Ly90ZXN0LmNvbS93aGF0L3Rlc3QuaHRtbD9hPWIiKSkgPT0gImh0dHA6Ly90ZXN0LmNvbS9zb21ldGhpbmcvY29vbC5odG1sIik7CgkJYXNzZXJ0KHVybC5iYXNlZE9uKFVyaSgiaHR0cDovL3Rlc3QuY29tL3doYXQvdGVzdC5odG1sP2E9YiZjPWQiKSkgPT0gImh0dHA6Ly90ZXN0LmNvbS9zb21ldGhpbmcvY29vbC5odG1sIik7CgkJYXNzZXJ0KHVybC5iYXNlZE9uKFVyaSgiaHR0cDovL3Rlc3QuY29tL3doYXQvdGVzdC5odG1sP2E9YiZjPWQjd2hhdCIpKSA9PSAiaHR0cDovL3Rlc3QuY29tL3NvbWV0aGluZy9jb29sLmh0bWwiKTsKCQlhc3NlcnQodXJsLmJhc2VkT24oVXJpKCJodHRwOi8vdGVzdC5jb20iKSkgPT0gImh0dHA6Ly90ZXN0LmNvbS9zb21ldGhpbmcvY29vbC5odG1sIik7CgoJCXVybCA9IFVyaSgiP3F1ZXJ5PWFuc3dlciIpOyAvLyBzYW1lIHBhdGguIHNlcnZlciwgcHJvdG9jb2wsIGFuZCBwb3J0LCBqdXN0IGRpZmZlcmVudCBxdWVyeSBzdHJpbmcgYW5kIGZyYWdtZW50CgkJYXNzZXJ0KHVybC5iYXNlZE9uKFVyaSgiaHR0cDovL3Rlc3QuY29tL3doYXQvdGVzdC5odG1sIikpID09ICJodHRwOi8vdGVzdC5jb20vd2hhdC90ZXN0Lmh0bWw/cXVlcnk9YW5zd2VyIik7CgkJYXNzZXJ0KHVybC5iYXNlZE9uKFVyaSgiaHR0cHM6Ly90ZXN0LmNvbS93aGF0L3Rlc3QuaHRtbCIpKSA9PSAiaHR0cHM6Ly90ZXN0LmNvbS93aGF0L3Rlc3QuaHRtbD9xdWVyeT1hbnN3ZXIiKTsKCQlhc3NlcnQodXJsLmJhc2VkT24oVXJpKCJodHRwOi8vdGVzdC5jb20vd2hhdC8iKSkgPT0gImh0dHA6Ly90ZXN0LmNvbS93aGF0Lz9xdWVyeT1hbnN3ZXIiKTsKCQlhc3NlcnQodXJsLmJhc2VkT24oVXJpKCJodHRwOi8vdGVzdC5jb20vIikpID09ICJodHRwOi8vdGVzdC5jb20vP3F1ZXJ5PWFuc3dlciIpOwoJCWFzc2VydCh1cmwuYmFzZWRPbihVcmkoImh0dHA6Ly90ZXN0LmNvbSIpKSA9PSAiaHR0cDovL3Rlc3QuY29tP3F1ZXJ5PWFuc3dlciIpOwoJCWFzc2VydCh1cmwuYmFzZWRPbihVcmkoImh0dHA6Ly90ZXN0LmNvbS93aGF0L3Rlc3QuaHRtbD9hPWIiKSkgPT0gImh0dHA6Ly90ZXN0LmNvbS93aGF0L3Rlc3QuaHRtbD9xdWVyeT1hbnN3ZXIiKTsKCQlhc3NlcnQodXJsLmJhc2VkT24oVXJpKCJodHRwOi8vdGVzdC5jb20vd2hhdC90ZXN0Lmh0bWw/YT1iJmM9ZCIpKSA9PSAiaHR0cDovL3Rlc3QuY29tL3doYXQvdGVzdC5odG1sP3F1ZXJ5PWFuc3dlciIpOwoJCWFzc2VydCh1cmwuYmFzZWRPbihVcmkoImh0dHA6Ly90ZXN0LmNvbS93aGF0L3Rlc3QuaHRtbD9hPWImYz1kI3doYXQiKSkgPT0gImh0dHA6Ly90ZXN0LmNvbS93aGF0L3Rlc3QuaHRtbD9xdWVyeT1hbnN3ZXIiKTsKCQlhc3NlcnQodXJsLmJhc2VkT24oVXJpKCJodHRwOi8vdGVzdC5jb20iKSkgPT0gImh0dHA6Ly90ZXN0LmNvbT9xdWVyeT1hbnN3ZXIiKTsKCgkJdXJsID0gVXJpKCIjYW5jaG9yIik7IC8vIGV2ZXJ5dGhpbmcgc2hvdWxkIHJlbWFpbiB0aGUgc2FtZSBleGNlcHQgdGhlIGFuY2hvcgoKCQl1cmwgPSBVcmkoIi8vZXhhbXBsZS5jb20iKTsgLy8gc2FtZSBwcm90b2NvbCwgYnV0IGRpZmZlcmVudCBzZXJ2ZXIuIHRoZSBwYXRoIGhlcmUgc2hvdWxkIGJlIGJsYW5rLgoKCQl1cmwgPSBVcmkoIi8vZXhhbXBsZS5jb20vZXhhbXBsZS5odG1sIik7IC8vIHNhbWUgcHJvdG9jb2wsIGJ1dCBkaWZmZXJlbnQgc2VydmVyIGFuZCBwYXRoCgoJCXVybCA9IFVyaSgiaHR0cDovL2V4YW1wbGUuY29tL3Rlc3QuaHRtbCIpOyAvLyBjb21wbGV0ZWx5IGFic29sdXRlIGxpbmsgc2hvdWxkIG5ldmVyIGJlIG1vZGlmaWVkCgoJCXVybCA9IFVyaSgiaHR0cDovL2V4YW1wbGUuY29tIik7IC8vIGNvbXBsZXRlbHkgYWJzb2x1dGUgbGluayBzaG91bGQgbmV2ZXIgYmUgbW9kaWZpZWQsIGV2ZW4gaWYgaXQgaGFzIG5vIHBhdGgKCgkJLy8gRklYTUU6IGFkZCBzb21ldGhpbmcgZm9yIHBvcnQgdG9vCgl9CgoJLy8gdGhlc2UgYXJlIGxpa2UgamF2YXNjcmlwdCdzIGxvY2F0aW9uLnNlYXJjaCBhbmQgbG9jYXRpb24uaGFzaAoJc3RyaW5nIHNlYXJjaCgpIGNvbnN0IHsKCQlyZXR1cm4gcXVlcnkubGVuZ3RoID8gKCI/IiB+IHF1ZXJ5KSA6ICIiOwoJfQoJc3RyaW5nIGhhc2goKSBjb25zdCB7CgkJcmV0dXJuIGZyYWdtZW50Lmxlbmd0aCA/ICgiIyIgfiBmcmFnbWVudCkgOiAiIjsKCX0KfQoKCi8qCglmb3Igc2Vzc2lvbiwgc2VlIHdlYi5kCiovCgovLy8gYnJlYWtzIGRvd24gYSB1cmwgZW5jb2RlZCBzdHJpbmcKc3RyaW5nW11bc3RyaW5nXSBkZWNvZGVWYXJpYWJsZXMoc3RyaW5nIGRhdGEsIHN0cmluZyBzZXBhcmF0b3IgPSAiJiIpIHsKCWF1dG8gdmFycyA9IGRhdGEuc3BsaXQoc2VwYXJhdG9yKTsKCXN0cmluZ1tdW3N0cmluZ10gX2dldDsKCWZvcmVhY2godmFyOyB2YXJzKSB7CgkJYXV0byBlcXVhbCA9IHZhci5pbmRleE9mKCI9Iik7CgkJaWYoZXF1YWwgPT0gLTEpIHsKCQkJX2dldFtkZWNvZGVDb21wb25lbnQodmFyKV0gfj0gIiI7CgkJfSBlbHNlIHsKCQkJLy9fZ2V0W2RlY29kZUNvbXBvbmVudCh2YXJbMC4uZXF1YWxdKV0gfj0gZGVjb2RlQ29tcG9uZW50KHZhcltlcXVhbCArIDEgLi4gJF0ucmVwbGFjZSgiKyIsICIgIikpOwoJCQkvLyBzdHVwaWQgKyAtPiBzcGFjZSBjb252ZXJzaW9uLgoJCQlfZ2V0W2RlY29kZUNvbXBvbmVudCh2YXJbMC4uZXF1YWxdLnJlcGxhY2UoIisiLCAiICIpKV0gfj0gZGVjb2RlQ29tcG9uZW50KHZhcltlcXVhbCArIDEgLi4gJF0ucmVwbGFjZSgiKyIsICIgIikpOwoJCX0KCX0KCXJldHVybiBfZ2V0Owp9CgovLy8gYnJlYWtzIGRvd24gYSB1cmwgZW5jb2RlZCBzdHJpbmcsIGJ1dCBvbmx5IHJldHVybnMgdGhlIGxhc3QgdmFsdWUgb2YgYW55IGFycmF5CnN0cmluZ1tzdHJpbmddIGRlY29kZVZhcmlhYmxlc1NpbmdsZShzdHJpbmcgZGF0YSkgewoJc3RyaW5nW3N0cmluZ10gdmE7CglhdXRvIHZhckFycmF5ID0gZGVjb2RlVmFyaWFibGVzKGRhdGEpOwoJZm9yZWFjaChrLCB2OyB2YXJBcnJheSkKCQl2YVtrXSA9IHZbJC0xXTsKCglyZXR1cm4gdmE7Cn0KCi8vLyB1cmwgZW5jb2RlcyB0aGUgd2hvbGUgc3RyaW5nCnN0cmluZyBlbmNvZGVWYXJpYWJsZXMoaW4gc3RyaW5nW3N0cmluZ10gZGF0YSkgewoJc3RyaW5nIHJldDsKCglib29sIG91dHB1dHRlZCA9IGZhbHNlOwoJZm9yZWFjaChrLCB2OyBkYXRhKSB7CgkJaWYob3V0cHV0dGVkKQoJCQlyZXQgfj0gIiYiOwoJCWVsc2UKCQkJb3V0cHV0dGVkID0gdHJ1ZTsKCgkJcmV0IH49IHN0ZC51cmkuZW5jb2RlQ29tcG9uZW50KGspIH4gIj0iIH4gc3RkLnVyaS5lbmNvZGVDb21wb25lbnQodik7Cgl9CgoJcmV0dXJuIHJldDsKfQoKLy8vIHVybCBlbmNvZGVzIGEgd2hvbGUgc3RyaW5nCnN0cmluZyBlbmNvZGVWYXJpYWJsZXMoaW4gc3RyaW5nW11bc3RyaW5nXSBkYXRhKSB7CglzdHJpbmcgcmV0OwoKCWJvb2wgb3V0cHV0dGVkID0gZmFsc2U7Cglmb3JlYWNoKGssIGFycjsgZGF0YSkgewoJCWZvcmVhY2godjsgYXJyKSB7CgkJCWlmKG91dHB1dHRlZCkKCQkJCXJldCB+PSAiJiI7CgkJCWVsc2UKCQkJCW91dHB1dHRlZCA9IHRydWU7CgkJCXJldCB+PSBzdGQudXJpLmVuY29kZUNvbXBvbmVudChrKSB+ICI9IiB+IHN0ZC51cmkuZW5jb2RlQ29tcG9uZW50KHYpOwoJCX0KCX0KCglyZXR1cm4gcmV0Owp9CgovLy8gRW5jb2RlcyBhbGwgYnV0IHRoZSBleHBsaWNpdGx5IHVucmVzZXJ2ZWQgY2hhcmFjdGVycyBwZXIgcmZjIDM5ODYKLy8vIEFscGhhbnVtZXJpYyBhbmQgLV8ufiBhcmUgdGhlIG9ubHkgb25lcyBsZWZ0IHVuZW5jb2RlZAovLy8gbmFtZSBpcyBib3Jyb3dlZCBmcm9tIHBocApzdHJpbmcgcmF3dXJsZW5jb2RlKGluIGNoYXJbXSBkYXRhKSB7CglzdHJpbmcgcmV0OwoJcmV0LnJlc2VydmUoZGF0YS5sZW5ndGggKiAyKTsKCWZvcmVhY2goY2hhciBjOyBkYXRhKSB7CgkJaWYoCgkJCShjID49ICdhJyAmJiBjIDw9ICd6JykgfHwKCQkJKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB8fAoJCQkoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8CgkJCWMgPT0gJy0nIHx8IGMgPT0gJ18nIHx8IGMgPT0gJy4nIHx8IGMgPT0gJ34nKQoJCXsKCQkJcmV0IH49IGM7CgkJfSBlbHNlIHsKCQkJcmV0IH49ICclJzsKCQkJLy8gc2luY2Ugd2UgaXRlcmF0ZSBvbiBjaGFyLCB0aGlzIHNob3VsZCBnaXZlIHVzIHRoZSBvY3RldHMgb2YgdGhlIGZ1bGwgdXRmOCBzdHJpbmcKCQkJcmV0IH49IHRvSGV4VXBwZXIoYyk7CgkJfQoJfQoKCXJldHVybiByZXQ7Cn0KCgovLyBodHRwIGhlbHBlciBmdW5jdGlvbnMKCi8vIGZvciBjaHVua2VkIHJlc3BvbnNlcyAod2hpY2ggZW1iZWRkZWQgaHR0cCBkb2VzIHdoZW5ldmVyIHBvc3NpYmxlKQp2ZXJzaW9uKG5vbmUpIC8vIHRoaXMgaXMgbW92ZWQgdXAgYWJvdmUgdG8gYXZvaWQgbWFraW5nIGEgY29weSBvZiB0aGUgZGF0YQpjb25zdCh1Ynl0ZSlbXSBtYWtlQ2h1bmsoY29uc3QodWJ5dGUpW10gZGF0YSkgewoJY29uc3QodWJ5dGUpW10gcmV0OwoKCXJldCA9IGNhc3QoY29uc3QodWJ5dGUpW10pIHRvSGV4KGRhdGEubGVuZ3RoKTsKCXJldCB+PSBjYXN0KGNvbnN0KHVieXRlKVtdKSAiXHJcbiI7CglyZXQgfj0gZGF0YTsKCXJldCB+PSBjYXN0KGNvbnN0KHVieXRlKVtdKSAiXHJcbiI7CgoJcmV0dXJuIHJldDsKfQoKc3RyaW5nIHRvSGV4KGxvbmcgbnVtKSB7CglzdHJpbmcgcmV0OwoJd2hpbGUobnVtKSB7CgkJaW50IHYgPSBudW0gJSAxNjsKCQludW0gLz0gMTY7CgkJY2hhciBkID0gY2FzdChjaGFyKSAoKHYgPCAxMCkgPyB2ICsgJzAnIDogKHYtMTApICsgJ2EnKTsKCQlyZXQgfj0gZDsKCX0KCglyZXR1cm4gdG8hc3RyaW5nKGFycmF5KHJldC5yZXRybykpOwp9CgpzdHJpbmcgdG9IZXhVcHBlcihsb25nIG51bSkgewoJc3RyaW5nIHJldDsKCXdoaWxlKG51bSkgewoJCWludCB2ID0gbnVtICUgMTY7CgkJbnVtIC89IDE2OwoJCWNoYXIgZCA9IGNhc3QoY2hhcikgKCh2IDwgMTApID8gdiArICcwJyA6ICh2LTEwKSArICdBJyk7CgkJcmV0IH49IGQ7Cgl9CgoJaWYocmV0Lmxlbmd0aCA9PSAxKQoJCXJldCB+PSAiMCI7IC8vIHVybCBlbmNvZGluZyByZXF1aXJlcyB0d28gZGlnaXRzIGFuZCB0aGF0J3Mgd2hhdCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yLi4uCgoJcmV0dXJuIHRvIXN0cmluZyhhcnJheShyZXQucmV0cm8pKTsKfQoKCi8vIHRoZSBnZW5lcmljIG1peGlucwoKLy8vIFVzZSB0aGlzIGluc3RlYWQgb2Ygd3JpdGluZyB5b3VyIG93biBtYWluCm1peGluIHRlbXBsYXRlIEdlbmVyaWNNYWluKGFsaWFzIGZ1biwgbG9uZyBtYXhDb250ZW50TGVuZ3RoID0gZGVmYXVsdE1heENvbnRlbnRMZW5ndGgpIHsKCW1peGluIEN1c3RvbUNnaU1haW4hKENnaSwgZnVuLCBtYXhDb250ZW50TGVuZ3RoKTsKfQoKcHJpdmF0ZSBzdHJpbmcgc2ltcGxlSHRtbEVuY29kZShzdHJpbmcgcykgewoJcmV0dXJuIHMucmVwbGFjZSgiJiIsICImYW1wOyIpLnJlcGxhY2UoIjwiLCAiJmx0OyIpLnJlcGxhY2UoIj4iLCAiJmd0OyIpLnJlcGxhY2UoIlxuIiwgIjxiciAvPlxuIik7Cn0KCnN0cmluZyBtZXNzYWdlRnJvbUV4Y2VwdGlvbihUaHJvd2FibGUgdCkgewoJc3RyaW5nIG1lc3NhZ2U7CglpZih0ICFpcyBudWxsKSB7CgkJZGVidWcgbWVzc2FnZSA9IHQudG9TdHJpbmcoKTsKCQllbHNlICBtZXNzYWdlID0gIkFuIHVuZXhwZWN0ZWQgZXJyb3IgaGFzIG9jY3VycmVkLiI7Cgl9IGVsc2UgewoJCW1lc3NhZ2UgPSAiVW5rbm93biBlcnJvciI7Cgl9CglyZXR1cm4gbWVzc2FnZTsKfQoKc3RyaW5nIHBsYWluSHR0cEVycm9yKGJvb2wgaXNDZ2ksIHN0cmluZyB0eXBlLCBUaHJvd2FibGUgdCkgewoJYXV0byBtZXNzYWdlID0gbWVzc2FnZUZyb21FeGNlcHRpb24odCk7CgltZXNzYWdlID0gc2ltcGxlSHRtbEVuY29kZShtZXNzYWdlKTsKCglyZXR1cm4gZm9ybWF0KCIlcyAlc1xyXG5Db250ZW50LUxlbmd0aDogJXNcclxuXHJcbiVzIiwKCQlpc0NnaSA/ICJTdGF0dXM6IiA6ICJIVFRQLzEuMCIsCgkJdHlwZSwgbWVzc2FnZS5sZW5ndGgsIG1lc3NhZ2UpOwp9CgovLyByZXR1cm5zIHRydWUgaWYgd2Ugd2VyZSBhYmxlIHRvIHJlY292ZXIgcmVhc29uYWJseQpib29sIGhhbmRsZUV4Y2VwdGlvbihDZ2kgY2dpLCBUaHJvd2FibGUgdCkgewoJaWYoY2dpLmlzQ2xvc2VkKSB7CgkJLy8gaWYgdGhlIGNoYW5uZWwgaGFzIGJlZW4gZXhwbGljaXRseSBjbG9zZWQsIHdlIGNhbid0IGhhbmRsZSBpdCBoZXJlCgkJcmV0dXJuIHRydWU7Cgl9CgoJaWYoY2dpLm91dHB1dHRlZFJlc3BvbnNlRGF0YSkgewoJCS8vIHRoZSBoZWFkZXJzIGFyZSBzZW50LCBidXQgdGhlIGNoYW5uZWwgaXMgb3Blbi4uLiBzaW5jZSBpdCBjbG9zZXMgaWYgYWxsIHdhcyBzZW50LCB3ZSBjYW4gYXBwZW5kIGFuIGVycm9yIG1lc3NhZ2UgaGVyZS4KCQlyZXR1cm4gZmFsc2U7IC8vIGJ1dCBJIGRvbid0IHdhbnQgdG8sIHNpbmNlIEkgZG9uJ3Qga25vdyB3aGF0IGNvbmRpdGlvbiB0aGUgb3V0cHV0IGlzIGluOyBJIGRvbid0IHdhbnQgdG8gaW5qZWN0IHNvbWV0aGluZyAobm9yIGNoZWNrIHRoZSBjb250ZW50LXR5cGUgZm9yIHRoYXQgbWF0dGVyLiBTbyB3ZSBzYXkgaXQgd2FzIG5vdCBhIGNsZWFuIGhhbmRsaW5nLgoJfSBlbHNlIHsKCQkvLyBubyBoZWFkZXJzIGFyZSBzZW50LCB3ZSBjYW4gc2VuZCBhIGZ1bGwgYmxvd24gZXJyb3IgYW5kIHJlY292ZXIKCQljZ2kuc2V0Q2FjaGUoZmFsc2UpOwoJCWNnaS5zZXRSZXNwb25zZUNvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKCQljZ2kuc2V0UmVzcG9uc2VMb2NhdGlvbihudWxsKTsgLy8gY2FuY2VsIHRoZSByZWRpcmVjdAoJCWNnaS5zZXRSZXNwb25zZVN0YXR1cygiNTAwIEludGVybmFsIFNlcnZlciBFcnJvciIpOwoJCWNnaS53cml0ZShzaW1wbGVIdG1sRW5jb2RlKG1lc3NhZ2VGcm9tRXhjZXB0aW9uKHQpKSk7CgkJY2dpLmNsb3NlKCk7CgkJcmV0dXJuIHRydWU7Cgl9Cn0KCmJvb2wgaXNDZ2lSZXF1ZXN0TWV0aG9kKHN0cmluZyBzKSB7CglzID0gcy50b1VwcGVyKCk7CglpZihzID09ICJDT01NQU5ETElORSIpCgkJcmV0dXJuIHRydWU7Cglmb3JlYWNoKG1lbWJlcjsgX190cmFpdHMoYWxsTWVtYmVycywgQ2dpLlJlcXVlc3RNZXRob2QpKQoJCWlmKHMgPT0gbWVtYmVyKQoJCQlyZXR1cm4gdHJ1ZTsKCXJldHVybiBmYWxzZTsKfQoKLy8vIElmIHlvdSB3YW50IHRvIHVzZSBhIHN1YmNsYXNzIG9mIENnaSB3aXRoIGdlbmVyaWMgbWFpbiwgdXNlIHRoaXMgbWl4aW4uCm1peGluIHRlbXBsYXRlIEN1c3RvbUNnaU1haW4oQ3VzdG9tQ2dpLCBhbGlhcyBmdW4sIGxvbmcgbWF4Q29udGVudExlbmd0aCA9IGRlZmF1bHRNYXhDb250ZW50TGVuZ3RoKSBpZihpcyhDdXN0b21DZ2kgOiBDZ2kpKSB7CgkvLyBraW5kYSBoYWNreSAtIHRoZSBULi4uIGlzIHBhc3NlZCB0byBDZ2kncyBjb25zdHJ1Y3RvciBpbiBzdGFuZGFyZCBjZ2kgbW9kZSwgYW5kIGlnbm9yZWQgZWxzZXdoZXJlCgltaXhpbiBDdXN0b21DZ2lNYWluSW1wbCEoQ3VzdG9tQ2dpLCBmdW4sIG1heENvbnRlbnRMZW5ndGgpIGN1c3RvbUNnaU1haW5JbXBsXzsKCgl2b2lkIG1haW4oc3RyaW5nW10gYXJncykgewoJCWN1c3RvbUNnaU1haW5JbXBsXy5jZ2lNYWluSW1wbChhcmdzKTsKCX0KfQoKbWl4aW4gdGVtcGxhdGUgQ3VzdG9tQ2dpTWFpbkltcGwoQ3VzdG9tQ2dpLCBhbGlhcyBmdW4sIGxvbmcgbWF4Q29udGVudExlbmd0aCA9IGRlZmF1bHRNYXhDb250ZW50TGVuZ3RoKSBpZihpcyhDdXN0b21DZ2kgOiBDZ2kpKSB7Cgl2b2lkIGNnaU1haW5JbXBsKHN0cmluZ1tdIGFyZ3MpIHsKCgoJCS8vIHdlIHN1cHBvcnQgY29tbWFuZCBsaW5lIHRoaW5nIGZvciBlYXN5IHRlc3RpbmcgZXZlcnl3aGVyZQoJCS8vIGl0IG5lZWRzIHRvIGJlIGNhbGxlZCAuL2FwcCBtZXRob2QgdXJpIFtvdGhlciBhcmdzLi4uXQoJCWlmKGFyZ3MubGVuZ3RoID49IDMgJiYgaXNDZ2lSZXF1ZXN0TWV0aG9kKGFyZ3NbMV0pKSB7CgkJCUNnaSBjZ2kgPSBuZXcgQ3VzdG9tQ2dpKGFyZ3MpOwoJCQlzY29wZShleGl0KSBjZ2kuZGlzcG9zZSgpOwoJCQlmdW4oY2dpKTsKCQkJY2dpLmNsb3NlKCk7CgkJCXJldHVybjsKCQl9CgoKCQl1c2hvcnQgbGlzdGVuaW5nUG9ydCh1c2hvcnQgZGVmKSB7CgkJCWJvb2wgZm91bmQgPSBmYWxzZTsKCQkJZm9yZWFjaChhcmc7IGFyZ3MpIHsKCQkJCWlmKGZvdW5kKQoJCQkJCXJldHVybiB0byF1c2hvcnQoYXJnKTsKCQkJCWlmKGFyZyA9PSAiLS1wb3J0IiB8fCBhcmcgPT0gIi1wIiB8fCBhcmcgPT0gIi9wb3J0IiB8fCBhcmcgPT0gIi0tbGlzdGVuaW5nLXBvcnQiKQoJCQkJCWZvdW5kID0gdHJ1ZTsKCQkJfQoJCQlyZXR1cm4gZGVmOwoJCX0KCgkJc3RyaW5nIGxpc3RlbmluZ0hvc3QoKSB7CgkJCWJvb2wgZm91bmQgPSBmYWxzZTsKCQkJZm9yZWFjaChhcmc7IGFyZ3MpIHsKCQkJCWlmKGZvdW5kKQoJCQkJCXJldHVybiBhcmc7CgkJCQlpZihhcmcgPT0gIi0tbGlzdGVuaW5nLWhvc3QiIHx8IGFyZyA9PSAiLWgiIHx8IGFyZyA9PSAiL2xpc3RlbmluZy1ob3N0IikKCQkJCQlmb3VuZCA9IHRydWU7CgkJCX0KCQkJcmV0dXJuICIiOwoJCX0KCQl2ZXJzaW9uKG5ldG1hbl9odHRwZCkgewoJCQlpbXBvcnQgYXJzZC5odHRwZDsKCQkJLy8gd2hhdCBhYm91dCBmb3J3YXJkaW5nIHRoZSBvdGhlciBjb25zdHJ1Y3RvciBhcmdzPwoJCQkvLyB0aGlzIHByb2JhYmx5IG5lZWRzIGEgd2hvbGUgcmVkb2luZy4uLgoJCQlzZXJ2ZUh0dHAhQ3VzdG9tQ2dpKCZmdW4sIGxpc3RlbmluZ1BvcnQoODA4MCkpOy8vNTAwNSk7CgkJCXJldHVybjsKCQl9IGVsc2UKCQl2ZXJzaW9uKGVtYmVkZGVkX2h0dHBkX3Byb2Nlc3NlcykgewoJCQlpbXBvcnQgY29yZS5zeXMucG9zaXgudW5pc3RkOwoJCQkvL2ltcG9ydCBjb3JlLnN5cy5wb3NpeC5zeXMuc29ja2V0OwoJCQlpbXBvcnQgc3RkLmMubGludXguc29ja2V0OwoKCQkJaW50IHNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOwoJCQlpZihzb2NrID09IC0xKQoJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigic29ja2V0Iik7CgoJCQl7CgkJCQlzb2NrYWRkcl9pbiBhZGRyOwoJCQkJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKCQkJCWFkZHIuc2luX3BvcnQgPSBodG9ucyhsaXN0ZW5pbmdQb3J0KDgwODUpKTsKCQkJCWF1dG8gbGggPSBsaXN0ZW5pbmdIb3N0KCk7CgkJCQlpZihsaC5sZW5ndGgpIHsKCQkJCQlpZihpbmV0X3B0b24oQUZfSU5FVCwgbGgudG9TdHJpbmd6KCksICZhZGRyLnNpbl9hZGRyLnNfYWRkcikgIT0gMSkKCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiYmFkIGxpc3RlbmluZyBob3N0IGdpdmVuLCBwbGVhc2UgdXNlIGFuIElQIGFkZHJlc3MuXG5FeGFtcGxlOiAtLWxpc3RlbmluZy1ob3N0IDEyNy4wLjAuMSBtZWFucyBsaXN0ZW4gb25seSBvbiBMb2NhbGhvc3QuXG5FeGFtcGxlOiAtLWxpc3RlbmluZy1ob3N0IDAuMC4wLjAgbWVhbnMgbGlzdGVuIG9uIGFsbCBpbnRlcmZhY2VzLlxuT3IgeW91IGNhbiBwYXNzIGFueSBvdGhlciBzaW5nbGUgbnVtZXJpYyBJUHY0IGFkZHJlc3MuIik7CgkJCQl9IGVsc2UKCQkJCQlhZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CgoJCQkJLy8gSEFDS0lTSAoJCQkJaW50IG9uID0gMTsKCQkJCXNldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIG9uLnNpemVvZik7CgkJCQkvLyBlbmQgaGFjawoKCQkJCQoJCQkJaWYoYmluZChzb2NrLCBjYXN0KHNvY2thZGRyKikgJmFkZHIsIGFkZHIuc2l6ZW9mKSA9PSAtMSkgewoJCQkJCWNsb3NlKHNvY2spOwoJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oImJpbmQiKTsKCQkJCX0KCgkJCQlpZihzb2NrLmxpc3RlbigxMjgpID09IC0xKSB7CgkJCQkJY2xvc2Uoc29jayk7CgkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigibGlzdGVuIik7CgkJCQl9CgkJCX0KCgoJCQlpbnQgcHJvY2Vzc0NvdW50OwoJCQlwaWRfdCBuZXdQaWQ7CgkJCXJlb3BlbjoKCQkJd2hpbGUocHJvY2Vzc0NvdW50IDwgOCkgewoJCQkJbmV3UGlkID0gZm9yaygpOwoJCQkJaWYobmV3UGlkID09IDApIHsKCQkJCQkvLyBzdGFydCBzZXJ2aW5nIG9uIHRoZSBzb2NrZXQKCQkJCQkvL3VieXRlWzQwOTZdIGJhY2tpbmdCdWZmZXI7CgkJCQkJZm9yKDs7KSB7CgkJCQkJCWJvb2wgY2xvc2VDb25uZWN0aW9uOwoJCQkJCQl1aW50IGk7CgkJCQkJCXNvY2thZGRyIGFkZHI7CgkJCQkJCWkgPSBhZGRyLnNpemVvZjsKCQkJCQkJaW50IHMgPSBhY2NlcHQoc29jaywgJmFkZHIsICZpKTsKCgkJCQkJCXRyeSB7CgoJCQkJCQkJaWYocyA9PSAtMSkKCQkJCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJhY2NlcHQiKTsKCgkJCQkJCQlzY29wZShmYWlsdXJlKSBjbG9zZShzKTsKCQkJCQkJCS8vdWJ5dGVbX190cmFpdHMoY2xhc3NJbnN0YW5jZVNpemUsIEJ1ZmZlcmVkSW5wdXRSYW5nZSldIGJ1ZmZlcmVkUmFuZ2VDb250YWluZXI7CgkJCQkJCQlhdXRvIGlyID0gbmV3IEJ1ZmZlcmVkSW5wdXRSYW5nZShzKTsKCQkJCQkJCS8vYXV0byBpciA9IGVtcGxhY2UhQnVmZmVyZWRJbnB1dFJhbmdlKGJ1ZmZlcmVkUmFuZ2VDb250YWluZXIsIHMsIGJhY2tpbmdCdWZmZXIpOwoKCQkJCQkJCXdoaWxlKCFpci5lbXB0eSkgewoJCQkJCQkJCXVieXRlW19fdHJhaXRzKGNsYXNzSW5zdGFuY2VTaXplLCBDdXN0b21DZ2kpXSBjZ2lDb250YWluZXI7CgoJCQkJCQkJCUNnaSBjZ2k7CgkJCQkJCQkJdHJ5IHsKCQkJCQkJCQkJY2dpID0gbmV3IEN1c3RvbUNnaShpciwgJmNsb3NlQ29ubmVjdGlvbik7CgkJCQkJCQkJCS8vY2dpID0gZW1wbGFjZSFDdXN0b21DZ2koY2dpQ29udGFpbmVyLCBpciwgJmNsb3NlQ29ubmVjdGlvbik7CgkJCQkJCQkJfSBjYXRjaChUaHJvd2FibGUgdCkgewoJCQkJCQkJCQkvLyBhIGNvbnN0cnVjdGlvbiBlcnJvciBpcyBlaXRoZXIgYmFkIGNvZGUgb3IgYmFkIHJlcXVlc3Q7IGJhZCByZXF1ZXN0IGlzIHdoYXQgaXQgc2hvdWxkIGJlIHNpbmNlIHRoaXMgaXMgYnVnIGZyZWUgOlAKCQkJCQkJCQkJLy8gYW55d2F5IGxldCdzIGtpbGwgdGhlIGNvbm5lY3Rpb24KCQkJCQkJCQkJc3RkZXJyLndyaXRlbG4odC50b1N0cmluZygpKTsKCQkJCQkJCQkJc2VuZEFsbChpci5zb3VyY2UsIHBsYWluSHR0cEVycm9yKGZhbHNlLCAiNDAwIEJhZCBSZXF1ZXN0IiwgdCkpOwoJCQkJCQkJCQljbG9zZUNvbm5lY3Rpb24gPSB0cnVlOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQkJYXNzZXJ0KGNnaSAhaXMgbnVsbCk7CgkJCQkJCQkJc2NvcGUoZXhpdCkKCQkJCQkJCQkJY2dpLmRpc3Bvc2UoKTsKCgkJCQkJCQkJdHJ5IHsKCQkJCQkJCQkJZnVuKGNnaSk7CgkJCQkJCQkJCWNnaS5jbG9zZSgpOwoJCQkJCQkJCX0gY2F0Y2goQ29ubmVjdGlvbkV4Y2VwdGlvbiBjZSkgewoJCQkJCQkJCQljbG9zZUNvbm5lY3Rpb24gPSB0cnVlOwoJCQkJCQkJCX0gY2F0Y2goVGhyb3dhYmxlIHQpIHsKCQkJCQkJCQkJLy8gYSBwcm9jZXNzaW5nIGVycm9yIGNhbiBiZSByZWNvdmVyZWQgZnJvbQoJCQkJCQkJCQlzdGRlcnIud3JpdGVsbih0LnRvU3RyaW5nKTsKCQkJCQkJCQkJaWYoIWhhbmRsZUV4Y2VwdGlvbihjZ2ksIHQpKQoJCQkJCQkJCQkJY2xvc2VDb25uZWN0aW9uID0gdHJ1ZTsKCQkJCQkJCQl9CgoJCQkJCQkJCWlmKGNsb3NlQ29ubmVjdGlvbikgewoJCQkJCQkJCQlpci5zb3VyY2UuY2xvc2UoKTsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJaWYoIWlyLmVtcHR5KQoJCQkJCQkJCQkJaXIucG9wRnJvbnQoKTsgLy8gZ2V0IHRoZSBuZXh0CgkJCQkJCQkJCWVsc2UgaWYoaXIuc291cmNlQ2xvc2VkKSB7CgkJCQkJCQkJCQlpci5zb3VyY2UuY2xvc2UoKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCgkJCQkJCQlpci5zb3VyY2UuY2xvc2UoKTsKCQkJCQkJfSBjYXRjaChUaHJvd2FibGUgdCkgewoJCQkJCQkJZGVidWcgd3JpdGVsbih0KTsKCQkJCQkJCS8vIG1vc3QgbGlrZWx5IGNhdXNlIGlzIGEgdGltZW91dAoJCQkJCQl9CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQlwcm9jZXNzQ291bnQrKzsKCQkJCX0KCQkJfQoKCQkJLy8gdGhlIHBhcmVudCBzaG91bGQgd2FpdCBmb3IgaXRzIGNoaWxkcmVuLi4uCgkJCWlmKG5ld1BpZCkgewoJCQkJaW1wb3J0IGNvcmUuc3lzLnBvc2l4LnN5cy53YWl0OwoJCQkJaW50IHN0YXR1czsKCQkJCS8vIEZJWE1FOiBtYXliZSB3ZSBzaG91bGQgcmVzcGF3biBpZiBvbmUgZGllcyB1bmV4cGVjdGVkbHkKCQkJCXdoaWxlKC0xICE9IHdhaXQoJnN0YXR1cykpIHsKCQkJCWltcG9ydCBzdGQuc3RkaW87IHdyaXRlbG4oIlByb2Nlc3MgZGllZCAiLCBzdGF0dXMpOwoJCQkJCXByb2Nlc3NDb3VudC0tOwoJCQkJCWdvdG8gcmVvcGVuOwoJCQkJfQoJCQkJY2xvc2Uoc29jayk7CgkJCX0KCQl9IGVsc2UKCQl2ZXJzaW9uKGVtYmVkZGVkX2h0dHBkX3RocmVhZHMpIHsKCQkJYXV0byBtYW5hZ2VyID0gbmV3IExpc3RlbmluZ0Nvbm5lY3Rpb25NYW5hZ2VyKGxpc3RlbmluZ0hvc3QoKSwgbGlzdGVuaW5nUG9ydCg4MDg1KSwgJmRvVGhyZWFkSHR0cENvbm5lY3Rpb24hKEN1c3RvbUNnaSwgZnVuKSk7CgkJCW1hbmFnZXIubGlzdGVuKCk7CgkJfSBlbHNlCgkJdmVyc2lvbihzY2dpKSB7CgkJCWltcG9ydCBzdGQuZXhjZXB0aW9uOwoJCQlpbXBvcnQgYWwgPSBzdGQuYWxnb3JpdGhtOwoJCQlhdXRvIG1hbmFnZXIgPSBuZXcgTGlzdGVuaW5nQ29ubmVjdGlvbk1hbmFnZXIobGlzdGVuaW5nSG9zdCgpLCBsaXN0ZW5pbmdQb3J0KDQwMDApLCAmZG9UaHJlYWRTY2dpQ29ubmVjdGlvbiEoQ3VzdG9tQ2dpLCBmdW4sIG1heENvbnRlbnRMZW5ndGgpKTsKCQkJbWFuYWdlci5saXN0ZW4oKTsKCQl9IGVsc2UKCQl2ZXJzaW9uKGZhc3RjZ2kpIHsKCQkJLy8gICAgICAgICBTZXRIYW5kbGVyIGZjZ2lkLXNjcmlwdAoJCQlGQ0dYX1N0cmVhbSogaW5wdXQsIG91dHB1dCwgZXJyb3I7CgkJCUZDR1hfUGFyYW1BcnJheSBlbnY7CgoKCgkJCWNvbnN0KHVieXRlKVtdIGdldEZjZ2lDaHVuaygpIHsKCQkJCWNvbnN0KHVieXRlKVtdIHJldDsKCQkJCXdoaWxlKEZDR1hfSGFzU2VlbkVPRihpbnB1dCkgIT0gLTEpCgkJCQkJcmV0IH49IGNhc3QodWJ5dGUpIEZDR1hfR2V0Q2hhcihpbnB1dCk7CgkJCQlyZXR1cm4gcmV0OwoJCQl9CgoJCQl2b2lkIHdyaXRlRmNnaShjb25zdCh1Ynl0ZSlbXSBkYXRhKSB7CgkJCQlGQ0dYX1B1dFN0cihkYXRhLnB0ciwgZGF0YS5sZW5ndGgsIG91dHB1dCk7CgkJCX0KCgkJCXZvaWQgZG9BUmVxdWVzdCgpIHsKCQkJCXN0cmluZ1tzdHJpbmddIGZjZ2llbnY7CgoJCQkJZm9yKGF1dG8gZSA9IGVudjsgZSAhaXMgbnVsbCAmJiAqZSAhaXMgbnVsbDsgZSsrKSB7CgkJCQkJc3RyaW5nIGN1ciA9IHRvIXN0cmluZygqZSk7CgkJCQkJYXV0byBpZHggPSBjdXIuaW5kZXhPZigiPSIpOwoJCQkJCXN0cmluZyBuYW1lLCB2YWx1ZTsKCQkJCQlpZihpZHggPT0gLTEpCgkJCQkJCW5hbWUgPSBjdXI7CgkJCQkJZWxzZSB7CgkJCQkJCW5hbWUgPSBjdXJbMCAuLiBpZHhdOwoJCQkJCQl2YWx1ZSA9IGN1cltpZHggKyAxIC4uICRdOwoJCQkJCX0KCgkJCQkJZmNnaWVudltuYW1lXSA9IHZhbHVlOwoJCQkJfQoKCQkJCXZvaWQgZmx1c2hGY2dpKCkgewoJCQkJCUZDR1hfRkZsdXNoKG91dHB1dCk7CgkJCQl9CgoJCQkJQ2dpIGNnaTsKCQkJCXRyeSB7CgkJCQkJY2dpID0gbmV3IEN1c3RvbUNnaShtYXhDb250ZW50TGVuZ3RoLCBmY2dpZW52LCAmZ2V0RmNnaUNodW5rLCAmd3JpdGVGY2dpLCAmZmx1c2hGY2dpKTsKCQkJCX0gY2F0Y2goVGhyb3dhYmxlIHQpIHsKCQkJCQlGQ0dYX1B1dFN0cihjYXN0KHVieXRlKikgdC5tc2cucHRyLCB0Lm1zZy5sZW5ndGgsIGVycm9yKTsKCQkJCQl3cml0ZUZjZ2koY2FzdChjb25zdCh1Ynl0ZSlbXSkgcGxhaW5IdHRwRXJyb3IodHJ1ZSwgIjQwMCBCYWQgUmVxdWVzdCIsIHQpKTsKCQkJCQlyZXR1cm47IC8vY29udGludWU7CgkJCQl9CgkJCQlhc3NlcnQoY2dpICFpcyBudWxsKTsKCQkJCXNjb3BlKGV4aXQpIGNnaS5kaXNwb3NlKCk7CgkJCQl0cnkgewoJCQkJCWZ1bihjZ2kpOwoJCQkJCWNnaS5jbG9zZSgpOwoJCQkJfSBjYXRjaChUaHJvd2FibGUgdCkgewoJCQkJCS8vIGxvZyBpdCB0byB0aGUgZXJyb3Igc3RyZWFtCgkJCQkJRkNHWF9QdXRTdHIoY2FzdCh1Ynl0ZSopIHQubXNnLnB0ciwgdC5tc2cubGVuZ3RoLCBlcnJvcik7CgkJCQkJLy8gaGFuZGxlIGl0IGZvciB0aGUgdXNlciwgaWYgd2UgY2FuCgkJCQkJaWYoIWhhbmRsZUV4Y2VwdGlvbihjZ2ksIHQpKQoJCQkJCQlyZXR1cm47IC8vIGNvbnRpbnVlOwoJCQkJfQoJCQl9CgoJCQlhdXRvIGxwID0gbGlzdGVuaW5nUG9ydCgwKTsKCQkJRkNHWF9SZXF1ZXN0IHJlcXVlc3Q7CgkJCWlmKGxwKSB7CgkJCQkvLyBpZiBhIGxpc3RlbmluZyBwb3J0IHdhcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgd2Ugd2FudCB0byBzcGF3biBvdXJzZWxmCgkJCQkvLyAobmVlZGVkIGZvciBuZ2lueCB3aXRob3V0IHNwYXduLWZjZ2ksIGUuZy4gb24gV2luZG93cykKCQkJCUZDR1hfSW5pdCgpOwoJCQkJYXV0byBzb2NrID0gRkNHWF9PcGVuU29ja2V0KHRvU3RyaW5neihsaXN0ZW5pbmdIb3N0KCkgfiAiOiIgfiB0byFzdHJpbmcobHApKSwgMTIpOwoJCQkJaWYoc29jayA8IDApCgkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ291bGRuJ3QgbGlzdGVuIG9uIHRoZSBwb3J0Iik7CgkJCQlGQ0dYX0luaXRSZXF1ZXN0KCZyZXF1ZXN0LCBzb2NrLCAwKTsKCQkJCXdoaWxlKEZDR1hfQWNjZXB0X3IoJnJlcXVlc3QpID49IDApIHsKCQkJCQlpbnB1dCA9IHJlcXVlc3QuaW5TdHJlYW07CgkJCQkJb3V0cHV0ID0gcmVxdWVzdC5vdXRTdHJlYW07CgkJCQkJZXJyb3IgPSByZXF1ZXN0LmVyclN0cmVhbTsKCQkJCQllbnYgPSByZXF1ZXN0LmVudnA7CgkJCQkJZG9BUmVxdWVzdCgpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJLy8gb3RoZXJ3aXNlLCBhc3N1bWUgdGhlIGh0dHBkIGlzIGRvaW5nIGl0ICh0aGUgY2FzZSBmb3IgQXBhY2hlLCBJSVMsIGFuZCBMaWdodHRwZCkKCQkJCS8vIHVzaW5nIHRoZSB2ZXJzaW9uIHdpdGggYSBnbG9iYWwgdmFyaWFibGUgc2luY2Ugd2UgYXJlIHNlcGFyYXRlIHByb2Nlc3NlcyBhbnl3YXkKCQkJCXdoaWxlKEZDR1hfQWNjZXB0KCZpbnB1dCwgJm91dHB1dCwgJmVycm9yLCAmZW52KSA+PSAwKSB7CgkJCQkJZG9BUmVxdWVzdCgpOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gc3RhbmRhcmQgQ0dJIGlzIHRoZSBkZWZhdWx0IHZlcnNpb24KCQkJQ2dpIGNnaTsKCQkJdHJ5IHsKCQkJCWNnaSA9IG5ldyBDdXN0b21DZ2kobWF4Q29udGVudExlbmd0aCk7CgkJCX0gY2F0Y2goVGhyb3dhYmxlIHQpIHsKCQkJCXN0ZGVyci53cml0ZWxuKHQubXNnKTsKCQkJCS8vIHRoZSByZWFsIGh0dHAgc2VydmVyIHdpbGwgcHJvYmFibHkgaGFuZGxlIHRoaXM7CgkJCQkvLyBtb3N0IGxpa2VseSwgdGhpcyBpcyBhIGJ1ZyBpbiBDZ2kuIEJ1dCwgb2ggd2VsbC4KCQkJCXN0ZG91dC53cml0ZShwbGFpbkh0dHBFcnJvcih0cnVlLCAiNDAwIEJhZCBSZXF1ZXN0IiwgdCkpOwoJCQkJcmV0dXJuOwoJCQl9CgkJCWFzc2VydChjZ2kgIWlzIG51bGwpOwoJCQlzY29wZShleGl0KSBjZ2kuZGlzcG9zZSgpOwoKCQkJdHJ5IHsKCQkJCWZ1bihjZ2kpOwoJCQkJY2dpLmNsb3NlKCk7CgkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CgkJCQlzdGRlcnIud3JpdGVsbih0Lm1zZyk7CgkJCQlpZighaGFuZGxlRXhjZXB0aW9uKGNnaSwgdCkpCgkJCQkJcmV0dXJuOwoJCQl9CgkJfQoJfQp9Cgp2ZXJzaW9uKGVtYmVkZGVkX2h0dHBkX3RocmVhZHMpCnZvaWQgZG9UaHJlYWRIdHRwQ29ubmVjdGlvbihDdXN0b21DZ2ksIGFsaWFzIGZ1bikoU29ja2V0IGNvbm5lY3Rpb24pIHsKCXNjb3BlKGZhaWx1cmUpIHsKCQkvLyBjYXRjaCBhbGwgZm9yIG90aGVyIGVycm9ycwoJCXNlbmRBbGwoY29ubmVjdGlvbiwgcGxhaW5IdHRwRXJyb3IoZmFsc2UsICI1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yIiwgbnVsbCkpOwoJCWNvbm5lY3Rpb24uY2xvc2UoKTsKCX0KCWJvb2wgY2xvc2VDb25uZWN0aW9uOwoJYXV0byBpciA9IG5ldyBCdWZmZXJlZElucHV0UmFuZ2UoY29ubmVjdGlvbik7CgoJd2hpbGUoIWlyLmVtcHR5KSB7CgkJQ2dpIGNnaTsKCQl0cnkgewoJCQljZ2kgPSBuZXcgQ3VzdG9tQ2dpKGlyLCAmY2xvc2VDb25uZWN0aW9uKTsKCQl9IGNhdGNoKENvbm5lY3Rpb25FeGNlcHRpb24gY2UpIHsKCQkJLy8gYnJva2VuIHBpcGUgb3Igc29tZXRoaW5nLCBqdXN0IGFib3J0IHRoZSBjb25uZWN0aW9uCgkJCWNsb3NlQ29ubmVjdGlvbiA9IHRydWU7CgkJCWJyZWFrOwoJCX0gY2F0Y2goVGhyb3dhYmxlIHQpIHsKCQkJLy8gYSBjb25zdHJ1Y3Rpb24gZXJyb3IgaXMgZWl0aGVyIGJhZCBjb2RlIG9yIGJhZCByZXF1ZXN0OyBiYWQgcmVxdWVzdCBpcyB3aGF0IGl0IHNob3VsZCBiZSBzaW5jZSB0aGlzIGlzIGJ1ZyBmcmVlIDpQCgkJCS8vIGFueXdheSBsZXQncyBraWxsIHRoZSBjb25uZWN0aW9uCgkJCXN0ZGVyci53cml0ZWxuKHQudG9TdHJpbmcoKSk7CgkJCXNlbmRBbGwoY29ubmVjdGlvbiwgcGxhaW5IdHRwRXJyb3IoZmFsc2UsICI0MDAgQmFkIFJlcXVlc3QiLCB0KSk7CgkJCWNsb3NlQ29ubmVjdGlvbiA9IHRydWU7CgkJCWJyZWFrOwoJCX0KCQlhc3NlcnQoY2dpICFpcyBudWxsKTsKCQlzY29wZShleGl0KQoJCQljZ2kuZGlzcG9zZSgpOwoKCQl0cnkgewoJCQlmdW4oY2dpKTsKCQkJY2dpLmNsb3NlKCk7CgkJfSBjYXRjaChDb25uZWN0aW9uRXhjZXB0aW9uIGNlKSB7CgkJCS8vIGJyb2tlbiBwaXBlIG9yIHNvbWV0aGluZywganVzdCBhYm9ydCB0aGUgY29ubmVjdGlvbgoJCQljbG9zZUNvbm5lY3Rpb24gPSB0cnVlOwoJCX0gY2F0Y2goVGhyb3dhYmxlIHQpIHsKCQkJLy8gYSBwcm9jZXNzaW5nIGVycm9yIGNhbiBiZSByZWNvdmVyZWQgZnJvbQoJCQlzdGRlcnIud3JpdGVsbih0LnRvU3RyaW5nKTsKCQkJaWYoIWhhbmRsZUV4Y2VwdGlvbihjZ2ksIHQpKQoJCQkJY2xvc2VDb25uZWN0aW9uID0gdHJ1ZTsKCQl9CgoJCWlmKGNsb3NlQ29ubmVjdGlvbikgewoJCQljb25uZWN0aW9uLmNsb3NlKCk7CgkJCWJyZWFrOwoJCX0gZWxzZSB7CgkJCWlmKCFpci5lbXB0eSkKCQkJCWlyLnBvcEZyb250KCk7IC8vIGdldCB0aGUgbmV4dAoJCQllbHNlIGlmKGlyLnNvdXJjZUNsb3NlZCkKCQkJCWlyLnNvdXJjZS5jbG9zZSgpOwoJCX0KCX0KCglpci5zb3VyY2UuY2xvc2UoKTsKfQoKdmVyc2lvbihzY2dpKQp2b2lkIGRvVGhyZWFkU2NnaUNvbm5lY3Rpb24oQ3VzdG9tQ2dpLCBhbGlhcyBmdW4sIGxvbmcgbWF4Q29udGVudExlbmd0aCkoU29ja2V0IGNvbm5lY3Rpb24pIHsKCS8vIGFuZCBub3cgd2UgY2FuIGJ1ZmZlcgoJc2NvcGUoZmFpbHVyZSkKCQljb25uZWN0aW9uLmNsb3NlKCk7CgoJaW1wb3J0IGFsID0gc3RkLmFsZ29yaXRobTsKCglzaXplX3Qgc2l6ZTsKCglzdHJpbmdbc3RyaW5nXSBoZWFkZXJzOwoKCWF1dG8gcmFuZ2UgPSBuZXcgQnVmZmVyZWRJbnB1dFJhbmdlKGNvbm5lY3Rpb24pOwoJbW9yZV9kYXRhOgoJYXV0byBjaHVuayA9IHJhbmdlLmZyb250KCk7CgkvLyB3YWl0aW5nIGZvciBjb2xvbiBmb3IgaGVhZGVyIGxlbmd0aAoJYXV0byBpZHggPSBpbmRleE9mKGNhc3Qoc3RyaW5nKSBjaHVuaywgJzonKTsKCWlmKGlkeCA9PSAtMSkgewoJCXJhbmdlLnBvcEZyb250KCk7CgkJZ290byBtb3JlX2RhdGE7Cgl9CgoJc2l6ZSA9IHRvIXNpemVfdChjYXN0KHN0cmluZykgY2h1bmtbMCAuLiBpZHhdKTsKCWNodW5rID0gcmFuZ2UuY29uc3VtZShpZHggKyAxKTsKCS8vIHJlYWRpbmcgaGVhZGVycwoJaWYoY2h1bmsubGVuZ3RoIDwgc2l6ZSkKCQlyYW5nZS5wb3BGcm9udCgwLCBzaXplICsgMSk7CgkvLyB3ZSBhcmUgbm93IGd1YXJhbnRlZWQgdG8gaGF2ZSBlbm91Z2gKCWNodW5rID0gcmFuZ2UuZnJvbnQoKTsKCWFzc2VydChjaHVuay5sZW5ndGggPiBzaXplKTsKCglpZHggPSAwOwoJc3RyaW5nIGtleTsKCXN0cmluZyB2YWx1ZTsKCWZvcmVhY2gocGFydDsgYWwuc3BsaXR0ZXIoY2h1bmssICdcMCcpKSB7CgkJaWYoaWR4ICYgMSkgeyAvLyBvZGQgaXMgdmFsdWUKCQkJdmFsdWUgPSBjYXN0KHN0cmluZykocGFydC5pZHVwKTsKCQkJaGVhZGVyc1trZXldID0gdmFsdWU7IC8vIGNvbW1pdAoJCX0gZWxzZQoJCQlrZXkgPSBjYXN0KHN0cmluZykocGFydC5pZHVwKTsKCQlpZHgrKzsKCX0KCgllbmZvcmNlKGNodW5rW3NpemVdID09ICcsJyk7IC8vIHRoZSB0ZXJtaW5hdG9yCgoJcmFuZ2UuY29uc3VtZShzaXplICsgMSk7CgkvLyByZWFkaW5nIGRhdGEKCS8vIHRoaXMgd2lsbCBiZSBkb25lIGJ5IENnaQoKCWNvbnN0KHVieXRlKVtdIGdldFNjZ2lDaHVuaygpIHsKCQkvLyB3ZSBhcmUgYWxyZWFkeSBwcmltZWQKCQlhdXRvIGRhdGEgPSByYW5nZS5mcm9udCgpOwoJCWlmKGRhdGEubGVuZ3RoID09IDAgJiYgIXJhbmdlLnNvdXJjZUNsb3NlZCkgewoJCQlyYW5nZS5wb3BGcm9udCgwKTsKCQkJZGF0YSA9IHJhbmdlLmZyb250KCk7CgkJfSBlbHNlIGlmIChyYW5nZS5zb3VyY2VDbG9zZWQpCgkJCXJhbmdlLnNvdXJjZS5jbG9zZSgpOwoKCQlyZXR1cm4gZGF0YTsKCX0KCgl2b2lkIHdyaXRlU2NnaShjb25zdCh1Ynl0ZSlbXSBkYXRhKSB7CgkJc2VuZEFsbChjb25uZWN0aW9uLCBkYXRhKTsKCX0KCgl2b2lkIGZsdXNoU2NnaSgpIHsKCQkvLyBJIGRvbid0ICp0aGluayogSSBoYXZlIHRvIGRvIGFueXRoaW5nLi4uLgoJfQoKCUNnaSBjZ2k7Cgl0cnkgewoJCWNnaSA9IG5ldyBDdXN0b21DZ2kobWF4Q29udGVudExlbmd0aCwgaGVhZGVycywgJmdldFNjZ2lDaHVuaywgJndyaXRlU2NnaSwgJmZsdXNoU2NnaSk7Cgl9IGNhdGNoKFRocm93YWJsZSB0KSB7CgkJc2VuZEFsbChjb25uZWN0aW9uLCBwbGFpbkh0dHBFcnJvcih0cnVlLCAiNDAwIEJhZCBSZXF1ZXN0IiwgdCkpOwoJCWNvbm5lY3Rpb24uY2xvc2UoKTsKCQlyZXR1cm47IC8vIHRoaXMgY29ubmVjdGlvbiBpcyBkZWFkCgl9Cglhc3NlcnQoY2dpICFpcyBudWxsKTsKCXNjb3BlKGV4aXQpIGNnaS5kaXNwb3NlKCk7Cgl0cnkgewoJCWZ1bihjZ2kpOwoJCWNnaS5jbG9zZSgpOwoJfSBjYXRjaChUaHJvd2FibGUgdCkgewoJCS8vIG5vIHN0ZCBlcnIKCQlpZighaGFuZGxlRXhjZXB0aW9uKGNnaSwgdCkpIHsKCQkJY29ubmVjdGlvbi5jbG9zZSgpOwoJCQlyZXR1cm47CgkJfQoJfQp9CgpzdHJpbmcgcHJpbnREYXRlKERhdGVUaW1lIGRhdGUpIHsKCXJldHVybiBmb3JtYXQoCgkJIiUuM3MsICUwMmQgJS4zcyAlZCAlMDJkOiUwMmQ6JTAyZCBHTVQiLCAvLyBjb3VsZCBiZSBVVEMgdG9vCgkJdG8hc3RyaW5nKGRhdGUuZGF5T2ZXZWVrKS5jYXBpdGFsaXplLAoJCWRhdGUuZGF5LAoJCXRvIXN0cmluZyhkYXRlLm1vbnRoKS5jYXBpdGFsaXplLAoJCWRhdGUueWVhciwKCQlkYXRlLmhvdXIsCgkJZGF0ZS5taW51dGUsCgkJZGF0ZS5zZWNvbmQpOwp9CgoKdmVyc2lvbih3aXRoX2NnaV9wYWNrZWQpIHsKLy8gVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgUGhvYm9zIHN1cHBvcnRzIGJhc2U2NAppbW11dGFibGUodWJ5dGUpW10gYmFzZTY0VXJsRGVjb2RlKHN0cmluZyBlKSB7CglzdHJpbmcgZW5jb2RlZCA9IGUuaWR1cDsKCXdoaWxlIChlbmNvZGVkLmxlbmd0aCAlIDQpIHsKCQllbmNvZGVkIH49ICI9IjsgLy8gYWRkIHBhZGRpbmcKCX0KCgkvLyBjb252ZXJ0IGJhc2U2NCBVUkwgdG8gc3RhbmRhcmQgYmFzZSA2NAoJZW5jb2RlZCA9IGVuY29kZWQucmVwbGFjZSgiLSIsICIrIik7CgllbmNvZGVkID0gZW5jb2RlZC5yZXBsYWNlKCJfIiwgIi8iKTsKCglyZXR1cm4gY2FzdChpbW11dGFibGUodWJ5dGUpW10pIEJhc2U2NC5kZWNvZGUoZW5jb2RlZCk7Cn0KCS8vIHNob3VsZCBiZSBzZXQgYXMgYXJzZF9wYWNrZWRfZGF0YQoJc3RyaW5nIHBhY2tlZERhdGFFbmNvZGUoaW4gc3RyaW5nW3N0cmluZ10gdmFyaWFibGVzKSB7CgkJc3RyaW5nIHJlc3VsdDsKCgkJYm9vbCBvdXRwdXR0ZWQgPSBmYWxzZTsKCQlmb3JlYWNoKGssIHY7IHZhcmlhYmxlcykgewoJCQlpZihvdXRwdXR0ZWQpCgkJCQlyZXN1bHQgfj0gIiYiOwoJCQllbHNlCgkJCQlvdXRwdXR0ZWQgPSB0cnVlOwoKCQkJcmVzdWx0IH49IHN0ZC51cmkuZW5jb2RlQ29tcG9uZW50KGspIH4gIj0iIH4gc3RkLnVyaS5lbmNvZGVDb21wb25lbnQodik7CgkJfQoKCQlyZXN1bHQgPSBjYXN0KHN0cmluZykgQmFzZTY0LmVuY29kZShjYXN0KHVieXRlW10pIHJlc3VsdCk7CgoJCS8vIHVybCB2YXJpYW50CgkJcmVzdWx0LnJlcGxhY2UoIj0iLCAiIik7CgkJcmVzdWx0LnJlcGxhY2UoIisiLCAiLSIpOwoJCXJlc3VsdC5yZXBsYWNlKCIvIiwgIl8iKTsKCgkJcmV0dXJuIHJlc3VsdDsKCX0KfQoKCi8vIFJlZmVyZW5jaW5nIHRoaXMgZ2lnYW50aWMgdHlwZWlkIHNlZW1zIHRvIHJlbWluZCB0aGUgY29tcGlsZXIKLy8gdG8gYWN0dWFsbHkgcHV0IHRoZSBzeW1ib2wgaW4gdGhlIG9iamVjdCBmaWxlLiBJIGd1ZXNzIHRoZSBpbW11dGFibGUKLy8gYXNzb2MgYXJyYXkgYXJyYXkgaXNuJ3QgYWN0dWFsbHkgaW5jbHVkZWQgaW4gZHJ1bnRpbWUKdm9pZCBoYWNrQXJvdW5kTGlua2VyRXJyb3IoKSB7CiAgICAgIHdyaXRlbG4odHlwZWlkKGNvbnN0KGltbXV0YWJsZShjaGFyKVtdW10pW2ltbXV0YWJsZShjaGFyKVtdXSkpOwogICAgICB3cml0ZWxuKHR5cGVpZChpbW11dGFibGUoY2hhcilbXVtdW2ltbXV0YWJsZShjaGFyKVtdXSkpOwogICAgICB3cml0ZWxuKHR5cGVpZChDZ2kuVXBsb2FkZWRGaWxlW2ltbXV0YWJsZShjaGFyKVtdXSkpOwogICAgICB3cml0ZWxuKHR5cGVpZChDZ2kuVXBsb2FkZWRGaWxlW11baW1tdXRhYmxlKGNoYXIpW11dKSk7CiAgICAgIHdyaXRlbG4odHlwZWlkKGltbXV0YWJsZShDZ2kuVXBsb2FkZWRGaWxlKVtpbW11dGFibGUoY2hhcilbXV0pKTsKICAgICAgd3JpdGVsbih0eXBlaWQoaW1tdXRhYmxlKENnaS5VcGxvYWRlZEZpbGVbXSlbaW1tdXRhYmxlKGNoYXIpW11dKSk7CiAgICAgIHdyaXRlbG4odHlwZWlkKGltbXV0YWJsZShjaGFyW10pW2ltbXV0YWJsZShjaGFyKVtdXSkpOwogICAgICAvLyB0aGlzIGlzIGdldHRpbmcga2luZGEgcmlkaWN1bG91cyBidHcuIE1vdmluZyBhc3NvYyBhcnJheXMKICAgICAgLy8gdG8gdGhlIGxpYnJhcnkgaXMgdGhlIHBhaW4gdGhhdCBrZWVwcyBvbiBjb21pbmcuCgogICAgICAvLyBlaCB0aGlzIGJyb2tlIHRoZSBidWlsZCBvbiB0aGUgd29yayBzZXJ2ZXIKICAgICAgLy8gd3JpdGVsbih0eXBlaWQoaW1tdXRhYmxlKGNoYXIpW11baW1tdXRhYmxlKHN0cmluZ1tdKV0pKTsKICAgICAgd3JpdGVsbih0eXBlaWQoaW1tdXRhYmxlKHN0cmluZ1tdKVtpbW11dGFibGUoY2hhcilbXV0pKTsKfQoKCgoKCnZlcnNpb24oZmFzdGNnaSkgewoJcHJhZ21hKGxpYiwgImZjZ2kiKTsKCglzdGF0aWMgaWYoc2l6ZV90LnNpemVvZiA9PSA4KSAvLyA2NCBiaXQKCQlhbGlhcyBsb25nIGNfaW50OwoJZWxzZQoJCWFsaWFzIGludCBjX2ludDsKCglleHRlcm4oQykgewoJCXN0cnVjdCBGQ0dYX1N0cmVhbSB7CgkJCXVieXRlKiByZE5leHQ7CgkJCXVieXRlKiB3ck5leHQ7CgkJCXVieXRlKiBzdG9wOwoJCQl1Ynl0ZSogc3RvcFVuZ2V0OwoJCQljX2ludCBpc1JlYWRlcjsKCQkJY19pbnQgaXNDbG9zZWQ7CgkJCWNfaW50IHdhc0ZDbG9zZUNhbGxlZDsKCQkJY19pbnQgRkNHSV9lcnJubzsKCQkJdm9pZCogZnVuY3Rpb24oRkNHWF9TdHJlYW0qIHN0cmVhbSkgZmlsbEJ1ZmZQcm9jOwoJCQl2b2lkKiBmdW5jdGlvbihGQ0dYX1N0cmVhbSogc3RyZWFtLCBjX2ludCBkb0Nsb3NlKSBlbXB0eUJ1ZmZQcm9jOwoJCQl2b2lkKiBkYXRhOwoJCX0KCgkJLy8gbm90ZTogdGhpcyBpcyBtZWFudCB0byBiZSBvcGFxdWUsIHNvIGRvbid0IGFjY2VzcyBpdCBkaXJlY3RseQoJCXN0cnVjdCBGQ0dYX1JlcXVlc3QgewoJCQlpbnQgcmVxdWVzdElkOwoJCQlpbnQgcm9sZTsKCQkJRkNHWF9TdHJlYW0qIGluU3RyZWFtOwoJCQlGQ0dYX1N0cmVhbSogb3V0U3RyZWFtOwoJCQlGQ0dYX1N0cmVhbSogZXJyU3RyZWFtOwoJCQljaGFyKiogZW52cDsKCQkJdm9pZCogcGFyYW1zUHRyOwoJCQlpbnQgaXBjRmQ7CgkJCWludCBpc0JlZ2luUHJvY2Vzc2VkOwoJCQlpbnQga2VlcENvbm5lY3Rpb247CgkJCWludCBhcHBTdGF0dXM7CgkJCWludCBuV3JpdGVyczsKCQkJaW50IGZsYWdzOwoJCQlpbnQgbGlzdGVuX3NvY2s7CgkJfQoKCQlpbnQgRkNHWF9Jbml0UmVxdWVzdChGQ0dYX1JlcXVlc3QgKnJlcXVlc3QsIGludCBzb2NrLCBpbnQgZmxhZ3MpOwoJCXZvaWQgRkNHWF9Jbml0KCk7CgoJCWludCBGQ0dYX0FjY2VwdF9yKEZDR1hfUmVxdWVzdCAqcmVxdWVzdCk7CgoKCQlhbGlhcyBjaGFyKiogRkNHWF9QYXJhbUFycmF5OwoKCQljX2ludCBGQ0dYX0FjY2VwdChGQ0dYX1N0cmVhbSoqIHN0ZGluLCBGQ0dYX1N0cmVhbSoqIHN0ZG91dCwgRkNHWF9TdHJlYW0qKiBzdGRlcnIsIEZDR1hfUGFyYW1BcnJheSogZW52cCk7CgkJY19pbnQgRkNHWF9HZXRDaGFyKEZDR1hfU3RyZWFtKiBzdHJlYW0pOwoJCWNfaW50IEZDR1hfUHV0U3RyKGNvbnN0IHVieXRlKiBzdHIsIGNfaW50IG4sIEZDR1hfU3RyZWFtKiBzdHJlYW0pOwoJCWludCBGQ0dYX0hhc1NlZW5FT0YoRkNHWF9TdHJlYW0qIHN0cmVhbSk7CgkJY19pbnQgRkNHWF9GRmx1c2goRkNHWF9TdHJlYW0gKnN0cmVhbSk7CgoJCWludCBGQ0dYX09wZW5Tb2NrZXQoaW4gY2hhciosIGludCk7Cgl9Cn0KCgovKiBUaGlzIG1pZ2h0IGdvIGludCBhIHNlcGFyYXRlIG1vZHVsZSBldmVudHVhbGx5LiBJdCBpcyBhIG5ldHdvcmsgaW5wdXQgaGVscGVyIGNsYXNzLiAqLwoKaW1wb3J0IHN0ZC5zb2NrZXQ7CgovLyBpdCBpcyBhIGNsYXNzIHByaW1hcmlseSBmb3IgcmVmZXJlbmNlIHNlbWFudGljcwovLyBJIG1pZ2h0IGNoYW5nZSB0aGlzIGludGVyZmFjZQovLy8KY2xhc3MgQnVmZmVyZWRJbnB1dFJhbmdlIHsKCXZlcnNpb24oUG9zaXgpCgl0aGlzKGludCBzb3VyY2UsIHVieXRlW10gYnVmZmVyID0gbnVsbCkgewoJCXRoaXMobmV3IFNvY2tldChjYXN0KHNvY2tldF90KSBzb3VyY2UsIEFkZHJlc3NGYW1pbHkuSU5FVCksIGJ1ZmZlcik7Cgl9CgoJdGhpcyhTb2NrZXQgc291cmNlLCB1Ynl0ZVtdIGJ1ZmZlciA9IG51bGwpIHsKCQkvLyBpZiB0aGV5IGNvbm5lY3QgYnV0IG5ldmVyIHNlbmQgc3R1ZmYgdG8gdXMsIHdlIGRvbid0IHdhbnQgaXQgd2FzdGluZyB0aGUgcHJvY2VzcwoJCS8vIHNvIHNldHRpbmcgYSB0aW1lIG91dAoJCXNvdXJjZS5zZXRPcHRpb24oU29ja2V0T3B0aW9uTGV2ZWwuU09DS0VULCBTb2NrZXRPcHRpb24uUkNWVElNRU8sIGR1ciEic2Vjb25kcyIoMykpOwoJCXRoaXMuc291cmNlID0gc291cmNlOwoJCWlmKGJ1ZmZlciBpcyBudWxsKSB7CgkJCXVuZGVybHlpbmdCdWZmZXIgPSBuZXcgdWJ5dGVbNDA5Nl07CgkJCWFsbG93R3Jvd3RoID0gdHJ1ZTsKCQl9IGVsc2UgewoJCQl1bmRlcmx5aW5nQnVmZmVyID0gYnVmZmVyOwoJCX0KCgkJYXNzZXJ0KHVuZGVybHlpbmdCdWZmZXIubGVuZ3RoKTsKCgkJLy8gd2UgYXNzdW1lIHZpZXcucHRyIGlzIGFsd2F5cyBpbnNpZGUgdW5kZXJseWluZ0J1ZmZlcgoJCXZpZXcgPSB1bmRlcmx5aW5nQnVmZmVyWzAgLi4gMF07CgoJCXBvcEZyb250KCk7IC8vIHByaW1lCgl9CgoJLyoqCgkJQSBzbGlnaHQgZGlmZmVyZW5jZSBmcm9tIHJlZ3VsYXIgcmFuZ2VzIGlzIHlvdSBjYW4gZ2l2ZSBpdCB0aGUgbWF4aW11bQoJCW51bWJlciBvZiBieXRlcyB0byBjb25zdW1lLgoKCQlJTVBPUlRBTlQgTk9URTogdGhlIGRlZmF1bHQgaXMgdG8gY29uc3VtZSBub3RoaW5nLCBzbyBpZiB5b3UgZG9uJ3QgY2FsbAoJCWNvbnN1bWUoKSB5b3Vyc2VsZiBhbmQgdXNlIGEgcmVndWxhciBmb3JlYWNoLCBpdCB3aWxsIGluZmluaXRlbHkgbG9vcCEKCgkJVGhlIGRlZmF1bHQgaXMgdG8gZG8gd2hhdCBhIG5vcm1hbCByYW5nZSBkb2VzLCBhbmQgY29uc3VtZSB0aGUgd2hvbGUgYnVmZmVyCgkJYW5kIHdhaXQgZm9yIGFkZGl0aW9uYWwgaW5wdXQuCgoJCVlvdSBjYW4gYWxzbyBzcGVjaWZ5IDAsIHRvIGFwcGVuZCB0byB0aGUgYnVmZmVyLCBvciBhbnkgb3RoZXIgbnVtYmVyCgkJdG8gcmVtb3ZlIHRoZSBmcm9udCBuIGJ5dGVzIGFuZCB3YWl0IGZvciBtb3JlLgoJKi8KCXZvaWQgcG9wRnJvbnQoc2l6ZV90IG1heEJ5dGVzVG9Db25zdW1lID0gMCAvKnNpemVfdC5tYXgqLywgc2l6ZV90IG1pbkJ5dGVzVG9TZXR0bGVGb3IgPSAwLCBib29sIHNraXBDb25zdW1lID0gZmFsc2UpIHsKCQlpZihzb3VyY2VDbG9zZWQpCgkJCXRocm93IG5ldyBFeGNlcHRpb24oImNhbid0IGdldCBhbnkgbW9yZSBkYXRhIGZyb20gYSBjbG9zZWQgc291cmNlIik7CgkJaWYoIXNraXBDb25zdW1lKQoJCQljb25zdW1lKG1heEJ5dGVzVG9Db25zdW1lKTsKCgkJLy8gd2UgbWlnaHQgaGF2ZSB0byBncm93IHRoZSBidWZmZXIKCQlpZihtaW5CeXRlc1RvU2V0dGxlRm9yID4gdW5kZXJseWluZ0J1ZmZlci5sZW5ndGggfHwgdmlldy5sZW5ndGggPT0gdW5kZXJseWluZ0J1ZmZlci5sZW5ndGgpIHsKCQkJaWYoYWxsb3dHcm93dGgpIHsKCQkJCWF1dG8gdmlld1N0YXJ0ID0gdmlldy5wdHIgLSB1bmRlcmx5aW5nQnVmZmVyLnB0cjsKCQkJCXNpemVfdCBncm93dGggPSA0MDk2OwoJCQkJLy8gbWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIGZvciB3aGF0IHdlJ3JlIGJlaW5nIGFza2VkIGZvcgoJCQkJaWYobWluQnl0ZXNUb1NldHRsZUZvciAtIHVuZGVybHlpbmdCdWZmZXIubGVuZ3RoID4gZ3Jvd3RoKQoJCQkJCWdyb3d0aCA9IG1pbkJ5dGVzVG9TZXR0bGVGb3IgLSB1bmRlcmx5aW5nQnVmZmVyLmxlbmd0aDsKCQkJCXVuZGVybHlpbmdCdWZmZXIubGVuZ3RoICs9IGdyb3d0aDsKCQkJCXZpZXcgPSB1bmRlcmx5aW5nQnVmZmVyW3ZpZXdTdGFydCAuLiB2aWV3Lmxlbmd0aF07CgkJCX0gZWxzZQoJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm8gcm9vbSBsZWZ0IGluIHRoZSBidWZmZXIiKTsKCQl9CgoJCWRvIHsKCQkJYXV0byBmcmVlU3BhY2UgPSB1bmRlcmx5aW5nQnVmZmVyW3VuZGVybHlpbmdCdWZmZXIucHRyIC0gdmlldy5wdHIgKyB2aWV3Lmxlbmd0aCAuLiAkXTsKCQkJdHJ5X2FnYWluOgoJCQlhdXRvIHJldCA9IHNvdXJjZS5yZWNlaXZlKGZyZWVTcGFjZSk7CgkJCWlmKHJldCA9PSBTb2NrZXQuRVJST1IpIHsKCQkJCXZlcnNpb24oUG9zaXgpIHsKCQkJCQlpbXBvcnQgY29yZS5zdGRjLmVycm5vOwoJCQkJCWlmKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTikgewoJCQkJCQlnb3RvIHRyeV9hZ2FpbjsKCQkJCQl9CgkJCQl9CgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKGxhc3RTb2NrZXRFcnJvcik7IC8vIEZJWE1FCgkJCX0KCQkJaWYocmV0ID09IDApIHsKCQkJCXNvdXJjZUNsb3NlZCA9IHRydWU7CgkJCQlyZXR1cm47CgkJCX0KCgkJCXZpZXcgPSB1bmRlcmx5aW5nQnVmZmVyW3VuZGVybHlpbmdCdWZmZXIucHRyIC0gdmlldy5wdHIgLi4gdmlldy5sZW5ndGggKyByZXRdOwoJCX0gd2hpbGUodmlldy5sZW5ndGggPCBtaW5CeXRlc1RvU2V0dGxlRm9yKTsKCX0KCgkvLy8gUmVtb3ZlcyBuIGJ5dGVzIGZyb20gdGhlIGZyb250IG9mIHRoZSBidWZmZXIsIGFuZCByZXR1cm5zIHRoZSBuZXcgYnVmZmVyIHNsaWNlLgoJLy8vIFlvdSBtaWdodCB3YW50IHRvIGlkdXAgdGhlIGRhdGEgeW91IGFyZSBjb25zdW1pbmcgaWYgeW91IHN0b3JlIGl0LCBzaW5jZSBpdCBtYXkKCS8vLyBiZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV3IHBvcEZyb250LgoJLy8vCgkvLy8gWW91IGRvIG5vdCBuZWVkIHRvIGNhbGwgdGhpcyBpZiB5b3UgYWx3YXlzIHdhbnQgdG8gd2FpdCBmb3IgbW9yZSBkYXRhIHdoZW4geW91CgkvLy8gY29uc3VtZSBzb21lLgoJdWJ5dGVbXSBjb25zdW1lKHNpemVfdCBieXRlcykgewoJCXZpZXcgPSB2aWV3W2J5dGVzID4gJCA/ICQgOiBieXRlcyAuLiAkXTsKCQlpZih2aWV3Lmxlbmd0aCA9PSAwKSB7CgkJCXZpZXcgPSB1bmRlcmx5aW5nQnVmZmVyWzAgLi4gMF07IC8vIGdvIGFoZWFkIGFuZCByZXVzZSB0aGUgYmVnaW5uaW5nCgkJCS8qCgkJCXdyaXRlbG4oIkhFUkUiKTsKCQkJcG9wRnJvbnQoMCwgMCwgdHJ1ZSk7IC8vIHRyeSB0byBsb2FkIG1vcmUgaWYgd2UgY2FuLCBjaGVja3MgaWYgdGhlIHNvdXJjZSBpcyBjbG9zZWQKCQkJd3JpdGVsbihjYXN0KHN0cmluZylmcm9udCk7CgkJCXdyaXRlbG4oIkRPTkUiKTsKCQkJKi8KCQl9CgkJcmV0dXJuIGZyb250OwoJfQoKCWJvb2wgZW1wdHkoKSB7CgkJcmV0dXJuIHNvdXJjZUNsb3NlZCAmJiB2aWV3Lmxlbmd0aCA9PSAwOwoJfQoKCXVieXRlW10gZnJvbnQoKSB7CgkJcmV0dXJuIHZpZXc7Cgl9CgoJaW52YXJpYW50KCkgewoJCWFzc2VydCh2aWV3LnB0ciA+PSB1bmRlcmx5aW5nQnVmZmVyLnB0cik7CgkJLy8gaXQgc2hvdWxkIG5ldmVyIGJlIGVxdWFsLCBzaW5jZSBpZiB0aGF0IGhhcHBlbnMgdmlldyBvdWdodCB0byBiZSBlbXB0eSwgYW5kIHRodXMgcmV1c2luZyB0aGUgYnVmZmVyCgkJYXNzZXJ0KHZpZXcucHRyIDwgdW5kZXJseWluZ0J1ZmZlci5wdHIgKyB1bmRlcmx5aW5nQnVmZmVyLmxlbmd0aCk7Cgl9CgoJdWJ5dGVbXSB1bmRlcmx5aW5nQnVmZmVyOwoJYm9vbCBhbGxvd0dyb3d0aDsKCXVieXRlW10gdmlldzsKCVNvY2tldCBzb3VyY2U7Cglib29sIHNvdXJjZUNsb3NlZDsKfQoKY2xhc3MgQ29ubmVjdGlvblRocmVhZDIgOiBUaHJlYWQgewoJaW1wb3J0IHN0ZC5jb25jdXJyZW5jeTsKCXRoaXModm9pZCBmdW5jdGlvbihTb2NrZXQpIGhhbmRsZXIpIHsKCQl0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOwoJCXN1cGVyKCZydW4pOwoJfQoKCXZvaWQgcnVuKCkgewoJCXRpZCA9IHRoaXNUaWQoKTsKCQlhdmFpbGFibGUgPSB0cnVlOwoJCXdoaWxlKHRydWUpCgkJcmVjZWl2ZSgKCQkJKC8qU29ja2V0Ki8gc2l6ZV90IHMpIHsKCQkJCWF2YWlsYWJsZSA9IGZhbHNlOwoJCQkJdHJ5IHsKCQkJCQloYW5kbGVyKGNhc3QoU29ja2V0KSBjYXN0KHZvaWQqKSBzKTsKCQkJCX0gY2F0Y2goVGhyb3dhYmxlIHQpIHt9CgkJCQlhdmFpbGFibGUgPSB0cnVlOwoJCQl9CgkJKTsKCX0KCglib29sIGF2YWlsYWJsZTsKCVRpZCB0aWQ7Cgl2b2lkIGZ1bmN0aW9uKFNvY2tldCkgaGFuZGxlcjsKfQoKLyoqCglUbyB1c2UgdGhpcyB0aGluZzoKCgl2b2lkIGhhbmRsZXIoU29ja2V0IHMpIHsgZG8gc29tZXRoaW5nLi4uIH0KCWF1dG8gbWFuYWdlciA9IG5ldyBMaXN0ZW5pbmdDb25uZWN0aW9uTWFuYWdlcigiMTI3LjAuMC4xIiwgODAsICZoYW5kbGVyKTsKCW1hbmFnZXIubGlzdGVuKCk7CgoJSSBzdWdnZXN0IHlvdSB1c2UgQnVmZmVyZWRJbnB1dFJhbmdlKGNvbm5lY3Rpb24pIHRvIGhhbmRsZSB0aGUgaW5wdXQuIEFzIGEgcGFja2V0Cgljb21lcyBpbiwgeW91IHdpbGwgZ2V0IGNvbnRyb2wuIFlvdSBjYW4ganVzdCBjb250aW51ZTsgdGhvdWdoIHRvIGZldGNoIG1vcmUuCgoKCUZJWE1FOiBzaG91bGQgSSBvZmZlciBhbiBldmVudCBiYXNlZCBhc3luYyB0aGluZyBsaWtlIG5ldG1hbiBkaWQgdG9vPyBZZWFoLCBwcm9iYWJseS4KKi8KY2xhc3MgTGlzdGVuaW5nQ29ubmVjdGlvbk1hbmFnZXIgewoJdm9pZCBsaXN0ZW4oKSB7CgkJdmVyc2lvbihjZ2lfbXVsdGlwbGVfY29ubmVjdGlvbnNfcGVyX3RocmVhZCkgewoJCQlpbXBvcnQgc3RkLmNvbmN1cnJlbmN5OwoJCQlpbXBvcnQgc3RkLnJhbmRvbTsKCQkJQ29ubmVjdGlvblRocmVhZDJbMTZdIHBvb2w7CgkJCWZvcmVhY2gocmVmIHA7IHBvb2wpIHsKCQkJCSBwID0gbmV3IENvbm5lY3Rpb25UaHJlYWQyKGhhbmRsZXIpOwoJCQkJIHAuc3RhcnQoKTsKCQkJfQoKCQkJd2hpbGUodHJ1ZSkgewoJCQkJYXV0byBjb25uZWN0aW9uID0gbGlzdGVuZXIuYWNjZXB0KCk7CgoJCQkJYm9vbCBoYW5kbGVkID0gZmFsc2U7CgkJCQlyZXRyeToKCQkJCWZvcmVhY2gocDsgcG9vbCkKCQkJCQlpZihwLmF2YWlsYWJsZSkgewoJCQkJCQloYW5kbGVkID0gdHJ1ZTsKCQkJCQkJc2VuZChwLnRpZCwgY2FzdChzaXplX3QpIGNhc3Qodm9pZCopIGNvbm5lY3Rpb24pOwoJCQkJCQlicmVhazsKCQkJCQl9CgoJCQkJLy8gbm9uZSBhdmFpbGFibGUgcmlnaHQgbm93LCBtYWtlIGl0IHdhaXQgYSBiaXQgdGhlbiB0cnkgYWdhaW4KCQkJCWlmKCFoYW5kbGVkKSB7CgkJCQkJVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKDI1KSk7CgkJCQkJZ290byByZXRyeTsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCWZvcmVhY2goY29ubmVjdGlvbjsgdGhpcykKCQkJCWhhbmRsZXIoY29ubmVjdGlvbik7CgkJCQkKCQl9Cgl9CgoJdGhpcyhzdHJpbmcgaG9zdCwgdXNob3J0IHBvcnQsIHZvaWQgZnVuY3Rpb24oU29ja2V0KSBoYW5kbGVyKSB7CgkJdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKCQlsaXN0ZW5lciA9IG5ldyBUY3BTb2NrZXQoKTsKCQlsaXN0ZW5lci5zZXRPcHRpb24oU29ja2V0T3B0aW9uTGV2ZWwuU09DS0VULCBTb2NrZXRPcHRpb24uUkVVU0VBRERSLCB0cnVlKTsKCQlsaXN0ZW5lci5iaW5kKGhvc3QubGVuZ3RoID8gcGFyc2VBZGRyZXNzKGhvc3QsIHBvcnQpIDogbmV3IEludGVybmV0QWRkcmVzcyhwb3J0KSk7CgkJbGlzdGVuZXIubGlzdGVuKDEyOCk7Cgl9CgoJU29ja2V0IGxpc3RlbmVyOwoJdm9pZCBmdW5jdGlvbihTb2NrZXQpIGhhbmRsZXI7CgoJYm9vbCBydW5uaW5nOwoJdm9pZCBxdWl0KCkgewoJCXJ1bm5pbmcgPSBmYWxzZTsKCX0KCglpbnQgb3BBcHBseShzY29wZSBDTVQgZGcpIHsKCQlydW5uaW5nID0gdHJ1ZTsKCQlzaGFyZWQoaW50KSBsb29wQnJva2VuOwoKCQl3aGlsZSghbG9vcEJyb2tlbiAmJiBydW5uaW5nKSB7CgkJCWF1dG8gc24gPSBsaXN0ZW5lci5hY2NlcHQoKTsKCQkJdHJ5IHsKCQkJCXZlcnNpb24oY2dpX25vX3RocmVhZHMpIHsKCQkJCQkvLyBORVZFUiBVU0UgVEhJUwoJCQkJCS8vIGl0IGV4aXN0cyBvbmx5IGZvciBkZWJ1Z2dpbmcgYW5kIG90aGVyIHNwZWNpYWwgb2NjYXNpb25zCgoJCQkJCS8vIHRoZSB0aHJlYWQgbW9kZSBpcyBmYXN0ZXIgYW5kIGxlc3MgbGlrZWx5IHRvIHN0YWxsIHRoZSB3aG9sZQoJCQkJCS8vIHRoaW5nIHdoZW4gYSByZXF1ZXN0IGlzIHNsb3cKCQkJCQlkZyhzbik7CgkJCQl9IGVsc2UgewoJCQkJCS8qCgkJCQkJdmVyc2lvbihjZ2lfbXVsdGlwbGVfY29ubmVjdGlvbnNfcGVyX3RocmVhZCkgewoJCQkJCQlib29sIGZvdW5kT25lID0gZmFsc2U7CgkJCQkJCXRyeUFnYWluOgoJCQkJCQlmb3JlYWNoKHQ7IHBvb2wpCgkJCQkJCQlpZih0LnMgaXMgbnVsbCkgewoJCQkJCQkJCXQucyA9IHNuOwoJCQkJCQkJCWZvdW5kT25lID0gdHJ1ZTsKCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKDEpKTsKCQkJCQkJaWYoIWZvdW5kT25lKQoJCQkJCQkJZ290byB0cnlBZ2FpbjsKCQkJCQl9IGVsc2UgewoJCQkJCSovCgkJCQkJCWF1dG8gdGhyZWFkID0gbmV3IENvbm5lY3Rpb25UaHJlYWQoc24sICZsb29wQnJva2VuLCBkZyk7CgkJCQkJCXRocmVhZC5zdGFydCgpOwoJCQkJCS8vfQoJCQkJfQoJCQkJLy8gbG9vcEJyb2tlbiA9IGRnKHNuKTsKCQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewoJCQkJLy8gaWYgYSBjb25uZWN0aW9uIGdvZXMgd3JvbmcsIHdlIHdhbnQgdG8ganVzdCBzYXkgbm8sIGJ1dCB0cnkgdG8gY2Fycnkgb24gdW5sZXNzIGl0IGlzIGFuIEVycm9yIG9mIHNvbWUgc29ydCAoaW4gd2hpY2ggY2FzZSwgd2UnbGwgZGllLiBZb3UgbWlnaHQgd2FudCBhbiBleHRlcm5hbCBoZWxwZXIgcHJvZ3JhbSB0byByZXZpdmUgdGhlIHNlcnZlciB3aGVuIGl0IGRpZXMpCgkJCQlzbi5jbG9zZSgpOwoJCQl9CgkJfQoKCQlyZXR1cm4gbG9vcEJyb2tlbjsKCX0KfQoKLy8gaGVscGVyIGZ1bmN0aW9uIHRvIHNlbmQgYSBsb3QgdG8gYSBzb2NrZXQuIFNpbmNlIHRoaXMgYmxvY2tzIGZvciB0aGUgYnVmZmVyIChwb3NzaWJseSBzZXZlcmFsIHRpbWVzKSwgeW91IHNob3VsZCBwcm9iYWJseSBjYWxsIGl0IGluIGEgc2VwYXJhdGUgdGhyZWFkIG9yIHNvbWV0aGluZy4Kdm9pZCBzZW5kQWxsKFNvY2tldCBzLCBjb25zdCh2b2lkKVtdIGRhdGEsIHN0cmluZyBmaWxlID0gX19GSUxFX18sIHNpemVfdCBsaW5lID0gX19MSU5FX18pIHsKCWlmKGRhdGEubGVuZ3RoID09IDApIHJldHVybjsKCXB0cmRpZmZfdCBhbW91bnQ7CglkbyB7CgkJYW1vdW50ID0gcy5zZW5kKGRhdGEpOwoJCWlmKGFtb3VudCA9PSBTb2NrZXQuRVJST1IpCgkJCXRocm93IG5ldyBDb25uZWN0aW9uRXhjZXB0aW9uKHMsIGxhc3RTb2NrZXRFcnJvciwgZmlsZSwgbGluZSk7CgkJYXNzZXJ0KGFtb3VudCA+IDApOwoJCWRhdGEgPSBkYXRhW2Ftb3VudCAuLiAkXTsKCX0gd2hpbGUoZGF0YS5sZW5ndGgpOwp9CgpjbGFzcyBDb25uZWN0aW9uRXhjZXB0aW9uIDogRXhjZXB0aW9uIHsKCVNvY2tldCBzb2NrZXQ7Cgl0aGlzKFNvY2tldCBzLCBzdHJpbmcgbXNnLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fKSB7CgkJdGhpcy5zb2NrZXQgPSBzOwoJCXN1cGVyKG1zZywgZmlsZSwgbGluZSk7Cgl9Cn0KCmFsaWFzIGludCBkZWxlZ2F0ZShTb2NrZXQpIENNVDsKCmltcG9ydCBjb3JlLnRocmVhZDsKY2xhc3MgQ29ubmVjdGlvblRocmVhZCA6IFRocmVhZCB7Cgl0aGlzKFNvY2tldCBzLCBzaGFyZWQoaW50KSogYnJlYWtTaWduaWZpZXIsIENNVCBkZykgewoJCXRoaXMucyA9IHM7CgkgCXRoaXMuYnJlYWtTaWduaWZpZXIgPSBicmVha1NpZ25pZmllcjsKCQl0aGlzLmRnID0gZGc7CgkJc3VwZXIoJnJ1bkFsbCk7Cgl9CgoJdm9pZCBydW5BbGwoKSB7CgkJaWYocyAhaXMgbnVsbCkKCQkJcnVuKCk7CgkJLyoKCQl2ZXJzaW9uKGNnaV9tdWx0aXBsZV9jb25uZWN0aW9uc19wZXJfdGhyZWFkKSB7CgkJCXdoaWxlKDEpIHsKCQkJCXdoaWxlKHMgaXMgbnVsbCkKCQkJCQlzbGVlcChkdXIhIm1zZWNzIigxKSk7CgkJCQlydW4oKTsKCQkJfQoJCX0KCQkqLwoJfQoKCXZvaWQgcnVuKCkgewoJCXNjb3BlKGV4aXQpIHsKCQkJLy8gSSBkb24ndCB3YW50IHRvIGRvdWJsZSBjbG9zZSBpdCwgYW5kIGl0IGRvZXMgdGhpcyBvbiBjbG9zZSgpIGFjY29yZGluZyB0byBzb3VyY2UKCQkJLy8gbWlnaHQgYmUgZnJhZ2lsZSwgYnV0IG1laAoJCQlpZihzLmhhbmRsZSgpICE9IHNvY2tldF90LmluaXQpCgkJCQlzLmNsb3NlKCk7CgkJCXMgPSBudWxsOyAvLyBzbyB3ZSBrbm93IHRoaXMgdGhyZWFkIGlzIGNsZWFyCgkJfQoJCWlmKGF1dG8gcmVzdWx0ID0gZGcocykpIHsKCQkJKmJyZWFrU2lnbmlmaWVyID0gcmVzdWx0OwoJCX0KCX0KCglTb2NrZXQgczsKCXNoYXJlZChpbnQpKiBicmVha1NpZ25pZmllcjsKCUNNVCBkZzsKfQoKLyogRG9uZSB3aXRoIG5ldHdvcmsgaGVscGVyICovCgovKiBIZWxwZXJzIGZvciBkb2luZyB0ZW1wb3JhcnkgZmlsZXMuIFVzZWQgYm90aCBoZXJlIGFuZCBpbiB3ZWIuZCAqLwoKdmVyc2lvbihXaW5kb3dzKSB7CglpbXBvcnQgY29yZS5zeXMud2luZG93cy53aW5kb3dzOwoJZXh0ZXJuKFdpbmRvd3MpIERXT1JEIEdldFRlbXBQYXRoVyhEV09SRCwgTFBXU1RSKTsKCWFsaWFzIEdldFRlbXBQYXRoVyBHZXRUZW1wUGF0aDsKfQoKdmVyc2lvbihQb3NpeCkgewoJc3RhdGljIGltcG9ydCBsaW51eCA9IGNvcmUuc3lzLnBvc2l4LnVuaXN0ZDsKfQoKc3RyaW5nIGdldFRlbXBEaXJlY3RvcnkoKSB7CglzdHJpbmcgcGF0aDsKCXZlcnNpb24oV2luZG93cykgewoJCXdjaGFyWzEwMjRdIGJ1ZmZlcjsKCQlhdXRvIGxlbiA9IEdldFRlbXBQYXRoKDEwMjQsIGJ1ZmZlci5wdHIpOwoJCWlmKGxlbiA9PSAwKQoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJjb3VsZG4ndCBmaW5kIGEgdGVtcG9yYXJ5IHBhdGgiKTsKCgkJYXV0byBiID0gYnVmZmVyWzAgLi4gbGVuXTsKCgkJcGF0aCA9IHRvIXN0cmluZyhiKTsKCX0gZWxzZQoJCXBhdGggPSAiL3RtcC8iOwoKCXJldHVybiBwYXRoOwp9CgoKLy8gSSBsaWtlIHN0ZC5kYXRlLiBUaGVzZSBmdW5jdGlvbnMgaGVscCBrZWVwIG15IG9sZCBjb2RlIGFuZCBkYXRhIHdvcmtpbmcgd2l0aCBwaG9ib3MgY2hhbmdpbmcuCgpsb25nIHN5c1RpbWVUb0RUaW1lKGluIFN5c1RpbWUgc3lzVGltZSkgewogICAgcmV0dXJuIGNvbnZlcnQhKCJobnNlY3MiLCAibXNlY3MiKShzeXNUaW1lLnN0ZFRpbWUgLSA2MjEzNTU5NjgwMDAwMDAwMDBMKTsKfQoKbG9uZyBkYXRlVGltZVRvRFRpbWUoaW4gRGF0ZVRpbWUgZHQpIHsKCXJldHVybiBzeXNUaW1lVG9EVGltZShjYXN0KFN5c1RpbWUpIGR0KTsKfQoKbG9uZyBnZXRVdGNUaW1lKCkgeyAvLyByZW5hbWVkIHByaW1hcmlseSB0byBhdm9pZCBjb25mbGljdCB3aXRoIHN0ZC5kYXRlIGl0c2VsZgoJcmV0dXJuIHN5c1RpbWVUb0RUaW1lKENsb2NrLmN1cnJUaW1lKFVUQygpKSk7Cn0KCi8vIE5PVEU6IG5ldyBTaW1wbGVUaW1lWm9uZShtaW51dGVzKTsgY2FuIHBlcmhhcHMgd29yayB3aXRoIHRoZSBnZXRUaW1lem9uZU9mZnNldCgpIEpTIHRyaWNrClN5c1RpbWUgZFRpbWVUb1N5c1RpbWUobG9uZyBkVGltZSwgaW1tdXRhYmxlIFRpbWVab25lIHR6ID0gbnVsbCkgewoJaW1tdXRhYmxlIGhuc2VjcyA9IGNvbnZlcnQhKCJtc2VjcyIsICJobnNlY3MiKShkVGltZSkgKyA2MjEzNTU5NjgwMDAwMDAwMDBMOwoJcmV0dXJuIFN5c1RpbWUoaG5zZWNzLCB0eik7Cn0KCgoKLy8gdGhpcyBpcyBhIGhlbHBlciB0byByZWFkIEhUVFAgdHJhbnNmZXItZW5jb2Rpbmc6IGNodW5rZWQgcmVzcG9uc2VzCmltbXV0YWJsZSh1Ynl0ZVtdKSBkZWNodW5rKEJ1ZmZlcmVkSW5wdXRSYW5nZSBpcikgewoJaW1tdXRhYmxlKHVieXRlKVtdIHJldDsKCglhbm90aGVyX2NodW5rOgoJLy8gSWYgaGVyZSwgd2UgYXJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjaHVuay4KCWF1dG8gYSA9IGlyLmZyb250KCk7CglpbnQgY2h1bmtTaXplOwoJaW50IGxvYyA9IGxvY2F0aW9uT2YoYSwgIlxyXG4iKTsKCXdoaWxlKGxvYyA9PSAtMSkgewoJCWlyLnBvcEZyb250KCk7CgkJYSA9IGlyLmZyb250KCk7CgkJbG9jID0gbG9jYXRpb25PZihhLCAiXHJcbiIpOwoJfQoKCXN0cmluZyBoZXg7CgloZXggPSAiIjsKCWZvcihpbnQgaSA9IDA7IGkgPCBsb2M7IGkrKykgewoJCWNoYXIgYyA9IGFbaV07CgkJaWYoYyA+PSAnQScgJiYgYyA8PSAnWicpCgkJCWMgKz0gMHgyMDsKCQlpZigoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IChjID49ICdhJyAmJiBjIDw9ICd6JykpIHsKCQkJaGV4IH49IGM7CgkJfSBlbHNlIHsKCQkJYnJlYWs7CgkJfQoJfQoKCWFzc2VydChoZXgubGVuZ3RoKTsKCglpbnQgcG93ZXIgPSAxOwoJaW50IHNpemUgPSAwOwoJZm9yZWFjaChjYzE7IHJldHJvKGhleCkpIHsKCQlkY2hhciBjYyA9IGNjMTsKCQlpZihjYyA+PSAnYScgJiYgY2MgPD0gJ3onKQoJCQljYyAtPSAweDIwOwoJCWludCB2YWwgPSAwOwoJCWlmKGNjID49ICcwJyAmJiBjYyA8PSAnOScpCgkJCXZhbCA9IGNjIC0gJzAnOwoJCWVsc2UKCQkJdmFsID0gY2MgLSAnQScgKyAxMDsKCgkJc2l6ZSArPSBwb3dlciAqIHZhbDsKCQlwb3dlciAqPSAxNjsKCX0KCgljaHVua1NpemUgPSBzaXplOwoJYXNzZXJ0KHNpemUgPj0gMCk7CgoJaWYobG9jICsgMiA+IGEubGVuZ3RoKSB7CgkJaXIucG9wRnJvbnQoMCwgYS5sZW5ndGggKyBsb2MgKyAyKTsKCQlhID0gaXIuZnJvbnQoKTsKCX0KCglhID0gaXIuY29uc3VtZShsb2MgKyAyKTsKCglpZihjaHVua1NpemUgPT0gMCkgeyAvLyB3ZSdyZSBkb25lIHdpdGggdGhlIHJlc3BvbnNlCgkJLy8gaWYgd2UgZ290IGhlcmUsIHdpbGwgY2hhbmdlIG11c3QgYmUgdHJ1ZS4uLi4KCQltb3JlX2Zvb3RlcnM6CgkJbG9jID0gbG9jYXRpb25PZihhLCAiXHJcbiIpOwoJCWlmKGxvYyA9PSAtMSkgewoJCQlpci5wb3BGcm9udCgpOwoJCQlhID0gaXIuZnJvbnQ7CgkJCWdvdG8gbW9yZV9mb290ZXJzOwoJCX0gZWxzZSB7CgkJCWFzc2VydChsb2MgPT0gMCk7CgkJCWlyLmNvbnN1bWUobG9jICsgMik7CgkJCWdvdG8gZmluaXNoOwoJCX0KCX0gZWxzZSB7CgkJLy8gaWYgd2UgZ290IGhlcmUsIHdpbGwgY2hhbmdlIG11c3QgYmUgdHJ1ZS4uLi4KCQlpZihhLmxlbmd0aCA8IGNodW5rU2l6ZSArIDIpIHsKCQkJaXIucG9wRnJvbnQoMCwgY2h1bmtTaXplICsgMik7CgkJCWEgPSBpci5mcm9udCgpOwoJCX0KCgkJcmV0IH49IChhWzAuLmNodW5rU2l6ZV0pOwoKCQlpZighKGEubGVuZ3RoID4gY2h1bmtTaXplICsgMikpIHsKCQkJaXIucG9wRnJvbnQoMCwgY2h1bmtTaXplICsgMik7CgkJCWEgPSBpci5mcm9udCgpOwoJCX0KCQlhc3NlcnQoYVtjaHVua1NpemVdID09IDEzKTsKCQlhc3NlcnQoYVtjaHVua1NpemUrMV0gPT0gMTApOwoJCWEgPSBpci5jb25zdW1lKGNodW5rU2l6ZSArIDIpOwoJCWNodW5rU2l6ZSA9IDA7CgkJZ290byBhbm90aGVyX2NodW5rOwoJfQoKCWZpbmlzaDoKCXJldHVybiByZXQ7Cn0KCi8vIEkgd2FudCB0byBiZSBhYmxlIHRvIGdldCBkYXRhIGZyb20gbXVsdGlwbGUgc291cmNlcyB0aGUgc2FtZSB3YXkuLi4KaW50ZXJmYWNlIEJ5Q2h1bmtSYW5nZSB7Cglib29sIGVtcHR5KCk7Cgl2b2lkIHBvcEZyb250KCk7Cgljb25zdCh1Ynl0ZSlbXSBmcm9udCgpOwp9CgpCeUNodW5rUmFuZ2UgYnlDaHVuayhjb25zdCh1Ynl0ZSlbXSBkYXRhKSB7CglyZXR1cm4gbmV3IGNsYXNzIEJ5Q2h1bmtSYW5nZSB7CgkJb3ZlcnJpZGUgYm9vbCBlbXB0eSgpIHsKCQkJcmV0dXJuICFkYXRhLmxlbmd0aDsKCQl9CgoJCW92ZXJyaWRlIHZvaWQgcG9wRnJvbnQoKSB7CgkJCWlmKGRhdGEubGVuZ3RoID4gNDA5NikKCQkJCWRhdGEgPSBkYXRhWzQwOTYgLi4gJF07CgkJCWVsc2UKCQkJCWRhdGEgPSBudWxsOwoJCX0KCgkJb3ZlcnJpZGUgY29uc3QodWJ5dGUpW10gZnJvbnQoKSB7CgkJCXJldHVybiBkYXRhWzAgLi4gJCA+IDQwOTYgPyA0MDk2IDogJF07CgkJfQoJfTsKfQoKQnlDaHVua1JhbmdlIGJ5Q2h1bmsoQnVmZmVyZWRJbnB1dFJhbmdlIGlyLCBzaXplX3QgYXRNb3N0KSB7Cgljb25zdCh1Ynl0ZSlbXSBmOwoKCWYgPSBpci5mcm9udDsKCWlmKGYubGVuZ3RoID4gYXRNb3N0KQoJCWYgPSBmWzAgLi4gYXRNb3N0XTsKCglyZXR1cm4gbmV3IGNsYXNzIEJ5Q2h1bmtSYW5nZSB7CgkJb3ZlcnJpZGUgYm9vbCBlbXB0eSgpIHsKCQkJcmV0dXJuIGF0TW9zdCA9PSAwOwoJCX0KCgkJb3ZlcnJpZGUgY29uc3QodWJ5dGUpW10gZnJvbnQoKSB7CgkJCXJldHVybiBmOwoJCX0KCgkJb3ZlcnJpZGUgdm9pZCBwb3BGcm9udCgpIHsKCQkJaXIuY29uc3VtZShmLmxlbmd0aCk7CgkJCWF0TW9zdCAtPSBmLmxlbmd0aDsKCQkJYXV0byBhID0gaXIuZnJvbnQoKTsKCgkJCWlmKGEubGVuZ3RoIDw9IGF0TW9zdCkgewoJCQkJZiA9IGE7CgkJCQlhdE1vc3QgLT0gYS5sZW5ndGg7CgkJCQlhID0gaXIuY29uc3VtZShhLmxlbmd0aCk7CgkJCQlpZihhdE1vc3QgIT0gMCkKCQkJCQlpci5wb3BGcm9udCgpOwoJCQkJaWYoZi5sZW5ndGggPT0gMCkgewoJCQkJCWYgPSBpci5mcm9udCgpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJLy8gd2UgYWN0dWFsbHkgaGF2ZSAqbW9yZSogaGVyZSB0aGFuIHdlIG5lZWQuLi4uCgkJCQlmID0gYVswLi5hdE1vc3RdOwoJCQkJYXRNb3N0ID0gMDsKCQkJCWlyLmNvbnN1bWUoYXRNb3N0KTsKCQkJfQoJCX0KCX07Cn0KCnZlcnNpb24oY2dpX3dpdGhfd2Vic29ja2V0KSB7CgkvLyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NDU1CgoJLyoqCgkJV0VCU09DS0VUIFNVUFBPUlQ6CgoJCUZ1bGwgZXhhbXBsZToKCQktLS0KCQkJaW1wb3J0IGFyc2QuY2dpOwoKCQkJdm9pZCB3ZWJzb2NrZXRFY2hvKENnaSBjZ2kpIHsKCQkJCWlmKGNnaS53ZWJzb2NrZXRSZXF1ZXN0ZWQoKSkgewoJCQkJCWlmKGNnaS5vcmlnaW4gIT0gImh0dHA6Ly9hcnNkbmV0Lm5ldCIpCgkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oImJhZCBvcmlnaW4iKTsKCQkJCQlhdXRvIHdlYnNvY2tldCA9IGNnaS5hY2NlcHRXZWJzb2NrZXQoKTsKCgkJCQkJd2Vic29ja2V0LnNlbmQoImhlbGxvIik7CgkJCQkJd2Vic29ja2V0LnNlbmQoIiB3b3JsZCEiKTsKCgkJCQkJYXV0byBtc2cgPSB3ZWJzb2NrZXQucmVjdigpOwoJCQkJCXdoaWxlKG1zZy5vcGNvZGUgIT0gV2ViU29ja2V0T3Bjb2RlLmNsb3NlKSB7CgkJCQkJCWlmKG1zZy5vcGNvZGUgPT0gV2ViU29ja2V0T3Bjb2RlLnRleHQpIHsKCQkJCQkJCXdlYnNvY2tldC5zZW5kKG1zZy50ZXh0RGF0YSk7CgkJCQkJCX0gZWxzZSBpZihtc2cub3Bjb2RlID09IFdlYlNvY2tldE9wY29kZS5iaW5hcnkpIHsKCQkJCQkJCXdlYnNvY2tldC5zZW5kKG1zZy5kYXRhKTsKCQkJCQkJfQoKCQkJCQkJbXNnID0gd2Vic29ja2V0LnJlY3YoKTsKCQkJCQl9CgoJCQkJCXdlYnNvY2tldC5jbG9zZSgpOwoJCQkJfSBlbHNlIGFzc2VydCgwLCAiaSB3YW50IGEgd2ViIHNvY2tldCEiKTsKCQkJfQoKCQkJbWl4aW4gR2VuZXJpY01haW4hd2Vic29ja2V0RWNobzsKCQktLS0KCSovCgoJY2xhc3MgV2ViU29ja2V0IHsKCQlDZ2kgY2dpOwoKCQlwcml2YXRlIHRoaXMoQ2dpIGNnaSkgewoJCQl0aGlzLmNnaSA9IGNnaTsKCQl9CgoJCS8vIHJldHVybnMgdHJ1ZSBpZiBkYXRhIGF2YWlsYWJsZSwgZmFsc2UgaWYgaXQgdGltZWQgb3V0CgkJYm9vbCByZWN2QXZhaWxhYmxlKER1cmF0aW9uIHRpbWVvdXQgPSBkdXIhIm1zZWNzIigwKSkgewoJCQlTb2NrZXQgc29ja2V0ID0gY2dpLmlkbG9sLnNvdXJjZTsKCgkJCWF1dG8gY2hlY2sgPSBuZXcgU29ja2V0U2V0KCk7CgkJCWNoZWNrLmFkZChzb2NrZXQpOwoKCQkJYXV0byBnb3QgPSBTb2NrZXQuc2VsZWN0KGNoZWNrLCBudWxsLCBudWxsLCB0aW1lb3V0KTsKCQkJaWYoZ290ID4gMCkKCQkJCXJldHVybiB0cnVlOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkvLyBub3RlOiB0aGlzIGJsb2NrcwoJCVdlYlNvY2tldE1lc3NhZ2UgcmVjdigpIHsKCQkJLy8gRklYTUU6IHNob3VsZCB3ZSBhdXRvbWF0aWNhbGx5IGhhbmRsZSBwaW5ncyBhbmQgcG9uZ3M/CgkJCWFzc2VydCghY2dpLmlkbG9sLmVtcHR5KCkpOwoJCQljZ2kuaWRsb2wucG9wRnJvbnQoMCk7CgoJCQlXZWJTb2NrZXRNZXNzYWdlIG1lc3NhZ2U7CgoJCQlhdXRvIGluZm8gPSBjZ2kuaWRsb2wuZnJvbnQoKTsKCgkJCS8vIEZJWE1FOiByZWFkIHNob3VsZCBwcm9sbHkgdGFrZSB0aGUgd2hvbGUgcmFuZ2Ugc28gaXQgY2FuIHJlcXVlc3QgbW9yZSBpZiBuZWVkZWQKCQkJLy8gcmVhZCBzaG91bGQgYWxzbyBnbyBhaGVhZCBhbmQgY29uc3VtZSB0aGUgcmFuZ2UKCQkJbWVzc2FnZSA9IFdlYlNvY2tldE1lc3NhZ2UucmVhZChpbmZvKTsKCgkJCWNnaS5pZGxvbC5jb25zdW1lKGluZm8ubGVuZ3RoKTsKCgkJCXJldHVybiBtZXNzYWdlOwoJCX0KCgkJdm9pZCBzZW5kKGluIGNoYXJbXSB0ZXh0KSB7CgkJCS8vIEkgY2FzdCBhd2F5IGNvbnN0IGhlcmUgYmVjYXVzZSBJIGtub3cgdGhpcyBtc2cgaXMgcHJpdmF0ZSBhbmQgaXQgZG9lc24ndCB3cml0ZQoJCQkvLyB0byB0aGF0IGJ1ZmZlciB1bmxlc3MgbWFza2luZyBpcyBzZXQuLi4gd2hpY2ggaXQgaXNuJ3QsIHNvIHdlJ3JlIG9rLgoJCQlhdXRvIG1zZyA9IFdlYlNvY2tldE1lc3NhZ2Uuc2ltcGxlTWVzc2FnZShXZWJTb2NrZXRPcGNvZGUudGV4dCwgY2FzdCh2b2lkW10pIHRleHQpOwoJCQltc2cuc2VuZChjZ2kpOwoJCX0KCgkJdm9pZCBzZW5kKGluIHVieXRlW10gYmluYXJ5KSB7CgkJCS8vIEkgY2FzdCBhd2F5IGNvbnN0IGhlcmUgYmVjYXVzZSBJIGtub3cgdGhpcyBtc2cgaXMgcHJpdmF0ZSBhbmQgaXQgZG9lc24ndCB3cml0ZQoJCQkvLyB0byB0aGF0IGJ1ZmZlciB1bmxlc3MgbWFza2luZyBpcyBzZXQuLi4gd2hpY2ggaXQgaXNuJ3QsIHNvIHdlJ3JlIG9rLgoJCQlhdXRvIG1zZyA9IFdlYlNvY2tldE1lc3NhZ2Uuc2ltcGxlTWVzc2FnZShXZWJTb2NrZXRPcGNvZGUuYmluYXJ5LCBjYXN0KHZvaWRbXSkgYmluYXJ5KTsKCQkJbXNnLnNlbmQoY2dpKTsKCQl9CgoJCXZvaWQgY2xvc2UoKSB7CgkJCWF1dG8gbXNnID0gV2ViU29ja2V0TWVzc2FnZS5zaW1wbGVNZXNzYWdlKFdlYlNvY2tldE9wY29kZS5jbG9zZSwgbnVsbCk7CgkJCW1zZy5zZW5kKGNnaSk7CgkJfQoKCQl2b2lkIHBpbmcoKSB7CgkJCWF1dG8gbXNnID0gV2ViU29ja2V0TWVzc2FnZS5zaW1wbGVNZXNzYWdlKFdlYlNvY2tldE9wY29kZS5waW5nLCBudWxsKTsKCQkJbXNnLnNlbmQoY2dpKTsKCQl9CgoJCXZvaWQgcG9uZygpIHsKCQkJYXV0byBtc2cgPSBXZWJTb2NrZXRNZXNzYWdlLnNpbXBsZU1lc3NhZ2UoV2ViU29ja2V0T3Bjb2RlLnBvbmcsIG51bGwpOwoJCQltc2cuc2VuZChjZ2kpOwoJCX0KCX0KCglib29sIHdlYnNvY2tldFJlcXVlc3RlZChDZ2kgY2dpKSB7CgkJcmV0dXJuCgkJCSJzZWMtd2Vic29ja2V0LWtleSIgaW4gY2dpLnJlcXVlc3RIZWFkZXJzCgkJCSYmCgkJCSJjb25uZWN0aW9uIiBpbiBjZ2kucmVxdWVzdEhlYWRlcnMgJiYKCQkJCWNnaS5yZXF1ZXN0SGVhZGVyc1siY29ubmVjdGlvbiJdLnRvTG93ZXIoKS5pbmRleE9mKCJ1cGdyYWRlIikgIT0gLTEKCQkJJiYKCQkJInVwZ3JhZGUiIGluIGNnaS5yZXF1ZXN0SGVhZGVycyAmJgoJCQkJY2dpLnJlcXVlc3RIZWFkZXJzWyJ1cGdyYWRlIl0udG9Mb3dlcigpID09ICJ3ZWJzb2NrZXQiCgkJCTsKCX0KCglXZWJTb2NrZXQgYWNjZXB0V2Vic29ja2V0KENnaSBjZ2kpIHsKCQlhc3NlcnQoIWNnaS5jbG9zZWQpOwoJCWFzc2VydCghY2dpLm91dHB1dHRlZFJlc3BvbnNlRGF0YSk7CgkJY2dpLnNldFJlc3BvbnNlU3RhdHVzKCIxMDEgV2ViIFNvY2tldCBQcm90b2NvbCBIYW5kc2hha2UiKTsKCQljZ2kuaGVhZGVyKCJVcGdyYWRlOiBXZWJTb2NrZXQiKTsKCQljZ2kuaGVhZGVyKCJDb25uZWN0aW9uOiB1cGdyYWRlIik7CgoJCXN0cmluZyBrZXkgPSBjZ2kucmVxdWVzdEhlYWRlcnNbInNlYy13ZWJzb2NrZXQta2V5Il07CgkJa2V5IH49ICIyNThFQUZBNS1FOTE0LTQ3REEtOTVDQS1DNUFCMERDODVCMTEiOwoKCQlpbXBvcnQgYXJzZC5zaGE7CgkJYXV0byBhY2NlcHQgPSBCYXNlNjQuZW5jb2RlKFNIQTEoa2V5KSk7CgoJCWNnaS5oZWFkZXIoKCJTZWMtV2ViU29ja2V0LUFjY2VwdDogIiB+IGFjY2VwdCkuaWR1cCk7CgoJCWNnaS53ZWJzb2NrZXRNb2RlID0gdHJ1ZTsKCQljZ2kud3JpdGUoIiIpOwoKCQljZ2kuZmx1c2goKTsKCgkJcmV0dXJuIG5ldyBXZWJTb2NrZXQoY2dpKTsKCX0KCgkvLyBGSVhNRTogaW1wbGVtZW50IHdlYnNvY2tldCBleHRlbnNpb24gZnJhbWVzCgkvLyBnZXQgd2Vic29ja2V0IHRvIHdvcmsgb24gb3RoZXIgbW9kZXMsIG5vdCBqdXN0IGVtYmVkZGVkX2h0dHBkCgoJZW51bSBXZWJTb2NrZXRPcGNvZGUgOiB1Ynl0ZSB7CgkJdGV4dCA9IDEsCgkJYmluYXJ5ID0gMiwKCQkvLyAzLCA0LCA1LCA2LCA3IFJFU0VSVkVECgkJY2xvc2UgPSA4LAoJCXBpbmcgPSA5LAoJCXBvbmcgPSAxMCwKCQkvLyAxMSwxMiwxMywxNCwxNSBSRVNFUlZFRAoJfQoKCXN0cnVjdCBXZWJTb2NrZXRNZXNzYWdlIHsKCQlib29sIGZpbjsKCQlib29sIHJzdjE7CgkJYm9vbCByc3YyOwoJCWJvb2wgcnN2MzsKCQlXZWJTb2NrZXRPcGNvZGUgb3Bjb2RlOyAvLyA0IGJpdHMKCQlib29sIG1hc2tlZDsKCQl1Ynl0ZSBsZW5ndGhJbmRpY2F0b3I7IC8vIGRvbid0IHNldCB0aGlzIHdoZW4gYnVpbGRpbmcgb25lIHRvIHNlbmQKCQl1bG9uZyByZWFsTGVuZ3RoOyAvLyBkb24ndCB1c2Ugd2hlbiBzZW5kaW5nCgkJdWJ5dGVbNF0gbWFza2luZ0tleTsgLy8gZG9uJ3Qgc2V0IHRoaXMgd2hlbiBzZW5kaW5nCgkJdWJ5dGVbXSBkYXRhOwoKCQlzdGF0aWMgV2ViU29ja2V0TWVzc2FnZSBzaW1wbGVNZXNzYWdlKFdlYlNvY2tldE9wY29kZSBvcGNvZGUsIHZvaWRbXSBkYXRhKSB7CgkJCVdlYlNvY2tldE1lc3NhZ2UgbXNnOwoJCQltc2cuZmluID0gdHJ1ZTsKCQkJbXNnLm9wY29kZSA9IG9wY29kZTsKCQkJbXNnLmRhdGEgPSBjYXN0KHVieXRlW10pIGRhdGE7CgoJCQlyZXR1cm4gbXNnOwoJCX0KCgkJcHJpdmF0ZSB2b2lkIHNlbmQoQ2dpIGNnaSkgewoJCQl1Ynl0ZVs2NF0gaGVhZGVyU2NyYXRjaDsKCQkJaW50IGhlYWRlclNjcmF0Y2hQb3MgPSAwOwoKCQkJcmVhbExlbmd0aCA9IGRhdGEubGVuZ3RoOwoKCQkJewoJCQkJdWJ5dGUgYjE7CgkJCQliMSB8PSBjYXN0KHVieXRlKSBvcGNvZGU7CgkJCQliMSB8PSByc3YzID8gKDEgPDwgNCkgOiAwOwoJCQkJYjEgfD0gcnN2MiA/ICgxIDw8IDUpIDogMDsKCQkJCWIxIHw9IHJzdjEgPyAoMSA8PCA2KSA6IDA7CgkJCQliMSB8PSBmaW4gID8gKDEgPDwgNykgOiAwOwoKCQkJCWhlYWRlclNjcmF0Y2hbMF0gPSBiMTsKCQkJCWhlYWRlclNjcmF0Y2hQb3MrKzsKCQkJfQoKCQkJewoJCQkJaGVhZGVyU2NyYXRjaFBvcysrOyAvLyB3ZSdsbCBzZXQgaGVhZGVyWzFdIGF0IHRoZSBlbmQgb2YgdGhpcwoJCQkJYXV0byBybGMgPSByZWFsTGVuZ3RoOwoJCQkJdWJ5dGUgYjI7CgkJCQliMiB8PSBtYXNrZWQgPyAoMSA8PCA3KSA6IDA7CgoJCQkJYXNzZXJ0KGhlYWRlclNjcmF0Y2hQb3MgPT0gMik7CgoJCQkJaWYocmVhbExlbmd0aCA+IDY1NTM1KSB7CgkJCQkJLy8gdXNlIDY0IGJpdCBsZW5ndGgKCQkJCQliMiB8PSAweDdmOwoKCQkJCQkvLyBGSVhNRTogZG91YmxlIGNoZWNrIGVuZGluYW5lc3MKCQkJCQlmb3JlYWNoKGk7IDAgLi4gOCkgewoJCQkJCQloZWFkZXJTY3JhdGNoWzIgKyA3IC0gaV0gPSBybGMgJiAweDBmZjsKCQkJCQkJcmxjID4+Pj0gODsKCQkJCQl9CgoJCQkJCWhlYWRlclNjcmF0Y2hQb3MgKz0gODsKCQkJCX0gZWxzZSBpZihyZWFsTGVuZ3RoID4gMTI3KSB7CgkJCQkJLy8gdXNlIDE2IGJpdCBsZW5ndGgKCQkJCQliMiB8PSAweDdlOwoKCQkJCQkvLyBGSVhNRTogZG91YmxlIGNoZWNrIGVuZGluYW5lc3MKCQkJCQlmb3JlYWNoKGk7IDAgLi4gMikgewoJCQkJCQloZWFkZXJTY3JhdGNoWzIgKyAxIC0gaV0gPSBybGMgJiAweDBmZjsKCQkJCQkJcmxjID4+Pj0gODsKCQkJCQl9CgoJCQkJCWhlYWRlclNjcmF0Y2hQb3MgKz0gMjsKCQkJCX0gZWxzZSB7CgkJCQkJLy8gdXNlIDcgYml0IGxlbmd0aAoJCQkJCWIyIHw9IHJlYWxMZW5ndGggJiAwYl8wMTExXzExMTE7CgkJCQl9CgoJCQkJaGVhZGVyU2NyYXRjaFsxXSA9IGIyOwoJCQl9CgoJCQlhc3NlcnQoIW1hc2tlZCwgIm1hc2tpbmcga2V5IG5vdCBwcm9wZXJseSBpbXBsZW1lbnRlZCIpOwoJCQlpZihtYXNrZWQpIHsKCQkJCS8vIEZJWE1FOiByYW5kb21pemUgdGhpcwoJCQkJaGVhZGVyU2NyYXRjaFtoZWFkZXJTY3JhdGNoUG9zIC4uIGhlYWRlclNjcmF0Y2hQb3MgKyA0XSA9IG1hc2tpbmdLZXlbXTsKCQkJCWhlYWRlclNjcmF0Y2hQb3MgKz0gNDsKCgkJCQkvLyB3ZSdsbCBqdXN0IG1hc2sgaXQgaW4gcGxhY2UuLi4KCQkJCWludCBrZXlJZHggPSAwOwoJCQkJZm9yZWFjaChpOyAwIC4uIGRhdGEubGVuZ3RoKSB7CgkJCQkJZGF0YVtpXSA9IGRhdGFbaV0gXiBtYXNraW5nS2V5W2tleUlkeF07CgkJCQkJaWYoa2V5SWR4ID09IDMpCgkJCQkJCWtleUlkeCA9IDA7CgkJCQkJZWxzZQoJCQkJCQlrZXlJZHgrKzsKCQkJCX0KCQkJfQoKCQkJLy93cml0ZWxuKCJTRU5ESU5HICIsIGhlYWRlclNjcmF0Y2hbMCAuLiBoZWFkZXJTY3JhdGNoUG9zXSwgZGF0YSk7CgkJCWNnaS53cml0ZShoZWFkZXJTY3JhdGNoWzAgLi4gaGVhZGVyU2NyYXRjaFBvc10pOwoJCQljZ2kud3JpdGUoZGF0YSk7CgkJCWNnaS5mbHVzaCgpOwoJCX0KCgkJc3RhdGljIFdlYlNvY2tldE1lc3NhZ2UgcmVhZCh1Ynl0ZVtdIGQpIHsKCQkJV2ViU29ja2V0TWVzc2FnZSBtc2c7CgkJCWFzc2VydChkLmxlbmd0aCA+PSAyKTsKCgkJCXVieXRlIGIgPSBkWzBdOwoKCQkJbXNnLm9wY29kZSA9IGNhc3QoV2ViU29ja2V0T3Bjb2RlKSAoYiAmIDB4MGYpOwoJCQliID4+PSA0OwoJCQltc2cucnN2MyA9IGIgJiAweDAxOwoJCQliID4+PSAxOwoJCQltc2cucnN2MiA9IGIgJiAweDAxOwoJCQliID4+PSAxOwoJCQltc2cucnN2MSA9IGIgJiAweDAxOwoJCQliID4+PSAxOwoJCQltc2cuZmluID0gYiAmIDB4MDE7CgoJCQliID0gZFsxXTsKCQkJbXNnLm1hc2tlZCA9IChiICYgMGIxMDAwXzAwMDApID8gdHJ1ZSA6IGZhbHNlOwoJCQltc2cubGVuZ3RoSW5kaWNhdG9yID0gYiAmIDBiMDExMV8xMTExOwoKCQkJZCA9IGRbMiAuLiAkXTsKCgkJCWlmKG1zZy5sZW5ndGhJbmRpY2F0b3IgPT0gMHg3ZSkgewoJCQkJLy8gMTYgYml0IGxlbmd0aAoJCQkJbXNnLnJlYWxMZW5ndGggPSAwOwoKCQkJCWZvcmVhY2goaTsgMCAuLiAyKSB7CgkJCQkJbXNnLnJlYWxMZW5ndGggfD0gZFswXSA8PCAoKDEtaSkgKiA4KTsKCQkJCQlkID0gZFsxIC4uICRdOwoJCQkJfQoJCQl9IGVsc2UgaWYobXNnLmxlbmd0aEluZGljYXRvciA9PSAweDdmKSB7CgkJCQkvLyA2NCBiaXQgbGVuZ3RoCgkJCQltc2cucmVhbExlbmd0aCA9IDA7CgoJCQkJZm9yZWFjaChpOyAwIC4uIDgpIHsKCQkJCQltc2cucmVhbExlbmd0aCB8PSBkWzBdIDw8ICgoNy1pKSAqIDgpOwoJCQkJCWQgPSBkWzEgLi4gJF07CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkvLyA3IGJpdCBsZW5ndGgKCQkJCW1zZy5yZWFsTGVuZ3RoID0gbXNnLmxlbmd0aEluZGljYXRvcjsKCQkJfQoKCQkJaWYobXNnLm1hc2tlZCkgewoJCQkJbXNnLm1hc2tpbmdLZXkgPSBkWzAgLi4gNF07CgkJCQlkID0gZFs0IC4uICRdOwoJCQl9CgoJCQltc2cuZGF0YSA9IGRbMCAuLiAkXTsKCgkJCWlmKG1zZy5tYXNrZWQpIHsKCQkJCS8vIGxldCdzIGp1c3QgdW5tYXNrIGl0IG5vdwoJCQkJaW50IGtleUlkeCA9IDA7CgkJCQlmb3JlYWNoKGk7IDAgLi4gbXNnLmRhdGEubGVuZ3RoKSB7CgkJCQkJbXNnLmRhdGFbaV0gPSBtc2cuZGF0YVtpXSBeIG1zZy5tYXNraW5nS2V5W2tleUlkeF07CgkJCQkJaWYoa2V5SWR4ID09IDMpCgkJCQkJCWtleUlkeCA9IDA7CgkJCQkJZWxzZQoJCQkJCQlrZXlJZHgrKzsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIG1zZzsKCQl9CgoJCWNoYXJbXSB0ZXh0RGF0YSgpIHsKCQkJcmV0dXJuIGNhc3QoY2hhcltdKSBkYXRhOwoJCX0KCX0KCn0KCgp2ZXJzaW9uKFdpbmRvd3MpCnsKICAgIHZlcnNpb24oQ1J1bnRpbWVfRGlnaXRhbE1hcnMpCiAgICB7CiAgICAgICAgZXh0ZXJuKEMpIGludCBzZXRtb2RlKGludCwgaW50KSBub3Rocm93IEBub2djOwogICAgfQogICAgZWxzZSB2ZXJzaW9uKENSdW50aW1lX01pY3Jvc29mdCkKICAgIHsKICAgICAgICBleHRlcm4oQykgaW50IF9zZXRtb2RlKGludCwgaW50KSBub3Rocm93IEBub2djOwogICAgICAgIGFsaWFzIHNldG1vZGUgPSBfc2V0bW9kZTsKICAgIH0KICAgIGVsc2Ugc3RhdGljIGFzc2VydCgwKTsKfQoKLyoKQ29weXJpZ2h0OiBBZGFtIEQuIFJ1cHBlLCAyMDA4IC0gMjAxNgpMaWNlbnNlOiAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCI+Qm9vc3QgTGljZW5zZSAxLjA8L2E+LgpBdXRob3JzOiBBZGFtIEQuIFJ1cHBlCgoJQ29weXJpZ2h0IEFkYW0gRC4gUnVwcGUgMjAwOCAtIDIwMTYuCkRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAoJaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQoqLw==\"")
packr.PackJSONBytes("./images", "d/fx.d", "\"aW1wb3J0IHN0ZC5qc29uOwoKbG9uZyBleGVjdXRlRngoSlNPTlZhbHVlIGlucHV0KQp7CiAgICByZXR1cm4gaW5wdXRbImEiXS5pbnRlZ2VyICsgaW5wdXRbImIiXS5pbnRlZ2VyOwp9\"")
packr.PackJSONBytes("./images", "go/Dockerfile", "\"RlJPTSBnb2xhbmc6bGF0ZXN0CgpDT1BZIC4gL2dvL3NyYy9naXRodWIuY29tL21ldHJ1ZS9meApXT1JLRElSIC9nby9zcmMvZ2l0aHViLmNvbS9tZXRydWUvZngKCiMgZGVwZW5kZW5jeSBtYW5hZ2VtZW50ClJVTiBnbyBnZXQgZ2l0aHViLmNvbS9naW4tZ29uaWMvZ2luCgpSVU4gZ28gYnVpbGQgLWxkZmxhZ3MgIi13IC1zIiAtbyBmeCBmeC5nbyBhcHAuZ28KCkVYUE9TRSAzMDAwCgpDTUQgWyIuL2Z4Il0K\"")
packr.PackJSONBytes("./images", "go/app.go", "\"cGFja2FnZSBtYWluCgppbXBvcnQgKAoJImdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbiIKKQoKZnVuYyBtYWluKCkgewoJciA6PSBnaW4uRGVmYXVsdCgpCglyLkdFVCgiLyIsIGZ4KQoJci5QT1NUKCIvIiwgZngpCglpZiBlcnIgOj0gci5SdW4oIjozMDAwIik7IGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KfQo=\"")
packr.PackJSONBytes("./images", "go/fx.go", "\"cGFja2FnZSBtYWluCgppbXBvcnQgImdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbiIKCmZ1bmMgZngoY3R4ICpnaW4uQ29udGV4dCkgewoJY3R4LkpTT04oMjAwLCBnaW4uSHsKCQkibWVzc2FnZSI6ICJoZWxsbyB3b3JsZCIsCgl9KQp9Cg==\"")
packr.PackJSONBytes("./images", "java/Dockerfile", "\"RlJPTSBtZXRydWUvZngtamF2YS1iYXNlCgojIEFkZGluZyBzb3VyY2UsIGNvbXBpbGUgYW5kIHBhY2thZ2UgaW50byBhIGZhdCBqYXIKQUREIHNyYyAvY29kZS9zcmMKUlVOIFsibXZuIiwgInBhY2thZ2UiXQoKRVhQT1NFIDMwMDAKQ01EIFsiL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0L2Jpbi9qYXZhIiwgIi1qYXIiLCAidGFyZ2V0L2Z4LWFwcC1qYXZhLTAuMS4wLmphciJdCg==\"")
packr.PackJSONBytes("./images", "java/pom.xml", "\"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgogICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgogICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KICAgIDxhcnRpZmFjdElkPmZ4LWFwcC1qYXZhPC9hcnRpZmFjdElkPgogICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KICAgIDx2ZXJzaW9uPjAuMS4wPC92ZXJzaW9uPgoKICAgIDxidWlsZD4KICAgICAgICA8cGx1Z2lucz4KICAgICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNoYWRlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgogICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2hhZGU8L2dvYWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyYW5zZm9ybWVycz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHJhbnNmb3JtZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5zaGFkZS5yZXNvdXJjZS5NYW5pZmVzdFJlc291cmNlVHJhbnNmb3JtZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPmZ4LmFwcDwvbWFpbkNsYXNzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHJhbnNmb3JtZXI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyYW5zZm9ybWVycz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgogICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgogICAgICAgICAgICA8L3BsdWdpbj4KICAgICAgICA8L3BsdWdpbnM+CiAgICA8L2J1aWxkPgogICAgPHByb3BlcnRpZXM+CiAgICAgICAgPG1hdmVuLmNvbXBpbGVyLnNvdXJjZT44PC9tYXZlbi5jb21waWxlci5zb3VyY2U+CiAgICAgICAgPG1hdmVuLmNvbXBpbGVyLnRhcmdldD44PC9tYXZlbi5jb21waWxlci50YXJnZXQ+CiAgPC9wcm9wZXJ0aWVzPgogIDxkZXBlbmRlbmNpZXM+CiAgPGRlcGVuZGVuY3k+CiAgICA8Z3JvdXBJZD5pby5qYXZhbGluPC9ncm91cElkPgogICAgPGFydGlmYWN0SWQ+amF2YWxpbjwvYXJ0aWZhY3RJZD4KICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgogIDwvZGVwZW5kZW5jeT4KICA8ZGVwZW5kZW5jeT4KICAgIDxncm91cElkPm9yZy5qc29uPC9ncm91cElkPgogICAgPGFydGlmYWN0SWQ+anNvbjwvYXJ0aWZhY3RJZD4KICAgIDx2ZXJzaW9uPjIwMTcxMDE4PC92ZXJzaW9uPgogIDwvZGVwZW5kZW5jeT4KICA8L2RlcGVuZGVuY2llcz4KPC9wcm9qZWN0Pgo=\"")
packr.PackJSONBytes("./images", "java/src/main/java/fx/Fx.java", "\"cGFja2FnZSBmeDsKCmltcG9ydCBvcmcuanNvbi5KU09OT2JqZWN0OwoKcHVibGljIGNsYXNzIEZ4IHsKICAgIHB1YmxpYyBpbnQgaGFuZGxlKEpTT05PYmplY3QgaW5wdXQpIHsKICAgICAgICBTdHJpbmcgYSA9IGlucHV0LmdldCgiYSIpLnRvU3RyaW5nKCk7CiAgICAgICAgU3RyaW5nIGIgPSBpbnB1dC5nZXQoImIiKS50b1N0cmluZygpOwogICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGEpICsgSW50ZWdlci5wYXJzZUludChiKTsKICAgIH0KfQo=\"")
packr.PackJSONBytes("./images", "java/src/main/java/fx/app.java", "\"cGFja2FnZSBmeDsKCmltcG9ydCBpby5qYXZhbGluLkphdmFsaW47CmltcG9ydCBvcmcuanNvbi5KU09OT2JqZWN0OwoKcHVibGljIGNsYXNzIGFwcCB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgSmF2YWxpbiBhcHAgPSBKYXZhbGluLnN0YXJ0KDMwMDApOwogICAgICAgIEZ4IGhhbmRsZXIgPSBuZXcgRngoKTsKICAgICAgICBhcHAucG9zdCgiLyIsIGN0eCAtPiB7CiAgICAgICAgICAgIEpTT05PYmplY3Qgb2JqID0gbmV3IEpTT05PYmplY3QoY3R4LmJvZHkoKSk7CiAgICAgICAgICAgIGN0eC5yZXN1bHQoIiIraGFuZGxlci5oYW5kbGUob2JqKSk7CiAgICAgICAgfSk7CiAgICB9Cn0K\"")
packr.PackJSONBytes("./images", "julia/Dockerfile", "\"RlJPTSBqdWxpYTowLjcKCkNPUFkgLiAvYXBwCgpSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IGdjYyBhcHQtdXRpbHMgdW56aXAgbWFrZSBsaWJodHRwLXBhcnNlci1kZXYKUlVOIGp1bGlhIC9hcHAvZGVwcy5qbAoKQ01EIGp1bGlhIC9hcHAvYXBwLmpsCkVYUE9TRSAzMDAwCg==\"")
packr.PackJSONBytes("./images", "julia/REQUIRE", "\"SHR0cFBhcnNlcgpIdHRwU2VydmVyCkpTT04KVW5tYXJzaGFs\"")
packr.PackJSONBytes("./images", "julia/app.jl", "\"dXNpbmcgSHR0cFNlcnZlcgppbXBvcnQgSlNPTgppbXBvcnQgVW5tYXJzaGFsCgppbmNsdWRlKCJmeC5qbCIpCgpzcnYgPSBTZXJ2ZXIoKSBkbyByZXE6OlJlcXVlc3QsIHJlczo6UmVzcG9uc2UKICAgIGlmIGxlbmd0aChyZXEuZGF0YSkgPT0gMAogICAgICAgIHJlcy5zdGF0dXMgPSA0MDAKICAgIGVsc2UKICAgICAgICBwYXJzZWRfZGF0YSA9IEpTT04uUGFyc2VyLnBhcnNlKGpvaW4oW0NoYXIodikgZm9yIHYgaW4gcmVxLmRhdGFdKSkKICAgICAgICBkYXRhID0gVW5tYXJzaGFsLnVubWFyc2hhbChJbnB1dCwgcGFyc2VkX2RhdGEpCiAgICAgICAgc3RyaW5nKGZ4KGRhdGEpKQogICAgZW5kCmVuZAoKcnVuKHNydiwgMzAwMCkK\"")
packr.PackJSONBytes("./images", "julia/deps.jl", "\"b3BlbigiL2FwcC9SRVFVSVJFIikgZG8gZgoJZGVwcyA9IHJlYWRsaW5lcyhmKQoJZm9yIGQgaW4gZGVwcwoJCVBrZy5hZGQoZCkKCWVuZAplbmQKUGtnLmJ1aWxkKCJIdHRwUGFyc2VyIikK\"")
packr.PackJSONBytes("./images", "julia/fx.jl", "\"CnN0cnVjdCBJbnB1dAogICAgYTo6TnVtYmVyCiAgICBiOjpOdW1iZXIKZW5kCgpmeCA9IGZ1bmN0aW9uKGlucHV0OjpJbnB1dCkKICAgIHJldHVybiBpbnB1dC5hICsgaW5wdXQuYgplbmQK\"")
packr.PackJSONBytes("./images", "node/Dockerfile", "\"RlJPTSBtZXRydWUvZngtbm9kZS1iYXNlCgpDT1BZIC4gLgpFWFBPU0UgMzAwMApDTUQgWyJub2RlIiwgImFwcC5qcyJdCg==\"")
packr.PackJSONBytes("./images", "node/app.js", "\"Y29uc3QgS29hID0gcmVxdWlyZSgna29hJyk7CmNvbnN0IGJvZHlQYXJzZXIgPSByZXF1aXJlKCdrb2EtYm9keXBhcnNlcicpOwpjb25zdCBmeCA9IHJlcXVpcmUoJy4vZngnKTsKCmNvbnN0IGFwcCA9IG5ldyBLb2EoKTsKYXBwLnVzZShib2R5UGFyc2VyKCkpOwphcHAudXNlKGZ4KTsKCmFwcC5saXN0ZW4oMzAwMCk7Cg==\"")
packr.PackJSONBytes("./images", "node/fx.js", "\"bW9kdWxlLmV4cG9ydHMgPSAoY3R4KSA9PiB7CiAgY3R4LmJvZHkgPSAnaGVsbG8gd29ybGQnCn0K\"")
packr.PackJSONBytes("./images", "php/Dockerfile", "\"RlJPTSBwaHA6bGF0ZXN0CgpDT1BZIC4gLgpFWFBPU0UgMzAwMApDTUQgcGhwIC1TIDAuMC4wLjA6MzAwMAo=\"")
packr.PackJSONBytes("./images", "php/fx.php", "\"PD9waHAKICAgIGZ1bmN0aW9uIEZ4KCRpbnB1dCkgewogICAgICAgIHJldHVybiAkaW5wdXRbImEiXSskaW5wdXRbImIiXTsKICAgIH0K\"")
packr.PackJSONBytes("./images", "php/index.php", "\"PD9waHAKICAgIGluY2x1ZGUoImZ4LnBocCIpOwogICAgJGRhdGEgPSBmaWxlX2dldF9jb250ZW50cygicGhwOi8vaW5wdXQiKTsKICAgICRyZXMgPSBqc29uX2RlY29kZSgkZGF0YSx0cnVlKTsKICAgICR2ID0gRngoJHJlcyk7CiAgICBlY2hvICR2Owo=\"")
packr.PackJSONBytes("./images", "python/Dockerfile", "\"RlJPTSBtZXRydWUvZngtcHl0aG9uLWJhc2UKCkNPUFkgLiAuCkVYUE9TRSAzMDAwCkNNRCBmbGFzayBydW4gLWggMC4wLjAuMCAtcCAzMDAwCg==\"")
packr.PackJSONBytes("./images", "python/app.py", "\"ZnJvbSBmeCBpbXBvcnQgZngKZnJvbSBmbGFzayBpbXBvcnQgRmxhc2ssIHJlcXVlc3QsIGpzb25pZnkKYXBwID0gRmxhc2soX19uYW1lX18pCgpAYXBwLnJvdXRlKCcvJywgbWV0aG9kcz1bJ1BPU1QnLCAnR0VUJ10pCmRlZiBoYW5kbGUoKToKICAgIHJldHVybiBmeChyZXF1ZXN0KQo=\"")
packr.PackJSONBytes("./images", "python/fx.py", "\"ZGVmIGZ4KHJlcXVlc3QpOgogICAgcmV0dXJuICJoZWxsbyB3b3JsZCIK\"")
packr.PackJSONBytes("./images", "ruby/Dockerfile", "\"RlJPTSBydWJ5OmxhdGVzdAoKUlVOIGdlbSBpbnN0YWxsIHNpbmF0cmEKCkNPUFkgLiAuCkVYUE9TRSAzMDAwCkNNRCBydWJ5IGFwcC5yYiAtcCAzMDAwIC1vIDAuMC4wLjAK\"")
packr.PackJSONBytes("./images", "ruby/app.rb", "\"cmVxdWlyZSAnc2luYXRyYScKcmVxdWlyZSAnanNvbicKCnJlcXVpcmVfcmVsYXRpdmUgJ2Z4LnJiJwoKc2V0IDpwb3J0LCAzMDAwCgpwb3N0ICcvJyBkbwogICAgY3R4ID0gewogICAgICA6cmVxdWVzdCA9PiByZXF1ZXN0LAogICAgICA6cmVzcG9uc2UgPT4gcmVzcG9uc2UsCiAgICAgIDpzdGF0dXMgPT4gc3RhdHVzLAogICAgICA6aGVhZGVycyA9PiBoZWFkZXJzLAogICAgfQogICAgZnggY3R4CmVuZAoKZ2V0ICcvJyBkbwogICAgY3R4ID0gewogICAgICA6cmVxdWVzdCA9PiByZXF1ZXN0LAogICAgICA6cmVzcG9uc2UgPT4gcmVzcG9uc2UsCiAgICAgIDpzdGF0dXMgPT4gc3RhdHVzLAogICAgICA6aGVhZGVycyA9PiBoZWFkZXJzLAogICAgfQogICAgZnggY3R4CmVuZAo=\"")
packr.PackJSONBytes("./images", "ruby/fx.rb", "\"IwojIGN0eCA9IHsKIyAgIDpyZXF1ZXN0ID0+IHJlcXVlc3QsCiMgICA6cmVzcG9uc2UgPT4gcmVzcG9uc2UsCiMgICA6c3RhdHVzID0+IHN0YXR1cywKIyAgIDpoZWFkZXJzID0+IGhlYWRlcnMsCiMgfQpkZWYgZngoY3R4KQogIGN0eFs6cmVzcG9uc2VdLmJvZHkgPSAiaGVsbG8gd29ybGQiCmVuZAo=\"")
packr.PackJSONBytes("./images", "rust/Cargo.lock", "\"W1twYWNrYWdlXV0KbmFtZSA9ICJiYXNlNjQiCnZlcnNpb24gPSAiMC45LjMiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogImJ5dGVvcmRlciAxLjIuNyAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJzYWZlbWVtIDAuMy4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gImJhc2U2NCIKdmVyc2lvbiA9ICIwLjEwLjAiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogImJ5dGVvcmRlciAxLjIuNyAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJiaXRmbGFncyIKdmVyc2lvbiA9ICIwLjcuMCIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgoKW1twYWNrYWdlXV0KbmFtZSA9ICJiaXRmbGFncyIKdmVyc2lvbiA9ICIxLjAuNCIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgoKW1twYWNrYWdlXV0KbmFtZSA9ICJieXRlb3JkZXIiCnZlcnNpb24gPSAiMS4yLjciCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKCltbcGFja2FnZV1dCm5hbWUgPSAiYnl0ZXMiCnZlcnNpb24gPSAiMC40LjExIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJieXRlb3JkZXIgMS4yLjcgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAiaW92ZWMgMC4xLjIgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAiY2MiCnZlcnNpb24gPSAiMS4wLjI1Igpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbW3BhY2thZ2VdXQpuYW1lID0gImNmZy1pZiIKdmVyc2lvbiA9ICIwLjEuNiIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgoKW1twYWNrYWdlXV0KbmFtZSA9ICJjbG91ZGFiaSIKdmVyc2lvbiA9ICIwLjAuMyIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgpkZXBlbmRlbmNpZXMgPSBbCiAiYml0ZmxhZ3MgMS4wLjQgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAiY29va2llIgp2ZXJzaW9uID0gIjAuMTEuMCIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgpkZXBlbmRlbmNpZXMgPSBbCiAiYmFzZTY0IDAuOS4zIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInJpbmcgMC4xMy41IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInRpbWUgMC4xLjQwIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInVybCAxLjcuMiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJjcm9zc2JlYW0tdXRpbHMiCnZlcnNpb24gPSAiMC42LjEiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogImNmZy1pZiAwLjEuNiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJkZXZpc2UiCnZlcnNpb24gPSAiMC4yLjAiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogImRldmlzZV9jb2RlZ2VuIDAuMi4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogImRldmlzZV9jb3JlIDAuMi4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gImRldmlzZV9jb2RlZ2VuIgp2ZXJzaW9uID0gIjAuMi4wIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJkZXZpc2VfY29yZSAwLjIuMCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJxdW90ZSAwLjYuMTAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAiZGV2aXNlX2NvcmUiCnZlcnNpb24gPSAiMC4yLjAiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogImJpdGZsYWdzIDEuMC40IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInByb2MtbWFjcm8yIDAuNC4yNCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJxdW90ZSAwLjYuMTAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAic3luIDAuMTUuMjIgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAiZmlsZXRpbWUiCnZlcnNpb24gPSAiMC4yLjQiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogImNmZy1pZiAwLjEuNiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJsaWJjIDAuMi40NCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJyZWRveF9zeXNjYWxsIDAuMS40MyAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJmc2V2ZW50Igp2ZXJzaW9uID0gIjAuMi4xNyIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgpkZXBlbmRlbmNpZXMgPSBbCiAiYml0ZmxhZ3MgMC43LjAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAiZnNldmVudC1zeXMgMC4xLjYgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAibGliYyAwLjIuNDQgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAiZnNldmVudC1zeXMiCnZlcnNpb24gPSAiMC4xLjYiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogImxpYmMgMC4yLjQ0IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gImZ1Y2hzaWEtemlyY29uIgp2ZXJzaW9uID0gIjAuMy4zIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJiaXRmbGFncyAxLjAuNCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJmdWNoc2lhLXppcmNvbi1zeXMgMC4zLjMgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAiZnVjaHNpYS16aXJjb24tc3lzIgp2ZXJzaW9uID0gIjAuMy4zIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbW3BhY2thZ2VdXQpuYW1lID0gImZ1dHVyZXMiCnZlcnNpb24gPSAiMC4xLjI1Igpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbW3BhY2thZ2VdXQpuYW1lID0gImh0dHBhcnNlIgp2ZXJzaW9uID0gIjEuMy4zIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbW3BhY2thZ2VdXQpuYW1lID0gImh5cGVyIgp2ZXJzaW9uID0gIjAuMTAuMTUiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogImJhc2U2NCAwLjkuMyAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJodHRwYXJzZSAxLjMuMyAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJsYW5ndWFnZS10YWdzIDAuMi4yIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogImxvZyAwLjMuOSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJtaW1lIDAuMi42IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogIm51bV9jcHVzIDEuOC4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInRpbWUgMC4xLjQwIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInRyYWl0b2JqZWN0IDAuMS4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInR5cGVhYmxlIDAuMS4yIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInVuaWNhc2UgMS40LjIgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAidXJsIDEuNy4yIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gImlkbmEiCnZlcnNpb24gPSAiMC4xLjUiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogIm1hdGNoZXMgMC4xLjggKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAidW5pY29kZS1iaWRpIDAuMy40IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInVuaWNvZGUtbm9ybWFsaXphdGlvbiAwLjEuNyAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJpbmRleG1hcCIKdmVyc2lvbiA9ICIxLjAuMiIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgoKW1twYWNrYWdlXV0KbmFtZSA9ICJpbm90aWZ5Igp2ZXJzaW9uID0gIjAuNi4xIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJiaXRmbGFncyAxLjAuNCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJmdXR1cmVzIDAuMS4yNSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJpbm90aWZ5LXN5cyAwLjEuMyAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJsaWJjIDAuMi40NCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJtaW8gMC42LjE2IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInRva2lvLWlvIDAuMS4xMCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJ0b2tpby1yZWFjdG9yIDAuMS43IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gImlub3RpZnktc3lzIgp2ZXJzaW9uID0gIjAuMS4zIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJsaWJjIDAuMi40NCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJpb3ZlYyIKdmVyc2lvbiA9ICIwLjEuMiIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgpkZXBlbmRlbmNpZXMgPSBbCiAibGliYyAwLjIuNDQgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAid2luYXBpIDAuMi44IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gImlzYXR0eSIKdmVyc2lvbiA9ICIwLjEuOSIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgpkZXBlbmRlbmNpZXMgPSBbCiAiY2ZnLWlmIDAuMS42IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogImxpYmMgMC4yLjQ0IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInJlZG94X3N5c2NhbGwgMC4xLjQzIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogIndpbmFwaSAwLjMuNiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJpdG9hIgp2ZXJzaW9uID0gIjAuNC4zIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbW3BhY2thZ2VdXQpuYW1lID0gImtlcm5lbDMyLXN5cyIKdmVyc2lvbiA9ICIwLjIuMiIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgpkZXBlbmRlbmNpZXMgPSBbCiAid2luYXBpIDAuMi44IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogIndpbmFwaS1idWlsZCAwLjEuMSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJsYW5ndWFnZS10YWdzIgp2ZXJzaW9uID0gIjAuMi4yIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbW3BhY2thZ2VdXQpuYW1lID0gImxhenlfc3RhdGljIgp2ZXJzaW9uID0gIjEuMi4wIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbW3BhY2thZ2VdXQpuYW1lID0gImxhenljZWxsIgp2ZXJzaW9uID0gIjEuMi4xIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbW3BhY2thZ2VdXQpuYW1lID0gImxpYmMiCnZlcnNpb24gPSAiMC4yLjQ0Igpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbW3BhY2thZ2VdXQpuYW1lID0gImxvY2tfYXBpIgp2ZXJzaW9uID0gIjAuMS41Igpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJvd25pbmdfcmVmIDAuNC4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInNjb3BlZ3VhcmQgMC4zLjMgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAibG9nIgp2ZXJzaW9uID0gIjAuMy45Igpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJsb2cgMC40LjYgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAibG9nIgp2ZXJzaW9uID0gIjAuNC42Igpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJjZmctaWYgMC4xLjYgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAibWF0Y2hlcyIKdmVyc2lvbiA9ICIwLjEuOCIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgoKW1twYWNrYWdlXV0KbmFtZSA9ICJtZW1jaHIiCnZlcnNpb24gPSAiMi4xLjEiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogImNmZy1pZiAwLjEuNiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJsaWJjIDAuMi40NCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJ2ZXJzaW9uX2NoZWNrIDAuMS41IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gIm1pbWUiCnZlcnNpb24gPSAiMC4yLjYiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogImxvZyAwLjMuOSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJtaW8iCnZlcnNpb24gPSAiMC42LjE2Igpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJmdWNoc2lhLXppcmNvbiAwLjMuMyAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJmdWNoc2lhLXppcmNvbi1zeXMgMC4zLjMgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAiaW92ZWMgMC4xLjIgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAia2VybmVsMzItc3lzIDAuMi4yIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogImxhenljZWxsIDEuMi4xIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogImxpYmMgMC4yLjQ0IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogImxvZyAwLjQuNiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJtaW93IDAuMi4xIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogIm5ldDIgMC4yLjMzIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInNsYWIgMC40LjEgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAid2luYXBpIDAuMi44IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gIm1pby1leHRyYXMiCnZlcnNpb24gPSAiMi4wLjUiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogImxhenljZWxsIDEuMi4xIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogImxvZyAwLjQuNiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJtaW8gMC42LjE2IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInNsYWIgMC40LjEgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAibWlvdyIKdmVyc2lvbiA9ICIwLjIuMSIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgpkZXBlbmRlbmNpZXMgPSBbCiAia2VybmVsMzItc3lzIDAuMi4yIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogIm5ldDIgMC4yLjMzIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogIndpbmFwaSAwLjIuOCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJ3czJfMzItc3lzIDAuMi4xIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gIm5ldDIiCnZlcnNpb24gPSAiMC4yLjMzIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJjZmctaWYgMC4xLjYgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAibGliYyAwLjIuNDQgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAid2luYXBpIDAuMy42IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gIm5vdGlmeSIKdmVyc2lvbiA9ICI0LjAuNiIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgpkZXBlbmRlbmNpZXMgPSBbCiAiYml0ZmxhZ3MgMS4wLjQgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAiZmlsZXRpbWUgMC4yLjQgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAiZnNldmVudCAwLjIuMTcgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAiZnNldmVudC1zeXMgMC4xLjYgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAiaW5vdGlmeSAwLjYuMSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJrZXJuZWwzMi1zeXMgMC4yLjIgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAibGliYyAwLjIuNDQgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAibWlvIDAuNi4xNiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJtaW8tZXh0cmFzIDIuMC41IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogIndhbGtkaXIgMi4yLjcgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAid2luYXBpIDAuMy42IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gIm51bV9jcHVzIgp2ZXJzaW9uID0gIjEuOC4wIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJsaWJjIDAuMi40NCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJvd25pbmdfcmVmIgp2ZXJzaW9uID0gIjAuNC4wIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJzdGFibGVfZGVyZWZfdHJhaXQgMS4xLjEgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAicGFya2luZ19sb3QiCnZlcnNpb24gPSAiMC42LjQiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogImxvY2tfYXBpIDAuMS41IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInBhcmtpbmdfbG90X2NvcmUgMC4zLjEgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAicGFya2luZ19sb3RfY29yZSIKdmVyc2lvbiA9ICIwLjMuMSIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgpkZXBlbmRlbmNpZXMgPSBbCiAibGliYyAwLjIuNDQgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAicmFuZCAwLjUuNSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJydXN0Y192ZXJzaW9uIDAuMi4zIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInNtYWxsdmVjIDAuNi43IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogIndpbmFwaSAwLjMuNiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJwZWFyIgp2ZXJzaW9uID0gIjAuMS4yIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJwZWFyX2NvZGVnZW4gMC4xLjIgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAicGVhcl9jb2RlZ2VuIgp2ZXJzaW9uID0gIjAuMS4yIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJwcm9jLW1hY3JvMiAwLjQuMjQgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAicXVvdGUgMC42LjEwIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInN5biAwLjE1LjIyIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInZlcnNpb25fY2hlY2sgMC4xLjUgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAieWFuc2kgMC40LjAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAicGVyY2VudC1lbmNvZGluZyIKdmVyc2lvbiA9ICIxLjAuMSIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgoKW1twYWNrYWdlXV0KbmFtZSA9ICJwcm9jLW1hY3JvMiIKdmVyc2lvbiA9ICIwLjQuMjQiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogInVuaWNvZGUteGlkIDAuMS4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gInF1b3RlIgp2ZXJzaW9uID0gIjAuNi4xMCIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgpkZXBlbmRlbmNpZXMgPSBbCiAicHJvYy1tYWNybzIgMC40LjI0IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gInJhbmQiCnZlcnNpb24gPSAiMC41LjUiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogImNsb3VkYWJpIDAuMC4zIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogImZ1Y2hzaWEtemlyY29uIDAuMy4zIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogImxpYmMgMC4yLjQ0IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInJhbmRfY29yZSAwLjIuMiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJ3aW5hcGkgMC4zLjYgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAicmFuZF9jb3JlIgp2ZXJzaW9uID0gIjAuMi4yIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJyYW5kX2NvcmUgMC4zLjAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAicmFuZF9jb3JlIgp2ZXJzaW9uID0gIjAuMy4wIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbW3BhY2thZ2VdXQpuYW1lID0gInJlZG94X3N5c2NhbGwiCnZlcnNpb24gPSAiMC4xLjQzIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbW3BhY2thZ2VdXQpuYW1lID0gInJpbmciCnZlcnNpb24gPSAiMC4xMy41Igpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJjYyAxLjAuMjUgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAibGF6eV9zdGF0aWMgMS4yLjAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAibGliYyAwLjIuNDQgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAidW50cnVzdGVkIDAuNi4yIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gInJvY2tldCIKdmVyc2lvbiA9ICIwLjQuMC1yYy4yIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJiYXNlNjQgMC4xMC4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogImlzYXR0eSAwLjEuOSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJsb2cgMC40LjYgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAibWVtY2hyIDIuMS4xIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogIm51bV9jcHVzIDEuOC4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInBlYXIgMC4xLjIgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAicm9ja2V0X2NvZGVnZW4gMC40LjAtcmMuMiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJyb2NrZXRfaHR0cCAwLjQuMC1yYy4yIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInN0YXRlIDAuNC4xIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInRpbWUgMC4xLjQwIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInRvbWwgMC40LjkgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAidmVyc2lvbl9jaGVjayAwLjEuNSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJ5YW5zaSAwLjUuMCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJyb2NrZXRfY29kZWdlbiIKdmVyc2lvbiA9ICIwLjQuMC1yYy4yIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJkZXZpc2UgMC4yLjAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAiaW5kZXhtYXAgMS4wLjIgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAicXVvdGUgMC42LjEwIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInJvY2tldF9odHRwIDAuNC4wLXJjLjIgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAidmVyc2lvbl9jaGVjayAwLjEuNSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJ5YW5zaSAwLjUuMCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJyb2NrZXRfY29udHJpYiIKdmVyc2lvbiA9ICIwLjQuMC1yYy4yIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJsb2cgMC40LjYgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAibm90aWZ5IDQuMC42IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInJvY2tldCAwLjQuMC1yYy4yIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInNlcmRlIDEuMC44MCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJzZXJkZV9qc29uIDEuMC4zMyAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJyb2NrZXRfaHR0cCIKdmVyc2lvbiA9ICIwLjQuMC1yYy4yIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJjb29raWUgMC4xMS4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogImh5cGVyIDAuMTAuMTUgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAiaW5kZXhtYXAgMS4wLjIgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAicGVhciAwLjEuMiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJwZXJjZW50LWVuY29kaW5nIDEuMC4xIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInNtYWxsdmVjIDAuNi43IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInN0YXRlIDAuNC4xIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInRpbWUgMC4xLjQwIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInVuaWNvZGUteGlkIDAuMS4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gInJ1c3QiCnZlcnNpb24gPSAiMC4xLjAiCmRlcGVuZGVuY2llcyA9IFsKICJyb2NrZXQgMC40LjAtcmMuMiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJyb2NrZXRfY29udHJpYiAwLjQuMC1yYy4yIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInNlcmRlIDEuMC44MCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJzZXJkZV9kZXJpdmUgMS4wLjgwIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInNlcmRlX2pzb24gMS4wLjMzIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gInJ1c3RjX3ZlcnNpb24iCnZlcnNpb24gPSAiMC4yLjMiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogInNlbXZlciAwLjkuMCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJyeXUiCnZlcnNpb24gPSAiMC4yLjciCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKCltbcGFja2FnZV1dCm5hbWUgPSAic2FmZW1lbSIKdmVyc2lvbiA9ICIwLjMuMCIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgoKW1twYWNrYWdlXV0KbmFtZSA9ICJzYW1lLWZpbGUiCnZlcnNpb24gPSAiMS4wLjQiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogIndpbmFwaS11dGlsIDAuMS4xIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gInNjb3BlZ3VhcmQiCnZlcnNpb24gPSAiMC4zLjMiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKCltbcGFja2FnZV1dCm5hbWUgPSAic2VtdmVyIgp2ZXJzaW9uID0gIjAuOS4wIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJzZW12ZXItcGFyc2VyIDAuNy4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gInNlbXZlci1wYXJzZXIiCnZlcnNpb24gPSAiMC43LjAiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKCltbcGFja2FnZV1dCm5hbWUgPSAic2VyZGUiCnZlcnNpb24gPSAiMS4wLjgwIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbW3BhY2thZ2VdXQpuYW1lID0gInNlcmRlX2Rlcml2ZSIKdmVyc2lvbiA9ICIxLjAuODAiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogInByb2MtbWFjcm8yIDAuNC4yNCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJxdW90ZSAwLjYuMTAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAic3luIDAuMTUuMjIgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAic2VyZGVfanNvbiIKdmVyc2lvbiA9ICIxLjAuMzMiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogIml0b2EgMC40LjMgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAicnl1IDAuMi43IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInNlcmRlIDEuMC44MCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJzbGFiIgp2ZXJzaW9uID0gIjAuNC4xIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbW3BhY2thZ2VdXQpuYW1lID0gInNtYWxsdmVjIgp2ZXJzaW9uID0gIjAuNi43Igpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJ1bnJlYWNoYWJsZSAxLjAuMCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJzdGFibGVfZGVyZWZfdHJhaXQiCnZlcnNpb24gPSAiMS4xLjEiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKCltbcGFja2FnZV1dCm5hbWUgPSAic3RhdGUiCnZlcnNpb24gPSAiMC40LjEiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKCltbcGFja2FnZV1dCm5hbWUgPSAic3luIgp2ZXJzaW9uID0gIjAuMTUuMjIiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogInByb2MtbWFjcm8yIDAuNC4yNCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJxdW90ZSAwLjYuMTAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAidW5pY29kZS14aWQgMC4xLjAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAidGltZSIKdmVyc2lvbiA9ICIwLjEuNDAiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogImxpYmMgMC4yLjQ0IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInJlZG94X3N5c2NhbGwgMC4xLjQzIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogIndpbmFwaSAwLjMuNiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJ0b2tpby1leGVjdXRvciIKdmVyc2lvbiA9ICIwLjEuNSIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgpkZXBlbmRlbmNpZXMgPSBbCiAiZnV0dXJlcyAwLjEuMjUgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAidG9raW8taW8iCnZlcnNpb24gPSAiMC4xLjEwIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJieXRlcyAwLjQuMTEgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAiZnV0dXJlcyAwLjEuMjUgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAibG9nIDAuNC42IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gInRva2lvLXJlYWN0b3IiCnZlcnNpb24gPSAiMC4xLjciCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogImNyb3NzYmVhbS11dGlscyAwLjYuMSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJmdXR1cmVzIDAuMS4yNSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJsYXp5X3N0YXRpYyAxLjIuMCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJsb2cgMC40LjYgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAibWlvIDAuNi4xNiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJudW1fY3B1cyAxLjguMCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJwYXJraW5nX2xvdCAwLjYuNCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJzbGFiIDAuNC4xIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInRva2lvLWV4ZWN1dG9yIDAuMS41IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogInRva2lvLWlvIDAuMS4xMCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJ0b21sIgp2ZXJzaW9uID0gIjAuNC45Igpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJzZXJkZSAxLjAuODAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAidHJhaXRvYmplY3QiCnZlcnNpb24gPSAiMC4xLjAiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKCltbcGFja2FnZV1dCm5hbWUgPSAidHlwZWFibGUiCnZlcnNpb24gPSAiMC4xLjIiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKCltbcGFja2FnZV1dCm5hbWUgPSAidW5pY2FzZSIKdmVyc2lvbiA9ICIxLjQuMiIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgpkZXBlbmRlbmNpZXMgPSBbCiAidmVyc2lvbl9jaGVjayAwLjEuNSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKXQoKW1twYWNrYWdlXV0KbmFtZSA9ICJ1bmljb2RlLWJpZGkiCnZlcnNpb24gPSAiMC4zLjQiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogIm1hdGNoZXMgMC4xLjggKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAidW5pY29kZS1ub3JtYWxpemF0aW9uIgp2ZXJzaW9uID0gIjAuMS43Igpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbW3BhY2thZ2VdXQpuYW1lID0gInVuaWNvZGUteGlkIgp2ZXJzaW9uID0gIjAuMS4wIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbW3BhY2thZ2VdXQpuYW1lID0gInVucmVhY2hhYmxlIgp2ZXJzaW9uID0gIjEuMC4wIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJ2b2lkIDEuMC4yIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gInVudHJ1c3RlZCIKdmVyc2lvbiA9ICIwLjYuMiIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgoKW1twYWNrYWdlXV0KbmFtZSA9ICJ1cmwiCnZlcnNpb24gPSAiMS43LjIiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogImlkbmEgMC4xLjUgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAibWF0Y2hlcyAwLjEuOCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiwKICJwZXJjZW50LWVuY29kaW5nIDEuMC4xIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gInZlcnNpb25fY2hlY2siCnZlcnNpb24gPSAiMC4xLjUiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKCltbcGFja2FnZV1dCm5hbWUgPSAidm9pZCIKdmVyc2lvbiA9ICIxLjAuMiIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgoKW1twYWNrYWdlXV0KbmFtZSA9ICJ3YWxrZGlyIgp2ZXJzaW9uID0gIjIuMi43Igpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJzYW1lLWZpbGUgMS4wLjQgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAid2luYXBpIDAuMy42IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogIndpbmFwaS11dGlsIDAuMS4xIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gIndpbmFwaSIKdmVyc2lvbiA9ICIwLjIuOCIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgoKW1twYWNrYWdlXV0KbmFtZSA9ICJ3aW5hcGkiCnZlcnNpb24gPSAiMC4zLjYiCnNvdXJjZSA9ICJyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCIKZGVwZW5kZW5jaWVzID0gWwogIndpbmFwaS1pNjg2LXBjLXdpbmRvd3MtZ251IDAuNC4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLAogIndpbmFwaS14ODZfNjQtcGMtd2luZG93cy1nbnUgMC40LjAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAid2luYXBpLWJ1aWxkIgp2ZXJzaW9uID0gIjAuMS4xIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbW3BhY2thZ2VdXQpuYW1lID0gIndpbmFwaS1pNjg2LXBjLXdpbmRvd3MtZ251Igp2ZXJzaW9uID0gIjAuNC4wIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbW3BhY2thZ2VdXQpuYW1lID0gIndpbmFwaS11dGlsIgp2ZXJzaW9uID0gIjAuMS4xIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJ3aW5hcGkgMC4zLjYgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCl0KCltbcGFja2FnZV1dCm5hbWUgPSAid2luYXBpLXg4Nl82NC1wYy13aW5kb3dzLWdudSIKdmVyc2lvbiA9ICIwLjQuMCIKc291cmNlID0gInJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgoKW1twYWNrYWdlXV0KbmFtZSA9ICJ3czJfMzItc3lzIgp2ZXJzaW9uID0gIjAuMi4xIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCmRlcGVuZGVuY2llcyA9IFsKICJ3aW5hcGkgMC4yLjggKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIsCiAid2luYXBpLWJ1aWxkIDAuMS4xIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiLApdCgpbW3BhY2thZ2VdXQpuYW1lID0gInlhbnNpIgp2ZXJzaW9uID0gIjAuNC4wIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbW3BhY2thZ2VdXQpuYW1lID0gInlhbnNpIgp2ZXJzaW9uID0gIjAuNS4wIgpzb3VyY2UgPSAicmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgiCgpbbWV0YWRhdGFdCiJjaGVja3N1bSBiYXNlNjQgMC4xMC4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjYyMWZjN2VjYjgwMDhmODZkN2ZiOWI5NTM1NmNkNjkyY2U5NTE0YjgwYTg2ZDg1YjM5N2YzMmEyMmRhN2I5ZTIiCiJjaGVja3N1bSBiYXNlNjQgMC45LjMgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiNDg5ZDZjMGVkMjFiMTFkMDM4YzMxYjZjZWNjY2E5NzNlNjVkNzNiYTNiZDhlY2I5YTJiYWJmNTU0NjE2NDY0MyIKImNoZWNrc3VtIGJpdGZsYWdzIDAuNy4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gImFhZDE4OTM3YTYyOGVjNmFiY2QyNmQxNDg5MDEyY2MwZTE4YzIxNzk4MjEwZjQ5MWFmNjlkZWQ5Yjg4MTEwNmQiCiJjaGVja3N1bSBiaXRmbGFncyAxLjAuNCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICIyMjgwNDdhNzZmNDY4NjI3Y2E3MTc3NmVjZGViZDczMmEzNDIzMDgxZmNmNTEyNTU4NWJjZDdjNDk4ODZjZTEyIgoiY2hlY2tzdW0gYnl0ZW9yZGVyIDEuMi43IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjk0Zjg4ZGYyM2EyNTQxN2JhZGM5MjJhYjBmNTcxNmNjMTMzMGU4N2Y3MWRkZDkyMDNiM2EzY2NkOWNlZGY3NWQiCiJjaGVja3N1bSBieXRlcyAwLjQuMTEgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiNDBhZGUzZDI3NjAzYzJjYjM0NWViMDkxMmFlYzQ2MWE2ZGVjN2UwNmE0YWU0ODU4OTkwNGU4MDgzMzVjN2FmYSIKImNoZWNrc3VtIGNjIDEuMC4yNSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICJmMTU5ZGZkNDMzNjNjNGQwODA1NWEwNzcwM2ViN2EzNDA2YjBkYWM0ZDA1ODRkOTY5NjVhMzI2MmRiM2M5ZDE2IgoiY2hlY2tzdW0gY2ZnLWlmIDAuMS42IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjA4MmJiOWIyOGUwMGQzYzlkMzljYzAzZTY0Y2U0Y2VhMGYxYmI5YjNmZGU0OTNmMGNiYzAwODQ3MmQyMmJkZjQiCiJjaGVja3N1bSBjbG91ZGFiaSAwLjAuMyAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICJkZGZjNWI5YWE1ZDQ1MDdhY2FmODcyZGU3MTA1MWRmZDBlMzA5ODYwZTg4OTY2ZTEwNTFlNDYyYTA3N2FhYzRmIgoiY2hlY2tzdW0gY29va2llIDAuMTEuMCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICIxNDY1ZjgxMzRlZmEyOTZiNGMxOWRiMzRkOTA5NjM3Y2IyYmYwZjdhYWYyMTI5OWUyM2UxOGZhMjlhYzU1N2NmIgoiY2hlY2tzdW0gY3Jvc3NiZWFtLXV0aWxzIDAuNi4xIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gImM1NTkxM2NjMjc5OTE3MWE1NTBlMzA3OTE4YzBhMzYwZThjMTYwMDQ4MjAyOTFiZjNiNjM4OTY5YjRhMDE4MTYiCiJjaGVja3N1bSBkZXZpc2UgMC4yLjAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiNzRlMDRiYTJkMDNjNWZhMGQ5NTRjMDYxZmM4YzljMjg4YmFkYWRmZmMyNzJlYmI4NzY3OWE4OTg0NmRlM2VkMyIKImNoZWNrc3VtIGRldmlzZV9jb2RlZ2VuIDAuMi4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjA2NmNlYjc5MjhjYTkzYTliZWRjNmQwZTYxMmE4YTA0MjQwNDhiMGFiMWY3NTk3MWIyMDNkMDE0MjBjMDU1ZDciCiJjaGVja3N1bSBkZXZpc2VfY29yZSAwLjIuMCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICJjZjQxYzU5YjIyYjVlM2VjMGVhNTVjNzg0N2U1ZjM1OGQzNDBmM2E4ZDZkNTNhNWNmNGYxNTY0OTY3Zjk2NDg3IgoiY2hlY2tzdW0gZmlsZXRpbWUgMC4yLjQgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiYTJkZjVjMWE4YzRiZTI3ZTc3MDc3ODlkYzQyYWU2NTk3NmU2MGIzOTRhZmQyOTNkMTQxOWFiOTE1ODMzZTY0NiIKImNoZWNrc3VtIGZzZXZlbnQgMC4yLjE3IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gImM0YmJiZjcxNTg0YWVlZDA3NjEwMGI1NjY1YWMxNGUzZDg1ZWViMzFmZGJiNDVmYmQ0MWVmOWE2ODJiNWVjMDUiCiJjaGVja3N1bSBmc2V2ZW50LXN5cyAwLjEuNiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICIxYTc3MmQzNmMzMzhkMDdhMDMyZDUzNzVhMzZmMTVmOWE3MDQzYmYwY2I4Y2U3Y2VlNjU4ZTAzN2M2MDMyODc0IgoiY2hlY2tzdW0gZnVjaHNpYS16aXJjb24gMC4zLjMgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiMmU5NzYzYzY5ZWJhYWU2MzBiYTM1Zjc0ODg4ZGI0NjVlNDllMjU5YmExYmMwZWRhN2QwNmY0YTA2NzYxNWQ4MiIKImNoZWNrc3VtIGZ1Y2hzaWEtemlyY29uLXN5cyAwLjMuMyAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICIzZGNhYTlhZTc3MjVkMTJjZGI4NWIzYWQ5OWE0MzRkYjcwYjQ2OGMwOWRlZDE3ZTAxMmQ4NmI1YzEwMTBmN2E3IgoiY2hlY2tzdW0gZnV0dXJlcyAwLjEuMjUgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiNDllNzY1M2UzNzRmZTBkMGMxMmRlNDI1MGYwYmRiNjA2ODBiOGM4MGVlZDU1OGM1Yzc1MzhlZWM5Yzg5ZTIxYiIKImNoZWNrc3VtIGh0dHBhcnNlIDEuMy4zIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gImU4NzM0YjBjZmQzYmMzZTEwMWVjNTkxMDBlMTAxYzJlZWNkMTkyODIyMDJlODc4MDhiMzAzN2I0NDI3NzdhODMiCiJjaGVja3N1bSBoeXBlciAwLjEwLjE1IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gImRmMGNhYWU2YjcxZDI2NmI5MWI0YTgzMTExYTYxZDJiOTRlZDJlMmJlYTAyNGM1MzJiOTMzZGNmZjg2N2U1OGMiCiJjaGVja3N1bSBpZG5hIDAuMS41IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjM4ZjA5ZTBmMGIxZmI1NWZkZWUxZjE3NDcwYWQ4MDBkYTc3YWY1MTg2YTFhNzZjMDI2YjY3OTM1OGI3ZTg0NGUiCiJjaGVja3N1bSBpbmRleG1hcCAxLjAuMiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICI3ZTgxYTdjMDVmNzk1NzhkYmMxNTc5M2Q4YjYxOWRiOWJhMzJiNDU3NzAwM2VmM2FmMWE5MWM0MTY3OThjNThkIgoiY2hlY2tzdW0gaW5vdGlmeSAwLjYuMSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICI0MGI1NDUzOWYzOTEwZDZmODRmYmY5YTY0M2VmZDZlM2FhNmU0ZjAwMTQyNmMwMzI5NTc2MTI4MjU1OTk0NzE4IgoiY2hlY2tzdW0gaW5vdGlmeS1zeXMgMC4xLjMgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiZTc0YTFhYTg3YzU5YWVmZjZlZjJjYzJmYTYyZDQxYmM0M2Y1NDk1MmY1NTY1MjY1NmIxOGEwMmZkNWUzNTZjMCIKImNoZWNrc3VtIGlvdmVjIDAuMS4yIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gImRiZTZlNDE3ZTdkMDk3NWRiNjUxMmI5MDc5NmU4Y2UyMjMxNDVhYzRlMzNjMzc3ZTRhNDI4ODJhMGU4OGJiMDgiCiJjaGVja3N1bSBpc2F0dHkgMC4xLjkgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiZTMxYTgyODFmYzkzZWM5NjkzNDk0ZGE2NWZiZjI4YzBjMmFhNjBhMmVhZWMyNWRjNThlMmYzMTk1MmU5NWVkYyIKImNoZWNrc3VtIGl0b2EgMC40LjMgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiMTMwNmYzNDY0OTUxZjMwZTMwZDEyMzczZDMxYzc5ZmJkNTJkMjM2ZTVlODk2ZmQ5MmY5NmVjN2JhYmJiZTYwYiIKImNoZWNrc3VtIGtlcm5lbDMyLXN5cyAwLjIuMiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICI3NTA3NjI0YjI5NDgzNDMxYzBiYTJkODJhZWNlOGNhNmNkYmE5MzgyYmZmNGRkZDBmNzQ5MDU2MGMwNTYwOThkIgoiY2hlY2tzdW0gbGFuZ3VhZ2UtdGFncyAwLjIuMiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICJhOTFkODg0YjY2NjdjZDYwNmJiNWE2OWFhMGM5OWJhODExYTExNWZjNjg5MTVlNzA1NmVjMDhhNDZlOTMxOTlhIgoiY2hlY2tzdW0gbGF6eV9zdGF0aWMgMS4yLjAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiYTM3NGM4OWI5ZGI1NTg5NTQ1M2E3NGMxZTM4ODYxZDlkZWVjMGIwMWI0MDVhODI1MTZlOWQ1ZGU0ODIwZGVhMSIKImNoZWNrc3VtIGxhenljZWxsIDEuMi4xIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gImIyOTRkNmZhOWVlNDA5YTA1NDM1NGFmYzQzNTJiMGI5ZWY3Y2EyMjJjNjliODgxMmNiZWE5ZTdkMmJmMzc4M2YiCiJjaGVja3N1bSBsaWJjIDAuMi40NCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICIxMDkyMzk0N2Y4NGE1MTlhNDVjOGZlZmI3ZGQxYjNlOGMwODc0Nzk5MzM4MWFkZWUxNzZkN2E4MmI0MTk1MzExIgoiY2hlY2tzdW0gbG9ja19hcGkgMC4xLjUgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiNjJlYmYxMzkxZjZhY2FkNjBlNWM4YjQzNzA2ZGRlNDU4MmRmNzVjMDY2OThhYjQ0NTExZDE1MDE2YmMyNDQyYyIKImNoZWNrc3VtIGxvZyAwLjMuOSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICJlMTllOGQ1YzM0YTNlMGUyMjIzZGI4ZTA2MGY5ZTgyNjRhZWViNWM1ZmM2NGE0ZWU5OTY1YzA2MjIxMWMwMjRiIgoiY2hlY2tzdW0gbG9nIDAuNC42IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gImM4NGVjNGI1Mjc5NTBhYTgzYTMyOTc1NGIwMWRiZTNmNTgzNjFkMWM1ZWZhY2QxZjZkNjhjNDk0ZDA4YTE3YzYiCiJjaGVja3N1bSBtYXRjaGVzIDAuMS44IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjdmZmM1YzUzMzg0NjlkNGQzZWExN2QyNjlmYThlYTM1MTJhZDI0NzI0N2MzMGJkMmRmNjllNjgzMDllZDBhMDgiCiJjaGVja3N1bSBtZW1jaHIgMi4xLjEgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiMGEzZWIwMDJmMDUzNTkyOWYxMTk5NjgxNDE3MDI5ZWJlYTA0YWFkYzBjN2E0MjI0YjQ2YmU5OWM3ZjVkNmExNiIKImNoZWNrc3VtIG1pbWUgMC4yLjYgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiYmE2MjZiOGE2ZGU1ZGE2ODJlMWNhYTA2YmRiNDJhMzM1YWVlNWE4NGRiOGU1MDQ2YTNlOGFiMTdiYTBhM2FlMCIKImNoZWNrc3VtIG1pbyAwLjYuMTYgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiNzE2NDYzMzFmMjYxOWIxMDI2Y2MzMDJmODdhMmI4YjY0OGQ1YzZkZDY5Mzc4NDZhMTZjYzhjZTBmMzQ3ZjQzMiIKImNoZWNrc3VtIG1pby1leHRyYXMgMi4wLjUgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiNDZlNzNhMDRjMmZhNjI1MGI4ZDgwMjEzNGQ1NmQ1NTRhOWVjMjkyMmJmOTc3Nzc3YzgwNWVhNWRlZjYxY2U0MCIKImNoZWNrc3VtIG1pb3cgMC4yLjEgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiOGMxZjJmM2IxY2YzMzFkZTY4OTZhYWJmNmU5ZDU1ZGNhOTAzNTZjYzk5NjBjY2E3ZWFhZjQwOGEzNTVhZTkxOSIKImNoZWNrc3VtIG5ldDIgMC4yLjMzIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjQyNTUwZDlmYjdiNjY4NGE2ZDQwNGQ5ZmE3MjUwYzJlYjI2NDZkZjczMWQxYzA2YWZjMDZkY2VlOWUxYmNmODgiCiJjaGVja3N1bSBub3RpZnkgNC4wLjYgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiODczZWNmZDhjMTc0OTY0YWUzMGY0MDEzMjlkMTQwMTQyMzEyYzhlNTU5MDcxOWNmMTE5OWQ1ZjE3MTdkODA3OCIKImNoZWNrc3VtIG51bV9jcHVzIDEuOC4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gImM1MWEzMzIyZTRiY2E5ZDIxMmFkOWExNThhMDJhYmM2OTM0ZDAwNTQ5MGMwNTRhMjc3OGRmNzNhNzBhYTBhMzAiCiJjaGVja3N1bSBvd25pbmdfcmVmIDAuNC4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjQ5YTRiOGVhMjE3OWU2YTJlMjc0MTFkM2JjYTA5Y2E2ZGQ2MzA4MjFjZjY4OTRjNmM3Yzg0NjdhOGVlN2VmMTMiCiJjaGVja3N1bSBwYXJraW5nX2xvdCAwLjYuNCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICJmMDgwMmJmZjA5MDAzYjI5MWJhNzU2ZGM3ZTc5MzEzZTUxY2MzMTY2N2U5NGFmYmU4NDdkZWY0OTA0MjRjZGU1IgoiY2hlY2tzdW0gcGFya2luZ19sb3RfY29yZSAwLjMuMSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICJhZDdmN2U2ZWJkYzc5ZWRmZjZmZGNiODdhNTViNjIwMTc0ZjdhOTg5ZTNlYjMxYjY1MjMxZjRhZjU3ZjAwYjhjIgoiY2hlY2tzdW0gcGVhciAwLjEuMiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICJjMjZkMmI5MmU0NzA2M2ZmY2U3MGQzZTNiMWJkMDk3YWYxMjFhOWUwZGIwN2NhMzhhNmNjMWNmMGNjODVmZjI1IgoiY2hlY2tzdW0gcGVhcl9jb2RlZ2VuIDAuMS4yIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjMzNmRiNGExOTJjYzdmNTRlZmViMGM0ZTExYTkyNDUzOTQ4MjRjYzNiY2JkMzdiYTNmZjUxMjQwYzM1ZDdhNmUiCiJjaGVja3N1bSBwZXJjZW50LWVuY29kaW5nIDEuMC4xIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjMxMDEwZGQyZTFhYzMzZDViNDZhNWI0MTM0OTUyMzk4ODI4MTNlMDM2OWY4ZWQ4YTVlMjY2ZjE3MzYwMmY4MzEiCiJjaGVja3N1bSBwcm9jLW1hY3JvMiAwLjQuMjQgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiNzc2MTk2OTc4MjZmMzFhMDJhZTk3NDQ1N2FmMGIyOWI3MjNlNTYxOWUxMTNlOTM5N2I4YjgyYzZiZDI1M2YwOSIKImNoZWNrc3VtIHF1b3RlIDAuNi4xMCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICI1M2ZhMjJhMTk5NGJkMGY5MzcyZDdhODE2MjA3ZDhhMjY3N2FkMDMyNWIwNzNmNWM1MzMyNzYwZjBmYjYyYjVjIgoiY2hlY2tzdW0gcmFuZCAwLjUuNSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICJlNDY0Y2Q4ODdlODY5Y2RkY2FlODc5MmE0ZWUzMWQyM2M3ZWRkNTE2NzAwNjk1NjA4ZjViOThjNjdlZTAxMzFjIgoiY2hlY2tzdW0gcmFuZF9jb3JlIDAuMi4yIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjE5NjFhNDIyYzRkMTg5ZGZiNTBmZmE5MzIwYmYxZjJhOWJkNTRlY2I5Mjc5MmZiOTQ3N2Y5OWExMDQ1ZjMzNzIiCiJjaGVja3N1bSByYW5kX2NvcmUgMC4zLjAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiMDkwNWI2YjcwNzllYzczYjMxNGQ0Yzc0ODcwMWY2OTMxZWI3OWZkOTdjNjY4Y2FhM2YxODk5YjIyYjMyYzZkYiIKImNoZWNrc3VtIHJlZG94X3N5c2NhbGwgMC4xLjQzIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjY3OWRhNzUwOGU5YTYzOTBhZWFmN2ZiZDAyYTgwMGZkYzY0YjczZmUyMjA0ZGQyYzhhZTY2ZDIyZDlkNWFkNWQiCiJjaGVja3N1bSByaW5nIDAuMTMuNSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICIyYzRkYjY4YTJlMzVmMzQ5NzE0NmI3ZTQ1NjNkZjdkNDc3M2EyNDMzMjMwYzVlNGI0NDgzMjhlMzE3NDA0NThhIgoiY2hlY2tzdW0gcm9ja2V0IDAuNC4wLXJjLjIgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiZWFhOTk3ZWE4ZGU5YjE0MTEyYWEzOGIyYjZhMGVjZjNlNjUxZmYyYzA4ZDJmZGYzODRmYTc2NWI1ZjljMmM5OCIKImNoZWNrc3VtIHJvY2tldF9jb2RlZ2VuIDAuNC4wLXJjLjIgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiZmM2OGY5MDQ1MmFjODhjNmMxZTAyYTkyMmEwYTIzZWYwYWRlMDhmOWFmODk5MDU2ZDBjOTE5YjI1ZmE3NzY4YyIKImNoZWNrc3VtIHJvY2tldF9jb250cmliIDAuNC4wLXJjLjIgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiMmNjNmEzN2NiN2E2MjU2ZWZlNjY0OGYyZDBhYjk5NzhjNDlhYjg4MzkwOWVhNGZhYmVmYjgxZDdjNjg1ZDg0MSIKImNoZWNrc3VtIHJvY2tldF9odHRwIDAuNC4wLXJjLjIgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiYzdkNTU1Y2U4OTY4MzA2MDJhZWRmNGJjZTJlZWM4ZDY0NzEzZDQ1YTI0OTJjNWEzNjI1YzNmYWE1ZjcxOWIwZiIKImNoZWNrc3VtIHJ1c3RjX3ZlcnNpb24gMC4yLjMgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiMTM4ZTNlMGFjYjZjOWZiMjU4YjE5YjY3Y2I4YWJkNjNjMDA2NzlkMjg1MTgwNWVhMTUxNDY1NDY0ZmU5MDMwYSIKImNoZWNrc3VtIHJ5dSAwLjIuNyAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICJlYjllOWI4Y2RlMjgyYTlmZTZhNDJkZDQ2ODEzMTliZmI2M2YxMjFiOGE4ZWU5NDM5YzZmNDEwN2U1OGE0NmY3IgoiY2hlY2tzdW0gc2FmZW1lbSAwLjMuMCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICI4ZGNhNDUzMjQ4YTk2Y2IwNzQ5ZTM2Y2NkZmUyYjBiNGU1NGE2MWJmZWY4OWZiOTdlYzYyMWViOGUwYTkzZGQ5IgoiY2hlY2tzdW0gc2FtZS1maWxlIDEuMC40IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjhmMjBjNGJlNTNhOGExZmY0YzFmMWIyYmQxNDU3MGQyZjYzNDYyODcwOTc1MmYwNzAyZWNkZDJiM2Y5YTUyNjciCiJjaGVja3N1bSBzY29wZWd1YXJkIDAuMy4zIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjk0MjU4ZjUzNjAxYWYxMWU2YTQ5ZjcyMjQyMmY2ZTM0MjVjNTJiMDYyNDVhNWNmOWJjMDk5MDhiMTc0ZjVlMjciCiJjaGVja3N1bSBzZW12ZXIgMC45LjAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiMWQ3ZWI5ZWYyYzE4NjYxOTAyY2M0N2U1MzVmOWJjNTFiNzhhY2QyNTRkYTcxZDM3NWMyZjY3MjBkOWE0MDQwMyIKImNoZWNrc3VtIHNlbXZlci1wYXJzZXIgMC43LjAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiMzg4YTFkZjI1M2VjYTA4NTUwYmVmNmM3MjM5MmNmZTdjMzA5MTRiZjQxZGY1MjY5YjY4Y2JkNmZmOGY1NzBhMyIKImNoZWNrc3VtIHNlcmRlIDEuMC44MCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICIxNWMxNDFmYzcwMjdkZDI2NWE0N2MwOTBiZjg2NGNmNjJiNDJjNGQyMjhiYmNmNGU1MWEwYzllMmIwZDNmN2VmIgoiY2hlY2tzdW0gc2VyZGVfZGVyaXZlIDEuMC44MCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICIyMjVkZTMwN2M2MzAyYmVjMzg5OGM1MWNhMzAyZmM5NGE3YTE2OTdlZjA4NDVmY2VlNjQ0OGYzM2MwMzIyNDljIgoiY2hlY2tzdW0gc2VyZGVfanNvbiAxLjAuMzMgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiYzM3Y2NkNmJlM2VkMWZkZjQxOWVlODQ4ZjdjNzU4ZWIzMWIwNTRkN2NkM2FlMzYwMGUzYmFlMGFkZjU2OTgxMSIKImNoZWNrc3VtIHNsYWIgMC40LjEgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiNWY5Nzc2ZDZiOTg2Zjc3YjM1YzZjZjg0NmMxMWFkOTg2ZmYxMjhmZTBiMmI2M2EzNjI4ZTM3NTVlOGQzMTAyZCIKImNoZWNrc3VtIHNtYWxsdmVjIDAuNi43IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gImI3M2VhMzczOGI0NzU2MzgwM2VmODE0OTI1ZTY5YmUwMDc5OWE4YzA3NDIwYmU4Yjk5NmY4ZTk4ZmIyMzM2ZGIiCiJjaGVja3N1bSBzdGFibGVfZGVyZWZfdHJhaXQgMS4xLjEgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiZGJhMWEyN2QzZWZhZTQzNTFjODA1MTA3MmQ2MTllM2FkZTI4MjA2MzVjMzk1OGQ4MjZiZmVhMzlkNTliNTRjOCIKImNoZWNrc3VtIHN0YXRlIDAuNC4xIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjczNDVjOTcxZDFlZjIxZmZkYmQxMDNhNzU5OTBhMTVlYjAzNjA0ZmM4Yjg4NTJjYThjYjQxOGVlMWEwOTkwMjgiCiJjaGVja3N1bSBzeW4gMC4xNS4yMiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICJhZThiMjllYjUyMTBiYzVjZjYzZWQ2MTQ5Y2JmOWFkZmM4MmFjMGJlMDIzZDg3MzVjMTc2ZWU3NGEyZGI0ZGE3IgoiY2hlY2tzdW0gdGltZSAwLjEuNDAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiZDgyNWJlMGViMzNmZGExYTdlNjgwMTJkNTFlOWM3ZjQ1MWRjMWE2OTM5MWU3ZmRjMTk3MDYwYmI4YzU2NjY3YiIKImNoZWNrc3VtIHRva2lvLWV4ZWN1dG9yIDAuMS41IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gImMxMTdiNmNmODZiYjczMGFhYjQ4MzRmMTBkZjk2ZTRkZDU4NmVmZjJjM2MyN2QzNzgxMzQ4ZGE0OWUyNTViZGUiCiJjaGVja3N1bSB0b2tpby1pbyAwLjEuMTAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiNzM5MmZlMGE3MGQ1Y2UwYzg4MmM0Nzc4MTE2YzUxOWJkNWRiYWE4YTdjM2FlM2QwNDU3OGIzYWZhZmRjZGEyMSIKImNoZWNrc3VtIHRva2lvLXJlYWN0b3IgMC4xLjcgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiNTAyYjYyNWFjYjRlZTEzY2JiM2I5MGI4Y2E4MGUwYWRkZDI2M2RkYWNmNjkzMTY2NmVmNzUxZTYxMGIwN2ZiNSIKImNoZWNrc3VtIHRvbWwgMC40LjkgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiMTk3ODJlMTQ1ZDVhYmVmYjAzNzU4OTU4ZjA2ZWEzNWY3YjFkODQyMWI1MzQxNDBlMDIzOGZkM2QwYmZkNjZlMyIKImNoZWNrc3VtIHRyYWl0b2JqZWN0IDAuMS4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gImVmZDFmODJjNTYzNDBmZGYxNmYyYTk1M2Q3YmRhNGY4ZmRmZmJhMTNkOTNiMDA4NDRjMjU1NzIxMTBiMjYwNzkiCiJjaGVja3N1bSB0eXBlYWJsZSAwLjEuMiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICIxNDEwZjZmOTFmMjFkMTYxMjY1NGU3Y2M2OTE5M2IwMzM0ZjkwOWRjZjJjNzkwYzQ4MjYyNTRmYmI4NmY4ODg3IgoiY2hlY2tzdW0gdW5pY2FzZSAxLjQuMiAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICI3ZjQ3NjVmODMxNjNiNzRmOTU3Yzc5N2FkOTI1M2NhZjk3ZjEwM2ZiMDY0ZDM5OTlhZWE5NTY4ZDA5ZmM4YTMzIgoiY2hlY2tzdW0gdW5pY29kZS1iaWRpIDAuMy40IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjQ5ZjJiZDBjNjQ2OGE4MjMwZTFkYjIyOWNmZjgwMjkyMTdjZjYyM2M3NjdlYTVkNjBiZmJkNDI3MjllYTU0ZDUiCiJjaGVja3N1bSB1bmljb2RlLW5vcm1hbGl6YXRpb24gMC4xLjcgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiNmEwMTgwYmM2MWZjNWE5ODcwODJiZmExMTFmNGNjOTVjNGNhZmY3Zjk3OTlmM2U0NmRmMDkxNjNhOTM3YWEyNSIKImNoZWNrc3VtIHVuaWNvZGUteGlkIDAuMS4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gImZjNzIzMDQ3OTZkMDgxOGUzNTdlYWQ0ZTAwMGQxOWM5YzE3NGFiMjNkYzExMDkzYWM5MTkwNTRkMjBhNmE3ZmMiCiJjaGVja3N1bSB1bnJlYWNoYWJsZSAxLjAuMCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICIzODI4MTA4NzdmZTQ0ODk5MWRmYzdmMGRkNmUzYWU1ZDU4MDg4ZmQwZWE1ZTM1MTg5NjU1Zjg0ZTY4MTRmYTU2IgoiY2hlY2tzdW0gdW50cnVzdGVkIDAuNi4yIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjU1Y2QxZjRiNGU5NmI0NmFlYjhkNDg1NWRiNGE3YTliZDk2ZWVlYjVjNmExYWI1NDU5MzMyODc2MTY0MmNlMmYiCiJjaGVja3N1bSB1cmwgMS43LjIgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiZGQ0ZTdjMGQ1MzEyNjYzNjk1MTlhNGFhNGYzOTlkNzQ4YmQzNzA0M2IwMGJkZTFlNGZmMWY2MGExMjBiMzU1YSIKImNoZWNrc3VtIHZlcnNpb25fY2hlY2sgMC4xLjUgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiOTE0YjFhNjc3NmM0YzkyOWE2MDJmYWZkOGJjNzQyZTA2MzY1ZDRiY2JlNDhjMzBmOWNjYTU4MjRmNzBkYzlkZCIKImNoZWNrc3VtIHZvaWQgMS4wLjIgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiNmEwMmU0ODg1ZWQzYmMwZjJkZTkwZWE2ZGQ0NWViY2JiNjZkYWNmZmUwMzU0N2ZhZGJiMGVlYWUyNzcwODg3ZCIKImNoZWNrc3VtIHdhbGtkaXIgMi4yLjcgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiOWQ5ZDdlZDM0MzEyMjlhMTQ0Mjk2MjEzMTA1YTM5MDY3NmNjNDljOWI2YTcyYmQxOWYzMTc2Yzk4ZTEyOWZhMSIKImNoZWNrc3VtIHdpbmFwaSAwLjIuOCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICIxNjdkYzlkNjk0OWE5Yjg1N2YzNDUxMjc1ZTkxMWMzZjQ0MjU1ODQyYzFmN2E3NmYzM2M1NTEwM2E5MDkwODdhIgoiY2hlY2tzdW0gd2luYXBpIDAuMy42IChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjkyYzFlYjMzNjQxZTI3NmNmYTIxNGEwNTIyYWNhZDU3YmU1YzU2YjEwY2IzNDhiM2M1MTE3ZGI3NWYzYWM0YjAiCiJjaGVja3N1bSB3aW5hcGktYnVpbGQgMC4xLjEgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiMmQzMTVlZWUzYjM0YWNhNDc5N2IyZGE2YjEzZWQ4ODI2NmU2ZDYxMjU2MmEwYzQ2MzkwYWY4Mjk5ZmM2OTliYyIKImNoZWNrc3VtIHdpbmFwaS1pNjg2LXBjLXdpbmRvd3MtZ251IDAuNC4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gImFjM2I4N2M2MzYyMDQyNmRkOWI5OTFlNWNlMDMyOWVmZjU0NWJjY2JiYjM0ZjNiZTA5ZmY2ZmI2YWI1MWI3YjYiCiJjaGVja3N1bSB3aW5hcGktdXRpbCAwLjEuMSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICJhZmM1NTA4NzU5YzViZjQyODVlNjFmZWI4NjJiNjA4M2M4NDgwYWVjODY0ZmExN2E4MWZkZWM2ZjY5YjQ2MWFiIgoiY2hlY2tzdW0gd2luYXBpLXg4Nl82NC1wYy13aW5kb3dzLWdudSAwLjQuMCAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICI3MTJlMjI3ODQxZDA1N2MxZWUxY2QyZmIyMmZhN2U1YTU0NjFhZThlNDhmYTJjYTc5ZWM0MmNmYzE5MzExODNmIgoiY2hlY2tzdW0gd3MyXzMyLXN5cyAwLjIuMSAocmVnaXN0cnkraHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9jcmF0ZXMuaW8taW5kZXgpIiA9ICJkNTljZWZlYmQwYzg5MmZhMmRkNmRlNTgxZTkzNzMwMWQ4NTUyY2I0NDQ4OWNkZmYwMzVjNjE4N2NiNjNmYTVlIgoiY2hlY2tzdW0geWFuc2kgMC40LjAgKHJlZ2lzdHJ5K2h0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4KSIgPSAiZDYwYzNiNDhjOWNkZWM0MmZiMDZiM2I4NGI1YjA4NzQwNWUxZmExYzY0NGExYWYzOTMwZTRkZmFmZTkzZGU0OCIKImNoZWNrc3VtIHlhbnNpIDAuNS4wIChyZWdpc3RyeStodHRwczovL2dpdGh1Yi5jb20vcnVzdC1sYW5nL2NyYXRlcy5pby1pbmRleCkiID0gIjlmYzc5ZjRhMWUzOTg1N2ZjMDBjM2Y2NjJjYmYyNjUxYzc3MWYwMGU5YzE1ZmUyYWJjMzQxODA2YmQ0NmJkNzEiCg==\"")
packr.PackJSONBytes("./images", "rust/Cargo.toml", "\"W3BhY2thZ2VdCm5hbWUgPSAicnVzdCIKdmVyc2lvbiA9ICIwLjEuMCIKYXV0aG9ycyA9IFsiRnJvbnRNYWdlIDx4Ymd4d2hAb3V0bG9vay5jb20+Il0KZWRpdGlvbiA9ICIyMDE4IgoKW2RlcGVuZGVuY2llc10Kcm9ja2V0ID0gIjAuNC4wLXJjLjIiCnJvY2tldF9jb250cmliID0gIjAuNC4wLXJjLjIiCnNlcmRlX2pzb24gPSAiMS4wIgpzZXJkZV9kZXJpdmUgPSAiMS4wLjcwIgpzZXJkZSA9ICIxLjAuNzAiCgo=\"")
packr.PackJSONBytes("./images", "rust/Dockerfile", "\"RlJPTSBsaXVjaG9uZy9ydXN0dXAKCldPUktESVIgL3Vzci9zcmMvbXlhcHAKQ09QWSAuIC4KClJVTiBjcCAuL2NvbmZpZyB+Ly5jYXJnby8KClJVTiBydXN0dXAgZGVmYXVsdCBuaWdodGx5ClJVTiBjYXJnbyB1cGRhdGUKUlVOIGNhcmdvIGJ1aWxkCgpFWFBPU0UgMzAwMAoKQ01EIFsiY2FyZ28iLCAicnVuIl0K\"")
packr.PackJSONBytes("./images", "rust/Rocket.toml", "\"W2RldmVsb3BtZW50XQphZGRyZXNzID0gIjAuMC4wLjAiCnBvcnQgPSAzMDAwCmxvZyA9ICJub3JtYWwiCgo=\"")
packr.PackJSONBytes("./images", "rust/config", "\"W3NvdXJjZS5jcmF0ZXMtaW9dCnJlZ2lzdHJ5ID0gImh0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvY3JhdGVzLmlvLWluZGV4IgpyZXBsYWNlLXdpdGggPSAndXN0YycKW3NvdXJjZS51c3RjXQpyZWdpc3RyeSA9ICJnaXQ6Ly9taXJyb3JzLnVzdGMuZWR1LmNuL2NyYXRlcy5pby1pbmRleCIKCg==\"")
packr.PackJSONBytes("./images", "rust/src/fns/mod.rs", "\"cHViIG1vZCBmbnMgewogICAgI1tkZXJpdmUoU2VyaWFsaXplKV0KICAgIHB1YiBzdHJ1Y3QgUmVzcG9uc2UgewogICAgICAgIHB1YiByZXN1bHQ6IGkzMiwKICAgIH0KCiAgICAjW2Rlcml2ZShEZXNlcmlhbGl6ZSldCiAgICBwdWIgc3RydWN0IFJlcXVlc3QgewogICAgICAgIHB1YiBhOiBpMzIsCiAgICAgICAgcHViIGI6IGkzMiwKICAgIH0KCiAgICBwdWIgZm4gZnVuYyhyZXE6IFJlcXVlc3QpIC0+IFJlc3BvbnNlIHsKICAgICAgICBSZXNwb25zZSB7CiAgICAgICAgICAgIHJlc3VsdDogcmVxLmEgKyByZXEuYiwKICAgICAgICB9CiAgICB9Cn0K\"")
packr.PackJSONBytes("./images", "rust/src/main.rs", "\"IyFbZmVhdHVyZShwcm9jX21hY3JvX2h5Z2llbmUsIGRlY2xfbWFjcm8sIHBsdWdpbildCgojW21hY3JvX3VzZV0KZXh0ZXJuIGNyYXRlIHJvY2tldDsKZXh0ZXJuIGNyYXRlIHJvY2tldF9jb250cmliOwpleHRlcm4gY3JhdGUgc2VyZGU7CiNbbWFjcm9fdXNlXQpleHRlcm4gY3JhdGUgc2VyZGVfZGVyaXZlOwpleHRlcm4gY3JhdGUgc2VyZGVfanNvbjsKCm1vZCBmbnM7Cgp1c2Ugcm9ja2V0X2NvbnRyaWI6Ompzb246Okpzb247CgojW3Bvc3QoIi8iLCBmb3JtYXQgPSAiYXBwbGljYXRpb24vanNvbiIsIGRhdGEgPSAiPHJlcT4iKV0KZm4gaW5kZXgocmVxOiBKc29uPGZuczo6Zm5zOjpSZXF1ZXN0PikgLT4gSnNvbjxmbnM6OmZuczo6UmVzcG9uc2U+IHsKICAgIEpzb24oZm5zOjpmbnM6OmZ1bmMocmVxLjApKQp9CgpmbiBtYWluKCkgewogICAgcm9ja2V0OjppZ25pdGUoKS5tb3VudCgiLyIsIHJvdXRlcyFbaW5kZXhdKS5sYXVuY2goKTsKfQo=\"")
}