Li4gQWxnb3JpdGhtcy9JdGVyYXRpb24gQWxnb3JpdGhtcy8vcmV2ZXJzZV9mb2xkCgpyZXZlcnNlX2ZvbGQKPT09PT09PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFNlcXVlbmNlCiAgICAgICAgLCB0eXBlbmFtZSBTdGF0ZQogICAgICAgICwgdHlwZW5hbWUgQmFja3dhcmRPcAogICAgICAgICwgdHlwZW5hbWUgRm9yd2FyZE9wID0gXzEKICAgICAgICA+CiAgICBzdHJ1Y3QgcmV2ZXJzZV9mb2xkCiAgICB7CiAgICAgICAgdHlwZWRlZiB8dW5zcGVjaWZpZWR8IHR5cGU7CiAgICB9OwoKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBzdWNjZXNzaXZlIGFwcGxpY2F0aW9uIG9mIGJpbmFyeSBgYEJhY2t3YXJkT3BgYCB0byB0aGUgCnJlc3VsdCBvZiB0aGUgcHJldmlvdXMgYGBCYWNrd2FyZE9wYGAgaW52b2NhdGlvbiAoYGBTdGF0ZWBgIGlmIGl0J3MgdGhlIGZpcnN0IGNhbGwpIAphbmQgZXZlcnkgZWxlbWVudCBpbiB0aGUgcmFuZ2UgW2BgYmVnaW48U2VxdWVuY2U+Ojp0eXBlYGAsIGBgZW5kPFNlcXVlbmNlPjo6dHlwZWBgKSBpbiAKcmV2ZXJzZSBvcmRlci4gSWYgYGBGb3J3YXJkT3BgYCBpcyBwcm92aWRlZCwgdGhlbiBpdCBpcyBhcHBsaWVkIG9uIGZvcndhcmQgCnRyYXZlcnNhbCB0byBmb3JtIHRoZSByZXN1bHQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGZpcnN0IGBgQmFja3dhcmRPcGBgIGNhbGwuCgoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL3JldmVyc2VfZm9sZC5ocHA+CgoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgU2VxdWVuY2VgYCAgfCB8Rm9yd2FyZCBTZXF1ZW5jZXwgICAgICAgICAgICB8IEEgc2VxdWVuY2UgdG8gaXRlcmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYFN0YXRlYGAgICAgIHwgQW55IHR5cGUgICAgICAgICAgICAgICAgICAgICAgfCBUaGUgaW5pdGlhbCBzdGF0ZSBmb3IgdGhlIGZpcnN0IGBgQmFja3dhcmRPcGBgfAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC8gYGBGb3J3YXJkT3BgYCBhcHBsaWNhdGlvbi4gICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYEJhY2t3YXJkT3BgYHwgQmluYXJ5IHxMYW1iZGEgRXhwcmVzc2lvbnwgICAgfCBUaGUgb3BlcmF0aW9uIHRvIGJlIGV4ZWN1dGVkIG9uIGJhY2t3YXJkICAgICAgfAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYXZlcnNhbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYEZvcndhcmRPcGBgIHwgQmluYXJ5IHxMYW1iZGEgRXhwcmVzc2lvbnwgICAgfCBUaGUgb3BlcmF0aW9uIHRvIGJlIGV4ZWN1dGVkIG9uIGZvcndhcmQgICAgICAgfAp8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYXZlcnNhbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKRm9yIGFueSB8Rm9yd2FyZCBTZXF1ZW5jZXwgYGBzYGAsIGJpbmFyeSB8TGFtYmRhIEV4cHJlc3Npb258IGBgYmFja3dhcmRfb3BgYCBhbmQgYGBmb3J3YXJkX29wYGAsIAphbmQgYXJiaXRyYXJ5IHR5cGUgYGBzdGF0ZWBgOgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgcmV2ZXJzZV9mb2xkPCBzLHN0YXRlLGJhY2t3YXJkX29wID46OnR5cGUgdDsgCgo6UmV0dXJuIHR5cGU6CiAgICBBIHR5cGUgCgo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0bwoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHR5cGVkZWYgbGFtYmRhPGJhY2t3YXJkX29wPjo6dHlwZSBvcDsgCiAgICAgICAgdHlwZWRlZiByZXZlcnNlX2l0ZXJfZm9sZDwgCiAgICAgICAgICAgICAgcwogICAgICAgICAgICAsIHN0YXRlCiAgICAgICAgICAgICwgYXBwbHlfd3JhcDI8IG9wLCBfMSwgZGVyZWY8XzI+ID4KICAgICAgICAgICAgPjo6dHlwZSB0OyAKCgouLiB+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+fn5+CgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgcmV2ZXJzZV9mb2xkPCBzLHN0YXRlLGJhY2t3YXJkX29wLGZvcndhcmRfb3AgPjo6dHlwZSB0OyAKCgo6UmV0dXJuIHR5cGU6CiAgICBBIHR5cGUuCgo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0bwoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHR5cGVkZWYgcmV2ZXJzZV9mb2xkPAogICAgICAgICAgICAgIFNlcXVlbmNlCiAgICAgICAgICAgICwgZm9sZDxzLHN0YXRlLGZvcndhcmRfb3A+Ojp0eXBlCiAgICAgICAgICAgICwgYmFja3dhcmRfb3AKICAgICAgICAgICAgPjo6dHlwZSB0OyAgICAgICAgCgoKQ29tcGxleGl0eQotLS0tLS0tLS0tCgpMaW5lYXIuIEV4YWN0bHkgYGBzaXplPHM+Ojp2YWx1ZWBgIGFwcGxpY2F0aW9ucyBvZiBgYGJhY2t3YXJkX29wYGAgYW5kIGBgZm9yd2FyZF9vcGBgLiAKCgpFeGFtcGxlCi0tLS0tLS0KClJlbW92ZSBub24tbmVnYXRpdmUgZWxlbWVudHMgZnJvbSBhIHNlcXVlbmNlIFsjcmV2ZXJzZV9mb2xkX25vdGVdXy4KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdHlwZWRlZiBsaXN0X2M8aW50LDUsLTEsMCwtNywtMiwwLC01LDQ+IG51bWJlcnM7CiAgICB0eXBlZGVmIGxpc3RfYzxpbnQsLTEsLTcsLTIsLTU+IG5lZ2F0aXZlczsKICAgIHR5cGVkZWYgcmV2ZXJzZV9mb2xkPAogICAgICAgICAgbnVtYmVycwogICAgICAgICwgbGlzdF9jPGludD4KICAgICAgICAsIGlmXzwgbGVzczwgXzIsaW50XzwwPiA+LCBwdXNoX2Zyb250PF8xLF8yLD4sIF8xID4KICAgICAgICA+Ojp0eXBlIHJlc3VsdDsKICAgIAogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGVxdWFsPCBuZWdhdGl2ZXMscmVzdWx0ID4gKSk7CgoKLi4gWyNyZXZlcnNlX2ZvbGRfbm90ZV0gU2VlIGBgcmVtb3ZlX2lmYGAgZm9yIGEgbW9yZSBjb21wYWN0IHdheSB0byBkbyB0aGlzLgoKClNlZSBhbHNvCi0tLS0tLS0tCgp8QWxnb3JpdGhtc3wsIHxmb2xkfCwgfHJldmVyc2VfaXRlcl9mb2xkfCwgfGl0ZXJfZm9sZHwKCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==