IyAtKi0gY29kaW5nOiBsYXRpbi0xIC0qLQ0KDQoiIiJIZWFwIHF1ZXVlIGFsZ29yaXRobSAoYS5rLmEuIHByaW9yaXR5IHF1ZXVlKS4NCg0KSGVhcHMgYXJlIGFycmF5cyBmb3Igd2hpY2ggYVtrXSA8PSBhWzIqaysxXSBhbmQgYVtrXSA8PSBhWzIqaysyXSBmb3INCmFsbCBrLCBjb3VudGluZyBlbGVtZW50cyBmcm9tIDAuICBGb3IgdGhlIHNha2Ugb2YgY29tcGFyaXNvbiwNCm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZw0KcHJvcGVydHkgb2YgYSBoZWFwIGlzIHRoYXQgYVswXSBpcyBhbHdheXMgaXRzIHNtYWxsZXN0IGVsZW1lbnQuDQoNClVzYWdlOg0KDQpoZWFwID0gW10gICAgICAgICAgICAjIGNyZWF0ZXMgYW4gZW1wdHkgaGVhcA0KaGVhcHB1c2goaGVhcCwgaXRlbSkgIyBwdXNoZXMgYSBuZXcgaXRlbSBvbiB0aGUgaGVhcA0KaXRlbSA9IGhlYXBwb3AoaGVhcCkgIyBwb3BzIHRoZSBzbWFsbGVzdCBpdGVtIGZyb20gdGhlIGhlYXANCml0ZW0gPSBoZWFwWzBdICAgICAgICMgc21hbGxlc3QgaXRlbSBvbiB0aGUgaGVhcCB3aXRob3V0IHBvcHBpbmcgaXQNCmhlYXBpZnkoeCkgICAgICAgICAgICMgdHJhbnNmb3JtcyBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gbGluZWFyIHRpbWUNCml0ZW0gPSBoZWFwcmVwbGFjZShoZWFwLCBpdGVtKSAjIHBvcHMgYW5kIHJldHVybnMgc21hbGxlc3QgaXRlbSwgYW5kIGFkZHMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5ldyBpdGVtOyB0aGUgaGVhcCBzaXplIGlzIHVuY2hhbmdlZA0KDQpPdXIgQVBJIGRpZmZlcnMgZnJvbSB0ZXh0Ym9vayBoZWFwIGFsZ29yaXRobXMgYXMgZm9sbG93czoNCg0KLSBXZSB1c2UgMC1iYXNlZCBpbmRleGluZy4gIFRoaXMgbWFrZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZQ0KICBpbmRleCBmb3IgYSBub2RlIGFuZCB0aGUgaW5kZXhlcyBmb3IgaXRzIGNoaWxkcmVuIHNsaWdodGx5IGxlc3MNCiAgb2J2aW91cywgYnV0IGlzIG1vcmUgc3VpdGFibGUgc2luY2UgUHl0aG9uIHVzZXMgMC1iYXNlZCBpbmRleGluZy4NCg0KLSBPdXIgaGVhcHBvcCgpIG1ldGhvZCByZXR1cm5zIHRoZSBzbWFsbGVzdCBpdGVtLCBub3QgdGhlIGxhcmdlc3QuDQoNClRoZXNlIHR3byBtYWtlIGl0IHBvc3NpYmxlIHRvIHZpZXcgdGhlIGhlYXAgYXMgYSByZWd1bGFyIFB5dGhvbiBsaXN0DQp3aXRob3V0IHN1cnByaXNlczogaGVhcFswXSBpcyB0aGUgc21hbGxlc3QgaXRlbSwgYW5kIGhlYXAuc29ydCgpDQptYWludGFpbnMgdGhlIGhlYXAgaW52YXJpYW50IQ0KIiIiDQoNCiMgT3JpZ2luYWwgY29kZSBieSBLZXZpbiBPJ0Nvbm5vciwgYXVnbWVudGVkIGJ5IFRpbSBQZXRlcnMgYW5kIFJheW1vbmQgSGV0dGluZ2VyDQoNCl9fYWJvdXRfXyA9ICIiIkhlYXAgcXVldWVzDQoNCltleHBsYW5hdGlvbiBieSBGcmFu529pcyBQaW5hcmRdDQoNCkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yDQphbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sDQpub24tZXhpc3RpbmcgZWxlbWVudHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgaW5maW5pdGUuICBUaGUgaW50ZXJlc3RpbmcNCnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50Lg0KDQpUaGUgc3RyYW5nZSBpbnZhcmlhbnQgYWJvdmUgaXMgbWVhbnQgdG8gYmUgYW4gZWZmaWNpZW50IG1lbW9yeQ0KcmVwcmVzZW50YXRpb24gZm9yIGEgdG91cm5hbWVudC4gIFRoZSBudW1iZXJzIGJlbG93IGFyZSBgaycsIG5vdCBhW2tdOg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDANCg0KICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDINCg0KICAgICAgICAgIDMgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgIDUgICAgICAgICAgICAgICA2DQoNCiAgICAgIDcgICAgICAgOCAgICAgICA5ICAgICAgIDEwICAgICAgMTEgICAgICAxMiAgICAgIDEzICAgICAgMTQNCg0KICAgIDE1IDE2ICAgMTcgMTggICAxOSAyMCAgIDIxIDIyICAgMjMgMjQgICAyNSAyNiAgIDI3IDI4ICAgMjkgMzANCg0KDQpJbiB0aGUgdHJlZSBhYm92ZSwgZWFjaCBjZWxsIGBrJyBpcyB0b3BwaW5nIGAyKmsrMScgYW5kIGAyKmsrMicuICBJbg0KYW4gdXN1YWwgYmluYXJ5IHRvdXJuYW1lbnQgd2Ugc2VlIGluIHNwb3J0cywgZWFjaCBjZWxsIGlzIHRoZSB3aW5uZXINCm92ZXIgdGhlIHR3byBjZWxscyBpdCB0b3BzLCBhbmQgd2UgY2FuIHRyYWNlIHRoZSB3aW5uZXIgZG93biB0aGUgdHJlZQ0KdG8gc2VlIGFsbCBvcHBvbmVudHMgcy9oZSBoYWQuICBIb3dldmVyLCBpbiBtYW55IGNvbXB1dGVyIGFwcGxpY2F0aW9ucw0Kb2Ygc3VjaCB0b3VybmFtZW50cywgd2UgZG8gbm90IG5lZWQgdG8gdHJhY2UgdGhlIGhpc3Rvcnkgb2YgYSB3aW5uZXIuDQpUbyBiZSBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIHdoZW4gYSB3aW5uZXIgaXMgcHJvbW90ZWQsIHdlIHRyeSB0bw0KcmVwbGFjZSBpdCBieSBzb21ldGhpbmcgZWxzZSBhdCBhIGxvd2VyIGxldmVsLCBhbmQgdGhlIHJ1bGUgYmVjb21lcw0KdGhhdCBhIGNlbGwgYW5kIHRoZSB0d28gY2VsbHMgaXQgdG9wcyBjb250YWluIHRocmVlIGRpZmZlcmVudCBpdGVtcywNCmJ1dCB0aGUgdG9wIGNlbGwgIndpbnMiIG92ZXIgdGhlIHR3byB0b3BwZWQgY2VsbHMuDQoNCklmIHRoaXMgaGVhcCBpbnZhcmlhbnQgaXMgcHJvdGVjdGVkIGF0IGFsbCB0aW1lLCBpbmRleCAwIGlzIGNsZWFybHkNCnRoZSBvdmVyYWxsIHdpbm5lci4gIFRoZSBzaW1wbGVzdCBhbGdvcml0aG1pYyB3YXkgdG8gcmVtb3ZlIGl0IGFuZA0KZmluZCB0aGUgIm5leHQiIHdpbm5lciBpcyB0byBtb3ZlIHNvbWUgbG9zZXIgKGxldCdzIHNheSBjZWxsIDMwIGluIHRoZQ0KZGlhZ3JhbSBhYm92ZSkgaW50byB0aGUgMCBwb3NpdGlvbiwgYW5kIHRoZW4gcGVyY29sYXRlIHRoaXMgbmV3IDAgZG93bg0KdGhlIHRyZWUsIGV4Y2hhbmdpbmcgdmFsdWVzLCB1bnRpbCB0aGUgaW52YXJpYW50IGlzIHJlLWVzdGFibGlzaGVkLg0KVGhpcyBpcyBjbGVhcmx5IGxvZ2FyaXRobWljIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRyZWUuDQpCeSBpdGVyYXRpbmcgb3ZlciBhbGwgaXRlbXMsIHlvdSBnZXQgYW4gTyhuIGxuIG4pIHNvcnQuDQoNCkEgbmljZSBmZWF0dXJlIG9mIHRoaXMgc29ydCBpcyB0aGF0IHlvdSBjYW4gZWZmaWNpZW50bHkgaW5zZXJ0IG5ldw0KaXRlbXMgd2hpbGUgdGhlIHNvcnQgaXMgZ29pbmcgb24sIHByb3ZpZGVkIHRoYXQgdGhlIGluc2VydGVkIGl0ZW1zIGFyZQ0Kbm90ICJiZXR0ZXIiIHRoYW4gdGhlIGxhc3QgMCd0aCBlbGVtZW50IHlvdSBleHRyYWN0ZWQuICBUaGlzIGlzDQplc3BlY2lhbGx5IHVzZWZ1bCBpbiBzaW11bGF0aW9uIGNvbnRleHRzLCB3aGVyZSB0aGUgdHJlZSBob2xkcyBhbGwNCmluY29taW5nIGV2ZW50cywgYW5kIHRoZSAid2luIiBjb25kaXRpb24gbWVhbnMgdGhlIHNtYWxsZXN0IHNjaGVkdWxlZA0KdGltZS4gIFdoZW4gYW4gZXZlbnQgc2NoZWR1bGUgb3RoZXIgZXZlbnRzIGZvciBleGVjdXRpb24sIHRoZXkgYXJlDQpzY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUgaGVhcC4gIFNvLCBhDQpoZWFwIGlzIGEgZ29vZCBzdHJ1Y3R1cmUgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzICh0aGlzIGlzIHdoYXQgSQ0KdXNlZCBmb3IgbXkgTUlESSBzZXF1ZW5jZXIgOi0pLg0KDQpWYXJpb3VzIHN0cnVjdHVyZXMgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzIGhhdmUgYmVlbiBleHRlbnNpdmVseQ0Kc3R1ZGllZCwgYW5kIGhlYXBzIGFyZSBnb29kIGZvciB0aGlzLCBhcyB0aGV5IGFyZSByZWFzb25hYmx5IHNwZWVkeSwNCnRoZSBzcGVlZCBpcyBhbG1vc3QgY29uc3RhbnQsIGFuZCB0aGUgd29yc3QgY2FzZSBpcyBub3QgbXVjaCBkaWZmZXJlbnQNCnRoYW4gdGhlIGF2ZXJhZ2UgY2FzZS4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBvdGhlciByZXByZXNlbnRhdGlvbnMgd2hpY2gNCmFyZSBtb3JlIGVmZmljaWVudCBvdmVyYWxsLCB5ZXQgdGhlIHdvcnN0IGNhc2VzIG1pZ2h0IGJlIHRlcnJpYmxlLg0KDQpIZWFwcyBhcmUgYWxzbyB2ZXJ5IHVzZWZ1bCBpbiBiaWcgZGlzayBzb3J0cy4gIFlvdSBtb3N0IHByb2JhYmx5IGFsbA0Ka25vdyB0aGF0IGEgYmlnIHNvcnQgaW1wbGllcyBwcm9kdWNpbmcgInJ1bnMiICh3aGljaCBhcmUgcHJlLXNvcnRlZA0Kc2VxdWVuY2VzLCB3aGljaCBzaXplIGlzIHVzdWFsbHkgcmVsYXRlZCB0byB0aGUgYW1vdW50IG9mIENQVSBtZW1vcnkpLA0KZm9sbG93ZWQgYnkgYSBtZXJnaW5nIHBhc3NlcyBmb3IgdGhlc2UgcnVucywgd2hpY2ggbWVyZ2luZyBpcyBvZnRlbg0KdmVyeSBjbGV2ZXJseSBvcmdhbmlzZWRbMV0uICBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHRoZSBpbml0aWFsDQpzb3J0IHByb2R1Y2VzIHRoZSBsb25nZXN0IHJ1bnMgcG9zc2libGUuICBUb3VybmFtZW50cyBhcmUgYSBnb29kIHdheQ0KdG8gdGhhdC4gIElmLCB1c2luZyBhbGwgdGhlIG1lbW9yeSBhdmFpbGFibGUgdG8gaG9sZCBhIHRvdXJuYW1lbnQsIHlvdQ0KcmVwbGFjZSBhbmQgcGVyY29sYXRlIGl0ZW1zIHRoYXQgaGFwcGVuIHRvIGZpdCB0aGUgY3VycmVudCBydW4sIHlvdSdsbA0KcHJvZHVjZSBydW5zIHdoaWNoIGFyZSB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciByYW5kb20gaW5wdXQsDQphbmQgbXVjaCBiZXR0ZXIgZm9yIGlucHV0IGZ1enppbHkgb3JkZXJlZC4NCg0KTW9yZW92ZXIsIGlmIHlvdSBvdXRwdXQgdGhlIDAndGggaXRlbSBvbiBkaXNrIGFuZCBnZXQgYW4gaW5wdXQgd2hpY2gNCm1heSBub3QgZml0IGluIHRoZSBjdXJyZW50IHRvdXJuYW1lbnQgKGJlY2F1c2UgdGhlIHZhbHVlICJ3aW5zIiBvdmVyDQp0aGUgbGFzdCBvdXRwdXQgdmFsdWUpLCBpdCBjYW5ub3QgZml0IGluIHRoZSBoZWFwLCBzbyB0aGUgc2l6ZSBvZiB0aGUNCmhlYXAgZGVjcmVhc2VzLiAgVGhlIGZyZWVkIG1lbW9yeSBjb3VsZCBiZSBjbGV2ZXJseSByZXVzZWQgaW1tZWRpYXRlbHkNCmZvciBwcm9ncmVzc2l2ZWx5IGJ1aWxkaW5nIGEgc2Vjb25kIGhlYXAsIHdoaWNoIGdyb3dzIGF0IGV4YWN0bHkgdGhlDQpzYW1lIHJhdGUgdGhlIGZpcnN0IGhlYXAgaXMgbWVsdGluZy4gIFdoZW4gdGhlIGZpcnN0IGhlYXAgY29tcGxldGVseQ0KdmFuaXNoZXMsIHlvdSBzd2l0Y2ggaGVhcHMgYW5kIHN0YXJ0IGEgbmV3IHJ1bi4gIENsZXZlciBhbmQgcXVpdGUNCmVmZmVjdGl2ZSENCg0KSW4gYSB3b3JkLCBoZWFwcyBhcmUgdXNlZnVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIGtub3cuICBJIHVzZSB0aGVtIGluDQphIGZldyBhcHBsaWNhdGlvbnMsIGFuZCBJIHRoaW5rIGl0IGlzIGdvb2QgdG8ga2VlcCBhIGBoZWFwJyBtb2R1bGUNCmFyb3VuZC4gOi0pDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tDQpbMV0gVGhlIGRpc2sgYmFsYW5jaW5nIGFsZ29yaXRobXMgd2hpY2ggYXJlIGN1cnJlbnQsIG5vd2FkYXlzLCBhcmUNCm1vcmUgYW5ub3lpbmcgdGhhbiBjbGV2ZXIsIGFuZCB0aGlzIGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHNlZWtpbmcNCmNhcGFiaWxpdGllcyBvZiB0aGUgZGlza3MuICBPbiBkZXZpY2VzIHdoaWNoIGNhbm5vdCBzZWVrLCBsaWtlIGJpZw0KdGFwZSBkcml2ZXMsIHRoZSBzdG9yeSB3YXMgcXVpdGUgZGlmZmVyZW50LCBhbmQgb25lIGhhZCB0byBiZSB2ZXJ5DQpjbGV2ZXIgdG8gZW5zdXJlIChmYXIgaW4gYWR2YW5jZSkgdGhhdCBlYWNoIHRhcGUgbW92ZW1lbnQgd2lsbCBiZSB0aGUNCm1vc3QgZWZmZWN0aXZlIHBvc3NpYmxlICh0aGF0IGlzLCB3aWxsIGJlc3QgcGFydGljaXBhdGUgYXQNCiJwcm9ncmVzc2luZyIgdGhlIG1lcmdlKS4gIFNvbWUgdGFwZXMgd2VyZSBldmVuIGFibGUgdG8gcmVhZA0KYmFja3dhcmRzLCBhbmQgdGhpcyB3YXMgYWxzbyB1c2VkIHRvIGF2b2lkIHRoZSByZXdpbmRpbmcgdGltZS4NCkJlbGlldmUgbWUsIHJlYWwgZ29vZCB0YXBlIHNvcnRzIHdlcmUgcXVpdGUgc3BlY3RhY3VsYXIgdG8gd2F0Y2ghDQpGcm9tIGFsbCB0aW1lcywgc29ydGluZyBoYXMgYWx3YXlzIGJlZW4gYSBHcmVhdCBBcnQhIDotKQ0KIiIiDQoNCl9fYWxsX18gPSBbJ2hlYXBwdXNoJywgJ2hlYXBwb3AnLCAnaGVhcGlmeScsICdoZWFwcmVwbGFjZScsICdtZXJnZScsDQogICAgICAgICAgICdubGFyZ2VzdCcsICduc21hbGxlc3QnLCAnaGVhcHB1c2hwb3AnXQ0KDQpmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaXNsaWNlLCBjb3VudCwgaW1hcCwgaXppcCwgdGVlLCBjaGFpbg0KZnJvbSBvcGVyYXRvciBpbXBvcnQgaXRlbWdldHRlcg0KDQpkZWYgY21wX2x0KHgsIHkpOg0KICAgICMgVXNlIF9fbHRfXyBpZiBhdmFpbGFibGU7IG90aGVyd2lzZSwgdHJ5IF9fbGVfXy4NCiAgICAjIEluIFB5My54LCBvbmx5IF9fbHRfXyB3aWxsIGJlIGNhbGxlZC4NCiAgICByZXR1cm4gKHggPCB5KSBpZiBoYXNhdHRyKHgsICdfX2x0X18nKSBlbHNlIChub3QgeSA8PSB4KQ0KDQpkZWYgaGVhcHB1c2goaGVhcCwgaXRlbSk6DQogICAgIiIiUHVzaCBpdGVtIG9udG8gaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LiIiIg0KICAgIGhlYXAuYXBwZW5kKGl0ZW0pDQogICAgX3NpZnRkb3duKGhlYXAsIDAsIGxlbihoZWFwKS0xKQ0KDQpkZWYgaGVhcHBvcChoZWFwKToNCiAgICAiIiJQb3AgdGhlIHNtYWxsZXN0IGl0ZW0gb2ZmIHRoZSBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuIiIiDQogICAgbGFzdGVsdCA9IGhlYXAucG9wKCkgICAgIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5DQogICAgaWYgaGVhcDoNCiAgICAgICAgcmV0dXJuaXRlbSA9IGhlYXBbMF0NCiAgICAgICAgaGVhcFswXSA9IGxhc3RlbHQNCiAgICAgICAgX3NpZnR1cChoZWFwLCAwKQ0KICAgIGVsc2U6DQogICAgICAgIHJldHVybml0ZW0gPSBsYXN0ZWx0DQogICAgcmV0dXJuIHJldHVybml0ZW0NCg0KZGVmIGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pOg0KICAgICIiIlBvcCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHNtYWxsZXN0IHZhbHVlLCBhbmQgYWRkIHRoZSBuZXcgaXRlbS4NCg0KICAgIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBoZWFwcG9wKCkgZm9sbG93ZWQgYnkgaGVhcHB1c2goKSwgYW5kIGNhbiBiZQ0KICAgIG1vcmUgYXBwcm9wcmlhdGUgd2hlbiB1c2luZyBhIGZpeGVkLXNpemUgaGVhcC4gIE5vdGUgdGhhdCB0aGUgdmFsdWUNCiAgICByZXR1cm5lZCBtYXkgYmUgbGFyZ2VyIHRoYW4gaXRlbSEgIFRoYXQgY29uc3RyYWlucyByZWFzb25hYmxlIHVzZXMgb2YNCiAgICB0aGlzIHJvdXRpbmUgdW5sZXNzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIGNvbmRpdGlvbmFsIHJlcGxhY2VtZW50Og0KDQogICAgICAgIGlmIGl0ZW0gPiBoZWFwWzBdOg0KICAgICAgICAgICAgaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pDQogICAgIiIiDQogICAgcmV0dXJuaXRlbSA9IGhlYXBbMF0gICAgIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5DQogICAgaGVhcFswXSA9IGl0ZW0NCiAgICBfc2lmdHVwKGhlYXAsIDApDQogICAgcmV0dXJuIHJldHVybml0ZW0NCg0KZGVmIGhlYXBwdXNocG9wKGhlYXAsIGl0ZW0pOg0KICAgICIiIkZhc3QgdmVyc2lvbiBvZiBhIGhlYXBwdXNoIGZvbGxvd2VkIGJ5IGEgaGVhcHBvcC4iIiINCiAgICBpZiBoZWFwIGFuZCBjbXBfbHQoaGVhcFswXSwgaXRlbSk6DQogICAgICAgIGl0ZW0sIGhlYXBbMF0gPSBoZWFwWzBdLCBpdGVtDQogICAgICAgIF9zaWZ0dXAoaGVhcCwgMCkNCiAgICByZXR1cm4gaXRlbQ0KDQpkZWYgaGVhcGlmeSh4KToNCiAgICAiIiJUcmFuc2Zvcm0gbGlzdCBpbnRvIGEgaGVhcCwgaW4tcGxhY2UsIGluIE8obGVuKHgpKSB0aW1lLiIiIg0KICAgIG4gPSBsZW4oeCkNCiAgICAjIFRyYW5zZm9ybSBib3R0b20tdXAuICBUaGUgbGFyZ2VzdCBpbmRleCB0aGVyZSdzIGFueSBwb2ludCB0byBsb29raW5nIGF0DQogICAgIyBpcyB0aGUgbGFyZ2VzdCB3aXRoIGEgY2hpbGQgaW5kZXggaW4tcmFuZ2UsIHNvIG11c3QgaGF2ZSAyKmkgKyAxIDwgbiwNCiAgICAjIG9yIGkgPCAobi0xKS8yLiAgSWYgbiBpcyBldmVuID0gMipqLCB0aGlzIGlzICgyKmotMSkvMiA9IGotMS8yIHNvDQogICAgIyBqLTEgaXMgdGhlIGxhcmdlc3QsIHdoaWNoIGlzIG4vLzIgLSAxLiAgSWYgbiBpcyBvZGQgPSAyKmorMSwgdGhpcyBpcw0KICAgICMgKDIqaisxLTEpLzIgPSBqIHNvIGotMSBpcyB0aGUgbGFyZ2VzdCwgYW5kIHRoYXQncyBhZ2FpbiBuLy8yLTEuDQogICAgZm9yIGkgaW4gcmV2ZXJzZWQoeHJhbmdlKG4vLzIpKToNCiAgICAgICAgX3NpZnR1cCh4LCBpKQ0KDQpkZWYgX2hlYXBwdXNocG9wX21heChoZWFwLCBpdGVtKToNCiAgICAiIiJNYXhoZWFwIHZlcnNpb24gb2YgYSBoZWFwcHVzaCBmb2xsb3dlZCBieSBhIGhlYXBwb3AuIiIiDQogICAgaWYgaGVhcCBhbmQgY21wX2x0KGl0ZW0sIGhlYXBbMF0pOg0KICAgICAgICBpdGVtLCBoZWFwWzBdID0gaGVhcFswXSwgaXRlbQ0KICAgICAgICBfc2lmdHVwX21heChoZWFwLCAwKQ0KICAgIHJldHVybiBpdGVtDQoNCmRlZiBfaGVhcGlmeV9tYXgoeCk6DQogICAgIiIiVHJhbnNmb3JtIGxpc3QgaW50byBhIG1heGhlYXAsIGluLXBsYWNlLCBpbiBPKGxlbih4KSkgdGltZS4iIiINCiAgICBuID0gbGVuKHgpDQogICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2Uobi8vMikpOg0KICAgICAgICBfc2lmdHVwX21heCh4LCBpKQ0KDQpkZWYgbmxhcmdlc3QobiwgaXRlcmFibGUpOg0KICAgICIiIkZpbmQgdGhlIG4gbGFyZ2VzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuDQoNCiAgICBFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlLCByZXZlcnNlPVRydWUpWzpuXQ0KICAgICIiIg0KICAgIGlmIG4gPCAwOg0KICAgICAgICByZXR1cm4gW10NCiAgICBpdCA9IGl0ZXIoaXRlcmFibGUpDQogICAgcmVzdWx0ID0gbGlzdChpc2xpY2UoaXQsIG4pKQ0KICAgIGlmIG5vdCByZXN1bHQ6DQogICAgICAgIHJldHVybiByZXN1bHQNCiAgICBoZWFwaWZ5KHJlc3VsdCkNCiAgICBfaGVhcHB1c2hwb3AgPSBoZWFwcHVzaHBvcA0KICAgIGZvciBlbGVtIGluIGl0Og0KICAgICAgICBfaGVhcHB1c2hwb3AocmVzdWx0LCBlbGVtKQ0KICAgIHJlc3VsdC5zb3J0KHJldmVyc2U9VHJ1ZSkNCiAgICByZXR1cm4gcmVzdWx0DQoNCmRlZiBuc21hbGxlc3QobiwgaXRlcmFibGUpOg0KICAgICIiIkZpbmQgdGhlIG4gc21hbGxlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0Lg0KDQogICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSlbOm5dDQogICAgIiIiDQogICAgaWYgbiA8IDA6DQogICAgICAgIHJldHVybiBbXQ0KICAgIGl0ID0gaXRlcihpdGVyYWJsZSkNCiAgICByZXN1bHQgPSBsaXN0KGlzbGljZShpdCwgbikpDQogICAgaWYgbm90IHJlc3VsdDoNCiAgICAgICAgcmV0dXJuIHJlc3VsdA0KICAgIF9oZWFwaWZ5X21heChyZXN1bHQpDQogICAgX2hlYXBwdXNocG9wID0gX2hlYXBwdXNocG9wX21heA0KICAgIGZvciBlbGVtIGluIGl0Og0KICAgICAgICBfaGVhcHB1c2hwb3AocmVzdWx0LCBlbGVtKQ0KICAgIHJlc3VsdC5zb3J0KCkNCiAgICByZXR1cm4gcmVzdWx0DQoNCiMgJ2hlYXAnIGlzIGEgaGVhcCBhdCBhbGwgaW5kaWNlcyA+PSBzdGFydHBvcywgZXhjZXB0IHBvc3NpYmx5IGZvciBwb3MuICBwb3MNCiMgaXMgdGhlIGluZGV4IG9mIGEgbGVhZiB3aXRoIGEgcG9zc2libHkgb3V0LW9mLW9yZGVyIHZhbHVlLiAgUmVzdG9yZSB0aGUNCiMgaGVhcCBpbnZhcmlhbnQuDQpkZWYgX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpOg0KICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc10NCiAgICAjIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nIGEgcGxhY2UNCiAgICAjIG5ld2l0ZW0gZml0cy4NCiAgICB3aGlsZSBwb3MgPiBzdGFydHBvczoNCiAgICAgICAgcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDENCiAgICAgICAgcGFyZW50ID0gaGVhcFtwYXJlbnRwb3NdDQogICAgICAgIGlmIGNtcF9sdChuZXdpdGVtLCBwYXJlbnQpOg0KICAgICAgICAgICAgaGVhcFtwb3NdID0gcGFyZW50DQogICAgICAgICAgICBwb3MgPSBwYXJlbnRwb3MNCiAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgIGJyZWFrDQogICAgaGVhcFtwb3NdID0gbmV3aXRlbQ0KDQojIFRoZSBjaGlsZCBpbmRpY2VzIG9mIGhlYXAgaW5kZXggcG9zIGFyZSBhbHJlYWR5IGhlYXBzLCBhbmQgd2Ugd2FudCB0byBtYWtlDQojIGEgaGVhcCBhdCBpbmRleCBwb3MgdG9vLiAgV2UgZG8gdGhpcyBieSBidWJibGluZyB0aGUgc21hbGxlciBjaGlsZCBvZg0KIyBwb3MgdXAgKGFuZCBzbyBvbiB3aXRoIHRoYXQgY2hpbGQncyBjaGlsZHJlbiwgZXRjKSB1bnRpbCBoaXR0aW5nIGEgbGVhZiwNCiMgdGhlbiB1c2luZyBfc2lmdGRvd24gdG8gbW92ZSB0aGUgb2RkYmFsbCBvcmlnaW5hbGx5IGF0IGluZGV4IHBvcyBpbnRvIHBsYWNlLg0KIw0KIyBXZSAqY291bGQqIGJyZWFrIG91dCBvZiB0aGUgbG9vcCBhcyBzb29uIGFzIHdlIGZpbmQgYSBwb3Mgd2hlcmUgbmV3aXRlbSA8PQ0KIyBib3RoIGl0cyBjaGlsZHJlbiwgYnV0IHR1cm5zIG91dCB0aGF0J3Mgbm90IGEgZ29vZCBpZGVhLCBhbmQgZGVzcGl0ZSB0aGF0DQojIG1hbnkgYm9va3Mgd3JpdGUgdGhlIGFsZ29yaXRobSB0aGF0IHdheS4gIER1cmluZyBhIGhlYXAgcG9wLCB0aGUgbGFzdCBhcnJheQ0KIyBlbGVtZW50IGlzIHNpZnRlZCBpbiwgYW5kIHRoYXQgdGVuZHMgdG8gYmUgbGFyZ2UsIHNvIHRoYXQgY29tcGFyaW5nIGl0DQojIGFnYWluc3QgdmFsdWVzIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QgdXN1YWxseSBkb2Vzbid0IHBheSAoPSB1c3VhbGx5IGRvZXNuJ3QNCiMgZ2V0IHVzIG91dCBvZiB0aGUgbG9vcCBlYXJseSkuICBTZWUgS251dGgsIFZvbHVtZSAzLCB3aGVyZSB0aGlzIGlzDQojIGV4cGxhaW5lZCBhbmQgcXVhbnRpZmllZCBpbiBhbiBleGVyY2lzZS4NCiMNCiMgQ3V0dGluZyB0aGUgIyBvZiBjb21wYXJpc29ucyBpcyBpbXBvcnRhbnQsIHNpbmNlIHRoZXNlIHJvdXRpbmVzIGhhdmUgbm8NCiMgd2F5IHRvIGV4dHJhY3QgInRoZSBwcmlvcml0eSIgZnJvbSBhbiBhcnJheSBlbGVtZW50LCBzbyB0aGF0IGludGVsbGlnZW5jZQ0KIyBpcyBsaWtlbHkgdG8gYmUgaGlkaW5nIGluIGN1c3RvbSBfX2NtcF9fIG1ldGhvZHMsIG9yIGluIGFycmF5IGVsZW1lbnRzDQojIHN0b3JpbmcgKHByaW9yaXR5LCByZWNvcmQpIHR1cGxlcy4gIENvbXBhcmlzb25zIGFyZSB0aHVzIHBvdGVudGlhbGx5DQojIGV4cGVuc2l2ZS4NCiMNCiMgT24gcmFuZG9tIGFycmF5cyBvZiBsZW5ndGggMTAwMCwgbWFraW5nIHRoaXMgY2hhbmdlIGN1dCB0aGUgbnVtYmVyIG9mDQojIGNvbXBhcmlzb25zIG1hZGUgYnkgaGVhcGlmeSgpIGEgbGl0dGxlLCBhbmQgdGhvc2UgbWFkZSBieSBleGhhdXN0aXZlDQojIGhlYXBwb3AoKSBhIGxvdCwgaW4gYWNjb3JkIHdpdGggdGhlb3J5LiAgSGVyZSBhcmUgdHlwaWNhbCByZXN1bHRzIGZyb20gMw0KIyBydW5zICgzIGp1c3QgdG8gZGVtb25zdHJhdGUgaG93IHNtYWxsIHRoZSB2YXJpYW5jZSBpcyk6DQojDQojIENvbXBhcmVzIG5lZWRlZCBieSBoZWFwaWZ5ICAgICBDb21wYXJlcyBuZWVkZWQgYnkgMTAwMCBoZWFwcG9wcw0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgMTgzNyBjdXQgdG8gMTY2MyAgICAgICAgICAgICAgIDE0OTk2IGN1dCB0byA4NjgwDQojIDE4NTUgY3V0IHRvIDE2NTkgICAgICAgICAgICAgICAxNDk2NiBjdXQgdG8gODY3OA0KIyAxODQ3IGN1dCB0byAxNjYwICAgICAgICAgICAgICAgMTUwMjQgY3V0IHRvIDg3MDMNCiMNCiMgQnVpbGRpbmcgdGhlIGhlYXAgYnkgdXNpbmcgaGVhcHB1c2goKSAxMDAwIHRpbWVzIGluc3RlYWQgcmVxdWlyZWQNCiMgMjE5OCwgMjE0OCwgYW5kIDIyMTkgY29tcGFyZXM6ICBoZWFwaWZ5KCkgaXMgbW9yZSBlZmZpY2llbnQsIHdoZW4NCiMgeW91IGNhbiB1c2UgaXQuDQojDQojIFRoZSB0b3RhbCBjb21wYXJlcyBuZWVkZWQgYnkgbGlzdC5zb3J0KCkgb24gdGhlIHNhbWUgbGlzdHMgd2VyZSA4NjI3LA0KIyA4NjI3LCBhbmQgODYzMiAodGhpcyBzaG91bGQgYmUgY29tcGFyZWQgdG8gdGhlIHN1bSBvZiBoZWFwaWZ5KCkgYW5kDQojIGhlYXBwb3AoKSBjb21wYXJlcyk6ICBsaXN0LnNvcnQoKSBpcyAodW5zdXJwcmlzaW5nbHkhKSBtb3JlIGVmZmljaWVudA0KIyBmb3Igc29ydGluZy4NCg0KZGVmIF9zaWZ0dXAoaGVhcCwgcG9zKToNCiAgICBlbmRwb3MgPSBsZW4oaGVhcCkNCiAgICBzdGFydHBvcyA9IHBvcw0KICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc10NCiAgICAjIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4NCiAgICBjaGlsZHBvcyA9IDIqcG9zICsgMSAgICAjIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uDQogICAgd2hpbGUgY2hpbGRwb3MgPCBlbmRwb3M6DQogICAgICAgICMgU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuDQogICAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxDQogICAgICAgIGlmIHJpZ2h0cG9zIDwgZW5kcG9zIGFuZCBub3QgY21wX2x0KGhlYXBbY2hpbGRwb3NdLCBoZWFwW3JpZ2h0cG9zXSk6DQogICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zDQogICAgICAgICMgTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC4NCiAgICAgICAgaGVhcFtwb3NdID0gaGVhcFtjaGlsZHBvc10NCiAgICAgICAgcG9zID0gY2hpbGRwb3MNCiAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDENCiAgICAjIFRoZSBsZWFmIGF0IHBvcyBpcyBlbXB0eSBub3cuICBQdXQgbmV3aXRlbSB0aGVyZSwgYW5kIGJ1YmJsZSBpdCB1cA0KICAgICMgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuDQogICAgaGVhcFtwb3NdID0gbmV3aXRlbQ0KICAgIF9zaWZ0ZG93bihoZWFwLCBzdGFydHBvcywgcG9zKQ0KDQpkZWYgX3NpZnRkb3duX21heChoZWFwLCBzdGFydHBvcywgcG9zKToNCiAgICAnTWF4aGVhcCB2YXJpYW50IG9mIF9zaWZ0ZG93bicNCiAgICBuZXdpdGVtID0gaGVhcFtwb3NdDQogICAgIyBGb2xsb3cgdGhlIHBhdGggdG8gdGhlIHJvb3QsIG1vdmluZyBwYXJlbnRzIGRvd24gdW50aWwgZmluZGluZyBhIHBsYWNlDQogICAgIyBuZXdpdGVtIGZpdHMuDQogICAgd2hpbGUgcG9zID4gc3RhcnRwb3M6DQogICAgICAgIHBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxDQogICAgICAgIHBhcmVudCA9IGhlYXBbcGFyZW50cG9zXQ0KICAgICAgICBpZiBjbXBfbHQocGFyZW50LCBuZXdpdGVtKToNCiAgICAgICAgICAgIGhlYXBbcG9zXSA9IHBhcmVudA0KICAgICAgICAgICAgcG9zID0gcGFyZW50cG9zDQogICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICBicmVhaw0KICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW0NCg0KZGVmIF9zaWZ0dXBfbWF4KGhlYXAsIHBvcyk6DQogICAgJ01heGhlYXAgdmFyaWFudCBvZiBfc2lmdHVwJw0KICAgIGVuZHBvcyA9IGxlbihoZWFwKQ0KICAgIHN0YXJ0cG9zID0gcG9zDQogICAgbmV3aXRlbSA9IGhlYXBbcG9zXQ0KICAgICMgQnViYmxlIHVwIHRoZSBsYXJnZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuDQogICAgY2hpbGRwb3MgPSAyKnBvcyArIDEgICAgIyBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbg0KICAgIHdoaWxlIGNoaWxkcG9zIDwgZW5kcG9zOg0KICAgICAgICAjIFNldCBjaGlsZHBvcyB0byBpbmRleCBvZiBsYXJnZXIgY2hpbGQuDQogICAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxDQogICAgICAgIGlmIHJpZ2h0cG9zIDwgZW5kcG9zIGFuZCBub3QgY21wX2x0KGhlYXBbcmlnaHRwb3NdLCBoZWFwW2NoaWxkcG9zXSk6DQogICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zDQogICAgICAgICMgTW92ZSB0aGUgbGFyZ2VyIGNoaWxkIHVwLg0KICAgICAgICBoZWFwW3Bvc10gPSBoZWFwW2NoaWxkcG9zXQ0KICAgICAgICBwb3MgPSBjaGlsZHBvcw0KICAgICAgICBjaGlsZHBvcyA9IDIqcG9zICsgMQ0KICAgICMgVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYnViYmxlIGl0IHVwDQogICAgIyB0byBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoYnkgc2lmdGluZyBpdHMgcGFyZW50cyBkb3duKS4NCiAgICBoZWFwW3Bvc10gPSBuZXdpdGVtDQogICAgX3NpZnRkb3duX21heChoZWFwLCBzdGFydHBvcywgcG9zKQ0KDQojIElmIGF2YWlsYWJsZSwgdXNlIEMgaW1wbGVtZW50YXRpb24NCnRyeToNCiAgICBmcm9tIF9oZWFwcSBpbXBvcnQgKg0KZXhjZXB0IEltcG9ydEVycm9yOg0KICAgIHBhc3MNCg0KZGVmIG1lcmdlKCppdGVyYWJsZXMpOg0KICAgICcnJ01lcmdlIG11bHRpcGxlIHNvcnRlZCBpbnB1dHMgaW50byBhIHNpbmdsZSBzb3J0ZWQgb3V0cHV0Lg0KDQogICAgU2ltaWxhciB0byBzb3J0ZWQoaXRlcnRvb2xzLmNoYWluKCppdGVyYWJsZXMpKSBidXQgcmV0dXJucyBhIGdlbmVyYXRvciwNCiAgICBkb2VzIG5vdCBwdWxsIHRoZSBkYXRhIGludG8gbWVtb3J5IGFsbCBhdCBvbmNlLCBhbmQgYXNzdW1lcyB0aGF0IGVhY2ggb2YNCiAgICB0aGUgaW5wdXQgc3RyZWFtcyBpcyBhbHJlYWR5IHNvcnRlZCAoc21hbGxlc3QgdG8gbGFyZ2VzdCkuDQoNCiAgICA+Pj4gbGlzdChtZXJnZShbMSwzLDUsN10sIFswLDIsNCw4XSwgWzUsMTAsMTUsMjBdLCBbXSwgWzI1XSkpDQogICAgWzAsIDEsIDIsIDMsIDQsIDUsIDUsIDcsIDgsIDEwLCAxNSwgMjAsIDI1XQ0KDQogICAgJycnDQogICAgX2hlYXBwb3AsIF9oZWFwcmVwbGFjZSwgX1N0b3BJdGVyYXRpb24gPSBoZWFwcG9wLCBoZWFwcmVwbGFjZSwgU3RvcEl0ZXJhdGlvbg0KICAgIF9sZW4gPSBsZW4NCg0KICAgIGggPSBbXQ0KICAgIGhfYXBwZW5kID0gaC5hcHBlbmQNCiAgICBmb3IgaXRudW0sIGl0IGluIGVudW1lcmF0ZShtYXAoaXRlciwgaXRlcmFibGVzKSk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIG5leHQgPSBpdC5uZXh0DQogICAgICAgICAgICBoX2FwcGVuZChbbmV4dCgpLCBpdG51bSwgbmV4dF0pDQogICAgICAgIGV4Y2VwdCBfU3RvcEl0ZXJhdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCiAgICBoZWFwaWZ5KGgpDQoNCiAgICB3aGlsZSBfbGVuKGgpID4gMToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgd2hpbGUgMToNCiAgICAgICAgICAgICAgICB2LCBpdG51bSwgbmV4dCA9IHMgPSBoWzBdDQogICAgICAgICAgICAgICAgeWllbGQgdg0KICAgICAgICAgICAgICAgIHNbMF0gPSBuZXh0KCkgICAgICAgICAgICAgICAjIHJhaXNlcyBTdG9wSXRlcmF0aW9uIHdoZW4gZXhoYXVzdGVkDQogICAgICAgICAgICAgICAgX2hlYXByZXBsYWNlKGgsIHMpICAgICAgICAgICMgcmVzdG9yZSBoZWFwIGNvbmRpdGlvbg0KICAgICAgICBleGNlcHQgX1N0b3BJdGVyYXRpb246DQogICAgICAgICAgICBfaGVhcHBvcChoKSAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGVtcHR5IGl0ZXJhdG9yDQogICAgaWYgaDoNCiAgICAgICAgIyBmYXN0IGNhc2Ugd2hlbiBvbmx5IGEgc2luZ2xlIGl0ZXJhdG9yIHJlbWFpbnMNCiAgICAgICAgdiwgaXRudW0sIG5leHQgPSBoWzBdDQogICAgICAgIHlpZWxkIHYNCiAgICAgICAgZm9yIHYgaW4gbmV4dC5fX3NlbGZfXzoNCiAgICAgICAgICAgIHlpZWxkIHYNCg0KIyBFeHRlbmQgdGhlIGltcGxlbWVudGF0aW9ucyBvZiBuc21hbGxlc3QgYW5kIG5sYXJnZXN0IHRvIHVzZSBhIGtleT0gYXJndW1lbnQNCl9uc21hbGxlc3QgPSBuc21hbGxlc3QNCmRlZiBuc21hbGxlc3QobiwgaXRlcmFibGUsIGtleT1Ob25lKToNCiAgICAiIiJGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC4NCg0KICAgIEVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXkpWzpuXQ0KICAgICIiIg0KICAgICMgU2hvcnQtY3V0IGZvciBuPT0xIGlzIHRvIHVzZSBtaW4oKSB3aGVuIGxlbihpdGVyYWJsZSk+MA0KICAgIGlmIG4gPT0gMToNCiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKQ0KICAgICAgICBoZWFkID0gbGlzdChpc2xpY2UoaXQsIDEpKQ0KICAgICAgICBpZiBub3QgaGVhZDoNCiAgICAgICAgICAgIHJldHVybiBbXQ0KICAgICAgICBpZiBrZXkgaXMgTm9uZToNCiAgICAgICAgICAgIHJldHVybiBbbWluKGNoYWluKGhlYWQsIGl0KSldDQogICAgICAgIHJldHVybiBbbWluKGNoYWluKGhlYWQsIGl0KSwga2V5PWtleSldDQoNCiAgICAjIFdoZW4gbj49c2l6ZSwgaXQncyBmYXN0ZXIgdG8gdXNlIHNvcnRlZCgpDQogICAgdHJ5Og0KICAgICAgICBzaXplID0gbGVuKGl0ZXJhYmxlKQ0KICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6DQogICAgICAgIHBhc3MNCiAgICBlbHNlOg0KICAgICAgICBpZiBuID49IHNpemU6DQogICAgICAgICAgICByZXR1cm4gc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5KVs6bl0NCg0KICAgICMgV2hlbiBrZXkgaXMgbm9uZSwgdXNlIHNpbXBsZXIgZGVjb3JhdGlvbg0KICAgIGlmIGtleSBpcyBOb25lOg0KICAgICAgICBpdCA9IGl6aXAoaXRlcmFibGUsIGNvdW50KCkpICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWNvcmF0ZQ0KICAgICAgICByZXN1bHQgPSBfbnNtYWxsZXN0KG4sIGl0KQ0KICAgICAgICByZXR1cm4gbWFwKGl0ZW1nZXR0ZXIoMCksIHJlc3VsdCkgICAgICAgICAgICAgICAgICAgIyB1bmRlY29yYXRlDQoNCiAgICAjIEdlbmVyYWwgY2FzZSwgc2xvd2VzdCBtZXRob2QNCiAgICBpbjEsIGluMiA9IHRlZShpdGVyYWJsZSkNCiAgICBpdCA9IGl6aXAoaW1hcChrZXksIGluMSksIGNvdW50KCksIGluMikgICAgICAgICAgICAgICAgICMgZGVjb3JhdGUNCiAgICByZXN1bHQgPSBfbnNtYWxsZXN0KG4sIGl0KQ0KICAgIHJldHVybiBtYXAoaXRlbWdldHRlcigyKSwgcmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAgIyB1bmRlY29yYXRlDQoNCl9ubGFyZ2VzdCA9IG5sYXJnZXN0DQpkZWYgbmxhcmdlc3QobiwgaXRlcmFibGUsIGtleT1Ob25lKToNCiAgICAiIiJGaW5kIHRoZSBuIGxhcmdlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0Lg0KDQogICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSwgcmV2ZXJzZT1UcnVlKVs6bl0NCiAgICAiIiINCg0KICAgICMgU2hvcnQtY3V0IGZvciBuPT0xIGlzIHRvIHVzZSBtYXgoKSB3aGVuIGxlbihpdGVyYWJsZSk+MA0KICAgIGlmIG4gPT0gMToNCiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKQ0KICAgICAgICBoZWFkID0gbGlzdChpc2xpY2UoaXQsIDEpKQ0KICAgICAgICBpZiBub3QgaGVhZDoNCiAgICAgICAgICAgIHJldHVybiBbXQ0KICAgICAgICBpZiBrZXkgaXMgTm9uZToNCiAgICAgICAgICAgIHJldHVybiBbbWF4KGNoYWluKGhlYWQsIGl0KSldDQogICAgICAgIHJldHVybiBbbWF4KGNoYWluKGhlYWQsIGl0KSwga2V5PWtleSldDQoNCiAgICAjIFdoZW4gbj49c2l6ZSwgaXQncyBmYXN0ZXIgdG8gdXNlIHNvcnRlZCgpDQogICAgdHJ5Og0KICAgICAgICBzaXplID0gbGVuKGl0ZXJhYmxlKQ0KICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6DQogICAgICAgIHBhc3MNCiAgICBlbHNlOg0KICAgICAgICBpZiBuID49IHNpemU6DQogICAgICAgICAgICByZXR1cm4gc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5LCByZXZlcnNlPVRydWUpWzpuXQ0KDQogICAgIyBXaGVuIGtleSBpcyBub25lLCB1c2Ugc2ltcGxlciBkZWNvcmF0aW9uDQogICAgaWYga2V5IGlzIE5vbmU6DQogICAgICAgIGl0ID0gaXppcChpdGVyYWJsZSwgY291bnQoMCwtMSkpICAgICAgICAgICAgICAgICAgICAjIGRlY29yYXRlDQogICAgICAgIHJlc3VsdCA9IF9ubGFyZ2VzdChuLCBpdCkNCiAgICAgICAgcmV0dXJuIG1hcChpdGVtZ2V0dGVyKDApLCByZXN1bHQpICAgICAgICAgICAgICAgICAgICMgdW5kZWNvcmF0ZQ0KDQogICAgIyBHZW5lcmFsIGNhc2UsIHNsb3dlc3QgbWV0aG9kDQogICAgaW4xLCBpbjIgPSB0ZWUoaXRlcmFibGUpDQogICAgaXQgPSBpemlwKGltYXAoa2V5LCBpbjEpLCBjb3VudCgwLC0xKSwgaW4yKSAgICAgICAgICAgICAjIGRlY29yYXRlDQogICAgcmVzdWx0ID0gX25sYXJnZXN0KG4sIGl0KQ0KICAgIHJldHVybiBtYXAoaXRlbWdldHRlcigyKSwgcmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAgIyB1bmRlY29yYXRlDQoNCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6DQogICAgIyBTaW1wbGUgc2FuaXR5IHRlc3QNCiAgICBoZWFwID0gW10NCiAgICBkYXRhID0gWzEsIDMsIDUsIDcsIDksIDIsIDQsIDYsIDgsIDBdDQogICAgZm9yIGl0ZW0gaW4gZGF0YToNCiAgICAgICAgaGVhcHB1c2goaGVhcCwgaXRlbSkNCiAgICBzb3J0ID0gW10NCiAgICB3aGlsZSBoZWFwOg0KICAgICAgICBzb3J0LmFwcGVuZChoZWFwcG9wKGhlYXApKQ0KICAgIHByaW50IHNvcnQNCg0KICAgIGltcG9ydCBkb2N0ZXN0DQogICAgZG9jdGVzdC50ZXN0bW9kKCkNCg==