IyBkZHNfd3JpdGVyLnB5CiMKIyBNaW5pbWFsIEREUyB3cml0ZXIgdGhhdCBtaXJyb3JzIHRoZSBDL0MrKyBzYXZlX2RkcygpIGltcGxlbWVudGF0aW9uIHlvdSBwcm92aWRlZC4KIyBJdCB3cml0ZXMgYSBEWDktc3R5bGUgRERTIGhlYWRlciwgYW5kIG9wdGlvbmFsbHkgYSBEWDEwIGV4dGVuc2lvbiBoZWFkZXIsCiMgZm9sbG93ZWQgYnkgdGhlIHJhdyBjb21wcmVzc2VkIGJsb2Nrcy4KIwojIE5vIG1pcG1hcHMsIG5vIGN1YmVzLCBubyAzRCB2b2x1bWVzIJYgZXhhY3RseSBsaWtlIHRoZSBvcmlnaW5hbCBDIGNvZGUuCgppbXBvcnQgc3RydWN0CmltcG9ydCBzeXMKZnJvbSB0eXBpbmcgaW1wb3J0IFVuaW9uCgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBGb3VyQ0MgaGVscGVyIChzYW1lIGFzIFBJWEVMX0ZNVF9GT1VSQ0MgbWFjcm8pCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRlZiBtYWtlX2ZvdXJjYyhhOiBzdHIsIGI6IHN0ciwgYzogc3RyLCBkOiBzdHIpIC0+IGludDoKICAgIHJldHVybiAob3JkKGEpIHwKICAgICAgICAgICAgKG9yZChiKSA8PCA4KSB8CiAgICAgICAgICAgIChvcmQoYykgPDwgMTYpIHwKICAgICAgICAgICAgKG9yZChkKSA8PCAyNCkpCgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBERFMtcmVsYXRlZCBjb25zdGFudHMgKG9ubHkgdGhlIG9uZXMgd2UgYWN0dWFsbHkgdXNlKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBERFNEIGZsYWdzCkREU0RfQ0FQUyAgICAgICA9IDB4MDAwMDAwMDEKRERTRF9IRUlHSFQgICAgID0gMHgwMDAwMDAwMgpERFNEX1dJRFRIICAgICAgPSAweDAwMDAwMDA0CkREU0RfUElYRUxGT1JNQVQ9IDB4MDAwMDEwMDAKRERTRF9MSU5FQVJTSVpFID0gMHgwMDA4MDAwMAoKIyBERFBGIGZsYWdzCkREUEZfRk9VUkNDICAgICA9IDB4MDAwMDAwMDQKCiMgRERTQ0FQUyBmbGFncwpERFNDQVBTX1RFWFRVUkUgPSAweDAwMDAxMDAwCgojIERYR0lfRk9STUFUIHN1YnNldCAodmFsdWVzIG11c3QgbWF0Y2ggdGhlIEMgZW51bSkKY2xhc3MgRFhHSV9GT1JNQVQ6CiAgICBVTktOT1dOICAgICAgICA9IDAKICAgIEJDMV9VTk9STSAgICAgID0gNzEKICAgIEJDM19VTk9STSAgICAgID0gNzcKICAgIEJDNF9VTk9STSAgICAgID0gODAKICAgIEJDNV9VTk9STSAgICAgID0gODMKICAgICMgWW91IGNhbiBhZGQgbW9yZSBhcyBuZWVkZWQ7IGZvciBEWDEwIGhlYWRlciB3ZSBqdXN0IHdyaXRlIHRoZSBpbnRlZ2VyIHZhbHVlLgoKIyBEWDEwIHJlc291cmNlIGRpbWVuc2lvbgpjbGFzcyBEM0QxMF9SRVNPVVJDRV9ESU1FTlNJT046CiAgICBVTktOT1dOICAgPSAwCiAgICBCVUZGRVIgICAgPSAxCiAgICBURVhUVVJFMUQgPSAyCiAgICBURVhUVVJFMkQgPSAzCiAgICBURVhUVVJFM0QgPSA0CgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBERFMgd3JpdGVyIGNsYXNzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmNsYXNzIEREU1dyaXRlcjoKICAgICIiIgogICAgUHl0aG9uIHBvcnQgb2YgdGhlIEMgc2F2ZV9kZHMoKSBmdW5jdGlvbi4KCiAgICBVc2FnZToKICAgICAgICB3cml0ZXIgPSBERFNXcml0ZXIoKQogICAgICAgIG9rID0gd3JpdGVyLnNhdmVfZGRzKAogICAgICAgICAgICBmaWxlbmFtZT0ib3V0LmRkcyIsCiAgICAgICAgICAgIHdpZHRoPXdpZHRoLAogICAgICAgICAgICBoZWlnaHQ9aGVpZ2h0LAogICAgICAgICAgICBibG9ja3M9YmNfZGF0YSwgICAgICAgICAgICAgICMgYnl0ZXMgb3IgYnl0ZWFycmF5CiAgICAgICAgICAgIHBpeGVsX2Zvcm1hdF9icHA9NCwgICAgICAgICAgIyBlLmcuIDQgZm9yIEJDMSwgOCBmb3IgQkMzLzQvNS9ldGMuCiAgICAgICAgICAgIGR4Z2lfZm9ybWF0PURYR0lfRk9STUFULkJDMV9VTk9STSwKICAgICAgICAgICAgc3JnYj1GYWxzZSwKICAgICAgICAgICAgZm9yY2VfZHgxMF9oZWFkZXI9RmFsc2UsCiAgICAgICAgKQogICAgIiIiCgogICAgRERTX01BR0lDID0gYiJERFMgIiAgICAgICAjIHNhbWUgYXMgZndyaXRlKCJERFMgIiwgNCwgMSwgcEZpbGUpOwoKICAgIGRlZiBzYXZlX2RkcygKICAgICAgICBzZWxmLAogICAgICAgIGZpbGVuYW1lOiBzdHIsCiAgICAgICAgd2lkdGg6IGludCwKICAgICAgICBoZWlnaHQ6IGludCwKICAgICAgICBibG9ja3M6IFVuaW9uW2J5dGVzLCBieXRlYXJyYXksIG1lbW9yeXZpZXddLAogICAgICAgIHBpeGVsX2Zvcm1hdF9icHA6IGludCwKICAgICAgICBkeGdpX2Zvcm1hdDogaW50LAogICAgICAgIHNyZ2I6IGJvb2wgPSBGYWxzZSwKICAgICAgICBmb3JjZV9keDEwX2hlYWRlcjogYm9vbCA9IEZhbHNlLAogICAgKSAtPiBib29sOgogICAgICAgICIiIgogICAgICAgIFBvcnQgb2Y6CiAgICAgICAgICAgIGJvb2wgc2F2ZV9kZHMoY29uc3QgY2hhciogcEZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogcEJsb2NrcywKICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwaXhlbF9mb3JtYXRfYnBwLAogICAgICAgICAgICAgICAgICAgICAgICAgIERYR0lfRk9STUFUIGR4Z2lfZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3JnYiwKICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlX2R4MTBfaGVhZGVyKTsKCiAgICAgICAgVGhlICdibG9ja3MnIGJ1ZmZlciBpcyB3cml0dGVuIGFzLWlzICh1cCB0byBjb21wdXRlZCBsaW5lYXIgc2l6ZSkuCiAgICAgICAgIiIiCgogICAgICAgICMgc3JnYiBpcyBpbnRlbnRpb25hbGx5IHVudXNlZCBpbiB0aGUgb3JpZ2luYWwgQyBjb2RlIChjb21tZW50ZWQgbG9naWMpLgogICAgICAgIF8gPSBzcmdiCgogICAgICAgICMgT3BlbiBmaWxlIGxpa2UgdGhlIEMgY29kZQogICAgICAgIHRyeToKICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICJ3YiIpCiAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgIHByaW50KGYiRmFpbGVkIGNyZWF0aW5nIGZpbGUge2ZpbGVuYW1lfSEiLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgV3JpdGUgdGhlICJERFMgIiBtYWdpYwogICAgICAgICAgICBmLndyaXRlKHNlbGYuRERTX01BR0lDKQoKICAgICAgICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAjIEJ1aWxkIEREU1VSRkFDRURFU0MyIGVxdWl2YWxlbnQKICAgICAgICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAjIFdlJ2xsIHBhY2sgRERTVVJGQUNFREVTQzIgYXMgMzEgdWludDMyJ3MgKDEyNCBieXRlcykgaW4gbGl0dGxlLWVuZGlhbjoKICAgICAgICAgICAgIyBzdHJ1Y3QgRERTVVJGQUNFREVTQzIgewogICAgICAgICAgICAjICAgdWludDMyIGR3U2l6ZTsKICAgICAgICAgICAgIyAgIHVpbnQzMiBkd0ZsYWdzOwogICAgICAgICAgICAjICAgdWludDMyIGR3SGVpZ2h0OwogICAgICAgICAgICAjICAgdWludDMyIGR3V2lkdGg7CiAgICAgICAgICAgICMgICB1aW50MzIgbFBpdGNoX29yX2R3TGluZWFyU2l6ZTsKICAgICAgICAgICAgIyAgIHVpbnQzMiBkd0JhY2tCdWZmZXJDb3VudDsKICAgICAgICAgICAgIyAgIHVpbnQzMiBkd01pcE1hcENvdW50OwogICAgICAgICAgICAjICAgdWludDMyIGR3QWxwaGFCaXREZXB0aDsKICAgICAgICAgICAgIyAgIHVpbnQzMiBkd1VudXNlZDA7CiAgICAgICAgICAgICMgICB1aW50MzIgbHBTdXJmYWNlOwogICAgICAgICAgICAjICAgRERDT0xPUktFWSB1bnVzZWQwOyAgKDIgKiB1aW50MzIpCiAgICAgICAgICAgICMgICBERENPTE9SS0VZIHVudXNlZDE7ICAoMiAqIHVpbnQzMikKICAgICAgICAgICAgIyAgIEREQ09MT1JLRVkgdW51c2VkMjsgICgyICogdWludDMyKQogICAgICAgICAgICAjICAgRERDT0xPUktFWSB1bnVzZWQzOyAgKDIgKiB1aW50MzIpCiAgICAgICAgICAgICMgICBERFBJWEVMRk9STUFUIGRkcGZQaXhlbEZvcm1hdDsgKDggKiB1aW50MzIpCiAgICAgICAgICAgICMgICBERFNDQVBTMiBkZHNDYXBzOyAoNCAqIHVpbnQzMikKICAgICAgICAgICAgIyAgIHVpbnQzMiBkd1VudXNlZDE7CiAgICAgICAgICAgICMgfTsKCiAgICAgICAgICAgIGR3U2l6ZSA9IDEyNCAgIyBzaXplb2YoRERTVVJGQUNFREVTQzIpCgogICAgICAgICAgICBkd0ZsYWdzID0gKAogICAgICAgICAgICAgICAgRERTRF9XSURUSCB8CiAgICAgICAgICAgICAgICBERFNEX0hFSUdIVCB8CiAgICAgICAgICAgICAgICBERFNEX1BJWEVMRk9STUFUIHwKICAgICAgICAgICAgICAgIEREU0RfQ0FQUwogICAgICAgICAgICApCgogICAgICAgICAgICBkd1dpZHRoID0gaW50KHdpZHRoKQogICAgICAgICAgICBkd0hlaWdodCA9IGludChoZWlnaHQpCgogICAgICAgICAgICAjIGxQaXRjaCAoYWN0dWFsbHkgTGluZWFyU2l6ZSBmb3IgY29tcHJlc3NlZCBmb3JtYXRzKSwgc2FtZSBhczoKICAgICAgICAgICAgIyAoKChkd1dpZHRoICsgMykgJiB+MykgKiAoKGR3SGVpZ2h0ICsgMykgJiB+MykgKiBwaXhlbF9mb3JtYXRfYnBwKSA+PiAzOwogICAgICAgICAgICBsUGl0Y2ggPSAoCiAgICAgICAgICAgICAgICAoKGR3V2lkdGggKyAzKSAmIH4zKQogICAgICAgICAgICAgICAgKiAoKGR3SGVpZ2h0ICsgMykgJiB+MykKICAgICAgICAgICAgICAgICogaW50KHBpeGVsX2Zvcm1hdF9icHApCiAgICAgICAgICAgICkgPj4gMwoKICAgICAgICAgICAgZHdGbGFncyB8PSBERFNEX0xJTkVBUlNJWkUKCiAgICAgICAgICAgIGR3QmFja0J1ZmZlckNvdW50ID0gMAogICAgICAgICAgICBkd01pcE1hcENvdW50ID0gMAogICAgICAgICAgICBkd0FscGhhQml0RGVwdGggPSAwCiAgICAgICAgICAgIGR3VW51c2VkMCA9IDAKICAgICAgICAgICAgbHBTdXJmYWNlID0gMAoKICAgICAgICAgICAgIyBERENPTE9SS0VZIHVudXNlZDAuLjMsIGFsbCB6ZXJvCiAgICAgICAgICAgIGRkY29sb3JrZXlfemVybyA9IFswLCAwXSAqIDQgICMgNCBERENPTE9SS0VZIHN0cnVjdHMKCiAgICAgICAgICAgICMgRERQSVhFTEZPUk1BVAogICAgICAgICAgICAjIHN0cnVjdCBERFBJWEVMRk9STUFUIHsKICAgICAgICAgICAgIyAgIHVpbnQzMiBkd1NpemU7CiAgICAgICAgICAgICMgICB1aW50MzIgZHdGbGFnczsKICAgICAgICAgICAgIyAgIHVpbnQzMiBkd0ZvdXJDQzsKICAgICAgICAgICAgIyAgIHVpbnQzMiBkd1JHQkJpdENvdW50OwogICAgICAgICAgICAjICAgdWludDMyIGR3UkJpdE1hc2s7CiAgICAgICAgICAgICMgICB1aW50MzIgZHdHQml0TWFzazsKICAgICAgICAgICAgIyAgIHVpbnQzMiBkd0JCaXRNYXNrOwogICAgICAgICAgICAjICAgdWludDMyIGR3UkdCQWxwaGFCaXRNYXNrOwogICAgICAgICAgICAjIH07CiAgICAgICAgICAgIGRkcGZfZHdTaXplID0gMzIKICAgICAgICAgICAgZGRwZl9kd0ZsYWdzID0gRERQRl9GT1VSQ0MKICAgICAgICAgICAgZGRwZl9kd0ZvdXJDQyA9IDAKICAgICAgICAgICAgZGRwZl9kd1JHQkJpdENvdW50ID0gMAogICAgICAgICAgICBkZHBmX2R3UkJpdE1hc2sgPSAwCiAgICAgICAgICAgIGRkcGZfZHdHQml0TWFzayA9IDAKICAgICAgICAgICAgZGRwZl9kd0JCaXRNYXNrID0gMAogICAgICAgICAgICBkZHBmX2R3UkdCQWxwaGFCaXRNYXNrID0gMAoKICAgICAgICAgICAgIyBERFNDQVBTMgogICAgICAgICAgICAjIHN0cnVjdCBERFNDQVBTMiB7CiAgICAgICAgICAgICMgICB1aW50MzIgZHdDYXBzOwogICAgICAgICAgICAjICAgdWludDMyIGR3Q2FwczI7CiAgICAgICAgICAgICMgICB1aW50MzIgZHdDYXBzMzsKICAgICAgICAgICAgIyAgIHVpbnQzMiBkd0NhcHM0OwogICAgICAgICAgICAjIH07CiAgICAgICAgICAgIGRkc0NhcHNfZHdDYXBzID0gRERTQ0FQU19URVhUVVJFCiAgICAgICAgICAgIGRkc0NhcHNfZHdDYXBzMiA9IDAKICAgICAgICAgICAgZGRzQ2Fwc19kd0NhcHMzID0gMAogICAgICAgICAgICBkZHNDYXBzX2R3Q2FwczQgPSAwCgogICAgICAgICAgICBkd1VudXNlZDEgPSAwCgogICAgICAgICAgICAjIERlY2lkZSB3aGV0aGVyIHRvIHVzZSBsZWdhY3kgRm91ckNDIChEWFQxL0RYVDUvQVRJMS9BVEkyKSBvciBEWDEwIGhlYWRlcgogICAgICAgICAgICB1c2VfbGVnYWN5ID0gKAogICAgICAgICAgICAgICAgbm90IGZvcmNlX2R4MTBfaGVhZGVyIGFuZAogICAgICAgICAgICAgICAgZHhnaV9mb3JtYXQgaW4gKAogICAgICAgICAgICAgICAgICAgIERYR0lfRk9STUFULkJDMV9VTk9STSwKICAgICAgICAgICAgICAgICAgICBEWEdJX0ZPUk1BVC5CQzNfVU5PUk0sCiAgICAgICAgICAgICAgICAgICAgRFhHSV9GT1JNQVQuQkM0X1VOT1JNLAogICAgICAgICAgICAgICAgICAgIERYR0lfRk9STUFULkJDNV9VTk9STSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgdXNlX2xlZ2FjeToKICAgICAgICAgICAgICAgIGlmIGR4Z2lfZm9ybWF0ID09IERYR0lfRk9STUFULkJDMV9VTk9STToKICAgICAgICAgICAgICAgICAgICBkZHBmX2R3Rm91ckNDID0gbWFrZV9mb3VyY2MoJ0QnLCAnWCcsICdUJywgJzEnKQogICAgICAgICAgICAgICAgZWxpZiBkeGdpX2Zvcm1hdCA9PSBEWEdJX0ZPUk1BVC5CQzNfVU5PUk06CiAgICAgICAgICAgICAgICAgICAgZGRwZl9kd0ZvdXJDQyA9IG1ha2VfZm91cmNjKCdEJywgJ1gnLCAnVCcsICc1JykKICAgICAgICAgICAgICAgIGVsaWYgZHhnaV9mb3JtYXQgPT0gRFhHSV9GT1JNQVQuQkM0X1VOT1JNOgogICAgICAgICAgICAgICAgICAgIGRkcGZfZHdGb3VyQ0MgPSBtYWtlX2ZvdXJjYygnQScsICdUJywgJ0knLCAnMScpCiAgICAgICAgICAgICAgICBlbGlmIGR4Z2lfZm9ybWF0ID09IERYR0lfRk9STUFULkJDNV9VTk9STToKICAgICAgICAgICAgICAgICAgICBkZHBmX2R3Rm91ckNDID0gbWFrZV9mb3VyY2MoJ0EnLCAnVCcsICdJJywgJzInKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBXcml0ZSBEWDEwIGhlYWRlciwgRm91ckNDID0gIkRYMTAiCiAgICAgICAgICAgICAgICBkZHBmX2R3Rm91ckNDID0gbWFrZV9mb3VyY2MoJ0QnLCAnWCcsICcxJywgJzAnKQoKICAgICAgICAgICAgIyBCdWlsZCB0aGUgMzEgdWludDMyJ3MgZm9yIEREU1VSRkFDRURFU0MyCiAgICAgICAgICAgIGhlYWRlcl92YWx1ZXMgPSBbCiAgICAgICAgICAgICAgICBkd1NpemUsCiAgICAgICAgICAgICAgICBkd0ZsYWdzLAogICAgICAgICAgICAgICAgZHdIZWlnaHQsCiAgICAgICAgICAgICAgICBkd1dpZHRoLAogICAgICAgICAgICAgICAgbFBpdGNoLAogICAgICAgICAgICAgICAgZHdCYWNrQnVmZmVyQ291bnQsCiAgICAgICAgICAgICAgICBkd01pcE1hcENvdW50LAogICAgICAgICAgICAgICAgZHdBbHBoYUJpdERlcHRoLAogICAgICAgICAgICAgICAgZHdVbnVzZWQwLAogICAgICAgICAgICAgICAgbHBTdXJmYWNlLAogICAgICAgICAgICBdCgogICAgICAgICAgICBoZWFkZXJfdmFsdWVzLmV4dGVuZChkZGNvbG9ya2V5X3plcm8pICAjIDggdWludDMyJ3MKCiAgICAgICAgICAgIGRkcGZfdmFsdWVzID0gWwogICAgICAgICAgICAgICAgZGRwZl9kd1NpemUsCiAgICAgICAgICAgICAgICBkZHBmX2R3RmxhZ3MsCiAgICAgICAgICAgICAgICBkZHBmX2R3Rm91ckNDLAogICAgICAgICAgICAgICAgZGRwZl9kd1JHQkJpdENvdW50LAogICAgICAgICAgICAgICAgZGRwZl9kd1JCaXRNYXNrLAogICAgICAgICAgICAgICAgZGRwZl9kd0dCaXRNYXNrLAogICAgICAgICAgICAgICAgZGRwZl9kd0JCaXRNYXNrLAogICAgICAgICAgICAgICAgZGRwZl9kd1JHQkFscGhhQml0TWFzaywKICAgICAgICAgICAgXQogICAgICAgICAgICBoZWFkZXJfdmFsdWVzLmV4dGVuZChkZHBmX3ZhbHVlcykgICMgOCB1aW50MzIncwoKICAgICAgICAgICAgZGRzQ2Fwc192YWx1ZXMgPSBbCiAgICAgICAgICAgICAgICBkZHNDYXBzX2R3Q2FwcywKICAgICAgICAgICAgICAgIGRkc0NhcHNfZHdDYXBzMiwKICAgICAgICAgICAgICAgIGRkc0NhcHNfZHdDYXBzMywKICAgICAgICAgICAgICAgIGRkc0NhcHNfZHdDYXBzNCwKICAgICAgICAgICAgXQogICAgICAgICAgICBoZWFkZXJfdmFsdWVzLmV4dGVuZChkZHNDYXBzX3ZhbHVlcykgICMgNCB1aW50MzIncwoKICAgICAgICAgICAgaGVhZGVyX3ZhbHVlcy5hcHBlbmQoZHdVbnVzZWQxKSAgIyBmaW5hbCB1aW50MzIKCiAgICAgICAgICAgIGlmIGxlbihoZWFkZXJfdmFsdWVzKSAhPSAzMToKICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiSW50ZXJuYWwgZXJyb3I6IEREU1VSRkFDRURFU0MyIG11c3QgY29udGFpbiAzMSB1aW50MzIncyIpCgogICAgICAgICAgICAjIFBhY2sgYW5kIHdyaXRlIEREU1VSRkFDRURFU0MyCiAgICAgICAgICAgIGRkc19oZWFkZXIgPSBzdHJ1Y3QucGFjaygiPDMxSSIsICpoZWFkZXJfdmFsdWVzKQogICAgICAgICAgICBmLndyaXRlKGRkc19oZWFkZXIpCgogICAgICAgICAgICAjIElmIG5lZWRlZCwgd3JpdGUgdGhlIERYMTAgaGVhZGVyIChERFNfSEVBREVSX0RYVDEwKQogICAgICAgICAgICBpZiBub3QgdXNlX2xlZ2FjeToKICAgICAgICAgICAgICAgICMgc3RydWN0IEREU19IRUFERVJfRFhUMTAgewogICAgICAgICAgICAgICAgIyAgIERYR0lfRk9STUFUICAgICAgICAgICAgICBkeGdpRm9ybWF0OwogICAgICAgICAgICAgICAgIyAgIEQzRDEwX1JFU09VUkNFX0RJTUVOU0lPTiByZXNvdXJjZURpbWVuc2lvbjsKICAgICAgICAgICAgICAgICMgICB1aW50MzIgICAgICAgICAgICAgICAgICBtaXNjRmxhZzsKICAgICAgICAgICAgICAgICMgICB1aW50MzIgICAgICAgICAgICAgICAgICBhcnJheVNpemU7CiAgICAgICAgICAgICAgICAjICAgdWludDMyICAgICAgICAgICAgICAgICAgbWlzY0ZsYWdzMjsKICAgICAgICAgICAgICAgICMgfTsKICAgICAgICAgICAgICAgIGR4Z2lGb3JtYXQgPSBpbnQoZHhnaV9mb3JtYXQpCiAgICAgICAgICAgICAgICByZXNvdXJjZURpbWVuc2lvbiA9IEQzRDEwX1JFU09VUkNFX0RJTUVOU0lPTi5URVhUVVJFMkQKICAgICAgICAgICAgICAgIG1pc2NGbGFnID0gMAogICAgICAgICAgICAgICAgYXJyYXlTaXplID0gMQogICAgICAgICAgICAgICAgbWlzY0ZsYWdzMiA9IDAKCiAgICAgICAgICAgICAgICBkeHQxMF9oZWFkZXIgPSBzdHJ1Y3QucGFjaygKICAgICAgICAgICAgICAgICAgICAiPDVJIiwKICAgICAgICAgICAgICAgICAgICBkeGdpRm9ybWF0LAogICAgICAgICAgICAgICAgICAgIHJlc291cmNlRGltZW5zaW9uLAogICAgICAgICAgICAgICAgICAgIG1pc2NGbGFnLAogICAgICAgICAgICAgICAgICAgIGFycmF5U2l6ZSwKICAgICAgICAgICAgICAgICAgICBtaXNjRmxhZ3MyLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZi53cml0ZShkeHQxMF9oZWFkZXIpCgogICAgICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICMgV3JpdGUgdGhlIGFjdHVhbCB0ZXh0dXJlIGRhdGEgYmxvY2tzIChwQmxvY2tzKQogICAgICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgICAgICAjIEMgY29kZTogZndyaXRlKHBCbG9ja3MsIGRlc2MubFBpdGNoLCAxLCBwRmlsZSk7CiAgICAgICAgICAgICMgaS5lLiB3cml0ZSBleGFjdGx5IGxQaXRjaCBieXRlcy4KICAgICAgICAgICAgZGF0YSA9IG1lbW9yeXZpZXcoYmxvY2tzKQogICAgICAgICAgICBpZiBsZW4oZGF0YSkgPCBsUGl0Y2g6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgICAgIGYiYmxvY2tzIGJ1ZmZlciB0b28gc21hbGw6IG5lZWQgYXQgbGVhc3Qge2xQaXRjaH0gYnl0ZXMsIGdvdCB7bGVuKGRhdGEpfSIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZi53cml0ZShkYXRhWzpsUGl0Y2hdKQoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICMgTWltaWMgdGhlIEMtc3R5bGUgZXJyb3IgcmVwb3J0aW5nIGFzIG11Y2ggYXMgcHJhY3RpY2FsCiAgICAgICAgICAgIHByaW50KGYiRmFpbGVkIHdyaXRpbmcgdG8gRERTIGZpbGUge2ZpbGVuYW1lfToge2V9IiwgZmlsZT1zeXMuc3RkZXJyKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgQ2xvc2UgZmlsZQogICAgICAgIHRyeToKICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgIHByaW50KGYiRmFpbGVkIGNsb3NpbmcgRERTIGZpbGUge2ZpbGVuYW1lfSEiLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICByZXR1cm4gVHJ1ZQo=