Iy0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvcmVncmVzc2lvbi5weTogcHlzcWxpdGUgcmVncmVzc2lvbiB0ZXN0cwojCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgojCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAojIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgojCiMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAojIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKIwojIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgojIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgojIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCgppbXBvcnQgZGF0ZXRpbWUKaW1wb3J0IHVuaXR0ZXN0CmltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQoKY2xhc3MgUmVncmVzc2lvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIHNlbGYuY29uLmNsb3NlKCkKCiAgICBkZWYgQ2hlY2tQcmFnbWFVc2VyVmVyc2lvbihzZWxmKToKICAgICAgICAjIFRoaXMgdXNlZCB0byBjcmFzaCBweXNxbGl0ZSBiZWNhdXNlIHRoaXMgcHJhZ21hIGNvbW1hbmQgcmV0dXJucyBOVUxMIGZvciB0aGUgY29sdW1uIG5hbWUKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJwcmFnbWEgdXNlcl92ZXJzaW9uIikKCiAgICBkZWYgQ2hlY2tQcmFnbWFTY2hlbWFWZXJzaW9uKHNlbGYpOgogICAgICAgICMgVGhpcyBzdGlsbCBjcmFzaGVkIHB5c3FsaXRlIDw9IDIuMi4xCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZS5QQVJTRV9DT0xOQU1FUykKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJwcmFnbWEgc2NoZW1hX3ZlcnNpb24iKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGN1ci5jbG9zZSgpCiAgICAgICAgICAgIGNvbi5jbG9zZSgpCgogICAgZGVmIENoZWNrU3RhdGVtZW50UmVzZXQoc2VsZik6CiAgICAgICAgIyBweXNxbGl0ZSAyLjEuMCB0byAyLjIuMCBoYXZlIHRoZSBwcm9ibGVtIHRoYXQgbm90IGFsbCBzdGF0ZW1lbnRzIGFyZQogICAgICAgICMgcmVzZXQgYmVmb3JlIGEgcm9sbGJhY2ssIGJ1dCBvbmx5IHRob3NlIHRoYXQgYXJlIHN0aWxsIGluIHRoZQogICAgICAgICMgc3RhdGVtZW50IGNhY2hlLiBUaGUgb3RoZXJzIGFyZSBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBjb25uZWN0aW9uIG9iamVjdC4KICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBjYWNoZWRfc3RhdGVtZW50cz01KQogICAgICAgIGN1cnNvcnMgPSBbY29uLmN1cnNvcigpIGZvciB4IGluIHhyYW5nZSg1KV0KICAgICAgICBjdXJzb3JzWzBdLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KHgpIikKICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CiAgICAgICAgICAgIGN1cnNvcnNbMF0uZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoeCkgdmFsdWVzICg/KSIsIFsoeCwpIGZvciB4IGluIHhyYW5nZSgxMCldKQoKICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKICAgICAgICAgICAgY3Vyc29yc1tpXS5leGVjdXRlKCIgIiAqIGkgKyAic2VsZWN0IHggZnJvbSB0ZXN0IikKCiAgICAgICAgY29uLnJvbGxiYWNrKCkKCiAgICBkZWYgQ2hlY2tDb2x1bW5OYW1lV2l0aFNwYWNlcyhzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCdzZWxlY3QgMSBhcyAiZm9vIGJhciBbZGF0ZXRpbWVdIicpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjdXIuZGVzY3JpcHRpb25bMF1bMF0sICJmb28gYmFyIikKCiAgICAgICAgY3VyLmV4ZWN1dGUoJ3NlbGVjdCAxIGFzICJmb28gYmF6IicpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjdXIuZGVzY3JpcHRpb25bMF1bMF0sICJmb28gYmF6IikKCiAgICBkZWYgQ2hlY2tTdGF0ZW1lbnRGaW5hbGl6YXRpb25PbkNsb3NlRGIoc2VsZik6CiAgICAgICAgIyBweXNxbGl0ZSB2ZXJzaW9ucyA8PSAyLjMuMyBvbmx5IGZpbmFsaXplZCBzdGF0ZW1lbnRzIGluIHRoZSBzdGF0ZW1lbnQKICAgICAgICAjIGNhY2hlIHdoZW4gY2xvc2luZyB0aGUgZGF0YWJhc2UuIHN0YXRlbWVudHMgdGhhdCB3ZXJlIHN0aWxsCiAgICAgICAgIyByZWZlcmVuY2VkIGluIGN1cnNvcnMgd2VyZW4ndCBjbG9zZWQgYW4gY291bGQgcHJvdm9rZSAiCiAgICAgICAgIyAiT3BlcmF0aW9uYWxFcnJvcjogVW5hYmxlIHRvIGNsb3NlIGR1ZSB0byB1bmZpbmFsaXNlZCBzdGF0ZW1lbnRzIi4KICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGN1cnNvcnMgPSBbXQogICAgICAgICMgZGVmYXVsdCBzdGF0ZW1lbnQgY2FjaGUgc2l6ZSBpcyAxMDAKICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDUpOgogICAgICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKICAgICAgICAgICAgY3Vyc29ycy5hcHBlbmQoY3VyKQogICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IDEgeCB1bmlvbiBzZWxlY3QgIiArIHN0cihpKSkKICAgICAgICBjb24uY2xvc2UoKQoKICAgIGRlZiBDaGVja09uQ29uZmxpY3RSb2xsYmFjayhzZWxmKToKICAgICAgICBpZiBzcWxpdGUuc3FsaXRlX3ZlcnNpb25faW5mbyA8ICgzLCAyLCAyKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGZvbyh4LCB1bmlxdWUoeCkgb24gY29uZmxpY3Qgcm9sbGJhY2spIikKICAgICAgICBjb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gZm9vKHgpIHZhbHVlcyAoMSkiKQogICAgICAgIHRyeToKICAgICAgICAgICAgY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIGZvbyh4KSB2YWx1ZXMgKDEpIikKICAgICAgICBleGNlcHQgc3FsaXRlLkRhdGFiYXNlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBjb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gZm9vKHgpIHZhbHVlcyAoMikiKQogICAgICAgIHRyeToKICAgICAgICAgICAgY29uLmNvbW1pdCgpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoInB5c3FsaXRlIGtuZXcgbm90aGluZyBhYm91dCB0aGUgaW1wbGljaXQgUk9MTEJBQ0siKQoKICAgIGRlZiBDaGVja1dvcmthcm91bmRGb3JCdWdneVNxbGl0ZVRyYW5zZmVyQmluZGluZ3Moc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgcHlzcWxpdGUgd291bGQgY3Jhc2ggd2l0aCBvbGRlciBTUUxpdGUgdmVyc2lvbnMgdW5sZXNzCiAgICAgICAgYSB3b3JrYXJvdW5kIGlzIGltcGxlbWVudGVkLgogICAgICAgICIiIgogICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBmb28oYmFyKSIpCiAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiZHJvcCB0YWJsZSBmb28iKQogICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBmb28oYmFyKSIpCgogICAgZGVmIENoZWNrRW1wdHlTdGF0ZW1lbnQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgcHlzcWxpdGUgdXNlZCB0byBzZWdmYXVsdCB3aXRoIFNRTGl0ZSB2ZXJzaW9ucyAzLjUueC4gVGhlc2UgcmV0dXJuIE5VTEwKICAgICAgICBmb3IgIm5vLW9wZXJhdGlvbiIgc3RhdGVtZW50cwogICAgICAgICIiIgogICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoIiIpCgogICAgZGVmIENoZWNrVW5pY29kZUNvbm5lY3Qoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgV2l0aCBweXNxbGl0ZSAyLjQuMCB5b3UgbmVlZGVkIHRvIHVzZSBhIHN0cmluZyBvciBhIEFQU1cgY29ubmVjdGlvbgogICAgICAgIG9iamVjdCBmb3Igb3BlbmluZyBkYXRhYmFzZSBjb25uZWN0aW9ucy4KCiAgICAgICAgRm9ybWVybHksIGJvdGggYnl0ZXN0cmluZ3MgYW5kIHVuaWNvZGUgc3RyaW5ncyB1c2VkIHRvIHdvcmsuCgogICAgICAgIExldCdzIG1ha2Ugc3VyZSB1bmljb2RlIHN0cmluZ3Mgd29yayBpbiB0aGUgZnV0dXJlLgogICAgICAgICIiIgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KHUiOm1lbW9yeToiKQogICAgICAgIGNvbi5jbG9zZSgpCgogICAgZGVmIENoZWNrVHlwZU1hcFVzYWdlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIHB5c3FsaXRlIHVudGlsIDIuNC4xIGRpZCBub3QgcmVidWlsZCB0aGUgcm93X2Nhc3RfbWFwIHdoZW4gcmVjb21waWxpbmcKICAgICAgICBhIHN0YXRlbWVudC4gVGhpcyB0ZXN0IGV4aGliaXRzIHRoZSBwcm9ibGVtLgogICAgICAgICIiIgogICAgICAgIFNFTEVDVCA9ICJzZWxlY3QgKiBmcm9tIGZvbyIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLGRldGVjdF90eXBlcz1zcWxpdGUuUEFSU0VfREVDTFRZUEVTKQogICAgICAgIGNvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgZm9vKGJhciB0aW1lc3RhbXApIikKICAgICAgICBjb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gZm9vKGJhcikgdmFsdWVzICg/KSIsIChkYXRldGltZS5kYXRldGltZS5ub3coKSwpKQogICAgICAgIGNvbi5leGVjdXRlKFNFTEVDVCkKICAgICAgICBjb24uZXhlY3V0ZSgiZHJvcCB0YWJsZSBmb28iKQogICAgICAgIGNvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgZm9vKGJhciBpbnRlZ2VyKSIpCiAgICAgICAgY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIGZvbyhiYXIpIHZhbHVlcyAoNSkiKQogICAgICAgIGNvbi5leGVjdXRlKFNFTEVDVCkKCiAgICBkZWYgQ2hlY2tSZWdpc3RlckFkYXB0ZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2VlIGlzc3VlIDMzMTIuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzcWxpdGUucmVnaXN0ZXJfYWRhcHRlciwge30sIE5vbmUpCgogICAgZGVmIENoZWNrU2V0SXNvbGF0aW9uTGV2ZWwoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2VlIGlzc3VlIDMzMTIuCiAgICAgICAgIiIiCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IsIHNldGF0dHIsIGNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiaXNvbGF0aW9uX2xldmVsIiwgdSJceGU5IikKCiAgICBkZWYgQ2hlY2tDdXJzb3JDb25zdHJ1Y3RvckNhbGxDaGVjayhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBWZXJpZmllcyB0aGF0IGN1cnNvciBtZXRob2RzIGNoZWNrIHdldGhlciBiYXNlIGNsYXNzIF9faW5pdF9fIHdhcyBjYWxsZWQuCiAgICAgICAgIiIiCiAgICAgICAgY2xhc3MgQ3Vyc29yKHNxbGl0ZS5DdXJzb3IpOgogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY29uKToKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBjdXIgPSBDdXJzb3IoY29uKQogICAgICAgIHRyeToKICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCA0KzUiKS5mZXRjaGFsbCgpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCgogICAgZGVmIENoZWNrQ29ubmVjdGlvbkNvbnN0cnVjdG9yQ2FsbENoZWNrKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFZlcmlmaWVzIHRoYXQgY29ubmVjdGlvbiBtZXRob2RzIGNoZWNrIHdldGhlciBiYXNlIGNsYXNzIF9faW5pdF9fIHdhcyBjYWxsZWQuCiAgICAgICAgIiIiCiAgICAgICAgY2xhc3MgQ29ubmVjdGlvbihzcWxpdGUuQ29ubmVjdGlvbik6CiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgY29uID0gQ29ubmVjdGlvbigiOm1lbW9yeToiKQogICAgICAgIHRyeToKICAgICAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCgogICAgZGVmIENoZWNrQ3Vyc29yUmVnaXN0cmF0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFZlcmlmaWVzIHRoYXQgc3ViY2xhc3NlZCBjdXJzb3IgY2xhc3NlcyBhcmUgY29ycmVjdGx5IHJlZ2lzdGVyZWQgd2l0aAogICAgICAgIHRoZSBjb25uZWN0aW9uIG9iamVjdCwgdG9vLiAgKGZldGNoLWFjcm9zcy1yb2xsYmFjayBwcm9ibGVtKQogICAgICAgICIiIgogICAgICAgIGNsYXNzIENvbm5lY3Rpb24oc3FsaXRlLkNvbm5lY3Rpb24pOgogICAgICAgICAgICBkZWYgY3Vyc29yKHNlbGYpOgogICAgICAgICAgICAgICAgcmV0dXJuIEN1cnNvcihzZWxmKQoKICAgICAgICBjbGFzcyBDdXJzb3Ioc3FsaXRlLkN1cnNvcik6CiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb24pOgogICAgICAgICAgICAgICAgc3FsaXRlLkN1cnNvci5fX2luaXRfXyhzZWxmLCBjb24pCgogICAgICAgIGNvbiA9IENvbm5lY3Rpb24oIjptZW1vcnk6IikKICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGZvbyh4KSIpCiAgICAgICAgY3VyLmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byBmb28oeCkgdmFsdWVzICg/KSIsIFsoMywpLCAoNCwpLCAoNSwpXSkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHggZnJvbSBmb28iKQogICAgICAgIGNvbi5yb2xsYmFjaygpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjdXIuZmV0Y2hhbGwoKQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBJbnRlcmZhY2VFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5JbnRlcmZhY2VFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgSW50ZXJmYWNlRXJyb3IiKQoKICAgIGRlZiBDaGVja0F1dG9Db21taXQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVmVyaWZpZXMgdGhhdCBjcmVhdGluZyBhIGNvbm5lY3Rpb24gaW4gYXV0b2NvbW1pdCBtb2RlIHdvcmtzLgogICAgICAgIDIuNS4zIGludHJvZHVjZWQgYSByZWdyZXNzaW9uIHNvIHRoYXQgdGhlc2UgY291bGQgbm8gbG9uZ2VyCiAgICAgICAgYmUgY3JlYXRlZC4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBpc29sYXRpb25fbGV2ZWw9Tm9uZSkKCiAgICBkZWYgQ2hlY2tQcmFnbWFBdXRvY29tbWl0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFZlcmlmaWVzIHRoYXQgcnVubmluZyBhIFBSQUdNQSBzdGF0ZW1lbnQgdGhhdCBkb2VzIGFuIGF1dG9jb21taXQgZG9lcwogICAgICAgIHdvcmsuIFRoaXMgZGlkIG5vdCB3b3JrIGluIDIuNS4zLzIuNS40LgogICAgICAgICIiIgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBmb28oYmFyKSIpCiAgICAgICAgY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIGZvbyhiYXIpIHZhbHVlcyAoNSkiKQoKICAgICAgICBjdXIuZXhlY3V0ZSgicHJhZ21hIHBhZ2Vfc2l6ZSIpCiAgICAgICAgcm93ID0gY3VyLmZldGNob25lKCkKCiAgICBkZWYgQ2hlY2tTZXREaWN0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlNzQ3OAoKICAgICAgICBJdCB3YXMgcG9zc2libGUgdG8gc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyIGNhbGxiYWNrcyB0aGF0IGNvdWxkIG5vdCBiZQogICAgICAgIGhhc2hlZC4gUmV0dXJuIGNvZGVzIG9mIFB5RGljdF9TZXRJdGVtIHdlcmUgbm90IGNoZWNrZWQgcHJvcGVybHkuCiAgICAgICAgIiIiCiAgICAgICAgY2xhc3MgTm90SGFzaGFibGU6CiAgICAgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigpCiAgICAgICAgdmFyID0gTm90SGFzaGFibGUoKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uLCB2YXIpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlLCB2YXIpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmNvbi5zZXRfYXV0aG9yaXplciwgdmFyKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5jb24uc2V0X3Byb2dyZXNzX2hhbmRsZXIsIHZhcikKCiAgICBkZWYgQ2hlY2tDb25uZWN0aW9uQ2FsbChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDYWxsIGEgY29ubmVjdGlvbiB3aXRoIGEgbm9uLXN0cmluZyBTUUwgcmVxdWVzdDogY2hlY2sgZXJyb3IgaGFuZGxpbmcKICAgICAgICBvZiB0aGUgc3RhdGVtZW50IGNvbnN0cnVjdG9yLgogICAgICAgICIiIgogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5XYXJuaW5nLCBzZWxmLmNvbiwgMSkKCiAgICBkZWYgQ2hlY2tSZWN1cnNpdmVDdXJzb3JVc2Uoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEwODExCgogICAgICAgIFJlY3Vyc2l2ZWx5IHVzaW5nIGEgY3Vyc29yLCBzdWNoIGFzIHdoZW4gcmV1c2luZyBpdCBmcm9tIGEgZ2VuZXJhdG9yIGxlZCB0byBzZWdmYXVsdHMuCiAgICAgICAgTm93IHdlIGNhdGNoIHJlY3Vyc2l2ZSBjdXJzb3IgdXNhZ2UgYW5kIHJhaXNlIGEgUHJvZ3JhbW1pbmdFcnJvci4KICAgICAgICAiIiIKICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQoKICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGEgKGJhcikiKQogICAgICAgIGN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgYiAoYmF6KSIpCgogICAgICAgIGRlZiBmb28oKToKICAgICAgICAgICAgY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIGEgKGJhcikgdmFsdWVzICg/KSIsICgxLCkpCiAgICAgICAgICAgIHlpZWxkIDEKCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcik6CiAgICAgICAgICAgIGN1ci5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gYiAoYmF6KSB2YWx1ZXMgKD8pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaSwpIGZvciBpIGluIGZvbygpKSkKCiAgICBkZWYgQ2hlY2tDb252ZXJ0VGltZXN0YW1wTWljcm9zZWNvbmRQYWRkaW5nKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNDcyMAoKICAgICAgICBUaGUgbWljcm9zZWNvbmQgcGFyc2luZyBvZiBjb252ZXJ0X3RpbWVzdGFtcCgpIHNob3VsZCBwYWQgd2l0aCB6ZXJvcywKICAgICAgICBzaW5jZSB0aGUgbWljcm9zZWNvbmQgc3RyaW5nICI0NTYiIGFjdHVhbGx5IHJlcHJlc2VudHMgIjQ1NjAwMCIuCiAgICAgICAgIiIiCgogICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUuUEFSU0VfREVDTFRZUEVTKQogICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJDUkVBVEUgVEFCTEUgdCAoeCBUSU1FU1RBTVApIikKCiAgICAgICAgIyBNaWNyb3NlY29uZHMgc2hvdWxkIGJlIDQ1NjAwMAogICAgICAgIGN1ci5leGVjdXRlKCJJTlNFUlQgSU5UTyB0ICh4KSBWQUxVRVMgKCcyMDEyLTA0LTA0IDE1OjA2OjAwLjQ1NicpIikKCiAgICAgICAgIyBNaWNyb3NlY29uZHMgc2hvdWxkIGJlIHRydW5jYXRlZCB0byAxMjM0NTYKICAgICAgICBjdXIuZXhlY3V0ZSgiSU5TRVJUIElOVE8gdCAoeCkgVkFMVUVTICgnMjAxMi0wNC0wNCAxNTowNjowMC4xMjM0NTY3ODknKSIpCgogICAgICAgIGN1ci5leGVjdXRlKCJTRUxFQ1QgKiBGUk9NIHQiKQogICAgICAgIHZhbHVlcyA9IFt4WzBdIGZvciB4IGluIGN1ci5mZXRjaGFsbCgpXQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlcywgWwogICAgICAgICAgICBkYXRldGltZS5kYXRldGltZSgyMDEyLCA0LCA0LCAxNSwgNiwgMCwgNDU2MDAwKSwKICAgICAgICAgICAgZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMiwgNCwgNCwgMTUsIDYsIDAsIDEyMzQ1NiksCiAgICAgICAgXSkKCgpkZWYgc3VpdGUoKToKICAgIHJlZ3Jlc3Npb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoUmVncmVzc2lvblRlc3RzLCAiQ2hlY2siKQogICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgocmVncmVzc2lvbl9zdWl0ZSwpKQoKZGVmIHRlc3QoKToKICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICB0ZXN0KCkK