Km1hcC50eHQqICAgICAgIEZvciBWaW0gdmVyc2lvbiA3LjBkLiAgTGFzdCBjaGFuZ2U6IDIwMDYgTWFyIDIwCgoKCQkgIFZJTSBSRUZFUkVOQ0UgTUFOVUFMICAgIGJ5IEJyYW0gTW9vbGVuYWFyCgoKS2V5IG1hcHBpbmcsIGFiYnJldmlhdGlvbnMgYW5kIHVzZXItZGVmaW5lZCBjb21tYW5kcy4KClRoaXMgc3ViamVjdCBpcyBpbnRyb2R1Y2VkIGluIHNlY3Rpb25zIHwwNS4zfCwgfDI0Ljd8IGFuZCB8NDAuMXwgb2YgdGhlIHVzZXIKbWFudWFsLgoKMS4gS2V5IG1hcHBpbmcJCQl8a2V5LW1hcHBpbmd8CiAgIDEuMSBNQVAgQ09NTUFORFMJCQl8Om1hcC1jb21tYW5kc3wKICAgMS4yIFNwZWNpYWwgYXJndW1lbnRzCQl8Om1hcC1hcmd1bWVudHN8CiAgIDEuMyBNYXBwaW5nIGFuZCBtb2RlcwkJfDptYXAtbW9kZXN8CiAgIDEuNCBMaXN0aW5nIG1hcHBpbmdzCQkJfG1hcC1saXN0aW5nfAogICAxLjUgTWFwcGluZyBzcGVjaWFsIGtleXMJCXw6bWFwLXNwZWNpYWwta2V5c3wKICAgMS42IFNwZWNpYWwgY2hhcmFjdGVycwkJfDptYXAtc3BlY2lhbC1jaGFyc3wKICAgMS43IFdoYXQga2V5cyB0byBtYXAJCQl8bWFwLXdoaWNoLWtleXN8CiAgIDEuOCBFeGFtcGxlcwkJCQl8bWFwLWV4YW1wbGVzfAogICAxLjkgVXNpbmcgbWFwcGluZ3MJCQl8bWFwLXR5cGluZ3wKICAgMS4xMCBNYXBwaW5nIGFsdC1rZXlzCQl8Om1hcC1hbHQta2V5c3wKICAgMS4xMSBNYXBwaW5nIGFuIG9wZXJhdG9yCQl8Om1hcC1vcGVyYXRvcnwKMi4gQWJicmV2aWF0aW9ucwkJfGFiYnJldmlhdGlvbnN8CjMuIExvY2FsIG1hcHBpbmdzIGFuZCBmdW5jdGlvbnMJfHNjcmlwdC1sb2NhbHwKNC4gVXNlci1kZWZpbmVkIGNvbW1hbmRzCXx1c2VyLWNvbW1hbmRzfAoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIEtleSBtYXBwaW5nCQkJCSprZXktbWFwcGluZyogKm1hcHBpbmcqICptYWNybyoKCktleSBtYXBwaW5nIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHR5cGVkIGtleXMuICBUaGUgbW9zdCBjb21tb24gdXNlCmlzIHRvIGRlZmluZSBhIHNlcXVlbmNlIGNvbW1hbmRzIGZvciBhIGZ1bmN0aW9uIGtleS4gIEV4YW1wbGU6ID4KCgk6bWFwIDxGMj4gYTxDLVI+PXN0cmZ0aW1lKCIlYyIpPENSPjxFc2M+CgpUaGlzIGFwcGVuZHMgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBhZnRlciB0aGUgY3Vyc29yIChpbiA8PiBub3RhdGlvbiB8PD58KS4KCgoxLjEgTUFQIENPTU1BTkRTCQkJCQkqOm1hcC1jb21tYW5kcyoKClRoZXJlIGFyZSBjb21tYW5kcyB0byBlbnRlciBuZXcgbWFwcGluZ3MsIHJlbW92ZSBtYXBwaW5ncyBhbmQgbGlzdCBtYXBwaW5ncy4KU2VlIHxtYXAtb3ZlcnZpZXd8IGZvciB0aGUgdmFyaW91cyBmb3JtcyBvZiAibWFwIiBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyB3aXRoCm1vZGVzLgoKe2xoc30JbWVhbnMgbGVmdC1oYW5kLXNpZGUJKntsaHN9Kgp7cmhzfQltZWFucyByaWdodC1oYW5kLXNpZGUJKntyaHN9KgoKOm1hcAl7bGhzfSB7cmhzfQkJfG1hcG1vZGUtbnZvfAkJKjptYXAqCjpubVthcF0Je2xoc30ge3Joc30JCXxtYXBtb2RlLW58CQkqOm5tKiAqOm5tYXAqCjp2bVthcF0Je2xoc30ge3Joc30JCXxtYXBtb2RlLXZ8CQkqOnZtKiAqOnZtYXAqCjp4bVthcF0Je2xoc30ge3Joc30JCXxtYXBtb2RlLXh8CQkqOnhtKiAqOnhtYXAqCjpzbWFwCXtsaHN9IHtyaHN9CQl8bWFwbW9kZS1zfAkJICAgICAgKjpzbWFwKgo6b21bYXBdCXtsaHN9IHtyaHN9CQl8bWFwbW9kZS1vfAkJKjpvbSogKjpvbWFwKgo6bWFwIQl7bGhzfSB7cmhzfQkJfG1hcG1vZGUtaWN8CQkqOm1hcCEqCjppbVthcF0Je2xoc30ge3Joc30JCXxtYXBtb2RlLWl8CQkqOmltKiAqOmltYXAqCjpsbVthcF0Je2xoc30ge3Joc30JCXxtYXBtb2RlLWx8CQkqOmxtKiAqOmxtYXAqCjpjbVthcF0Je2xoc30ge3Joc30JCXxtYXBtb2RlLWN8CQkqOmNtKiAqOmNtYXAqCgkJCU1hcCB0aGUga2V5IHNlcXVlbmNlIHtsaHN9IHRvIHtyaHN9IGZvciB0aGUgbW9kZXMKCQkJd2hlcmUgdGhlIG1hcCBjb21tYW5kIGFwcGxpZXMuICBUaGUgcmVzdWx0LCBpbmNsdWRpbmcKCQkJe3Joc30sIGlzIHRoZW4gZnVydGhlciBzY2FubmVkIGZvciBtYXBwaW5ncy4gIFRoaXMKCQkJYWxsb3dzIGZvciBuZXN0ZWQgYW5kIHJlY3Vyc2l2ZSB1c2Ugb2YgbWFwcGluZ3MuCgoKOm5vW3JlbWFwXSAge2xoc30ge3Joc30JCXxtYXBtb2RlLW52b3wJCSo6bm8qICAqOm5vcmVtYXAqCjpubltvcmVtYXBdIHtsaHN9IHtyaHN9CQl8bWFwbW9kZS1ufAkJKjpubiogICo6bm5vcmVtYXAqCjp2bltvcmVtYXBdIHtsaHN9IHtyaHN9CQl8bWFwbW9kZS12fAkJKjp2biogICo6dm5vcmVtYXAqCjp4bltvcmVtYXBdIHtsaHN9IHtyaHN9CQl8bWFwbW9kZS14fAkJKjp4biogICo6eG5vcmVtYXAqCjpzbm9yW2VtYXBdIHtsaHN9IHtyaHN9CQl8bWFwbW9kZS1zfAkJKjpzbm9yKiAqOnNub3JlbWFwKgo6b25vW3JlbWFwXSB7bGhzfSB7cmhzfQkJfG1hcG1vZGUtb3wJCSo6b25vKiAqOm9ub3JlbWFwKgo6bm9bcmVtYXBdISB7bGhzfSB7cmhzfQkJfG1hcG1vZGUtaWN8CQkqOm5vISogKjpub3JlbWFwISoKOmlub1tyZW1hcF0ge2xoc30ge3Joc30JCXxtYXBtb2RlLWl8CQkqOmlubyogKjppbm9yZW1hcCoKOmxuW29yZW1hcF0ge2xoc30ge3Joc30JCXxtYXBtb2RlLWx8CQkqOmxuKiAgKjpsbm9yZW1hcCoKOmNub1tyZW1hcF0ge2xoc30ge3Joc30JCXxtYXBtb2RlLWN8CQkqOmNubyogKjpjbm9yZW1hcCoKCQkJTWFwIHRoZSBrZXkgc2VxdWVuY2Uge2xoc30gdG8ge3Joc30gZm9yIHRoZSBtb2RlcwoJCQl3aGVyZSB0aGUgbWFwIGNvbW1hbmQgYXBwbGllcy4gIERpc2FsbG93IG1hcHBpbmcgb2YKCQkJe3Joc30sIHRvIGF2b2lkIG5lc3RlZCBhbmQgcmVjdXJzaXZlIG1hcHBpbmdzLiAgT2Z0ZW4KCQkJdXNlZCB0byByZWRlZmluZSBhIGNvbW1hbmQuICB7bm90IGluIFZpfQoKCjp1bm1bYXBdICB7bGhzfQkJCXxtYXBtb2RlLW52b3wJCSo6dW5tKiAgKjp1bm1hcCoKOm51blttYXBdIHtsaHN9CQkJfG1hcG1vZGUtbnwJCSo6bnVuKiAgKjpudW5tYXAqCjp2dVtubWFwXSB7bGhzfQkJCXxtYXBtb2RlLXZ8CQkqOnZ1KiAgICo6dnVubWFwKgo6eHVbbm1hcF0ge2xoc30JCQl8bWFwbW9kZS14fAkJKjp4dSogICAqOnh1bm1hcCoKOnN1bm1bYXBdIHtsaHN9CQkJfG1hcG1vZGUtc3wJCSo6c3VubSogKjpzdW5tYXAqCjpvdVtubWFwXSB7bGhzfQkJCXxtYXBtb2RlLW98CQkqOm91KiAgICo6b3VubWFwKgo6dW5tW2FwXSEge2xoc30JCQl8bWFwbW9kZS1pY3wJCSo6dW5tISogKjp1bm1hcCEqCjppdVtubWFwXSB7bGhzfQkJCXxtYXBtb2RlLWl8CQkqOml1KiAgICo6aXVubWFwKgo6bHVbbm1hcF0ge2xoc30JCQl8bWFwbW9kZS1sfAkJKjpsdSogICAqOmx1bm1hcCoKOmN1W25tYXBdIHtsaHN9CQkJfG1hcG1vZGUtY3wJCSo6Y3UqICAgKjpjdW5tYXAqCgkJCVJlbW92ZSB0aGUgbWFwcGluZyBvZiB7bGhzfSBmb3IgdGhlIG1vZGVzIHdoZXJlIHRoZQoJCQltYXAgY29tbWFuZCBhcHBsaWVzLiAgVGhlIG1hcHBpbmcgbWF5IHJlbWFpbiBkZWZpbmVkCgkJCWZvciBvdGhlciBtb2RlcyB3aGVyZSBpdCBhcHBsaWVzLgoJCQlOb3RlOiBUcmFpbGluZyBzcGFjZXMgYXJlIGluY2x1ZGVkIGluIHRoZSB7bGhzfS4gIFRoaXMKCQkJdW5tYXAgZG9lcyBOT1Qgd29yazogPgoJCQkJOm1hcCBAQCBmb28KCQkJCTp1bm1hcCBAQCB8IHByaW50Cgo6bWFwY1tsZWFyXQkJCXxtYXBtb2RlLW52b3wJCSo6bWFwYyogICAqOm1hcGNsZWFyKgo6bm1hcGNbbGVhcl0JCQl8bWFwbW9kZS1ufAkJKjpubWFwYyogICo6bm1hcGNsZWFyKgo6dm1hcGNbbGVhcl0JCQl8bWFwbW9kZS12fAkJKjp2bWFwYyogICo6dm1hcGNsZWFyKgo6eG1hcGNbbGVhcl0JCQl8bWFwbW9kZS14fAkJKjp4bWFwYyogICo6eG1hcGNsZWFyKgo6c21hcGNbbGVhcl0JCQl8bWFwbW9kZS1zfAkJKjpzbWFwYyogICo6c21hcGNsZWFyKgo6b21hcGNbbGVhcl0JCQl8bWFwbW9kZS1vfAkJKjpvbWFwYyogICo6b21hcGNsZWFyKgo6bWFwY1tsZWFyXSEJCQl8bWFwbW9kZS1pY3wJCSo6bWFwYyEqICAqOm1hcGNsZWFyISoKOmltYXBjW2xlYXJdCQkJfG1hcG1vZGUtaXwJCSo6aW1hcGMqICAqOmltYXBjbGVhcioKOmxtYXBjW2xlYXJdCQkJfG1hcG1vZGUtbHwJCSo6bG1hcGMqICAqOmxtYXBjbGVhcioKOmNtYXBjW2xlYXJdCQkJfG1hcG1vZGUtY3wJCSo6Y21hcGMqICAqOmNtYXBjbGVhcioKCQkJUmVtb3ZlIEFMTCBtYXBwaW5ncyBmb3IgdGhlIG1vZGVzIHdoZXJlIHRoZSBtYXAKCQkJY29tbWFuZCBhcHBsaWVzLiAge25vdCBpbiBWaX0KCQkJV2FybmluZzogVGhpcyBhbHNvIHJlbW92ZXMgdGhlIGRlZmF1bHQgbWFwcGluZ3MuCgo6bWFwCQkJCXxtYXBtb2RlLW52b3wKOm5tW2FwXQkJCQl8bWFwbW9kZS1ufAo6dm1bYXBdCQkJCXxtYXBtb2RlLXZ8Cjp4bVthcF0JCQkJfG1hcG1vZGUteHwKOnNtW2FwXQkJCQl8bWFwbW9kZS1zfAo6b21bYXBdCQkJCXxtYXBtb2RlLW98CjptYXAhCQkJCXxtYXBtb2RlLWljfAo6aW1bYXBdCQkJCXxtYXBtb2RlLWl8CjpsbVthcF0JCQkJfG1hcG1vZGUtbHwKOmNtW2FwXQkJCQl8bWFwbW9kZS1jfAoJCQlMaXN0IGFsbCBrZXkgbWFwcGluZ3MgZm9yIHRoZSBtb2RlcyB3aGVyZSB0aGUgbWFwCgkJCWNvbW1hbmQgYXBwbGllcy4gIE5vdGUgdGhhdCAiOm1hcCIgYW5kICI6bWFwISIgYXJlCgkJCXVzZWQgbW9zdCBvZnRlbiwgYmVjYXVzZSB0aGV5IGluY2x1ZGUgdGhlIG90aGVyIG1vZGVzLgoKOm1hcCAgICB7bGhzfQkJCXxtYXBtb2RlLW52b3wJCSo6bWFwX2wqCjpubVthcF0ge2xoc30JCQl8bWFwbW9kZS1ufAkJKjpubWFwX2wqCjp2bVthcF0ge2xoc30JCQl8bWFwbW9kZS12fAkJKjp2bWFwX2wqCjp4bVthcF0ge2xoc30JCQl8bWFwbW9kZS14fAkJKjp4bWFwX2wqCjpzbVthcF0ge2xoc30JCQl8bWFwbW9kZS1zfAkJKjpzbWFwX2wqCjpvbVthcF0ge2xoc30JCQl8bWFwbW9kZS1vfAkJKjpvbWFwX2wqCjptYXAhICAge2xoc30JCQl8bWFwbW9kZS1pY3wJCSo6bWFwX2whKgo6aW1bYXBdIHtsaHN9CQkJfG1hcG1vZGUtaXwJCSo6aW1hcF9sKgo6bG1bYXBdIHtsaHN9CQkJfG1hcG1vZGUtbHwJCSo6bG1hcF9sKgo6Y21bYXBdIHtsaHN9CQkJfG1hcG1vZGUtY3wJCSo6Y21hcF9sKgoJCQlMaXN0IHRoZSBrZXkgbWFwcGluZ3MgZm9yIHRoZSBrZXkgc2VxdWVuY2VzIHN0YXJ0aW5nCgkJCXdpdGgge2xoc30gaW4gdGhlIG1vZGVzIHdoZXJlIHRoZSBtYXAgY29tbWFuZCBhcHBsaWVzLgoJCQl7bm90IGluIFZpfQoKVGhlc2UgY29tbWFuZHMgYXJlIHVzZWQgdG8gbWFwIGEga2V5IG9yIGtleSBzZXF1ZW5jZSB0byBhIHN0cmluZyBvZgpjaGFyYWN0ZXJzLiAgWW91IGNhbiB1c2UgdGhpcyB0byBwdXQgY29tbWFuZCBzZXF1ZW5jZXMgdW5kZXIgZnVuY3Rpb24ga2V5cywKdHJhbnNsYXRlIG9uZSBrZXkgaW50byBhbm90aGVyLCBldGMuICBTZWUgfDpta2V4cmN8IGZvciBob3cgdG8gc2F2ZSBhbmQKcmVzdG9yZSB0aGUgY3VycmVudCBtYXBwaW5ncy4KCgkJCQkJCQkqbWFwLWFtYmlndW91cyoKV2hlbiB0d28gbWFwcGluZ3Mgc3RhcnQgd2l0aCB0aGUgc2FtZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLCB0aGV5IGFyZQphbWJpZ3VvdXMuICBFeGFtcGxlOiA+Cgk6aW1hcCBhYSBmb28KCTppbWFwIGFhYSBiYXIKV2hlbiBWaW0gaGFzIHJlYWQgImFhIiwgaXQgd2lsbCBuZWVkIHRvIGdldCBhbm90aGVyIGNoYXJhY3RlciB0byBiZSBhYmxlIHRvCmRlY2lkZSBpZiAiYWEiIG9yICJhYWEiIHNob3VsZCBiZSBtYXBwZWQuICBUaGlzIG1lYW5zIHRoYXQgYWZ0ZXIgdHlwaW5nICJhYSIKdGhhdCBtYXBwaW5nIHdvbid0IGdldCBleHBhbmRlZCB5ZXQsIFZpbSBpcyB3YWl0aW5nIGZvciBhbm90aGVyIGNoYXJhY3Rlci4KSWYgeW91IHR5cGUgYSBzcGFjZSwgdGhlbiAiZm9vIiB3aWxsIGdldCBpbnNlcnRlZCwgcGx1cyB0aGUgc3BhY2UuICBJZiB5b3UKdHlwZSAiYSIsIHRoZW4gImJhciIgd2lsbCBnZXQgaW5zZXJ0ZWQuCntWaSBkb2VzIG5vdCBhbGxvdyBhbWJpZ3VvdXMgbWFwcGluZ3N9CgoKMS4yIFNQRUNJQUwgQVJHVU1FTlRTCQkJCQkqOm1hcC1hcmd1bWVudHMqCgoiPGJ1ZmZlcj4iLCAiPHNpbGVudD4iLCAiPHNjcmlwdD4iLCAiPGV4cHI+IiBhbmQgIjx1bmlxdWU+IiBjYW4gYmUgdXNlZCBpbiBhbnkKb3JkZXIuICBUaGV5IG11c3QgYXBwZWFyIHJpZ2h0IGFmdGVyIHRoZSBjb21tYW5kLCBiZWZvcmUgYW55IG90aGVyIGFyZ3VtZW50cy4KCgkJCQkqOm1hcC1sb2NhbCogKjptYXAtPGJ1ZmZlcj4qICpFMjI0KiAqRTIyNSoKSWYgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIG9uZSBvZiB0aGVzZSBjb21tYW5kcyBpcyAiPGJ1ZmZlcj4iIGl0IHdpbGwgYXBwbHkgdG8KbWFwcGluZ3MgbG9jYWxseSB0byB0aGUgY3VycmVudCBidWZmZXIgb25seS4gIEV4YW1wbGU6ID4KCTptYXAgPGJ1ZmZlcj4gICx3ICAvWy4sO108Q1I+ClRoZW4geW91IGNhbiBtYXAgIix3IiB0byBzb21ldGhpbmcgZWxzZSBpbiBhbm90aGVyIGJ1ZmZlcjogPgoJOm1hcCA8YnVmZmVyPiAgLHcgIC9bIyYhXTxDUj4KVGhlIGxvY2FsIGJ1ZmZlciBtYXBwaW5ncyBhcmUgdXNlZCBiZWZvcmUgdGhlIGdsb2JhbCBvbmVzLgpUaGUgIjxidWZmZXI+IiBhcmd1bWVudCBjYW4gYWxzbyBiZSB1c2VkIHRvIGNsZWFyIG1hcHBpbmdzOiA+Cgk6dW5tYXAgPGJ1ZmZlcj4gLHcKCTptYXBjbGVhciA8YnVmZmVyPgpMb2NhbCBtYXBwaW5ncyBhcmUgYWxzbyBjbGVhcmVkIHdoZW4gYSBidWZmZXIgaXMgZGVsZXRlZCwgYnV0IG5vdCB3aGVuIGl0IGlzCnVubG9hZGVkLiAgSnVzdCBsaWtlIGxvY2FsIG9wdGlvbiB2YWx1ZXMuCgoJCQkJCQkqOm1hcC08c2lsZW50PiogKjptYXAtc2lsZW50KgpUbyBkZWZpbmUgYSBtYXBwaW5nIHdoaWNoIHdpbGwgbm90IGJlIGVjaG9lZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhZGQKIjxzaWxlbnQ+IiBhcyB0aGUgZmlyc3QgYXJndW1lbnQuICBFeGFtcGxlOiA+Cgk6bWFwIDxzaWxlbnQ+ICxoIC9IZWFkZXI8Q1I+ClRoZSBzZWFyY2ggc3RyaW5nIHdpbGwgbm90IGJlIGVjaG9lZCB3aGVuIHVzaW5nIHRoaXMgbWFwcGluZy4gIE1lc3NhZ2VzIGZyb20KdGhlIGV4ZWN1dGVkIGNvbW1hbmQgYXJlIHN0aWxsIGdpdmVuIHRob3VnaC4gIFRvIHNodXQgdGhlbSB1cCB0b28sIGFkZCBhCiI6c2lsZW50IiBpbiB0aGUgZXhlY3V0ZWQgY29tbWFuZDogPgoJOm1hcCA8c2lsZW50PiAsaCA6ZXhlICI6c2lsZW50IG5vcm1hbCAvSGVhZGVyXHIiPENSPgpQcm9tcHRzIHdpbGwgc3RpbGwgYmUgZ2l2ZW4sIGUuZy4sIGZvciBpbnB1dGRpYWxvZygpLgpVc2luZyAiPHNpbGVudD4iIGZvciBhbiBhYmJyZXZpYXRpb24gaXMgcG9zc2libGUsIGJ1dCB3aWxsIGNhdXNlIHJlZHJhd2luZyBvZgp0aGUgY29tbWFuZCBsaW5lIHRvIGZhaWwuCgoJCQkJCQkqOm1hcC08c2NyaXB0PiogKjptYXAtc2NyaXB0KgpJZiB0aGUgZmlyc3QgYXJndW1lbnQgdG8gb25lIG9mIHRoZXNlIGNvbW1hbmRzIGlzICI8c2NyaXB0PiIgYW5kIGl0IGlzIHVzZWQgdG8KZGVmaW5lIGEgbmV3IG1hcHBpbmcgb3IgYWJicmV2aWF0aW9uLCB0aGUgbWFwcGluZyB3aWxsIG9ubHkgcmVtYXAgY2hhcmFjdGVycwppbiB0aGUge3Joc30gdXNpbmcgbWFwcGluZ3MgdGhhdCB3ZXJlIGRlZmluZWQgbG9jYWwgdG8gYSBzY3JpcHQsIHN0YXJ0aW5nIHdpdGgKIjxTSUQ+Ii4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXZvaWQgdGhhdCBtYXBwaW5ncyBmcm9tIG91dHNpZGUgYSBzY3JpcHQKaW50ZXJmZXJlIChlLmcuLCB3aGVuIENUUkwtViBpcyByZW1hcHBlZCBpbiBtc3dpbi52aW0pLCBidXQgZG8gdXNlIG90aGVyCm1hcHBpbmdzIGRlZmluZWQgaW4gdGhlIHNjcmlwdC4KTm90ZTogIjptYXAgPHNjcmlwdD4iIGFuZCAiOm5vcmVtYXAgPHNjcmlwdD4iIGRvIHRoZSBzYW1lIHRoaW5nLiAgVGhlCiI8c2NyaXB0PiIgb3ZlcnJ1bGVzIHRoZSBjb21tYW5kIG5hbWUuICBVc2luZyAiOm5vcmVtYXAgPHNjcmlwdD4iIGlzCnByZWZlcnJlZCwgYmVjYXVzZSBpdCdzIGNsZWFyZXIgdGhhdCByZW1hcHBpbmcgaXMgKG1vc3RseSkgZGlzYWJsZWQuCgoJCQkJCQkqOm1hcC08dW5pcXVlPiogKkUyMjYqICpFMjI3KgpJZiB0aGUgZmlyc3QgYXJndW1lbnQgdG8gb25lIG9mIHRoZXNlIGNvbW1hbmRzIGlzICI8dW5pcXVlPiIgYW5kIGl0IGlzIHVzZWQgdG8KZGVmaW5lIGEgbmV3IG1hcHBpbmcgb3IgYWJicmV2aWF0aW9uLCB0aGUgY29tbWFuZCB3aWxsIGZhaWwgaWYgdGhlIG1hcHBpbmcgb3IKYWJicmV2aWF0aW9uIGFscmVhZHkgZXhpc3RzLiAgRXhhbXBsZTogPgoJOm1hcCA8dW5pcXVlPiAsdyAgL1sjJiFdPENSPgpXaGVuIGRlZmluaW5nIGEgbG9jYWwgbWFwcGluZywgdGhlcmUgd2lsbCBhbHNvIGJlIGEgY2hlY2sgaWYgYSBnbG9iYWwgbWFwCmFscmVhZHkgZXhpc3RzIHdoaWNoIGlzIGVxdWFsLgpFeGFtcGxlIG9mIHdoYXQgd2lsbCBmYWlsOiA+Cgk6bWFwICx3ICAvWyMmIV08Q1I+Cgk6bWFwIDxidWZmZXI+IDx1bmlxdWU+ICx3ICAvWy4sO108Q1I+CklmIHlvdSB3YW50IHRvIG1hcCBhIGtleSBhbmQgdGhlbiBoYXZlIGl0IGRvIHdoYXQgaXQgd2FzIG9yaWdpbmFsbHkgbWFwcGVkIHRvLApoYXZlIGEgbG9vayBhdCB8bWFwYXJnKCl8LgoKCQkJCQkJKjptYXAtPGV4cHI+KiAqOm1hcC1leHByZXNzaW9uKgpJZiB0aGUgZmlyc3QgYXJndW1lbnQgdG8gb25lIG9mIHRoZXNlIGNvbW1hbmRzIGlzICI8ZXhwcj4iIGFuZCBpdCBpcyB1c2VkIHRvCmRlZmluZSBhIG5ldyBtYXBwaW5nIG9yIGFiYnJldmlhdGlvbiwgdGhlIGFyZ3VtZW50IGlzIGFuIGV4cHJlc3Npb24uICBUaGUKZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgdG8gb2J0YWluIHRoZSB7cmhzfSB0aGF0IGlzIHVzZWQuICBFeGFtcGxlOiA+Cgk6aW5vcmVtYXAgPGV4cHI+IC4gSW5zZXJ0RG90KCkKVGhlIHJlc3VsdCBvZiB0aGUgSW5zZXJ0RG90KCkgZnVuY3Rpb24gd2lsbCBiZSBpbnNlcnRlZC4gIEl0IGNvdWxkIGNoZWNrIHRoZQp0ZXh0IGJlZm9yZSB0aGUgY3Vyc29yIGFuZCBzdGFydCBvbW5pIGNvbXBsZXRpb24gd2hlbiBzb21lIGNvbmRpdGlvbiBpcyBtZXQuCgpCZSB2ZXJ5IGNhcmVmdWwgYWJvdXQgc2lkZSBlZmZlY3RzISAgVGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIHdoaWxlCm9idGFpbmluZyBjaGFyYWN0ZXJzLCBpZiB5b3UgY2hhbmdlIGJ1ZmZlciB0ZXh0LCBtb3ZlIHRoZSBjdXJzb3IsIGVkaXQgYW5vdGhlcgpmaWxlLCBldGMuIHlvdSBtYXkgdmVyeSB3ZWxsIG1ha2UgY29tbWFuZCBkaXNmdW5jdGlvbmFsLgoKSGVyZSBpcyBhbiBleGFtcGxlIHRoYXQgaW5zZXJ0cyBhIGxpc3QgbnVtYmVyIHRoYXQgaW5jcmVhc2VzOiA+CglsZXQgY291bnRlciA9IDAKCWlub3JlbWFwIDxleHByPiA8Qy1MPiBMaXN0SXRlbSgpCglpbm9yZW1hcCA8ZXhwcj4gPEMtUj4gTGlzdFJlc2V0KCkKCglmdW5jIExpc3RJdGVtKCkKCSAgbGV0IGc6Y291bnRlciArPSAxCgkgIHJldHVybiBnOmNvdW50ZXIgLiAnLiAnCgllbmRmdW5jCgoJZnVuYyBMaXN0UmVzZXQoKQoJICBsZXQgZzpjb3VudGVyID0gMAoJICByZXR1cm4gJycKCWVuZGZ1bmMKCkNUUkwtTCBpbnNlcnRzIHRoZSBuZXh0IG51bWJlciwgQ1RSTC1SIHJlc2V0cyB0aGUgY291bnQuICBDVFJMLVIgcmV0dXJucyBhbgplbXB0eSBzdHJpbmcsIHNvIHRoYXQgbm90aGluZyBpcyBpbnNlcnRlZC4KCgoxLjMgTUFQUElORyBBTkQgTU9ERVMJCQkJCSo6bWFwLW1vZGVzKgoKVGhlcmUgYXJlIGZpdmUgc2V0cyBvZiBtYXBwaW5ncwotIEZvciBOb3JtYWwgbW9kZTogV2hlbiB0eXBpbmcgY29tbWFuZHMuCi0gRm9yIFZpc3VhbCBtb2RlOiBXaGVuIHR5cGluZyBjb21tYW5kcyB3aGlsZSB0aGUgVmlzdWFsIGFyZWEgaXMgaGlnaGxpZ2h0ZWQuCi0gRm9yIE9wZXJhdG9yLXBlbmRpbmcgbW9kZTogV2hlbiBhbiBvcGVyYXRvciBpcyBwZW5kaW5nIChhZnRlciAiZCIsICJ5IiwgImMiLAogIGV0Yy4pLiAgRXhhbXBsZTogIjpvbWFwIHsgdyIgbWFrZXMgInl7IiB3b3JrIGxpa2UgInl3IiBhbmQgImR7IiBsaWtlICJkdyIuCi0gRm9yIEluc2VydCBtb2RlLiAgVGhlc2UgYXJlIGFsc28gdXNlZCBpbiBSZXBsYWNlIG1vZGUuCi0gRm9yIENvbW1hbmQtbGluZSBtb2RlOiBXaGVuIGVudGVyaW5nIGEgIjoiIG9yICIvIiBjb21tYW5kLgoKU3BlY2lhbCBjYXNlOiBXaGlsZSB0eXBpbmcgYSBjb3VudCBmb3IgYSBjb21tYW5kIGluIE5vcm1hbCBtb2RlLCBtYXBwaW5nIHplcm8KaXMgZGlzYWJsZWQuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIG1hcCB6ZXJvIHdpdGhvdXQgbWFraW5nIGl0IGltcG9zc2libGUKdG8gdHlwZSBhIGNvdW50IHdpdGggYSB6ZXJvLgoKCQkJCQkJKm1hcC1vdmVydmlldyogKm1hcC1tb2RlcyoKT3ZlcnZpZXcgb2Ygd2hpY2ggbWFwIGNvbW1hbmQgd29ya3MgaW4gd2hpY2ggbW9kZToKCgkJCSptYXBtb2RlLW52byogKm1hcG1vZGUtbiogKm1hcG1vZGUtdiogKm1hcG1vZGUtbyoKICAgIGNvbW1hbmRzOgkJCQkgICAgICBtb2RlczogfgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWwgIFZpc3VhbCtTZWxlY3QgIE9wZXJhdG9yLXBlbmRpbmcgfgo6bWFwICAgOm5vcmVtYXAgICA6dW5tYXAgICA6bWFwY2xlYXIgICAgIHllcyAgICAgICAgeWVzICAgICAgICAgICAgeWVzCjpubWFwICA6bm5vcmVtYXAgIDpudW5tYXAgIDpubWFwY2xlYXIgICAgeWVzICAgICAgICAgLSAgICAgICAgICAgICAgLQo6dm1hcCAgOnZub3JlbWFwICA6dnVubWFwICA6dm1hcGNsZWFyICAgICAtICAgICAgICAgeWVzICAgICAgICAgICAgIC0KOm9tYXAgIDpvbm9yZW1hcCAgOm91bm1hcCAgOm9tYXBjbGVhciAgICAgLSAgICAgICAgICAtICAgICAgICAgICAgIHllcwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1hcG1vZGUteCogKm1hcG1vZGUtcyoKU29tZSBjb21tYW5kcyB3b3JrIGJvdGggaW4gVmlzdWFsIGFuZCBTZWxlY3QgbW9kZSwgc29tZSBpbiBvbmx5IG9uZS4gIE5vdGUKdGhhdCBxdWl0ZSBvZnRlbiAiVmlzdWFsIiBpcyBtZW50aW9uZWQgd2hlcmUgYm90aCBWaXN1YWwgYW5kIFNlbGVjdCBtb2RlCmFwcGx5LiB8U2VsZWN0LW1vZGUtbWFwcGluZ3wKCiAgICBjb21tYW5kczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlczogfgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXN1YWwgICAgU2VsZWN0IH4KOnZtYXAgIDp2bm9yZW1hcCAgOnZ1bm1hcCAgOnZtYXBjbGVhciAgICAgICB5ZXMgICAgICB5ZXMKOnhtYXAgIDp4bm9yZW1hcCAgOnh1bm1hcCAgOnhtYXBjbGVhciAgICAgICB5ZXMgICAgICAgLQo6c21hcCAgOnNub3JlbWFwICA6c3VubWFwICA6c21hcGNsZWFyICAgICAgIC0gICAgICAgIHllcwoKCQkJKm1hcG1vZGUtaWMqICptYXBtb2RlLWkqICptYXBtb2RlLWMqICptYXBtb2RlLWwqClNvbWUgY29tbWFuZHMgd29yayBib3RoIGluIEluc2VydCBtb2RlIGFuZCBDb21tYW5kLWxpbmUgbW9kZSwgc29tZSBub3Q6CgogICAgY29tbWFuZHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZXM6IH4KCQkJCQkgIEluc2VydCAgQ29tbWFuZC1saW5lCUxhbmctQXJnIH4KOm1hcCEgIDpub3JlbWFwISAgOnVubWFwISAgOm1hcGNsZWFyIQkgICAgeWVzCSAgICAgICB5ZXMJICAgLQo6aW1hcCAgOmlub3JlbWFwICA6aXVubWFwICA6aW1hcGNsZWFyCSAgICB5ZXMJCS0JICAgLQo6Y21hcCAgOmNub3JlbWFwICA6Y3VubWFwICA6Y21hcGNsZWFyCSAgICAgLQkgICAgICAgeWVzCSAgIC0KOmxtYXAgIDpsbm9yZW1hcCAgOmx1bm1hcCAgOmxtYXBjbGVhcgkgICAgeWVzKiAgICAgICB5ZXMqCSAgeWVzKgoKVGhlIG9yaWdpbmFsIFZpIGRpZCBub3QgaGF2ZSBzZXBhcmF0ZSBtYXBwaW5ncyBmb3IKTm9ybWFsL1Zpc3VhbC9PcGVyYXRvci1wZW5kaW5nIG1vZGUgYW5kIGZvciBJbnNlcnQvQ29tbWFuZC1saW5lIG1vZGUuClRoZXJlZm9yZSB0aGUgIjptYXAiIGFuZCAiOm1hcCEiIGNvbW1hbmRzIGVudGVyIGFuZCBkaXNwbGF5IG1hcHBpbmdzIGZvcgpzZXZlcmFsIG1vZGVzLiAgSW4gVmltIHlvdSBjYW4gdXNlIHRoZSAiOm5tYXAiLCAiOnZtYXAiLCAiOm9tYXAiLCAiOmNtYXAiIGFuZAoiOmltYXAiIGNvbW1hbmRzIHRvIGVudGVyIG1hcHBpbmdzIGZvciBlYWNoIG1vZGUgc2VwYXJhdGVseS4KClRvIGVudGVyIGEgbWFwcGluZyBmb3IgTm9ybWFsIGFuZCBWaXN1YWwgbW9kZSwgYnV0IG5vdCBPcGVyYXRvci1wZW5kaW5nIG1vZGUsCmZpcnN0IGRlZmluZSBpdCBmb3IgYWxsIHRocmVlIG1vZGVzLCB0aGVuIHVubWFwIGl0IGZvciBPcGVyYXRvci1wZW5kaW5nIG1vZGU6Cgk6bWFwICAgIHh4IHNvbWV0aGluZy1kaWZmaWN1bHQKCTpvdW5tYXAgeHgKTGlrZXdpc2UgZm9yIGEgbWFwcGluZyBmb3IgVmlzdWFsIGFuZCBPcGVyYXRvci1wZW5kaW5nIG1vZGUgb3IgTm9ybWFsIGFuZApPcGVyYXRvci1wZW5kaW5nIG1vZGUuCgoJCQkJCQkqbGFuZ3VhZ2UtbWFwcGluZyoKIjpsbWFwIiBkZWZpbmVzIGEgbWFwcGluZyB0aGF0IGFwcGxpZXMgdG86Ci0gSW5zZXJ0IG1vZGUKLSBDb21tYW5kLWxpbmUgbW9kZQotIHdoZW4gZW50ZXJpbmcgYSBzZWFyY2ggcGF0dGVybgotIHRoZSBhcmd1bWVudCBvZiB0aGUgY29tbWFuZHMgdGhhdCBhY2NlcHQgYSB0ZXh0IGNoYXJhY3Rlciwgc3VjaCBhcyAiciIgYW5kCiAgImYiCi0gZm9yIHRoZSBpbnB1dCgpIGxpbmUKR2VuZXJhbGx5OiBXaGVuZXZlciBhIGNoYXJhY3RlciBpcyB0byBiZSB0eXBlZCB0aGF0IGlzIHBhcnQgb2YgdGhlIHRleHQgaW4gdGhlCmJ1ZmZlciwgbm90IGEgVmltIGNvbW1hbmQgY2hhcmFjdGVyLiAgIkxhbmctQXJnIiBpc24ndCByZWFsbHkgYW5vdGhlciBtb2RlLAppdCdzIGp1c3QgdXNlZCBoZXJlIGZvciB0aGlzIHNpdHVhdGlvbi4KICAgVGhlIHNpbXBsZXN0IHdheSB0byBsb2FkIGEgc2V0IG9mIHJlbGF0ZWQgbGFuZ3VhZ2UgbWFwcGluZ3MgaXMgYnkgdXNpbmcgdGhlCidrZXltYXAnIG9wdGlvbi4gIFNlZSB8NDUuNXwuCiAgIEluIEluc2VydCBtb2RlIGFuZCBpbiBDb21tYW5kLWxpbmUgbW9kZSB0aGUgbWFwcGluZ3MgY2FuIGJlIGRpc2FibGVkIHdpdGgKdGhlIENUUkwtXiBjb21tYW5kIHxpX0NUUkwtXnwgfGNfQ1RSTC1efC4gIFdoZW4gc3RhcnRpbmcgdG8gZW50ZXIgYSBub3JtYWwKY29tbWFuZCBsaW5lIChub3QgYSBzZWFyY2ggcGF0dGVybikgdGhlIG1hcHBpbmdzIGFyZSBkaXNhYmxlZCB1bnRpbCBhIENUUkwtXgppcyB0eXBlZC4gIFRoZSBzdGF0ZSBsYXN0IHVzZWQgaXMgcmVtZW1iZXJlZCBmb3IgSW5zZXJ0IG1vZGUgYW5kIFNlYXJjaApwYXR0ZXJucyBzZXBhcmF0ZWx5LiAgVGhlIHN0YXRlIGZvciBJbnNlcnQgbW9kZSBpcyBhbHNvIHVzZWQgd2hlbiB0eXBpbmcgYQpjaGFyYWN0ZXIgYXMgYW4gYXJndW1lbnQgdG8gY29tbWFuZCBsaWtlICJmIiBvciAidCIuCiAgIExhbmd1YWdlIG1hcHBpbmdzIHdpbGwgbmV2ZXIgYmUgYXBwbGllZCB0byBhbHJlYWR5IG1hcHBlZCBjaGFyYWN0ZXJzLiAgVGhleQphcmUgb25seSB1c2VkIGZvciB0eXBlZCBjaGFyYWN0ZXJzLiAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGxhbmd1YWdlIG1hcHBpbmcKd2FzIGFscmVhZHkgZG9uZSB3aGVuIHR5cGluZyB0aGUgbWFwcGluZy4KCgoxLjQgTElTVElORyBNQVBQSU5HUwkJCQkJKm1hcC1saXN0aW5nKgoKV2hlbiBsaXN0aW5nIG1hcHBpbmdzIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBmaXJzdCB0d28gY29sdW1ucyBhcmU6CgogICAgICBDSEFSCU1PREUJfgogICAgIDxTcGFjZT4JTm9ybWFsLCBWaXN1YWwgYW5kIE9wZXJhdG9yLXBlbmRpbmcKCW4JTm9ybWFsCgl2CVZpc3VhbAoJbwlPcGVyYXRvci1wZW5kaW5nCgkhCUluc2VydCBhbmQgQ29tbWFuZC1saW5lCglpCUluc2VydAoJbAkiOmxtYXAiIG1hcHBpbmdzIGZvciBJbnNlcnQsIENvbW1hbmQtbGluZSBhbmQgTGFuZy1BcmcKCWMJQ29tbWFuZC1saW5lCgpKdXN0IGJlZm9yZSB0aGUge3Joc30gYSBzcGVjaWFsIGNoYXJhY3RlciBjYW4gYXBwZWFyOgoJKglpbmRpY2F0ZXMgdGhhdCBpdCBpcyBub3QgcmVtYXBwYWJsZQoJJglpbmRpY2F0ZXMgdGhhdCBvbmx5IHNjcmlwdC1sb2NhbCBtYXBwaW5ncyBhcmUgcmVtYXBwYWJsZQoJQAlpbmRpY2F0ZXMgYSBidWZmZXItbG9jYWwgbWFwcGluZwoKRXZlcnl0aGluZyBmcm9tIHRoZSBmaXJzdCBub24tYmxhbmsgYWZ0ZXIge2xoc30gdXAgdG8gdGhlIGVuZCBvZiB0aGUgbGluZQoob3IgJ3wnKSBpcyBjb25zaWRlcmVkIHRvIGJlIHBhcnQgb2Yge3Joc30uICBUaGlzIGFsbG93cyB0aGUge3Joc30gdG8gZW5kCndpdGggYSBzcGFjZS4KCk5vdGU6IFdoZW4gdXNpbmcgbWFwcGluZ3MgZm9yIFZpc3VhbCBtb2RlLCB5b3UgY2FuIHVzZSB0aGUgIic8IiBtYXJrLCB3aGljaAppcyB0aGUgc3RhcnQgb2YgdGhlIGxhc3Qgc2VsZWN0ZWQgVmlzdWFsIGFyZWEgaW4gdGhlIGN1cnJlbnQgYnVmZmVyIHwnPHwuCgoJCQkJCQkJKjptYXAtdmVyYm9zZSoKV2hlbiAndmVyYm9zZScgaXMgbm9uLXplcm8sIGxpc3RpbmcgYSBrZXkgbWFwIHdpbGwgYWxzbyBkaXNwbGF5IHdoZXJlIGl0IHdhcwpsYXN0IGRlZmluZWQuICBFeGFtcGxlOiA+CgoJOnZlcmJvc2UgbWFwIDxDLVc+KgoJbiAgPEMtVz4qICAgICAgKiA8Qy1XPjxDLVM+KgoJICAgICAgICBMYXN0IHNldCBmcm9tIC9ob21lL2FiY2QvLnZpbXJjCgpTZWUgfDp2ZXJib3NlLWNtZHwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCgoKMS41IE1BUFBJTkcgU1BFQ0lBTCBLRVlTCQkJCSo6bWFwLXNwZWNpYWwta2V5cyoKClRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIG1hcCBhIHNwZWNpYWwga2V5OgoxLiBUaGUgVmktY29tcGF0aWJsZSBtZXRob2Q6IE1hcCB0aGUga2V5IGNvZGUuICBPZnRlbiB0aGlzIGlzIGEgc2VxdWVuY2UgdGhhdAogICBzdGFydHMgd2l0aCA8RXNjPi4gIFRvIGVudGVyIGEgbWFwcGluZyBsaWtlIHRoaXMgeW91IHR5cGUgIjptYXAgIiBhbmQgdGhlbgogICB5b3UgaGF2ZSB0byB0eXBlIENUUkwtViBiZWZvcmUgaGl0dGluZyB0aGUgZnVuY3Rpb24ga2V5LiAgTm90ZSB0aGF0IHdoZW4KICAgdGhlIGtleSBjb2RlIGZvciB0aGUga2V5IGlzIGluIHRoZSB0ZXJtY2FwICh0aGUgdF8gb3B0aW9ucyksIGl0IHdpbGwKICAgYXV0b21hdGljYWxseSBiZSB0cmFuc2xhdGVkIGludG8gdGhlIGludGVybmFsIGNvZGUgYW5kIGJlY29tZSB0aGUgc2Vjb25kCiAgIHdheSBvZiBtYXBwaW5nICh1bmxlc3MgdGhlICdrJyBmbGFnIGlzIGluY2x1ZGVkIGluICdjcG9wdGlvbnMnKS4KMi4gVGhlIHNlY29uZCBtZXRob2QgaXMgdG8gdXNlIHRoZSBpbnRlcm5hbCBjb2RlIGZvciB0aGUgZnVuY3Rpb24ga2V5LiAgVG8KICAgZW50ZXIgc3VjaCBhIG1hcHBpbmcgdHlwZSBDVFJMLUsgYW5kIHRoZW4gaGl0IHRoZSBmdW5jdGlvbiBrZXksIG9yIHVzZQogICB0aGUgZm9ybSAiIzEiLCAiIzIiLCAuLiAiIzkiLCAiIzAiLCAiPFVwPiIsICI8Uy1Eb3duPiIsICI8Uy1GNz4iLCBldGMuCiAgIChzZWUgdGFibGUgb2Yga2V5cyB8a2V5LW5vdGF0aW9ufCwgYWxsIGtleXMgZnJvbSA8VXA+IGNhbiBiZSB1c2VkKS4gIFRoZQogICBmaXJzdCB0ZW4gZnVuY3Rpb24ga2V5cyBjYW4gYmUgZGVmaW5lZCBpbiB0d28gd2F5czogSnVzdCB0aGUgbnVtYmVyLCBsaWtlCiAgICIjMiIsIGFuZCB3aXRoICI8Rj4iLCBsaWtlICI8RjI+Ii4gIEJvdGggc3RhbmQgZm9yIGZ1bmN0aW9uIGtleSAyLiAgIiMwIgogICByZWZlcnMgdG8gZnVuY3Rpb24ga2V5IDEwLCBkZWZpbmVkIHdpdGggb3B0aW9uICd0X2YxMCcsIHdoaWNoIG1heSBiZQogICBmdW5jdGlvbiBrZXkgemVybyBvbiBzb21lIGtleWJvYXJkcy4gIFRoZSA8PiBmb3JtIGNhbm5vdCBiZSB1c2VkIHdoZW4KICAgJ2Nwb3B0aW9ucycgaW5jbHVkZXMgdGhlICc8JyBmbGFnLgozLiBVc2UgdGhlIHRlcm1jYXAgZW50cnksIHdpdGggdGhlIGZvcm0gPHRfeHg+LCB3aGVyZSAieHgiIGlzIHRoZSBuYW1lIG9mIHRoZQogICB0ZXJtY2FwIGVudHJ5LiAgQW55IHN0cmluZyBlbnRyeSBjYW4gYmUgdXNlZC4gIEZvciBleGFtcGxlOiA+CiAgICAgOm1hcCA8dF9GMz4gRwo8ICBNYXBzIGZ1bmN0aW9uIGtleSAxMyB0byAiRyIuICBUaGlzIGRvZXMgbm90IHdvcmsgaWYgJ2Nwb3B0aW9ucycgaW5jbHVkZXMKICAgdGhlICc8JyBmbGFnLgoKVGhlIGFkdmFudGFnZSBvZiB0aGUgc2Vjb25kIGFuZCB0aGlyZCBtZXRob2QgaXMgdGhhdCB0aGUgbWFwcGluZyB3aWxsIHdvcmsgb24KZGlmZmVyZW50IHRlcm1pbmFscyB3aXRob3V0IG1vZGlmaWNhdGlvbiAodGhlIGZ1bmN0aW9uIGtleSB3aWxsIGJlCnRyYW5zbGF0ZWQgaW50byB0aGUgc2FtZSBpbnRlcm5hbCBjb2RlIG9yIHRoZSBhY3R1YWwga2V5IGNvZGUsIG5vIG1hdHRlciB3aGF0CnRlcm1pbmFsIHlvdSBhcmUgdXNpbmcuICBUaGUgdGVybWNhcCBtdXN0IGJlIGNvcnJlY3QgZm9yIHRoaXMgdG8gd29yaywgYW5kIHlvdQptdXN0IHVzZSB0aGUgc2FtZSBtYXBwaW5ncykuCgpERVRBSUw6IFZpbSBmaXJzdCBjaGVja3MgaWYgYSBzZXF1ZW5jZSBmcm9tIHRoZSBrZXlib2FyZCBpcyBtYXBwZWQuICBJZiBpdAppc24ndCB0aGUgdGVybWluYWwga2V5IGNvZGVzIGFyZSB0cmllZCAoc2VlIHx0ZXJtaW5hbC1vcHRpb25zfCkuICBJZiBhCnRlcm1pbmFsIGNvZGUgaXMgZm91bmQgaXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgaW50ZXJuYWwgY29kZS4gIFRoZW4gdGhlIGNoZWNrCmZvciBhIG1hcHBpbmcgaXMgZG9uZSBhZ2FpbiAoc28geW91IGNhbiBtYXAgYW4gaW50ZXJuYWwgY29kZSB0byBzb21ldGhpbmcKZWxzZSkuICBXaGF0IGlzIHdyaXR0ZW4gaW50byB0aGUgc2NyaXB0IGZpbGUgZGVwZW5kcyBvbiB3aGF0IGlzIHJlY29nbml6ZWQuCklmIHRoZSB0ZXJtaW5hbCBrZXkgY29kZSB3YXMgcmVjb2duaXplZCBhcyBhIG1hcHBpbmcgdGhlIGtleSBjb2RlIGl0c2VsZiBpcwp3cml0dGVuIHRvIHRoZSBzY3JpcHQgZmlsZS4gIElmIGl0IHdhcyByZWNvZ25pemVkIGFzIGEgdGVybWluYWwgY29kZSB0aGUKaW50ZXJuYWwgY29kZSBpcyB3cml0dGVuIHRvIHRoZSBzY3JpcHQgZmlsZS4KCgoxLjYgU1BFQ0lBTCBDSEFSQUNURVJTCQkJCQkqOm1hcC1zcGVjaWFsLWNoYXJzKgoJCQkJCQkJKm1hcF9iYWNrc2xhc2gqCk5vdGUgdGhhdCBvbmx5IENUUkwtViBpcyBtZW50aW9uZWQgaGVyZSBhcyBhIHNwZWNpYWwgY2hhcmFjdGVyIGZvciBtYXBwaW5ncwphbmQgYWJicmV2aWF0aW9ucy4gIFdoZW4gJ2Nwb3B0aW9ucycgZG9lcyBub3QgY29udGFpbiAnQicsIGEgYmFja3NsYXNoIGNhbgphbHNvIGJlIHVzZWQgbGlrZSBDVFJMLVYuICBUaGUgPD4gbm90YXRpb24gY2FuIGJlIGZ1bGx5IHVzZWQgdGhlbiB8PD58LiAgQnV0CnlvdSBjYW5ub3QgdXNlICI8Qy1WPiIgbGlrZSBDVFJMLVYgdG8gZXNjYXBlIHRoZSBzcGVjaWFsIG1lYW5pbmcgb2Ygd2hhdApmb2xsb3dzLgoKVG8gbWFwIGEgYmFja3NsYXNoLCBvciB1c2UgYSBiYWNrc2xhc2ggbGl0ZXJhbGx5IGluIHRoZSB7cmhzfSwgdGhlIHNwZWNpYWwKc2VxdWVuY2UgIjxCc2xhc2g+IiBjYW4gYmUgdXNlZC4gIFRoaXMgYXZvaWRzIHRoZSBuZWVkIHRvIGRvdWJsZSBiYWNrc2xhc2hlcwp3aGVuIHVzaW5nIG5lc3RlZCBtYXBwaW5ncy4KCgkJCQkJCQkqbWFwX0NUUkwtQyoKVXNpbmcgQ1RSTC1DIGluIHRoZSB7bGhzfSBpcyBwb3NzaWJsZSwgYnV0IGl0IHdpbGwgb25seSB3b3JrIHdoZW4gVmltIGlzCndhaXRpbmcgZm9yIGEga2V5LCBub3Qgd2hlbiBWaW0gaXMgYnVzeSB3aXRoIHNvbWV0aGluZy4gIFdoZW4gVmltIGlzIGJ1c3kKQ1RSTC1DIGludGVycnVwdHMvYnJlYWtzIHRoZSBjb21tYW5kLgpXaGVuIHVzaW5nIHRoZSBHVUkgdmVyc2lvbiBvbiBNUy1XaW5kb3dzIENUUkwtQyBjYW4gYmUgbWFwcGVkIHRvIGFsbG93IGEgQ29weQpjb21tYW5kIHRvIHRoZSBjbGlwYm9hcmQuICBVc2UgQ1RSTC1CcmVhayB0byBpbnRlcnJ1cHQgVmltLgoKCQkJCQkJCSptYXBfc3BhY2VfaW5fbGhzKgpUbyBpbmNsdWRlIGEgc3BhY2UgaW4ge2xoc30gcHJlY2VkZSBpdCB3aXRoIGEgQ1RSTC1WICh0eXBlIHR3byBDVFJMLVZzIGZvcgplYWNoIHNwYWNlKS4KCQkJCQkJCSptYXBfc3BhY2VfaW5fcmhzKgpJZiB5b3Ugd2FudCBhIHtyaHN9IHRoYXQgc3RhcnRzIHdpdGggYSBzcGFjZSwgdXNlICI8U3BhY2U+Ii4gIFRvIGJlIGZ1bGx5IFZpCmNvbXBhdGlibGUgKGJ1dCB1bnJlYWRhYmxlKSBkb24ndCB1c2UgdGhlIHw8Pnwgbm90YXRpb24sIHByZWNlZGUge3Joc30gd2l0aCBhCnNpbmdsZSBDVFJMLVYgKHlvdSBoYXZlIHRvIHR5cGUgQ1RSTC1WIHR3byB0aW1lcykuCgkJCQkJCQkqbWFwX2VtcHR5X3JocyoKWW91IGNhbiBjcmVhdGUgYW4gZW1wdHkge3Joc30gYnkgdHlwaW5nIG5vdGhpbmcgYWZ0ZXIgYSBzaW5nbGUgQ1RSTC1WICh5b3UKaGF2ZSB0byB0eXBlIENUUkwtViB0d28gdGltZXMpLiAgVW5mb3J0dW5hdGVseSwgeW91IGNhbm5vdCBkbyB0aGlzIGluIGEgdmltcmMKZmlsZS4KCQkJCQkJCSo8Tm9wPioKQSBlYXNpZXIgd2F5IHRvIGdldCBhIG1hcHBpbmcgdGhhdCBkb2Vzbid0IHByb2R1Y2UgYW55dGhpbmcsIGlzIHRvIHVzZSAiPE5vcD4iCmZvciB0aGUge3Joc30uICBUaGlzIG9ubHkgd29ya3Mgd2hlbiB0aGUgfDw+fCBub3RhdGlvbiBpcyBlbmFibGVkLiAgRm9yCmV4YW1wbGUsIHRvIG1ha2Ugc3VyZSB0aGF0IGZ1bmN0aW9uIGtleSA4IGRvZXMgbm90aGluZyBhdCBhbGw6ID4KCTptYXAgIDxGOD4gIDxOb3A+Cgk6bWFwISA8Rjg+ICA8Tm9wPgo8CgkJCQkJCQkqbWFwLW11bHRpYnl0ZSoKSXQgaXMgcG9zc2libGUgdG8gbWFwIG11bHRpYnl0ZSBjaGFyYWN0ZXJzLCBidXQgb25seSB0aGUgd2hvbGUgY2hhcmFjdGVyLiAgWW91CmNhbm5vdCBtYXAgdGhlIGZpcnN0IGJ5dGUgb25seS4gIFRoaXMgd2FzIGRvbmUgdG8gcHJldmVudCBwcm9ibGVtcyBpbiB0aGlzCnNjZW5hcmlvOiA+Cgk6c2V0IGVuY29kaW5nPWxhdGluMQoJOmltYXAgPE0tQz4gZm9vCgk6c2V0IGVuY29kaW5nPXV0Zi04ClRoZSBtYXBwaW5nIGZvciA8TS1DPiBpcyBkZWZpbmVkIHdpdGggdGhlIGxhdGluMSBlbmNvZGluZywgcmVzdWx0aW5nIGluIGEgMHhjMwpieXRlLiAgSWYgeW91IHR5cGUgdGhlIGNoYXJhY3RlciDhICgweGVhIDxNLWE+KSBpbiBVVEYtOCBlbmNvZGluZyB0aGlzIGlzIHRoZQp0d28gYnl0ZXMgMHhjMyAweGExLiAgWW91IGRvbid0IHdhbnQgdGhlIDB4YzMgYnl0ZSB0byBiZSBtYXBwZWQgdGhlbiwKb3RoZXJ3aXNlIGl0IHdvdWxkIGJlIGltcG9zc2libGUgdG8gdHlwZSB0aGUg4SBjaGFyYWN0ZXIuCgoJCQkJCSo8TGVhZGVyPiogKm1hcGxlYWRlcioKVG8gZGVmaW5lIGEgbWFwcGluZyB3aGljaCB1c2VzIHRoZSAibWFwbGVhZGVyIiB2YXJpYWJsZSwgdGhlIHNwZWNpYWwgc3RyaW5nCiI8TGVhZGVyPiIgY2FuIGJlIHVzZWQuICBJdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBzdHJpbmcgdmFsdWUgb2YgIm1hcGxlYWRlciIuCklmICJtYXBsZWFkZXIiIGlzIG5vdCBzZXQgb3IgZW1wdHksIGEgYmFja3NsYXNoIGlzIHVzZWQgaW5zdGVhZC4gIEV4YW1wbGU6ID4KCTptYXAgPExlYWRlcj5BICBvYW5vdGhlciBsaW5lPEVzYz4KV29ya3MgbGlrZTogPgoJOm1hcCBcQSAgb2Fub3RoZXIgbGluZTxFc2M+CkJ1dCBhZnRlcjogPgoJOmxldCBtYXBsZWFkZXIgPSAiLCIKSXQgd29ya3MgbGlrZTogPgoJOm1hcCAsQSAgb2Fub3RoZXIgbGluZTxFc2M+CgpOb3RlIHRoYXQgdGhlIHZhbHVlIG9mICJtYXBsZWFkZXIiIGlzIHVzZWQgYXQgdGhlIG1vbWVudCB0aGUgbWFwcGluZyBpcwpkZWZpbmVkLiAgQ2hhbmdpbmcgIm1hcGxlYWRlciIgYWZ0ZXIgdGhhdCBoYXMgbm8gZWZmZWN0IGZvciBhbHJlYWR5IGRlZmluZWQKbWFwcGluZ3MuCgoJCQkJCSo8TG9jYWxMZWFkZXI+KiAqbWFwbG9jYWxsZWFkZXIqCkp1c3QgbGlrZSA8TGVhZGVyPiwgZXhjZXB0IHRoYXQgaXQgdXNlcyAibWFwbG9jYWxsZWFkZXIiIGluc3RlYWQgb2YKIm1hcGxlYWRlciIuICA8TG9jYWxMZWFkZXI+IGlzIHRvIGJlIHVzZWQgZm9yIG1hcHBpbmdzIHdoaWNoIGFyZSBsb2NhbCB0byBhCmJ1ZmZlci4gIEV4YW1wbGU6ID4KICAgICAgOm1hcCA8TG9jYWxMZWFkZXI+cSAgXERvSXROb3cKPApJbiBhIGdsb2JhbCBwbHVnaW4gPExlYWRlcj4gc2hvdWxkIGJlIHVzZWQgYW5kIGluIGEgZmlsZXR5cGUgcGx1Z2luCjxMb2NhbExlYWRlcj4uICAibWFwbGVhZGVyIiBhbmQgIm1hcGxvY2FsbGVhZGVyIiBjYW4gYmUgZXF1YWwuICBBbHRob3VnaCwgaWYKeW91IG1ha2UgdGhlbSBkaWZmZXJlbnQsIHRoZXJlIGlzIGEgc21hbGxlciBjaGFuY2Ugb2YgbWFwcGluZ3MgZnJvbSBnbG9iYWwKcGx1Z2lucyB0byBjbGFzaCB3aXRoIG1hcHBpbmdzIGZvciBmaWxldHlwZSBwbHVnaW5zLiAgRm9yIGV4YW1wbGUsIHlvdSBjb3VsZAprZWVwICJtYXBsZWFkZXIiIGF0IHRoZSBkZWZhdWx0IGJhY2tzbGFzaCwgYW5kIHNldCAibWFwbG9jYWxsZWFkZXIiIHRvIGFuCnVuZGVyc2NvcmUuCgoJCQkJCQkJKm1hcC08U0lEPioKSW4gYSBzY3JpcHQgdGhlIHNwZWNpYWwga2V5IG5hbWUgIjxTSUQ+IiBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYSBtYXBwaW5nCnRoYXQncyBsb2NhbCB0byB0aGUgc2NyaXB0LiAgU2VlIHw8U0lEPnwgZm9yIGRldGFpbHMuCgoJCQkJCQkJKjxQbHVnPioKVGhlIHNwZWNpYWwga2V5IG5hbWUgIjxQbHVnPiIgY2FuIGJlIHVzZWQgZm9yIGFuIGludGVybmFsIG1hcHBpbmcsIHdoaWNoIGlzCm5vdCB0byBiZSBtYXRjaGVkIHdpdGggYW55IGtleSBzZXF1ZW5jZS4gIFRoaXMgaXMgdXNlZnVsIGluIHBsdWdpbnMKfHVzaW5nLTxQbHVnPnwuCgoJCQkJCQkJKjxDaGFyPiogKjxDaGFyLT4qClRvIG1hcCBhIGNoYXJhY3RlciBieSBpdHMgZGVjaW1hbCwgb2N0YWwgb3IgaGV4YWRlY2ltYWwgbnVtYmVyIHRoZSA8Q2hhcj4KY29uc3RydWN0IGNhbiBiZSB1c2VkOgoJPENoYXItMTIzPgljaGFyYWN0ZXIgMTIzCgk8Q2hhci0wMzM+CWNoYXJhY3RlciAyNwoJPENoYXItMHg3Zj4JY2hhcmFjdGVyIDEyNwpUaGlzIGlzIHVzZWZ1bCB0byBzcGVjaWZ5IGEgKG11bHRpLWJ5dGUpIGNoYXJhY3RlciBpbiBhICdrZXltYXAnIGZpbGUuClVwcGVyIGFuZCBsb3dlcmNhc2UgZGlmZmVyZW5jZXMgYXJlIGlnbm9yZWQuCgoJCQkJCQkJKm1hcC1jb21tZW50cyoKSXQgaXMgbm90IHBvc3NpYmxlIHRvIHB1dCBhIGNvbW1lbnQgYWZ0ZXIgdGhlc2UgY29tbWFuZHMsIGJlY2F1c2UgdGhlICciJwpjaGFyYWN0ZXIgaXMgY29uc2lkZXJlZCB0byBiZSBwYXJ0IG9mIHRoZSB7bGhzfSBvciB7cmhzfS4KCgkJCQkJCQkqbWFwX2JhcioKU2luY2UgdGhlICd8JyBjaGFyYWN0ZXIgaXMgdXNlZCB0byBzZXBhcmF0ZSBhIG1hcCBjb21tYW5kIGZyb20gdGhlIG5leHQKY29tbWFuZCwgeW91IHdpbGwgaGF2ZSB0byBkbyBzb21ldGhpbmcgc3BlY2lhbCB0byBpbmNsdWRlICBhICd8JyBpbiB7cmhzfS4KVGhlcmUgYXJlIHRocmVlIG1ldGhvZHM6CiAgIHVzZQkgICAgIHdvcmtzIHdoZW4JCQkgICBleGFtcGxlCX4KICAgPEJhcj4gICAgICc8JyBpcyBub3QgaW4gJ2Nwb3B0aW9ucycJICAgOm1hcCBfbCA6IWxzIDxCYXI+IG1vcmVeTQogICBcfAkgICAgICdiJyBpcyBub3QgaW4gJ2Nwb3B0aW9ucycJICAgOm1hcCBfbCA6IWxzIFx8IG1vcmVeTQogICBeVnwJICAgICBhbHdheXMsIGluIFZpbSBhbmQgVmkJICAgOm1hcCBfbCA6IWxzIF5WfCBtb3JlXk0KCihoZXJlIF5WIHN0YW5kcyBmb3IgQ1RSTC1WOyB0byBnZXQgb25lIENUUkwtViB5b3UgaGF2ZSB0byB0eXBlIGl0IHR3aWNlOyB5b3UKY2Fubm90IHVzZSB0aGUgPD4gbm90YXRpb24gIjxDLVY+IiBoZXJlKS4KCkFsbCB0aHJlZSB3b3JrIHdoZW4geW91IHVzZSB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciAnY3BvcHRpb25zJy4KCldoZW4gJ2InIGlzIHByZXNlbnQgaW4gJ2Nwb3B0aW9ucycsICJcfCIgd2lsbCBiZSByZWNvZ25pemVkIGFzIGEgbWFwcGluZwplbmRpbmcgaW4gYSAnXCcgYW5kIHRoZW4gYW5vdGhlciBjb21tYW5kLiAgVGhpcyBpcyBWaSBjb21wYXRpYmxlLCBidXQKaWxsb2dpY2FsIHdoZW4gY29tcGFyZWQgdG8gb3RoZXIgY29tbWFuZHMuCgoJCQkJCQkJKm1hcF9yZXR1cm4qCldoZW4geW91IGhhdmUgYSBtYXBwaW5nIHRoYXQgY29udGFpbnMgYW4gRXggY29tbWFuZCwgeW91IG5lZWQgdG8gcHV0IGEgbGluZQp0ZXJtaW5hdG9yIGFmdGVyIGl0IHRvIGhhdmUgaXQgZXhlY3V0ZWQuICBUaGUgdXNlIG9mIDxDUj4gaXMgcmVjb21tZW5kZWQgZm9yCnRoaXMgKHNlZSB8PD58KS4gIEV4YW1wbGU6ID4KICAgOm1hcCAgX2xzICA6IWxzIC1sICU8Q1I+OmVjaG8gInRoZSBlbmQiPENSPgoKVG8gYXZvaWQgbWFwcGluZyBvZiB0aGUgY2hhcmFjdGVycyB5b3UgdHlwZSBpbiBpbnNlcnQgb3IgQ29tbWFuZC1saW5lIG1vZGUsCnR5cGUgYSBDVFJMLVYgZmlyc3QuICBUaGUgbWFwcGluZyBpbiBJbnNlcnQgbW9kZSBpcyBkaXNhYmxlZCBpZiB0aGUgJ3Bhc3RlJwpvcHRpb24gaXMgb24uCgpOb3RlIHRoYXQgd2hlbiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCAodGhhdCBjYXVzZXMgYW4gZXJyb3IgbWVzc2FnZSBvciBiZWVwKQp0aGUgcmVzdCBvZiB0aGUgbWFwcGluZyBpcyBub3QgZXhlY3V0ZWQuICBUaGlzIGlzIFZpLWNvbXBhdGlibGUuCgpOb3RlIHRoYXQgdGhlIHNlY29uZCBjaGFyYWN0ZXIgKGFyZ3VtZW50KSBvZiB0aGUgY29tbWFuZHMgQHpadFRmRltdcm0nYCJ2CmFuZCBDVFJMLVggaXMgbm90IG1hcHBlZC4gIFRoaXMgd2FzIGRvbmUgdG8gYmUgYWJsZSB0byB1c2UgYWxsIHRoZSBuYW1lZApyZWdpc3RlcnMgYW5kIG1hcmtzLCBldmVuIHdoZW4gdGhlIGNvbW1hbmQgd2l0aCB0aGUgc2FtZSBuYW1lIGhhcyBiZWVuCm1hcHBlZC4KCgoxLjcgV0hBVCBLRVlTIFRPIE1BUAkJCQkJKm1hcC13aGljaC1rZXlzKgoKSWYgeW91IGFyZSBnb2luZyB0byBtYXAgc29tZXRoaW5nLCB5b3Ugd2lsbCBuZWVkIHRvIGNob29zZSB3aGljaCBrZXkocykgdG8gdXNlCmZvciB0aGUge2xoc30uICBZb3Ugd2lsbCBoYXZlIHRvIGF2b2lkIGtleXMgdGhhdCBhcmUgdXNlZCBmb3IgVmltIGNvbW1hbmRzLApvdGhlcndpc2UgeW91IHdvdWxkIG5vdCBiZSBhYmxlIHRvIHVzZSB0aG9zZSBjb21tYW5kcyBhbnltb3JlLiAgSGVyZSBhcmUgYSBmZXcKc3VnZ2VzdGlvbnM6Ci0gRnVuY3Rpb24ga2V5cyA8RjI+LCA8RjM+LCBldGMuLiAgQWxzbyB0aGUgc2hpZnRlZCBmdW5jdGlvbiBrZXlzIDxTLUYxPiwKICA8Uy1GMj4sIGV0Yy4gIE5vdGUgdGhhdCA8RjE+IGlzIGFscmVhZHkgdXNlZCBmb3IgdGhlIGhlbHAgY29tbWFuZC4KLSBNZXRhLWtleXMgKHdpdGggdGhlIEFMVCBrZXkgcHJlc3NlZCkuIHw6bWFwLWFsdC1rZXlzfAotIFVzZSB0aGUgJ18nIG9yICcsJyBjaGFyYWN0ZXIgYW5kIHRoZW4gYW55IG90aGVyIGNoYXJhY3Rlci4gIFRoZSAiXyIgYW5kICIsIgogIGNvbW1hbmRzIGRvIGV4aXN0IGluIFZpbSAoc2VlIHxffCBhbmQgfCx8KSwgYnV0IHlvdSBwcm9iYWJseSBuZXZlciB1c2UgdGhlbS4KLSBVc2UgYSBrZXkgdGhhdCBpcyBhIHN5bm9ueW0gZm9yIGFub3RoZXIgY29tbWFuZC4gIEZvciBleGFtcGxlOiBDVFJMLVAgYW5kCiAgQ1RSTC1OLiAgVXNlIGFuIGV4dHJhIGNoYXJhY3RlciB0byBhbGxvdyBtb3JlIG1hcHBpbmdzLgoKU2VlIHRoZSBmaWxlICJpbmRleCIgZm9yIGtleXMgdGhhdCBhcmUgbm90IHVzZWQgYW5kIHRodXMgY2FuIGJlIG1hcHBlZCB3aXRob3V0Cmxvc2luZyBhbnkgYnVpbHRpbiBmdW5jdGlvbi4gIFlvdSBjYW4gYWxzbyB1c2UgIjpoZWxwIHtrZXl9XkQiIHRvIGZpbmQgb3V0IGlmCmEga2V5IGlzIHVzZWQgZm9yIHNvbWUgY29tbWFuZC4gICh7a2V5fSBpcyB0aGUgc3BlY2lmaWMga2V5IHlvdSB3YW50IHRvIGZpbmQKb3V0IGFib3V0LCBeRCBpcyBDVFJMLUQpLgoKCjEuOCBFWEFNUExFUwkJCQkJCSptYXAtZXhhbXBsZXMqCgpBIGZldyBleGFtcGxlcyAoZ2l2ZW4gYXMgeW91IHR5cGUgdGhlbSwgZm9yICI8Q1I+IiB5b3UgdHlwZSBmb3VyIGNoYXJhY3RlcnM7CnRoZSAnPCcgZmxhZyBtdXN0IG5vdCBiZSBwcmVzZW50IGluICdjcG9wdGlvbnMnIGZvciB0aGlzIHRvIHdvcmspLiA+CgogICA6bWFwIDxGMz4gIG8jaW5jbHVkZQogICA6bWFwIDxNLWc+IC9mb288Q1I+Y3diYXI8RXNjPgogICA6bWFwIF94ICAgIGQvRU5EL2U8Q1I+CiAgIDptYXAhIHFxICAgcXVhZHJpbGxpb24gcXVlc3Rpb25zCjwKCjEuOSBVU0lORyBNQVBQSU5HUwkJCQkJKm1hcC10eXBpbmcqCgpWaW0gd2lsbCBjb21wYXJlIHdoYXQgeW91IHR5cGUgd2l0aCB0aGUgc3RhcnQgb2YgYSBtYXBwZWQgc2VxdWVuY2UuICBJZiB0aGVyZQppcyBhbiBpbmNvbXBsZXRlIG1hdGNoLCBpdCB3aWxsIGdldCBtb3JlIGNoYXJhY3RlcnMgdW50aWwgdGhlcmUgZWl0aGVyIGlzIGEKY29tcGxldGUgbWF0Y2ggb3IgdW50aWwgdGhlcmUgaXMgbm8gbWF0Y2ggYXQgYWxsLiAgRXhhbXBsZTogSWYgeW91IG1hcCEgInFxIiwKdGhlIGZpcnN0ICdxJyB3aWxsIG5vdCBhcHBlYXIgb24gdGhlIHNjcmVlbiB1bnRpbCB5b3UgdHlwZSBhbm90aGVyCmNoYXJhY3Rlci4gIFRoaXMgaXMgYmVjYXVzZSBWaW0gY2Fubm90IGtub3cgaWYgdGhlIG5leHQgY2hhcmFjdGVyIHdpbGwgYmUgYQoncScgb3Igbm90LiAgSWYgdGhlICd0aW1lb3V0JyBvcHRpb24gaXMgb24gKHdoaWNoIGlzIHRoZSBkZWZhdWx0KSBWaW0gd2lsbApvbmx5IHdhaXQgZm9yIG9uZSBzZWNvbmQgKG9yIGFzIGxvbmcgYXMgc3BlY2lmaWVkIHdpdGggdGhlICd0aW1lb3V0bGVuJwpvcHRpb24pLiAgQWZ0ZXIgdGhhdCBpdCBhc3N1bWVzIHRoYXQgdGhlICdxJyBpcyB0byBiZSBpbnRlcnByZXRlZCBhcyBzdWNoLiAgSWYKeW91IHR5cGUgc2xvd2x5LCBvciB5b3VyIHN5c3RlbSBpcyBzbG93LCByZXNldCB0aGUgJ3RpbWVvdXQnIG9wdGlvbi4gIFRoZW4geW91Cm1pZ2h0IHdhbnQgdG8gc2V0IHRoZSAndHRpbWVvdXQnIG9wdGlvbi4KCgkJCQkJCQkqbWFwLWtleXMtZmFpbHMqClRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIGtleSBjb2RlcyBtaWdodCBub3QgYmUgcmVjb2duaXplZDoKLSBWaW0gY2FuIG9ubHkgcmVhZCBwYXJ0IG9mIHRoZSBrZXkgY29kZS4gIE1vc3RseSB0aGlzIGlzIG9ubHkgdGhlIGZpcnN0CiAgY2hhcmFjdGVyLiAgVGhpcyBoYXBwZW5zIG9uIHNvbWUgVW5peCB2ZXJzaW9ucyBpbiBhbiB4dGVybS4KLSBUaGUga2V5IGNvZGUgaXMgYWZ0ZXIgY2hhcmFjdGVyKHMpIHRoYXQgYXJlIG1hcHBlZC4gIEUuZy4sICI8RjE+PEYxPiIgb3IKICAiZzxGMT4iLgoKVGhlIHJlc3VsdCBpcyB0aGF0IHRoZSBrZXkgY29kZSBpcyBub3QgcmVjb2duaXplZCBpbiB0aGlzIHNpdHVhdGlvbiwgYW5kIHRoZQptYXBwaW5nIGZhaWxzLiAgVGhlcmUgYXJlIHR3byBhY3Rpb25zIG5lZWRlZCB0byBhdm9pZCB0aGlzIHByb2JsZW06CgotIFJlbW92ZSB0aGUgJ0snIGZsYWcgZnJvbSAnY3BvcHRpb25zJy4gIFRoaXMgd2lsbCBtYWtlIFZpbSB3YWl0IGZvciB0aGUgcmVzdAogIG9mIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSBmdW5jdGlvbiBrZXkuCi0gV2hlbiB1c2luZyA8RjE+IHRvIDxGND4gdGhlIGFjdHVhbCBrZXkgY29kZSBnZW5lcmF0ZWQgbWF5IGNvcnJlc3BvbmQgdG8KICA8eEYxPiB0byA8eEY0Pi4gIFRoZXJlIGFyZSBtYXBwaW5ncyBmcm9tIDx4RjE+IHRvIDxGMT4sIDx4RjI+IHRvIDxGMj4sIGV0Yy4sCiAgYnV0IHRoZXNlIGFyZSBub3QgcmVjb2duaXplZCBhZnRlciBhbm90aGVyIGhhbGYgYSBtYXBwaW5nLiAgTWFrZSBzdXJlIHRoZQogIGtleSBjb2RlcyBmb3IgPEYxPiB0byA8RjQ+IGFyZSBjb3JyZWN0OiA+Cgk6c2V0IDxGMT49PHR5cGUgQ1RSTC1WPjx0eXBlIEYxPgo8IFR5cGUgdGhlIDxGMT4gYXMgZm91ciBjaGFyYWN0ZXJzLiAgVGhlIHBhcnQgYWZ0ZXIgdGhlICI9IiBtdXN0IGJlIGRvbmUgd2l0aAogIHRoZSBhY3R1YWwga2V5cywgbm90IHRoZSBsaXRlcmFsIHRleHQuCkFub3RoZXIgc29sdXRpb24gaXMgdG8gdXNlIHRoZSBhY3R1YWwga2V5IGNvZGUgaW4gdGhlIG1hcHBpbmcgZm9yIHRoZSBzZWNvbmQKc3BlY2lhbCBrZXk6ID4KCTptYXAgPEYxPjxFc2M+T1AgOmVjaG8gInllcyI8Q1I+CkRvbid0IHR5cGUgYSByZWFsIDxFc2M+LCBWaW0gd2lsbCByZWNvZ25pemUgdGhlIGtleSBjb2RlIGFuZCByZXBsYWNlIGl0IHdpdGgKPEYxPiBhbnl3YXkuCgpBbm90aGVyIHByb2JsZW0gbWF5IGJlIHRoYXQgd2hlbiBrZWVwaW5nIEFMVCBvciBNZXRhIHByZXNzZWQgdGhlIHRlcm1pbmFsCnByZXBlbmRzIEVTQyBpbnN0ZWFkIG9mIHNldHRpbmcgdGhlIDh0aCBiaXQuICBTZWUgfDptYXAtYWx0LWtleXN8LgoKCQkJCQkJKnJlY3Vyc2l2ZV9tYXBwaW5nKgpJZiB5b3UgaW5jbHVkZSB0aGUge2xoc30gaW4gdGhlIHtyaHN9IHlvdSBoYXZlIGEgcmVjdXJzaXZlIG1hcHBpbmcuICBXaGVuCntsaHN9IGlzIHR5cGVkLCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGgge3Joc30uICBXaGVuIHRoZSB7bGhzfSB3aGljaCBpcwppbmNsdWRlZCBpbiB7cmhzfSBpcyBlbmNvdW50ZXJlZCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGgge3Joc30sIGFuZCBzbyBvbi4KVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byByZXBlYXQgYSBjb21tYW5kIGFuIGluZmluaXRlIG51bWJlciBvZiB0aW1lcy4gIFRoZQpvbmx5IHByb2JsZW0gaXMgdGhhdCB0aGUgb25seSB3YXkgdG8gc3RvcCB0aGlzIGlzIGJ5IGNhdXNpbmcgYW4gZXJyb3IuICBUaGUKbWFjcm9zIHRvIHNvbHZlIGEgbWF6ZSB1c2VzIHRoaXMsIGxvb2sgdGhlcmUgZm9yIGFuIGV4YW1wbGUuICBUaGVyZSBpcyBvbmUKZXhjZXB0aW9uOiBJZiB0aGUge3Joc30gc3RhcnRzIHdpdGgge2xoc30sIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgbm90IG1hcHBlZAphZ2FpbiAodGhpcyBpcyBWaSBjb21wYXRpYmxlKS4KRm9yIGV4YW1wbGU6ID4KICAgOm1hcCBhYiBhYmNkCndpbGwgZXhlY3V0ZSB0aGUgImEiIGNvbW1hbmQgYW5kIGluc2VydCAiYmNkIiBpbiB0aGUgdGV4dC4gIFRoZSAiYWIiIGluIHRoZQp7cmhzfSB3aWxsIG5vdCBiZSBtYXBwZWQgYWdhaW4uCgpJZiB5b3Ugd2FudCB0byBleGNoYW5nZSB0aGUgbWVhbmluZyBvZiB0d28ga2V5cyB5b3Ugc2hvdWxkIHVzZSB0aGUgOm5vcmVtYXAKY29tbWFuZC4gIEZvciBleGFtcGxlOiA+CiAgIDpub3JlbWFwIGsgagogICA6bm9yZW1hcCBqIGsKVGhpcyB3aWxsIGV4Y2hhbmdlIHRoZSBjdXJzb3IgdXAgYW5kIGRvd24gY29tbWFuZHMuCgpXaXRoIHRoZSBub3JtYWwgOm1hcCBjb21tYW5kLCB3aGVuIHRoZSAncmVtYXAnIG9wdGlvbiBpcyBvbiwgbWFwcGluZyB0YWtlcwpwbGFjZSB1bnRpbCB0aGUgdGV4dCBpcyBmb3VuZCBub3QgdG8gYmUgYSBwYXJ0IG9mIGEge2xoc30uICBGb3IgZXhhbXBsZSwgaWYKeW91IHVzZTogPgogICA6bWFwIHggeQogICA6bWFwIHkgeApWaW0gd2lsbCByZXBsYWNlIHggd2l0aCB5LCBhbmQgdGhlbiB5IHdpdGggeCwgZXRjLiAgV2hlbiB0aGlzIGhhcyBoYXBwZW5lZAonbWF4bWFwZGVwdGgnIHRpbWVzIChkZWZhdWx0IDEwMDApLCBWaW0gd2lsbCBnaXZlIHRoZSBlcnJvciBtZXNzYWdlCiJyZWN1cnNpdmUgbWFwcGluZyIuCgoJCQkJCQkJKjptYXAtdW5kbyoKSWYgeW91IGluY2x1ZGUgYW4gdW5kbyBjb21tYW5kIGluc2lkZSBhIG1hcHBlZCBzZXF1ZW5jZSwgdGhpcyB3aWxsIGJyaW5nIHRoZQp0ZXh0IGJhY2sgaW4gdGhlIHN0YXRlIGJlZm9yZSBleGVjdXRpbmcgdGhlIG1hY3JvLiAgVGhpcyBpcyBjb21wYXRpYmxlIHdpdGgKdGhlIG9yaWdpbmFsIFZpLCBhcyBsb25nIGFzIHRoZXJlIGlzIG9ubHkgb25lIHVuZG8gY29tbWFuZCBpbiB0aGUgbWFwcGVkCnNlcXVlbmNlIChoYXZpbmcgdHdvIHVuZG8gY29tbWFuZHMgaW4gYSBtYXBwZWQgc2VxdWVuY2UgZGlkIG5vdCBtYWtlIHNlbnNlCmluIHRoZSBvcmlnaW5hbCBWaSwgeW91IHdvdWxkIGdldCBiYWNrIHRoZSB0ZXh0IGJlZm9yZSB0aGUgZmlyc3QgdW5kbykuCgoKMS4xMCBNQVBQSU5HIEFMVC1LRVlTCQkJCQkqOm1hcC1hbHQta2V5cyoKCkluIHRoZSBHVUkgVmltIGhhbmRsZXMgdGhlIEFsdCBrZXkgaXRzZWxmLCB0aHVzIG1hcHBpbmcga2V5cyB3aXRoIEFMVCBzaG91bGQKYWx3YXlzIHdvcmsuICBCdXQgaW4gYSB0ZXJtaW5hbCBWaW0gZ2V0cyBhIHNlcXVlbmNlIG9mIGJ5dGVzIGFuZCBoYXMgdG8gZmlndXJlCm91dCB3aGV0aGVyIEFMVCB3YXMgcHJlc3NlZCBvciBub3QuCgpCeSBkZWZhdWx0IFZpbSBhc3N1bWVzIHRoYXQgcHJlc3NpbmcgdGhlIEFMVCBrZXkgc2V0cyB0aGUgOHRoIGJpdCBvZiBhIHR5cGVkCmNoYXJhY3Rlci4gIE1vc3QgZGVjZW50IHRlcm1pbmFscyBjYW4gd29yayB0aGF0IHdheSwgc3VjaCBhcyB4dGVybSwgYXRlcm0gYW5kCnJ4dnQuICBJZiB5b3VyIDxBLWs+IG1hcHBpbmdzIGRvbid0IHdvcmsgaXQgbWlnaHQgYmUgdGhhdCB0aGUgdGVybWluYWwgaXMKcHJlZml4aW5nIHRoZSBjaGFyYWN0ZXIgd2l0aCBhbiBFU0MgY2hhcmFjdGVyLiAgQnV0IHlvdSBjYW4ganVzdCBhcyB3ZWxsIHR5cGUKRVNDIGJlZm9yZSBhIGNoYXJhY3RlciwgdGh1cyBWaW0gZG9lc24ndCBrbm93IHdoYXQgaGFwcGVuZWQgKGV4Y2VwdCBmb3IKY2hlY2tpbmcgdGhlIGRlbGF5IGJldHdlZW4gY2hhcmFjdGVycywgd2hpY2ggaXMgbm90IHJlbGlhYmxlKS4KCkFzIG9mIHRoaXMgd3JpdGluZywgc29tZSBtYWluc3RyZWFtIHRlcm1pbmFscyBsaWtlIGdub21lLXRlcm1pbmFsIGFuZCBrb25zb2xlCnVzZSB0aGUgRVNDIHByZWZpeC4gIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIGEgd2F5IHRvIGhhdmUgdGhlbSB1c2UgdGhlIDh0aCBiaXQKaW5zdGVhZC4gIFh0ZXJtIHNob3VsZCB3b3JrIHdlbGwgYnkgZGVmYXVsdC4gIEF0ZXJtIGFuZCByeHZ0IHNob3VsZCB3b3JrIHdlbGwKd2hlbiBzdGFydGVkIHdpdGggdGhlICItLW1ldGE4IiBhcmd1bWVudC4gIFlvdSBjYW4gYWxzbyB0d2VhayByZXNvdXJjZXMgbGlrZQoibWV0YVNlbmRzRXNjYXBlIiwgImVpZ2h0Qml0SW5wdXQiIGFuZCAiZWlnaHRCaXRPdXRwdXQiLgoKT24gdGhlIExpbnV4IGNvbnNvbGUsIHRoaXMgYmVoYXZpb3IgY2FuIGJlIHRvZ2dsZWQgd2l0aCB0aGUgInNldG1ldGFtb2RlIgpjb21tYW5kLiAgQmVhciBpbiBtaW5kIHRoYXQgbm90IHVzaW5nIGFuIEVTQyBwcmVmaXggY291bGQgZ2V0IHlvdSBpbiB0cm91YmxlCndpdGggb3RoZXIgcHJvZ3JhbXMuICBZb3Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IGJhc2ggaGFzIHRoZSAiY29udmVydC1tZXRhIgpvcHRpb24gc2V0IHRvICJvbiIgaW4gb3JkZXIgZm9yIHlvdXIgTWV0YSBrZXliaW5kaW5ncyB0byBzdGlsbCB3b3JrIG9uIGl0CihpdCdzIHRoZSBkZWZhdWx0IHJlYWRsaW5lIGJlaGF2aW9yLCB1bmxlc3MgY2hhbmdlZCBieSBzcGVjaWZpYyBzeXN0ZW0KY29uZmlndXJhdGlvbikuICBGb3IgdGhhdCwgeW91IGNhbiBhZGQgdGhlIGxpbmU6ID4KCglzZXQgY29udmVydC1tZXRhIG9uCgp0byB5b3VyIH4vLmlucHV0cmMgZmlsZS4gSWYgeW91J3JlIGNyZWF0aW5nIHRoZSBmaWxlLCB5b3UgbWlnaHQgd2FudCB0byB1c2U6ID4KCgkkaW5jbHVkZSAvZXRjL2lucHV0cmMKCmFzIHRoZSBmaXJzdCBsaW5lLCBpZiB0aGF0IGZpbGUgZXhpc3RzIG9uIHlvdXIgc3lzdGVtLCB0byBrZWVwIGdsb2JhbCBvcHRpb25zLgpUaGlzIG1heSBjYXVzZSBhIHByb2JsZW0gZm9yIGVudGVyaW5nIHNwZWNpYWwgY2hhcmFjdGVycywgc3VjaCBhcyB0aGUgdW1sYXV0LgpUaGVuIHlvdSBzaG91bGQgdXNlIENUUkwtViBiZWZvcmUgdGhhdCBjaGFyYWN0ZXIuCgpCZWFyIGluIG1pbmQgdGhhdCBjb252ZXJ0LW1ldGEgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gaGF2ZSB0cm91YmxlcyB3aGVuIHVzZWQgaW4KVVRGLTggbG9jYWxlcy4gIE9uIHRlcm1pbmFscyBsaWtlIHh0ZXJtLCB0aGUgIm1ldGFTZW5kc0VzY2FwZSIgcmVzb3VyY2UgY2FuIGJlCnRvZ2dsZWQgb24gdGhlIGZseSB0aHJvdWdoIHRoZSAiTWFpbiBPcHRpb25zIiBtZW51LCBieSBwcmVzc2luZyBDdHJsLUxlZnRDbGljawpvbiB0aGUgdGVybWluYWw7IHRoYXQncyBhIGdvb2QgbGFzdCByZXNvdXJjZSBpbiBjYXNlIHlvdSB3YW50IHRvIHNlbmQgRVNDIHdoZW4KdXNpbmcgb3RoZXIgYXBwbGljYXRpb25zIGJ1dCBub3Qgd2hlbiBpbnNpZGUgVklNLgoKCjEuMTEgTUFQUElORyBBTiBPUEVSQVRPUgkJCQkqOm1hcC1vcGVyYXRvcioKCkFuIG9wZXJhdG9yIGlzIHVzZWQgYmVmb3JlIGEge21vdGlvbn0gY29tbWFuZC4gIFRvIGRlZmluZSB5b3VyIG93biBvcGVyYXRvcgp5b3UgbXVzdCBjcmVhdGUgbWFwcGluZyB0aGF0IGZpcnN0IHNldHMgdGhlICdvcGVyYXRvcmZ1bmMnIG9wdGlvbiBhbmQgdGhlbgppbnZva2UgdGhlIHxnQHwgb3BlcmF0b3IuICBBZnRlciB0aGUgdXNlciB0eXBlcyB0aGUge21vdGlvbn0gY29tbWFuZCB0aGUKc3BlY2lmaWVkIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkLgoKCQkJCQkJCSpnQCogKkU3NzQqICpFNzc1KgpnQHttb3Rpb259CQlDYWxsIHRoZSBmdW5jdGlvbiBzZXQgYnkgdGhlICdvcGVyYXRvcmZ1bmMnIG9wdGlvbi4KCQkJVGhlICdbIG1hcmsgaXMgcG9zaXRpb25lZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQKCQkJbW92ZWQgb3ZlciBieSB7bW90aW9ufSwgdGhlICddIG1hcmsgb24gdGhlIGxhc3QKCQkJY2hhcmFjdGVyIG9mIHRoZSB0ZXh0LgoJCQlUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggb25lIFN0cmluZyBhcmd1bWVudDoKCQkJICAgICJsaW5lIgl7bW90aW9ufSB3YXMgfGxpbmV3aXNlfAoJCQkgICAgImNoYXIiCXttb3Rpb259IHdhcyB8Y2hhcmFjdGVyd2lzZXwKCQkJICAgICJibG9jayIJe21vdGlvbn0gd2FzIHxibG9ja3dpc2UtdmlzdWFsfHwKCQkJQWx0aG91Z2ggImJsb2NrIiB3b3VsZCByYXJlbHkgYXBwZWFyLCBzaW5jZSBpdCBjYW4KCQkJb25seSByZXN1bHQgZnJvbSBWaXN1YWwgbW9kZSB3aGVyZSAiZ0AiIGlzIG5vdCB1c2VmdWwuCgkJCXtub3QgYXZhaWxhYmxlIHdoZW4gY29tcGlsZWQgd2l0aG91dCB0aGUgK2V2YWwKCQkJZmVhdHVyZX0KCkhlcmUgaXMgYW4gZXhhbXBsZSB0aGF0IGNvdW50cyB0aGUgbnVtYmVyIG9mIHNwYWNlcyB3aXRoIDxGND46ID4KCglubWFwIDxzaWxlbnQ+IDxGND4gOnNldCBvcGZ1bmM9Q291bnRTcGFjZXM8Q1I+Z0AKCXZtYXAgPHNpbGVudD4gPEY0PiA6PEMtVT5jYWxsIENvdW50U3BhY2VzKHZpc3VhbG1vZGUoKSwgMSk8Q1I+CgoJZnVuY3Rpb24hIENvdW50U3BhY2VzKHR5cGUsIC4uLikKCSAgbGV0IHNlbF9zYXZlID0gJnNlbGVjdGlvbgoJICBsZXQgJnNlbGVjdGlvbiA9ICJpbmNsdXNpdmUiCgkgIGxldCByZWdfc2F2ZSA9IEBACgoJICBpZiBhOjAgICIgSW52b2tlZCBmcm9tIFZpc3VhbCBtb2RlLCB1c2UgJzwgYW5kICc+IG1hcmtzLgoJICAgIHNpbGVudCBleGUgIm5vcm1hbCEgYDwiIC4gYTp0eXBlIC4gImA+eSIKCSAgZWxzZWlmIGE6dHlwZSA9PSAnbGluZScKCSAgICBzaWxlbnQgZXhlICJub3JtYWwhICdbViddeSIKCSAgZWxzZWlmIGE6dHlwZSA9PSAnYmxvY2snCgkgICAgc2lsZW50IGV4ZSAibm9ybWFsISBgW1w8Qy1WPmBdeSIKCSAgZWxzZQoJICAgIHNpbGVudCBleGUgIm5vcm1hbCEgYFt2YF15IgoJICBlbmRpZgoKCSAgZWNob21zZyBzdHJsZW4oc3Vic3RpdHV0ZShAQCwgJ1teIF0nLCAnJywgJ2cnKSkKCgkgIGxldCAmc2VsZWN0aW9uID0gc2VsX3NhdmUKCSAgbGV0IEBAID0gcmVnX3NhdmUKCWVuZGZ1bmN0aW9uCgpOb3RlIHRoYXQgdGhlICdzZWxlY3Rpb24nIG9wdGlvbiBpcyB0ZW1wb3JhcmlseSBzZXQgdG8gImluY2x1c2l2ZSIgdG8gYmUgYWJsZQp0byB5YW5rIGV4YWN0bHkgdGhlIHJpZ2h0IHRleHQgYnkgdXNpbmcgVmlzdWFsIG1vZGUgZnJvbSB0aGUgJ1sgdG8gdGhlICddCm1hcmsuCgpBbHNvIG5vdGUgdGhhdCB0aGVyZSBpcyBhIHNlcGFyYXRlIG1hcHBpbmcgZm9yIFZpc3VhbCBtb2RlLiAgSXQgcmVtb3ZlcyB0aGUKIic8LCc+IiByYW5nZSB0aGF0ICI6IiBpbnNlcnRzIGluIFZpc3VhbCBtb2RlIGFuZCBpbnZva2VzIHRoZSBmdW5jdGlvbiB3aXRoCnZpc3VhbG1vZGUoKSBhbmQgYW4gZXh0cmEgYXJndW1lbnQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMi4gQWJicmV2aWF0aW9ucwkJCSphYmJyZXZpYXRpb25zKiAqQWJicmV2aWF0aW9ucyoKCkFiYnJldmlhdGlvbnMgYXJlIHVzZWQgaW4gSW5zZXJ0IG1vZGUsIFJlcGxhY2UgbW9kZSBhbmQgQ29tbWFuZC1saW5lIG1vZGUuCklmIHlvdSBlbnRlciBhIHdvcmQgdGhhdCBpcyBhbiBhYmJyZXZpYXRpb24sIGl0IGlzIHJlcGxhY2VkIHdpdGggdGhlIHdvcmQgaXQKc3RhbmRzIGZvci4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gc2F2ZSB0eXBpbmcgZm9yIG9mdGVuIHVzZWQgbG9uZyB3b3Jkcy4gIEFuZAp5b3UgY2FuIHVzZSBpdCB0byBhdXRvbWF0aWNhbGx5IGNvcnJlY3Qgb2J2aW91cyBzcGVsbGluZyBlcnJvcnMuCkV4YW1wbGVzOgoKCTppYWIgbXMgTWljcm9Tb2Z0Cgk6aWFiIHRpaHMgdGhpcwoKVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIGFiYnJldmlhdGlvbnM6CgpmdWxsLWlkCSAgVGhlICJmdWxsLWlkIiB0eXBlIGNvbnNpc3RzIGVudGlyZWx5IG9mIGtleXdvcmQgY2hhcmFjdGVycyAobGV0dGVycwoJICBhbmQgY2hhcmFjdGVycyBmcm9tICdpc2tleXdvcmQnIG9wdGlvbikuICBUaGlzIGlzIHRoZSBtb3N0IGNvbW1vbgoJICBhYmJyZXZpYXRpb24uCgoJICBFeGFtcGxlczogImZvbyIsICJnMyIsICItMSIKCmVuZC1pZAkgIFRoZSAiZW5kLWlkIiB0eXBlIGVuZHMgaW4gYSBrZXl3b3JkIGNoYXJhY3RlciwgYnV0IGFsbCB0aGUgb3RoZXIKCSAgY2hhcmFjdGVycyBhcmUgbm90IGtleXdvcmQgY2hhcmFjdGVycy4KCgkgIEV4YW1wbGVzOiAiI2kiLCAiLi5mIiwgIiQvNyIKCm5vbi1pZAkgIFRoZSAibm9uLWlkIiB0eXBlIGVuZHMgaW4gYSBub24ta2V5d29yZCBjaGFyYWN0ZXIsIHRoZSBvdGhlcgoJICBjaGFyYWN0ZXJzIG1heSBiZSBvZiBhbnkgdHlwZSwgZXhjbHVkaW5nIHNwYWNlIGFuZCBUYWIuICB7dGhpcyB0eXBlCgkgIGlzIG5vdCBzdXBwb3J0ZWQgYnkgVml9CgoJICBFeGFtcGxlczogImRlZiMiLCAiNC83JCIKCkV4YW1wbGVzIG9mIHN0cmluZ3MgdGhhdCBjYW5ub3QgYmUgYWJicmV2aWF0aW9uczogImEuYiIsICIjZGVmIiwgImEgYiIsICJfJHIiCgpBbiBhYmJyZXZpYXRpb24gaXMgb25seSByZWNvZ25pemVkIHdoZW4geW91IHR5cGUgYSBub24ta2V5d29yZCBjaGFyYWN0ZXIuClRoaXMgY2FuIGFsc28gYmUgdGhlIDxFc2M+IHRoYXQgZW5kcyBpbnNlcnQgbW9kZSBvciB0aGUgPENSPiB0aGF0IGVuZHMgYQpjb21tYW5kLiAgVGhlIG5vbi1rZXl3b3JkIGNoYXJhY3RlciB3aGljaCBlbmRzIHRoZSBhYmJyZXZpYXRpb24gaXMgaW5zZXJ0ZWQKYWZ0ZXIgdGhlIGV4cGFuZGVkIGFiYnJldmlhdGlvbi4gIEFuIGV4Y2VwdGlvbiB0byB0aGlzIGlzIHRoZSBjaGFyYWN0ZXIgPEMtXT4sCndoaWNoIGlzIHVzZWQgdG8gZXhwYW5kIGFuIGFiYnJldmlhdGlvbiB3aXRob3V0IGluc2VydGluZyBhbnkgZXh0cmEKY2hhcmFjdGVycy4KCkV4YW1wbGU6ID4KICAgOmFiIGhoCWhlbGxvCjwJICAgICJoaDxTcGFjZT4iIGlzIGV4cGFuZGVkIHRvICJoZWxsbzxTcGFjZT4iCgkgICAgImhoPEMtXT4iIGlzIGV4cGFuZGVkIHRvICJoZWxsbyIKClRoZSBjaGFyYWN0ZXJzIGJlZm9yZSB0aGUgY3Vyc29yIG11c3QgbWF0Y2ggdGhlIGFiYnJldmlhdGlvbi4gIEVhY2ggdHlwZSBoYXMKYW4gYWRkaXRpb25hbCBydWxlOgoKZnVsbC1pZAkgIEluIGZyb250IG9mIHRoZSBtYXRjaCBpcyBhIG5vbi1rZXl3b3JkIGNoYXJhY3Rlciwgb3IgdGhpcyBpcyB3aGVyZQoJICB0aGUgbGluZSBvciBpbnNlcnRpb24gc3RhcnRzLiAgRXhjZXB0aW9uOiBXaGVuIHRoZSBhYmJyZXZpYXRpb24gaXMKCSAgb25seSBvbmUgY2hhcmFjdGVyLCBpdCBpcyBub3QgcmVjb2duaXplZCBpZiB0aGVyZSBpcyBhIG5vbi1rZXl3b3JkCgkgIGNoYXJhY3RlciBpbiBmcm9udCBvZiBpdCwgb3RoZXIgdGhhbiBhIHNwYWNlIG9yIGEgPFRhYj4uCgplbmQtaWQJICBJbiBmcm9udCBvZiB0aGUgbWF0Y2ggaXMgYSBrZXl3b3JkIGNoYXJhY3Rlciwgb3IgYSBzcGFjZSBvciBhIDxUYWI+LAoJICBvciB0aGlzIGlzIHdoZXJlIHRoZSBsaW5lIG9yIGluc2VydGlvbiBzdGFydHMuCgpub24taWQJICBJbiBmcm9udCBvZiB0aGUgbWF0Y2ggaXMgYSBzcGFjZSwgPFRhYj4gb3IgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIG9yCgkgIHRoZSBpbnNlcnRpb24uCgpFeGFtcGxlczogKHtDVVJTT1J9IGlzIHdoZXJlIHlvdSB0eXBlIGEgbm9uLWtleXdvcmQgY2hhcmFjdGVyKSA+CiAgIDphYiBmb28gICBmb3VyIG9sZCBvdHRlcnMKPAkJIiBmb297Q1VSU09SfSIJICBpcyBleHBhbmRlZCB0byAiIGZvdXIgb2xkIG90dGVycyIKCQkiIGZvb2JhcntDVVJTT1J9IiBpcyBub3QgZXhwYW5kZWQKCQkiYmFyZm9ve0NVUlNPUn0iICBpcyBub3QgZXhwYW5kZWQKPgogICA6YWIgI2kgI2luY2x1ZGUKPAkJIiNpe0NVUlNPUn0iCSAgaXMgZXhwYW5kZWQgdG8gIiNpbmNsdWRlIgoJCSI+I2l7Q1VSU09SfSIJICBpcyBub3QgZXhwYW5kZWQKPgogICA6YWIgOzsgPGVuZG9mbGluZT4KPAkJInRlc3Q7OyIJICBpcyBub3QgZXhwYW5kZWQKCQkidGVzdCA7OyIJICBpcyBleHBhbmRlZCB0byAidGVzdCA8ZW5kb2ZsaW5lPiIKClRvIGF2b2lkIHRoZSBhYmJyZXZpYXRpb24gaW4gaW5zZXJ0IG1vZGU6IFR5cGUgcGFydCBvZiB0aGUgYWJicmV2aWF0aW9uLCBleGl0Cmluc2VydCBtb2RlIHdpdGggPEVzYz4sIHJlLWVudGVyIGluc2VydCBtb2RlIHdpdGggImEiIGFuZCB0eXBlIHRoZSByZXN0LiAgT3IKdHlwZSBDVFJMLVYgYmVmb3JlIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGFiYnJldmlhdGlvbi4KVG8gYXZvaWQgdGhlIGFiYnJldmlhdGlvbiBpbiBDb21tYW5kLWxpbmUgbW9kZTogVHlwZSBDVFJMLVYgdHdpY2Ugc29tZXdoZXJlIGluCnRoZSBhYmJyZXZpYXRpb24gdG8gYXZvaWQgaXQgdG8gYmUgcmVwbGFjZWQuICBBIENUUkwtViBpbiBmcm9udCBvZiBhIG5vcm1hbApjaGFyYWN0ZXIgaXMgbW9zdGx5IGlnbm9yZWQgb3RoZXJ3aXNlLgoKSXQgaXMgcG9zc2libGUgdG8gbW92ZSB0aGUgY3Vyc29yIGFmdGVyIGFuIGFiYnJldmlhdGlvbjogPgogICA6aWFiIGlmIGlmICgpPExlZnQ+ClRoaXMgZG9lcyBub3Qgd29yayBpZiAnY3BvcHRpb25zJyBpbmNsdWRlcyB0aGUgJzwnIGZsYWcuIHw8PnwKCllvdSBjYW4gZXZlbiBkbyBtb3JlIGNvbXBsaWNhdGVkIHRoaW5ncy4gIEZvciBleGFtcGxlLCB0byBjb25zdW1lIHRoZSBzcGFjZQp0eXBlZCBhZnRlciBhbiBhYmJyZXZpYXRpb246ID4KICAgZnVuYyBFYXRjaGFyKHBhdCkKICAgICAgbGV0IGMgPSBucjJjaGFyKGdldGNoYXIoMCkpCiAgICAgIHJldHVybiAoYyA9fiBhOnBhdCkgPyAnJyA6IGMKICAgZW5kZnVuYwogICBpYWJiciA8c2lsZW50PiBpZiBpZiAoKTxMZWZ0PjxDLVI+PUVhdGNoYXIoJ1xzJyk8Q1I+CgpUaGVyZSBhcmUgbm8gZGVmYXVsdCBhYmJyZXZpYXRpb25zLgoKQWJicmV2aWF0aW9ucyBhcmUgbmV2ZXIgcmVjdXJzaXZlLiAgWW91IGNhbiB1c2UgIjphYiBmIGYtby1vIiB3aXRob3V0IGFueQpwcm9ibGVtLiAgQnV0IGFiYnJldmlhdGlvbnMgY2FuIGJlIG1hcHBlZC4gIHtzb21lIHZlcnNpb25zIG9mIFZpIHN1cHBvcnQKcmVjdXJzaXZlIGFiYnJldmlhdGlvbnMsIGZvciBubyBhcHBhcmVudCByZWFzb259CgpBYmJyZXZpYXRpb25zIGFyZSBkaXNhYmxlZCBpZiB0aGUgJ3Bhc3RlJyBvcHRpb24gaXMgb24uCgoJCQkJKjphYmJyZXZpYXRlLWxvY2FsKiAqOmFiYnJldmlhdGUtPGJ1ZmZlcj4qCkp1c3QgbGlrZSBtYXBwaW5ncywgYWJicmV2aWF0aW9ucyBjYW4gYmUgbG9jYWwgdG8gYSBidWZmZXIuICBUaGlzIGlzIG1vc3RseQp1c2VkIGluIGEgfGZpbGV0eXBlLXBsdWdpbnwgZmlsZS4gIEV4YW1wbGUgZm9yIGEgQyBwbHVnaW4gZmlsZTogPgoJOmFiYiA8YnVmZmVyPiBGRiAgZm9yIChpID0gMDsgaSA8IDsgKytpKQo8CgkJCQkJCSo6YWIqICo6YWJicmV2aWF0ZSoKOmFiW2JyZXZpYXRlXQkJbGlzdCBhbGwgYWJicmV2aWF0aW9ucy4gIFRoZSBjaGFyYWN0ZXIgaW4gdGhlIGZpcnN0CgkJCWNvbHVtbiBpbmRpY2F0ZXMgdGhlIG1vZGUgd2hlcmUgdGhlIGFiYnJldmlhdGlvbiBpcwoJCQl1c2VkOiAnaScgZm9yIGluc2VydCBtb2RlLCAnYycgZm9yIENvbW1hbmQtbGluZQoJCQltb2RlLCAnIScgZm9yIGJvdGguICBUaGVzZSBhcmUgdGhlIHNhbWUgYXMgZm9yCgkJCW1hcHBpbmdzLCBzZWUgfG1hcC1saXN0aW5nfC4KCgkJCQkJCSo6YWJicmV2aWF0ZS12ZXJib3NlKgpXaGVuICd2ZXJib3NlJyBpcyBub24temVybywgbGlzdGluZyBhbiBhYmJyZXZpYXRpb24gd2lsbCBhbHNvIGRpc3BsYXkgd2hlcmUgaXQKd2FzIGxhc3QgZGVmaW5lZC4gIEV4YW1wbGU6ID4KCgk6dmVyYm9zZSBhYmJyZXZpYXRlCgkhICB0ZWggICAgICAgICAgIHRoZQoJCUxhc3Qgc2V0IGZyb20gL2hvbWUvYWJjZC92aW0vYWJici52aW0KClNlZSB8OnZlcmJvc2UtY21kfCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KCjphYlticmV2aWF0ZV0ge2xoc30JbGlzdCB0aGUgYWJicmV2aWF0aW9ucyB0aGF0IHN0YXJ0IHdpdGgge2xoc30KCQkJWW91IG1heSBuZWVkIHRvIGluc2VydCBhIENUUkwtViAodHlwZSBpdCB0d2ljZSkgdG8KCQkJYXZvaWQgdGhhdCBhIHR5cGVkIHtsaHN9IGlzIGV4cGFuZGVkLCBzaW5jZQoJCQljb21tYW5kLWxpbmUgYWJicmV2aWF0aW9ucyBhcHBseSBoZXJlLgoKOmFiW2JyZXZpYXRlXSB7bGhzfSB7cmhzfQoJCQlhZGQgYWJicmV2aWF0aW9uIGZvciB7bGhzfSB0byB7cmhzfS4gIElmIHtsaHN9IGFscmVhZHkKCQkJZXhpc3RlZCBpdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBuZXcge3Joc30uICB7cmhzfSBtYXkKCQkJY29udGFpbiBzcGFjZXMuCgoJCQkJCQkqOnVuYSogKjp1bmFiYnJldmlhdGUqCjp1bmFbYmJyZXZpYXRlXSB7bGhzfQlSZW1vdmUgYWJicmV2aWF0aW9uIGZvciB7bGhzfSBmcm9tIHRoZSBsaXN0LiAgSWYgbm9uZQoJCQlpcyBmb3VuZCwgcmVtb3ZlIGFiYnJldmlhdGlvbnMgaW4gd2hpY2gge2xoc30gbWF0Y2hlcwoJCQl3aXRoIHRoZSB7cmhzfS4gIFRoaXMgaXMgZG9uZSBzbyB0aGF0IHlvdSBjYW4gZXZlbgoJCQlyZW1vdmUgYWJicmV2aWF0aW9ucyBhZnRlciBleHBhbnNpb24uICBUbyBhdm9pZAoJCQlleHBhbnNpb24gaW5zZXJ0IGEgQ1RSTC1WICh0eXBlIGl0IHR3aWNlKS4KCgkJCQkJCSo6bm9yZWEqICo6bm9yZWFiYnJldioKOm5vcmVhW2JicmV2XSBbbGhzXSBbcmhzXQoJCQlzYW1lIGFzICI6YWIiLCBidXQgbm8gcmVtYXBwaW5nIGZvciB0aGlzIHtyaHN9IHtub3QKCQkJaW4gVml9CgoJCQkJCQkqOmNhKiAqOmNhYmJyZXYqCjpjYVtiYnJldl0gW2xoc10gW3Joc10Jc2FtZSBhcyAiOmFiIiwgYnV0IGZvciBDb21tYW5kLWxpbmUgbW9kZSBvbmx5LiAge25vdAoJCQlpbiBWaX0KCgkJCQkJCSo6Y3VuYSogKjpjdW5hYmJyZXYqCjpjdW5hW2JicmV2XSB7bGhzfQlzYW1lIGFzICI6dW5hIiwgYnV0IGZvciBDb21tYW5kLWxpbmUgbW9kZSBvbmx5LiAge25vdAoJCQlpbiBWaX0KCgkJCQkJCSo6Y25vcmVhKiAqOmNub3JlYWJicmV2Kgo6Y25vcmVhW2JicmV2XSBbbGhzXSBbcmhzXQoJCQlzYW1lIGFzICI6YWIiLCBidXQgZm9yIENvbW1hbmQtbGluZSBtb2RlIG9ubHkgYW5kIG5vCgkJCXJlbWFwcGluZyBmb3IgdGhpcyB7cmhzfSB7bm90IGluIFZpfQoKCQkJCQkJKjppYSogKjppYWJicmV2Kgo6aWFbYmJyZXZdIFtsaHNdIFtyaHNdCXNhbWUgYXMgIjphYiIsIGJ1dCBmb3IgSW5zZXJ0IG1vZGUgb25seS4gIHtub3QgaW4gVml9CgoJCQkJCQkqOml1bmEqICo6aXVuYWJicmV2Kgo6aXVuYVtiYnJldl0ge2xoc30Jc2FtZSBhcyAiOnVuYSIsIGJ1dCBmb3IgaW5zZXJ0IG1vZGUgb25seS4gIHtub3QgaW4KCQkJVml9CgoJCQkJCQkqOmlub3JlYSogKjppbm9yZWFiYnJldioKOmlub3JlYVtiYnJldl0gW2xoc10gW3Joc10KCQkJc2FtZSBhcyAiOmFiIiwgYnV0IGZvciBJbnNlcnQgbW9kZSBvbmx5IGFuZCBubwoJCQlyZW1hcHBpbmcgZm9yIHRoaXMge3Joc30ge25vdCBpbiBWaX0KCgkJCQkJCQkqOmFiYyogKjphYmNsZWFyKgo6YWJjW2xlYXJdCQlSZW1vdmUgYWxsIGFiYnJldmlhdGlvbnMuICB7bm90IGluIFZpfQoKCQkJCQkJCSo6aWFiYyogKjppYWJjbGVhcioKOmlhYmNbbGVhcl0JCVJlbW92ZSBhbGwgYWJicmV2aWF0aW9ucyBmb3IgSW5zZXJ0IG1vZGUuICB7bm90IGluIFZpfQoKCQkJCQkJCSo6Y2FiYyogKjpjYWJjbGVhcioKOmNhYmNbbGVhcl0JCVJlbW92ZSBhbGwgYWJicmV2aWF0aW9ucyBmb3IgQ29tbWFuZC1saW5lIG1vZGUuICB7bm90CgkJCWluIFZpfQoKCQkJCQkJCSp1c2luZ19DVFJMLVYqCkl0IGlzIHBvc3NpYmxlIHRvIHVzZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gdGhlIHJocyBvZiBhbiBhYmJyZXZpYXRpb24uCkNUUkwtViBoYXMgdG8gYmUgdXNlZCB0byBhdm9pZCB0aGUgc3BlY2lhbCBtZWFuaW5nIG9mIG1vc3Qgbm9uIHByaW50YWJsZQpjaGFyYWN0ZXJzLiAgSG93IG1hbnkgQ1RSTC1WcyBuZWVkIHRvIGJlIHR5cGVkIGRlcGVuZHMgb24gaG93IHlvdSBlbnRlciB0aGUKYWJicmV2aWF0aW9uLiAgVGhpcyBhbHNvIGFwcGxpZXMgdG8gbWFwcGluZ3MuICBMZXQncyB1c2UgYW4gZXhhbXBsZSBoZXJlLgoKU3VwcG9zZSB5b3Ugd2FudCB0byBhYmJyZXZpYXRlICJlc2MiIHRvIGVudGVyIGFuIDxFc2M+IGNoYXJhY3Rlci4gIFdoZW4geW91CnR5cGUgdGhlICI6YWIiIGNvbW1hbmQgaW4gVmltLCB5b3UgaGF2ZSB0byBlbnRlciB0aGlzOiAoaGVyZSBeViBpcyBhIENUUkwtVgphbmQgXlsgaXMgPEVzYz4pCgpZb3UgdHlwZTogICBhYiBlc2MgXlZeVl5WXlZeVl5bCgoJQWxsIGtleWJvYXJkIGlucHV0IGlzIHN1YmplY3RlZCB0byBeViBxdW90ZSBpbnRlcnByZXRhdGlvbiwgc28KCXRoZSBmaXJzdCwgdGhpcmQsIGFuZCBmaWZ0aCBeViAgY2hhcmFjdGVycyBzaW1wbHkgYWxsb3cgdGhlIHNlY29uZCwKCWFuZCBmb3VydGggXlZzLCBhbmQgdGhlIF5bLCB0byBiZSBlbnRlcmVkIGludG8gdGhlIGNvbW1hbmQtbGluZS4KCllvdSBzZWU6ICAgIGFiIGVzYyBeVl5WXlsKCglUaGUgY29tbWFuZC1saW5lIGNvbnRhaW5zIHR3byBhY3R1YWwgXlZzIGJlZm9yZSB0aGUgXlsuICBUaGlzIGlzCglob3cgaXQgc2hvdWxkIGFwcGVhciBpbiB5b3VyIC5leHJjIGZpbGUsIGlmIHlvdSBjaG9vc2UgdG8gZ28gdGhhdAoJcm91dGUuICBUaGUgZmlyc3QgXlYgaXMgdGhlcmUgdG8gcXVvdGUgdGhlIHNlY29uZCBeVjsgdGhlIDphYgoJY29tbWFuZCB1c2VzIF5WIGFzIGl0cyBvd24gcXVvdGUgY2hhcmFjdGVyLCBzbyB5b3UgY2FuIGluY2x1ZGUgcXVvdGVkCgl3aGl0ZXNwYWNlIG9yIHRoZSB8IGNoYXJhY3RlciBpbiB0aGUgYWJicmV2aWF0aW9uLiAgVGhlIDphYiBjb21tYW5kCglkb2Vzbid0IGRvIGFueXRoaW5nIHNwZWNpYWwgd2l0aCB0aGUgXlsgY2hhcmFjdGVyLCBzbyBpdCBkb2Vzbid0IG5lZWQKCXRvIGJlIHF1b3RlZC4gIChBbHRob3VnaCBxdW90aW5nIGlzbid0IGhhcm1mdWw7IHRoYXQncyB3aHkgdHlwaW5nIDcKCVtidXQgbm90IDghXSBeVnMgd29ya3MuKQoKU3RvcmVkIGFzOiAgZXNjICAgICBeVl5bCgoJQWZ0ZXIgcGFyc2luZywgdGhlIGFiYnJldmlhdGlvbidzIHNob3J0IGZvcm0gKCJlc2MiKSBhbmQgbG9uZyBmb3JtCgkodGhlIHR3byBjaGFyYWN0ZXJzICJeVl5bIikgYXJlIHN0b3JlZCBpbiB0aGUgYWJicmV2aWF0aW9uIHRhYmxlLgoJSWYgeW91IGdpdmUgdGhlIDphYiBjb21tYW5kIHdpdGggbm8gYXJndW1lbnRzLCB0aGlzIGlzIGhvdyB0aGUKCWFiYnJldmlhdGlvbiB3aWxsIGJlIGRpc3BsYXllZC4KCglMYXRlciwgd2hlbiB0aGUgYWJicmV2aWF0aW9uIGlzIGV4cGFuZGVkIGJlY2F1c2UgdGhlIHVzZXIgdHlwZWQgaW4KCXRoZSB3b3JkICJlc2MiLCB0aGUgbG9uZyBmb3JtIGlzIHN1YmplY3RlZCB0byB0aGUgc2FtZSB0eXBlIG9mCgleViBpbnRlcnByZXRhdGlvbiBhcyBrZXlib2FyZCBpbnB1dC4gIFNvIHRoZSBeViBwcm90ZWN0cyB0aGUgXlsKCWNoYXJhY3RlciBmcm9tIGJlaW5nIGludGVycHJldGVkIGFzIHRoZSAiZXhpdCBJbnNlcnQgbW9kZSIgY2hhcmFjdGVyLgoJSW5zdGVhZCwgdGhlIF5bIGlzIGluc2VydGVkIGludG8gdGhlIHRleHQuCgpFeHBhbmRzIHRvOiBeWwoKW2V4YW1wbGUgZ2l2ZW4gYnkgU3RldmUgS2lya2VuZGFsbF0KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBMb2NhbCBtYXBwaW5ncyBhbmQgZnVuY3Rpb25zCQkJCSpzY3JpcHQtbG9jYWwqCgpXaGVuIHVzaW5nIHNldmVyYWwgVmltIHNjcmlwdCBmaWxlcywgdGhlcmUgaXMgdGhlIGRhbmdlciB0aGF0IG1hcHBpbmdzIGFuZApmdW5jdGlvbnMgdXNlZCBpbiBvbmUgc2NyaXB0IHVzZSB0aGUgc2FtZSBuYW1lIGFzIGluIG90aGVyIHNjcmlwdHMuICBUbyBhdm9pZAp0aGlzLCB0aGV5IGNhbiBiZSBtYWRlIGxvY2FsIHRvIHRoZSBzY3JpcHQuCgoJCQkJCQkqPFNJRD4qICo8U05SPiogKkU4MSoKVGhlIHN0cmluZyAiPFNJRD4iIGNhbiBiZSB1c2VkIGluIGEgbWFwcGluZyBvciBtZW51LiAgVGhpcyByZXF1aXJlcyB0aGF0IHRoZQonPCcgZmxhZyBpcyBub3QgcHJlc2VudCBpbiAnY3BvcHRpb25zJy4KICAgV2hlbiBleGVjdXRpbmcgdGhlIG1hcCBjb21tYW5kLCBWaW0gd2lsbCByZXBsYWNlICI8U0lEPiIgd2l0aCB0aGUgc3BlY2lhbAprZXkgY29kZSA8U05SPiwgZm9sbG93ZWQgYnkgYSBudW1iZXIgdGhhdCdzIHVuaXF1ZSBmb3IgdGhlIHNjcmlwdCwgYW5kIGFuCnVuZGVyc2NvcmUuICBFeGFtcGxlOiA+Cgk6bWFwIDxTSUQ+QWRkCmNvdWxkIGRlZmluZSBhIG1hcHBpbmcgIjxTTlI+MjNfQWRkIi4KCldoZW4gZGVmaW5pbmcgYSBmdW5jdGlvbiBpbiBhIHNjcmlwdCwgInM6IiBjYW4gYmUgcHJlcGVuZGVkIHRvIHRoZSBuYW1lIHRvCm1ha2UgaXQgbG9jYWwgdG8gdGhlIHNjcmlwdC4gIEJ1dCB3aGVuIGEgbWFwcGluZyBpcyBleGVjdXRlZCBmcm9tIG91dHNpZGUgb2YKdGhlIHNjcmlwdCwgaXQgZG9lc24ndCBrbm93IGluIHdoaWNoIHNjcmlwdCB0aGUgZnVuY3Rpb24gd2FzIGRlZmluZWQuICBUbwphdm9pZCB0aGlzIHByb2JsZW0sIHVzZSAiPFNJRD4iIGluc3RlYWQgb2YgInM6Ii4gIFRoZSBzYW1lIHRyYW5zbGF0aW9uIGlzIGRvbmUKYXMgZm9yIG1hcHBpbmdzLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBkZWZpbmUgYSBjYWxsIHRvIHRoZSBmdW5jdGlvbiBpbgphIG1hcHBpbmcuCgpXaGVuIGEgbG9jYWwgZnVuY3Rpb24gaXMgZXhlY3V0ZWQsIGl0IHJ1bnMgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHNjcmlwdCBpdCB3YXMKZGVmaW5lZCBpbi4gIFRoaXMgbWVhbnMgdGhhdCBuZXcgZnVuY3Rpb25zIGFuZCBtYXBwaW5ncyBpdCBkZWZpbmVzIGNhbiBhbHNvCnVzZSAiczoiIG9yICI8U0lEPiIgYW5kIGl0IHdpbGwgdXNlIHRoZSBzYW1lIHVuaXF1ZSBudW1iZXIgYXMgd2hlbiB0aGUKZnVuY3Rpb24gaXRzZWxmIHdhcyBkZWZpbmVkLiAgQWxzbywgdGhlICJzOnZhciIgbG9jYWwgc2NyaXB0IHZhcmlhYmxlcyBjYW4gYmUKdXNlZC4KCldoZW4gZXhlY3V0aW5nIGFuIGF1dG9jb21tYW5kIG9yIGEgdXNlciBjb21tYW5kLCBpdCB3aWxsIHJ1biBpbiB0aGUgY29udGV4dCBvZgp0aGUgc2NyaXB0IGl0IHdhcyBkZWZpbmVkIGluLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0aGF0IHRoZSBjb21tYW5kIGNhbGxzIGEKbG9jYWwgZnVuY3Rpb24gb3IgdXNlcyBhIGxvY2FsIG1hcHBpbmcuCgpPdGhlcndpc2UsIHVzaW5nICI8U0lEPiIgb3V0c2lkZSBvZiBhIHNjcmlwdCBjb250ZXh0IGlzIGFuIGVycm9yLgoKSWYgeW91IG5lZWQgdG8gZ2V0IHRoZSBzY3JpcHQgbnVtYmVyIHRvIHVzZSBpbiBhIGNvbXBsaWNhdGVkIHNjcmlwdCwgeW91IGNhbgp1c2UgdGhpcyBmdW5jdGlvbjogPgoJZnVuY3Rpb24gczpTSUQoKQoJICByZXR1cm4gbWF0Y2hzdHIoZXhwYW5kKCc8c2ZpbGU+JyksICc8U05SPlx6c1xkXCtcemVfU0lEJCcpCgllbmRmdW4KClRoZSAiPFNOUj4iIHdpbGwgYmUgc2hvd24gd2hlbiBsaXN0aW5nIGZ1bmN0aW9ucyBhbmQgbWFwcGluZ3MuICBUaGlzIGlzIHVzZWZ1bAp0byBmaW5kIG91dCB3aGF0IHRoZXkgYXJlIGRlZmluZWQgdG8uCgpUaGUgfDpzY3JpcHRuYW1lc3wgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBzZWUgd2hpY2ggc2NyaXB0cyBoYXZlIGJlZW4gc291cmNlZAphbmQgd2hhdCB0aGVpciA8U05SPiBudW1iZXIgaXMuCgpUaGlzIGlzIGFsbCB7bm90IGluIFZpfSBhbmQge25vdCBhdmFpbGFibGUgd2hlbiBjb21waWxlZCB3aXRob3V0IHRoZSArZXZhbApmZWF0dXJlfS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBVc2VyLWRlZmluZWQgY29tbWFuZHMJCQkJKnVzZXItY29tbWFuZHMqCgpJdCBpcyBwb3NzaWJsZSB0byBkZWZpbmUgeW91ciBvd24gRXggY29tbWFuZHMuICBBIHVzZXItZGVmaW5lZCBjb21tYW5kIGNhbiBhY3QKanVzdCBsaWtlIGEgYnVpbHQtaW4gY29tbWFuZCAoaXQgY2FuIGhhdmUgYSByYW5nZSBvciBhcmd1bWVudHMsIGFyZ3VtZW50cyBjYW4KYmUgY29tcGxldGVkIGFzIGZpbGVuYW1lcyBvciBidWZmZXIgbmFtZXMsIGV0YyksIGV4Y2VwdCB0aGF0IHdoZW4gdGhlIGNvbW1hbmQKaXMgZXhlY3V0ZWQsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gYSBub3JtYWwgZXggY29tbWFuZCBhbmQgdGhlbiBleGVjdXRlZC4KCkZvciBzdGFydGVyczogU2VlIHNlY3Rpb24gfDQwLjJ8IGluIHRoZSB1c2VyIG1hbnVhbC4KCgkJCQkJCSpFMTgzKiAqdXNlci1jbWQtYW1iaWd1b3VzKgpBbGwgdXNlciBkZWZpbmVkIGNvbW1hbmRzIG11c3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyLCB0byBhdm9pZApjb25mdXNpb24gd2l0aCBidWlsdGluIGNvbW1hbmRzLiAgKFRoZXJlIGFyZSBhIGZldyBidWlsdGluIGNvbW1hbmRzLCBub3RhYmx5CjpOZXh0LCA6UHJpbnQgYW5kIDpYLCB3aGljaCBkbyBzdGFydCB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIuICBUaGUgYnVpbHRpbgp3aWxsIGFsd2F5cyB0YWtlIHByZWNlZGVuY2UgaW4gdGhlc2UgY2FzZXMpLiAgVGhlIG90aGVyIGNoYXJhY3RlcnMgb2YgdGhlIHVzZXIKY29tbWFuZCBjYW4gYmUgdXBwZXJjYXNlIGxldHRlcnMsIGxvd2VyY2FzZSBsZXR0ZXJzIG9yIGRpZ2l0cy4gIFdoZW4gdXNpbmcKZGlnaXRzLCBub3RlIHRoYXQgb3RoZXIgY29tbWFuZHMgdGhhdCB0YWtlIGEgbnVtZXJpYyBhcmd1bWVudCBtYXkgYmVjb21lCmFtYmlndW91cy4gIEZvciBleGFtcGxlLCB0aGUgY29tbWFuZCAiOkNjMiIgY291bGQgYmUgdGhlIHVzZXIgY29tbWFuZCAiOkNjMiIKd2l0aG91dCBhbiBhcmd1bWVudCwgb3IgdGhlIGNvbW1hbmQgIjpDYyIgd2l0aCBhcmd1bWVudCAiMiIuICBJdCBpcyBhZHZpc2VkIHRvCnB1dCBhIHNwYWNlIGJldHdlZW4gdGhlIGNvbW1hbmQgbmFtZSBhbmQgdGhlIGFyZ3VtZW50IHRvIGF2b2lkIHRoZXNlIHByb2JsZW1zLgoKV2hlbiB1c2luZyBhIHVzZXItZGVmaW5lZCBjb21tYW5kLCB0aGUgY29tbWFuZCBjYW4gYmUgYWJicmV2aWF0ZWQuICBIb3dldmVyLCBpZgphbiBhYmJyZXZpYXRpb24gaXMgbm90IHVuaXF1ZSwgYW4gZXJyb3Igd2lsbCBiZSBpc3N1ZWQuICBGdXJ0aGVybW9yZSwgYQpidWlsdC1pbiBjb21tYW5kIHdpbGwgYWx3YXlzIHRha2UgcHJlY2VkZW5jZS4KCkV4YW1wbGU6ID4KCTpjb21tYW5kIFJlbmFtZSAuLi4KCTpjb21tYW5kIFJlbnVtYmVyIC4uLgoJOlJlbmEJCQkJIiBNZWFucyAiUmVuYW1lIgoJOlJlbnUJCQkJIiBNZWFucyAiUmVudW1iZXIiCgk6UmVuCQkJCSIgRXJyb3IgLSBhbWJpZ3VvdXMKCTpjb21tYW5kIFBhc3RlIC4uLgoJOlAJCQkJIiBUaGUgYnVpbHQtaW4gOlByaW50CgpJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGZ1bGwgbmFtZXMgZm9yIHVzZXItZGVmaW5lZCBjb21tYW5kcyBhcmUgdXNlZCBpbgpzY3JpcHRzLgoKOmNvbVttYW5kXQkJCQkJCSo6Y29tKiAqOmNvbW1hbmQqCgkJCUxpc3QgYWxsIHVzZXItZGVmaW5lZCBjb21tYW5kcy4gIFdoZW4gbGlzdGluZyBjb21tYW5kcywKCQkJdGhlIGNoYXJhY3RlcnMgaW4gdGhlIGZpcnN0IHR3byBjb2x1bW5zIGFyZQoJCQkgICAgIQlDb21tYW5kIGhhcyB0aGUgLWJhbmcgYXR0cmlidXRlCgkJCSAgICAiCUNvbW1hbmQgaGFzIHRoZSAtcmVnaXN0ZXIgYXR0cmlidXRlCgkJCSAgICBiCUNvbW1hbmQgaXMgbG9jYWwgdG8gY3VycmVudCBidWZmZXIKCQkJKHNlZSBiZWxvdyBmb3IgZGV0YWlscyBvbiBhdHRyaWJ1dGVzKQoKOmNvbVttYW5kXSB7Y21kfQlMaXN0IHRoZSB1c2VyLWRlZmluZWQgY29tbWFuZHMgdGhhdCBzdGFydCB3aXRoIHtjbWR9CgoJCQkJCQkJKjpjb21tYW5kLXZlcmJvc2UqCldoZW4gJ3ZlcmJvc2UnIGlzIG5vbi16ZXJvLCBsaXN0aW5nIGEgY29tbWFuZCB3aWxsIGFsc28gZGlzcGxheSB3aGVyZSBpdCB3YXMKbGFzdCBkZWZpbmVkLiBFeGFtcGxlOiA+CgogICAgOnZlcmJvc2UgY29tbWFuZCBUT2h0bWwKCU5hbWUgICAgICAgIEFyZ3MgUmFuZ2UgQ29tcGxldGUgIERlZmluaXRpb24KCVRPaHRtbCAgICAgIDAgICAgJSAgICAgICAgICAgICAgIDpjYWxsIENvbnZlcnQySFRNTCg8bGluZTE+LCA8bGluZTI+KQoJICAgIExhc3Qgc2V0IGZyb20gL3Vzci9zaGFyZS92aW0vdmltLTcuMC9wbHVnaW4vdG9odG1sLnZpbQo8ClNlZSB8OnZlcmJvc2UtY21kfCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KCgkJCQkJCQkqRTE3NCogKkUxODIqCjpjb21bbWFuZF1bIV0gW3thdHRyfS4uLl0ge2NtZH0ge3JlcH0KCQkJRGVmaW5lIGEgdXNlciBjb21tYW5kLiAgVGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgaXMKCQkJe2NtZH0gYW5kIGl0cyByZXBsYWNlbWVudCB0ZXh0IGlzIHtyZXB9LiAgVGhlIGNvbW1hbmQncwoJCQlhdHRyaWJ1dGVzIChzZWUgYmVsb3cpIGFyZSB7YXR0cn0uICBJZiB0aGUgY29tbWFuZAoJCQlhbHJlYWR5IGV4aXN0cywgYW4gZXJyb3IgaXMgcmVwb3J0ZWQsIHVubGVzcyBhICEgaXMKCQkJc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHRoZSBjb21tYW5kIGlzIHJlZGVmaW5lZC4KCjpkZWxjW29tbWFuZF0ge2NtZH0JCQkJKjpkZWxjKiAqOmRlbGNvbW1hbmQqICpFMTg0KgoJCQlEZWxldGUgdGhlIHVzZXItZGVmaW5lZCBjb21tYW5kIHtjbWR9LgoKOmNvbWNbbGVhcl0JCQkJCQkqOmNvbWMqICo6Y29tY2xlYXIqCgkJCURlbGV0ZSBhbGwgdXNlci1kZWZpbmVkIGNvbW1hbmRzLgoKQ29tbWFuZCBhdHRyaWJ1dGVzCgpVc2VyLWRlZmluZWQgY29tbWFuZHMgYXJlIHRyZWF0ZWQgYnkgVmltIGp1c3QgbGlrZSBhbnkgb3RoZXIgZXggY29tbWFuZHMuICBUaGV5CmNhbiBoYXZlIGFyZ3VtZW50cywgb3IgaGF2ZSBhIHJhbmdlIHNwZWNpZmllZC4gIEFyZ3VtZW50cyBhcmUgc3ViamVjdCB0bwpjb21wbGV0aW9uIGFzIGZpbGVuYW1lcywgYnVmZmVycywgZXRjLiAgRXhhY3RseSBob3cgdGhpcyB3b3JrcyBkZXBlbmRzIHVwb24gdGhlCmNvbW1hbmQncyBhdHRyaWJ1dGVzLCB3aGljaCBhcmUgc3BlY2lmaWVkIHdoZW4gdGhlIGNvbW1hbmQgaXMgZGVmaW5lZC4KClRoZXJlIGFyZSBhIG51bWJlciBvZiBhdHRyaWJ1dGVzLCBzcGxpdCBpbnRvIGZvdXIgY2F0ZWdvcmllczogYXJndW1lbnQKaGFuZGxpbmcsIGNvbXBsZXRpb24gYmVoYXZpb3IsIHJhbmdlIGhhbmRsaW5nLCBhbmQgc3BlY2lhbCBjYXNlcy4gIFRoZQphdHRyaWJ1dGVzIGFyZSBkZXNjcmliZWQgYmVsb3csIGJ5IGNhdGVnb3J5LgoKQXJndW1lbnQgaGFuZGxpbmcJCQkJCSpFMTc1KiAqRTE3NioKCkJ5IGRlZmF1bHQsIGEgdXNlciBkZWZpbmVkIGNvbW1hbmQgd2lsbCB0YWtlIG5vIGFyZ3VtZW50cyAoYW5kIGFuIGVycm9yIGlzCnJlcG9ydGVkIGlmIGFueSBhcmUgc3VwcGxpZWQpLiAgSG93ZXZlciwgaXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSB0aGF0IHRoZQpjb21tYW5kIGNhbiB0YWtlIGFyZ3VtZW50cywgdXNpbmcgdGhlIC1uYXJncyBhdHRyaWJ1dGUuICBWYWxpZCBjYXNlcyBhcmU6CgoJLW5hcmdzPTAgICAgTm8gYXJndW1lbnRzIGFyZSBhbGxvd2VkICh0aGUgZGVmYXVsdCkKCS1uYXJncz0xICAgIEV4YWN0bHkgb25lIGFyZ3VtZW50IGlzIHJlcXVpcmVkCgktbmFyZ3M9KiAgICBBbnkgbnVtYmVyIG9mIGFyZ3VtZW50cyBhcmUgYWxsb3dlZCAoMCwgMSwgb3IgbWFueSkKCS1uYXJncz0/ICAgIDAgb3IgMSBhcmd1bWVudHMgYXJlIGFsbG93ZWQKCS1uYXJncz0rICAgIEFyZ3VtZW50cyBtdXN0IGJlIHN1cHBsaWVkLCBidXQgYW55IG51bWJlciBhcmUgYWxsb3dlZAoKQXJndW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIHNlcGFyYXRlZCBieSAodW5lc2NhcGVkKSBzcGFjZXMgb3IgVGFicyBpbiB0aGlzCmNvbnRleHQuCgpOb3RlIHRoYXQgYXJndW1lbnRzIGFyZSB1c2VkIGFzIHRleHQsIG5vdCBhcyBleHByZXNzaW9ucy4gIFNwZWNpZmljYWxseSwKInM6dmFyIiB3aWxsIHVzZSB0aGUgc2NyaXB0LWxvY2FsIHZhcmlhYmxlIGluIHRoZSBzY3JpcHQgd2hlcmUgdGhlIGNvbW1hbmQgd2FzCmRlZmluZWQsIG5vdCB3aGVyZSBpdCBpcyBpbnZva2VkISAgRXhhbXBsZToKICAgIHNjcmlwdDEudmltOiA+Cgk6bGV0IHM6ZXJyb3IgPSAiTm9uZSIKCTpjb21tYW5kIC1uYXJncz0xIEVycm9yIGVjaG9lcnIgPGFyZ3M+CjwgICBzY3JpcHQyLnZpbTogPgoJOnNvdXJjZSBzY3JpcHQxLnZpbQoJOmxldCBzOmVycm9yID0gIldyb25nISIKCTpFcnJvciBzOmVycm9yCkV4ZWN1dGluZyBzY3JpcHQyLnZpbSB3aWxsIHJlc3VsdCBpbiAiTm9uZSIgdG8gYmUgZWNob2VkLiAgTm90IHdoYXQgeW91CmludGVuZGVkISAgQ2FsbGluZyBhIGZ1bmN0aW9uIG1heSBiZSBhbiBhbHRlcm5hdGl2ZS4KCkNvbXBsZXRpb24gYmVoYXZpb3IJCQkJKjpjb21tYW5kLWNvbXBsZXRpb24qCgkJCQkJCQkqRTE3OSogKkUxODAqICpFMTgxKgpCeSBkZWZhdWx0LCB0aGUgYXJndW1lbnRzIG9mIHVzZXIgZGVmaW5lZCBjb21tYW5kcyBkbyBub3QgdW5kZXJnbyBjb21wbGV0aW9uLgpIb3dldmVyLCBieSBzcGVjaWZ5aW5nIG9uZSBvciB0aGUgb3RoZXIgb2YgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzLCBhcmd1bWVudApjb21wbGV0aW9uIGNhbiBiZSBlbmFibGVkOgoKCS1jb21wbGV0ZT1hdWdyb3VwCWF1dG9jbWQgZ3JvdXBzCgktY29tcGxldGU9YnVmZmVyCWJ1ZmZlciBuYW1lcwoJLWNvbXBsZXRlPWNvbW1hbmQJRXggY29tbWFuZCAoYW5kIGFyZ3VtZW50cykKCS1jb21wbGV0ZT1kaXIJCWRpcmVjdG9yeSBuYW1lcwoJLWNvbXBsZXRlPWVudmlyb25tZW50CWVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzCgktY29tcGxldGU9ZXZlbnQJCWF1dG9jb21tYW5kIGV2ZW50cwoJLWNvbXBsZXRlPWV4cHJlc3Npb24JVmltIGV4cHJlc3Npb24KCS1jb21wbGV0ZT1maWxlCQlmaWxlIGFuZCBkaXJlY3RvcnkgbmFtZXMKCS1jb21wbGV0ZT1zaGVsbGNtZAlTaGVsbCBjb21tYW5kCgktY29tcGxldGU9ZnVuY3Rpb24JZnVuY3Rpb24gbmFtZQoJLWNvbXBsZXRlPWhlbHAJCWhlbHAgc3ViamVjdHMKCS1jb21wbGV0ZT1oaWdobGlnaHQJaGlnaGxpZ2h0IGdyb3VwcwoJLWNvbXBsZXRlPW1hcHBpbmcJbWFwcGluZyBuYW1lCgktY29tcGxldGU9bWVudQkJbWVudXMKCS1jb21wbGV0ZT1vcHRpb24Jb3B0aW9ucwoJLWNvbXBsZXRlPXRhZwkJdGFncwoJLWNvbXBsZXRlPXRhZ19saXN0ZmlsZXMJdGFncywgZmlsZSBuYW1lcyBhcmUgc2hvd24gd2hlbiBDVFJMLUQgaXMgaGl0CgktY29tcGxldGU9dmFyCQl1c2VyIHZhcmlhYmxlcwoJLWNvbXBsZXRlPWN1c3RvbSx7ZnVuY30gY3VzdG9tIGNvbXBsZXRpb24sIGRlZmluZWQgdmlhIHtmdW5jfQoJLWNvbXBsZXRlPWN1c3RvbWxpc3Qse2Z1bmN9IGN1c3RvbSBjb21wbGV0aW9uLCBkZWZpbmVkIHZpYSB7ZnVuY30KCgpDdXN0b20gY29tcGxldGlvbgkJCSo6Y29tbWFuZC1jb21wbGV0aW9uLWN1c3RvbSoKCQkJCQkqOmNvbW1hbmQtY29tcGxldGlvbi1jdXN0b21saXN0KgoJCQkJCSpFNDY3KiAqRTQ2OCoKSXQgaXMgcG9zc2libGUgdG8gZGVmaW5lIGN1c3RvbWl6ZWQgY29tcGxldGlvbiBzY2hlbWVzIHZpYSB0aGUgImN1c3RvbSx7ZnVuY30iCm9yIHRoZSAiY3VzdG9tbGlzdCx7ZnVuY30iIGNvbXBsZXRpb24gYXJndW1lbnQuICBUaGUge2Z1bmN9IHBhcnQgc2hvdWxkIGJlIGEKZnVuY3Rpb24gd2l0aCB0aGUgZm9sbG93aW5nIHByb3RvdHlwZSA+CgoJOmZ1bmN0aW9uIHtmdW5jfShBcmdMZWFkLCBDbWRMaW5lLCBDdXJzb3JQb3MpCgpUaGUgZnVuY3Rpb24gbmVlZCBub3QgdXNlIGFsbCB0aGVzZSBhcmd1bWVudHMuIFRoZSBmdW5jdGlvbiBzaG91bGQgcHJvdmlkZSB0aGUKY29tcGxldGlvbiBjYW5kaWRhdGVzIGFzIHRoZSByZXR1cm4gdmFsdWUuCgpGb3IgdGhlICJjdXN0b20iIGFyZ3VtZW50LCB0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgY29tcGxldGlvbgpjYW5kaWRhdGVzIG9uZSBwZXIgbGluZSBpbiBhIG5ld2xpbmUgc2VwYXJhdGVkIHN0cmluZy4KCkZvciB0aGUgImN1c3RvbWxpc3QiIGFyZ3VtZW50LCB0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgY29tcGxldGlvbgpjYW5kaWRhdGVzIGFzIGEgVmltIExpc3QuICBOb24tc3RyaW5nIGl0ZW1zIGluIHRoZSBsaXN0IGFyZSBpZ25vcmVkLgoKVGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBhcmU6CglBcmdMZWFkCQl0aGUgbGVhZGluZyBwb3J0aW9uIG9mIHRoZSBhcmd1bWVudCBjdXJyZW50bHkgYmVpbmcKCQkJY29tcGxldGVkIG9uCglDbWRMaW5lCQl0aGUgZW50aXJlIGNvbW1hbmQgbGluZQoJQ3Vyc29yUG9zCXRoZSBjdXJzb3IgcG9zaXRpb24gaW4gaXQgKGJ5dGUgaW5kZXgpClRoZSBmdW5jdGlvbiBtYXkgdXNlIHRoZXNlIGZvciBkZXRlcm1pbmluZyBjb250ZXh0LiAgRm9yIHRoZSAiY3VzdG9tIgphcmd1bWVudCwgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBmaWx0ZXIgY2FuZGlkYXRlcyBhZ2FpbnN0IHRoZSAoaW1wbGljaXQKcGF0dGVybiBpbikgQXJnTGVhZC4gIFZpbSB3aWxsIGRvIGZpbHRlciB0aGUgY2FuZGlkYXRlcyB3aXRoIGl0cyByZWdleHAgZW5naW5lCmFmdGVyIGZ1bmN0aW9uIHJldHVybiwgYW5kIHRoaXMgaXMgcHJvYmFibHkgbW9yZSBlZmZpY2llbnQgaW4gbW9zdCBjYXNlcy4gRm9yCnRoZSAiY3VzdG9tbGlzdCIgYXJndW1lbnQsIFZpbSB3aWxsIG5vdCBmaWx0ZXIgdGhlIHJldHVybmVkIGNvbXBsZXRpb24KY2FuZGlkYXRlcyBhbmQgdGhlIHVzZXIgc3VwcGxpZWQgZnVuY3Rpb24gc2hvdWxkIGZpbHRlciB0aGUgY2FuZGlkYXRlcy4KClRoZSBmb2xsb3dpbmcgZXhhbXBsZSBsaXN0cyB1c2VyIG5hbWVzIHRvIGEgRmluZ2VyIGNvbW1hbmQgPgogICAgOmNvbSAtY29tcGxldGU9Y3VzdG9tLExpc3RVc2VycyAtbmFyZ3M9MSBGaW5nZXIgIWZpbmdlciA8YXJncz4KICAgIDpmdW4gTGlzdFVzZXJzKEEsTCxQKQogICAgOiAgICByZXR1cm4gc3lzdGVtKCJjdXQgLWQ6IC1mMSAvZXRjL3Bhc3N3ZCIpCiAgICA6ZW5kZnVuCgpUaGUgZm9sbG93aW5nIGV4YW1wbGUgY29tcGxldGVzIGZpbGVuYW1lcyBmcm9tIHRoZSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgaW4KdGhlICdwYXRoJyBvcHRpb246ID4KICAgIDpjb20gLW5hcmdzPTEgLWJhbmcgLWNvbXBsZXRlPWN1c3RvbWxpc3QsRWRpdEZpbGVDb21wbGV0ZQoJCQlcIEVkaXRGaWxlIGVkaXQ8YmFuZz4gPGFyZ3M+CiAgICA6ZnVuIEVkaXRGaWxlQ29tcGxldGUoQSxMLFApCiAgICA6ICAgIHJldHVybiBzcGxpdChnbG9icGF0aCgmcGF0aCwgYTpBcmdMZWFkKSwgIlxuIikKICAgIDplbmRmdW4KPAoKUmFuZ2UgaGFuZGxpbmcJCQkJCQkqRTE3NyogKkUxNzgqCgpCeSBkZWZhdWx0LCB1c2VyLWRlZmluZWQgY29tbWFuZHMgZG8gbm90IGFjY2VwdCBhIGxpbmUgbnVtYmVyIHJhbmdlLiAgSG93ZXZlciwKaXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSB0aGF0IHRoZSBjb21tYW5kIGRvZXMgdGFrZSBhIHJhbmdlICh0aGUgLXJhbmdlCmF0dHJpYnV0ZSksIG9yIHRoYXQgaXQgdGFrZXMgYW4gYXJiaXRyYXJ5IGNvdW50IHZhbHVlLCBlaXRoZXIgaW4gdGhlIGxpbmUKbnVtYmVyIHBvc2l0aW9uICgtcmFuZ2U9TiwgbGlrZSB0aGUgfDpzcGxpdHwgY29tbWFuZCkgb3IgYXMgYSAiY291bnQiCmFyZ3VtZW50ICgtY291bnQ9TiwgbGlrZSB0aGUgfDpOZXh0fCBjb21tYW5kKS4gIFBvc3NpYmxlIGF0dHJpYnV0ZXMgYXJlOgoKCS1yYW5nZQkgICAgUmFuZ2UgYWxsb3dlZCwgZGVmYXVsdCBpcyBjdXJyZW50IGxpbmUKCS1yYW5nZT0lICAgIFJhbmdlIGFsbG93ZWQsIGRlZmF1bHQgaXMgd2hvbGUgZmlsZSAoMSwkKQoJLXJhbmdlPU4gICAgQSBjb3VudCAoZGVmYXVsdCBOKSB3aGljaCBpcyBzcGVjaWZpZWQgaW4gdGhlIGxpbmUKCQkgICAgbnVtYmVyIHBvc2l0aW9uIChsaWtlIHw6c3BsaXR8KQoJLWNvdW50PU4gICAgQSBjb3VudCAoZGVmYXVsdCBOKSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGluIHRoZSBsaW5lCgkJICAgIG51bWJlciBwb3NpdGlvbiwgb3IgYXMgYW4gaW5pdGlhbCBhcmd1bWVudCAobGlrZSB8Ok5leHR8KS4KCQkgICAgU3BlY2lmeWluZyAtY291bnQgKHdpdGhvdXQgYSBkZWZhdWx0KSBhY3RzIGxpa2UgLWNvdW50PTAKCk5vdGUgdGhhdCAtcmFuZ2U9TiBhbmQgLWNvdW50PU4gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAtIG9ubHkgb25lIHNob3VsZCBiZQpzcGVjaWZpZWQuCgpTcGVjaWFsIGNhc2VzCgpUaGVyZSBhcmUgc29tZSBzcGVjaWFsIGNhc2VzIGFzIHdlbGw6CgoJLWJhbmcJICAgIFRoZSBjb21tYW5kIGNhbiB0YWtlIGEgISBtb2RpZmllciAobGlrZSA6cSBvciA6dykKCS1iYXIJICAgIFRoZSBjb21tYW5kIGNhbiBiZSBmb2xsb3dlZCBieSBhICJ8IiBhbmQgYW5vdGhlciBjb21tYW5kLgoJCSAgICBBICJ8IiBpbnNpZGUgdGhlIGNvbW1hbmQgYXJndW1lbnQgaXMgbm90IGFsbG93ZWQgdGhlbi4KCQkgICAgQWxzbyBjaGVja3MgZm9yIGEgIiB0byBzdGFydCBhIGNvbW1lbnQuCgktcmVnaXN0ZXIgICBUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGNvbW1hbmQgY2FuIGJlIGFuIG9wdGlvbmFsCgkJICAgIHJlZ2lzdGVyIG5hbWUgKGxpa2UgOmRlbCwgOnB1dCwgOnlhbmspLgoJLWJ1ZmZlcgkgICAgVGhlIGNvbW1hbmQgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBidWZmZXIuCgpJbiB0aGUgY2FzZXMgb2YgdGhlIC1jb3VudCBhbmQgLXJlZ2lzdGVyIGF0dHJpYnV0ZXMsIGlmIHRoZSBvcHRpb25hbCBhcmd1bWVudAppcyBzdXBwbGllZCwgaXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBhcmd1bWVudCBsaXN0IGFuZCBpcyBhdmFpbGFibGUgdG8gdGhlCnJlcGxhY2VtZW50IHRleHQgc2VwYXJhdGVseS4KClJlcGxhY2VtZW50IHRleHQKClRoZSByZXBsYWNlbWVudCB0ZXh0IGZvciBhIHVzZXIgZGVmaW5lZCBjb21tYW5kIGlzIHNjYW5uZWQgZm9yIHNwZWNpYWwgZXNjYXBlCnNlcXVlbmNlcywgdXNpbmcgPC4uLj4gbm90YXRpb24uICBFc2NhcGUgc2VxdWVuY2VzIGFyZSByZXBsYWNlZCB3aXRoIHZhbHVlcwpmcm9tIHRoZSBlbnRlcmVkIGNvbW1hbmQgbGluZSwgYW5kIGFsbCBvdGhlciB0ZXh0IGlzIGNvcGllZCB1bmNoYW5nZWQuICBUaGUKcmVzdWx0aW5nIHN0cmluZyBpcyBleGVjdXRlZCBhcyBhbiBFeCBjb21tYW5kLiAgVG8gYXZvaWQgdGhlIHJlcGxhY2VtZW50IHVzZQo8bHQ+IGluIHBsYWRlIG9mIHRoZSBpbml0aWFsIDwuICBUaHVzIHRvIGluY2x1ZGUgIjxiYW5nPiIgbGl0ZXJhbGx5IHVzZQoiPGx0PmJhbmc+Ii4KClRoZSB2YWxpZCBlc2NhcGUgc2VxdWVuY2VzIGFyZQoKCQkJCQkJKjxsaW5lMT4qCgk8bGluZTE+CVRoZSBzdGFydGluZyBsaW5lIG9mIHRoZSBjb21tYW5kIHJhbmdlLgoJCQkJCQkqPGxpbmUyPioKCTxsaW5lMj4JVGhlIGZpbmFsIGxpbmUgb2YgdGhlIGNvbW1hbmQgcmFuZ2UuCgkJCQkJCSo8Y291bnQ+KgoJPGNvdW50PglBbnkgY291bnQgc3VwcGxpZWQgKGFzIGRlc2NyaWJlZCBmb3IgdGhlICctcmFuZ2UnCgkJYW5kICctY291bnQnIGF0dHJpYnV0ZXMpLgoJCQkJCQkqPGJhbmc+KgoJPGJhbmc+CShTZWUgdGhlICctYmFuZycgYXR0cmlidXRlKSBFeHBhbmRzIHRvIGEgISBpZiB0aGUKCQljb21tYW5kIHdhcyBleGVjdXRlZCB3aXRoIGEgISBtb2RpZmllciwgb3RoZXJ3aXNlCgkJZXhwYW5kcyB0byBub3RoaW5nLgoJCQkJCQkqPHJlZz4qICo8cmVnaXN0ZXI+KgoJPHJlZz4JKFNlZSB0aGUgJy1yZWdpc3RlcicgYXR0cmlidXRlKSBUaGUgb3B0aW9uYWwgcmVnaXN0ZXIsCgkJaWYgc3BlY2lmaWVkLiAgT3RoZXJ3aXNlLCBleHBhbmRzIHRvIG5vdGhpbmcuICA8cmVnaXN0ZXI+CgkJaXMgYSBzeW5vbnltIGZvciB0aGlzLgoJCQkJCQkqPGFyZ3M+KgoJPGFyZ3M+CVRoZSBjb21tYW5kIGFyZ3VtZW50cywgZXhhY3RseSBhcyBzdXBwbGllZCAoYnV0IGFzCgkJbm90ZWQgYWJvdmUsIGFueSBjb3VudCBvciByZWdpc3RlciBjYW4gY29uc3VtZSBzb21lCgkJb2YgdGhlIGFyZ3VtZW50cywgd2hpY2ggYXJlIHRoZW4gbm90IHBhcnQgb2YgPGFyZ3M+KS4KCTxsdD4JQSBzaW5nbGUgJzwnIChMZXNzLVRoYW4pIGNoYXJhY3Rlci4gIFRoaXMgaXMgbmVlZGVkIGlmIHlvdQoJCXdhbnQgdG8gZ2V0IGEgbGl0ZXJhbCBjb3B5IG9mIG9uZSBvZiB0aGVzZSBlc2NhcGUgc2VxdWVuY2VzCgkJaW50byB0aGUgZXhwYW5zaW9uIC0gZm9yIGV4YW1wbGUsIHRvIGdldCA8YmFuZz4sIHVzZQoJCTxsdD5iYW5nPi4KCgkJCQkJCQkqPHEtYXJncz4qCklmIHRoZSBmaXJzdCB0d28gY2hhcmFjdGVycyBvZiBhbiBlc2NhcGUgc2VxdWVuY2UgYXJlICJxLSIgKGZvciBleGFtcGxlLAo8cS1hcmdzPikgdGhlbiB0aGUgdmFsdWUgaXMgcXVvdGVkIGluIHN1Y2ggYSB3YXkgYXMgdG8gbWFrZSBpdCBhIHZhbGlkIHZhbHVlCmZvciB1c2UgaW4gYW4gZXhwcmVzc2lvbi4gIFRoaXMgdXNlcyB0aGUgYXJndW1lbnQgYXMgb25lIHNpbmdsZSB2YWx1ZS4KV2hlbiB0aGVyZSBpcyBubyBhcmd1bWVudCA8cS1hcmdzPiBpcyBhbiBlbXB0eSBzdHJpbmcuCgpUbyBhbGxvdyBjb21tYW5kcyB0byBwYXNzIHRoZWlyIGFyZ3VtZW50cyBvbiB0byBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiwgdGhlcmUKaXMgYSBzcGVjaWFsIGZvcm0gPGYtYXJncz4gKCJmdW5jdGlvbiBhcmdzIikuICBUaGlzIHNwbGl0cyB0aGUgY29tbWFuZAphcmd1bWVudHMgYXQgc3BhY2VzIGFuZCBUYWJzLCBxdW90ZXMgZWFjaCBhcmd1bWVudCBpbmRpdmlkdWFsbHksIGFuZCB0aGUKPGYtYXJncz4gc2VxdWVuY2UgaXMgcmVwbGFjZWQgYnkgdGhlIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHF1b3RlZCBhcmd1bWVudHMuClNlZSB0aGUgTXljbWQgZXhhbXBsZSBiZWxvdy4gIElmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4gPGYtYXJncz4gaXMgcmVtb3ZlZC4gCgpFeGFtcGxlcyA+CgogICAiIERlbGV0ZSBldmVyeXRoaW5nIGFmdGVyIGhlcmUgdG8gdGhlIGVuZAogICA6Y29tIERkZWwgKywkZAoKICAgIiBSZW5hbWUgdGhlIGN1cnJlbnQgYnVmZmVyCiAgIDpjb20gLW5hcmdzPTEgLWJhbmcgLWNvbXBsZXRlPWZpbGUgUmVuIGYgPGFyZ3M+fHc8YmFuZz4KCiAgICIgUmVwbGFjZSBhIHJhbmdlIHdpdGggdGhlIGNvbnRlbnRzIG9mIGEgZmlsZQogICAiIChFbnRlciB0aGlzIGFsbCBhcyBvbmUgbGluZSkKICAgOmNvbSAtcmFuZ2UgLW5hcmdzPTEgLWNvbXBsZXRlPWZpbGUKCSBSZXBsYWNlIDxsaW5lMT4tcHVffDxsaW5lMT4sPGxpbmUyPmR8ciA8YXJncz58PGxpbmUxPmQKCiAgICIgQ291bnQgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgcmFuZ2UKICAgOmNvbSEgLXJhbmdlIC1uYXJncz0wIExpbmVzICBlY2hvIDxsaW5lMj4gLSA8bGluZTE+ICsgMSAibGluZXMiCgogICAiIENhbGwgYSB1c2VyIGZ1bmN0aW9uIChleGFtcGxlIG9mIDxmLWFyZ3M+KQogICA6Y29tIC1uYXJncz0qIE15Y21kIGNhbGwgTXlmdW5jKDxmLWFyZ3M+KQoKV2hlbiBleGVjdXRlZCBhczogPgoJOk15Y21kIGFyZzEgYXJnMgpUaGlzIHdpbGwgaW52b2tlOiA+Cgk6Y2FsbCBNeWZ1bmMoImFyZzEiLCJhcmcyIikKCiAgIDoiIEEgbW9yZSBzdWJzdGFudGlhbCBleGFtcGxlCiAgIDpmdW5jdGlvbiBBbGxhcmdzKGNvbW1hbmQpCiAgIDoJbGV0IGkgPSAwCiAgIDoJd2hpbGUgaSA8IGFyZ2MoKQogICA6CSAgIGlmIGZpbGVyZWFkYWJsZShhcmd2KGkpKQogICA6CSAgICBleGVjdXRlICJlICIgLiBhcmd2KGkpCiAgIDoJICAgICBleGVjdXRlIGE6Y29tbWFuZAogICA6ICAgICAgZW5kaWYKICAgOiAgICAgIGxldCBpID0gaSArIDEKICAgOiAgIGVuZHdoaWxlCiAgIDplbmRmdW5jdGlvbgogICA6Y29tbWFuZCAtbmFyZ3M9KyAtY29tcGxldGU9Y29tbWFuZCBBbGxhcmdzIGNhbGwgQWxsYXJncyg8cS1hcmdzPikKClRoZSBjb21tYW5kIEFsbGFyZ3MgdGFrZXMgYW55IFZpbSBjb21tYW5kKHMpIGFzIGFyZ3VtZW50IGFuZCBleGVjdXRlcyBpdCBvbiBhbGwKZmlsZXMgaW4gdGhlIGFyZ3VtZW50IGxpc3QuICBVc2FnZSBleGFtcGxlIChub3RlIHVzZSBvZiB0aGUgImUiIGZsYWcgdG8gaWdub3JlCmVycm9ycyBhbmQgdGhlICJ1cGRhdGUiIGNvbW1hbmQgdG8gd3JpdGUgbW9kaWZpZWQgYnVmZmVycyk6ID4KCTpBbGxhcmdzICVzL2Zvby9iYXIvZ2V8dXBkYXRlClRoaXMgd2lsbCBpbnZva2U6ID4KCTpjYWxsIEFsbGFyZ3MoIiVzL2Zvby9iYXIvZ2V8dXBkYXRlIikKPApXaGVuIGRlZmluaW5nIGFuIHVzZXIgY29tbWFuZCBpbiBhIHNjcmlwdCwgaXQgd2lsbCBiZSBhYmxlIHRvIGNhbGwgZnVuY3Rpb25zCmxvY2FsIHRvIHRoZSBzY3JpcHQgYW5kIHVzZSBtYXBwaW5ncyBsb2NhbCB0byB0aGUgc2NyaXB0LiAgV2hlbiB0aGUgdXNlcgppbnZva2VzIHRoZSB1c2VyIGNvbW1hbmQsIGl0IHdpbGwgcnVuIGluIHRoZSBjb250ZXh0IG9mIHRoZSBzY3JpcHQgaXQgd2FzCmRlZmluZWQgaW4uICBUaGlzIG1hdHRlcnMgaWYgfDxTSUQ+fCBpcyB1c2VkIGluIGEgY29tbWFuZC4KCiB2aW06dHc9Nzg6dHM9ODpmdD1oZWxwOm5vcmw6Cg==