PGh0bWw+PGhlYWQ+PCEtLSBDb3B5cmlnaHQgMjAwNyBBYXJvbiBXaW5kc29yCiAgICAgCiAgICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgogICAgIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKICAgICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCiAgICAKICAtLT4KPHRpdGxlPlBsYW5hciBFbWJlZGRpbmcgQ29uY2VwdDwvdGl0bGU+CjwvaGVhZD4KPGJvZHkgYWxpbms9IiNmZjAwMDAiIAogICAgICBiZ2NvbG9yPSIjZmZmZmZmIiAKICAgICAgbGluaz0iIzAwMDBlZSIgCiAgICAgIHRleHQ9IiMwMDAwMDAiIAogICAgICB2bGluaz0iIzU1MWE4YiI+IAo8aW1nIHNyYz0iLi4vLi4vLi4vYm9vc3QucG5nIiBhbHQ9IkMrKyBCb29zdCIgaGVpZ2h0PSI4NiIgd2lkdGg9IjI3NyI+IAoKPGJyIGNsZWFyPSIiPgoKPGgxPlBsYW5hciBFbWJlZGRpbmcgQ29uY2VwdDwvaDE+CgoKQSBwbGFuYXIgZW1iZWRkaW5nIGlzIGFuIGltcG9ydGFudCBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24gb2YgYSBkcmF3aW5nCm9mIGEgcGxhbmFyIGdyYXBoLiBJbnN0ZWFkIG9mIHNwZWNpZnlpbmcgdGhlIGFic29sdXRlIHBvc2l0aW9ucyBvZiB0aGUgdmVydGljZXMKYW5kIGVkZ2VzIGluIHRoZSBwbGFuZSwgYSBwbGFuYXIgZW1iZWRkaW5nIHNwZWNpZmllcyB0aGVpciBwb3NpdGlvbnMgcmVsYXRpdmUgCnRvIG9uZSBhbm90aGVyLiBBIHBsYW5hciBlbWJlZGRpbmcgY29uc2lzdHMgb2YgYSBzZXF1ZW5jZSwgZm9yIGVhY2ggdmVydGV4IGluIAp0aGUgZ3JhcGgsIG9mIGFsbCBvZiB0aGUgZWRnZXMgaW5jaWRlbnQgb24gdGhhdCB2ZXJ0ZXggaW4gdGhlIG9yZGVyIGluIHdoaWNoIAp0aGV5IGFyZSB0byBiZSBkcmF3biBhcm91bmQgdGhhdCB2ZXJ0ZXguCjxwPgpBIHBsYW5hciBlbWJlZGRpbmcgaXMgYSByZWZpbmVtZW50IG9mIAo8YSBocmVmPSIuLi8uLi9wcm9wZXJ0eV9tYXAvZG9jL0x2YWx1ZVByb3BlcnR5TWFwLmh0bWwiPkxWYWx1ZVByb3BlcnR5TWFwPC9hPiB0aGF0CnBsYWNlcyBhZGRpdGlvbmFsIHJlc3RyaWN0aW9ucyB0aGUgPHR0PnZhbHVlX3R5cGU8L3R0PiB1c2VkIGluIHRoZSBwcm9wZXJ0eQptYXAuCgo8L3A+PGgzPk5vdGF0aW9uPC9oMz4KCjx0YWJsZT4KPHRib2R5PgoKPHRyPiAKPHRkPiA8dHQ+RW1iZWRkaW5nPC90dD4gPC90ZD4gIAo8dGQ+IGlzIGEgdHlwZSB0aGF0IG1vZGVscyB0aGUgUGxhbmFyIEVtYmVkZGluZyBjb25jZXB0LjwvdGQ+CjwvdHI+Cgo8dHI+IAo8dGQ+IDx0dD5lbWJlZGRpbmc8L3R0PiA8L3RkPgo8dGQ+IGlzIGFuIG9iamVjdCBvZiB0eXBlIDx0dD5FbWJlZGRpbmc8L3R0Pi4gPC90ZD4KPC90cj4KCjx0cj4gCjx0ZD4gPHR0PkdyYXBoPC90dD4gPC90ZD4gIAo8dGQ+IGlzIHRoZSB0eXBlIG9mIHRoZSB1bmRlcmx5aW5nIGdyYXBoLjwvdGQ+CjwvdHI+Cgo8dHI+IAo8dGQ+IDx0dD5lPC90dD4gPC90ZD4gIAo8dGQ+IGlzIGFuIG9iamVjdCBvZiB0eXBlIDx0dD5ncmFwaF90cmFpdHMmbHQ7R3JhcGgmZ3Q7OjplZGdlX2Rlc2NyaXB0b3I8L3R0Pi4gCjwvdGQ+CjwvdHI+Cgo8dHI+Cjx0ZD4gPHR0PnY8L3R0PiA8L3RkPgo8dGQ+IGlzIGFuIG9iamVjdCBvZiB0eXBlIDx0dD5ncmFwaF90cmFpdHMmbHQ7R3JhcGgmZ3Q7Ojp2ZXJ0ZXhfZGVzY3JpcHRvcgo8L3R0Pi48L3RkPgoKPC90cj48dHI+Cjx0ZD4gCgo8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPgoKCjxoMz5Bc3NvY2lhdGVkIFR5cGVzPC9oMz4KCjx0YWJsZSBib3JkZXI9IjEiPgoKPHRib2R5Pjx0cj4gCjx0ZD4gQ29uc3QgSXRlcmF0b3IgIDwvdGQ+Cjx0ZD4gPHR0PmJvb3N0Ojpwcm9wZXJ0eV90cmFpdHMmbHQ7RW1iZWRkaW5nJmd0Ozo6dmFsdWVfdHlwZTo6Y29uc3RfaXRlcmF0b3IKPC90dD4KPC90ZD4KPHRkPiBUaGUgaXRlcmF0b3IgdHlwZSB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgb3JkZXJpbmcgb2YgdGhlIGVkZ2VzIGluIHRoZSAKcGxhbmFyIGVtYmVkZGluZyBvZiBhIHBhcnRpY3VsYXIgdmVydGV4CjwvdGQ+CjwvdHI+Cgo8L3Rib2R5PjwvdGFibGU+Cgo8aDM+VmFsaWQgRXhwcmVzc2lvbnM8L2gzPgoKPHA+Cgo8dGFibGUgYm9yZGVyPSIxIj4KCjx0Ym9keT48dHI+PHRoPkV4cHJlc3Npb248L3RoPjx0aD5SZXR1cm4gVHlwZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD4KCjwvdHI+PHRyPiAKPHRkPiA8dHQ+ZW1iZWRkaW5nW3ZdLmJlZ2luKCk8L3R0PiAgPC90ZD4KPHRkPiA8dHQ+Ym9vc3Q6OnByb3BlcnR5X3RyYWl0cyZsdDtFbWJlZGRpbmcmZ3Q7Ojp2YWx1ZV90eXBlOjpjb25zdF9pdGVyYXRvcgogICAgIDwvdHQ+PC90ZD4KPHRkPiBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJhbmdlIG9mIGVkZ2VzIGluIHRoZSAKICAgICBlbWJlZGRpbmcgYXJvdW5kIHZlcnRleCB2PC90ZD4KPC90cj4KCjx0cj4gCjx0ZD4gPHR0PmVtYmVkZGluZ1t2XS5lbmQoKTwvdHQ+ICA8L3RkPgo8dGQ+IDx0dD5ib29zdDo6cHJvcGVydHlfdHJhaXRzJmx0O0VtYmVkZGluZyZndDs6OnZhbHVlX3R5cGU6OmNvbnN0X2l0ZXJhdG9yCiAgICAgPC90dD48L3RkPgo8dGQ+IFJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2Ugb2YgZWRnZXMgaW4gdGhlIAogICAgIGVtYmVkZGluZyBhcm91bmQgdmVydGV4IHY8L3RkPgo8L3RyPgoKPHRyPiAKPHRkPiA8dHQ+ZW1iZWRkaW5nW3ZdLmNsZWFyKCk8L3R0PiAgPC90ZD4KPHRkPiA8dHQ+dm9pZDwvdHQ+PC90ZD4KPHRkPiBDbGVhcnMgYWxsIGVkZ2VzIGluIHRoZSBlbWJlZGRpbmcgYXJvdW5kIGEgdmVydGV4IDx0dD52PC90dD48L3RkPgo8L3RyPgoKPHRyPiAKPHRkPiA8dHQ+ZW1iZWRkaW5nW3ZdLnB1c2hfYmFjayhlKTwvdHQ+ICA8L3RkPgo8dGQ+IDx0dD52b2lkPC90dD48L3RkPgo8dGQ+IEFkZHMgYW4gZWRnZSA8dHQ+ZTwvdHQ+IHRvIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlIG9mIGVtYmVkZGVkIGVkZ2VzIAogICAgIGFyb3VuZCB0aGUgdmVydGV4IDx0dD52PC90dD4gPC90ZD4KPC90cj4KCjwvdGJvZHk+PC90YWJsZT4KCjwvcD48aDM+Q29tcGxleGl0eSBHdWFyYW50ZWVzPC9oMz4KClN0YXJ0aW5nIHdpdGggYW4gZW1wdHkgZW1iZWRkaW5nLCBhbnkgbWl4ZWQgc2VxdWVuY2Ugb2YgPGk+bjwvaT4gY2FsbHMgdG8gYQpwYXJ0aWN1bGFyIHZlcnRleCdzIDx0dD5wdXNoX2JhY2s8L3R0PiBhbmQgPHR0PmNsZWFyPC90dD4gc2hvdWxkIHRha2UgCjxpPk8obik8L2k+IHRpbWUuCgo8aDM+TW9kZWxzPC9oMz4KCkFueSBMVmFsdWUgcHJvcGVydHkgbWFwIHRoYXQgbWFwcyB2ZXJ0aWNlcyB0byBhIDx0dD5zdGQ6OnZlY3RvcjwvdHQ+LCAKPHR0PnN0ZDo6bGlzdDwvdHQ+LCBvciA8dHQ+c3RkOjpkZXF1ZTwvdHQ+IG1vZGVscyB0aGlzCmNvbmNlcHQuIEJlbG93IGlzIGFuIGV4YW1wbGUgb2YgdXNpbmcgdGhpcyBhcHByb2FjaCB0byBjcmVhdGUgYSBtb2RlbCBvZgpQbGFuYXJFbWJlZGRpbmc6Cgo8cHJlPgojaW5jbHVkZSAmbHQ7Ym9vc3QvcHJvcGVydHlfbWFwL3Byb3BlcnR5X21hcC5ocHAmZ3Q7CiNpbmNsdWRlICZsdDt2ZWN0b3ImZ3Q7CgouLi4KCi8vIEFzc3VtZSBhIGdyYXBoIHR5cGUgIkdyYXBoIiBkZWZpbmVkIHNvbWV3aGVyZSBhYm92ZSBhbmQKLy8gYW4gaW5zdGFuY2Ugb2YgR3JhcGggaW4gYSB2YXJpYWJsZSBnLgoKLy8gQSB0eXBlZGVmIGZvciB0aGUgc3RvcmFnZSAtIGEgdmVjdG9yIG9mIHZlY3RvcnMgb2YgZWRnZSBkZXNjcmlwdG9ycwp0eXBlZGVmIAogICAgc3RkOjp2ZWN0b3ImbHQ7IHN0ZDo6dmVjdG9yJmx0OyBncmFwaF90cmFpdHMmbHQ7R3JhcGgmZ3Q7OjplZGdlX2Rlc2NyaXB0b3IgJmd0OyAmZ3Q7CiAgICBwbGFuYXJfZW1iZWRkaW5nX3N0b3JhZ2VfdDsKCi8vIEEgdHlwZWRlZiBmb3IgdGhlIGl0ZXJhdG9yIHByb3BlcnR5IG1hcCwgYXNzdW1pbmcgdGhlIGdyYXBoIGhhcwovLyBhbiBpbnRlcmlvciB2ZXJ0ZXggaW5kZXggbWFwCnR5cGVkZWYKICAgIGJvb3N0OjppdGVyYXRvcl9wcm9wZXJ0eV9tYXAmbHQ7IHBsYW5hcl9lbWJlZGRpbmdfc3RvcmFnZV90OjppdGVyYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X21hcCZsdDtHcmFwaCwgdmVydGV4X2luZGV4X3QmZ3Q7Ojp0eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmd0OwogICAgcGxhbmFyX2VtYmVkZGluZ190OwoKLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBzdG9yYWdlIGFuZCB0aGUgcHJvcGVydHkgbWFwCnBsYW5hcl9lbWJlZGRpbmdfc3RvcmFnZV90IHBsYW5hcl9lbWJlZGRpbmdfc3RvcmFnZShudW1fdmVydGljZXMoZykpOwpwbGFuYXJfZW1iZWRkaW5nX3QgcGxhbmFyX2VtYmVkZGluZyhwbGFuYXJfZW1iZWRkaW5nX3N0b3JhZ2UuYmVnaW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KHZlcnRleF9pbmRleCwgZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCi8vIHBsYW5hcl9lbWJlZGRpbmcgY2FuIG5vdyBiZSBwYXNzZWQgdG8gYW55IGZ1bmN0aW9uIGV4cGVjdGluZyBhIG1vZGVsCi8vIG9mIFBsYW5hckVtYmVkZGluZy4KPC9wcmU+Cgo8cD4KCjxicj4KPC9wPjxocj4KQ29weXJpZ2h0IKkgMjAwNyBBYXJvbiBXaW5kc29yICg8YSBocmVmPSJtYWlsdG86YWFyb24ud2luZHNvckBnbWFpbC5jb20iPgphYXJvbi53aW5kc29yQGdtYWlsLmNvbTwvYT4pIAoKPC9ib2R5PjwvaHRtbD4K