KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogfEJvb3N0fCBQb2ludGVyIENvbnRhaW5lciBMaWJyYXJ5CisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIAouLiB8Qm9vc3R8IGltYWdlOjogYm9vc3QucG5nCgpDbGFzcyBgYHJldmVyc2libGVfcHRyX2NvbnRhaW5lcmBgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhpcyBjbGFzcyBpcyBub3QgYSByZWFsIGNsYXNzIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBsaWJyYXJ5LiAKSXRzIHB1cnBvc2UgaXMgdG8gcHJlc2VudCB0aGUgZ2VuZXJhbCBpbnRlcmZhY2Ugb2YgYWxsIHRoZSBwb2ludGVyIGNvbnRhaW5lcnMuCgoqKkhpZXJhcmNoeToqKgoKLSBgYHJldmVyc2libGVfcHRyX2NvbnRhaW5lcmBgCgogIC0gYHB0cl9zZXF1ZW5jZV9hZGFwdGVyIDxwdHJfc2VxdWVuY2VfYWRhcHRlci5odG1sPmBfCgogICAgLSBgcHRyX3ZlY3RvciA8cHRyX3ZlY3Rvci5odG1sPmBfCiAgICAtIGBwdHJfbGlzdCA8cHRyX2xpc3QuaHRtbD5gXyAKICAgIC0gYHB0cl9kZXF1ZSA8cHRyX2RlcXVlLmh0bWw+YF8KICAgIC0gYHB0cl9hcnJheSA8cHRyX2FycmF5Lmh0bWw+YF8KICAgIAogIC0gYGFzc29jaWF0aXZlX3B0cl9jb250YWluZXIgPGFzc29jaWF0aXZlX3B0cl9jb250YWluZXIuaHRtbD5gXyAKICAKICAgIC0gYHB0cl9zZXRfYWRhcHRlciA8cHRyX3NldF9hZGFwdGVyLmh0bWw+YF8KICAgIC0gYHB0cl9tdWx0aXNldF9hZGFwdGVyIDxwdHJfbXVsdGlzZXRfYWRhcHRlci5odG1sPmBfCiAgICAtIGBwdHJfbWFwX2FkYXB0ZXIgPHB0cl9tYXBfYWRhcHRlci5odG1sPmBfCiAgICAtIGBwdHJfbXVsdGlfbWFwX2FkYXB0ZXIgPHB0cl9tdWx0aW1hcF9hZGFwdGVyLmh0bWw+YF8KCiAgICAgIC0gYHB0cl9zZXQgPHB0cl9zZXQuaHRtbD5gXwogICAgICAtIGBwdHJfbXVsdGlfc2V0IDxwdHJfbXVsdGlzZXQuaHRtbD5gXyAKICAgICAgLSBgcHRyX21hcCA8cHRyX21hcC5odG1sPmBfCiAgICAgIC0gYHB0cl9tdWx0aW1hcCA8cHRyX211bHRpbWFwLmh0bWw+YF8KCioqTmF2aWdhdGU6KioKCi0gYGhvbWUgPHB0cl9jb250YWluZXIuaHRtbD5gXwotIGByZWZlcmVuY2UgPHJlZmVyZW5jZS5odG1sPmBfCgoqKnN5bm9wc2lzOioqCgouLiBwYXJzZWQtbGl0ZXJhbDo6IAogICAgICAgICAgICAKICAgICAgICBuYW1lc3BhY2UgYm9vc3QKICAgICAgICB7ICAgICAgCiAgICAgICAgICAgIHRlbXBsYXRlCiAgICAgICAgICAgIDwgCiAgICAgICAgICAgICAgICBjbGFzcyBULCAKICAgICAgICAgICAgICAgIGNsYXNzIENsb25lQWxsb2NhdG9yLAogICAgICAgICAgICAgICAgY2xhc3MgVm9pZFB0ckNvbnRhaW5lcgogICAgICAgICAgICA+CiAgICAgICAgICAgIGNsYXNzIHJldmVyc2libGVfcHRyX2NvbnRhaW5lciAKICAgICAgICAgICAgewogICAgICAgICAgICBwdWJsaWM6IC8vIGB0eXBlZGVmc2BfCiAgICAgICAgICAgICAgICB0eXBlZGVmICBUKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwogICAgICAgICAgICAgICAgdHlwZWRlZiAgVCYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwogICAgICAgICAgICAgICAgdHlwZWRlZiAgY29uc3QgVCYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOwogICAgICAgICAgICAgICAgdHlwZWRlZiAgKmltcGxlbWVudGF0aW9uIGRlZmluZWQqICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcjsKICAgICAgICAgICAgICAgIHR5cGVkZWYgICppbXBsZW1lbnRhdGlvbiBkZWZpbmVkKiAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfaXRlcmF0b3I7CiAgICAgICAgICAgICAgICB0eXBlZGVmICB0eXBlbmFtZSBWb2lkUHRyQ29udGFpbmVyOjpkaWZmZXJuY2VfdHlwZSAgICBkaWZmZXJlbmNlX3R5cGU7IAogICAgICAgICAgICAgICAgdHlwZWRlZiAgdHlwZW5hbWUgVm9pZFB0ckNvbnRhaW5lcjo6c2l6ZV90eXBlICAgICAgICAgc2l6ZV90eXBlOwogICAgICAgICAgICAgICAgdHlwZWRlZiAgdHlwZW5hbWUgVm9pZFB0ckNvbnRhaW5lcjo6YWxsb2NhdG9yX3R5cGUgICAgYWxsb2NhdG9yX3R5cGU7CiAgICAgICAgICAgICAgICB0eXBlZGVmICAqaW1wbGVtZW50YXRpb24gZGVmaW5lZCogICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CiAgICAgICAgICAgICAgICB0eXBlZGVmICAqaW1wbGVtZW50YXRpb24gZGVmaW5lZCogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CiAgICAgICAgICAgICAgICB0eXBlZGVmICAqaW1wbGVtZW50YXRpb24gZGVmaW5lZCogICAgICAgICAgICAgICAgICAgICAgIGF1dG9fdHlwZTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHB1YmxpYzogLy8gYGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3lgXwogICAgICAgICAgICAgICAgcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyKCk7CiAgICAgICAgICAgICAgICBleHBsaWNpdCByZXZlcnNpYmxlX3B0cl9jb250YWluZXIoIGNvbnN0IHJldmVyc2libGVfcHRyX2NvbnRhaW5lciYgciApOyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRlbXBsYXRlPCBjbGFzcyBEZXJpdmVkID4KICAgICAgICAgICAgICAgIGV4cGxpY2l0IHJldmVyc2libGVfcHRyX2NvbnRhaW5lciggY29uc3QgcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyPERlcml2ZWQ+JiByICk7CiAgICAgICAgICAgICAgICBleHBsaWNpdCByZXZlcnNpYmxlX3B0cl9jb250YWluZXIoIHN0ZDo6YXV0b19wdHI8cmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyPiByICk7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTwgY2xhc3MgSW5wdXRJdGVyYXRvciA+CiAgICAgICAgICAgICAgICByZXZlcnNpYmxlX3B0cl9jb250YWluZXIoIElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCApOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB+cmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyKCk7CgogICAgICAgICAgICAgICAgcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyJiAgb3BlcmF0b3I9KCBjb25zdCByZXZlcnNpYmxlX3B0cl9jb250YWluZXImIHIgKTsKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIERlcml2ZWQ+CiAgICAgICAgICAgICAgICByZXZlcnNpYmxlX3B0cl9jb250YWluZXImICBvcGVyYXRvcj0oIGNvbnN0IHJldmVyc2libGVfcHRyX2NvbnRhaW5lcjxEZXJpdmVkPiYgciApOwogICAgICAgICAgICAgICAgcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyJiAgb3BlcmF0b3I9KCBzdGQ6OmF1dG9fcHRyPHJldmVyc2libGVfcHRyX2NvbnRhaW5lcj4gciApOwogICAgICAgICAgICAgICAgYWxsb2NhdG9yX3R5cGUgICAgICAgICAgICAgZ2V0X2FsbG9jYXRvcigpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICBwdWJsaWM6IC8vIGBpdGVyYXRvcnNgXwogICAgICAgICAgICAgICAgaXRlcmF0b3IgICAgICAgICAgICAgICAgYmVnaW4oKTsKICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgIGJlZ2luKCkgY29uc3Q7CiAgICAgICAgICAgICAgICBpdGVyYXRvciAgICAgICAgICAgICAgICBlbmQoKTsKICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgIGVuZCgpIGNvbnN0OwogICAgICAgICAgICAgICAgcmV2ZXJzZV9pdGVyYXRvciAgICAgICAgcmJlZ2luKCk7CiAgICAgICAgICAgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yICByYmVnaW4oKSBjb25zdDsKICAgICAgICAgICAgICAgIHJldmVyc2VfaXRlcmF0b3IgICAgICAgIHJlbmQoKTsKICAgICAgICAgICAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgIHJlbmQoKSBjb25zdDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBwdWJsaWM6IC8vIGBjYXBhY2l0eWBfCiAgICAgICAgICAgICAgICBzaXplX3R5cGUgIHNpemUoKSBjb25zdDsKICAgICAgICAgICAgICAgIHNpemVfdHlwZSAgbWF4X3NpemUoKSBjb25zdDsKICAgICAgICAgICAgICAgIGJvb2wgICAgICAgZW1wdHkoKSBjb25zdDsgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICBwdWJsaWM6IC8vIGBtb2RpZmllcnNgXwogICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgIHN3YXAoIHJldmVyc2libGVfcHRyX2NvbnRhaW5lciYgciApOwogICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgIGNsZWFyKCk6CiAgICAgICAgICAgICAgICBWb2lkUHRyQ29udGFpbmVyJiAgICAgICAgYmFzZSgpOwogICAgICAgICAgICAgICAgY29uc3QgVm9pZFB0ckNvbnRhaW5lciYgIGJhc2UoKSBjb25zdDsKICAgICAgICAgICAgCiAgICAgICAgICAgIHB1YmxpYzogLy8gYHBvaW50ZXIgY29udGFpbmVyIHJlcXVpcmVtZW50c2BfCiAgICAgICAgICAgICAgICBhdXRvX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UoIGl0ZXJhdG9yIHBvc2l0aW9uLCBUKiB4ICk7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTwgY2xhc3MgVSA+CiAgICAgICAgICAgICAgICBhdXRvX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UoIGl0ZXJhdG9yIHBvc2l0aW9uLCBzdGQ6OmF1dG9fcHRyPFU+IHggKTsgICAgCiAgICAgICAgICAgICAgICBzdGQ6OmF1dG9fcHRyPHJldmVyc2libGVfcHRyX2NvbnRhaW5lcj4gIGNsb25lKCkgY29uc3Q7ICAgIAogICAgICAgICAgICAgICAgc3RkOjphdXRvX3B0cjxyZXZlcnNpYmxlX3B0cl9jb250YWluZXI+ICByZWxlYXNlKCk7CiAgICAgICAgICAgICAgICBhdXRvX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UoIGl0ZXJhdG9yIHBvc2l0aW9uICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfTsgLy8gIGNsYXNzICdyZXZlcnNpYmxlX3B0cl9jb250YWluZXInCgogICAgICAgICAgICAvLyBgY29tcGFyaXNvbmBfICAgICAgICAgICAgCiAgICAgICAgICAgIHRlbXBsYXRlIDwgY2xhc3MgVCwgY2xhc3MgQ0EsIGNsYXNzIFZQQyA+CiAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I9PSggY29uc3QgcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyPFQsQ0EsVlBDPiYgeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXZlcnNpYmxlX3B0cl9jb250YWluZXI8VCxDQSxWUEM+JiB5KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHRlbXBsYXRlIDwgY2xhc3MgVCwgY2xhc3MgQ0EsIGNsYXNzIFZQQyAgPgogICAgICAgICAgICBib29sIG9wZXJhdG9yPCggY29uc3QgcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyPFQsQ0EsVlBDPiYgeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldmVyc2libGVfcHRyX2NvbnRhaW5lcjxULENBLFZQQz4mIHkpOwogICAgICAgICAgICAKICAgICAgICAgICAgdGVtcGxhdGUgPCBjbGFzcyBULCBjbGFzcyBDQSwgY2xhc3MgVlBDICA+CiAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPSggY29uc3QgcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyPFQsQ0EsVlBDPiYgeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXZlcnNpYmxlX3B0cl9jb250YWluZXI8VCxDQSxWUEM+JiB5KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHRlbXBsYXRlIDwgY2xhc3MgVCwgIGNsYXNzIENBLCBjbGFzcyBWUEMgPgogICAgICAgICAgICBib29sIG9wZXJhdG9yPiggY29uc3QgcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyPFQsQ0EsVlBDPiYgeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldmVyc2libGVfcHRyX2NvbnRhaW5lcjxULENBLFZQQz4mIHkpOwogICAgICAgICAgICAKICAgICAgICAgICAgdGVtcGxhdGUgPCBjbGFzcyBULCAgY2xhc3MgQ0EsIGNsYXNzIFZQQyA+CiAgICAgICAgICAgIGJvb2wgb3BlcmF0b3I+PSggY29uc3QgcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyPFQsQ0EsVlBDPiYgeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXZlcnNpYmxlX3B0cl9jb250YWluZXI8VCxDQSxWUEM+JiB5KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHRlbXBsYXRlIDwgY2xhc3MgVCwgIGNsYXNzIENBLCBjbGFzcyBWUEMgPgogICAgICAgICAgICBib29sIG9wZXJhdG9yPD0oIGNvbnN0IHJldmVyc2libGVfcHRyX2NvbnRhaW5lcjxULENBLFZQQz4mIHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyPFQsQ0EsVlBDPiYgeSk7CgogICAgICAgICAgICB0ZW1wbGF0ZTwgY2xhc3MgVCwgIGNsYXNzIENBLCBjbGFzcyBWUEMgID4KICAgICAgICAgICAgdm9pZCBzd2FwKCByZXZlcnNpYmxlX3B0cl9jb250YWluZXI8VCxDQSxWUEM+JiB4LAogICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2libGVfcHRyX2NvbnRhaW5lcjxULENBLFZQQz4mIHkgKTsKCiAgICAgICAgICAgIC8vIGNsb25lYWJpbGl0eV8KICAgICAgICAgICAgdGVtcGxhdGU8IGNsYXNzIFQsICBjbGFzcyBDQSwgY2xhc3MgVlBDID4KICAgICAgICAgICAgcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyPFQsQ0EsVlBDPioKICAgICAgICAgICAgbmV3X2Nsb25lKCBjb25zdCByZXZlcnNpYmxlX3B0cl9jb250YWluZXI8VCxDQSxWUEM+JiByICk7CgogICAgICAgICAgICAvLyBgbnVsbCBwcmVkaWNhdGVgXwogICAgICAgICAgICB0ZW1wbGF0ZTwgY2xhc3MgSXRlcmF0b3IgPgogICAgICAgICAgICBib29sIGlzX251bGwoIEl0ZXJhdG9yIGkgKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGBzZXJpYWxpemF0aW9uYF8KICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgQXJjaGl2ZSwgY2xhc3MgVCwgY2xhc3MgQ0EsIGNsYXNzIFZQQz4KICAgICAgICAgICAgdm9pZCBzZXJpYWxpemUoIEFyY2hpdmUmIGFyLCByZXZlcnNpYmxlX3B0cl9jb250YWluZXI8VCxDwSxWUEM+JiBjLCBjb25zdCB1bnNpZ25lZCBpbnQgdmVyc2lvbiApOwoKCiAgICAgICAgfSAvLyBuYW1lc3BhY2UgJ2Jvb3N0JwoKCgpTZW1hbnRpY3MKLS0tLS0tLS0tCgouLiBfYHR5cGVkZWZzYDoKClNlbWFudGljczogdHlwZWRlZnMKXl5eXl5eXl5eXl5eXl5eXl5eXgoKTm90aWNlIGhvdyB0aGVzZSB0d28gdHlwZXMgZGlmZmVyOgoKCi0gYGB0eXBlZGVmIFQqIHZhbHVlX3R5cGU7YGAKCiAgICAtIG5vdGljZSB0aGlzIGhhcyBwb2ludGVyIHR5cGUKCi0gYGB0eXBlZGVmIFQmIHJlZmVyZW5jZTtgYAoKICAgIC0gbm90aWNlIHRoaXMgaXMgbm90IGEgcG9pbnRlciB0eXBlCgpUaGlzIGlzIGRvbmUgdG8gYmUgYWJsZSB0byBhZGQgcG9pbnRlcnMgZGlyZWN0bHkKdG8gdGhlIGNvbnRhaW5lciwgYnV0IHRvIGhpZGUgdGhlIHBvaW50ZXJzIGV4dGVybmFsbHkuCgouLgogICAgICAgIC0gYGB0eXBlZGVmICppbXBsZW1lbnRhdGlvbiBkZWZpbmVkKiBvYmplY3RfdHlwZTtgYAogICAgICAgIC0gdGhpcyBpcyBgYFRgYCBmb3Igc2VxdWVuY2VzIGFuZCBzZXRzCiAgICAgICAgLSB0aGlzIGlzIGBgc3RkOjpwYWlyPGNvbnN0IEtleSwgdm9pZCo+YGAgZm9yIG1hcHMKCkFsc28gbm90aWNlIHRoYXQKCi0gYGB0eXBlZGVmIC4uLiBpdGVyYXRvcmBgCgphbGxvd3Mgb25lIHRvIGl0ZXJhdGUgb3ZlciBgYFQmYGAgb2JqZWN0cywgbm90IGBgVCpgYC4KTm90ZSB0aGF0OjoKCiAgICBpdGVyYXRvciBpID0gLi4uOwogICAgaS5iYXNlKCk7CgpyZXR1cm5zIGFuIGl0ZXJhdG9yIHRoYXQgYWxsb3dzIG9uZSB0byBpdGVyYXRlIG92ZXIgYGB2b2lkKmBgCmVsZW1lbnRzICgqdGhpcyBpcyB2ZXJ5IHJhcmVseSBuZWVkZWQgYW5kIHlvdSBzaG91bGQgbm90IHVzZSB0aGUKZnVuY3Rpb25hbGl0eSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nKikuCgotIGBgdHlwZWRlZiAuLi4gYXV0b190eXBlYGAKClRoaXMgZGVjbGFyYXRpb24gaGlkZXMgYSBwb2ludGVyIHBvaW50ZXIgdHlwZS4gWW91IGNhbiByZWx5IG9uIHRoZSBmb2xsb3dpbmcKb3BlcmF0aW9ucyAKCi4uIHBhcnNlZC1saXRlcmFsOjogCgogICAgVCogb3BlcmF0b3ItPigpIGNvbnN0OwogICAgVCYgb3BlcmF0b3IqKCkgY29uc3Q7CiAgICBUKiByZWxlYXNlKCk7CiAgICB+YXV0b190eXBlKCk7CiAgICBvcGVyYXRvciAqaW1wbGVtZW50YXRpb24tZGVmaW5lZCBib29sKlwgKCk7CgpUaGUgZGVzdHJ1Y3RvciB3aWxsIGRlbGV0ZSB0aGUgc3RvcmVkIG9iamVjdCAqdXNpbmcgdGhlIGNsb25lIGFsbG9jYXRvciBvZiB0aGUgY29udGFpbmVyKgoodGhpcyBleHBsYWlucyB3aHkgd2UgY2Fubm90IHVzZSBgYHN0ZDo6YXV0b19wdHI8VD5gYCkuIEl0IG1pZ2h0IGhlbHAgdG8KdGhpbmsgaXQgaXMganVzdCBhbiBgYHN0ZDo6YXV0b19wdHI8VD5gYC4gWW91IGNhbiBhbHNvIHJldHVybgp0aGUgcG9pbnRlciBmcm9tIGEgZnVuY3Rpb24gb3IgYXNzaWduIGl0IHRvIGFub3RoZXIgcG9pbnRlciB2aWEgdGhlIGBgbW92ZSgpYGAKZnVuY3Rpb24KCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICBhdXRvX3R5cGUgcHRyICAgPSAuLi47CiAgICBhdXRvX3R5cGUgb3RoZXIgPSBib29zdDo6cHRyX2NvbnRhaW5lcjo6bW92ZSggcHRyICk7CiAgICByZXR1cm4gYm9vc3Q6OnB0cl9jb250YWluZXI6Om1vdmUoIG90aGVyICk7CgouLiBfY29uc3RydWN0L2NvcHkvZGVzdHJveToKClNlbWFudGljczogY29uc3RydWN0L2NvcHkvZGVzdHJveQpeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KCi0gYGByZXZlcnNpYmxlX3B0cl9jb250YWluZXIoKTtgYAoKICAgIC0gRWZmZWN0czogQ29uc3RydWN0cyBhbiBlbXB0eSBjb250YWluZXIKCiAgICAtIFBvc3Rjb25kaXRpb25zOiBgYHNpemUoKSA9PSAwYGAKCi4uCiAgICAgICAgLSBgYHJldmVyc2libGVfcHRyX2NvbnRhaW5lciggc2l6ZV90eXBlIG4sIGNvbnN0IFQmIHggKTtgYAoKICAgICAgICAtIEVmZmVjdHM6IENvbnN0cnVjdHMgYSBjb250YWluZXIgd2l0aCBgYG5gYCBjbG9uZXMgb2YgYGB4YGAKCiAgICAgICAgLSBQb3N0Y29uZGl0aW9uczogYGBzaXplKCkgPT0gbmBgCiAgICAKLSBgYGV4cGxpY2l0IHJldmVyc2libGVfcHRyX2NvbnRhaW5lciggY29uc3QgcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyJiByICk7YGAKCiAgICAtIEVmZmVjdHM6IENvbnN0cnVjdHMgYSBjb250YWluZXIgYnkgY2xvbmluZyBhbGwgZWxlbWVudHMgb2YgYGByYGAKICAgIAotIGBgdGVtcGxhdGU8IGNsYXNzIERlcml2ZWQgPiBleHBsaWNpdCByZXZlcnNpYmxlX3B0cl9jb250YWluZXIoIGNvbnN0IHJldmVyc2libGVfcHRyX2NvbnRhaW5lcjxEZXJpdmVkPiYgciApO2BgCgogICAgLSBFZmZlY3RzOiBDb25zdHJ1Y3RzIGEgY29udGFpbmVyIGJ5IGNsb25pbmcgYWxsIGVsZW1lbnRzIG9mIGBgcmBgCiAgICAKICAgIC0gUmVxdWlyZW1lbnRzOiBgYERlcml2ZWRgYCBpcyBkZXJpdmVkIGZyb20gYGBUYGAgCgotIGBgZXhwbGljaXQgcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyKCBzdGQ6OmF1dG9fcHRyPCByZXZlcnNpYmxlX3B0cl9jb250YWluZXIgPiByICk7YGAKCiAgICAtIEVmZmVjdHM6IENvbnN0cnVjdHMgYSBjb250YWluZXIgYnkgdGFraW5nIG93bmVyc2hpcCBvZiB0aGUgc3VwcGxpZWQgcG9pbnRlcnMKCgotIGBgdGVtcGxhdGU8IGNsYXNzIElucHV0SXRlcmF0b3IgPmBgCiAgYGByZXZlcnNpYmxlX3B0cl9jb250YWluZXIoIElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCApO2BgCgogICAgLSBSZXF1aXJlbWVudHM6IGBgKGZpcnN0LGxhc3RdYGAgaXMgYSB2YWxpZCByYW5nZQoKICAgIC0gRWZmZWN0czogQ29uc3RydWN0cyBhIGNvbnRhaW5lciB3aXRoIGEgY2xvbmVkIHJhbmdlIG9mIGBgKGZpcnN0LGxhc3RdYGAKCiAgICAtIFBvc3Rjb25kaXRpb25zOiBgYHNpemUoKSA9PSBzdGQ6OmRpc3RhbmNlKCBmaXJzdCwgbGFzdCApYGAKCi0gYGB+cmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyKCk7YGAKCiAgICAtIEVmZmVjdHM6IERlbGV0ZXMgdGhlIHN0b3JlZCBvYmplY3RzIHZpYSB0aGUgY2xvbmUgYWxsb2NhdG9yCgogICAgLSBUaHJvd3M6IE5vdGhpbmcKCi0gYGByZXZlcnNpYmxlX3B0cl9jb250YWluZXImIG9wZXJhdG9yPSggY29uc3QgcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyJiByICk7YGAKCiAgICAtIEVmZmVjdHM6IEFzc2lnbnMgYSBjbG9uZSBvZiBgYHJgYAogICAgCiAgICAtIEV4Y2VwdGlvbiBzYWZldHk6IHN0cm9uZyBndWFyYW50ZWUKICAgIAotIGBgdGVtcGxhdGU8Y2xhc3MgRGVyaXZlZD4gcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyJiBvcGVyYXRvcj0oIGNvbnN0IHJldmVyc2libGVfcHRyX2NvbnRhaW5lcjxEZXJpdmVkPiYgciApO2BgCgogICAgLSBFZmZlY3RzOiBBc3NpZ25zIGEgY2xvbmUgb2YgYGByYGAKICAgIAogICAgLSBSZXF1aXJlbWVudHM6IGBgRGVyaXZlZGBgIGlzIGRlcml2ZWQgZnJvbSBgYFRgYCAKICAgIAogICAgLSBFeGNlcHRpb24gc2FmZXR5OiBTdHJvbmcgZ3VhcmFudGVlCgotIGBgcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyJiBvcGVyYXRvcj0oIHN0ZDo6YXV0b19wdHI8cmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyPiByICk7YGAKCiAgICAtIEVmZmVjdHM6IERlbGV0ZXMgdGhlIHN0b3JlZCBvYmplY3RzIGFuZCB0aGVuIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgc3VwcGxpZWQgcG9pbnRlcnMKCiAgICAtIFRocm93czogTm90aGluZwoKLSBgYGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdDtgYAoKICAgIC0gRWZmZWN0czogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGFsbG9jYXRvciBvZiB0aGUgY29udGFpbmVyIG9iamVjdAoKCi4uIF9pdGVyYXRvcnM6CgpTZW1hbnRpY3M6IGl0ZXJhdG9ycwpeXl5eXl5eXl5eXl5eXl5eXl5eXgoKKipTZWUgYWxzbzoqKiBgaXRlcmF0b3IgaW52YWxpZGF0aW9uIDxjb252ZW50aW9ucy5odG1sI2l0ZXJhdG9ycy1hcmUtaW52YWxpZGF0ZWQtYXMtaW4tdGhlLWNvcnJlc3BvbmRpbmctc3RhbmRhcmQtY29udGFpbmVyPmBfCgotIGBgaXRlcmF0b3IgYmVnaW4oKTtgYAotIGBgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdDtgYAoKICAgIC0gRWZmZWN0czogUmV0dXJucyBhIG11dGFibGUvbm9uLW11dGFibGUgaXRlcmF0b3Igd2l0aCBgYHZhbHVlX3R5cGUgVGBgCgogICAgLSBUaHJvd3M6IE5vdGhpbmcKCi0gYGBpdGVyYXRvciBlbmQoKTtgYAotIGBgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3Q7YGAKCiAgICAtIEVmZmVjdHM6IFJldHVybnMgYSBtdXRhYmxlL25vbi1tdXRhYmxlIGl0ZXJhdG9yIHdpdGggYGB2YWx1ZV90eXBlIFRgYAoKICAgIC0gVGhyb3dzOiBOb3RoaW5nCgotIGBgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKTtgYAoKLSBgYGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3Q7YGAKCiAgICAtIEVmZmVjdHM6IFJldHVybnMgYSBtdXRhYmxlL25vbi1tdXRhYmxlIHJldmVyc2UgaXRlcmF0b3Igd2l0aCBgYHZhbHVlX3R5cGUgVGBgCgogICAgLSBUaHJvd3M6IE5vdGhpbmcKCi0gYGByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKTtgYAoKLSBgYGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0O2BgCgogICAgLSBFZmZlY3RzOiBSZXR1cm5zIGEgbXV0YWJsZS9ub24tbXV0YWJsZSByZXZlcnNlIGl0ZXJhdG9yIHdpdGggYGB2YWx1ZV90eXBlIFRgYAoKICAgIC0gVGhyb3dzOiBOb3RoaW5nCgouLiBfY2FwYWNpdHk6IAoKU2VtYW50aWNzOiBjYXBhY2l0eQpeXl5eXl5eXl5eXl5eXl5eXl5eCgotIGBgc2l6ZV90eXBlIHNpemUoKSBjb25zdDtgYAoKICAgIC0gRWZmZWN0czogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN0b3JlZCBlbGVtZW50cwoKICAgIC0gVGhyb3dzOiBOb3RoaW5nCgotIGBgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3Q7YGAKCiAgICAtIEVmZmVjdHM6IFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0b3JlZCBlbGVtZW50cwoKICAgIC0gVGhyb3dzOiBOb3RoaW5nCgotIGBgYm9vbCBlbXB0eSgpIGNvbnN0O2BgCgogICAgLSBFZmZlY3RzOiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbnRhaW5lciBpcyBlbXB0eSBvciBub3QKCiAgICAtIFRocm93czogTm90aGluZwoKCi4uIF9tb2RpZmllcnM6CgpTZW1hbnRpY3M6IG1vZGlmaWVycwpeXl5eXl5eXl5eXl5eXl5eXl5eXgoKLSBgYHZvaWQgc3dhcCggcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyJiByICk7YGAKCiAgICAtIEVmZmVjdHM6IFN3YXBzIHRoZSBjb250ZW50IG9mIHRoZSB0d28gY29udGFpbmVycwoKICAgIC0gVGhyb3dzOiBOb3RoaW5nCgotIGBgdm9pZCBjbGVhcigpO2BgCgogICAgLSBFZmZlY3RzOiBEZXN0cm95cyBhbGwgb2JqZWN0IG9mIHRoZSBjb250YWluZXIgCgogICAgLSBQb3N0Y29uZGl0aW9uczogYGBlbXB0eSgpID09IHRydWVgYAoKICAgIC0gVGhyb3dzOiBOb3RoaW5nCgotIGBgVm9pZFB0ckNvbnRhaW5lciYgYmFzZSgpO2BgCgotIGBgY29uc3QgVm9pZFB0ckNvbnRhaW5lciYgYmFzZSgpIGNvbnN0O2BgCgogICAgLSBSZXR1cm5zOiBhIHJlZmVyZW5jZSB0byB0aGUgd3JhcHBlZCBjb250YWluZXIKCi4uIF9gcG9pbnRlciBjb250YWluZXIgcmVxdWlyZW1lbnRzYDoKClNlbWFudGljczogcG9pbnRlciBjb250YWluZXIgcmVxdWlyZW1lbnRzCl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCgotIGBgYXV0b190eXBlIHJlcGxhY2UoIGl0ZXJhdG9yIHBvc2l0aW9uLCBUKiB4ICk7YGAKCiAgICAtIFJlcXVpcmVtZW50czogYGBub3QgZW1wdHkoKSBhbmQgeCAhPSAwYGAKCiAgICAtIEVmZmVjdHM6IHJldHVybnMgdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5IGBgcG9zaXRpb25gYCBhbmQgcmVwbGFjZXMgaXQgd2l0aCBgYHhgYC4KCiAgICAtIFRocm93czogYGBiYWRfcHRyX2NvbnRhaW5lcl9vcGVyYXRpb25gYCBpZiB0aGUgY29udGFpbmVyIGlzIGVtcHR5IGFuZCBgYGJhZF9wb2ludGVyYGAgaWYgYGB4ID09IDBgYC4KCiAgICAtIEV4Y2VwdGlvbiBzYWZldHk6IFN0cm9uZyBndWFyYW50ZWUKICAgIAotIGBgdGVtcGxhdGU8IGNsYXNzIFUgPiBhdXRvX3R5cGUgcmVwbGFjZSggaXRlcmF0b3IgcG9zaXRpb24sIHN0ZDo6YXV0b19wdHI8VT4geCApO2BgCgogICAgLSBFZmZlY3RzOiBgYHJldHVybiByZXBsYWNlKCBwb3NpdGlvbiwgeC5yZWxlYXNlKCkgKTtgYCAgICAgCgotIGBgc3RkOjphdXRvX3B0cjwgcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyID4gY2xvbmUoKSBjb25zdDtgYAoKICAgIC0gRWZmZWN0czogUmV0dXJucyBhIGRlZXAgY29weSBvZiB0aGUgY29udGFpbmVyCgogICAgLSBUaHJvd3M6IGBgc3RkOjpiYWRfYWxsb2NgYCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIG1lbW9yeSB0byBtYWtlIGEgY2xvbmUgb2YgdGhlIGNvbnRhaW5lcgoKICAgIC0gQ29tcGxleGl0eTogTGluZWFyCgotIGBgc3RkOjphdXRvX3B0cjwgcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyID4gcmVsZWFzZSgpO2BgCgogICAgLSBFZmZlY3RzOiBSZWxlYXNlcyBvd25lcnNoaXAgb2YgdGhlIGNvbnRhaW5lci4gVGhpcyBpcyBhIHVzZWZ1bCB3YXkgb2YgcmV0dXJuaW5nIGEgY29udGFpbmVyIGZyb20gYSBmdW5jdGlvbi4KCiAgICAtIFBvc3Rjb25kaXRpb25zOiBgYGVtcHR5KCkgPT0gdHJ1ZWBgCgogICAgLSBUaHJvd3M6IGBgc3RkOjpiYWRfYWxsb2NgYCBpZiB0aGUgcmV0dXJuIHZhbHVlIGNhbm5vdCBiZSBhbGxvY2F0ZWQKCiAgICAtIEV4Y2VwdGlvbiBzYWZldHk6IFN0cm9uZyBndWFyYW50ZWUKCi0gYGBhdXRvX3R5cGUgcmVsZWFzZSggaXRlcmF0b3IgcG9zaXRpb24gKTtgYAoKICAgIC0gUmVxdWlyZW1lbnRzOiBgYG5vdCBlbXB0eSgpO2BgCgogICAgLSBFZmZlY3RzOiBSZWxlYXNlcyBvd25lcnNoaXAgb2YgdGhlIHBvaW50ZXIgcmVmZXJyZWQgdG8gYnkgcG9zaXRpb24KCiAgICAtIFBvc3Rjb25kaXRpb25zOiBgYHNpemUoKWBgIGlzIG9uZSBsZXNzIAoKICAgIC0gVGhyb3dzOiBgYGJhZF9wdHJfY29udGFpbmVyX29wZXJhdGlvbmBgIGlmIHRoZSBjb250YWluZXIgaXMgZW1wdHkKCiAgICAtIEV4Y2VwdGlvbiBzYWZldHk6IFN0cm9uZyBndWFyYW50ZWUKCgouLiBfY29tcGFyaXNvbjoKClNlbWFudGljczogY29tcGFyaXNvbgpeXl5eXl5eXl5eXl5eXl5eXl5eXl4KClRoZXNlIGZ1bmN0aW9ucyBjb21wYXJlIHRoZSB1bmRlcmx5aW5nIHJhbmdlIG9mIG9iamVjdHMuIApTbyA6OgoKICAgICAgICBvcGVyYXRpb24oIGNvbnN0IHB0cl9jb250YWluZXImIGwsIGNvbnN0IHB0cl9jb250YWluZXImIHIgKTsKCmhhcyB0aGUgZWZmZWN0IG9uZSB3b3VsZCBleHBlY3Qgb2Ygbm9ybWFsIHN0YW5kYXJkIGNvbnRhaW5lcnMuIEhlbmNlCm9iamVjdHMgYXJlIGNvbXBhcmVkIGFuZCBub3QgdGhlIHBvaW50ZXJzIHRvIG9iamVjdHMuCgouLiBfYGNsb25lYWJpbGl0eWA6CgpTZW1hbnRpY3M6IGNsb25lYWJpbGl0eQpeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgoKLSAgYGB0ZW1wbGF0ZTwgY2xhc3MgVCwgY2xhc3MgQ2xvbmVBbGxvY2F0b3IgPgogICByZXZlcnNpYmxlX3B0cl9jb250YWluZXI8VCxDQSxWUEM+KiAKICAgbmV3X2Nsb25lKCBjb25zdCByZXZlcnNpYmxlX3B0cl9jb250YWluZXI8VCxDQSxWUEM+JiByICk7YGAKCgogICAgLSBFZmZlY3RzOiBgYHJldHVybiByLmNsb25lKCkucmVsZWFzZSgpO2BgCgogICAgLSBSZW1hcmtzOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgZGVmaW5lZCBmb3IgY29uY3JldGUgYHBvaW50ZXIgY29udGFpbmVyc2BfLCBidXQgbm90IGZvciAKICAgICAgYHBvaW50ZXIgY29udGFpbmVyIGFkYXB0ZXJzYF8uCgouLiBfYHBvaW50ZXIgY29udGFpbmVyc2A6IHB0cl9jb250YWluZXIuaHRtbCNzbWFydC1jb250YWluZXJzCi4uIF9gcG9pbnRlciBjb250YWluZXIgYWRhcHRlcnNgOiBwdHJfY29udGFpbmVyLmh0bWwjc21hcnQtY29udGFpbmVyLWFkYXB0ZXJzCgouLiBfYG51bGwgcHJlZGljYXRlYDoKClNlbWFudGljczogbnVsbCBwcmVkaWNhdGUKXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgoKLSBgYHRlbXBsYXRlPCBjbGFzcyBJdGVyYXRvciA+IGJvb2wgaXNfbnVsbCggSXRlcmF0b3IgaSApO2BgCgogICAgLSBSZXF1aXJlbWVudHM6IGBgaWBgIGlzIGEgdmFsaWQgZGVyZWZlcmVuY2FibGUgaXRlcmF0b3IKCiAgICAtIFJldHVybnM6IGBgKmkuYmFzZSgpID09IDA7YGAKCi4uIF9gc2VyaWFsaXphdGlvbmA6CgpTZW1hbnRpY3M6IHNlcmlhbGl6YXRpb24KXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCgpBbGwgY29udGFpbmVycyBjYW4gYmUgc2VyaWFsaXplZCBieSBtZWFucyBvZgpgQm9vc3QuU2VyaWFsaXphdGlvbmBfXy4gRm9yIGFuIG92ZXJ2aWV3LCBzZWUKYFNlcmlhbGl6YXRpb24gb2YgUG9pbnRlciBDb250YWluZXJzYF8uCgouLiBfXzogLi4vLi4vc2VyaWFsaXphdGlvbi9pbmRleC5odG1sCi4uIF9gU2VyaWFsaXphdGlvbiBvZiBQb2ludGVyIENvbnRhaW5lcnNgOiByZWZlcmVuY2UuaHRtbCNzZXJpYWxpemF0aW9uCgogOjoKIAogICAgdGVtcGxhdGU8Y2xhc3MgQXJjaGl2ZSwgY2xhc3MgVCwgY2xhc3MgQ0EsIGNsYXNzIFZQQz4KICAgIHZvaWQgc2VyaWFsaXplKCBBcmNoaXZlJiBhciwgcmV2ZXJzaWJsZV9wdHJfY29udGFpbmVyPFQsQ0EsVlBDPiYgYywgY29uc3QgdW5zaWduZWQgaW50IHZlcnNpb24gKTsKICAgICAgICAgICAgCgotIEVmZmVjdHM6IFNhdmVzIG9yIGxvYWRzIHRoZSBjb250YWluZXIgdG8vZnJvbSB0aGUgYXJjaGl2ZS4KCi0gUmVtYXJrczogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBiZSBzdHJlYW0gb3BlcmF0b3JzIGluCiAgQm9vc3QuU2VyaWFsaXphdGlvbgogICAgCi0gRXhjZXB0aW9uIHNhZmV0eTogTG9hZGluZyBnaXZlcyB0aGUgYmFzaWMgZ3VhcmFudGVlCgoKLi4gcmF3OjogaHRtbCAKCiAgICAgICAgPGhyPgoKOkNvcHlyaWdodDogICAgIFRob3JzdGVuIE90dG9zZW4gMjAwNC0yMDA3LiBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wIChzZWUgTElDRU5TRV8xXzAudHh0X18pLgoKX18gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0Cgo=