Ow0KOyBndm1hdDMyLmFzbSAtLSBBc20gcG9ydGlvbiBvZiB0aGUgb3B0aW1pemVkIGxvbmdlc3RfbWF0Y2ggZm9yIDMyIGJpdHMgeDg2DQo7IENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEplYW4tbG91cCBHYWlsbHkgYW5kIEdpbGxlcyBWb2xsYW50Lg0KOyBGaWxlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQsIGJ5IG1vZGlmaXlpbmcgdGhlIGxvbmdlc3RfbWF0Y2gNCjsgIGZyb20gSmVhbi1sb3VwIEdhaWxseSBpbiBkZWZsYXRlLmMNCjsgSXQgbmVlZCB3bWFzayA9PSAweDdmZmYNCjsgICAgIChhc3NlbWJseSBjb2RlIGlzIGZhc3RlciB3aXRoIGEgZml4ZWQgd21hc2spDQo7DQo7IEZvciBWaXN1YWwgQysrIDQuMiBhbmQgTUwgNi4xMWMgKHZlcnNpb24gaW4gZGlyZWN0b3J5IFxNQVNNNjExQyBvZiBXaW45NSBEREspDQo7ICAgSSBjb21waWxlIHdpdGggOiAibWwgL2NvZmYgL1ppIC9jIGd2bWF0MzIuYXNtIg0KOw0KDQo7dUludCBsb25nZXN0X21hdGNoXzdmZmYocywgY3VyX21hdGNoKQ0KOyAgICBkZWZsYXRlX3N0YXRlICpzOw0KOyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8NCg0KICAgICAgICBOYlN0YWNrICAgICAgICAgZXF1ICAgICA3Ng0KICAgICAgICBjdXJfbWF0Y2ggICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stMF0NCiAgICAgICAgc3RyX3MgICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTRdDQo7IDUgZHdvcmQgb24gdG9wIChyZXQsZWJwLGVzaSxlZGksZWJ4KQ0KICAgICAgICBhZHJyZXQgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stOF0NCiAgICAgICAgcHVzaGVicCAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTEyXQ0KICAgICAgICBwdXNoZWRpICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stMTZdDQogICAgICAgIHB1c2hlc2kgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0yMF0NCiAgICAgICAgcHVzaGVieCAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTI0XQ0KDQogICAgICAgIGNoYWluX2xlbmd0aCAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stMjhdDQogICAgICAgIGxpbWl0ICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stMzJdDQogICAgICAgIGJlc3RfbGVuICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stMzZdDQogICAgICAgIHdpbmRvdyAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNDBdDQogICAgICAgIHByZXYgICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNDRdDQogICAgICAgIHNjYW5fc3RhcnQgICAgICBlcXUgICAgICB3b3JkIHB0ciBbZXNwK05iU3RhY2stNDhdDQogICAgICAgIHdtYXNrICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNTJdDQogICAgICAgIG1hdGNoX3N0YXJ0X3B0ciBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNTZdDQogICAgICAgIG5pY2VfbWF0Y2ggICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNjBdDQogICAgICAgIHNjYW4gICAgICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNjRdDQoNCiAgICAgICAgd2luZG93bGVuICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay02OF0NCiAgICAgICAgbWF0Y2hfc3RhcnQgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay03Ml0NCiAgICAgICAgc3RyZW5kICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay03Nl0NCiAgICAgICAgTmJTdGFja0FkZCAgICAgIGVxdSAgICAgKE5iU3RhY2stMjQpDQoNCiAgICAuMzg2cA0KDQogICAgbmFtZSAgICBndm1hdGNoDQogICAgLk1PREVMICBGTEFUDQoNCg0KDQo7ICBhbGwgdGhlICs0IG9mZnNldHMgYXJlIGR1ZSB0byB0aGUgYWRkaXRpb24gb2YgcGVuZGluZ19idWZfc2l6ZSAoaW4gemxpYg0KOyAgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIHNpbmNlIHRoZSBhc20gY29kZSB3YXMgZmlyc3Qgd3JpdHRlbg0KOyAgKGlmIHlvdSBjb21waWxlIHdpdGggemxpYiAxLjAuNCBvciBvbGRlciwgcmVtb3ZlIHRoZSArNCkuDQo7ICBOb3RlIDogdGhlc2UgdmFsdWUgYXJlIGdvb2Qgd2l0aCBhIDggYnl0ZXMgYm91bmRhcnkgcGFjayBzdHJ1Y3R1cmUNCiAgICBkZXBfY2hhaW5fbGVuZ3RoICAgIGVxdSAgICAgNzBoKzQNCiAgICBkZXBfd2luZG93ICAgICAgICAgIGVxdSAgICAgMmNoKzQNCiAgICBkZXBfc3Ryc3RhcnQgICAgICAgIGVxdSAgICAgNjBoKzQNCiAgICBkZXBfcHJldl9sZW5ndGggICAgIGVxdSAgICAgNmNoKzQNCiAgICBkZXBfbmljZV9tYXRjaCAgICAgIGVxdSAgICAgODRoKzQNCiAgICBkZXBfd19zaXplICAgICAgICAgIGVxdSAgICAgMjBoKzQNCiAgICBkZXBfcHJldiAgICAgICAgICAgIGVxdSAgICAgMzRoKzQNCiAgICBkZXBfd19tYXNrICAgICAgICAgIGVxdSAgICAgMjhoKzQNCiAgICBkZXBfZ29vZF9tYXRjaCAgICAgIGVxdSAgICAgODBoKzQNCiAgICBkZXBfbWF0Y2hfc3RhcnQgICAgIGVxdSAgICAgNjRoKzQNCiAgICBkZXBfbG9va2FoZWFkICAgICAgIGVxdSAgICAgNjhoKzQNCg0KDQpfVEVYVCAgICAgICAgICAgICAgICAgICBzZWdtZW50DQoNCklGREVGIE5PVU5ERVJMSU5FDQogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGxvbmdlc3RfbWF0Y2hfN2ZmZg0KICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBsb25nZXN0X21hdGNoXzY4Ng0KOyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgbWF0Y2hfaW5pdA0KRUxTRQ0KICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBfbG9uZ2VzdF9tYXRjaF83ZmZmDQogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIF9sb25nZXN0X21hdGNoXzY4Ng0KOyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgX21hdGNoX2luaXQNCkVORElGDQoNCiAgICBNQVhfTUFUQ0ggICAgICAgICAgIGVxdSAgICAgMjU4DQogICAgTUlOX01BVENIICAgICAgICAgICBlcXUgICAgIDMNCiAgICBNSU5fTE9PS0FIRUFEICAgICAgIGVxdSAgICAgKE1BWF9NQVRDSCtNSU5fTUFUQ0grMSkNCg0KDQoNCklGREVGIE5PVU5ERVJMSU5FDQo7bWF0Y2hfaW5pdCAgICAgIHByb2MgbmVhcg0KOyAgICAgICAgICAgICAgICByZXQNCjttYXRjaF9pbml0ICAgICAgZW5kcA0KRUxTRQ0KO19tYXRjaF9pbml0ICAgICBwcm9jIG5lYXINCjsgICAgICAgICAgICAgICAgcmV0DQo7X21hdGNoX2luaXQgICAgIGVuZHANCkVORElGDQoNCg0KSUZERUYgTk9VTkRFUkxJTkUNCmxvbmdlc3RfbWF0Y2hfN2ZmZiAgIHByb2MgbmVhcg0KRUxTRQ0KX2xvbmdlc3RfbWF0Y2hfN2ZmZiAgcHJvYyBuZWFyDQpFTkRJRg0KDQogICAgICAgIG1vdiAgICAgZWR4LFtlc3ArNF0NCg0KDQoNCiAgICAgICAgcHVzaCAgICBlYnANCiAgICAgICAgcHVzaCAgICBlZGkNCiAgICAgICAgcHVzaCAgICBlc2kNCiAgICAgICAgcHVzaCAgICBlYngNCg0KICAgICAgICBzdWIgICAgIGVzcCxOYlN0YWNrQWRkDQoNCjsgaW5pdGlhbGl6ZSBvciBjaGVjayB0aGUgdmFyaWFibGVzIHVzZWQgaW4gbWF0Y2guYXNtLg0KICAgICAgICBtb3YgICAgIGVicCxlZHgNCg0KOyBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoDQo7IGlmIChwcmV2X2xlbmd0aD49Z29vZF9tYXRjaCkgY2hhaW5fbGVuZ3RoID4+PSAyDQogICAgICAgIG1vdiAgICAgZWR4LFtlYnArZGVwX2NoYWluX2xlbmd0aF0NCiAgICAgICAgbW92ICAgICBlYngsW2VicCtkZXBfcHJldl9sZW5ndGhdDQogICAgICAgIGNtcCAgICAgW2VicCtkZXBfZ29vZF9tYXRjaF0sZWJ4DQogICAgICAgIGphICAgICAgbm9zaHINCiAgICAgICAgc2hyICAgICBlZHgsMg0Kbm9zaHI6DQo7IHdlIGluY3JlbWVudCBjaGFpbl9sZW5ndGggYmVjYXVzZSBpbiB0aGUgYXNtLCB0aGUgLS1jaGFpbl9sZW5naHQgaXMgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgbG9vcA0KICAgICAgICBpbmMgICAgIGVkeA0KICAgICAgICBtb3YgICAgIGVkaSxbZWJwK2RlcF9uaWNlX21hdGNoXQ0KICAgICAgICBtb3YgICAgIGNoYWluX2xlbmd0aCxlZHgNCiAgICAgICAgbW92ICAgICBlYXgsW2VicCtkZXBfbG9va2FoZWFkXQ0KICAgICAgICBjbXAgICAgIGVheCxlZGkNCjsgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7DQogICAgICAgIGphZSAgICAgbm9sb29rYWhlYWRuaWNlbWF0Y2gNCiAgICAgICAgbW92ICAgICBlZGksZWF4DQpub2xvb2thaGVhZG5pY2VtYXRjaDoNCjsgYmVzdF9sZW4gPSBzLT5wcmV2X2xlbmd0aA0KICAgICAgICBtb3YgICAgIGJlc3RfbGVuLGVieA0KDQo7IHdpbmRvdyA9IHMtPndpbmRvdw0KICAgICAgICBtb3YgICAgIGVzaSxbZWJwK2RlcF93aW5kb3ddDQogICAgICAgIG1vdiAgICAgZWN4LFtlYnArZGVwX3N0cnN0YXJ0XQ0KICAgICAgICBtb3YgICAgIHdpbmRvdyxlc2kNCg0KICAgICAgICBtb3YgICAgIG5pY2VfbWF0Y2gsZWRpDQo7IHNjYW4gPSB3aW5kb3cgKyBzdHJzdGFydA0KICAgICAgICBhZGQgICAgIGVzaSxlY3gNCiAgICAgICAgbW92ICAgICBzY2FuLGVzaQ0KOyBkeCA9ICp3aW5kb3cNCiAgICAgICAgbW92ICAgICBkeCx3b3JkIHB0ciBbZXNpXQ0KOyBieCA9ICood2luZG93K2Jlc3RfbGVuLTEpDQogICAgICAgIG1vdiAgICAgYngsd29yZCBwdHIgW2VzaStlYngtMV0NCiAgICAgICAgYWRkICAgICBlc2ksTUFYX01BVENILTENCjsgc2Nhbl9zdGFydCA9ICpzY2FuDQogICAgICAgIG1vdiAgICAgc2Nhbl9zdGFydCxkeA0KOyBzdHJlbmQgPSBzY2FuICsgTUFYX01BVENILTENCiAgICAgICAgbW92ICAgICBzdHJlbmQsZXNpDQo7IGJ4ID0gc2Nhbl9lbmQgPSAqKHdpbmRvdytiZXN0X2xlbi0xKQ0KDQo7ICAgIElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8NCjsgICAgICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7DQoNCiAgICAgICAgbW92ICAgICBlc2ksW2VicCtkZXBfd19zaXplXQ0KICAgICAgICBzdWIgICAgIGVzaSxNSU5fTE9PS0FIRUFEDQo7IGhlcmUgZXNpID0gTUFYX0RJU1QocykNCiAgICAgICAgc3ViICAgICBlY3gsZXNpDQogICAgICAgIGphICAgICAgbm9kaXN0DQogICAgICAgIHhvciAgICAgZWN4LGVjeA0Kbm9kaXN0Og0KICAgICAgICBtb3YgICAgIGxpbWl0LGVjeA0KDQo7IHByZXYgPSBzLT5wcmV2DQogICAgICAgIG1vdiAgICAgZWR4LFtlYnArZGVwX3ByZXZdDQogICAgICAgIG1vdiAgICAgcHJldixlZHgNCg0KOw0KICAgICAgICBtb3YgICAgIGVkeCxkd29yZCBwdHIgW2VicCtkZXBfbWF0Y2hfc3RhcnRdDQogICAgICAgIG1vdiAgICAgYnAsc2Nhbl9zdGFydA0KICAgICAgICBtb3YgICAgIGVheCxjdXJfbWF0Y2gNCiAgICAgICAgbW92ICAgICBtYXRjaF9zdGFydCxlZHgNCg0KICAgICAgICBtb3YgICAgIGVkeCx3aW5kb3cNCiAgICAgICAgbW92ICAgICBlZGksZWR4DQogICAgICAgIGFkZCAgICAgZWRpLGJlc3RfbGVuDQogICAgICAgIG1vdiAgICAgZXNpLHByZXYNCiAgICAgICAgZGVjICAgICBlZGkNCjsgd2luZG93bGVuID0gd2luZG93ICsgYmVzdF9sZW4gLTENCiAgICAgICAgbW92ICAgICB3aW5kb3dsZW4sZWRpDQoNCiAgICAgICAgam1wICAgICBiZWdpbmxvb3AyDQogICAgICAgIGFsaWduICAgNA0KDQo7IGhlcmUsIGluIHRoZSBsb29wDQo7ICAgICAgIGVheCA9IGF4ID0gY3VyX21hdGNoDQo7ICAgICAgIGVjeCA9IGxpbWl0DQo7ICAgICAgICBieCA9IHNjYW5fZW5kDQo7ICAgICAgICBicCA9IHNjYW5fc3RhcnQNCjsgICAgICAgZWRpID0gd2luZG93bGVuICh3aW5kb3cgKyBiZXN0X2xlbiAtMSkNCjsgICAgICAgZXNpID0gcHJldg0KDQoNCjsvLyBoZXJlOyBjaGFpbl9sZW5ndGggPD0xNg0Kbm9ybWFsYmVnMGFkZDE2Og0KICAgICAgICBhZGQgICAgIGNoYWluX2xlbmd0aCwxNg0KICAgICAgICBqeiAgICAgIGV4aXRsb29wDQpub3JtYWxiZWcwOg0KICAgICAgICBjbXAgICAgIHdvcmQgcHRyW2VkaStlYXhdLGJ4DQogICAgICAgIGplICAgICAgbm9ybWFsYmVnMm5vcm9sbA0KcmNvbnRsYWJub3JvbGw6DQo7IGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdDQogICAgICAgIGFuZCAgICAgZWF4LDdmZmZoDQogICAgICAgIG1vdiAgICAgYXgsd29yZCBwdHJbZXNpK2VheCoyXQ0KOyBpZiBjdXJfbWF0Y2ggPiBsaW1pdCwgZ28gdG8gZXhpdGxvb3ANCiAgICAgICAgY21wICAgICBlY3gsZWF4DQogICAgICAgIGpuYiAgICAgZXhpdGxvb3ANCjsgaWYgLS1jaGFpbl9sZW5ndGggIT0gMCwgZ28gdG8gZXhpdGxvb3ANCiAgICAgICAgZGVjICAgICBjaGFpbl9sZW5ndGgNCiAgICAgICAgam56ICAgICBub3JtYWxiZWcwDQogICAgICAgIGptcCAgICAgZXhpdGxvb3ANCg0Kbm9ybWFsYmVnMm5vcm9sbDoNCjsgaWYgKHNjYW5fc3RhcnQ9PSooY3VyX21hdGNoK3dpbmRvdykpIGdvdG8gbm9ybWFsYmVnMg0KICAgICAgICBjbXAgICAgIGJwLHdvcmQgcHRyW2VkeCtlYXhdDQogICAgICAgIGpuZSAgICAgcmNvbnRsYWJub3JvbGwNCiAgICAgICAgam1wICAgICBub3JtYWxiZWcyDQoNCmNvbnRsb29wMzoNCiAgICAgICAgbW92ICAgICBlZGksd2luZG93bGVuDQoNCjsgY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10NCiAgICAgICAgYW5kICAgICBlYXgsN2ZmZmgNCiAgICAgICAgbW92ICAgICBheCx3b3JkIHB0cltlc2krZWF4KjJdDQo7IGlmIGN1cl9tYXRjaCA+IGxpbWl0LCBnbyB0byBleGl0bG9vcA0KICAgICAgICBjbXAgICAgIGVjeCxlYXgNCmpuYmV4aXRsb29wc2hvcnQxOg0KICAgICAgICBqbmIgICAgIGV4aXRsb29wDQo7IGlmIC0tY2hhaW5fbGVuZ3RoICE9IDAsIGdvIHRvIGV4aXRsb29wDQoNCg0KOyBiZWdpbiB0aGUgbWFpbiBsb29wDQpiZWdpbmxvb3AyOg0KICAgICAgICBzdWIgICAgIGNoYWluX2xlbmd0aCwxNisxDQo7IGlmIGNoYWluX2xlbmd0aCA8PTE2LCBkb24ndCB1c2UgdGhlIHVucm9sbGVkIGxvb3ANCiAgICAgICAgam5hICAgICBub3JtYWxiZWcwYWRkMTYNCg0KZG8xNjoNCiAgICAgICAgY21wICAgICB3b3JkIHB0cltlZGkrZWF4XSxieA0KICAgICAgICBqZSAgICAgIG5vcm1hbGJlZzJkYzANCg0KbWFjY24gICBNQUNSTyAgIGxhYg0KICAgICAgICBhbmQgICAgIGVheCw3ZmZmaA0KICAgICAgICBtb3YgICAgIGF4LHdvcmQgcHRyW2VzaStlYXgqMl0NCiAgICAgICAgY21wICAgICBlY3gsZWF4DQogICAgICAgIGpuYiAgICAgZXhpdGxvb3ANCiAgICAgICAgY21wICAgICB3b3JkIHB0cltlZGkrZWF4XSxieA0KICAgICAgICBqZSAgICAgIGxhYg0KICAgICAgICBFTkRNDQoNCnJjb250bG9vcDA6DQogICAgICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjMQ0KDQpyY29udGxvb3AxOg0KICAgICAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzINCg0KcmNvbnRsb29wMjoNCiAgICAgICAgbWFjY24gICBub3JtYWxiZWcyZGMzDQoNCnJjb250bG9vcDM6DQogICAgICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjNA0KDQpyY29udGxvb3A0Og0KICAgICAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzUNCg0KcmNvbnRsb29wNToNCiAgICAgICAgbWFjY24gICBub3JtYWxiZWcyZGM2DQoNCnJjb250bG9vcDY6DQogICAgICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjNw0KDQpyY29udGxvb3A3Og0KICAgICAgICBtYWNjbiAgIG5vcm1hbGJlZzJkYzgNCg0KcmNvbnRsb29wODoNCiAgICAgICAgbWFjY24gICBub3JtYWxiZWcyZGM5DQoNCnJjb250bG9vcDk6DQogICAgICAgIG1hY2NuICAgbm9ybWFsYmVnMmRjMTANCg0KcmNvbnRsb29wMTA6DQogICAgICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTENCg0KcmNvbnRsb29wMTE6DQogICAgICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTINCg0KcmNvbnRsb29wMTI6DQogICAgICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTMNCg0KcmNvbnRsb29wMTM6DQogICAgICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTQNCg0KcmNvbnRsb29wMTQ6DQogICAgICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTUNCg0KcmNvbnRsb29wMTU6DQogICAgICAgIGFuZCAgICAgZWF4LDdmZmZoDQogICAgICAgIG1vdiAgICAgYXgsd29yZCBwdHJbZXNpK2VheCoyXQ0KICAgICAgICBjbXAgICAgIGVjeCxlYXgNCiAgICAgICAgam5iICAgICBleGl0bG9vcA0KDQogICAgICAgIHN1YiAgICAgY2hhaW5fbGVuZ3RoLDE2DQogICAgICAgIGphICAgICAgZG8xNg0KICAgICAgICBqbXAgICAgIG5vcm1hbGJlZzBhZGQxNg0KDQo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ow0KDQpub3JtYmVnIE1BQ1JPICAgcmNvbnRsYWIsdmFsc3ViDQo7IGlmIHdlIGFyZSBoZXJlLCB3ZSBrbm93IHRoYXQgKihtYXRjaCtiZXN0X2xlbi0xKSA9PSBzY2FuX2VuZA0KICAgICAgICBjbXAgICAgIGJwLHdvcmQgcHRyW2VkeCtlYXhdDQo7IGlmIChtYXRjaCAhPSBzY2FuX3N0YXJ0KSBnb3RvIHJjb250bGFiDQogICAgICAgIGpuZSAgICAgcmNvbnRsYWINCjsgY2FsY3VsYXRlIHRoZSBnb29kIGNoYWluX2xlbmd0aCwgYW5kIHdlJ2xsIGNvbXBhcmUgc2NhbiBhbmQgbWF0Y2ggc3RyaW5nDQogICAgICAgIGFkZCAgICAgY2hhaW5fbGVuZ3RoLDE2LXZhbHN1Yg0KICAgICAgICBqbXAgICAgIGlzZXENCiAgICAgICAgRU5ETQ0KDQoNCm5vcm1hbGJlZzJkYzExOg0KICAgICAgICBub3JtYmVnIHJjb250bG9vcDExLDExDQoNCm5vcm1hbGJlZzJkYzEyOg0KICAgICAgICBub3JtYmVnIHNob3J0IHJjb250bG9vcDEyLDEyDQoNCm5vcm1hbGJlZzJkYzEzOg0KICAgICAgICBub3JtYmVnIHNob3J0IHJjb250bG9vcDEzLDEzDQoNCm5vcm1hbGJlZzJkYzE0Og0KICAgICAgICBub3JtYmVnIHNob3J0IHJjb250bG9vcDE0LDE0DQoNCm5vcm1hbGJlZzJkYzE1Og0KICAgICAgICBub3JtYmVnIHNob3J0IHJjb250bG9vcDE1LDE1DQoNCm5vcm1hbGJlZzJkYzEwOg0KICAgICAgICBub3JtYmVnIHJjb250bG9vcDEwLDEwDQoNCm5vcm1hbGJlZzJkYzk6DQogICAgICAgIG5vcm1iZWcgcmNvbnRsb29wOSw5DQoNCm5vcm1hbGJlZzJkYzg6DQogICAgICAgIG5vcm1iZWcgcmNvbnRsb29wOCw4DQoNCm5vcm1hbGJlZzJkYzc6DQogICAgICAgIG5vcm1iZWcgcmNvbnRsb29wNyw3DQoNCm5vcm1hbGJlZzJkYzY6DQogICAgICAgIG5vcm1iZWcgcmNvbnRsb29wNiw2DQoNCm5vcm1hbGJlZzJkYzU6DQogICAgICAgIG5vcm1iZWcgcmNvbnRsb29wNSw1DQoNCm5vcm1hbGJlZzJkYzQ6DQogICAgICAgIG5vcm1iZWcgcmNvbnRsb29wNCw0DQoNCm5vcm1hbGJlZzJkYzM6DQogICAgICAgIG5vcm1iZWcgcmNvbnRsb29wMywzDQoNCm5vcm1hbGJlZzJkYzI6DQogICAgICAgIG5vcm1iZWcgcmNvbnRsb29wMiwyDQoNCm5vcm1hbGJlZzJkYzE6DQogICAgICAgIG5vcm1iZWcgcmNvbnRsb29wMSwxDQoNCm5vcm1hbGJlZzJkYzA6DQogICAgICAgIG5vcm1iZWcgcmNvbnRsb29wMCwwDQoNCg0KOyB3ZSBnbyBpbiBub3JtYWxiZWcyIGJlY2F1c2UgKih1c2hmKikobWF0Y2grYmVzdF9sZW4tMSkgPT0gc2Nhbl9lbmQNCg0Kbm9ybWFsYmVnMjoNCiAgICAgICAgbW92ICAgICBlZGksd2luZG93DQoNCiAgICAgICAgY21wICAgICBicCx3b3JkIHB0cltlZGkrZWF4XQ0KICAgICAgICBqbmUgICAgIGNvbnRsb29wMyAgICAgICAgICAgICAgICAgICA7IGlmICoodXNoZiopbWF0Y2ggIT0gc2Nhbl9zdGFydCwgY29udGludWUNCg0KaXNlcToNCjsgaWYgd2UgYXJlIGhlcmUsIHdlIGtub3cgdGhhdCAqKG1hdGNoK2Jlc3RfbGVuLTEpID09IHNjYW5fZW5kDQo7IGFuZCAobWF0Y2ggPT0gc2Nhbl9zdGFydCkNCg0KICAgICAgICBtb3YgICAgIGVkaSxlZHgNCiAgICAgICAgbW92ICAgICBlc2ksc2NhbiAgICAgICAgICAgICAgICAgICAgOyBlc2kgPSBzY2FuDQogICAgICAgIGFkZCAgICAgZWRpLGVheCAgICAgICAgICAgICAgICAgICAgIDsgZWRpID0gd2luZG93ICsgY3VyX21hdGNoID0gbWF0Y2gNCg0KICAgICAgICBtb3YgICAgIGVkeCxbZXNpKzNdICAgICAgICAgICAgICAgICA7IGNvbXBhcmUgbWFudWFsbHkgZHdvcmQgYXQgbWF0Y2grMw0KICAgICAgICB4b3IgICAgIGVkeCxbZWRpKzNdICAgICAgICAgICAgICAgICA7IGFuZCBzY2FuICszDQoNCiAgICAgICAganogICAgICBiZWdpbmNvbXBhcmUgICAgICAgICAgICAgICAgOyBpZiBlcXVhbCwgZ28gdG8gbG9uZyBjb21wYXJlDQoNCjsgd2Ugd2lsbCBkZXRlcm1pbmUgdGhlIHVubWF0Y2ggYnl0ZSBhbmQgY2FsY3VsYXRlIGxlbiAoaW4gZXNpKQ0KICAgICAgICBvciAgICAgIGRsLGRsDQogICAgICAgIGplICAgICAgZXExcnINCiAgICAgICAgbW92ICAgICBlc2ksMw0KICAgICAgICBqbXAgICAgIHRyZmludmFsDQplcTFycjoNCiAgICAgICAgb3IgICAgICBkeCxkeA0KICAgICAgICBqZSAgICAgIGVxMQ0KDQogICAgICAgIG1vdiAgICAgZXNpLDQNCiAgICAgICAgam1wICAgICB0cmZpbnZhbA0KZXExOg0KICAgICAgICBhbmQgICAgIGVkeCwwZmZmZmZmaA0KICAgICAgICBqeiAgICAgIGVxMTENCiAgICAgICAgbW92ICAgICBlc2ksNQ0KICAgICAgICBqbXAgICAgIHRyZmludmFsDQplcTExOg0KICAgICAgICBtb3YgICAgIGVzaSw2DQogICAgICAgIGptcCAgICAgdHJmaW52YWwNCg0KYmVnaW5jb21wYXJlOg0KICAgICAgICA7IGhlcmUgd2Ugbm93IHNjYW4gYW5kIG1hdGNoIGJlZ2luIHNhbWUNCiAgICAgICAgYWRkICAgICBlZGksNg0KICAgICAgICBhZGQgICAgIGVzaSw2DQogICAgICAgIG1vdiAgICAgZWN4LChNQVhfTUFUQ0gtKDIrNCkpLzQgICAgIDsgc2NhbiBmb3IgYXQgbW9zdCBNQVhfTUFUQ0ggYnl0ZXMNCiAgICAgICAgcmVwZSAgICBjbXBzZCAgICAgICAgICAgICAgICAgICAgICAgOyBsb29wIHVudGlsIG1pc21hdGNoDQoNCiAgICAgICAgamUgICAgICB0cmZpbiAgICAgICAgICAgICAgICAgICAgICAgOyBnbyB0byB0cmZpbiBpZiBub3QgdW5tYXRjaA0KOyB3ZSBkZXRlcm1pbmUgdGhlIHVubWF0Y2ggYnl0ZQ0KICAgICAgICBzdWIgICAgIGVzaSw0DQogICAgICAgIG1vdiAgICAgZWR4LFtlZGktNF0NCiAgICAgICAgeG9yICAgICBlZHgsW2VzaV0NCg0KICAgICAgICBvciAgICAgIGRsLGRsDQogICAgICAgIGpueiAgICAgdHJmaW4NCiAgICAgICAgaW5jICAgICBlc2kNCg0KICAgICAgICBvciAgICAgIGR4LGR4DQogICAgICAgIGpueiAgICAgdHJmaW4NCiAgICAgICAgaW5jICAgICBlc2kNCg0KICAgICAgICBhbmQgICAgIGVkeCwwZmZmZmZmaA0KICAgICAgICBqbnogICAgIHRyZmluDQogICAgICAgIGluYyAgICAgZXNpDQoNCnRyZmluOg0KICAgICAgICBzdWIgICAgIGVzaSxzY2FuICAgICAgICAgIDsgZXNpID0gbGVuDQp0cmZpbnZhbDoNCjsgaGVyZSB3ZSBoYXZlIGZpbmlzZWQgY29tcGFyZSwgYW5kIGVzaSBjb250YWluIGxlbiBvZiBlcXVhbCBzdHJpbmcNCiAgICAgICAgY21wICAgICBlc2ksYmVzdF9sZW4gICAgICAgIDsgaWYgbGVuID4gYmVzdF9sZW4sIGdvIG5ld2Jlc3RsZW4NCiAgICAgICAgamEgICAgICBzaG9ydCBuZXdiZXN0bGVuDQo7IG5vdyB3ZSByZXN0b3JlIGVkeCwgZWN4IGFuZCBlc2ksIGZvciB0aGUgYmlnIGxvb3ANCiAgICAgICAgbW92ICAgICBlc2kscHJldg0KICAgICAgICBtb3YgICAgIGVjeCxsaW1pdA0KICAgICAgICBtb3YgICAgIGVkeCx3aW5kb3cNCiAgICAgICAgam1wICAgICBjb250bG9vcDMNCg0KbmV3YmVzdGxlbjoNCiAgICAgICAgbW92ICAgICBiZXN0X2xlbixlc2kgICAgICAgIDsgbGVuIGJlY29tZSBiZXN0X2xlbg0KDQogICAgICAgIG1vdiAgICAgbWF0Y2hfc3RhcnQsZWF4ICAgICA7IHNhdmUgbmV3IHBvc2l0aW9uIGFzIG1hdGNoX3N0YXJ0DQogICAgICAgIGNtcCAgICAgZXNpLG5pY2VfbWF0Y2ggICAgICA7IGlmIGJlc3RfbGVuID49IG5pY2VfbWF0Y2gsIGV4aXQNCiAgICAgICAgamFlICAgICBleGl0bG9vcA0KICAgICAgICBtb3YgICAgIGVjeCxzY2FuDQogICAgICAgIG1vdiAgICAgZWR4LHdpbmRvdyAgICAgICAgICA7IHJlc3RvcmUgZWR4PXdpbmRvdw0KICAgICAgICBhZGQgICAgIGVjeCxlc2kNCiAgICAgICAgYWRkICAgICBlc2ksZWR4DQoNCiAgICAgICAgZGVjICAgICBlc2kNCiAgICAgICAgbW92ICAgICB3aW5kb3dsZW4sZXNpICAgICAgIDsgd2luZG93bGVuID0gd2luZG93ICsgYmVzdF9sZW4tMQ0KICAgICAgICBtb3YgICAgIGJ4LFtlY3gtMV0gICAgICAgICAgOyBieCA9ICooc2NhbitiZXN0X2xlbi0xKSA9IHNjYW5fZW5kDQoNCjsgbm93IHdlIHJlc3RvcmUgZWN4IGFuZCBlc2ksIGZvciB0aGUgYmlnIGxvb3AgOg0KICAgICAgICBtb3YgICAgIGVzaSxwcmV2DQogICAgICAgIG1vdiAgICAgZWN4LGxpbWl0DQogICAgICAgIGptcCAgICAgY29udGxvb3AzDQoNCmV4aXRsb29wOg0KOyBleGl0IDogcy0+bWF0Y2hfc3RhcnQ9bWF0Y2hfc3RhcnQNCiAgICAgICAgbW92ICAgICBlYngsbWF0Y2hfc3RhcnQNCiAgICAgICAgbW92ICAgICBlYnAsc3RyX3MNCiAgICAgICAgbW92ICAgICBlY3gsYmVzdF9sZW4NCiAgICAgICAgbW92ICAgICBkd29yZCBwdHIgW2VicCtkZXBfbWF0Y2hfc3RhcnRdLGVieCAgICAgICAgDQogICAgICAgIG1vdiAgICAgZWF4LGR3b3JkIHB0ciBbZWJwK2RlcF9sb29rYWhlYWRdDQogICAgICAgIGNtcCAgICAgZWN4LGVheA0KICAgICAgICBqYSAgICAgIG1pbmV4bG8NCiAgICAgICAgbW92ICAgICBlYXgsZWN4DQptaW5leGxvOg0KOyByZXR1cm4gbWluKGJlc3RfbGVuLHMtPmxvb2thaGVhZCkNCiAgICAgICAgDQo7IHJlc3RvcmUgc3RhY2sgYW5kIHJlZ2lzdGVyIGVieCxlc2ksZWRpLGVicA0KICAgICAgICBhZGQgICAgIGVzcCxOYlN0YWNrQWRkDQoNCiAgICAgICAgcG9wICAgICBlYngNCiAgICAgICAgcG9wICAgICBlc2kNCiAgICAgICAgcG9wICAgICBlZGkNCiAgICAgICAgcG9wICAgICBlYnANCiAgICAgICAgcmV0DQpJbmZvQXV0aG9yOg0KOyBwbGVhc2UgZG9uJ3QgcmVtb3ZlIHRoaXMgc3RyaW5nICENCjsgWW91ciBhcmUgZnJlZSB1c2UgZ3ZtYXQzMiBpbiBhbnkgZnJlIG9yIGNvbW1lcmNpYWwgYXBwcyBpZiB5b3UgZG9uJ3QgcmVtb3ZlIHRoZSBzdHJpbmcgaW4gdGhlIGJpbmFyeSENCiAgICAgICAgZGIgICAgIDBkaCwwYWgsIkdWTWF0MzIgb3B0aW1pc2VkIGFzc2VtYmx5IGNvZGUgd3JpdHRlbiAxOTk2LTk4IGJ5IEdpbGxlcyBWb2xsYW50IiwwZGgsMGFoDQoNCg0KDQpJRkRFRiBOT1VOREVSTElORQ0KbG9uZ2VzdF9tYXRjaF83ZmZmICAgZW5kcA0KRUxTRQ0KX2xvbmdlc3RfbWF0Y2hfN2ZmZiAgZW5kcA0KRU5ESUYNCg0KDQpJRkRFRiBOT1VOREVSTElORQ0KY3B1ZGV0ZWN0MzIgICAgIHByb2MgbmVhcg0KRUxTRQ0KX2NwdWRldGVjdDMyICAgIHByb2MgbmVhcg0KRU5ESUYNCg0KCXB1c2gJZWJ4DQoNCglwdXNoZmQgICAgICAgICAgICAgICAgICA7IHB1c2ggb3JpZ2luYWwgRUZMQUdTDQoJcG9wICAgICBlYXggICAgICAgICAgICAgOyBnZXQgb3JpZ2luYWwgRUZMQUdTDQoJbW92ICAgICBlY3gsIGVheCAgICAgICAgOyBzYXZlIG9yaWdpbmFsIEVGTEFHUw0KCXhvciAgICAgZWF4LCA0MDAwMGggICAgIDsgZmxpcCBBQyBiaXQgaW4gRUZMQUdTDQoJcHVzaCAgICBlYXggICAgICAgICAgICAgOyBzYXZlIG5ldyBFRkxBR1MgdmFsdWUgb24gc3RhY2sNCglwb3BmZCAgICAgICAgICAgICAgICAgICA7IHJlcGxhY2UgY3VycmVudCBFRkxBR1MgdmFsdWUNCglwdXNoZmQgICAgICAgICAgICAgICAgICA7IGdldCBuZXcgRUZMQUdTDQoJcG9wICAgICBlYXggICAgICAgICAgICAgOyBzdG9yZSBuZXcgRUZMQUdTIGluIEVBWA0KCXhvciAgICAgZWF4LCBlY3ggICAgICAgIDsgY2FuknQgdG9nZ2xlIEFDIGJpdCwgcHJvY2Vzc29yPTgwMzg2DQoJanogICAgICBlbmRfY3B1X2lzXzM4NiAgOyBqdW1wIGlmIDgwMzg2IHByb2Nlc3Nvcg0KCXB1c2ggICAgZWN4DQoJcG9wZmQgICAgICAgICAgICAgICAgICAgOyByZXN0b3JlIEFDIGJpdCBpbiBFRkxBR1MgZmlyc3QNCg0KCXB1c2hmZA0KCXB1c2hmZA0KCXBvcCAgICAgZWN4DQoJCQkNCgltb3YgICAgIGVheCwgZWN4ICAgICAgICA7IGdldCBvcmlnaW5hbCBFRkxBR1MNCgl4b3IgICAgIGVheCwgMjAwMDAwaCAgICA7IGZsaXAgSUQgYml0IGluIEVGTEFHUw0KCXB1c2ggICAgZWF4ICAgICAgICAgICAgIDsgc2F2ZSBuZXcgRUZMQUdTIHZhbHVlIG9uIHN0YWNrDQoJcG9wZmQgICAgICAgICAgICAgICAgICAgOyByZXBsYWNlIGN1cnJlbnQgRUZMQUdTIHZhbHVlDQoJcHVzaGZkICAgICAgICAgICAgICAgICAgOyBnZXQgbmV3IEVGTEFHUw0KCXBvcAkJZWF4CSAgICAgICAgICAgIDsgc3RvcmUgbmV3IEVGTEFHUyBpbiBFQVgNCglwb3BmZCAgICAgICAgICAgICAgICAgICA7IHJlc3RvcmUgb3JpZ2luYWwgRUZMQUdTDQoJeG9yCQllYXgsIGVjeCAgICAgICAgOyBjYW6SdCB0b2dnbGUgSUQgYml0LA0KCWplCQlpc19vbGRfNDg2CQk7IHByb2Nlc3Nvcj1vbGQNCg0KCW1vdiAgICAgZWF4LDENCglkYiAgICAgIDBmaCwwYTJoICAgICAgICA7Q1BVSUQgICANCg0KZXhpdGNwdWRldGVjdDoNCglwb3AJZWJ4DQoJcmV0DQoNCmVuZF9jcHVfaXNfMzg2Og0KCW1vdiAgICAgZWF4LDAzMDBoDQoJam1wICAgICBleGl0Y3B1ZGV0ZWN0DQoNCmlzX29sZF80ODY6DQoJbW92ICAgICBlYXgsMDQwMGgNCglqbXAgICAgIGV4aXRjcHVkZXRlY3QNCg0KSUZERUYgTk9VTkRFUkxJTkUNCmNwdWRldGVjdDMyICAgICBlbmRwDQpFTFNFDQpfY3B1ZGV0ZWN0MzIgICAgZW5kcA0KRU5ESUYNCg0KDQoNCg0KTUFYX01BVENIICAgICAgIGVxdSAgICAgMjU4DQpNSU5fTUFUQ0ggICAgICAgZXF1ICAgICAzDQpNSU5fTE9PS0FIRUFEICAgZXF1ICAgICAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSkNCk1BWF9NQVRDSF84XyAgICAgZXF1ICAgICAoKE1BWF9NQVRDSCArIDcpIEFORCAwRkZGMGgpDQoNCg0KOzs7IHN0YWNrIGZyYW1lIG9mZnNldHMNCg0KY2hhaW5sZW53bWFzawllcXUgIGVzcCArIDAJOyBoaWdoIHdvcmQ6IGN1cnJlbnQgY2hhaW4gbGVuDQoJCQkJCTsgbG93IHdvcmQ6IHMtPndtYXNrDQp3aW5kb3cJCWVxdSAgZXNwICsgNAk7IGxvY2FsIGNvcHkgb2Ygcy0+d2luZG93DQp3aW5kb3diZXN0bGVuCWVxdSAgZXNwICsgOAk7IHMtPndpbmRvdyArIGJlc3RsZW4NCnNjYW5zdGFydAllcXUgIGVzcCArIDE2CTsgZmlyc3QgdHdvIGJ5dGVzIG9mIHN0cmluZw0Kc2NhbmVuZAkJZXF1ICBlc3AgKyAxMgk7IGxhc3QgdHdvIGJ5dGVzIG9mIHN0cmluZw0Kc2NhbmFsaWduCWVxdSAgZXNwICsgMjAJOyBkd29yZC1taXNhbGlnbm1lbnQgb2Ygc3RyaW5nDQpuaWNlbWF0Y2gJZXF1ICBlc3AgKyAyNAk7IGEgZ29vZCBlbm91Z2ggbWF0Y2ggc2l6ZQ0KYmVzdGxlbgkJZXF1ICBlc3AgKyAyOAk7IHNpemUgb2YgYmVzdCBtYXRjaCBzbyBmYXINCnNjYW4JCWVxdSAgZXNwICsgMzIJOyBwdHIgdG8gc3RyaW5nIHdhbnRpbmcgbWF0Y2gNCg0KTG9jYWxWYXJzU2l6ZQllcXUgMzYNCjsJc2F2ZWQgZWJ4CWJ5dGUgZXNwICsgMzYNCjsJc2F2ZWQgZWRpCWJ5dGUgZXNwICsgNDANCjsJc2F2ZWQgZXNpCWJ5dGUgZXNwICsgNDQNCjsJc2F2ZWQgZWJwCWJ5dGUgZXNwICsgNDgNCjsJcmV0dXJuIGFkZHJlc3MJYnl0ZSBlc3AgKyA1Mg0KZGVmbGF0ZXN0YXRlCWVxdSAgZXNwICsgNTYJOyB0aGUgZnVuY3Rpb24gYXJndW1lbnRzDQpjdXJtYXRjaAllcXUgIGVzcCArIDYwDQoNCjs7OyBPZmZzZXRzIGZvciBmaWVsZHMgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlLiBUaGVzZSBudW1iZXJzDQo7OzsgYXJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgZGVmaW5pdGlvbiBvZiBkZWZsYXRlX3N0YXRlLCB3aXRoIHRoZQ0KOzs7IGFzc3VtcHRpb24gdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBkd29yZC1hbGlnbiB0aGUgZmllbGRzLiAoVGh1cywNCjs7OyBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbiBvZiBkZWZsYXRlX3N0YXRlIGNvdWxkIGVhc2lseSBjYXVzZSB0aGlzDQo7OzsgcHJvZ3JhbSB0byBjcmFzaCBob3JyaWJseSwgd2l0aG91dCBzbyBtdWNoIGFzIGEgd2FybmluZyBhdA0KOzs7IGNvbXBpbGUgdGltZS4gU2lnaC4pDQoNCmRzV1NpemUJCWVxdSAzNg0KZHNXTWFzawkJZXF1IDQ0DQpkc1dpbmRvdwllcXUgNDgNCmRzUHJldgkJZXF1IDU2DQpkc01hdGNoTGVuCWVxdSA4OA0KZHNQcmV2TWF0Y2gJZXF1IDkyDQpkc1N0clN0YXJ0CWVxdSAxMDANCmRzTWF0Y2hTdGFydAllcXUgMTA0DQpkc0xvb2thaGVhZAllcXUgMTA4DQpkc1ByZXZMZW4JZXF1IDExMg0KZHNNYXhDaGFpbkxlbgllcXUgMTE2DQpkc0dvb2RNYXRjaAllcXUgMTMyDQpkc05pY2VNYXRjaAllcXUgMTM2DQoNCg0KOzs7IG1hdGNoLmFzbSAtLSBQZW50aXVtLVByby1vcHRpbWl6ZWQgdmVyc2lvbiBvZiBsb25nZXN0X21hdGNoKCkNCjs7OyBXcml0dGVuIGZvciB6bGliIDEuMS4yDQo7OzsgQ29weXJpZ2h0IChDKSAxOTk4IEJyaWFuIFJhaXRlciA8YnJlYWRib3hAbXVwcGV0bGFicy5jb20+DQo7OzsgWW91IGNhbiBsb29rIGF0IGh0dHA6Ly93d3cubXVwcGV0bGFicy5jb20vfmJyZWFkYm94L3NvZnR3YXJlL2Fzc2VtYmx5Lmh0bWwNCjs7Ow0KOzs7IFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdA0KOzs7IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuDQoNCjtHTE9CQUwJX2xvbmdlc3RfbWF0Y2gsIF9tYXRjaF9pbml0DQoNCg0KO1NFQ1RJT04JLnRleHQNCg0KOzs7IHVJbnQgbG9uZ2VzdF9tYXRjaChkZWZsYXRlX3N0YXRlICpkZWZsYXRlc3RhdGUsIElQb3MgY3VybWF0Y2gpDQoNCjtfbG9uZ2VzdF9tYXRjaDoNCklGREVGIE5PVU5ERVJMSU5FDQpsb25nZXN0X21hdGNoXzY4NiAgIHByb2MgbmVhcg0KRUxTRQ0KX2xvbmdlc3RfbWF0Y2hfNjg2ICBwcm9jIG5lYXINCkVORElGDQoNCg0KOzs7IFNhdmUgcmVnaXN0ZXJzIHRoYXQgdGhlIGNvbXBpbGVyIG1heSBiZSB1c2luZywgYW5kIGFkanVzdCBlc3AgdG8NCjs7OyBtYWtlIHJvb20gZm9yIG91ciBzdGFjayBmcmFtZS4NCg0KCQlwdXNoCWVicA0KCQlwdXNoCWVkaQ0KCQlwdXNoCWVzaQ0KCQlwdXNoCWVieA0KCQlzdWIJZXNwLCBMb2NhbFZhcnNTaXplDQoNCjs7OyBSZXRyaWV2ZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiBlY3ggd2lsbCBob2xkIGN1cl9tYXRjaA0KOzs7IHRocm91Z2hvdXQgdGhlIGVudGlyZSBmdW5jdGlvbi4gZWR4IHdpbGwgaG9sZCB0aGUgcG9pbnRlciB0byB0aGUNCjs7OyBkZWZsYXRlX3N0YXRlIHN0cnVjdHVyZSBkdXJpbmcgdGhlIGZ1bmN0aW9uJ3Mgc2V0dXAgKGJlZm9yZQ0KOzs7IGVudGVyaW5nIHRoZSBtYWluIGxvb3AuDQoNCgkJbW92CWVkeCwgW2RlZmxhdGVzdGF0ZV0NCgkJbW92CWVjeCwgW2N1cm1hdGNoXQ0KDQo7OzsgdUludCB3bWFzayA9IHMtPndfbWFzazsNCjs7OyB1bnNpZ25lZCBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoOw0KOzs7IGlmIChzLT5wcmV2X2xlbmd0aCA+PSBzLT5nb29kX21hdGNoKSB7DQo7OzsgICAgIGNoYWluX2xlbmd0aCA+Pj0gMjsNCjs7OyB9DQoNCgkJbW92CWVheCwgW2VkeCArIGRzUHJldkxlbl0NCgkJbW92CWVieCwgW2VkeCArIGRzR29vZE1hdGNoXQ0KCQljbXAJZWF4LCBlYngNCgkJbW92CWVheCwgW2VkeCArIGRzV01hc2tdDQoJCW1vdgllYngsIFtlZHggKyBkc01heENoYWluTGVuXQ0KCQlqbAlMYXN0TWF0Y2hHb29kDQoJCXNocgllYngsIDINCkxhc3RNYXRjaEdvb2Q6DQoNCjs7OyBjaGFpbmxlbiBpcyBkZWNyZW1lbnRlZCBvbmNlIGJlZm9yZWhhbmQgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuDQo7OzsgdXNlIHRoZSBzaWduIGZsYWcgaW5zdGVhZCBvZiB0aGUgemVybyBmbGFnIGZvciB0aGUgZXhpdCB0ZXN0Lg0KOzs7IEl0IGlzIHRoZW4gc2hpZnRlZCBpbnRvIHRoZSBoaWdoIHdvcmQsIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHdtYXNrDQo7OzsgdmFsdWUsIHdoaWNoIGl0IHdpbGwgYWx3YXlzIGFjY29tcGFueS4NCg0KCQlkZWMJZWJ4DQoJCXNobAllYngsIDE2DQoJCW9yCWVieCwgZWF4DQoJCW1vdglbY2hhaW5sZW53bWFza10sIGVieA0KDQo7OzsgaWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7DQoNCgkJbW92CWVheCwgW2VkeCArIGRzTmljZU1hdGNoXQ0KCQltb3YJZWJ4LCBbZWR4ICsgZHNMb29rYWhlYWRdDQoJCWNtcAllYngsIGVheA0KCQlqbAlMb29rYWhlYWRMZXNzDQoJCW1vdgllYngsIGVheA0KTG9va2FoZWFkTGVzczoJbW92CVtuaWNlbWF0Y2hdLCBlYngNCg0KOzs7IHJlZ2lzdGVyIEJ5dGVmICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7DQoNCgkJbW92CWVzaSwgW2VkeCArIGRzV2luZG93XQ0KCQltb3YJW3dpbmRvd10sIGVzaQ0KCQltb3YJZWJwLCBbZWR4ICsgZHNTdHJTdGFydF0NCgkJbGVhCWVkaSwgW2VzaSArIGVicF0NCgkJbW92CVtzY2FuXSwgZWRpDQoNCjs7OyBEZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgdGhlIHNjYW4gcHRyIGlzIG9mZiBmcm9tIGJlaW5nDQo7OzsgZHdvcmQtYWxpZ25lZC4NCg0KCQltb3YJZWF4LCBlZGkNCgkJbmVnCWVheA0KCQlhbmQJZWF4LCAzDQoJCW1vdglbc2NhbmFsaWduXSwgZWF4DQoNCjs7OyBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/DQo7OzsgICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7DQoNCgkJbW92CWVheCwgW2VkeCArIGRzV1NpemVdDQoJCXN1YgllYXgsIE1JTl9MT09LQUhFQUQNCgkJc3ViCWVicCwgZWF4DQoJCWpnCUxpbWl0UG9zaXRpdmUNCgkJeG9yCWVicCwgZWJwDQpMaW1pdFBvc2l0aXZlOg0KDQo7OzsgaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7DQoNCgkJbW92CWVheCwgW2VkeCArIGRzUHJldkxlbl0NCgkJbW92CVtiZXN0bGVuXSwgZWF4DQoNCjs7OyBTdG9yZSB0aGUgc3VtIG9mIHMtPndpbmRvdyArIGJlc3RfbGVuIGluIGVzaSBsb2NhbGx5LCBhbmQgaW4gZXNpLg0KDQoJCWFkZAllc2ksIGVheA0KCQltb3YJW3dpbmRvd2Jlc3RsZW5dLCBlc2kNCg0KOzs7IHJlZ2lzdGVyIHVzaCBzY2FuX3N0YXJ0ID0gKih1c2hmKilzY2FuOw0KOzs7IHJlZ2lzdGVyIHVzaCBzY2FuX2VuZCAgID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsNCjs7OyBQb3NmICpwcmV2ID0gcy0+cHJldjsNCg0KCQltb3Z6eAllYngsIHdvcmQgcHRyIFtlZGldDQoJCW1vdglbc2NhbnN0YXJ0XSwgZWJ4DQoJCW1vdnp4CWVieCwgd29yZCBwdHIgW2VkaSArIGVheCAtIDFdDQoJCW1vdglbc2NhbmVuZF0sIGVieA0KCQltb3YJZWRpLCBbZWR4ICsgZHNQcmV2XQ0KDQo7OzsgSnVtcCBpbnRvIHRoZSBtYWluIGxvb3AuDQoNCgkJbW92CWVkeCwgW2NoYWlubGVud21hc2tdDQoJCWptcAlzaG9ydCBMb29wRW50cnkNCg0KYWxpZ24gNA0KDQo7OzsgZG8gew0KOzs7ICAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsNCjs7OyAgICAgaWYgKCoodXNoZiopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8DQo7OzsgICAgICAgICAqKHVzaGYqKW1hdGNoICE9IHNjYW5fc3RhcnQpIGNvbnRpbnVlOw0KOzs7ICAgICBbLi4uXQ0KOzs7IH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdA0KOzs7ICAgICAgICAgICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOw0KOzs7DQo7OzsgSGVyZSBpcyB0aGUgaW5uZXIgbG9vcCBvZiB0aGUgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiB3aWxsIHNwZW5kIHRoZQ0KOzs7IG1ham9yaXR5IG9mIGl0cyB0aW1lIGluIHRoaXMgbG9vcCwgYW5kIG1ham9yaXR5IG9mIHRoYXQgdGltZSB3aWxsDQo7OzsgYmUgc3BlbnQgaW4gdGhlIGZpcnN0IHRlbiBpbnN0cnVjdGlvbnMuDQo7OzsNCjs7OyBXaXRoaW4gdGhpcyBsb29wOg0KOzs7IGVieCA9IHNjYW5lbmQNCjs7OyBlY3ggPSBjdXJtYXRjaA0KOzs7IGVkeCA9IGNoYWlubGVud21hc2sgLSBpLmUuLCAoKGNoYWlubGVuIDw8IDE2KSB8IHdtYXNrKQ0KOzs7IGVzaSA9IHdpbmRvd2Jlc3RsZW4gLSBpLmUuLCAod2luZG93ICsgYmVzdGxlbikNCjs7OyBlZGkgPSBwcmV2DQo7OzsgZWJwID0gbGltaXQNCg0KTG9va3VwTG9vcDoNCgkJYW5kCWVjeCwgZWR4DQoJCW1vdnp4CWVjeCwgd29yZCBwdHIgW2VkaSArIGVjeCoyXQ0KCQljbXAJZWN4LCBlYnANCgkJamJlCUxlYXZlTm93DQoJCXN1YgllZHgsIDAwMDEwMDAwaA0KCQlqcwlMZWF2ZU5vdw0KTG9vcEVudHJ5Ogltb3Z6eAllYXgsIHdvcmQgcHRyIFtlc2kgKyBlY3ggLSAxXQ0KCQljbXAJZWF4LCBlYngNCgkJam56CUxvb2t1cExvb3ANCgkJbW92CWVheCwgW3dpbmRvd10NCgkJbW92engJZWF4LCB3b3JkIHB0ciBbZWF4ICsgZWN4XQ0KCQljbXAJZWF4LCBbc2NhbnN0YXJ0XQ0KCQlqbnoJTG9va3VwTG9vcA0KDQo7OzsgU3RvcmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgY2hhaW5sZW4uDQoNCgkJbW92CVtjaGFpbmxlbndtYXNrXSwgZWR4DQoNCjs7OyBQb2ludCBlZGkgdG8gdGhlIHN0cmluZyB1bmRlciBzY3J1dGlueSwgYW5kIGVzaSB0byB0aGUgc3RyaW5nIHdlDQo7OzsgYXJlIGhvcGluZyB0byBtYXRjaCBpdCB1cCB3aXRoLiBJbiBhY3R1YWxpdHksIGVzaSBhbmQgZWRpIGFyZQ0KOzs7IGJvdGggcG9pbnRlZCAoTUFYX01BVENIXzggLSBzY2FuYWxpZ24pIGJ5dGVzIGFoZWFkLCBhbmQgZWR4IGlzDQo7OzsgaW5pdGlhbGl6ZWQgdG8gLShNQVhfTUFUQ0hfOCAtIHNjYW5hbGlnbikuDQoNCgkJbW92CWVzaSwgW3dpbmRvd10NCgkJbW92CWVkaSwgW3NjYW5dDQoJCWFkZAllc2ksIGVjeA0KCQltb3YJZWF4LCBbc2NhbmFsaWduXQ0KCQltb3YJZWR4LCAwZmZmZmZlZjhoOyAtKE1BWF9NQVRDSF84KQ0KCQlsZWEJZWRpLCBbZWRpICsgZWF4ICsgMDEwOGhdIDtNQVhfTUFUQ0hfOF0NCgkJbGVhCWVzaSwgW2VzaSArIGVheCArIDAxMDhoXSA7TUFYX01BVENIXzhdDQoNCjs7OyBUZXN0IHRoZSBzdHJpbmdzIGZvciBlcXVhbGl0eSwgOCBieXRlcyBhdCBhIHRpbWUuIEF0IHRoZSBlbmQsDQo7OzsgYWRqdXN0IGVkeCBzbyB0aGF0IGl0IGlzIG9mZnNldCB0byB0aGUgZXhhY3QgYnl0ZSB0aGF0IG1pc21hdGNoZWQuDQo7OzsNCjs7OyBXZSBhbHJlYWR5IGtub3cgYXQgdGhpcyBwb2ludCB0aGF0IHRoZSBmaXJzdCB0aHJlZSBieXRlcyBvZiB0aGUNCjs7OyBzdHJpbmdzIG1hdGNoIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhbiBiZSBzYWZlbHkgcGFzc2VkIG92ZXIgYmVmb3JlDQo7Ozsgc3RhcnRpbmcgdGhlIGNvbXBhcmUgbG9vcC4gU28gd2hhdCB0aGlzIGNvZGUgZG9lcyBpcyBza2lwIG92ZXIgMC0zDQo7OzsgYnl0ZXMsIGFzIG11Y2ggYXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGR3b3JkLWFsaWduIHRoZSBlZGkNCjs7OyBwb2ludGVyLiAoZXNpIHdpbGwgc3RpbGwgYmUgbWlzYWxpZ25lZCB0aHJlZSB0aW1lcyBvdXQgb2YgZm91ci4pDQo7OzsNCjs7OyBJdCBzaG91bGQgYmUgY29uZmVzc2VkIHRoYXQgdGhpcyBsb29wIHVzdWFsbHkgZG9lcyBub3QgcmVwcmVzZW50DQo7OzsgbXVjaCBvZiB0aGUgdG90YWwgcnVubmluZyB0aW1lLiBSZXBsYWNpbmcgaXQgd2l0aCBhIG1vcmUNCjs7OyBzdHJhaWdodGZvcndhcmQgInJlcCBjbXBzYiIgd291bGQgbm90IGRyYXN0aWNhbGx5IGRlZ3JhZGUNCjs7OyBwZXJmb3JtYW5jZS4NCg0KTG9vcENtcHM6DQoJCW1vdgllYXgsIFtlc2kgKyBlZHhdDQoJCXhvcgllYXgsIFtlZGkgKyBlZHhdDQoJCWpueglMZWF2ZUxvb3BDbXBzDQoJCW1vdgllYXgsIFtlc2kgKyBlZHggKyA0XQ0KCQl4b3IJZWF4LCBbZWRpICsgZWR4ICsgNF0NCgkJam56CUxlYXZlTG9vcENtcHM0DQoJCWFkZAllZHgsIDgNCgkJam56CUxvb3BDbXBzDQoJCWptcAlzaG9ydCBMZW5NYXhpbXVtDQpMZWF2ZUxvb3BDbXBzNDoJYWRkCWVkeCwgNA0KTGVhdmVMb29wQ21wczoJdGVzdAllYXgsIDAwMDBGRkZGaA0KCQlqbnoJTGVuTG93ZXINCgkJYWRkCWVkeCwgIDINCgkJc2hyCWVheCwgMTYNCkxlbkxvd2VyOglzdWIJYWwsIDENCgkJYWRjCWVkeCwgMA0KDQo7OzsgQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoLiBJZiBpdCBpcyBsb25nZXIgdGhhbiBNQVhfTUFUQ0gsDQo7OzsgdGhlbiBhdXRvbWF0aWNhbGx5IGFjY2VwdCBpdCBhcyB0aGUgYmVzdCBwb3NzaWJsZSBtYXRjaCBhbmQgbGVhdmUuDQoNCgkJbGVhCWVheCwgW2VkaSArIGVkeF0NCgkJbW92CWVkaSwgW3NjYW5dDQoJCXN1YgllYXgsIGVkaQ0KCQljbXAJZWF4LCBNQVhfTUFUQ0gNCgkJamdlCUxlbk1heGltdW0NCg0KOzs7IElmIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIG5vdCBsb25nZXIgdGhhbiB0aGUgYmVzdCBtYXRjaCB3ZQ0KOzs7IGhhdmUgc28gZmFyLCB0aGVuIGZvcmdldCBpdCBhbmQgcmV0dXJuIHRvIHRoZSBsb29rdXAgbG9vcC4NCg0KCQltb3YJZWR4LCBbZGVmbGF0ZXN0YXRlXQ0KCQltb3YJZWJ4LCBbYmVzdGxlbl0NCgkJY21wCWVheCwgZWJ4DQoJCWpnCUxvbmdlck1hdGNoDQoJCW1vdgllc2ksIFt3aW5kb3diZXN0bGVuXQ0KCQltb3YJZWRpLCBbZWR4ICsgZHNQcmV2XQ0KCQltb3YJZWJ4LCBbc2NhbmVuZF0NCgkJbW92CWVkeCwgW2NoYWlubGVud21hc2tdDQoJCWptcAlMb29rdXBMb29wDQoNCjs7OyAgICAgICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOw0KOzs7ICAgICAgICAgYmVzdF9sZW4gPSBsZW47DQo7OzsgICAgICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIGJyZWFrOw0KOzs7ICAgICAgICAgc2Nhbl9lbmQgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOw0KDQpMb25nZXJNYXRjaDoJbW92CWVieCwgW25pY2VtYXRjaF0NCgkJbW92CVtiZXN0bGVuXSwgZWF4DQoJCW1vdglbZWR4ICsgZHNNYXRjaFN0YXJ0XSwgZWN4DQoJCWNtcAllYXgsIGVieA0KCQlqZ2UJTGVhdmVOb3cNCgkJbW92CWVzaSwgW3dpbmRvd10NCgkJYWRkCWVzaSwgZWF4DQoJCW1vdglbd2luZG93YmVzdGxlbl0sIGVzaQ0KCQltb3Z6eAllYngsIHdvcmQgcHRyIFtlZGkgKyBlYXggLSAxXQ0KCQltb3YJZWRpLCBbZWR4ICsgZHNQcmV2XQ0KCQltb3YJW3NjYW5lbmRdLCBlYngNCgkJbW92CWVkeCwgW2NoYWlubGVud21hc2tdDQoJCWptcAlMb29rdXBMb29wDQoNCjs7OyBBY2NlcHQgdGhlIGN1cnJlbnQgc3RyaW5nLCB3aXRoIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGxlbmd0aC4NCg0KTGVuTWF4aW11bToJbW92CWVkeCwgW2RlZmxhdGVzdGF0ZV0NCgkJbW92CWR3b3JkIHB0ciBbYmVzdGxlbl0sIE1BWF9NQVRDSA0KCQltb3YJW2VkeCArIGRzTWF0Y2hTdGFydF0sIGVjeA0KDQo7OzsgaWYgKCh1SW50KWJlc3RfbGVuIDw9IHMtPmxvb2thaGVhZCkgcmV0dXJuICh1SW50KWJlc3RfbGVuOw0KOzs7IHJldHVybiBzLT5sb29rYWhlYWQ7DQoNCkxlYXZlTm93Og0KCQltb3YJZWR4LCBbZGVmbGF0ZXN0YXRlXQ0KCQltb3YJZWJ4LCBbYmVzdGxlbl0NCgkJbW92CWVheCwgW2VkeCArIGRzTG9va2FoZWFkXQ0KCQljbXAJZWJ4LCBlYXgNCgkJamcJTG9va2FoZWFkUmV0DQoJCW1vdgllYXgsIGVieA0KTG9va2FoZWFkUmV0Og0KDQo7OzsgUmVzdG9yZSB0aGUgc3RhY2sgYW5kIHJldHVybiBmcm9tIHdoZW5jZSB3ZSBjYW1lLg0KDQoJCWFkZAllc3AsIExvY2FsVmFyc1NpemUNCgkJcG9wCWVieA0KCQlwb3AJZXNpDQoJCXBvcAllZGkNCgkJcG9wCWVicA0KDQoJCXJldA0KOyBwbGVhc2UgZG9uJ3QgcmVtb3ZlIHRoaXMgc3RyaW5nICENCjsgWW91ciBhcmUgZnJlZSB1c2UgZ3ZtYXQzMiBpbiBhbnkgZnJlIG9yIGNvbW1lcmNpYWwgYXBwcyBpZiB5b3UgZG9uJ3QgcmVtb3ZlIHRoZSBzdHJpbmcgaW4gdGhlIGJpbmFyeSENCiAgICAgICAgZGIgICAgIDBkaCwwYWgsImFzbTY4NiB3aXRoIG1hc20sIGNvZGUgb3B0aW1pc2VkIGFzc2VtYmx5IGNvZGUgZnJvbSBCcmlhbiBSYWl0ZXIsIHdyaXR0ZW4gMTk5OCIsMGRoLDBhaA0KDQpJRkRFRiBOT1VOREVSTElORQ0KbG9uZ2VzdF9tYXRjaF82ODYgICBlbmRwDQpFTFNFDQpfbG9uZ2VzdF9tYXRjaF82ODYgIGVuZHANCkVORElGDQoNCl9URVhUICAgZW5kcw0KZW5kDQo=