IyAtKi0gY29kaW5nOiBsYXRpbi0xIC0qLQoKIiIiSGVhcCBxdWV1ZSBhbGdvcml0aG0gKGEuay5hLiBwcmlvcml0eSBxdWV1ZSkuCgpIZWFwcyBhcmUgYXJyYXlzIGZvciB3aGljaCBhW2tdIDw9IGFbMiprKzFdIGFuZCBhW2tdIDw9IGFbMiprKzJdIGZvcgphbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sCm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZwpwcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBhWzBdIGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC4KClVzYWdlOgoKaGVhcCA9IFtdICAgICAgICAgICAgIyBjcmVhdGVzIGFuIGVtcHR5IGhlYXAKaGVhcHB1c2goaGVhcCwgaXRlbSkgIyBwdXNoZXMgYSBuZXcgaXRlbSBvbiB0aGUgaGVhcAppdGVtID0gaGVhcHBvcChoZWFwKSAjIHBvcHMgdGhlIHNtYWxsZXN0IGl0ZW0gZnJvbSB0aGUgaGVhcAppdGVtID0gaGVhcFswXSAgICAgICAjIHNtYWxsZXN0IGl0ZW0gb24gdGhlIGhlYXAgd2l0aG91dCBwb3BwaW5nIGl0CmhlYXBpZnkoeCkgICAgICAgICAgICMgdHJhbnNmb3JtcyBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gbGluZWFyIHRpbWUKaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pICMgcG9wcyBhbmQgcmV0dXJucyBzbWFsbGVzdCBpdGVtLCBhbmQgYWRkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuZXcgaXRlbTsgdGhlIGhlYXAgc2l6ZSBpcyB1bmNoYW5nZWQKCk91ciBBUEkgZGlmZmVycyBmcm9tIHRleHRib29rIGhlYXAgYWxnb3JpdGhtcyBhcyBmb2xsb3dzOgoKLSBXZSB1c2UgMC1iYXNlZCBpbmRleGluZy4gIFRoaXMgbWFrZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZQogIGluZGV4IGZvciBhIG5vZGUgYW5kIHRoZSBpbmRleGVzIGZvciBpdHMgY2hpbGRyZW4gc2xpZ2h0bHkgbGVzcwogIG9idmlvdXMsIGJ1dCBpcyBtb3JlIHN1aXRhYmxlIHNpbmNlIFB5dGhvbiB1c2VzIDAtYmFzZWQgaW5kZXhpbmcuCgotIE91ciBoZWFwcG9wKCkgbWV0aG9kIHJldHVybnMgdGhlIHNtYWxsZXN0IGl0ZW0sIG5vdCB0aGUgbGFyZ2VzdC4KClRoZXNlIHR3byBtYWtlIGl0IHBvc3NpYmxlIHRvIHZpZXcgdGhlIGhlYXAgYXMgYSByZWd1bGFyIFB5dGhvbiBsaXN0CndpdGhvdXQgc3VycHJpc2VzOiBoZWFwWzBdIGlzIHRoZSBzbWFsbGVzdCBpdGVtLCBhbmQgaGVhcC5zb3J0KCkKbWFpbnRhaW5zIHRoZSBoZWFwIGludmFyaWFudCEKIiIiCgojIE9yaWdpbmFsIGNvZGUgYnkgS2V2aW4gTydDb25ub3IsIGF1Z21lbnRlZCBieSBUaW0gUGV0ZXJzIGFuZCBSYXltb25kIEhldHRpbmdlcgoKX19hYm91dF9fID0gIiIiSGVhcCBxdWV1ZXMKCltleHBsYW5hdGlvbiBieSBGcmFu529pcyBQaW5hcmRdCgpIZWFwcyBhcmUgYXJyYXlzIGZvciB3aGljaCBhW2tdIDw9IGFbMiprKzFdIGFuZCBhW2tdIDw9IGFbMiprKzJdIGZvcgphbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sCm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZwpwcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBhWzBdIGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC4KClRoZSBzdHJhbmdlIGludmFyaWFudCBhYm92ZSBpcyBtZWFudCB0byBiZSBhbiBlZmZpY2llbnQgbWVtb3J5CnJlcHJlc2VudGF0aW9uIGZvciBhIHRvdXJuYW1lbnQuICBUaGUgbnVtYmVycyBiZWxvdyBhcmUgYGsnLCBub3QgYVtrXToKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAoKICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKCiAgICAgICAgICAzICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICA1ICAgICAgICAgICAgICAgNgoKICAgICAgNyAgICAgICA4ICAgICAgIDkgICAgICAgMTAgICAgICAxMSAgICAgIDEyICAgICAgMTMgICAgICAxNAoKICAgIDE1IDE2ICAgMTcgMTggICAxOSAyMCAgIDIxIDIyICAgMjMgMjQgICAyNSAyNiAgIDI3IDI4ICAgMjkgMzAKCgpJbiB0aGUgdHJlZSBhYm92ZSwgZWFjaCBjZWxsIGBrJyBpcyB0b3BwaW5nIGAyKmsrMScgYW5kIGAyKmsrMicuICBJbgphbiB1c3VhbCBiaW5hcnkgdG91cm5hbWVudCB3ZSBzZWUgaW4gc3BvcnRzLCBlYWNoIGNlbGwgaXMgdGhlIHdpbm5lcgpvdmVyIHRoZSB0d28gY2VsbHMgaXQgdG9wcywgYW5kIHdlIGNhbiB0cmFjZSB0aGUgd2lubmVyIGRvd24gdGhlIHRyZWUKdG8gc2VlIGFsbCBvcHBvbmVudHMgcy9oZSBoYWQuICBIb3dldmVyLCBpbiBtYW55IGNvbXB1dGVyIGFwcGxpY2F0aW9ucwpvZiBzdWNoIHRvdXJuYW1lbnRzLCB3ZSBkbyBub3QgbmVlZCB0byB0cmFjZSB0aGUgaGlzdG9yeSBvZiBhIHdpbm5lci4KVG8gYmUgbW9yZSBtZW1vcnkgZWZmaWNpZW50LCB3aGVuIGEgd2lubmVyIGlzIHByb21vdGVkLCB3ZSB0cnkgdG8KcmVwbGFjZSBpdCBieSBzb21ldGhpbmcgZWxzZSBhdCBhIGxvd2VyIGxldmVsLCBhbmQgdGhlIHJ1bGUgYmVjb21lcwp0aGF0IGEgY2VsbCBhbmQgdGhlIHR3byBjZWxscyBpdCB0b3BzIGNvbnRhaW4gdGhyZWUgZGlmZmVyZW50IGl0ZW1zLApidXQgdGhlIHRvcCBjZWxsICJ3aW5zIiBvdmVyIHRoZSB0d28gdG9wcGVkIGNlbGxzLgoKSWYgdGhpcyBoZWFwIGludmFyaWFudCBpcyBwcm90ZWN0ZWQgYXQgYWxsIHRpbWUsIGluZGV4IDAgaXMgY2xlYXJseQp0aGUgb3ZlcmFsbCB3aW5uZXIuICBUaGUgc2ltcGxlc3QgYWxnb3JpdGhtaWMgd2F5IHRvIHJlbW92ZSBpdCBhbmQKZmluZCB0aGUgIm5leHQiIHdpbm5lciBpcyB0byBtb3ZlIHNvbWUgbG9zZXIgKGxldCdzIHNheSBjZWxsIDMwIGluIHRoZQpkaWFncmFtIGFib3ZlKSBpbnRvIHRoZSAwIHBvc2l0aW9uLCBhbmQgdGhlbiBwZXJjb2xhdGUgdGhpcyBuZXcgMCBkb3duCnRoZSB0cmVlLCBleGNoYW5naW5nIHZhbHVlcywgdW50aWwgdGhlIGludmFyaWFudCBpcyByZS1lc3RhYmxpc2hlZC4KVGhpcyBpcyBjbGVhcmx5IGxvZ2FyaXRobWljIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRyZWUuCkJ5IGl0ZXJhdGluZyBvdmVyIGFsbCBpdGVtcywgeW91IGdldCBhbiBPKG4gbG4gbikgc29ydC4KCkEgbmljZSBmZWF0dXJlIG9mIHRoaXMgc29ydCBpcyB0aGF0IHlvdSBjYW4gZWZmaWNpZW50bHkgaW5zZXJ0IG5ldwppdGVtcyB3aGlsZSB0aGUgc29ydCBpcyBnb2luZyBvbiwgcHJvdmlkZWQgdGhhdCB0aGUgaW5zZXJ0ZWQgaXRlbXMgYXJlCm5vdCAiYmV0dGVyIiB0aGFuIHRoZSBsYXN0IDAndGggZWxlbWVudCB5b3UgZXh0cmFjdGVkLiAgVGhpcyBpcwplc3BlY2lhbGx5IHVzZWZ1bCBpbiBzaW11bGF0aW9uIGNvbnRleHRzLCB3aGVyZSB0aGUgdHJlZSBob2xkcyBhbGwKaW5jb21pbmcgZXZlbnRzLCBhbmQgdGhlICJ3aW4iIGNvbmRpdGlvbiBtZWFucyB0aGUgc21hbGxlc3Qgc2NoZWR1bGVkCnRpbWUuICBXaGVuIGFuIGV2ZW50IHNjaGVkdWxlIG90aGVyIGV2ZW50cyBmb3IgZXhlY3V0aW9uLCB0aGV5IGFyZQpzY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUgaGVhcC4gIFNvLCBhCmhlYXAgaXMgYSBnb29kIHN0cnVjdHVyZSBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgKHRoaXMgaXMgd2hhdCBJCnVzZWQgZm9yIG15IE1JREkgc2VxdWVuY2VyIDotKS4KClZhcmlvdXMgc3RydWN0dXJlcyBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgaGF2ZSBiZWVuIGV4dGVuc2l2ZWx5CnN0dWRpZWQsIGFuZCBoZWFwcyBhcmUgZ29vZCBmb3IgdGhpcywgYXMgdGhleSBhcmUgcmVhc29uYWJseSBzcGVlZHksCnRoZSBzcGVlZCBpcyBhbG1vc3QgY29uc3RhbnQsIGFuZCB0aGUgd29yc3QgY2FzZSBpcyBub3QgbXVjaCBkaWZmZXJlbnQKdGhhbiB0aGUgYXZlcmFnZSBjYXNlLiAgSG93ZXZlciwgdGhlcmUgYXJlIG90aGVyIHJlcHJlc2VudGF0aW9ucyB3aGljaAphcmUgbW9yZSBlZmZpY2llbnQgb3ZlcmFsbCwgeWV0IHRoZSB3b3JzdCBjYXNlcyBtaWdodCBiZSB0ZXJyaWJsZS4KCkhlYXBzIGFyZSBhbHNvIHZlcnkgdXNlZnVsIGluIGJpZyBkaXNrIHNvcnRzLiAgWW91IG1vc3QgcHJvYmFibHkgYWxsCmtub3cgdGhhdCBhIGJpZyBzb3J0IGltcGxpZXMgcHJvZHVjaW5nICJydW5zIiAod2hpY2ggYXJlIHByZS1zb3J0ZWQKc2VxdWVuY2VzLCB3aGljaCBzaXplIGlzIHVzdWFsbHkgcmVsYXRlZCB0byB0aGUgYW1vdW50IG9mIENQVSBtZW1vcnkpLApmb2xsb3dlZCBieSBhIG1lcmdpbmcgcGFzc2VzIGZvciB0aGVzZSBydW5zLCB3aGljaCBtZXJnaW5nIGlzIG9mdGVuCnZlcnkgY2xldmVybHkgb3JnYW5pc2VkWzFdLiAgSXQgaXMgdmVyeSBpbXBvcnRhbnQgdGhhdCB0aGUgaW5pdGlhbApzb3J0IHByb2R1Y2VzIHRoZSBsb25nZXN0IHJ1bnMgcG9zc2libGUuICBUb3VybmFtZW50cyBhcmUgYSBnb29kIHdheQp0byB0aGF0LiAgSWYsIHVzaW5nIGFsbCB0aGUgbWVtb3J5IGF2YWlsYWJsZSB0byBob2xkIGEgdG91cm5hbWVudCwgeW91CnJlcGxhY2UgYW5kIHBlcmNvbGF0ZSBpdGVtcyB0aGF0IGhhcHBlbiB0byBmaXQgdGhlIGN1cnJlbnQgcnVuLCB5b3UnbGwKcHJvZHVjZSBydW5zIHdoaWNoIGFyZSB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciByYW5kb20gaW5wdXQsCmFuZCBtdWNoIGJldHRlciBmb3IgaW5wdXQgZnV6emlseSBvcmRlcmVkLgoKTW9yZW92ZXIsIGlmIHlvdSBvdXRwdXQgdGhlIDAndGggaXRlbSBvbiBkaXNrIGFuZCBnZXQgYW4gaW5wdXQgd2hpY2gKbWF5IG5vdCBmaXQgaW4gdGhlIGN1cnJlbnQgdG91cm5hbWVudCAoYmVjYXVzZSB0aGUgdmFsdWUgIndpbnMiIG92ZXIKdGhlIGxhc3Qgb3V0cHV0IHZhbHVlKSwgaXQgY2Fubm90IGZpdCBpbiB0aGUgaGVhcCwgc28gdGhlIHNpemUgb2YgdGhlCmhlYXAgZGVjcmVhc2VzLiAgVGhlIGZyZWVkIG1lbW9yeSBjb3VsZCBiZSBjbGV2ZXJseSByZXVzZWQgaW1tZWRpYXRlbHkKZm9yIHByb2dyZXNzaXZlbHkgYnVpbGRpbmcgYSBzZWNvbmQgaGVhcCwgd2hpY2ggZ3Jvd3MgYXQgZXhhY3RseSB0aGUKc2FtZSByYXRlIHRoZSBmaXJzdCBoZWFwIGlzIG1lbHRpbmcuICBXaGVuIHRoZSBmaXJzdCBoZWFwIGNvbXBsZXRlbHkKdmFuaXNoZXMsIHlvdSBzd2l0Y2ggaGVhcHMgYW5kIHN0YXJ0IGEgbmV3IHJ1bi4gIENsZXZlciBhbmQgcXVpdGUKZWZmZWN0aXZlIQoKSW4gYSB3b3JkLCBoZWFwcyBhcmUgdXNlZnVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIGtub3cuICBJIHVzZSB0aGVtIGluCmEgZmV3IGFwcGxpY2F0aW9ucywgYW5kIEkgdGhpbmsgaXQgaXMgZ29vZCB0byBrZWVwIGEgYGhlYXAnIG1vZHVsZQphcm91bmQuIDotKQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0KWzFdIFRoZSBkaXNrIGJhbGFuY2luZyBhbGdvcml0aG1zIHdoaWNoIGFyZSBjdXJyZW50LCBub3dhZGF5cywgYXJlCm1vcmUgYW5ub3lpbmcgdGhhbiBjbGV2ZXIsIGFuZCB0aGlzIGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHNlZWtpbmcKY2FwYWJpbGl0aWVzIG9mIHRoZSBkaXNrcy4gIE9uIGRldmljZXMgd2hpY2ggY2Fubm90IHNlZWssIGxpa2UgYmlnCnRhcGUgZHJpdmVzLCB0aGUgc3Rvcnkgd2FzIHF1aXRlIGRpZmZlcmVudCwgYW5kIG9uZSBoYWQgdG8gYmUgdmVyeQpjbGV2ZXIgdG8gZW5zdXJlIChmYXIgaW4gYWR2YW5jZSkgdGhhdCBlYWNoIHRhcGUgbW92ZW1lbnQgd2lsbCBiZSB0aGUKbW9zdCBlZmZlY3RpdmUgcG9zc2libGUgKHRoYXQgaXMsIHdpbGwgYmVzdCBwYXJ0aWNpcGF0ZSBhdAoicHJvZ3Jlc3NpbmciIHRoZSBtZXJnZSkuICBTb21lIHRhcGVzIHdlcmUgZXZlbiBhYmxlIHRvIHJlYWQKYmFja3dhcmRzLCBhbmQgdGhpcyB3YXMgYWxzbyB1c2VkIHRvIGF2b2lkIHRoZSByZXdpbmRpbmcgdGltZS4KQmVsaWV2ZSBtZSwgcmVhbCBnb29kIHRhcGUgc29ydHMgd2VyZSBxdWl0ZSBzcGVjdGFjdWxhciB0byB3YXRjaCEKRnJvbSBhbGwgdGltZXMsIHNvcnRpbmcgaGFzIGFsd2F5cyBiZWVuIGEgR3JlYXQgQXJ0ISA6LSkKIiIiCgpfX2FsbF9fID0gWydoZWFwcHVzaCcsICdoZWFwcG9wJywgJ2hlYXBpZnknLCAnaGVhcHJlcGxhY2UnLCAnbWVyZ2UnLAogICAgICAgICAgICdubGFyZ2VzdCcsICduc21hbGxlc3QnLCAnaGVhcHB1c2hwb3AnXQoKZnJvbSBpdGVydG9vbHMgaW1wb3J0IGlzbGljZSwgcmVwZWF0LCBjb3VudCwgaW1hcCwgaXppcCwgdGVlLCBjaGFpbgpmcm9tIG9wZXJhdG9yIGltcG9ydCBpdGVtZ2V0dGVyCmltcG9ydCBiaXNlY3QKCmRlZiBjbXBfbHQoeCwgeSk6CiAgICAjIFVzZSBfX2x0X18gaWYgYXZhaWxhYmxlOyBvdGhlcndpc2UsIHRyeSBfX2xlX18uCiAgICAjIEluIFB5My54LCBvbmx5IF9fbHRfXyB3aWxsIGJlIGNhbGxlZC4KICAgIHJldHVybiAoeCA8IHkpIGlmIGhhc2F0dHIoeCwgJ19fbHRfXycpIGVsc2UgKG5vdCB5IDw9IHgpCgpkZWYgaGVhcHB1c2goaGVhcCwgaXRlbSk6CiAgICAiIiJQdXNoIGl0ZW0gb250byBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuIiIiCiAgICBoZWFwLmFwcGVuZChpdGVtKQogICAgX3NpZnRkb3duKGhlYXAsIDAsIGxlbihoZWFwKS0xKQoKZGVmIGhlYXBwb3AoaGVhcCk6CiAgICAiIiJQb3AgdGhlIHNtYWxsZXN0IGl0ZW0gb2ZmIHRoZSBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuIiIiCiAgICBsYXN0ZWx0ID0gaGVhcC5wb3AoKSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHkKICAgIGlmIGhlYXA6CiAgICAgICAgcmV0dXJuaXRlbSA9IGhlYXBbMF0KICAgICAgICBoZWFwWzBdID0gbGFzdGVsdAogICAgICAgIF9zaWZ0dXAoaGVhcCwgMCkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuaXRlbSA9IGxhc3RlbHQKICAgIHJldHVybiByZXR1cm5pdGVtCgpkZWYgaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSk6CiAgICAiIiJQb3AgYW5kIHJldHVybiB0aGUgY3VycmVudCBzbWFsbGVzdCB2YWx1ZSwgYW5kIGFkZCB0aGUgbmV3IGl0ZW0uCgogICAgVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGhlYXBwb3AoKSBmb2xsb3dlZCBieSBoZWFwcHVzaCgpLCBhbmQgY2FuIGJlCiAgICBtb3JlIGFwcHJvcHJpYXRlIHdoZW4gdXNpbmcgYSBmaXhlZC1zaXplIGhlYXAuICBOb3RlIHRoYXQgdGhlIHZhbHVlCiAgICByZXR1cm5lZCBtYXkgYmUgbGFyZ2VyIHRoYW4gaXRlbSEgIFRoYXQgY29uc3RyYWlucyByZWFzb25hYmxlIHVzZXMgb2YKICAgIHRoaXMgcm91dGluZSB1bmxlc3Mgd3JpdHRlbiBhcyBwYXJ0IG9mIGEgY29uZGl0aW9uYWwgcmVwbGFjZW1lbnQ6CgogICAgICAgIGlmIGl0ZW0gPiBoZWFwWzBdOgogICAgICAgICAgICBpdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSkKICAgICIiIgogICAgcmV0dXJuaXRlbSA9IGhlYXBbMF0gICAgIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5CiAgICBoZWFwWzBdID0gaXRlbQogICAgX3NpZnR1cChoZWFwLCAwKQogICAgcmV0dXJuIHJldHVybml0ZW0KCmRlZiBoZWFwcHVzaHBvcChoZWFwLCBpdGVtKToKICAgICIiIkZhc3QgdmVyc2lvbiBvZiBhIGhlYXBwdXNoIGZvbGxvd2VkIGJ5IGEgaGVhcHBvcC4iIiIKICAgIGlmIGhlYXAgYW5kIGNtcF9sdChoZWFwWzBdLCBpdGVtKToKICAgICAgICBpdGVtLCBoZWFwWzBdID0gaGVhcFswXSwgaXRlbQogICAgICAgIF9zaWZ0dXAoaGVhcCwgMCkKICAgIHJldHVybiBpdGVtCgpkZWYgaGVhcGlmeSh4KToKICAgICIiIlRyYW5zZm9ybSBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gTyhsZW4oeCkpIHRpbWUuIiIiCiAgICBuID0gbGVuKHgpCiAgICAjIFRyYW5zZm9ybSBib3R0b20tdXAuICBUaGUgbGFyZ2VzdCBpbmRleCB0aGVyZSdzIGFueSBwb2ludCB0byBsb29raW5nIGF0CiAgICAjIGlzIHRoZSBsYXJnZXN0IHdpdGggYSBjaGlsZCBpbmRleCBpbi1yYW5nZSwgc28gbXVzdCBoYXZlIDIqaSArIDEgPCBuLAogICAgIyBvciBpIDwgKG4tMSkvMi4gIElmIG4gaXMgZXZlbiA9IDIqaiwgdGhpcyBpcyAoMipqLTEpLzIgPSBqLTEvMiBzbwogICAgIyBqLTEgaXMgdGhlIGxhcmdlc3QsIHdoaWNoIGlzIG4vLzIgLSAxLiAgSWYgbiBpcyBvZGQgPSAyKmorMSwgdGhpcyBpcwogICAgIyAoMipqKzEtMSkvMiA9IGogc28gai0xIGlzIHRoZSBsYXJnZXN0LCBhbmQgdGhhdCdzIGFnYWluIG4vLzItMS4KICAgIGZvciBpIGluIHJldmVyc2VkKHhyYW5nZShuLy8yKSk6CiAgICAgICAgX3NpZnR1cCh4LCBpKQoKZGVmIG5sYXJnZXN0KG4sIGl0ZXJhYmxlKToKICAgICIiIkZpbmQgdGhlIG4gbGFyZ2VzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuCgogICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwgcmV2ZXJzZT1UcnVlKVs6bl0KICAgICIiIgogICAgaWYgbiA8IDA6CiAgICAgICAgcmV0dXJuIFtdCiAgICBpdCA9IGl0ZXIoaXRlcmFibGUpCiAgICByZXN1bHQgPSBsaXN0KGlzbGljZShpdCwgbikpCiAgICBpZiBub3QgcmVzdWx0OgogICAgICAgIHJldHVybiByZXN1bHQKICAgIGhlYXBpZnkocmVzdWx0KQogICAgX2hlYXBwdXNocG9wID0gaGVhcHB1c2hwb3AKICAgIGZvciBlbGVtIGluIGl0OgogICAgICAgIF9oZWFwcHVzaHBvcChyZXN1bHQsIGVsZW0pCiAgICByZXN1bHQuc29ydChyZXZlcnNlPVRydWUpCiAgICByZXR1cm4gcmVzdWx0CgpkZWYgbnNtYWxsZXN0KG4sIGl0ZXJhYmxlKToKICAgICIiIkZpbmQgdGhlIG4gc21hbGxlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0LgoKICAgIEVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUpWzpuXQogICAgIiIiCiAgICBpZiBuIDwgMDoKICAgICAgICByZXR1cm4gW10KICAgIGlmIGhhc2F0dHIoaXRlcmFibGUsICdfX2xlbl9fJykgYW5kIG4gKiAxMCA8PSBsZW4oaXRlcmFibGUpOgogICAgICAgICMgRm9yIHNtYWxsZXIgdmFsdWVzIG9mIG4sIHRoZSBiaXNlY3QgbWV0aG9kIGlzIGZhc3RlciB0aGFuIGEgbWluaGVhcC4KICAgICAgICAjIEl0IGlzIGFsc28gbWVtb3J5IGVmZmljaWVudCwgY29uc3VtaW5nIG9ubHkgbiBlbGVtZW50cyBvZiBzcGFjZS4KICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpCiAgICAgICAgcmVzdWx0ID0gc29ydGVkKGlzbGljZShpdCwgMCwgbikpCiAgICAgICAgaWYgbm90IHJlc3VsdDoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgICAgIGluc29ydCA9IGJpc2VjdC5pbnNvcnQKICAgICAgICBwb3AgPSByZXN1bHQucG9wCiAgICAgICAgbG9zID0gcmVzdWx0Wy0xXSAgICAjIGxvcyAtLT4gTGFyZ2VzdCBvZiB0aGUgbnNtYWxsZXN0CiAgICAgICAgZm9yIGVsZW0gaW4gaXQ6CiAgICAgICAgICAgIGlmIGNtcF9sdChlbGVtLCBsb3MpOgogICAgICAgICAgICAgICAgaW5zb3J0KHJlc3VsdCwgZWxlbSkKICAgICAgICAgICAgICAgIHBvcCgpCiAgICAgICAgICAgICAgICBsb3MgPSByZXN1bHRbLTFdCiAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgIyBBbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCBtYW5pZmVzdHMgdGhlIHdob2xlIGl0ZXJhYmxlIGluIG1lbW9yeSBidXQKICAgICMgc2F2ZXMgY29tcGFyaXNvbnMgYnkgaGVhcGlmeWluZyBhbGwgYXQgb25jZS4gIEFsc28sIHNhdmVzIHRpbWUKICAgICMgb3ZlciBiaXNlY3QuaW5zb3J0KCkgd2hpY2ggaGFzIE8obikgZGF0YSBtb3ZlbWVudCB0aW1lIGZvciBldmVyeQogICAgIyBpbnNlcnRpb24uICBGaW5kaW5nIHRoZSBuIHNtYWxsZXN0IG9mIGFuIG0gbGVuZ3RoIGl0ZXJhYmxlIHJlcXVpcmVzCiAgICAjICAgIE8obSkgKyBPKG4gbG9nIG0pIGNvbXBhcmlzb25zLgogICAgaCA9IGxpc3QoaXRlcmFibGUpCiAgICBoZWFwaWZ5KGgpCiAgICByZXR1cm4gbWFwKGhlYXBwb3AsIHJlcGVhdChoLCBtaW4obiwgbGVuKGgpKSkpCgojICdoZWFwJyBpcyBhIGhlYXAgYXQgYWxsIGluZGljZXMgPj0gc3RhcnRwb3MsIGV4Y2VwdCBwb3NzaWJseSBmb3IgcG9zLiAgcG9zCiMgaXMgdGhlIGluZGV4IG9mIGEgbGVhZiB3aXRoIGEgcG9zc2libHkgb3V0LW9mLW9yZGVyIHZhbHVlLiAgUmVzdG9yZSB0aGUKIyBoZWFwIGludmFyaWFudC4KZGVmIF9zaWZ0ZG93bihoZWFwLCBzdGFydHBvcywgcG9zKToKICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc10KICAgICMgRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcgYSBwbGFjZQogICAgIyBuZXdpdGVtIGZpdHMuCiAgICB3aGlsZSBwb3MgPiBzdGFydHBvczoKICAgICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMQogICAgICAgIHBhcmVudCA9IGhlYXBbcGFyZW50cG9zXQogICAgICAgIGlmIGNtcF9sdChuZXdpdGVtLCBwYXJlbnQpOgogICAgICAgICAgICBoZWFwW3Bvc10gPSBwYXJlbnQKICAgICAgICAgICAgcG9zID0gcGFyZW50cG9zCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgYnJlYWsKICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW0KCiMgVGhlIGNoaWxkIGluZGljZXMgb2YgaGVhcCBpbmRleCBwb3MgYXJlIGFscmVhZHkgaGVhcHMsIGFuZCB3ZSB3YW50IHRvIG1ha2UKIyBhIGhlYXAgYXQgaW5kZXggcG9zIHRvby4gIFdlIGRvIHRoaXMgYnkgYnViYmxpbmcgdGhlIHNtYWxsZXIgY2hpbGQgb2YKIyBwb3MgdXAgKGFuZCBzbyBvbiB3aXRoIHRoYXQgY2hpbGQncyBjaGlsZHJlbiwgZXRjKSB1bnRpbCBoaXR0aW5nIGEgbGVhZiwKIyB0aGVuIHVzaW5nIF9zaWZ0ZG93biB0byBtb3ZlIHRoZSBvZGRiYWxsIG9yaWdpbmFsbHkgYXQgaW5kZXggcG9zIGludG8gcGxhY2UuCiMKIyBXZSAqY291bGQqIGJyZWFrIG91dCBvZiB0aGUgbG9vcCBhcyBzb29uIGFzIHdlIGZpbmQgYSBwb3Mgd2hlcmUgbmV3aXRlbSA8PQojIGJvdGggaXRzIGNoaWxkcmVuLCBidXQgdHVybnMgb3V0IHRoYXQncyBub3QgYSBnb29kIGlkZWEsIGFuZCBkZXNwaXRlIHRoYXQKIyBtYW55IGJvb2tzIHdyaXRlIHRoZSBhbGdvcml0aG0gdGhhdCB3YXkuICBEdXJpbmcgYSBoZWFwIHBvcCwgdGhlIGxhc3QgYXJyYXkKIyBlbGVtZW50IGlzIHNpZnRlZCBpbiwgYW5kIHRoYXQgdGVuZHMgdG8gYmUgbGFyZ2UsIHNvIHRoYXQgY29tcGFyaW5nIGl0CiMgYWdhaW5zdCB2YWx1ZXMgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCB1c3VhbGx5IGRvZXNuJ3QgcGF5ICg9IHVzdWFsbHkgZG9lc24ndAojIGdldCB1cyBvdXQgb2YgdGhlIGxvb3AgZWFybHkpLiAgU2VlIEtudXRoLCBWb2x1bWUgMywgd2hlcmUgdGhpcyBpcwojIGV4cGxhaW5lZCBhbmQgcXVhbnRpZmllZCBpbiBhbiBleGVyY2lzZS4KIwojIEN1dHRpbmcgdGhlICMgb2YgY29tcGFyaXNvbnMgaXMgaW1wb3J0YW50LCBzaW5jZSB0aGVzZSByb3V0aW5lcyBoYXZlIG5vCiMgd2F5IHRvIGV4dHJhY3QgInRoZSBwcmlvcml0eSIgZnJvbSBhbiBhcnJheSBlbGVtZW50LCBzbyB0aGF0IGludGVsbGlnZW5jZQojIGlzIGxpa2VseSB0byBiZSBoaWRpbmcgaW4gY3VzdG9tIF9fY21wX18gbWV0aG9kcywgb3IgaW4gYXJyYXkgZWxlbWVudHMKIyBzdG9yaW5nIChwcmlvcml0eSwgcmVjb3JkKSB0dXBsZXMuICBDb21wYXJpc29ucyBhcmUgdGh1cyBwb3RlbnRpYWxseQojIGV4cGVuc2l2ZS4KIwojIE9uIHJhbmRvbSBhcnJheXMgb2YgbGVuZ3RoIDEwMDAsIG1ha2luZyB0aGlzIGNoYW5nZSBjdXQgdGhlIG51bWJlciBvZgojIGNvbXBhcmlzb25zIG1hZGUgYnkgaGVhcGlmeSgpIGEgbGl0dGxlLCBhbmQgdGhvc2UgbWFkZSBieSBleGhhdXN0aXZlCiMgaGVhcHBvcCgpIGEgbG90LCBpbiBhY2NvcmQgd2l0aCB0aGVvcnkuICBIZXJlIGFyZSB0eXBpY2FsIHJlc3VsdHMgZnJvbSAzCiMgcnVucyAoMyBqdXN0IHRvIGRlbW9uc3RyYXRlIGhvdyBzbWFsbCB0aGUgdmFyaWFuY2UgaXMpOgojCiMgQ29tcGFyZXMgbmVlZGVkIGJ5IGhlYXBpZnkgICAgIENvbXBhcmVzIG5lZWRlZCBieSAxMDAwIGhlYXBwb3BzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgMTgzNyBjdXQgdG8gMTY2MyAgICAgICAgICAgICAgIDE0OTk2IGN1dCB0byA4NjgwCiMgMTg1NSBjdXQgdG8gMTY1OSAgICAgICAgICAgICAgIDE0OTY2IGN1dCB0byA4Njc4CiMgMTg0NyBjdXQgdG8gMTY2MCAgICAgICAgICAgICAgIDE1MDI0IGN1dCB0byA4NzAzCiMKIyBCdWlsZGluZyB0aGUgaGVhcCBieSB1c2luZyBoZWFwcHVzaCgpIDEwMDAgdGltZXMgaW5zdGVhZCByZXF1aXJlZAojIDIxOTgsIDIxNDgsIGFuZCAyMjE5IGNvbXBhcmVzOiAgaGVhcGlmeSgpIGlzIG1vcmUgZWZmaWNpZW50LCB3aGVuCiMgeW91IGNhbiB1c2UgaXQuCiMKIyBUaGUgdG90YWwgY29tcGFyZXMgbmVlZGVkIGJ5IGxpc3Quc29ydCgpIG9uIHRoZSBzYW1lIGxpc3RzIHdlcmUgODYyNywKIyA4NjI3LCBhbmQgODYzMiAodGhpcyBzaG91bGQgYmUgY29tcGFyZWQgdG8gdGhlIHN1bSBvZiBoZWFwaWZ5KCkgYW5kCiMgaGVhcHBvcCgpIGNvbXBhcmVzKTogIGxpc3Quc29ydCgpIGlzICh1bnN1cnByaXNpbmdseSEpIG1vcmUgZWZmaWNpZW50CiMgZm9yIHNvcnRpbmcuCgpkZWYgX3NpZnR1cChoZWFwLCBwb3MpOgogICAgZW5kcG9zID0gbGVuKGhlYXApCiAgICBzdGFydHBvcyA9IHBvcwogICAgbmV3aXRlbSA9IGhlYXBbcG9zXQogICAgIyBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuCiAgICBjaGlsZHBvcyA9IDIqcG9zICsgMSAgICAjIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uCiAgICB3aGlsZSBjaGlsZHBvcyA8IGVuZHBvczoKICAgICAgICAjIFNldCBjaGlsZHBvcyB0byBpbmRleCBvZiBzbWFsbGVyIGNoaWxkLgogICAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxCiAgICAgICAgaWYgcmlnaHRwb3MgPCBlbmRwb3MgYW5kIG5vdCBjbXBfbHQoaGVhcFtjaGlsZHBvc10sIGhlYXBbcmlnaHRwb3NdKToKICAgICAgICAgICAgY2hpbGRwb3MgPSByaWdodHBvcwogICAgICAgICMgTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC4KICAgICAgICBoZWFwW3Bvc10gPSBoZWFwW2NoaWxkcG9zXQogICAgICAgIHBvcyA9IGNoaWxkcG9zCiAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDEKICAgICMgVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYnViYmxlIGl0IHVwCiAgICAjIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLgogICAgaGVhcFtwb3NdID0gbmV3aXRlbQogICAgX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpCgojIElmIGF2YWlsYWJsZSwgdXNlIEMgaW1wbGVtZW50YXRpb24KdHJ5OgogICAgZnJvbSBfaGVhcHEgaW1wb3J0ICoKZXhjZXB0IEltcG9ydEVycm9yOgogICAgcGFzcwoKZGVmIG1lcmdlKCppdGVyYWJsZXMpOgogICAgJycnTWVyZ2UgbXVsdGlwbGUgc29ydGVkIGlucHV0cyBpbnRvIGEgc2luZ2xlIHNvcnRlZCBvdXRwdXQuCgogICAgU2ltaWxhciB0byBzb3J0ZWQoaXRlcnRvb2xzLmNoYWluKCppdGVyYWJsZXMpKSBidXQgcmV0dXJucyBhIGdlbmVyYXRvciwKICAgIGRvZXMgbm90IHB1bGwgdGhlIGRhdGEgaW50byBtZW1vcnkgYWxsIGF0IG9uY2UsIGFuZCBhc3N1bWVzIHRoYXQgZWFjaCBvZgogICAgdGhlIGlucHV0IHN0cmVhbXMgaXMgYWxyZWFkeSBzb3J0ZWQgKHNtYWxsZXN0IHRvIGxhcmdlc3QpLgoKICAgID4+PiBsaXN0KG1lcmdlKFsxLDMsNSw3XSwgWzAsMiw0LDhdLCBbNSwxMCwxNSwyMF0sIFtdLCBbMjVdKSkKICAgIFswLCAxLCAyLCAzLCA0LCA1LCA1LCA3LCA4LCAxMCwgMTUsIDIwLCAyNV0KCiAgICAnJycKICAgIF9oZWFwcG9wLCBfaGVhcHJlcGxhY2UsIF9TdG9wSXRlcmF0aW9uID0gaGVhcHBvcCwgaGVhcHJlcGxhY2UsIFN0b3BJdGVyYXRpb24KCiAgICBoID0gW10KICAgIGhfYXBwZW5kID0gaC5hcHBlbmQKICAgIGZvciBpdG51bSwgaXQgaW4gZW51bWVyYXRlKG1hcChpdGVyLCBpdGVyYWJsZXMpKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIG5leHQgPSBpdC5uZXh0CiAgICAgICAgICAgIGhfYXBwZW5kKFtuZXh0KCksIGl0bnVtLCBuZXh0XSkKICAgICAgICBleGNlcHQgX1N0b3BJdGVyYXRpb246CiAgICAgICAgICAgIHBhc3MKICAgIGhlYXBpZnkoaCkKCiAgICB3aGlsZSAxOgogICAgICAgIHRyeToKICAgICAgICAgICAgd2hpbGUgMToKICAgICAgICAgICAgICAgIHYsIGl0bnVtLCBuZXh0ID0gcyA9IGhbMF0gICAjIHJhaXNlcyBJbmRleEVycm9yIHdoZW4gaCBpcyBlbXB0eQogICAgICAgICAgICAgICAgeWllbGQgdgogICAgICAgICAgICAgICAgc1swXSA9IG5leHQoKSAgICAgICAgICAgICAgICMgcmFpc2VzIFN0b3BJdGVyYXRpb24gd2hlbiBleGhhdXN0ZWQKICAgICAgICAgICAgICAgIF9oZWFwcmVwbGFjZShoLCBzKSAgICAgICAgICAjIHJlc3RvcmUgaGVhcCBjb25kaXRpb24KICAgICAgICBleGNlcHQgX1N0b3BJdGVyYXRpb246CiAgICAgICAgICAgIF9oZWFwcG9wKGgpICAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgZW1wdHkgaXRlcmF0b3IKICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgcmV0dXJuCgojIEV4dGVuZCB0aGUgaW1wbGVtZW50YXRpb25zIG9mIG5zbWFsbGVzdCBhbmQgbmxhcmdlc3QgdG8gdXNlIGEga2V5PSBhcmd1bWVudApfbnNtYWxsZXN0ID0gbnNtYWxsZXN0CmRlZiBuc21hbGxlc3QobiwgaXRlcmFibGUsIGtleT1Ob25lKToKICAgICIiIkZpbmQgdGhlIG4gc21hbGxlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0LgoKICAgIEVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXkpWzpuXQogICAgIiIiCiAgICAjIFNob3J0LWN1dCBmb3Igbj09MSBpcyB0byB1c2UgbWluKCkgd2hlbiBsZW4oaXRlcmFibGUpPjAKICAgIGlmIG4gPT0gMToKICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpCiAgICAgICAgaGVhZCA9IGxpc3QoaXNsaWNlKGl0LCAxKSkKICAgICAgICBpZiBub3QgaGVhZDoKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgaWYga2V5IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBbbWluKGNoYWluKGhlYWQsIGl0KSldCiAgICAgICAgcmV0dXJuIFttaW4oY2hhaW4oaGVhZCwgaXQpLCBrZXk9a2V5KV0KCiAgICAjIFdoZW4gbj49c2l6ZSwgaXQncyBmYXN0ZXIgdG8gdXNlIHNvcnRlZCgpCiAgICB0cnk6CiAgICAgICAgc2l6ZSA9IGxlbihpdGVyYWJsZSkKICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICBpZiBuID49IHNpemU6CiAgICAgICAgICAgIHJldHVybiBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXkpWzpuXQoKICAgICMgV2hlbiBrZXkgaXMgbm9uZSwgdXNlIHNpbXBsZXIgZGVjb3JhdGlvbgogICAgaWYga2V5IGlzIE5vbmU6CiAgICAgICAgaXQgPSBpemlwKGl0ZXJhYmxlLCBjb3VudCgpKSAgICAgICAgICAgICAgICAgICAgICAgICMgZGVjb3JhdGUKICAgICAgICByZXN1bHQgPSBfbnNtYWxsZXN0KG4sIGl0KQogICAgICAgIHJldHVybiBtYXAoaXRlbWdldHRlcigwKSwgcmVzdWx0KSAgICAgICAgICAgICAgICAgICAjIHVuZGVjb3JhdGUKCiAgICAjIEdlbmVyYWwgY2FzZSwgc2xvd2VzdCBtZXRob2QKICAgIGluMSwgaW4yID0gdGVlKGl0ZXJhYmxlKQogICAgaXQgPSBpemlwKGltYXAoa2V5LCBpbjEpLCBjb3VudCgpLCBpbjIpICAgICAgICAgICAgICAgICAjIGRlY29yYXRlCiAgICByZXN1bHQgPSBfbnNtYWxsZXN0KG4sIGl0KQogICAgcmV0dXJuIG1hcChpdGVtZ2V0dGVyKDIpLCByZXN1bHQpICAgICAgICAgICAgICAgICAgICAgICAjIHVuZGVjb3JhdGUKCl9ubGFyZ2VzdCA9IG5sYXJnZXN0CmRlZiBubGFyZ2VzdChuLCBpdGVyYWJsZSwga2V5PU5vbmUpOgogICAgIiIiRmluZCB0aGUgbiBsYXJnZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC4KCiAgICBFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5LCByZXZlcnNlPVRydWUpWzpuXQogICAgIiIiCgogICAgIyBTaG9ydC1jdXQgZm9yIG49PTEgaXMgdG8gdXNlIG1heCgpIHdoZW4gbGVuKGl0ZXJhYmxlKT4wCiAgICBpZiBuID09IDE6CiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKQogICAgICAgIGhlYWQgPSBsaXN0KGlzbGljZShpdCwgMSkpCiAgICAgICAgaWYgbm90IGhlYWQ6CiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIGlmIGtleSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gW21heChjaGFpbihoZWFkLCBpdCkpXQogICAgICAgIHJldHVybiBbbWF4KGNoYWluKGhlYWQsIGl0KSwga2V5PWtleSldCgogICAgIyBXaGVuIG4+PXNpemUsIGl0J3MgZmFzdGVyIHRvIHVzZSBzb3J0ZWQoKQogICAgdHJ5OgogICAgICAgIHNpemUgPSBsZW4oaXRlcmFibGUpCiAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgaWYgbiA+PSBzaXplOgogICAgICAgICAgICByZXR1cm4gc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5LCByZXZlcnNlPVRydWUpWzpuXQoKICAgICMgV2hlbiBrZXkgaXMgbm9uZSwgdXNlIHNpbXBsZXIgZGVjb3JhdGlvbgogICAgaWYga2V5IGlzIE5vbmU6CiAgICAgICAgaXQgPSBpemlwKGl0ZXJhYmxlLCBjb3VudCgwLC0xKSkgICAgICAgICAgICAgICAgICAgICMgZGVjb3JhdGUKICAgICAgICByZXN1bHQgPSBfbmxhcmdlc3QobiwgaXQpCiAgICAgICAgcmV0dXJuIG1hcChpdGVtZ2V0dGVyKDApLCByZXN1bHQpICAgICAgICAgICAgICAgICAgICMgdW5kZWNvcmF0ZQoKICAgICMgR2VuZXJhbCBjYXNlLCBzbG93ZXN0IG1ldGhvZAogICAgaW4xLCBpbjIgPSB0ZWUoaXRlcmFibGUpCiAgICBpdCA9IGl6aXAoaW1hcChrZXksIGluMSksIGNvdW50KDAsLTEpLCBpbjIpICAgICAgICAgICAgICMgZGVjb3JhdGUKICAgIHJlc3VsdCA9IF9ubGFyZ2VzdChuLCBpdCkKICAgIHJldHVybiBtYXAoaXRlbWdldHRlcigyKSwgcmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAgIyB1bmRlY29yYXRlCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIyBTaW1wbGUgc2FuaXR5IHRlc3QKICAgIGhlYXAgPSBbXQogICAgZGF0YSA9IFsxLCAzLCA1LCA3LCA5LCAyLCA0LCA2LCA4LCAwXQogICAgZm9yIGl0ZW0gaW4gZGF0YToKICAgICAgICBoZWFwcHVzaChoZWFwLCBpdGVtKQogICAgc29ydCA9IFtdCiAgICB3aGlsZSBoZWFwOgogICAgICAgIHNvcnQuYXBwZW5kKGhlYXBwb3AoaGVhcCkpCiAgICBwcmludCBzb3J0CgogICAgaW1wb3J0IGRvY3Rlc3QKICAgIGRvY3Rlc3QudGVzdG1vZCgpCg==