IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMKIyAgRG9jTWFrZXIgMC4xIChjKSAyMDAwLTIwMDEgRGF2aWQgVHVybmVyIDxkYXZpZEBmcmVldHlwZS5vcmc+CiMKIyAgRG9jTWFrZXIgaXMgYSB2ZXJ5IHNpbXBsZSBwcm9ncmFtIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIEFQSSBSZWZlcmVuY2UKIyAgb2YgcHJvZ3JhbXMgYnkgZXh0cmFjdGluZyBjb21tZW50cyBmcm9tIHNvdXJjZSBmaWxlcywgYW5kIGdlbmVyYXRpbmcKIyAgdGhlIGVxdWl2YWxlbnQgSFRNTCBkb2N1bWVudGF0aW9uLgojCiMgIERvY01ha2VyIGlzIHZlcnkgc2ltaWxhciB0byBvdGhlciB0b29scyBsaWtlIERveHlnZW4sIHdpdGggdGhlCiMgIGZvbGxvd2luZyBkaWZmZXJlbmNlczoKIwojICAgIC0gSXQgaXMgd3JpdHRlbiBpbiBQeXRob24gKHNvIGl0IGlzIHNsb3csIGJ1dCBlYXN5IHRvIG1haW50YWluIGFuZAojICAgICAgaW1wcm92ZSkuCiMKIyAgICAtIFRoZSBjb21tZW50IHN5bnRheCB1c2VkIGJ5IERvY01ha2VyIGlzIHNpbXBsZXIgYW5kIG1ha2VzIGZvcgojICAgICAgY2xlYXJlciBjb21tZW50cy4KIwojICBPZiBjb3Vyc2UsIGl0IGRvZXNuJ3QgaGF2ZSBhbGwgdGhlIGdvb2RpZXMgb2YgbW9zdCBzaW1pbGFyIHRvb2xzLAojICAoZS5nLiBDKysgY2xhc3MgaGllcmFyY2hpZXMpLCBidXQgaGV5LCBpdCBpcyBvbmx5IDIwMDAgbGluZXMgb2YKIyAgUHl0aG9uLgojCiMgIERvY01ha2VyIGlzIG1haW5seSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBBUEkgcmVmZXJlbmNlcyBvZiBzZXZlcmFsCiMgIEZyZWVUeXBlIHBhY2thZ2VzLgojCiMgICAtIERhdmlkCiMKCmltcG9ydCBmaWxlaW5wdXQsIHN5cywgb3MsIHRpbWUsIHN0cmluZywgZ2xvYiwgZ2V0b3B0CgojIFRoZSBQcm9qZWN0J3MgdGl0bGUuICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGZyb20gdGhlIGNvbW1hbmQgbGluZSB3aXRoCiMgdGhlIG9wdGlvbnMgIi10IiBvciAiLS10aXRsZSIuCiMKcHJvamVjdF90aXRsZSA9ICJQcm9qZWN0IgoKIyBUaGUgcHJvamVjdCdzIGZpbGVuYW1lIHByZWZpeC4gIFRoaXMgY2FuIGJlIHNldCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgd2l0aAojIHRoZSBvcHRpb25zICItcCIgb3IgIi0tcHJlZml4IgojCnByb2plY3RfcHJlZml4ID0gIiIKCiMgVGhlIHByb2plY3QncyBkb2N1bWVudGF0aW9uIG91dHB1dCBkaXJlY3RvcnkuICBUaGlzIGNhbiBiZSBzZXQgZnJvbSB0aGUKIyBjb21tYW5kIGxpbmUgd2l0aCB0aGUgb3B0aW9ucyAiLW8iIG9yICItLW91dHB1dCIuCiMKb3V0cHV0X2RpciA9IE5vbmUKCgojIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB0aGUgSFRNTCBoZWFkZXIgdXNlZCBieSBhbGwgZ2VuZXJhdGVkIHBhZ2VzLgojCmh0bWxfaGVhZGVyXzEgPSAiIiJcCjxodG1sPgo8aGVhZGVyPgo8dGl0bGU+IiIiCgpodG1sX2hlYWRlcl8yPSAiIiIgQVBJIFJlZmVyZW5jZTwvdGl0bGU+CjxiYXNlZm9udCBmYWNlPSJWZXJkYW5hLEdlbmV2YSxBcmlhbCxIZWx2ZXRpY2EiPgo8c3R5bGUgY29udGVudD0idGV4dC9jc3MiPgogIFAgeyB0ZXh0LWFsaWduPWp1c3RpZnkgfQogIEgxIHsgdGV4dC1hbGlnbj1jZW50ZXIgfQogIExJIHsgdGV4dC1hbGlnbj1qdXN0aWZ5IH0KPC9zdHlsZT4KPC9oZWFkZXI+Cjxib2R5IHRleHQ9IzAwMDAwMAogICAgICBiZ2NvbG9yPSNGRkZGRkYKICAgICAgbGluaz0jMDAwMEVGCiAgICAgIHZsaW5rPSM1MTE4OEUKICAgICAgYWxpbms9I0ZGMDAwMD4KPGNlbnRlcj48aDE+IiIiCgpodG1sX2hlYWRlcl8zPSIiIiBBUEkgUmVmZXJlbmNlPC9oMT48L2NlbnRlcj4KIiIiCgojIFRoaXMgaXMgcmVjb21wdXRlZCBsYXRlciB3aGVuIHRoZSBwcm9qZWN0IHRpdGxlIGNoYW5nZXMuCiMKaHRtbF9oZWFkZXIgPSBodG1sX2hlYWRlcl8xICsgcHJvamVjdF90aXRsZSArIGh0bWxfaGVhZGVyXzIgKyBwcm9qZWN0X3RpdGxlICsgaHRtbF9oZWFkZXJfMwoKCiMgVGhlIEhUTUwgZm9vdGVyIHVzZWQgYnkgYWxsIGdlbmVyYXRlZCBwYWdlcy4KIwpodG1sX2Zvb3RlciA9ICIiIlwKPC9ib2R5Pgo8L2h0bWw+IiIiCgojIFRoZSBoZWFkZXIgYW5kIGZvb3RlciB1c2VkIGZvciBlYWNoIHNlY3Rpb24uCiMKc2VjdGlvbl90aXRsZV9oZWFkZXIgPSAiPGNlbnRlcj48aDE+IgpzZWN0aW9uX3RpdGxlX2Zvb3RlciA9ICI8L2gxPjwvY2VudGVyPiIKCiMgVGhlIGhlYWRlciBhbmQgZm9vdGVyIHVzZWQgZm9yIGNvZGUgc2VnbWVudHMuCiMKY29kZV9oZWFkZXIgPSAiPGZvbnQgY29sb3I9Ymx1ZT48cHJlPiIKY29kZV9mb290ZXIgPSAiPC9wcmU+PC9mb250PiIKCiMgUGFyYWdyYXBoIGhlYWRlciBhbmQgZm9vdGVyLgojCnBhcmFfaGVhZGVyID0gIjxwPiIKcGFyYV9mb290ZXIgPSAiPC9wPiIKCiMgQmxvY2sgaGVhZGVyIGFuZCBmb290ZXIuCiMKYmxvY2tfaGVhZGVyID0gIjxjZW50ZXI+PHRhYmxlIHdpZHRoPTc1JT48dHI+PHRkPiIKYmxvY2tfZm9vdGVyID0gIjwvdGQ+PC90cj48L3RhYmxlPjxociB3aWR0aD03NSU+PC9jZW50ZXI+IgoKIyBEZXNjcmlwdGlvbiBoZWFkZXIvZm9vdGVyLgojCmRlc2NyaXB0aW9uX2hlYWRlciA9ICI8Y2VudGVyPjx0YWJsZSB3aWR0aD04NyU+PHRyPjx0ZD4iCmRlc2NyaXB0aW9uX2Zvb3RlciA9ICI8L3RkPjwvdHI+PC90YWJsZT48L2NlbnRlcj48YnI+IgoKIyBNYXJrZXIgaGVhZGVyL2ludGVyL2Zvb3RlciBjb21iaW5hdGlvbi4KIwptYXJrZXJfaGVhZGVyID0gIjxjZW50ZXI+PHRhYmxlIHdpZHRoPTg3JSBjZWxscGFkZGluZz01Pjx0ciBiZ2NvbG9yPSNFRUVFRkY+PHRkPjxlbT48Yj4iCm1hcmtlcl9pbnRlciAgPSAiPC9iPjwvZW0+PC90ZD48L3RyPjx0cj48dGQ+IgptYXJrZXJfZm9vdGVyID0gIjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPiIKCiMgU291cmNlIGNvZGUgZXh0cmFjdHMgaGVhZGVyL2Zvb3Rlci4KIwpzb3VyY2VfaGVhZGVyID0gIjxjZW50ZXI+PHRhYmxlIHdpZHRoPTg3JT48dHIgYmdjb2xvcj0jRDZFOEZGIHdpZHRoPTEwMCU+PHRkPjxwcmU+Igpzb3VyY2VfZm9vdGVyID0gIjwvcHJlPjwvdGFibGU+PC9jZW50ZXI+PGJyPiIKCiMgQ2hhcHRlciBoZWFkZXIvaW50ZXIvZm9vdGVyLgojCmNoYXB0ZXJfaGVhZGVyID0gIjxjZW50ZXI+PHRhYmxlIHdpZHRoPTc1JT48dHI+PHRkPjxoMj4iCmNoYXB0ZXJfaW50ZXIgID0gIjwvaDI+PHVsPiIKY2hhcHRlcl9mb290ZXIgPSAiPC91bD48L3RkPjwvdHI+PC90YWJsZT48L2NlbnRlcj4iCgpjdXJyZW50X3NlY3Rpb24gPSBOb25lCgoKIyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc29ydCB0aGUgaW5kZXguICBJdCBpcyBhIHNpbXBsZSBsZXhpY29ncmFwaGljYWwKIyBzb3J0LCBleGNlcHQgdGhhdCBpdCBwbGFjZXMgY2FwaXRhbCBsZXR0ZXJzIGJlZm9yZSBsb3dlcmNhc2Ugb25lcy4KIwpkZWYgaW5kZXhfc29ydCggczEsIHMyICk6CiAgICBpZiBub3QgczE6CiAgICAgICAgcmV0dXJuIC0xCgogICAgaWYgbm90IHMyOgogICAgICAgIHJldHVybiAxCgogICAgbDEgPSBsZW4oIHMxICkKICAgIGwyID0gbGVuKCBzMiApCiAgICBtMSA9IHN0cmluZy5sb3dlciggczEgKQogICAgbTIgPSBzdHJpbmcubG93ZXIoIHMyICkKCiAgICBmb3IgaSBpbiByYW5nZSggbDEgKToKICAgICAgICBpZiBpID49IGwyIG9yIG0xW2ldID4gbTJbaV06CiAgICAgICAgICAgIHJldHVybiAxCgogICAgICAgIGlmIG0xW2ldIDwgbTJbaV06CiAgICAgICAgICAgIHJldHVybiAtMQoKICAgICAgICBpZiBzMVtpXSA8IHMyW2ldOgogICAgICAgICAgICByZXR1cm4gLTEKCiAgICAgICAgaWYgczFbaV0gPiBzMltpXToKICAgICAgICAgICAgcmV0dXJuIDEKCiAgICBpZiBsMiA+IGwxOgogICAgICAgIHJldHVybiAtMQoKICAgIHJldHVybiAwCgoKIyBTb3J0IGlucHV0X2xpc3QsIHBsYWNpbmcgdGhlIGVsZW1lbnRzIG9mIG9yZGVyX2xpc3QgaW4gZnJvbnQuCiMKZGVmIHNvcnRfb3JkZXJfbGlzdCggaW5wdXRfbGlzdCwgb3JkZXJfbGlzdCApOgogICAgbmV3X2xpc3QgPSBvcmRlcl9saXN0WzpdCiAgICBmb3IgaWQgaW4gaW5wdXRfbGlzdDoKICAgICAgICBpZiBub3QgaWQgaW4gb3JkZXJfbGlzdDoKICAgICAgICAgICAgbmV3X2xpc3QuYXBwZW5kKCBpZCApCiAgICByZXR1cm4gbmV3X2xpc3QKCgojIFRyYW5zbGF0ZSBhIHNpbmdsZSBsaW5lIG9mIHNvdXJjZSB0byBIVE1MLiAgVGhpcyB3aWxsIGNvbnZlcnQKIyBhICI8IiBpbnRvICImbHQuIiwgIj4iIGludG8gIiZndC4iLCBldGMuCiMKZGVmIGh0bWxfZm9ybWF0KCBsaW5lICk6CiAgICByZXN1bHQgPSBzdHJpbmcucmVwbGFjZSggbGluZSwgIjwiLCAiJmx0LiIgKQogICAgcmVzdWx0ID0gc3RyaW5nLnJlcGxhY2UoIGxpbmUsICI+IiwgIiZndC4iICkKICAgIHJlc3VsdCA9IHN0cmluZy5yZXBsYWNlKCBsaW5lLCAiJiIsICImYW1wLiIgKQogICAgcmV0dXJuIHJlc3VsdAoKCiMgT3BlbiB0aGUgc3RhbmRhcmQgb3V0cHV0IHRvIGEgZ2l2ZW4gcHJvamVjdCBkb2N1bWVudGF0aW9uIGZpbGUuICBVc2UKIyAib3V0cHV0X2RpciIgdG8gZGV0ZXJtaW5lIHRoZSBmaWxlbmFtZSBsb2NhdGlvbiBpZiBuZWNlc3NhcnkgYW5kIHNhdmUgdGhlCiMgb2xkIHN0ZG91dCBpbiBhIHR1cGxlIHRoYXQgaXMgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbi4KIwpkZWYgb3Blbl9vdXRwdXQoIGZpbGVuYW1lICk6CiAgICBnbG9iYWwgb3V0cHV0X2RpcgoKICAgIGlmIG91dHB1dF9kaXIgYW5kIG91dHB1dF9kaXIgIT0gIiI6CiAgICAgICAgZmlsZW5hbWUgPSBvdXRwdXRfZGlyICsgb3Muc2VwICsgZmlsZW5hbWUKCiAgICBvbGRfc3Rkb3V0ID0gc3lzLnN0ZG91dAogICAgbmV3X2ZpbGUgICA9IG9wZW4oIGZpbGVuYW1lLCAidyIgKQogICAgc3lzLnN0ZG91dCA9IG5ld19maWxlCgogICAgcmV0dXJuICggbmV3X2ZpbGUsIG9sZF9zdGRvdXQgKQoKCiMgQ2xvc2UgdGhlIG91dHB1dCB0aGF0IHdhcyByZXR1cm5lZCBieSAiY2xvc2Vfb3V0cHV0Ii4KIwpkZWYgY2xvc2Vfb3V0cHV0KCBvdXRwdXQgKToKICAgIG91dHB1dFswXS5jbG9zZSgpCiAgICBzeXMuc3Rkb3V0ID0gb3V0cHV0WzFdCgoKIyBDaGVjayBvdXRwdXQgZGlyZWN0b3J5LgojCmRlZiBjaGVja19vdXRwdXQoICk6CiAgICBnbG9iYWwgb3V0cHV0X2RpcgogICAgaWYgb3V0cHV0X2RpcjoKICAgICAgICBpZiBvdXRwdXRfZGlyICE9ICIiOgogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2Rpciggb3V0cHV0X2RpciApOgogICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggImFyZ3VtZW50IiArICIgJyIgKyBvdXRwdXRfZGlyICsgIicgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXMgbm90IGEgdmFsaWQgZGlyZWN0b3J5IiApCiAgICAgICAgICAgICAgICBzeXMuZXhpdCggMiApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgb3V0cHV0X2RpciA9IE5vbmUKCgpkZWYgY29tcHV0ZV90aW1lX2h0bWwoICk6CiAgICBnbG9iYWwgaHRtbF9mb290ZXIKICAgIHRpbWVfc3RyaW5nID0gdGltZS5hc2N0aW1lKCB0aW1lLmxvY2FsdGltZSggdGltZS50aW1lKCkgKSApCiAgICBodG1sX2Zvb3RlciA9ICI8cD48Y2VudGVyPjxmb250IHNpemU9IiItMiIiPmdlbmVyYXRlZCBvbiAiICsgdGltZV9zdHJpbmcgKyAiPC9mb250PjwvcD48L2NlbnRlcj4iICsgaHRtbF9mb290ZXIKCiMgVGhlIEZyZWVUeXBlIDIgcmVmZXJlbmNlIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBzb3VyY2UgZmlsZXMuICBUaGVzZQojIGNvbnRhaW4gdmFyaW91cyBjb21tZW50IGJsb2NrcyB0aGF0IGZvbGxvdyBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzOgojCiMgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKgojICAgKgojICAgKiAgRk9STUFUMQojICAgKgojICAgKgojICAgKgojICAgKgojICAgKioqKioqKioqKioqKioqKioqKioqKioqKi8KIwojICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiMgIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi8KIyAgLyogIEZPUk1BVDIgICAgICAgICAgICAgICAqLwojICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovCiMgIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi8KIyAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwojICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovCiMKIyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwojICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovCiMgIC8qICBGT1JNQVQzICAgICAgICAgICAgICAgKi8KIyAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwojICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovCiMgIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi8KIyAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwojICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiMKIyBFYWNoIGJsb2NrIGNvbnRhaW5zIGEgbGlzdCBvZiBtYXJrZXJzOyBlYWNoIG9uZSBjYW4gYmUgZm9sbG93ZWQgYnkKIyBzb21lIGFyYml0cmFyeSB0ZXh0IG9yIGEgbGlzdCBvZiBmaWVsZHMuICBIZXJlIGFuIGV4YW1wbGU6CiMKIyAgICA8U3RydWN0PgojICAgICAgIE15U3RydWN0CiMKIyAgICA8RGVzY3JpcHRpb24+CiMgICAgICAgdGhpcyBzdHJ1Y3R1cmUgaG9sZHMgc29tZSBkYXRhCiMKIyAgICA8RmllbGRzPgojICAgICAgIHggOjogaG9yaXpvbnRhbCBjb29yZGluYXRlCiMgICAgICAgeSA6OiB2ZXJ0aWNhbCBjb29yZGluYXRlCiMKIwojIFRoaXMgZXhhbXBsZSBkZWZpbmVzIHRocmVlIG1hcmtlcnM6ICdTdHJ1Y3QnLCAnRGVzY3JpcHRpb24nICYgJ0ZpZWxkcycuCiMgVGhlIGZpcnN0IHR3byBtYXJrZXJzIGNvbnRhaW4gYXJiaXRyYXJ5IHRleHQsIHdoaWxlIHRoZSBsYXN0IG9uZSBjb250YWlucwojIGEgbGlzdCBvZiBmaWVsZHMuCiMKIyBFYWNoIGZpZWxkIGlzIHNpbXBseSBvZiB0aGUgZm9ybWF0OiAgV09SRCA6OiBURVhULi4uCiMKIyBOb3RlIHRoYXQgdHlwaWNhbGx5IGVhY2ggY29tbWVudCBibG9jayBpcyBmb2xsb3dlZCBieSBzb21lIHNvdXJjZSBjb2RlCiMgZGVjbGFyYXRpb24gdGhhdCBtYXkgbmVlZCB0byBiZSBrZXB0IGluIHRoZSByZWZlcmVuY2UuCiMKIyBOb3RlIHRoYXQgbWFya2VycyBjYW4gYWx0ZXJuYXRpdmVseSBiZSB3cml0dGVuIGFzICJATUFSS0VSOiIgaW5zdGVhZCBvZgojICI8TUFSS0VSPiIuICBBbGwgbWFya2VyIGlkZW50aWZpZXJzIGFyZSBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZSBkdXJpbmcKIyBwYXJzaW5nIGluIG9yZGVyIHRvIHNpbXBseSBzb3J0aW5nLgojCiMgV2UgYXNzb2NpYXRlIHdpdGggZWFjaCBibG9jayB0aGUgZm9sbG93aW5nIHNvdXJjZSBsaW5lcyB0aGF0IGRvIG5vdCBiZWdpbgojIHdpdGggYSBjb21tZW50LiAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmc6CiMKIyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiMgICAgKgojICAgICogPG15dGFnPiAgYmxhYmxhCiMgICAgKgojICAgICovCiMKIyAgIGJsYV9ibGFfYmxhCiMgICBiaWxpcF9iaWxpcAojCiMgICAvKiAtIHRoaXMgY29tbWVudCBhY3RzIGFzIGEgc2VwYXJhdG9yIC0gKi8KIwojICAgYmxvX2Jsb19ibG8KIwojCiMgd2lsbCBvbmx5IGtlZXAgdGhlIGZpcnN0IHR3byBsaW5lcyBvZiBzb3VyY2VzIHdpdGgKIyB0aGUgImJsYWJsYSIgYmxvY2suCiMKIyBIb3dldmVyLCB0aGUgY29tbWVudCB3aWxsIGJlIGtlcHQsIHdpdGggZm9sbG93aW5nIHNvdXJjZSBsaW5lcyBpZiBpdAojIGNvbnRhaW5zIGEgc3RhcnRpbmcgJyMnIG9yICdAJyBhcyBpbjoKIwojICAgLypALi4uLi4qLwojICAgLyojLi4uLi4qLwojICAgLyogQC4uLi4uKi8KIyAgIC8qICMuLi4uLiovCiMKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIwojIFRoZSBEb2NDb2RlIGNsYXNzIGlzIHVzZWQgdG8gc3RvcmUgc291cmNlIGNvZGUgbGluZXMuCiMKIyAgICdzZWxmLmxpbmVzJyBjb250YWlucyBhIHNldCBvZiBzb3VyY2UgY29kZSBsaW5lcyB0aGF0IHdpbGwgYmUgZHVtcGVkIGFzCiMgICBIVE1MIGluIGEgPFBSRT4gdGFnLgojCiMgICBUaGUgb2JqZWN0IGlzIGZpbGxlZCBsaW5lIGJ5IGxpbmUgYnkgdGhlIHBhcnNlcjsgaXQgc3RyaXBzIHRoZSBsZWFkaW5nCiMgICAibWFyZ2luIiBzcGFjZSBmcm9tIGVhY2ggaW5wdXQgbGluZSBiZWZvcmUgc3RvcmluZyBpdCBpbiAnc2VsZi5saW5lcycuCiMKY2xhc3MgRG9jQ29kZToKCiAgICBkZWYgX19pbml0X18oIHNlbGYsIG1hcmdpbiA9IDAgKToKICAgICAgICBzZWxmLmxpbmVzICA9IFtdCiAgICAgICAgc2VsZi5tYXJnaW4gPSBtYXJnaW4KCgogICAgZGVmIGFkZCggc2VsZiwgbGluZSApOgogICAgICAgICMgcmVtb3ZlIG1hcmdpbiB3aGl0ZXNwYWNlCiAgICAgICAgIwogICAgICAgIGlmIHN0cmluZy5zdHJpcCggbGluZVs6IHNlbGYubWFyZ2luXSApID09ICIiOgogICAgICAgICAgICBsaW5lID0gbGluZVtzZWxmLm1hcmdpbiA6XQogICAgICAgIHNlbGYubGluZXMuYXBwZW5kKCBsaW5lICkKCgogICAgZGVmIGR1bXAoIHNlbGYgKToKICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmxpbmVzOgogICAgICAgICAgICBwcmludCAiLS0iICsgbGluZQogICAgICAgIHByaW50ICIiCgoKICAgIGRlZiBnZXRfaWRlbnRpZmllciggc2VsZiApOgogICAgICAgICMgdGhpcyBmdW5jdGlvbiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkCiAgICAgICAgIwogICAgICAgIHJldHVybiAiVU5LTk9XTl9DT0RFX0lERU5USUZJRVIhIgoKCiAgICBkZWYgZHVtcF9odG1sKCBzZWxmLCBpZGVudGlmaWVycyA9IE5vbmUgKToKICAgICAgICAjIGNsZWFuIHRoZSBsYXN0IGVtcHR5IGxpbmVzCiAgICAgICAgIwogICAgICAgIGwgPSBsZW4oIHNlbGYubGluZXMgKSAtIDEKICAgICAgICB3aGlsZSBsID4gMCBhbmQgc3RyaW5nLnN0cmlwKCBzZWxmLmxpbmVzW2wgLSAxXSApID09ICIiOgogICAgICAgICAgICBsID0gbCAtIDEKCiAgICAgICAgIyBUaGUgY29kZSBmb290ZXIgc2hvdWxkIGJlIGRpcmVjdGx5IGFwcGVuZGVkIHRvIHRoZSBsYXN0IGNvZGUKICAgICAgICAjIGxpbmUgdG8gYXZvaWQgYW4gYWRkaXRpb25hbCBibGFuayBsaW5lLgogICAgICAgICMKICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCBjb2RlX2hlYWRlciApCiAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5saW5lc1swIDogbCsxXToKICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggJ1xuJyArIGh0bWxfZm9ybWF0KGxpbmUpICkKICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCBjb2RlX2Zvb3RlciApCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMKIyBUaGUgRG9jUGFyYWdyYXBoIGlzIHVzZWQgdG8gc3RvcmUgdGV4dCBwYXJhZ3JhcGhzLgojICdzZWxmLndvcmRzJyBpcyBzaW1wbHkgYSBsaXN0IG9mIHdvcmRzIGZvciB0aGUgcGFyYWdyYXBoLgojCiMgVGhlIHBhcmFncmFwaCBpcyBmaWxsZWQgbGluZSBieSBsaW5lIGJ5IHRoZSBwYXJzZXIuCiMKY2xhc3MgRG9jUGFyYWdyYXBoOgoKICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgogICAgICAgIHNlbGYud29yZHMgPSBbXQoKCiAgICBkZWYgYWRkKCBzZWxmLCBsaW5lICk6CiAgICAgICAgIyBHZXQgcmlkIG9mIHVud2FudGVkIHNwYWNlcyBpbiB0aGUgcGFyYWdyYXBoLgogICAgICAgICMKICAgICAgICAjIFRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIGFyZSB0aGUgc2FtZSBhcwogICAgICAgICMKICAgICAgICAjICAgc2VsZi53b3Jkcy5leHRlbmQoIHN0cmluZy5zcGxpdCggbGluZSApICkKICAgICAgICAjCiAgICAgICAgIyBidXQgb2xkZXIgUHl0aG9uIHZlcnNpb25zIGRvbid0IGhhdmUgdGhlIGBleHRlbmQnIGF0dHJpYnV0ZS4KICAgICAgICAjCiAgICAgICAgbGFzdCA9IGxlbiggc2VsZi53b3JkcyApCiAgICAgICAgc2VsZi53b3Jkc1tsYXN0IDogbGFzdF0gPSBzdHJpbmcuc3BsaXQoIGxpbmUgKQoKCiAgICAjIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgZmlyc3Qgd29yZCBvZiBhIGdpdmVuCiAgICAjIHBhcmFncmFwaC4KICAgICMKICAgIGRlZiBnZXRfaWRlbnRpZmllciggc2VsZiApOgogICAgICAgIGlmIHNlbGYud29yZHM6CiAgICAgICAgICAgIHJldHVybiBzZWxmLndvcmRzWzBdCgogICAgICAgICMgc2hvdWxkIG5ldmVyIGhhcHBlbgogICAgICAgICMKICAgICAgICByZXR1cm4gIlVOS05PV05fUEFSQV9JREVOVElGSUVSISIKCgogICAgZGVmIGdldF93b3Jkcyggc2VsZiApOgogICAgICAgIHJldHVybiBzZWxmLndvcmRzWzpdCgoKICAgIGRlZiBkdW1wKCBzZWxmLCBpZGVudGlmaWVycyA9IE5vbmUgKToKICAgICAgICBtYXhfd2lkdGggPSA1MAogICAgICAgIGN1cnNvciAgICA9IDAKICAgICAgICBsaW5lICAgICAgPSAiIgogICAgICAgIGV4dHJhICAgICA9IE5vbmUKICAgICAgICBhbHBoYW51bSAgPSBzdHJpbmcubG93ZXJjYXNlICsgc3RyaW5nLnVwcGVyY2FzZSArIHN0cmluZy5kaWdpdHMgKyAnXycKCiAgICAgICAgZm9yIHdvcmQgaW4gc2VsZi53b3JkczoKICAgICAgICAgICAgIyBwcm9jZXNzIGNyb3NzIHJlZmVyZW5jZXMgaWYgbmVlZGVkCiAgICAgICAgICAgICMKICAgICAgICAgICAgaWYgaWRlbnRpZmllcnMgYW5kIHdvcmQgYW5kIHdvcmRbMF0gPT0gJ0AnOgogICAgICAgICAgICAgICAgd29yZCA9IHdvcmRbMSA6XQoKICAgICAgICAgICAgICAgICMgd2UgbmVlZCB0byBmaW5kIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgbCA9IGxlbiggd29yZCApCiAgICAgICAgICAgICAgICBpID0gMAogICAgICAgICAgICAgICAgd2hpbGUgaSA8IGwgYW5kIHdvcmRbaV0gaW4gYWxwaGFudW06CiAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxCgogICAgICAgICAgICAgICAgaWYgaSA8IGw6CiAgICAgICAgICAgICAgICAgICAgZXh0cmEgPSB3b3JkW2kgOl0KICAgICAgICAgICAgICAgICAgICB3b3JkICA9IHdvcmRbMCA6IGldCgogICAgICAgICAgICAgICAgYmxvY2sgPSBpZGVudGlmaWVycy5nZXQoIHdvcmQgKQogICAgICAgICAgICAgICAgaWYgYmxvY2s6CiAgICAgICAgICAgICAgICAgICAgd29yZCA9ICc8YSBocmVmPSInICsgYmxvY2suaHRtbF9hZGRyZXNzKCkgKyAnIj4nICsgd29yZCArICc8L2E+JwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB3b3JkID0gJz8nICsgd29yZAoKICAgICAgICAgICAgaWYgY3Vyc29yICsgbGVuKCB3b3JkICkgKyAxID4gbWF4X3dpZHRoOgogICAgICAgICAgICAgICAgcHJpbnQgaHRtbF9mb3JtYXQoIGxpbmUgKQogICAgICAgICAgICAgICAgY3Vyc29yID0gMAogICAgICAgICAgICAgICAgbGluZSAgID0gIiIKCiAgICAgICAgICAgIGxpbmUgPSBsaW5lICsgd29yZAogICAgICAgICAgICBpZiBub3QgZXh0cmE6CiAgICAgICAgICAgICAgICBsaW5lID0gbGluZSArICIgIgoKICAgICAgICAgICAgY3Vyc29yID0gY3Vyc29yICsgbGVuKCB3b3JkICkgKyAxCgoKICAgICAgICAgICAgIyBIYW5kbGUgdHJhaWxpbmcgcGVyaW9kcywgY29tbWFzLCBldGMuIGF0IHRoZSBlbmQgb2YgY3Jvc3MKICAgICAgICAgICAgIyByZWZlcmVuY2VzLgogICAgICAgICAgICAjCiAgICAgICAgICAgIGlmIGV4dHJhOgogICAgICAgICAgICAgICAgaWYgY3Vyc29yICsgbGVuKCBleHRyYSApICsgMSA+IG1heF93aWR0aDoKICAgICAgICAgICAgICAgICAgICBwcmludCBodG1sX2Zvcm1hdCggbGluZSApCiAgICAgICAgICAgICAgICAgICAgY3Vyc29yID0gMAogICAgICAgICAgICAgICAgICAgIGxpbmUgICA9ICIiCgogICAgICAgICAgICAgICAgbGluZSAgID0gbGluZSArIGV4dHJhICsgIiAiCiAgICAgICAgICAgICAgICBjdXJzb3IgPSBjdXJzb3IgKyBsZW4oIGV4dHJhICkgKyAxCiAgICAgICAgICAgICAgICBleHRyYSAgPSBOb25lCgogICAgICAgIGlmIGN1cnNvciA+IDA6CiAgICAgICAgICAgIHByaW50IGh0bWxfZm9ybWF0KGxpbmUpCgogICAgICAgICMgcHJpbnQgIqciICMgZm9yIGRlYnVnZ2luZyBvbmx5CgoKICAgIGRlZiBkdW1wX3N0cmluZyggc2VsZiApOgogICAgICAgIHMgICAgID0gIiIKICAgICAgICBzcGFjZSA9ICIiCiAgICAgICAgZm9yIHdvcmQgaW4gc2VsZi53b3JkczoKICAgICAgICAgICAgcyAgICAgPSBzICsgc3BhY2UgKyB3b3JkCiAgICAgICAgICAgIHNwYWNlID0gIiAiCgogICAgICAgIHJldHVybiBzCgoKICAgIGRlZiBkdW1wX2h0bWwoIHNlbGYsIGlkZW50aWZpZXJzID0gTm9uZSApOgogICAgICAgIHByaW50IHBhcmFfaGVhZGVyCiAgICAgICAgc2VsZi5kdW1wKCBpZGVudGlmaWVycyApCiAgICAgICAgcHJpbnQgcGFyYV9mb290ZXIKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIwojIERvY0NvbnRlbnQgaXMgdXNlZCB0byBzdG9yZSB0aGUgY29udGVudCBvZiBhIGdpdmVuIG1hcmtlci4KIwojIFRoZSAic2VsZi5pdGVtcyIgbGlzdCBjb250YWlucyAoZmllbGQsZWxlbWVudHMpIHJlY29yZHMsIHdoZXJlICJmaWVsZCIKIyBjb3JyZXNwb25kcyB0byBhIGdpdmVuIHN0cnVjdHVyZSBmaWVsZCBvciBmdW5jdGlvbiBwYXJhbWV0ZXIgKGluZGljYXRlZAojIGJ5IGEgIjo6IiksIG9yIE5VTEwgZm9yIGEgbm9ybWFsIHNlY3Rpb24gb2YgdGV4dC9jb2RlLgojCiMgSGVuY2UsIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKIwojICAgPE15TWFya2VyPgojICAgICAgVGhpcyBpcyBhbiBleGFtcGxlIG9mIHdoYXQgY2FuIGJlIHB1dCBpbiBhIGNvbnRlbnQgc2VjdGlvbiwKIwojICAgICAgQSBzZWNvbmQgbGluZSBvZiBleGFtcGxlIHRleHQuCiMKIyAgICAgIHggOjogQSBzaW1wbGUgdGVzdCBmaWVsZCwgd2l0aCBzb21lIGNvbnRlbnRzLgojICAgICAgeSA6OiBFdmVuIGJlZm9yZSwgdGhpcyBmaWVsZCBoYXMgc29tZSBjb2RlIGNvbnRlbnRzLgojICAgICAgICAgICB7CiMgICAgICAgICAgICAgeSA9IHgrMjsKIyAgICAgICAgICAgfQojCiMgc2hvdWxkIGJlIHN0b3JlZCBhcwojCiMgICAgIFsgKCBOb25lLCBbIERvY1BhcmFncmFwaCwgRG9jUGFyYWdyYXBoXSApLAojICAgICAgICggIngiLCAgWyBEb2NQYXJhZ3JhcGggXSApLAojICAgICAgICggInkiLCAgWyBEb2NQYXJhZ3JhcGgsIERvY0NvZGUgXSApIF0KIwojIGluICdzZWxmLml0ZW1zJy4KIwojIFRoZSBEb2NDb250ZW50IG9iamVjdCBpcyBlbnRpcmVseSBidWlsdCBhdCBjcmVhdGlvbiB0aW1lOyB5b3UgbXVzdCBwYXNzIGEKIyBsaXN0IG9mIGlucHV0IHRleHQgbGluZXMgaW4gdGhlICJsaW5lc19saXN0IiBwYXJhbWV0ZXIuCiMKY2xhc3MgRG9jQ29udGVudDoKCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGxpbmVzX2xpc3QgKToKICAgICAgICBzZWxmLml0ZW1zICA9IFtdCiAgICAgICAgY29kZV9tb2RlICAgPSAwCiAgICAgICAgY29kZV9tYXJnaW4gPSAwCiAgICAgICAgdGV4dCAgICAgICAgPSBbXQogICAgICAgIHBhcmFncmFwaCAgID0gTm9uZSAgICMgcmVwcmVzZW50cyB0aGUgY3VycmVudCBEb2NQYXJhZ3JhcGgKICAgICAgICBjb2RlICAgICAgICA9IE5vbmUgICAjIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgRG9jQ29kZQoKICAgICAgICBlbGVtZW50cyAgICA9IFtdICAgICAjIHRoZSBsaXN0IG9mIGVsZW1lbnRzIGZvciB0aGUgY3VycmVudCBmaWVsZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnRhaW5zIERvY1BhcmFncmFwaCBvciBEb2NDb2RlIG9iamVjdHMKCiAgICAgICAgZmllbGQgICAgICAgPSBOb25lICAgIyB0aGUgY3VycmVudCBmaWVsZAoKICAgICAgICBmb3IgYWxpbmUgaW4gbGluZXNfbGlzdDoKICAgICAgICAgICAgaWYgY29kZV9tb2RlID09IDA6CiAgICAgICAgICAgICAgICBsaW5lICAgPSBzdHJpbmcubHN0cmlwKCBhbGluZSApCiAgICAgICAgICAgICAgICBsICAgICAgPSBsZW4oIGxpbmUgKQogICAgICAgICAgICAgICAgbWFyZ2luID0gbGVuKCBhbGluZSApIC0gbAoKICAgICAgICAgICAgICAgICMgaWYgdGhlIGxpbmUgaXMgZW1wdHksIHRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgY3VycmVudAogICAgICAgICAgICAgICAgIyBwYXJhZ3JhcGgKICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgIGlmIGwgPT0gMCBvciBsaW5lID09ICd7JzoKICAgICAgICAgICAgICAgICAgICBpZiBwYXJhZ3JhcGg6CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLmFwcGVuZCggcGFyYWdyYXBoICkKICAgICAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoID0gTm9uZQoKICAgICAgICAgICAgICAgICAgICBpZiBsaW5lID09ICIiOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgICAgICBjb2RlX21vZGUgICA9IDEKICAgICAgICAgICAgICAgICAgICBjb2RlX21hcmdpbiA9IG1hcmdpbgogICAgICAgICAgICAgICAgICAgIGNvZGUgICAgICAgID0gTm9uZQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgd29yZHMgPSBzdHJpbmcuc3BsaXQoIGxpbmUgKQoKICAgICAgICAgICAgICAgICMgdGVzdCBmb3IgYSBmaWVsZCBkZWxpbWl0ZXIgb24gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLCBpLmUuCiAgICAgICAgICAgICAgICAjIHRoZSB0b2tlbiBgOjonCiAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICBpZiBsZW4oIHdvcmRzICkgPj0gMiBhbmQgd29yZHNbMV0gPT0gIjo6IjoKICAgICAgICAgICAgICAgICAgICAjIHN0YXJ0IGEgbmV3IGZpZWxkIC0gY29tcGxldGUgY3VycmVudCBwYXJhZ3JhcGggaWYgYW55CiAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgICAgIGlmIHBhcmFncmFwaDoKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuYXBwZW5kKCBwYXJhZ3JhcGggKQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGggPSBOb25lCgogICAgICAgICAgICAgICAgICAgICMgYXBwZW5kIHByZXZpb3VzICJmaWVsZCIgdG8gc2VsZi5pdGVtcwogICAgICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZCggKCBmaWVsZCwgZWxlbWVudHMgKSApCgogICAgICAgICAgICAgICAgICAgICMgc3RhcnQgbmV3IGZpZWxkIGFuZCBlbGVtZW50cyBsaXN0CiAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgICAgIGZpZWxkICAgID0gd29yZHNbMF0KICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyA9IFtdCiAgICAgICAgICAgICAgICAgICAgd29yZHMgICAgPSB3b3Jkc1syIDpdCgogICAgICAgICAgICAgICAgIyBhcHBlbmQgcmVtYWluaW5nIHdvcmRzIHRvIGN1cnJlbnQgcGFyYWdyYXBoCiAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICBpZiBsZW4oIHdvcmRzICkgPiAwOgogICAgICAgICAgICAgICAgICAgIGxpbmUgPSBzdHJpbmcuam9pbiggd29yZHMgKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwYXJhZ3JhcGg6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaCA9IERvY1BhcmFncmFwaCgpCiAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoLmFkZCggbGluZSApCgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyB3ZSBhcmUgaW4gY29kZSBtb2RlLi4uCiAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICBsaW5lID0gYWxpbmUKCiAgICAgICAgICAgICAgICAjIHRoZSBjb2RlIGJsb2NrIGVuZHMgd2l0aCBhIGxpbmUgdGhhdCBoYXMgYSBzaW5nbGUgJ30nIG9uCiAgICAgICAgICAgICAgICAjIGl0IHRoYXQgaXMgbG9jYXRlZCBhdCB0aGUgc2FtZSBjb2x1bW4gdGhhdCB0aGUgb3BlbmluZwogICAgICAgICAgICAgICAgIyBhY2NvbGFkZS4uLgogICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgaWYgbGluZSA9PSAiICIgKiBjb2RlX21hcmdpbiArICd9JzoKICAgICAgICAgICAgICAgICAgICBpZiBjb2RlOgogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5hcHBlbmQoIGNvZGUgKQogICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTm9uZQoKICAgICAgICAgICAgICAgICAgICBjb2RlX21vZGUgICA9IDAKICAgICAgICAgICAgICAgICAgICBjb2RlX21hcmdpbiA9IDAKCiAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSwgYWRkIHRoZSBsaW5lIHRvIHRoZSBjdXJyZW50IHBhcmFncmFwaAogICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiBub3QgY29kZToKICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IERvY0NvZGUoKQogICAgICAgICAgICAgICAgICAgIGNvZGUuYWRkKCBsaW5lICkKCiAgICAgICAgaWYgcGFyYWdyYXBoOgogICAgICAgICAgICBlbGVtZW50cy5hcHBlbmQoIHBhcmFncmFwaCApCgogICAgICAgIGlmIGNvZGU6CiAgICAgICAgICAgIGVsZW1lbnRzLmFwcGVuZCggY29kZSApCgogICAgICAgIHNlbGYuaXRlbXMuYXBwZW5kKCAoIGZpZWxkLCBlbGVtZW50cyApICkKCgogICAgZGVmIGdldF9pZGVudGlmaWVyKCBzZWxmICk6CiAgICAgICAgaWYgc2VsZi5pdGVtczoKICAgICAgICAgICAgaXRlbSA9IHNlbGYuaXRlbXNbMF0KICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlbVsxXToKICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldF9pZGVudGlmaWVyKCkKCiAgICAgICAgIyBzaG91bGQgbmV2ZXIgaGFwcGVuCiAgICAgICAgIwogICAgICAgIHJldHVybiAiVU5LTk9XTl9DT05URU5UX0lERU5USUZJRVIhIgoKCiAgICBkZWYgZ2V0X3RpdGxlKCBzZWxmICk6CiAgICAgICAgaWYgc2VsZi5pdGVtczoKICAgICAgICAgICAgaXRlbSA9IHNlbGYuaXRlbXNbMF0KICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlbVsxXToKICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmR1bXBfc3RyaW5nKCkKCiAgICAgICAgIyBzaG91bGQgbmV2ZXIgaGFwcGVuCiAgICAgICAgIwogICAgICAgIHJldHVybiAiVU5LTk9XTl9DT05URU5UX1RJVExFISIKCgogICAgZGVmIGR1bXAoIHNlbGYgKToKICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLml0ZW1zOgogICAgICAgICAgICBmaWVsZCA9IGl0ZW1bMF0KICAgICAgICAgICAgaWYgZmllbGQ6CiAgICAgICAgICAgICAgICBwcmludCAiPGZpZWxkICIgKyBmaWVsZCArICI+IgoKICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlbVsxXToKICAgICAgICAgICAgICAgIGVsZW1lbnQuZHVtcCgpCgogICAgICAgICAgICBpZiBmaWVsZDoKICAgICAgICAgICAgICAgIHByaW50ICI8L2ZpZWxkPiIKCgogICAgZGVmIGR1bXBfaHRtbCggc2VsZiwgaWRlbnRpZmllcnMgPSBOb25lICk6CiAgICAgICAgbiAgICAgICAgPSBsZW4oIHNlbGYuaXRlbXMgKQogICAgICAgIGluX3RhYmxlID0gMAoKICAgICAgICBmb3IgaSBpbiByYW5nZSggbiApOgogICAgICAgICAgICBpdGVtICA9IHNlbGYuaXRlbXNbaV0KICAgICAgICAgICAgZmllbGQgPSBpdGVtWzBdCgogICAgICAgICAgICBpZiBub3QgZmllbGQ6CiAgICAgICAgICAgICAgICBpZiBpbl90YWJsZToKICAgICAgICAgICAgICAgICAgICBwcmludCAiPC90ZD48L3RyPjwvdGFibGU+IgogICAgICAgICAgICAgICAgICAgIGluX3RhYmxlID0gMAoKICAgICAgICAgICAgICAgIGZvciBlbGVtZW50IGluIGl0ZW1bMV06CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kdW1wX2h0bWwoIGlkZW50aWZpZXJzICkKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBub3QgaW5fdGFibGU6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgIjx0YWJsZSBjZWxscGFkZGluZz00Pjx0ciB2YWxpZ249dG9wPjx0ZD4iCiAgICAgICAgICAgICAgICAgICAgaW5fdGFibGUgPSAxCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHByaW50ICI8L3RkPjwvdHI+PHRyIHZhbGlnbj10b3A+PHRkPiIKCiAgICAgICAgICAgICAgICBwcmludCAiPGI+IiArIGZpZWxkICsgIjwvYj48L3RkPjx0ZD4iCgogICAgICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlbVsxXToKICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmR1bXBfaHRtbCggaWRlbnRpZmllcnMgKQoKICAgICAgICBpZiBpbl90YWJsZToKICAgICAgICAgICAgcHJpbnQgIjwvdGQ+PC90cj48L3RhYmxlPiIKCgogICAgZGVmIGR1bXBfaHRtbF9pbl90YWJsZSggc2VsZiwgaWRlbnRpZmllcnMgPSBOb25lICk6CiAgICAgICAgbiAgICAgICAgPSBsZW4oIHNlbGYuaXRlbXMgKQogICAgICAgIGluX3RhYmxlID0gMAoKICAgICAgICBmb3IgaSBpbiByYW5nZSggbiApOgogICAgICAgICAgICBpdGVtICA9IHNlbGYuaXRlbXNbaV0KICAgICAgICAgICAgZmllbGQgPSBpdGVtWzBdCgogICAgICAgICAgICBpZiBub3QgZmllbGQ6CiAgICAgICAgICAgICAgICBpZiBpdGVtWzFdOgogICAgICAgICAgICAgICAgICAgIHByaW50ICI8dHI+PHRkIGNvbHNwYW49Mj4iCiAgICAgICAgICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlbVsxXToKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kdW1wX2h0bWwoIGlkZW50aWZpZXJzICkKICAgICAgICAgICAgICAgICAgICBwcmludCAiPC90ZD48L3RyPiIKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmludCAiPHRyPjx0ZD48Yj4iICsgZmllbGQgKyAiPC9iPjwvdGQ+PHRkPiIKCiAgICAgICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVtWzFdOgogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZHVtcF9odG1sKCBpZGVudGlmaWVycyApCgogICAgICAgICAgICAgICAgcHJpbnQgIjwvdGQ+PC90cj4iCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMKIyBUaGUgRG9jQmxvY2sgY2xhc3MgaXMgdXNlZCB0byBzdG9yZSBhIGdpdmVuIGNvbW1lbnQgYmxvY2suICBJdCBjb250YWlucwojIGEgbGlzdCBvZiBtYXJrZXJzLCBhcyB3ZWxsIGFzIGEgbGlzdCBvZiBjb250ZW50cyBmb3IgZWFjaCBtYXJrZXIuCiMKIyAgICJzZWxmLml0ZW1zIiBpcyBhIGxpc3Qgb2YgKG1hcmtlciwgY29udGVudHMpIGVsZW1lbnRzLCB3aGVyZSAnbWFya2VyJyBpcwojICAgYSBsb3dlcmNhc2UgbWFya2VyIHN0cmluZywgYW5kICdjb250ZW50cycgaXMgYSBEb2NDb250ZW50IG9iamVjdC4KIwojICAgInNlbGYuc291cmNlIiBpcyBzaW1wbHkgYSBsaXN0IG9mIHRleHQgbGluZXMgdGFrZW4gZnJvbSB0aGUgdW5jb21tZW50ZWQKIyAgIHNvdXJjZSBpdHNlbGYuCiMKIyAgIEZpbmFsbHksICJzZWxmLm5hbWUiIGlzIGEgc2ltcGxlIGlkZW50aWZpZXIgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeQojICAgdGhlIGJsb2NrLiBJdCBpcyB0YWtlbiBmcm9tIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSBmaXJzdCBwYXJhZ3JhcGggb2YgdGhlCiMgICBmaXJzdCBtYXJrZXIgb2YgYSBnaXZlbiBibG9jaywgaS5lOgojCiMgICAgICA8VHlwZT4gR29vCiMgICAgICA8RGVzY3JpcHRpb24+IEJsYSBibGEgYmxhCiMKIyAgIHdpbGwgaGF2ZSBhIG5hbWUgb2YgIkdvbyIKIwpjbGFzcyBEb2NCbG9jazoKCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGJsb2NrX2xpbmVfbGlzdCA9IFtdLCBzb3VyY2VfbGluZV9saXN0ID0gW10gKToKICAgICAgICBzZWxmLml0ZW1zICAgID0gW10gICAgICAgICAgICAgICAjIGN1cnJlbnQgKCBtYXJrZXIsIGNvbnRlbnRzICkgbGlzdAogICAgICAgIHNlbGYuc2VjdGlvbiAgPSBOb25lICAgICAgICAgICAgICMgc2VjdGlvbiB0aGlzIGJsb2NrIGJlbG9uZ3MgdG8KICAgICAgICBzZWxmLmZpbGVuYW1lID0gInVua25vd24iICAgICAgICAjIGZpbGVuYW1lIGRlZmluaW5nIHRoaXMgYmxvY2sKICAgICAgICBzZWxmLmxpbmVubyAgID0gMCAgICAgICAgICAgICAgICAjIGxpbmUgbnVtYmVyIGluIGZpbGVuYW1lCgogICAgICAgIG1hcmtlciAgICAgICAgPSBOb25lICAgICAgICAgICAgICMgY3VycmVudCBtYXJrZXIKICAgICAgICBjb250ZW50ICAgICAgID0gW10gICAgICAgICAgICAgICAjIGN1cnJlbnQgY29udGVudCBsaW5lcyBsaXN0CiAgICAgICAgYWxwaGFudW0gICAgICA9IHN0cmluZy5sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cyArICJfIgogICAgICAgIHNlbGYubmFtZSAgICAgPSBOb25lCgogICAgICAgIGZvciBsaW5lIGluIGJsb2NrX2xpbmVfbGlzdDoKICAgICAgICAgICAgbGluZTIgID0gc3RyaW5nLmxzdHJpcCggbGluZSApCiAgICAgICAgICAgIGwgICAgICA9IGxlbiggbGluZTIgKQogICAgICAgICAgICBtYXJnaW4gPSBsZW4oIGxpbmUgKSAtIGwKCiAgICAgICAgICAgIGlmIGwgPiAzOgogICAgICAgICAgICAgICAgZW5kZXIgPSBOb25lCiAgICAgICAgICAgICAgICBpZiBsaW5lMlswXSA9PSAnPCc6CiAgICAgICAgICAgICAgICAgICAgZW5kZXIgPSAnPicKICAgICAgICAgICAgICAgIGVsaWYgbGluZTJbMF0gPT0gJ0AnOgogICAgICAgICAgICAgICAgICAgIGVuZGVyID0gJzonCgogICAgICAgICAgICAgICAgaWYgZW5kZXI6CiAgICAgICAgICAgICAgICAgICAgaSA9IDEKICAgICAgICAgICAgICAgICAgICB3aGlsZSBpIDwgbCBhbmQgbGluZTJbaV0gaW4gYWxwaGFudW06CiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMQogICAgICAgICAgICAgICAgICAgIGlmIGkgPCBsIGFuZCBsaW5lMltpXSA9PSBlbmRlcjoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWFya2VyIGFuZCBjb250ZW50OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGQoIG1hcmtlciwgY29udGVudCApCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlciAgPSBsaW5lMlsxIDogaV0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IFtdCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyICAgPSBzdHJpbmcubHN0cmlwKCBsaW5lMltpKzEgOl0gKQogICAgICAgICAgICAgICAgICAgICAgICBsICAgICAgID0gbGVuKCBsaW5lMiApCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgICAgPSAiICIgKiBtYXJnaW4gKyBsaW5lMgoKICAgICAgICAgICAgY29udGVudC5hcHBlbmQoIGxpbmUgKQoKICAgICAgICBpZiBtYXJrZXIgYW5kIGNvbnRlbnQ6CiAgICAgICAgICAgIHNlbGYuYWRkKCBtYXJrZXIsIGNvbnRlbnQgKQoKICAgICAgICBzZWxmLnNvdXJjZSA9IFtdCiAgICAgICAgaWYgc2VsZi5pdGVtczoKICAgICAgICAgICAgc2VsZi5zb3VyY2UgPSBzb3VyY2VfbGluZV9saXN0CgogICAgICAgICMgbm93IHJldHJpZXZlIGJsb2NrIG5hbWUgd2hlbiBwb3NzaWJsZQogICAgICAgICMKICAgICAgICBpZiBzZWxmLml0ZW1zOgogICAgICAgICAgICBmaXJzdCAgICAgPSBzZWxmLml0ZW1zWzBdCiAgICAgICAgICAgIHNlbGYubmFtZSA9IGZpcnN0WzFdLmdldF9pZGVudGlmaWVyKCkKCgogICAgIyBUaGlzIGZ1bmN0aW9uIGFkZHMgYSBuZXcgZWxlbWVudCB0byAnc2VsZi5pdGVtcycuCiAgICAjCiAgICAjICAgJ21hcmtlcicgaXMgYSBtYXJrZXIgc3RyaW5nLCBvciBOb25lLgogICAgIyAgICdsaW5lcycgIGlzIGEgbGlzdCBvZiB0ZXh0IGxpbmVzIHVzZWQgdG8gY29tcHV0ZSBhIGxpc3Qgb2YKICAgICMgICAgICAgICAgICBEb2NDb250ZW50IG9iamVjdHMuCiAgICAjCiAgICBkZWYgYWRkKCBzZWxmLCBtYXJrZXIsIGxpbmVzICk6CiAgICAgICAgIyByZW1vdmUgdGhlIGZpcnN0IGFuZCBsYXN0IGVtcHR5IGxpbmVzIGZyb20gdGhlIGNvbnRlbnQgbGlzdAogICAgICAgICMKICAgICAgICBsID0gbGVuKCBsaW5lcyApCiAgICAgICAgaWYgbCA+IDA6CiAgICAgICAgICAgIGkgPSAwCiAgICAgICAgICAgIHdoaWxlIGwgPiAwIGFuZCBzdHJpbmcuc3RyaXAoIGxpbmVzW2wgLSAxXSApID09ICIiOgogICAgICAgICAgICAgICAgbCA9IGwgLSAxCiAgICAgICAgICAgIHdoaWxlIGkgPCBsIGFuZCBzdHJpbmcuc3RyaXAoIGxpbmVzW2ldICkgPT0gIiI6CiAgICAgICAgICAgICAgICBpID0gaSArIDEKICAgICAgICAgICAgbGluZXMgPSBsaW5lc1tpIDogbF0KICAgICAgICAgICAgbCAgICAgPSBsZW4oIGxpbmVzICkKCiAgICAgICAgIyBhZGQgYSBuZXcgbWFya2VyIG9ubHkgaWYgaXRzIG1hcmtlciBhbmQgaXRzIGNvbnRlbnQgbGlzdAogICAgICAgICMgYXJlIG5vdCBlbXB0eQogICAgICAgICMKICAgICAgICBpZiBsID4gMCBhbmQgbWFya2VyOgogICAgICAgICAgICBjb250ZW50ID0gRG9jQ29udGVudCggbGluZXMgKQogICAgICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZCggKCBzdHJpbmcubG93ZXIoIG1hcmtlciApLCBjb250ZW50ICkgKQoKCiAgICBkZWYgZmluZF9jb250ZW50KCBzZWxmLCBtYXJrZXIgKToKICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLml0ZW1zOgogICAgICAgICAgICBpZiAoIGl0ZW1bMF0gPT0gbWFya2VyICk6CiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVsxXQogICAgICAgIHJldHVybiBOb25lCgoKICAgIGRlZiBodG1sX2FkZHJlc3MoIHNlbGYgKToKICAgICAgICBzZWN0aW9uID0gc2VsZi5zZWN0aW9uCiAgICAgICAgaWYgc2VjdGlvbiBhbmQgc2VjdGlvbi5maWxlbmFtZToKICAgICAgICAgICAgcmV0dXJuIHNlY3Rpb24uZmlsZW5hbWUgKyAnIycgKyBzZWxmLm5hbWUKCiAgICAgICAgcmV0dXJuICIiICAjIHRoaXMgYmxvY2sgaXMgbm90IGluIGEgc2VjdGlvbj8KCgogICAgZGVmIGxvY2F0aW9uKCBzZWxmICk6CiAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW5hbWUgKyAnOicgKyBzdHIoIHNlbGYubGluZW5vICkKCgogICAgZGVmIHByaW50X3dhcm5pbmcoIHNlbGYsIG1lc3NhZ2UgKToKICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiV0FSTklORzoiICsKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvY2F0aW9uKCkgKyAiOiAiICsgbWVzc2FnZSArICdcbicgKQoKCiAgICBkZWYgcHJpbnRfZXJyb3IoIHNlbGYsIG1lc3NhZ2UgKToKICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiRVJST1I6IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2NhdGlvbigpICsgIjogIiArIG1lc3NhZ2UgKyAnXG4nICkKICAgICAgICBzeXMuZXhpdCgpCgoKICAgIGRlZiBkdW1wKCBzZWxmICk6CiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoIGxlbiggc2VsZi5pdGVtcyApICk6CiAgICAgICAgICAgIHByaW50ICJbIiArIHNlbGYuaXRlbXNbaV1bMF0gKyAiXSIKICAgICAgICAgICAgY29udGVudCA9IHNlbGYuaXRlbXNbaV1bMV0KICAgICAgICAgICAgY29udGVudC5kdW1wKCkKCgogICAgZGVmIGR1bXBfaHRtbCggc2VsZiwgaWRlbnRpZmllcnMgPSBOb25lICk6CiAgICAgICAgdHlwZXMgICAgICA9IFsndHlwZScsICdzdHJ1Y3QnLCAnZnVuY3R5cGUnLCAnZnVuY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgJ2NvbnN0YW50JywgJ2VudW0nLCAnbWFjcm8nLCAnc3RydWN0dXJlJywgJ2Fsc28nXQoKICAgICAgICBwYXJhbWV0ZXJzID0gWydpbnB1dCcsICdpbm91dCcsICdvdXRwdXQnLCAncmV0dXJuJ10KCiAgICAgICAgaWYgbm90IHNlbGYuaXRlbXM6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIHN0YXJ0IG9mIGEgYmxvY2sKICAgICAgICAjCiAgICAgICAgcHJpbnQgYmxvY2tfaGVhZGVyCgogICAgICAgICMgcGxhY2UgaHRtbCBhbmNob3IgaWYgbmVlZGVkCiAgICAgICAgIwogICAgICAgIGlmIHNlbGYubmFtZToKICAgICAgICAgICAgcHJpbnQgJzxhIG5hbWU9IicgKyBzZWxmLm5hbWUgKyAnIj4nCiAgICAgICAgICAgIHByaW50ICI8aDQ+IiArIHNlbGYubmFtZSArICI8L2g0PiIKICAgICAgICAgICAgcHJpbnQgIjwvYT4iCgogICAgICAgICMgcHJpbnQgc291cmNlIGNvZGUKICAgICAgICAjCiAgICAgICAgaWYgbm90IHNlbGYuc291cmNlOgogICAgICAgICAgICBwcmludCBibG9ja19mb290ZXIKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGxpbmVzID0gc2VsZi5zb3VyY2UKICAgICAgICBsICAgICA9IGxlbiggbGluZXMgKSAtIDEKICAgICAgICB3aGlsZSBsID49IDAgYW5kIHN0cmluZy5zdHJpcCggbGluZXNbbF0gKSA9PSAiIjoKICAgICAgICAgICAgbCA9IGwgLSAxCiAgICAgICAgcHJpbnQgc291cmNlX2hlYWRlcgogICAgICAgIHByaW50ICIiCiAgICAgICAgZm9yIGxpbmUgaW4gbGluZXNbMCA6IGwrMV06CiAgICAgICAgICAgIHByaW50IGxpbmUKICAgICAgICBwcmludCBzb3VyY2VfZm9vdGVyCgogICAgICAgIGluX3RhYmxlID0gMAoKICAgICAgICAjIGR1bXAgZWFjaCAobWFya2VyLGNvbnRlbnQpIGVsZW1lbnQKICAgICAgICAjCiAgICAgICAgZm9yIGVsZW1lbnQgaW4gc2VsZi5pdGVtczoKICAgICAgICAgICAgbWFya2VyICA9IGVsZW1lbnRbMF0KICAgICAgICAgICAgY29udGVudCA9IGVsZW1lbnRbMV0KCiAgICAgICAgICAgIGlmIG1hcmtlciA9PSAiZGVzY3JpcHRpb24iOgogICAgICAgICAgICAgICAgcHJpbnQgZGVzY3JpcHRpb25faGVhZGVyCiAgICAgICAgICAgICAgICBjb250ZW50LmR1bXBfaHRtbCggaWRlbnRpZmllcnMgKQogICAgICAgICAgICAgICAgcHJpbnQgZGVzY3JpcHRpb25fZm9vdGVyCgogICAgICAgICAgICBlbGlmIG5vdCAoIG1hcmtlciBpbiB0eXBlcyApOgogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggbWFya2VyX2hlYWRlciApCiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCBtYXJrZXIgKQogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggbWFya2VyX2ludGVyICsgJ1xuJyApCiAgICAgICAgICAgICAgICBjb250ZW50LmR1bXBfaHRtbCggaWRlbnRpZmllcnMgKQogICAgICAgICAgICAgICAgcHJpbnQgbWFya2VyX2Zvb3RlcgoKICAgICAgICBwcmludCAiIgoKICAgICAgICBwcmludCBibG9ja19mb290ZXIKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIwojIFRoZSBEb2NTZWN0aW9uIGNsYXNzIGlzIHVzZWQgdG8gc3RvcmUgYSBnaXZlbiBkb2N1bWVudGF0aW9uIHNlY3Rpb24uCiMKIyBFYWNoIHNlY3Rpb24gaXMgbWFkZSBvZiBhbiBpZGVudGlmaWVyLCBhbiBhYnN0cmFjdCBhbmQgYSBkZXNjcmlwdGlvbi4KIwojIEZvciBleGFtcGxlLCBsb29rIGF0OgojCiMgICA8U2VjdGlvbj4gQmFzaWNfRGF0YV9UeXBlcwojCiMgICA8VGl0bGU+IEZyZWVUeXBlIDIgQmFzaWMgRGF0YSBUeXBlcwojCiMgICA8QWJzdHJhY3Q+CiMgICAgICBEZWZpbml0aW9ucyBvZiBiYXNpYyBGcmVlVHlwZSBkYXRhIHR5cGVzCiMKIyAgIDxEZXNjcmlwdGlvbj4KIyAgICAgIEZyZWVUeXBlIGRlZmluZXMgc2V2ZXJhbCBiYXNpYyBkYXRhIHR5cGVzIGZvciBhbGwgaXRzCiMgICAgICBvcGVyYXRpb25zLi4uCiMKY2xhc3MgRG9jU2VjdGlvbjoKCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGJsb2NrICk6CiAgICAgICAgc2VsZi5ibG9jayAgICAgICA9IGJsb2NrCiAgICAgICAgc2VsZi5uYW1lICAgICAgICA9IHN0cmluZy5sb3dlciggYmxvY2submFtZSApCiAgICAgICAgc2VsZi5hYnN0cmFjdCAgICA9IGJsb2NrLmZpbmRfY29udGVudCggImFic3RyYWN0IiApCiAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9IGJsb2NrLmZpbmRfY29udGVudCggImRlc2NyaXB0aW9uIiApCiAgICAgICAgc2VsZi5lbGVtZW50cyAgICA9IHt9CiAgICAgICAgc2VsZi5saXN0ICAgICAgICA9IFtdCiAgICAgICAgc2VsZi5maWxlbmFtZSAgICA9IHNlbGYubmFtZSArICIuaHRtbCIKICAgICAgICBzZWxmLmNoYXB0ZXIgICAgID0gTm9uZQoKICAgICAgICAjIHN5cy5zdGRlcnIud3JpdGUoICJuZXcgc2VjdGlvbiAnIiArIHNlbGYubmFtZSArICInIiApCgoKICAgIGRlZiBhZGRfZWxlbWVudCggc2VsZiwgYmxvY2sgKToKICAgICAgICAjIGNoZWNrIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIGR1cGxpY2F0ZSBlbGVtZW50IGluIHRoaXMKICAgICAgICAjIHNlY3Rpb24KICAgICAgICAjCiAgICAgICAgaWYgc2VsZi5lbGVtZW50cy5oYXNfa2V5KCBibG9jay5uYW1lICk6CiAgICAgICAgICAgIGJsb2NrLnByaW50X2Vycm9yKCAiZHVwbGljYXRlIGVsZW1lbnQgZGVmaW5pdGlvbiBmb3IgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyIgKyBibG9jay5uYW1lICsgIicgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gc2VjdGlvbiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIiArIHNlbGYubmFtZSArICInXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmV2aW91cyBkZWZpbml0aW9uIGluICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiciICsgc2VsZi5lbGVtZW50c1tibG9jay5uYW1lXS5sb2NhdGlvbigpICsgIiciICkKCiAgICAgICAgc2VsZi5lbGVtZW50c1tibG9jay5uYW1lXSA9IGJsb2NrCiAgICAgICAgc2VsZi5saXN0LmFwcGVuZCggYmxvY2sgKQoKCiAgICBkZWYgcHJpbnRfd2FybmluZyggc2VsZiwgbWVzc2FnZSApOgogICAgICAgIHNlbGYuYmxvY2sucHJpbnRfd2FybmluZyggbWVzc2FnZSApCgoKICAgIGRlZiBwcmludF9lcnJvciggc2VsZiwgbWVzc2FnZSApOgogICAgICAgIHNlbGYuYmxvY2sucHJpbnRfZXJyb3IoIG1lc3NhZ2UgKQoKCiAgICBkZWYgZHVtcF9odG1sKCBzZWxmLCBpZGVudGlmaWVycyA9IE5vbmUgKToKICAgICAgICAiIiJtYWtlIGFuIEhUTUwgcGFnZSBmcm9tIGEgZ2l2ZW4gRG9jU2VjdGlvbiIiIgoKICAgICAgICAjIHByaW50IEhUTUwgaGVhZGVyCiAgICAgICAgIwogICAgICAgIHByaW50IGh0bWxfaGVhZGVyCgogICAgICAgICMgcHJpbnQgdGl0bGUKICAgICAgICAjCiAgICAgICAgcHJpbnQgc2VjdGlvbl90aXRsZV9oZWFkZXIKICAgICAgICBwcmludCBzZWxmLnRpdGxlCiAgICAgICAgcHJpbnQgc2VjdGlvbl90aXRsZV9mb290ZXIKCiAgICAgICAgIyBwcmludCBkZXNjcmlwdGlvbgogICAgICAgICMKICAgICAgICBwcmludCBibG9ja19oZWFkZXIKICAgICAgICBzZWxmLmRlc2NyaXB0aW9uLmR1bXBfaHRtbCggaWRlbnRpZmllcnMgKQogICAgICAgIHByaW50IGJsb2NrX2Zvb3RlcgoKICAgICAgICAjIHByaW50IGVsZW1lbnRzCiAgICAgICAgIwogICAgICAgIGZvciBlbGVtZW50IGluIHNlbGYubGlzdDoKICAgICAgICAgICAgZWxlbWVudC5kdW1wX2h0bWwoIGlkZW50aWZpZXJzICkKCiAgICAgICAgcHJpbnQgaHRtbF9mb290ZXIKCgpjbGFzcyBEb2NTZWN0aW9uTGlzdDoKCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToKICAgICAgICBzZWxmLnNlY3Rpb25zICAgICAgICA9IHt9ICAgICMgbWFwIHNlY3Rpb24gbmFtZXMgdG8gc2VjdGlvbiBvYmplY3RzCiAgICAgICAgc2VsZi5saXN0ICAgICAgICAgICAgPSBbXSAgICAjIGxpc3Qgb2Ygc2VjdGlvbnMgKGluIGNyZWF0aW9uIG9yZGVyKQogICAgICAgIHNlbGYuY3VycmVudF9zZWN0aW9uID0gTm9uZSAgIyBjdXJyZW50IHNlY3Rpb24KICAgICAgICBzZWxmLmlkZW50aWZpZXJzICAgICA9IHt9ICAgICMgbWFwIGlkZW50aWZpZXJzIHRvIGJsb2NrcwoKCiAgICBkZWYgYXBwZW5kX3NlY3Rpb24oIHNlbGYsIGJsb2NrICk6CiAgICAgICAgbmFtZSAgICAgPSBzdHJpbmcubG93ZXIoIGJsb2NrLm5hbWUgKQogICAgICAgIGFic3RyYWN0ID0gYmxvY2suZmluZF9jb250ZW50KCAiYWJzdHJhY3QiICkKCiAgICAgICAgaWYgc2VsZi5zZWN0aW9ucy5oYXNfa2V5KCBuYW1lICk6CiAgICAgICAgICAgICMgVGhlcmUgaXMgYWxyZWFkeSBhIHNlY3Rpb24gd2l0aCB0aGlzIG5hbWUgaW4gb3VyIGxpc3QuICBXZQogICAgICAgICAgICAjIHdpbGwgdHJ5IHRvIGNvbXBsZXRlIGl0LgogICAgICAgICAgICAjCiAgICAgICAgICAgIHNlY3Rpb24gPSBzZWxmLnNlY3Rpb25zW25hbWVdCiAgICAgICAgICAgIGlmIHNlY3Rpb24uYWJzdHJhY3Q6CiAgICAgICAgICAgICAgICAjIFRoaXMgc2VjdGlvbiBhbHJlYWR5IGhhcyBhbiBhYnN0cmFjdCBkZWZpbmVkOyBzaW1wbHkgY2hlY2sKICAgICAgICAgICAgICAgICMgdGhhdCB0aGUgbmV3IHNlY3Rpb24gZG9lc24ndCBwcm92aWRlIGEgbmV3IG9uZS4KICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgIGlmIGFic3RyYWN0OgogICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYmxvY2sucHJpbnRfZXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAiZHVwbGljYXRlIHNlY3Rpb24gZGVmaW5pdGlvbiBmb3IgIiArCiAgICAgICAgICAgICAgICAgICAgICAiJyIgKyBuYW1lICsgIidcbiIgKwogICAgICAgICAgICAgICAgICAgICAgInByZXZpb3VzIGRlZmluaXRpb24gaW4gIiArCiAgICAgICAgICAgICAgICAgICAgICAiJyIgKyBzZWN0aW9uLmJsb2NrLmxvY2F0aW9uKCkgKyAiJ1xuIiArCiAgICAgICAgICAgICAgICAgICAgICAic2Vjb25kIGRlZmluaXRpb24gaW4gIiArCiAgICAgICAgICAgICAgICAgICAgICAiJyIgKyBibG9jay5sb2NhdGlvbigpICsgIiciICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgVGhlIG9sZCBzZWN0aW9uIGRpZG4ndCBjb250YWluIGFuIGFic3RyYWN0OyB3ZSBhcmUgbm93CiAgICAgICAgICAgICAgICAjIGdvaW5nIHRvIHJlcGxhY2UgaXQuCiAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICBzZWN0aW9uLmFic3RyYWN0ICAgID0gYWJzdHJhY3QKICAgICAgICAgICAgICAgIHNlY3Rpb24uZGVzY3JpcHRpb24gPSBibG9jay5maW5kX2NvbnRlbnQoICJkZXNjcmlwdGlvbiIgKQogICAgICAgICAgICAgICAgc2VjdGlvbi5ibG9jayAgICAgICA9IGJsb2NrCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgYSBuZXcgc2VjdGlvbgogICAgICAgICAgICAjCiAgICAgICAgICAgIHNlY3Rpb24gPSBEb2NTZWN0aW9uKCBibG9jayApCiAgICAgICAgICAgIHNlbGYuc2VjdGlvbnNbbmFtZV0gPSBzZWN0aW9uCiAgICAgICAgICAgIHNlbGYubGlzdC5hcHBlbmQoIHNlY3Rpb24gKQoKICAgICAgICBzZWxmLmN1cnJlbnRfc2VjdGlvbiA9IHNlY3Rpb24KCgogICAgZGVmIGFwcGVuZF9ibG9jayggc2VsZiwgYmxvY2sgKToKICAgICAgICBpZiBibG9jay5uYW1lOgogICAgICAgICAgICBzZWN0aW9uID0gYmxvY2suZmluZF9jb250ZW50KCAic2VjdGlvbiIgKQogICAgICAgICAgICBpZiBzZWN0aW9uOgogICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRfc2VjdGlvbiggYmxvY2sgKQoKICAgICAgICAgICAgZWxpZiBzZWxmLmN1cnJlbnRfc2VjdGlvbjoKICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudF9zZWN0aW9uLmFkZF9lbGVtZW50KCBibG9jayApCiAgICAgICAgICAgICAgICBibG9jay5zZWN0aW9uICAgICAgICAgICAgICAgID0gc2VsZi5jdXJyZW50X3NlY3Rpb24KICAgICAgICAgICAgICAgIHNlbGYuaWRlbnRpZmllcnNbYmxvY2submFtZV0gPSBibG9jawoKCiAgICBkZWYgcHJlcGFyZV9maWxlcyggc2VsZiwgZmlsZV9wcmVmaXggPSBOb25lICk6CiAgICAgICAgIyBwcmVwYXJlIHRoZSBzZWN0aW9uIGxpc3QsIGJ5IGNvbXB1dGluZyBzZWN0aW9uIGZpbGVuYW1lcyBhbmQgdGhlCiAgICAgICAgIyBpbmRleAogICAgICAgICMKICAgICAgICBpZiBmaWxlX3ByZWZpeDoKICAgICAgICAgICAgcHJlZml4ID0gZmlsZV9wcmVmaXggKyAiLSIKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmVmaXggPSAiIgoKICAgICAgICAjIGNvbXB1dGUgc2VjdGlvbiBuYW1lcwogICAgICAgICMKICAgICAgICBmb3Igc2VjdGlvbiBpbiBzZWxmLnNlY3Rpb25zLnZhbHVlcygpOgogICAgICAgICAgICB0aXRsZV9jb250ZW50ICAgICA9IHNlY3Rpb24uYmxvY2suZmluZF9jb250ZW50KCAidGl0bGUiICkKICAgICAgICAgICAgaWYgdGl0bGVfY29udGVudDoKICAgICAgICAgICAgICAgIHNlY3Rpb24udGl0bGUgPSB0aXRsZV9jb250ZW50LmdldF90aXRsZSgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWN0aW9uLnRpdGxlID0gIlVOS05PV05fU0VDVElPTl9USVRMRSEiCgoKICAgICAgICAjIHNvcnQgc2VjdGlvbiBlbGVtZW50cyBhY2NvcmRpbmcgdG8gdGhlIDxvcmRlcj4gbWFya2VyIGlmIGF2YWlsYWJsZQogICAgICAgICMKICAgICAgICBmb3Igc2VjdGlvbiBpbiBzZWxmLnNlY3Rpb25zLnZhbHVlcygpOgogICAgICAgICAgICBvcmRlciA9IHNlY3Rpb24uYmxvY2suZmluZF9jb250ZW50KCAib3JkZXIiICkKICAgICAgICAgICAgaWYgb3JkZXI6CiAgICAgICAgICAgICAgICAjIHN5cy5zdGRlcnIud3JpdGUoICI8b3JkZXI+IGZvdW5kIGF0ICIKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgKyBzZWN0aW9uLmJsb2NrLmxvY2F0aW9uKCkgKyAnXG4nICkKICAgICAgICAgICAgICAgIG9yZGVyX2xpc3QgPSBbXQogICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gb3JkZXIuaXRlbXM6CiAgICAgICAgICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlbVsxXToKICAgICAgICAgICAgICAgICAgICAgICAgd29yZHMgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRzID0gZWxlbWVudC5nZXRfd29yZHMoKQogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLmJsb2NrLnByaW50X3dhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGNvbnRlbnQgaW4gPG9yZGVyPiBtYXJrZXJcbiIgKQogICAgICAgICAgICAgICAgICAgICAgICBpZiB3b3JkczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB3b3JkIGluIHdvcmRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gc2VsZi5pZGVudGlmaWVycy5nZXQoIHdvcmQgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJsb2NrOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBibG9jay5zZWN0aW9uID09IHNlY3Rpb246CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcl9saXN0LmFwcGVuZCggYmxvY2sgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5ibG9jay5wcmludF93YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCByZWZlcmVuY2UgdG8gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIiArIHdvcmQgKyAiJyAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmluZWQgaW4gb3RoZXIgc2VjdGlvbiIgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYmxvY2sucHJpbnRfd2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCByZWZlcmVuY2UgdG8gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiciICsgd29yZCArICInIiApCgogICAgICAgICAgICAgICAgIyBub3cgc29ydCB0aGUgbGlzdCBvZiBibG9ja3MgYWNjb3JkaW5nIHRvIHRoZSBvcmRlciBsaXN0CiAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICBuZXdfbGlzdCA9IG9yZGVyX2xpc3RbOl0KICAgICAgICAgICAgICAgIGZvciBibG9jayBpbiBzZWN0aW9uLmxpc3Q6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGJsb2NrIGluIG9yZGVyX2xpc3Q6CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19saXN0LmFwcGVuZCggYmxvY2sgKQoKICAgICAgICAgICAgICAgIHNlY3Rpb24ubGlzdCA9IG5ld19saXN0CgogICAgICAgICMgY29tcHV0ZSBzZWN0aW9uIGZpbGVuYW1lcwogICAgICAgICMKICAgICAgICBmb3Igc2VjdGlvbiBpbiBzZWxmLnNlY3Rpb25zLnZhbHVlcygpOgogICAgICAgICAgICBzZWN0aW9uLmZpbGVuYW1lID0gcHJlZml4ICsgc2VjdGlvbi5uYW1lICsgIi5odG1sIgoKICAgICAgICBzZWxmLnRvY19maWxlbmFtZSAgID0gcHJlZml4ICsgInRvYy5odG1sIgogICAgICAgIHNlbGYuaW5kZXhfZmlsZW5hbWUgPSBwcmVmaXggKyAiaW5kZXguaHRtbCIKCiAgICAgICAgIyBjb21wdXRlIHRoZSBzb3J0ZWQgbGlzdCBvZiBpZGVudGlmaWVycyBmb3IgdGhlIGluZGV4CiAgICAgICAgIwogICAgICAgIHNlbGYuaW5kZXggPSBzZWxmLmlkZW50aWZpZXJzLmtleXMoKQogICAgICAgIHNlbGYuaW5kZXguc29ydCggaW5kZXhfc29ydCApCgoKICAgIGRlZiBkdW1wX2h0bWxfc2VjdGlvbnMoIHNlbGYgKToKICAgICAgICBmb3Igc2VjdGlvbiBpbiBzZWxmLnNlY3Rpb25zLnZhbHVlcygpOgogICAgICAgICAgICBpZiBzZWN0aW9uLmZpbGVuYW1lOgogICAgICAgICAgICAgICAgb3V0cHV0ID0gb3Blbl9vdXRwdXQoIHNlY3Rpb24uZmlsZW5hbWUgKQoKICAgICAgICAgICAgICAgIHNlY3Rpb24uZHVtcF9odG1sKCBzZWxmLmlkZW50aWZpZXJzICkKCiAgICAgICAgICAgICAgICBjbG9zZV9vdXRwdXQoIG91dHB1dCApCgoKICAgIGRlZiBkdW1wX2h0bWxfaW5kZXgoIHNlbGYgKToKICAgICAgICBvdXRwdXQgPSBvcGVuX291dHB1dCggc2VsZi5pbmRleF9maWxlbmFtZSApCgogICAgICAgIG51bV9jb2x1bW5zID0gMwogICAgICAgIHRvdGFsICAgICAgID0gbGVuKCBzZWxmLmluZGV4ICkKICAgICAgICBsaW5lICAgICAgICA9IDAKCiAgICAgICAgcHJpbnQgaHRtbF9oZWFkZXIKICAgICAgICBwcmludCAiPGNlbnRlcj48aDE+R2VuZXJhbCBJbmRleDwvaDE+PC9jZW50ZXI+IgogICAgICAgIHByaW50ICI8Y2VudGVyPjx0YWJsZSBjZWxscGFkZGluZz01Pjx0ciB2YWxpZ249dG9wPjx0ZD4iCgogICAgICAgIGZvciBpZGVudCBpbiBzZWxmLmluZGV4OgogICAgICAgICAgICBibG9jayA9IHNlbGYuaWRlbnRpZmllcnNbaWRlbnRdCiAgICAgICAgICAgIGlmIGJsb2NrOgogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggJzxhIGhyZWY9IicgKyBibG9jay5odG1sX2FkZHJlc3MoKSArICciPicgKQogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggYmxvY2submFtZSApCiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCAnPC9hPjxicj4nICsgJ1xuJyApCgogICAgICAgICAgICAgICAgaWYgbGluZSAqIG51bV9jb2x1bW5zID49IHRvdGFsOgogICAgICAgICAgICAgICAgICAgIHByaW50ICI8L3RkPjx0ZD4iCiAgICAgICAgICAgICAgICAgICAgbGluZSA9IDAKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUgKyAxCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiaWRlbnRpZmllciAnIiArIGlkZW50ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIGhhcyBubyBkZWZpbml0aW9uIiArICdcbicgKQoKICAgICAgICBwcmludCAiPC90cj48L3RhYmxlPjwvY2VudGVyPiIKICAgICAgICBwcmludCBodG1sX2Zvb3RlcgoKICAgICAgICBjbG9zZV9vdXRwdXQoIG91dHB1dCApCgoKCiMgRmlsdGVyIGEgZ2l2ZW4gbGlzdCBvZiBEb2NCbG9ja3MuICBSZXR1cm5zIGEgbmV3IGxpc3Qgb2YgRG9jQmxvY2sgb2JqZWN0cwojIHRoYXQgb25seSBjb250YWlucyBlbGVtZW50IHdob3NlICJ0eXBlIiAoaS5lLiBmaXJzdCBtYXJrZXIpIGlzIGluIHRoZQojICJ0eXBlcyIgcGFyYW1ldGVyLgojCmNsYXNzIERvY0NoYXB0ZXI6CgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBibG9jayApOgogICAgICAgIHNlbGYuc2VjdGlvbnNfbmFtZXMgPSBbXSAgICAjIG9yZGVyZWQgbGlzdCBvZiBzZWN0aW9uIG5hbWVzCiAgICAgICAgc2VsZi5zZWN0aW9ucyAgICAgICA9IFtdICAgICMgb3JkZXJlZCBsaXN0IG9mIERvY1NlY3Rpb24gb2JqZWN0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvciB0aGlzIGNoYXB0ZXIKICAgICAgICBzZWxmLmJsb2NrICAgICAgICAgID0gYmxvY2sKCiAgICAgICAgIyBsb29rIGZvciBjaGFwdGVyIHRpdGxlCiAgICAgICAgY29udGVudCA9IGJsb2NrLmZpbmRfY29udGVudCggInRpdGxlIiApCiAgICAgICAgaWYgY29udGVudDoKICAgICAgICAgICAgc2VsZi50aXRsZSA9IGNvbnRlbnQuZ2V0X3RpdGxlKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRpdGxlID0gIlVOS05PV04gQ0hBUFRFUiBUSVRMRSIKCiAgICAgICAgIyBsb29rIGZvciBzZWN0aW9uIGxpc3QKICAgICAgICBjb250ZW50ID0gYmxvY2suZmluZF9jb250ZW50KCAic2VjdGlvbnMiICkKICAgICAgICBpZiBub3QgY29udGVudDoKICAgICAgICAgICAgYmxvY2sucHJpbnRfZXJyb3IoICJjaGFwdGVyIGhhcyBubyA8c2VjdGlvbnM+IGNvbnRlbnQiICkKCiAgICAgICAgIyBjb21wdXRlIGxpc3Qgb2Ygc2VjdGlvbiBuYW1lcwogICAgICAgIHNsaXN0ID0gW10KICAgICAgICBmb3IgaXRlbSBpbiBjb250ZW50Lml0ZW1zOgogICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVtWzFdOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHdvcmRzICAgICAgICA9IGVsZW1lbnQuZ2V0X3dvcmRzKCkKICAgICAgICAgICAgICAgICAgICBsICAgICAgICAgICAgPSBsZW4oIHNsaXN0ICkKICAgICAgICAgICAgICAgICAgICBzbGlzdFtsIDogbF0gPSB3b3JkcwogICAgICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgICAgIGJsb2NrLnByaW50X3dhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBjb250ZW50IGluIDxzZWN0aW9ucz4gbWFya2VyIiApCgogICAgICAgIHNlbGYuc2VjdGlvbl9uYW1lcyA9IHNsaXN0CgoKY2xhc3MgRG9jRG9jdW1lbnQ6CgogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6CiAgICAgICAgc2VsZi5zZWN0aW9uX2xpc3QgID0gRG9jU2VjdGlvbkxpc3QoKSAgICMgc2VjdGlvbiBsaXN0IG9iamVjdAogICAgICAgIHNlbGYuY2hhcHRlcnMgICAgICA9IFtdICAgICAgICAgICAgICAgICAjIGxpc3Qgb2YgY2hhcHRlcnMKICAgICAgICBzZWxmLmxvc3Rfc2VjdGlvbnMgPSBbXSAgICAgICAgICAgICAgICAgIyBsaXN0IG9mIHNlY3Rpb25zIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBjaGFwdGVyCgogICAgZGVmIGFwcGVuZF9ibG9jayggc2VsZiwgYmxvY2sgKToKICAgICAgICBpZiBibG9jay5uYW1lOgogICAgICAgICAgICBjb250ZW50ID0gYmxvY2suZmluZF9jb250ZW50KCAiY2hhcHRlciIgKQogICAgICAgICAgICBpZiBjb250ZW50OgogICAgICAgICAgICAgICAgIyBhIGNoYXB0ZXIgZGVmaW5pdGlvbiAtLSBhZGQgaXQgdG8gb3VyIGxpc3QKICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgIGNoYXB0ZXIgPSBEb2NDaGFwdGVyKCBibG9jayApCiAgICAgICAgICAgICAgICBzZWxmLmNoYXB0ZXJzLmFwcGVuZCggY2hhcHRlciApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnNlY3Rpb25fbGlzdC5hcHBlbmRfYmxvY2soIGJsb2NrICkKCgogICAgZGVmIHByZXBhcmVfY2hhcHRlcnMoIHNlbGYgKToKICAgICAgICAjIGNoZWNrIHNlY3Rpb24gbmFtZXMKICAgICAgICAjCiAgICAgICAgZm9yIGNoYXB0ZXIgaW4gc2VsZi5jaGFwdGVyczoKICAgICAgICAgICAgc2xpc3QgPSBbXQogICAgICAgICAgICBmb3IgbmFtZSBpbiBjaGFwdGVyLnNlY3Rpb25fbmFtZXM6CiAgICAgICAgICAgICAgICAgc2VjdGlvbiA9IHNlbGYuc2VjdGlvbl9saXN0LnNlY3Rpb25zLmdldCggbmFtZSApCiAgICAgICAgICAgICAgICAgaWYgbm90IHNlY3Rpb246CiAgICAgICAgICAgICAgICAgICAgIGNoYXB0ZXIuYmxvY2sucHJpbnRfd2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCByZWZlcmVuY2UgdG8gdW5rbm93biBzZWN0aW9uICciICsgbmFtZSArICInIiApCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5jaGFwdGVyID0gY2hhcHRlcgogICAgICAgICAgICAgICAgICAgICBzbGlzdC5hcHBlbmQoIHNlY3Rpb24gKQoKICAgICAgICAgICAgY2hhcHRlci5zZWN0aW9ucyA9IHNsaXN0CgogICAgICAgIGZvciBzZWN0aW9uIGluIHNlbGYuc2VjdGlvbl9saXN0Lmxpc3Q6CiAgICAgICAgICAgIGlmIG5vdCBzZWN0aW9uLmNoYXB0ZXI6CiAgICAgICAgICAgICAgICBzZWN0aW9uLmJsb2NrLnByaW50X3dhcm5pbmcoCiAgICAgICAgICAgICAgICAgICJzZWN0aW9uICciICsgc2VjdGlvbi5uYW1lICsgIicgaXMgbm90IGluIGFueSBjaGFwdGVyIiApCiAgICAgICAgICAgICAgICBzZWxmLmxvc3Rfc2VjdGlvbnMuYXBwZW5kKCBzZWN0aW9uICkKCgogICAgZGVmIHByZXBhcmVfZmlsZXMoIHNlbGYsIGZpbGVfcHJlZml4ID0gTm9uZSApOgogICAgICAgIHNlbGYuc2VjdGlvbl9saXN0LnByZXBhcmVfZmlsZXMoIGZpbGVfcHJlZml4ICkKICAgICAgICBzZWxmLnByZXBhcmVfY2hhcHRlcnMoKQoKCiAgICBkZWYgZHVtcF90b2NfaHRtbCggc2VsZiApOgogICAgICAgICMgZHVtcCBhbiBodG1sIHRhYmxlIG9mIGNvbnRlbnRzCiAgICAgICAgIwogICAgICAgIG91dHB1dCA9IG9wZW5fb3V0cHV0KCBzZWxmLnNlY3Rpb25fbGlzdC50b2NfZmlsZW5hbWUgKQoKICAgICAgICBwcmludCBodG1sX2hlYWRlcgoKICAgICAgICBwcmludCAiPGNlbnRlcj48aDE+VGFibGUgb2YgQ29udGVudHM8L2gxPjwvY2VudGVyPiIKCiAgICAgICAgZm9yIGNoYXB0ZXIgaW4gc2VsZi5jaGFwdGVyczoKICAgICAgICAgICAgcHJpbnQgY2hhcHRlcl9oZWFkZXIgKyBjaGFwdGVyLnRpdGxlICsgY2hhcHRlcl9pbnRlcgoKICAgICAgICAgICAgcHJpbnQgIjx0YWJsZSBjZWxscGFkZGluZz01PiIKICAgICAgICAgICAgZm9yIHNlY3Rpb24gaW4gY2hhcHRlci5zZWN0aW9uczoKICAgICAgICAgICAgICAgIGlmIHNlY3Rpb24uYWJzdHJhY3Q6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgIjx0ciB2YWxpZ249dG9wPjx0ZD4iCiAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggJzxhIGhyZWY9IicgKyBzZWN0aW9uLmZpbGVuYW1lICsgJyI+JyApCiAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggc2VjdGlvbi50aXRsZSApCiAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggIjwvYT48L3RkPjx0ZD4iICsgJ1xuJyApCiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5hYnN0cmFjdC5kdW1wX2h0bWwoIHNlbGYuc2VjdGlvbl9saXN0LmlkZW50aWZpZXJzICkKICAgICAgICAgICAgICAgICAgICBwcmludCAiPC90ZD48L3RyPiIKCiAgICAgICAgICAgIHByaW50ICI8L3RhYmxlPiIKCiAgICAgICAgICAgIHByaW50IGNoYXB0ZXJfZm9vdGVyCgogICAgICAgICMgbGlzdCBsb3N0IHNlY3Rpb25zCiAgICAgICAgIwogICAgICAgIGlmIHNlbGYubG9zdF9zZWN0aW9uczoKICAgICAgICAgICAgcHJpbnQgY2hhcHRlcl9oZWFkZXIgKyAiT1RIRVIgU0VDVElPTlM6IiArIGNoYXB0ZXJfaW50ZXIKCiAgICAgICAgICAgIHByaW50ICI8dGFibGUgY2VsbHBhZGRpbmc9NT4iCiAgICAgICAgICAgIGZvciBzZWN0aW9uIGluIHNlbGYubG9zdF9zZWN0aW9uczoKICAgICAgICAgICAgICAgIGlmIHNlY3Rpb24uYWJzdHJhY3Q6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgIjx0ciB2YWxpZ249dG9wPjx0ZD4iCiAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggJzxhIGhyZWY9IicgKyBzZWN0aW9uLmZpbGVuYW1lICsgJyI+JyApCiAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggc2VjdGlvbi50aXRsZSApCiAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggIjwvYT48L3RkPjx0ZD4iICsgJ1xuJyApCiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5hYnN0cmFjdC5kdW1wX2h0bWwoIHNlbGYuc2VjdGlvbl9saXN0LmlkZW50aWZpZXJzICkKICAgICAgICAgICAgICAgICAgICBwcmludCAiPC90ZD48L3RyPiIKCiAgICAgICAgICAgIHByaW50ICI8L3RhYmxlPiIKCiAgICAgICAgICAgIHByaW50IGNoYXB0ZXJfZm9vdGVyCgogICAgICAgICMgaW5kZXgKICAgICAgICAjCiAgICAgICAgcHJpbnQgY2hhcHRlcl9oZWFkZXIgKyAnPGEgaHJlZj0iJyArIHNlbGYuc2VjdGlvbl9saXN0LmluZGV4X2ZpbGVuYW1lICsgJyI+SW5kZXg8L2E+JyArIGNoYXB0ZXJfZm9vdGVyCgogICAgICAgIHByaW50IGh0bWxfZm9vdGVyCgogICAgICAgIGNsb3NlX291dHB1dCggb3V0cHV0ICkKCgogICAgZGVmIGR1bXBfaW5kZXhfaHRtbCggc2VsZiApOgogICAgICAgIHNlbGYuc2VjdGlvbl9saXN0LmR1bXBfaHRtbF9pbmRleCgpCgoKICAgIGRlZiBkdW1wX3NlY3Rpb25zX2h0bWwoIHNlbGYgKToKICAgICAgICBzZWxmLnNlY3Rpb25fbGlzdC5kdW1wX2h0bWxfc2VjdGlvbnMoKQoKCmRlZiBmaWx0ZXJfYmxvY2tzX2J5X3R5cGUoIGJsb2NrX2xpc3QsIHR5cGVzICk6CiAgICBuZXdfbGlzdCA9IFtdCiAgICBmb3IgYmxvY2sgaW4gYmxvY2tfbGlzdDoKICAgICAgICBpZiBibG9jay5pdGVtczoKICAgICAgICAgICAgZWxlbWVudCA9IGJsb2NrLml0ZW1zWzBdCiAgICAgICAgICAgIG1hcmtlciAgPSBlbGVtZW50WzBdCiAgICAgICAgICAgIGlmIG1hcmtlciBpbiB0eXBlczoKICAgICAgICAgICAgICAgIG5ld19saXN0LmFwcGVuZCggYmxvY2sgKQoKICAgIHJldHVybiBuZXdfbGlzdAoKCmRlZiBmaWx0ZXJfc2VjdGlvbl9ibG9ja3MoIGJsb2NrICk6CiAgICByZXR1cm4gYmxvY2suc2VjdGlvbiAhPSBOb25lCgoKIyBQZXJmb3JtIGEgbGV4aWNvZ3JhcGhpY2FsIGNvbXBhcmlzb24gb2YgdHdvIERvY0Jsb2NrIG9iamVjdHMuICBSZXR1cm5zIC0xLAojIDAgb3IgMS4KIwpkZWYgYmxvY2tfbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoIGIxLCBiMiApOgogICAgaWYgbm90IGIxLm5hbWU6CiAgICAgICAgcmV0dXJuIC0xCiAgICBpZiBub3QgYjIubmFtZToKICAgICAgICByZXR1cm4gMQoKICAgIGlkMSA9IHN0cmluZy5sb3dlciggYjEubmFtZSApCiAgICBpZDIgPSBzdHJpbmcubG93ZXIoIGIyLm5hbWUgKQoKICAgIGlmIGlkMSA8IGlkMjoKICAgICAgICByZXR1cm4gLTEKICAgIGVsaWYgaWQxID09IGlkMjoKICAgICAgICByZXR1cm4gMAogICAgZWxzZToKICAgICAgICByZXR1cm4gMQoKCiMgRHVtcCBhIGxpc3QgYmxvY2sgYXMgYSBzaW5nbGUgSFRNTCBwYWdlLgojCmRlZiBkdW1wX2h0bWxfMSggYmxvY2tfbGlzdCApOgogICAgcHJpbnQgaHRtbF9oZWFkZXIKCiAgICBmb3IgYmxvY2sgaW4gYmxvY2tfbGlzdDoKICAgICAgICBibG9jay5kdW1wX2h0bWwoKQoKICAgIHByaW50IGh0bWxfZm9vdGVyCgoKZGVmIGZpbGVfZXhpc3RzKCBwYXRobmFtZSApOgogICAgcmVzdWx0ID0gMQogICAgdHJ5OgogICAgICAgIGZpbGUgPSBvcGVuKCBwYXRobmFtZSwgInIiICkKICAgICAgICBmaWxlLmNsb3NlKCkKICAgIGV4Y2VwdDoKICAgICAgICByZXN1bHQgPSBOb25lCgogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBhZGRfbmV3X2Jsb2NrKCBsaXN0LCBmaWxlbmFtZSwgbGluZW5vLCBibG9ja19saW5lcywgc291cmNlX2xpbmVzICk6CiAgICAiIiJhZGQgYSBuZXcgYmxvY2sgdG8gdGhlIGxpc3QiIiIKICAgIGJsb2NrICAgICAgICAgID0gRG9jQmxvY2soIGJsb2NrX2xpbmVzLCBzb3VyY2VfbGluZXMgKQogICAgYmxvY2suZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgYmxvY2subGluZW5vICAgPSBsaW5lbm8KICAgIGxpc3QuYXBwZW5kKCBibG9jayApCgoKZGVmIG1ha2VfYmxvY2tfbGlzdCggYXJncyA9IE5vbmUgKToKICAgICIiInBhcnNlIGEgZmlsZSBhbmQgZXh0cmFjdCBjb21tZW50cyBibG9ja3MgZnJvbSBpdCIiIgoKICAgIGZpbGVfbGlzdCA9IFtdCiAgICAjIHN5cy5zdGRlcnIud3JpdGUoIHJlcHIoIHN5cy5hcmd2WzEgOl0gKSArICdcbicgKQoKICAgIGlmIG5vdCBhcmdzOgogICAgICAgIGFyZ3MgPSBzeXMuYXJndlsxIDpdCgogICAgZm9yIHBhdGhuYW1lIGluIGFyZ3M6CiAgICAgICAgaWYgc3RyaW5nLmZpbmQoIHBhdGhuYW1lLCAnKicgKSA+PSAwOgogICAgICAgICAgICBuZXdwYXRoID0gZ2xvYi5nbG9iKCBwYXRobmFtZSApCiAgICAgICAgICAgIG5ld3BhdGguc29ydCgpICAjIHNvcnQgZmlsZXMgLS0gdGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvZiB0aGUgb3JkZXIgb2YgZmlsZXMKICAgICAgICBlbHNlOgogICAgICAgICAgICBuZXdwYXRoID0gW3BhdGhuYW1lXQoKICAgICAgICBsYXN0ID0gbGVuKCBmaWxlX2xpc3QgKQogICAgICAgIGZpbGVfbGlzdFtsYXN0IDogbGFzdF0gPSBuZXdwYXRoCgogICAgaWYgbGVuKCBmaWxlX2xpc3QgKSA9PSAwOgogICAgICAgIGZpbGVfbGlzdCA9IE5vbmUKICAgIGVsc2U6CiAgICAgICAgIyBub3cgZmlsdGVyIHRoZSBmaWxlIGxpc3QgdG8gcmVtb3ZlIG5vbi1leGlzdGluZyBvbmVzCiAgICAgICAgZmlsZV9saXN0ID0gZmlsdGVyKCBmaWxlX2V4aXN0cywgZmlsZV9saXN0ICkKCiAgICBsaXN0ICAgPSBbXQogICAgYmxvY2sgID0gW10KICAgIGZvcm1hdCA9IDAKICAgIGxpbmVubyA9IDAKCiAgICAjIFdlIHVzZSAiZm9ybWF0IiB0byBzdG9yZSB0aGUgc3RhdGUgb2Ygb3VyIHBhcnNlcjoKICAgICMKICAgICMgIDAgLSB3YWl0IGZvciBiZWdpbm5pbmcgb2YgY29tbWVudAogICAgIyAgMSAtIHBhcnNlIGNvbW1lbnQgZm9ybWF0IDEKICAgICMgIDIgLSBwYXJzZSBjb21tZW50IGZvcm1hdCAyCiAgICAjCiAgICAjICA0IC0gd2FpdCBmb3IgYmVnaW5uaW5nIG9mIHNvdXJjZSAob3IgY29tbWVudD8pCiAgICAjICA1IC0gcHJvY2VzcyBzb3VyY2UKICAgICMKICAgIGNvbW1lbnQgPSBbXQogICAgc291cmNlICA9IFtdCiAgICBzdGF0ZSAgID0gMAoKICAgIGZpbGVpbnB1dC5jbG9zZSgpCiAgICBmb3IgbGluZSBpbiBmaWxlaW5wdXQuaW5wdXQoIGZpbGVfbGlzdCApOgogICAgICAgIGwgPSBsZW4oIGxpbmUgKQogICAgICAgIGlmIGwgPiAwIGFuZCBsaW5lW2wgLSAxXSA9PSAnXDAxMic6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lWzAgOiBsLTFdCgogICAgICAgICMgc3RyaXBwZWQgdmVyc2lvbiBvZiB0aGUgbGluZQogICAgICAgICMKICAgICAgICBsaW5lMiA9IHN0cmluZy5zdHJpcCggbGluZSApCiAgICAgICAgbCAgICAgPSBsZW4oIGxpbmUyICkKCiAgICAgICAgIyBpZiB0aGlzIGxpbmUgYmVnaW5zIHdpdGggYSBjb21tZW50IGFuZCB3ZSBhcmUgcHJvY2Vzc2luZyBzb21lCiAgICAgICAgIyBzb3VyY2UsIGV4aXQgdG8gc3RhdGUgMAogICAgICAgICMKICAgICAgICAjIHVubGVzcyB3ZSBlbmNvdW50ZXIgc29tZXRoaW5nIGxpa2U6CiAgICAgICAgIwogICAgICAgICMgICAgLypALi4uLi4KICAgICAgICAjICAgIC8qIy4uLi4uCiAgICAgICAgIwogICAgICAgICMgICAgLyogQC4uLi4uCiAgICAgICAgIyAgICAvKiAjLi4uLi4KICAgICAgICAjCiAgICAgICAgaWYgZm9ybWF0ID49IDQgYW5kIGwgPiAyIGFuZCBsaW5lMlswIDogMl0gPT0gJy8qJzoKICAgICAgICAgICAgaWYgbCA8IDQgb3IgKCBsaW5lMlsyXSAhPSAnQCcgYW5kIGxpbmUyWzIgOiA0XSAhPSAnIEAnIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyWzJdICE9ICcjJyBhbmQgbGluZTJbMiA6IDRdICE9ICcgIycpOgogICAgICAgICAgICAgICAgYWRkX25ld19ibG9jayggbGlzdCwgZmlsZWlucHV0LmZpbGVuYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8sIGJsb2NrLCBzb3VyY2UgKQogICAgICAgICAgICAgICAgZm9ybWF0ID0gMAoKICAgICAgICBpZiBmb3JtYXQgPT0gMDogICMjIyMgd2FpdCBmb3IgYmVnaW5uaW5nIG9mIGNvbW1lbnQgIyMjIwogICAgICAgICAgICBpZiBsID4gMyBhbmQgbGluZTJbMCA6IDNdID09ICcvKionOgogICAgICAgICAgICAgICAgaSA9IDMKICAgICAgICAgICAgICAgIHdoaWxlIGkgPCBsIGFuZCBsaW5lMltpXSA9PSAnKic6CiAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxCgogICAgICAgICAgICAgICAgaWYgaSA9PSBsOgogICAgICAgICAgICAgICAgICAgICMgdGhpcyBpcyAnLyoqJyBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mICcqJywgdGhlCiAgICAgICAgICAgICAgICAgICAgIyBiZWdpbm5pbmcgb2YgYSBGb3JtYXQgMSBibG9jawogICAgICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICAgICBibG9jayAgPSBbXQogICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IFtdCiAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gMQogICAgICAgICAgICAgICAgICAgIGxpbmVubyA9IGZpbGVpbnB1dC5maWxlbGluZW5vKCkKCiAgICAgICAgICAgICAgICBlbGlmIGkgPT0gbCAtIDEgYW5kIGxpbmUyW2ldID09ICcvJzoKICAgICAgICAgICAgICAgICAgICAjIHRoaXMgaXMgJy8qKicgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiAnKicsIGZvbGxvd2VkCiAgICAgICAgICAgICAgICAgICAgIyBieSBhICcvJywgaS5lLiB0aGUgYmVnaW5uaW5nIG9mIGEgRm9ybWF0IDIgb3IgMyBibG9jawogICAgICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICAgICBibG9jayAgPSBbXQogICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IFtdCiAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gMgogICAgICAgICAgICAgICAgICAgIGxpbmVubyA9IGZpbGVpbnB1dC5maWxlbGluZW5vKCkKCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjCiAgICAgICAgIyBGT1JNQVQgMQogICAgICAgICMKICAgICAgICBlbGlmIGZvcm1hdCA9PSAxOgoKICAgICAgICAgICAgIyBJZiB0aGUgbGluZSBkb2Vzbid0IGJlZ2luIHdpdGggYSAiKiIsIHNvbWV0aGluZyB3ZW50IHdyb25nLAogICAgICAgICAgICAjIGFuZCB3ZSBtdXN0IGV4aXQsIGFuZCBmb3JnZXQgdGhlIGN1cnJlbnQgYmxvY2suCiAgICAgICAgICAgICMKICAgICAgICAgICAgaWYgbCA9PSAwIG9yIGxpbmUyWzBdICE9ICcqJzoKICAgICAgICAgICAgICAgIGJsb2NrICA9IFtdCiAgICAgICAgICAgICAgICBmb3JtYXQgPSAwCgogICAgICAgICAgICAjIE90aGVyd2lzZSwgd2UgdGVzdCBmb3IgYW4gZW5kIG9mIGJsb2NrLCB3aGljaCBpcyBhbiBhcmJpdHJhcnkKICAgICAgICAgICAgIyBudW1iZXIgb2YgJyonLCBmb2xsb3dlZCBieSAnLycuCiAgICAgICAgICAgICMKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGkgPSAxCiAgICAgICAgICAgICAgICB3aGlsZSBpIDwgbCBhbmQgbGluZTJbaV0gPT0gJyonOgogICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMQoKICAgICAgICAgICAgICAgICMgdGVzdCBmb3IgdGhlIGVuZCBvZiB0aGUgYmxvY2sKICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgIGlmIGkgPCBsIGFuZCBsaW5lMltpXSA9PSAnLyc6CiAgICAgICAgICAgICAgICAgICAgaWYgYmxvY2sgIT0gW106CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IDQKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAwCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlIHNpbXBseSBhcHBlbmQgbGluZSB0byBjdXJyZW50IGJsb2NrCiAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgICAgIGJsb2NrLmFwcGVuZCggbGluZTJbaSA6XSApCgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgICAgICAjCiAgICAgICAgIyBGT1JNQVQgMgogICAgICAgICMKICAgICAgICBlbGlmIGZvcm1hdCA9PSAyOgoKICAgICAgICAgICAgIyBJZiB0aGUgbGluZSBkb2Vzbid0IGJlZ2luIHdpdGggJy8qJyBhbmQgZW5kIHdpdGggJyovJywgdGhpcyBpcwogICAgICAgICAgICAjIHRoZSBlbmQgb2YgdGhlIGZvcm1hdCAyIGZvcm1hdC4KICAgICAgICAgICAgIwogICAgICAgICAgICBpZiBsIDwgNCBvciBsaW5lMls6IDJdICE9ICcvKicgb3IgbGluZTJbLTIgOl0gIT0gJyovJzoKICAgICAgICAgICAgICAgIGlmIGJsb2NrICE9IFtdOgogICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IDQKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gMAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyByZW1vdmUgdGhlIHN0YXJ0IGFuZCBlbmQgY29tbWVudCBkZWxpbWl0ZXJzLCB0aGVuCiAgICAgICAgICAgICAgICAjIHJpZ2h0LXN0cmlwIHRoZSBsaW5lCiAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICBsaW5lMiA9IHN0cmluZy5yc3RyaXAoIGxpbmUyWzIgOiAtMl0gKQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZm9yIGVuZCBvZiBhIGZvcm1hdDIgYmxvY2ssIGkuZS4gYSBydW4gb2YgJyonCiAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICBpZiBzdHJpbmcuY291bnQoIGxpbmUyLCAnKicgKSA9PSBsIC0gNDoKICAgICAgICAgICAgICAgICAgICBpZiBibG9jayAhPSBbXToKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gNAogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IDAKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2UsIGFkZCB0aGUgbGluZSB0byB0aGUgY3VycmVudCBibG9jawogICAgICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICAgICBibG9jay5hcHBlbmQoIGxpbmUyICkKCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBmb3JtYXQgPj0gNDogICMjIyMgc291cmNlIHByb2Nlc3NpbmcgIyMjIwogICAgICAgICAgICBpZiBsID4gMDoKICAgICAgICAgICAgICAgIGZvcm1hdCA9IDUKCiAgICAgICAgICAgIGlmIGZvcm1hdCA9PSA1OgogICAgICAgICAgICAgICAgc291cmNlLmFwcGVuZCggbGluZSApCgogICAgaWYgZm9ybWF0ID49IDQ6CiAgICAgICAgYWRkX25ld19ibG9jayggbGlzdCwgZmlsZWlucHV0LmZpbGVuYW1lKCksIGxpbmVubywgYmxvY2ssIHNvdXJjZSApCgogICAgcmV0dXJuIGxpc3QKCgoKIyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBmb3IgZGVidWdnaW5nCiMKZGVmIGR1bXBfYmxvY2tfbGlzdCggbGlzdCApOgogICAgIiIiZHVtcCBhIGNvbW1lbnQgYmxvY2sgbGlzdCIiIgogICAgZm9yIGJsb2NrIGluIGxpc3Q6CiAgICAgICAgcHJpbnQgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCiAgICAgICAgZm9yIGxpbmUgaW4gYmxvY2tbMF06CiAgICAgICAgICAgIHByaW50IGxpbmUKICAgICAgICBmb3IgbGluZSBpbiBibG9ja1sxXToKICAgICAgICAgICAgcHJpbnQgbGluZQoKICAgIHByaW50ICItLS0tLS0tLS10aGUgZW5kLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCgoKZGVmIHVzYWdlKCk6CiAgICBwcmludCAiXG5Eb2NNYWtlciAwLjEgVXNhZ2UgaW5mb3JtYXRpb25cbiIKICAgIHByaW50ICIgIGRvY21ha2VyIFtvcHRpb25zXSBmaWxlMSBbIGZpbGUyIC4uLiBdXG4iCiAgICBwcmludCAidXNpbmcgdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuIgogICAgcHJpbnQgIiAgLWggOiBwcmludCB0aGlzIHBhZ2UiCiAgICBwcmludCAiICAtdCA6IHNldCBwcm9qZWN0IHRpdGxlLCBhcyBpbiAnLXQgXCJNeSBQcm9qZWN0XCInIgogICAgcHJpbnQgIiAgLW8gOiBzZXQgb3V0cHV0IGRpcmVjdG9yeSwgYXMgaW4gJy1vIG15ZGlyJyIKICAgIHByaW50ICIgIC1wIDogc2V0IGRvY3VtZW50YXRpb24gcHJlZml4LCBhcyBpbiAnLXAgZnQyJyIKICAgIHByaW50ICIiCiAgICBwcmludCAiICAtLXRpdGxlICA6IHNhbWUgYXMgLXQsIGFzIGluICctLXRpdGxlPVwiTXkgUHJvamVjdFwiJyIKICAgIHByaW50ICIgIC0tb3V0cHV0IDogc2FtZSBhcyAtbywgYXMgaW4gJy0tb3V0cHV0PW15ZGlyJyIKICAgIHByaW50ICIgIC0tcHJlZml4IDogc2FtZSBhcyAtcCwgYXMgaW4gJy0tcHJlZml4PWZ0MiciCgoKZGVmIG1haW4oIGFyZ3YgKToKICAgICIiIm1haW4gcHJvZ3JhbSBsb29wIiIiCgogICAgZ2xvYmFsIG91dHB1dF9kaXIsIHByb2plY3RfdGl0bGUsIHByb2plY3RfcHJlZml4CiAgICBnbG9iYWwgaHRtbF9oZWFkZXIsIGh0bWxfaGVhZGVyMSwgaHRtbF9oZWFkZXIyLCBodG1sX2hlYWRlcjMKCiAgICB0cnk6CiAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoIHN5cy5hcmd2WzE6XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0Om86cDoiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbICJoZWxwIiwgInRpdGxlPSIsICJvdXRwdXQ9IiwgInByZWZpeD0iIF0gKQoKICAgIGV4Y2VwdCBnZXRvcHQuR2V0b3B0RXJyb3I6CiAgICAgICAgdXNhZ2UoKQogICAgICAgIHN5cy5leGl0KCAyICkKCiAgICBpZiBhcmdzID09IFtdOgogICAgICAgIHVzYWdlKCkKICAgICAgICBzeXMuZXhpdCggMSApCgogICAgIyBwcm9jZXNzIG9wdGlvbnMKICAgICMKICAgIHByb2plY3RfdGl0bGUgID0gIlByb2plY3QiCiAgICBwcm9qZWN0X3ByZWZpeCA9IE5vbmUKICAgIG91dHB1dF9kaXIgICAgID0gTm9uZQoKICAgIGZvciBvcHQgaW4gb3B0czoKICAgICAgICBpZiBvcHRbMF0gaW4gKCAiLWgiLCAiLS1oZWxwIiApOgogICAgICAgICAgICB1c2FnZSgpCiAgICAgICAgICAgIHN5cy5leGl0KCAwICkKCiAgICAgICAgaWYgb3B0WzBdIGluICggIi10IiwgIi0tdGl0bGUiICk6CiAgICAgICAgICAgIHByb2plY3RfdGl0bGUgPSBvcHRbMV0KCiAgICAgICAgaWYgb3B0WzBdIGluICggIi1vIiwgIi0tb3V0cHV0IiApOgogICAgICAgICAgICBvdXRwdXRfZGlyID0gb3B0WzFdCgogICAgICAgIGlmIG9wdFswXSBpbiAoICItcCIsICItLXByZWZpeCIgKToKICAgICAgICAgICAgcHJvamVjdF9wcmVmaXggPSBvcHRbMV0KCiAgICBodG1sX2hlYWRlciA9IGh0bWxfaGVhZGVyXzEgKyBwcm9qZWN0X3RpdGxlICsgaHRtbF9oZWFkZXJfMiArIHByb2plY3RfdGl0bGUgKyBodG1sX2hlYWRlcl8zCiAgICBjaGVja19vdXRwdXQoICkKICAgIGNvbXB1dGVfdGltZV9odG1sKCkKCiAgICAjIHdlIGJlZ2luIGJ5IHNpbXBseSBidWlsZGluZyBhIGxpc3Qgb2YgRG9jQmxvY2sgZWxlbWVudHMKICAgICMKICAgIGxpc3QgPSBtYWtlX2Jsb2NrX2xpc3QoIGFyZ3MgKQoKICAgICMgbm93LCBzb3J0IHRoZSBibG9ja3MgaW50byBzZWN0aW9ucwogICAgIwogICAgZG9jdW1lbnQgPSBEb2NEb2N1bWVudCgpCiAgICBmb3IgYmxvY2sgaW4gbGlzdDoKICAgICAgICBkb2N1bWVudC5hcHBlbmRfYmxvY2soIGJsb2NrICkKCiAgICBkb2N1bWVudC5wcmVwYXJlX2ZpbGVzKCBwcm9qZWN0X3ByZWZpeCApCgogICAgZG9jdW1lbnQuZHVtcF90b2NfaHRtbCgpCiAgICBkb2N1bWVudC5kdW1wX3NlY3Rpb25zX2h0bWwoKQogICAgZG9jdW1lbnQuZHVtcF9pbmRleF9odG1sKCkKCiMgaWYgY2FsbGVkIGZyb20gdGhlIGNvbW1hbmQgbGluZQojCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBtYWluKCBzeXMuYXJndiApCgoKIyBlb2YK