Li4gU2VxdWVuY2VzL0ludHJpbnNpYyBNZXRhZnVuY3Rpb25zLy9pbnNlcnQKCmluc2VydAo9PT09PT0KClN5bm9wc2lzCi0tLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdGVtcGxhdGU8IAogICAgICAgICAgdHlwZW5hbWUgU2VxdWVuY2UKICAgICAgICAsIHR5cGVuYW1lIFBvcwogICAgICAgICwgdHlwZW5hbWUgVCAKICAgICAgICA+CiAgICBzdHJ1Y3QgaW5zZXJ0CiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKCiAgICB0ZW1wbGF0ZTwgCiAgICAgICAgICB0eXBlbmFtZSBTZXF1ZW5jZQogICAgICAgICwgdHlwZW5hbWUgVCAKICAgICAgICA+CiAgICBzdHJ1Y3QgaW5zZXJ0CiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpgYGluc2VydGBgIGlzIGFuIHxvdmVybG9hZGVkIG5hbWV8OgoKKiBgYGluc2VydDxTZXF1ZW5jZSxQb3MsVD5gYCBwZXJmb3JtcyBhbiBpbnNlcnRpb24gb2YKICB0eXBlIGBgVGBgIGF0IGFuIGFyYml0cmFyeSBwb3NpdGlvbiBgYFBvc2BgIGluIGBgU2VxdWVuY2VgYC4gYGBQb3NgYCBpcyBpZ25vcmVkIGlzCiAgYGBTZXF1ZW5jZWBgIGlzIGEgbW9kZWwgb2YgfEV4dGVuc2libGUgQXNzb2NpYXRpdmUgU2VxdWVuY2V8LiAKCiogYGBpbnNlcnQ8U2VxdWVuY2UsVD5gYCBpcyBhIHNob3J0Y3V0IG5vdGF0aW9uIGZvciBgYGluc2VydDxTZXF1ZW5jZSxQb3MsVD5gYCBmb3IgdGhlIAogIGNhc2Ugd2hlbiBgYFNlcXVlbmNlYGAgaXMgYSBtb2RlbCBvZiB8RXh0ZW5zaWJsZSBBc3NvY2lhdGl2ZSBTZXF1ZW5jZXwuCgoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL2luc2VydC5ocHA+CgoKTW9kZWwgb2YKLS0tLS0tLS0KCnxUYWcgRGlzcGF0Y2hlZCBNZXRhZnVuY3Rpb258CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgU2VxdWVuY2VgYCAgfCB8RXh0ZW5zaWJsZSBTZXF1ZW5jZXwgb3IgICAgICAgICAgfCBBIHNlcXVlbmNlIHRvIGluc2VydCBpbnRvLiAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgfCB8RXh0ZW5zaWJsZSBBc3NvY2lhdGl2ZSBTZXF1ZW5jZXwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgUG9zYGAgICAgICAgfCB8Rm9yd2FyZCBJdGVyYXRvcnwgICAgICAgICAgICAgICAgfCBBbiBpdGVyYXRvciBpbiBgYFNlcXVlbmNlYGAgc3BlY2lmeWluZyB0aGUgICAgfAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbnNlcnRpb24gcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgVGBgICAgICAgICAgfCBBbnkgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUaGUgZWxlbWVudCB0byBiZSBpbnNlcnRlZC4gICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgouLiBjb21wb3VuZDo6CiAgICA6Y2xhc3M6IGV4cHJlc3Npb24tc2VtYW50aWNzCgogICAgRm9yIGFueSB8RXh0ZW5zaWJsZSBTZXF1ZW5jZXwgYGBzYGAsIGl0ZXJhdG9yIGBgcG9zYGAgaW4gYGBzYGAsIGFuZCBhcmJpdHJhcnkgdHlwZSBgYHhgYDoKCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgICAgIHR5cGVkZWYgaW5zZXJ0PHMscG9zLHg+Ojp0eXBlIHI7IAoKICAgIDpSZXR1cm4gdHlwZToKICAgICAgICB8RXh0ZW5zaWJsZSBTZXF1ZW5jZXwKCiAgICA6UHJlY29uZGl0aW9uOgogICAgICAgIGBgcG9zYGAgaXMgYW4gaXRlcmF0b3IgaW4gYGBzYGAuIAoKICAgIDpTZW1hbnRpY3M6CiAgICAgICAgYGByYGAgaXMgYSBzZXF1ZW5jZSwgfGNvbmNlcHQtaWRlbnRpY2FsfCB0byBgYHNgYCwgb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50czogCiAgICAgICAgW2BgYmVnaW48cz46OnR5cGVgYCwgYGBwb3NgYCksIGBgeGBgLCBbYGBwb3NgYCwgYGBlbmQ8cz46OnR5cGVgYCkuIAogICAgICAgIAogICAgOlBvc3Rjb25kaXRpb246CiAgICAgICAgVGhlIHJlbGF0aXZlIG9yZGVyIG9mIHRoZSBlbGVtZW50cyBpbiBgYHJgYCBpcyB0aGUgc2FtZSBhcyBpbiBgYHNgYC4gCgogICAgICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICAgICAgICAgYXQ8IHIsIGRpc3RhbmNlPCBiZWdpbjxzPjo6dHlwZSxwb3MgPjo6dHlwZSA+Ojp0eXBlCiAgICAgICAgCiAgICAgICAgaXMgaWRlbnRpY2FsIHRvIGBgeGBgOyAKCiAgICAgICAgLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgICAgICAgICBzaXplPHI+Ojp2YWx1ZSA9PSBzaXplPHM+Ojp2YWx1ZSArIDE7ICAgICAgICAKICAgICAgICAKCgouLiBjb21wb3VuZDo6CiAgICA6Y2xhc3M6IGV4cHJlc3Npb24tc2VtYW50aWNzCgoKICAgIEZvciBhbnkgfEV4dGVuc2libGUgQXNzb2NpYXRpdmUgU2VxdWVuY2V8IGBgc2BgLCBpdGVyYXRvciBgYHBvc2BgIGluIGBgc2BgLAogICAgYW5kIGFyYml0cmFyeSB0eXBlIGBgeGBgOgoKCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgICAgIHR5cGVkZWYgaW5zZXJ0PHMseD46OnR5cGUgcjsgCgogICAgOlJldHVybiB0eXBlOgogICAgICAgIHxFeHRlbnNpYmxlIEFzc29jaWF0aXZlIFNlcXVlbmNlfAoKICAgIDpTZW1hbnRpY3M6CiAgICAgICAgYGByYGAgaXMgfGNvbmNlcHQtaWRlbnRpY2FsfCBhbmQgZXF1aXZhbGVudCB0byBgYHNgYCwgZXhjZXB0IHRoYXQKICAgICAgICBgYGF0PCByLCBrZXlfdHlwZTxzLHg+Ojp0eXBlID46OnR5cGVgYCBpcyBpZGVudGljYWwgdG8gYGB2YWx1ZV90eXBlPHMseD46OnR5cGVgYC4KICAgICAgICAKICAgIDpQb3N0Y29uZGl0aW9uOgogICAgICAgIGBgc2l6ZTxyPjo6dmFsdWUgPT0gc2l6ZTxzPjo6dmFsdWUgKyAxYGAuCgoKICAgIC4uIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgICAgIHR5cGVkZWYgaW5zZXJ0PHMscG9zLHg+Ojp0eXBlIHI7IAoKICAgIDpSZXR1cm4gdHlwZToKICAgICAgICB8RXh0ZW5zaWJsZSBBc3NvY2lhdGl2ZSBTZXF1ZW5jZXwKCiAgICA6UHJlY29uZGl0aW9uOgogICAgICAgIGBgcG9zYGAgaXMgYW4gaXRlcmF0b3IgaW4gYGBzYGAuIAoKICAgIDpTZW1hbnRpY3M6CiAgICAgICAgRXF1aXZhbGVudCB0byBgYHR5cGVkZWYgaW5zZXJ0PHMseD46OnR5cGUgcmBgOyBgYHBvc2BgIGlzIGlnbm9yZWQuCiAgICAgICAgCgoKQ29tcGxleGl0eQotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFNlcXVlbmNlIGFyY2hldHlwZSAgICAgICAgICAgICAgICAgICAgfCBDb21wbGV4aXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IHxFeHRlbnNpYmxlIEFzc29jaWF0aXZlIFNlcXVlbmNlfCAgICAgfCBBbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4gICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IHxFeHRlbnNpYmxlIFNlcXVlbmNlfCAgICAgICAgICAgICAgICAgfCBMaW5lYXIgaW4gdGhlIHdvcnN0IGNhc2UsIG9yIGFtb3J0aXplZCAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjb25zdGFudCB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0eXBlZGVmIHZlY3Rvcl9jPGludCwwLDEsMyw0LDUsNiw3LDgsOT4gbnVtYmVyczsKICAgIHR5cGVkZWYgZmluZDwgbnVtYmVycyxpbnRlZ3JhbF9jPGludCwzPiA+Ojp0eXBlIHBvczsKICAgIHR5cGVkZWYgaW5zZXJ0PCBudW1iZXJzLHBvcyxpbnRlZ3JhbF9jPGludCwyPiA+Ojp0eXBlIHJhbmdlOwogICAgCiAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCBzaXplPHJhbmdlPjo6dmFsdWUsID09LCAxMCApOwogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGVxdWFsPCByYW5nZSxyYW5nZV9jPGludCwwLDEwPiA+ICkpOwoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIG1hcDwgbXBsOjpwYWlyPGludCx1bnNpZ25lZD4gPiBtOwogICAgdHlwZWRlZiBpbnNlcnQ8bSxtcGw6OnBhaXI8Y2hhcixsb25nPiA+Ojp0eXBlIG0xOwogICAgCiAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCBzaXplPG0xPjo6dmFsdWUsID09LCAyICk7CiAgICBCT09TVF9NUExfQVNTRVJUKCggaXNfc2FtZTwgYXQ8bTEsaW50Pjo6dHlwZSx1bnNpZ25lZCA+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGlzX3NhbWU8IGF0PG0xLGNoYXI+Ojp0eXBlLGxvbmcgPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfEV4dGVuc2libGUgU2VxdWVuY2V8LCB8RXh0ZW5zaWJsZSBBc3NvY2lhdGl2ZSBTZXF1ZW5jZXwsIHxpbnNlcnRfcmFuZ2V8LCB8cHVzaF9mcm9udHwsIHxwdXNoX2JhY2t8LCB8ZXJhc2V8CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=