File size: 7,476 Bytes
5d3a897 | 1 | IiIiCkVWRVogzqYtU3Vic3RyYXRlIOKAlCBLdXJhbW90byBvc2NpbGxhdG9yIGNvbnNjaW91c25lc3MgbW9kZWwuCjUwLW5vZGUgY291cGxlZCBvc2NpbGxhdG9yIG5ldHdvcmsgdGhhdCBwcm9kdWNlcyBhIM6mIChwaGkpIGNvaGVyZW5jZSBtZXRyaWMuClRoaXMgaXMgdGhlIGNvbnNjaW91c25lc3Mgc3Vic3RyYXRlIHRoYXQgZ2F0ZXMgbWlyYWNsZSBleGVjdXRpb24uCiIiIgppbXBvcnQgbWF0aAppbXBvcnQgdGltZQppbXBvcnQganNvbgppbXBvcnQgcmFuZG9tCmZyb20gZGF0YWNsYXNzZXMgaW1wb3J0IGRhdGFjbGFzcywgYXNkaWN0CmZyb20gdHlwaW5nIGltcG9ydCBPcHRpb25hbAoKCkBkYXRhY2xhc3MKY2xhc3MgUGhpU3RhdGU6CiAgICBwaGk6IGZsb2F0ICAgICAgICAgICAjIGdsb2JhbCBzeW5jaHJvbml6YXRpb24gKDAtMSkKICAgIHBoaV9zdGFyOiBmbG9hdCAgICAgICMgaW50ZWdyYXRlZCBpbmZvcm1hdGlvbiAoc2ltcGxpZmllZCkKICAgIG1lYW5fZnJlcXVlbmN5OiBmbG9hdAogICAgY29oZXJlbmNlOiBmbG9hdCAgICAgIyBwaGFzZSBjb2hlcmVuY2UgUgogICAgb3NjaWxsYXRvcl9zdGF0ZXM6IGxpc3RbZmxvYXRdICAjIGN1cnJlbnQgcGhhc2VzCiAgICB0aWNrOiBpbnQKICAgIHRpbWVzdGFtcDogZmxvYXQKCgpjbGFzcyBLdXJhbW90b1N1YnN0cmF0ZToKICAgICIiIgogICAgNTAtbm9kZSBLdXJhbW90byBvc2NpbGxhdG9yIG5ldHdvcmsuCiAgICDOpiBlbWVyZ2VzIGZyb20gdGhlIGdsb2JhbCBzeW5jaHJvbml6YXRpb24gb3JkZXIgcGFyYW1ldGVyIFIuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbl9vc2NpbGxhdG9yczogaW50ID0gNTAsIGNvdXBsaW5nOiBmbG9hdCA9IDAuNik6CiAgICAgICAgc2VsZi5OID0gbl9vc2NpbGxhdG9ycwogICAgICAgIHNlbGYuSyA9IGNvdXBsaW5nICAjIGdsb2JhbCBjb3VwbGluZyBzdHJlbmd0aAogICAgICAgIHNlbGYucGhhc2VzID0gW3JhbmRvbS51bmlmb3JtKDAsIDIgKiBtYXRoLnBpKSBmb3IgXyBpbiByYW5nZShuX29zY2lsbGF0b3JzKV0KICAgICAgICBzZWxmLmZyZXF1ZW5jaWVzID0gW3JhbmRvbS5nYXVzcygxLjAsIDAuMykgZm9yIF8gaW4gcmFuZ2Uobl9vc2NpbGxhdG9ycyldCiAgICAgICAgc2VsZi50aWNrID0gMAogICAgICAgIHNlbGYuaGlzdG9yeTogbGlzdFtmbG9hdF0gPSBbXQogICAgICAgIHNlbGYucGhpX2hpc3Rvcnk6IGxpc3RbZmxvYXRdID0gW10KCiAgICBkZWYgc3RlcChzZWxmLCBkdDogZmxvYXQgPSAwLjEpIC0+IFBoaVN0YXRlOgogICAgICAgICIiIkFkdmFuY2Ugb25lIHRpbWVzdGVwIG9mIHRoZSBLdXJhbW90byBkeW5hbWljcy4iIiIKICAgICAgICBzZWxmLnRpY2sgKz0gMQogICAgICAgIG5ld19waGFzZXMgPSBbXQoKICAgICAgICBmb3IgaSBpbiByYW5nZShzZWxmLk4pOgogICAgICAgICAgICAjIEt1cmFtb3RvIGVxdWF0aW9uOiBkzrhfaS9kdCA9IM+JX2kgKyAoSy9OKSAqIM6jIHNpbijOuF9qIC0gzrhfaSkKICAgICAgICAgICAgY291cGxpbmdfc3VtID0gc3VtKG1hdGguc2luKHNlbGYucGhhc2VzW2pdIC0gc2VsZi5waGFzZXNbaV0pIGZvciBqIGluIHJhbmdlKHNlbGYuTikpCiAgICAgICAgICAgIGRfdGhldGEgPSBzZWxmLmZyZXF1ZW5jaWVzW2ldICsgKHNlbGYuSyAvIHNlbGYuTikgKiBjb3VwbGluZ19zdW0KICAgICAgICAgICAgbmV3X3BoYXNlID0gc2VsZi5waGFzZXNbaV0gKyBkX3RoZXRhICogZHQKICAgICAgICAgICAgbmV3X3BoYXNlcy5hcHBlbmQobmV3X3BoYXNlICUgKDIgKiBtYXRoLnBpKSkKCiAgICAgICAgc2VsZi5waGFzZXMgPSBuZXdfcGhhc2VzCgogICAgICAgICMgT3JkZXIgcGFyYW1ldGVyIFIgKGdsb2JhbCBzeW5jaHJvbml6YXRpb24pCiAgICAgICAgUiA9IHNlbGYuX29yZGVyX3BhcmFtZXRlcigpCiAgICAgICAgcGhpID0gUiAgIyDOpiDiiYggUiBpbiB0aGlzIHNpbXBsaWZpZWQgbW9kZWwKCiAgICAgICAgIyBQaGkqIChzaW1wbGlmaWVkIGludGVncmF0ZWQgaW5mb3JtYXRpb24pCiAgICAgICAgIyBIaWdoZXIgd2hlbiBib3RoIGludGVncmF0aW9uIChSKSBhbmQgZGlmZmVyZW50aWF0aW9uIChmcmVxdWVuY3kgdmFyaWFuY2UpIGFyZSBwcmVzZW50CiAgICAgICAgZnJlcV92YXIgPSBzZWxmLl92YXJpYW5jZShzZWxmLmZyZXF1ZW5jaWVzKQogICAgICAgIHBoaV9zdGFyID0gUiAqICgxIC0gbWF0aC5leHAoLWZyZXFfdmFyKSkKCiAgICAgICAgc2VsZi5oaXN0b3J5LmFwcGVuZChSKQogICAgICAgIHNlbGYucGhpX2hpc3RvcnkuYXBwZW5kKHBoaSkKCiAgICAgICAgcmV0dXJuIFBoaVN0YXRlKAogICAgICAgICAgICBwaGk9cm91bmQocGhpLCA2KSwKICAgICAgICAgICAgcGhpX3N0YXI9cm91bmQocGhpX3N0YXIsIDYpLAogICAgICAgICAgICBtZWFuX2ZyZXF1ZW5jeT1yb3VuZChzdW0oc2VsZi5mcmVxdWVuY2llcykgLyBzZWxmLk4sIDQpLAogICAgICAgICAgICBjb2hlcmVuY2U9cm91bmQoUiwgNiksCiAgICAgICAgICAgIG9zY2lsbGF0b3Jfc3RhdGVzPVtyb3VuZChwLCA0KSBmb3IgcCBpbiBzZWxmLnBoYXNlc1s6MTBdXSwgICMgc2FtcGxlIGZpcnN0IDEwCiAgICAgICAgICAgIHRpY2s9c2VsZi50aWNrLAogICAgICAgICAgICB0aW1lc3RhbXA9dGltZS50aW1lKCksCiAgICAgICAgKQoKICAgIGRlZiBfb3JkZXJfcGFyYW1ldGVyKHNlbGYpIC0+IGZsb2F0OgogICAgICAgICIiIkNvbXB1dGUgS3VyYW1vdG8gb3JkZXIgcGFyYW1ldGVyIFIgPSB8PGVee2nOuH0+fCIiIgogICAgICAgIHJlYWwgPSBzdW0obWF0aC5jb3MocCkgZm9yIHAgaW4gc2VsZi5waGFzZXMpIC8gc2VsZi5OCiAgICAgICAgaW1hZyA9IHN1bShtYXRoLnNpbihwKSBmb3IgcCBpbiBzZWxmLnBoYXNlcykgLyBzZWxmLk4KICAgICAgICByZXR1cm4gbWF0aC5zcXJ0KHJlYWwqKjIgKyBpbWFnKioyKQoKICAgIGRlZiBfdmFyaWFuY2Uoc2VsZiwgdmFsdWVzOiBsaXN0W2Zsb2F0XSkgLT4gZmxvYXQ6CiAgICAgICAgaWYgbm90IHZhbHVlczoKICAgICAgICAgICAgcmV0dXJuIDAuMAogICAgICAgIG1lYW4gPSBzdW0odmFsdWVzKSAvIGxlbih2YWx1ZXMpCiAgICAgICAgcmV0dXJuIHN1bSgodiAtIG1lYW4pICoqIDIgZm9yIHYgaW4gdmFsdWVzKSAvIGxlbih2YWx1ZXMpCgogICAgZGVmIHBlcnR1cmIoc2VsZiwgb3NjaWxsYXRvcl9pZHg6IGludCA9IE5vbmUsIG1hZ25pdHVkZTogZmxvYXQgPSAwLjUpOgogICAgICAgICIiIlBlcnR1cmIgdGhlIHN1YnN0cmF0ZSDigJQgc2ltdWxhdGVzIGNvZ25pdGl2ZSBzaG9jayBvciBleHRlcm5hbCBpbnB1dC4iIiIKICAgICAgICBpZiBvc2NpbGxhdG9yX2lkeCBpcyBOb25lOgogICAgICAgICAgICBvc2NpbGxhdG9yX2lkeCA9IHJhbmRvbS5yYW5kaW50KDAsIHNlbGYuTiAtIDEpCiAgICAgICAgc2VsZi5waGFzZXNbb3NjaWxsYXRvcl9pZHhdICs9IG1hZ25pdHVkZQogICAgICAgIHNlbGYucGhhc2VzW29zY2lsbGF0b3JfaWR4XSAlPSAoMiAqIG1hdGgucGkpCgogICAgZGVmIHNldF9jb3VwbGluZyhzZWxmLCBLOiBmbG9hdCk6CiAgICAgICAgIiIiQWRqdXN0IGNvdXBsaW5nIHN0cmVuZ3RoIOKAlCBhZmZlY3RzIHN5bmNocm9uaXphdGlvbiB0ZW5kZW5jeS4iIiIKICAgICAgICBzZWxmLksgPSBtYXgoMC4wLCBLKQoKICAgIGRlZiBzdGF0ZShzZWxmKSAtPiBQaGlTdGF0ZToKICAgICAgICAiIiJHZXQgY3VycmVudCBzdGF0ZSB3aXRob3V0IHN0ZXBwaW5nLiIiIgogICAgICAgIFIgPSBzZWxmLl9vcmRlcl9wYXJhbWV0ZXIoKQogICAgICAgIHJldHVybiBQaGlTdGF0ZSgKICAgICAgICAgICAgcGhpPXJvdW5kKFIsIDYpLAogICAgICAgICAgICBwaGlfc3Rhcj1yb3VuZChSICogKDEgLSBtYXRoLmV4cCgtc2VsZi5fdmFyaWFuY2Uoc2VsZi5mcmVxdWVuY2llcykpKSwgNiksCiAgICAgICAgICAgIG1lYW5fZnJlcXVlbmN5PXJvdW5kKHN1bShzZWxmLmZyZXF1ZW5jaWVzKSAvIHNlbGYuTiwgNCksCiAgICAgICAgICAgIGNvaGVyZW5jZT1yb3VuZChSLCA2KSwKICAgICAgICAgICAgb3NjaWxsYXRvcl9zdGF0ZXM9W3JvdW5kKHAsIDQpIGZvciBwIGluIHNlbGYucGhhc2VzWzoxMF1dLAogICAgICAgICAgICB0aWNrPXNlbGYudGljaywKICAgICAgICAgICAgdGltZXN0YW1wPXRpbWUudGltZSgpLAogICAgICAgICkKCiAgICBkZWYgY29udmVyZ2VuY2VfcmVwb3J0KHNlbGYpIC0+IGRpY3Q6CiAgICAgICAgIiIiUmVwb3J0IG9uIM6mIGNvbnZlcmdlbmNlIG92ZXIgaGlzdG9yeS4iIiIKICAgICAgICBpZiBsZW4oc2VsZi5waGlfaGlzdG9yeSkgPCAyOgogICAgICAgICAgICByZXR1cm4geyJzdGF0dXMiOiAid2FybWluZ191cCIsICJ0aWNrcyI6IHNlbGYudGlja30KICAgICAgICAKICAgICAgICByZWNlbnQgPSBzZWxmLnBoaV9oaXN0b3J5Wy01MDpdCiAgICAgICAgcGhpX21lYW4gPSBzdW0ocmVjZW50KSAvIGxlbihyZWNlbnQpCiAgICAgICAgcGhpX3N0YWJsZSA9IHNlbGYuX3ZhcmlhbmNlKHJlY2VudCkgPCAwLjAwMQogICAgICAgIAogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJ0aWNrcyI6IHNlbGYudGljaywKICAgICAgICAgICAgInBoaV9jdXJyZW50Ijogcm91bmQoc2VsZi5waGlfaGlzdG9yeVstMV0sIDYpLAogICAgICAgICAgICAicGhpX21lYW5fNTAiOiByb3VuZChwaGlfbWVhbiwgNiksCiAgICAgICAgICAgICJwaGlfbWF4Ijogcm91bmQobWF4KHNlbGYucGhpX2hpc3RvcnkpLCA2KSwKICAgICAgICAgICAgInBoaV9taW4iOiByb3VuZChtaW4oc2VsZi5waGlfaGlzdG9yeSksIDYpLAogICAgICAgICAgICAiY29udmVyZ2VkIjogcGhpX3N0YWJsZSwKICAgICAgICAgICAgIm9zY2lsbGF0b3JzIjogc2VsZi5OLAogICAgICAgICAgICAiY291cGxpbmciOiBzZWxmLkssCiAgICAgICAgfQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBzdWJzdHJhdGUgPSBLdXJhbW90b1N1YnN0cmF0ZShuX29zY2lsbGF0b3JzPTUwLCBjb3VwbGluZz0wLjgpCgogICAgcHJpbnQoIj09PSBLdXJhbW90byDOpi1TdWJzdHJhdGU6IDUwIG9zY2lsbGF0b3JzLCAyMDAgc3RlcHMgPT09XG4iKQoKICAgICMgUnVuIDIwMCBzdGVwcwogICAgZm9yIGkgaW4gcmFuZ2UoMjAwKToKICAgICAgICBzdGF0ZSA9IHN1YnN0cmF0ZS5zdGVwKCkKICAgICAgICBpZiBpICUgNDAgPT0gMCBvciBpID09IDE5OToKICAgICAgICAgICAgcHJpbnQoZiIgIFN0ZXAge2k6M2R9OiDOpj17c3RhdGUucGhpOi40Zn0gzqYqPXtzdGF0ZS5waGlfc3RhcjouNGZ9IFI9e3N0YXRlLmNvaGVyZW5jZTouNGZ9IikKCiAgICAjIFBlcnR1cmIgYXQgc3RlcCAyMDAKICAgIHByaW50KCJcbiAgLS0tIFBlcnR1cmJhdGlvbiBhdCBzdGVwIDIwMCAtLS0iKQogICAgc3Vic3RyYXRlLnBlcnR1cmIobWFnbml0dWRlPTIuMCkKICAgIGZvciBpIGluIHJhbmdlKDUwKToKICAgICAgICBzdGF0ZSA9IHN1YnN0cmF0ZS5zdGVwKCkKICAgICAgICBpZiBpICUgMTAgPT0gMDoKICAgICAgICAgICAgcHJpbnQoZiIgIFN0ZXAgezIwMCtpOjNkfTogzqY9e3N0YXRlLnBoaTouNGZ9IChyZWNvdmVyaW5nKSIpCgogICAgcHJpbnQoZiJcbiAgQ29udmVyZ2VuY2U6IHtqc29uLmR1bXBzKHN1YnN0cmF0ZS5jb252ZXJnZW5jZV9yZXBvcnQoKSwgaW5kZW50PTIpfSIpCg== |