LyoKICogTm90ZXBhZAogKiBQb3J0dWd1ZXNlIExhbmd1YWdlIFN1cHBvcnQKICoKICogQ29weXJpZ2h0IDE5OTkgTWFyY2VsIEJhdXIgPGFsdmVzQGNvcnJlaW9uZXQuY29tLmJyPgogKiBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICogQ29weXJpZ2h0IDIwMDMgTWFyY2VsbyBEdWFydGUKICogQ29weXJpZ2h0IDIwMDQgQW3pcmljbyBKb3PpIE1lbG8KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0VfQlJBWklMSUFOCgpNQUlOX01FTlUgTUVOVQp7CiBQT1BVUCAiJkFycXVpdm8iIHsKICBNRU5VSVRFTSAiJk5vdm9cdEN0cmwrTiIsCQlDTURfTkVXCiAgTUVOVUlURU0gIkEmYnJpci4uLlx0Q3RybCtPIiwJCUNNRF9PUEVOCiAgTUVOVUlURU0gIiZTYWx2YXJcdEN0cmwrUyIsCQlDTURfU0FWRQogIE1FTlVJVEVNICJTYWx2YXIgJmNvbW8uLi4iLAlDTURfU0FWRV9BUwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImSW1wcmltaXIuLi5cdEN0cmwrUCIsCQlDTURfUFJJTlQKICBNRU5VSVRFTSAiQyZvbmZpZ3VyYXIgcOFnaW5hLi4uIiwJQ01EX1BBR0VfU0VUVVAKICBNRU5VSVRFTSAiQ29uZmlndXJhciBpJm1wcmVzc29yYS4uLiIsIENNRF9QUklOVEVSX1NFVFVQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlNhaSZyIiwJCUNNRF9FWElUCiB9ClBPUFVQICImRWRpdGFyIiB7CiAgTUVOVUlURU0gIiZEZXNmYXplclx0Q3RybCtaIiwgQ01EX1VORE8KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlJlY29ydGFyXHRDdHJsK1giLAlDTURfQ1VUCiAgTUVOVUlURU0gIiZDb3BpYXJcdEN0cmwrQyIsCUNNRF9DT1BZCiAgTUVOVUlURU0gIkMmb2xhclx0Q3RybCtWIiwJQ01EX1BBU1RFCiAgTUVOVUlURU0gIkUmeGNsdWlyXHREZWwiLAlDTURfREVMRVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlNlbGVjaW9uYXIgJnR1ZG8iLAlDTURfU0VMRUNUX0FMTAogIE1FTlVJVEVNICImRGF0YS9Ib3JhXHRGNSIsCUNNRF9USU1FX0RBVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlF1ZWJyYXIgYXV0b23hdGljYSBkZSBsaW5oYSIsCUNNRF9XUkFQCiAgTUVOVUlURU0gIiZGb250ZS4uLiIsICAgICAgICAgIENNRF9GT05UCiB9ClBPUFVQICImUGVzcXVpc2EiIHsKICBNRU5VSVRFTSAiJkxvY2FsaXphci4uLiIsCUNNRF9TRUFSQ0gKICBNRU5VSVRFTSAiTG9jYWxpemFyICZwcvN4aW1hXHRGMyIsCUNNRF9TRUFSQ0hfTkVYVAogfQpQT1BVUCAiJkFqdWRhIiB7CiAgTUVOVUlURU0gIiZDb250ZfpkbyIsCQlDTURfSEVMUF9DT05URU5UUwogIE1FTlVJVEVNICImUHJvY3VyYXIuLi4iLAlDTURfSEVMUF9TRUFSQ0gKICBNRU5VSVRFTSAiJkFqdWRhIG5hIGFqdWRhIiwJQ01EX0hFTFBfT05fSEVMUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImQWJvdXQgTm90ZXBhZCIsIENNRF9IRUxQX0FCT1VUX05PVEVQQUQKIH0KfQoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0UKCk1BSU5fTUVOVSBNRU5VCnsKIFBPUFVQICImRmljaGVpcm8iIHsKICBNRU5VSVRFTSAiJk5vdm8uLi4iLAkJQ01EX05FVwogIE1FTlVJVEVNICJBJmJyaXIiLAkJQ01EX09QRU4KICBNRU5VSVRFTSAiJkdyYXZhciIsCQlDTURfU0FWRQogIE1FTlVJVEVNICJHcmF2YXIgJmNvbW8uLi4iLAlDTURfU0FWRV9BUwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImSW1wcmltaXIiLAkJQ01EX1BSSU5UCiAgTUVOVUlURU0gIkMmb25maWd1cmFyIHDhZ2luYS4uLiIsCUNNRF9QQUdFX1NFVFVQCiAgTUVOVUlURU0gIkNvbmZpZ3VyYXIgaSZtcHJlc3NvcmEuLi4iLCBDTURfUFJJTlRFUl9TRVRVUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJTYWkmciIsCQlDTURfRVhJVAogfQpQT1BVUCAiJkVkaXRhciIgewogIE1FTlVJVEVNICImRGVzZmF6ZXJcdEN0cmwrWiIsIENNRF9VTkRPCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZDb3J0YXJcdEN0cmwrWCIsCUNNRF9DVVQKICBNRU5VSVRFTSAiJkNvcGlhclx0Q3RybCtDIiwJQ01EX0NPUFkKICBNRU5VSVRFTSAiQyZvbGFyXHRDdHJsK1YiLAlDTURfUEFTVEUKICBNRU5VSVRFTSAiRSZ4Y2x1aXJcdERlbCIsCUNNRF9ERUxFVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiU2VsZWNjaW9uYXIgJnR1ZG8iLAlDTURfU0VMRUNUX0FMTAogIE1FTlVJVEVNICImRGF0YS9Ib3JhXHRGNSIsCUNNRF9USU1FX0RBVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlF1ZWJyYXIgYXV0b23hdGljYSBkZSBsaW5oYSIsCUNNRF9XUkFQCiAgTUVOVUlURU0gIiZUaXBvIGRlIExldHJhLi4uIiwgICAgICAgICAgQ01EX0ZPTlQKIH0KUE9QVVAgIiZQZXNxdWlzYSIgewogIE1FTlVJVEVNICImTG9jYWxpemFyLi4uIiwJQ01EX1NFQVJDSAogIE1FTlVJVEVNICJMb2NhbGl6YXIgJnBy83hpbWFcdEYzIiwJQ01EX1NFQVJDSF9ORVhUCiB9ClBPUFVQICImQWp1ZGEiIHsKICBNRU5VSVRFTSAiJkNvbnRl+mRvIiwJCUNNRF9IRUxQX0NPTlRFTlRTCiAgTUVOVUlURU0gIiZQcm9jdXJhci4uLiIsCUNNRF9IRUxQX1NFQVJDSAogIE1FTlVJVEVNICImQWp1ZGEgbmEgYWp1ZGEiLAlDTURfSEVMUF9PTl9IRUxQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZBYm91dCBOb3RlcGFkLi4uIiwgQ01EX0hFTFBfQUJPVVRfTk9URVBBRAogfQp9CgoKLyogRGlhbG9nIGBQYWdlIHNldHVwJyAqLwoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX05FVVRSQUwKCkRJQUxPR19QQUdFU0VUVVAgRElBTE9HIDAsIDAsIDIyNSwgOTUKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAiQ29uZmlndXJhciBw4WdpbmEiCnsKTFRFWFQgICAgIiZDYWJl52FsaG8gKG1tKToiLCAgMHgxNDAsICAxMCwgMDcsIDQwLCAxNQpFRElUVEVYVCBJRENfUEFHRVNFVFVQX0hFQURFUlZBTFVFLCAgIDYwLCAwNSwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImUm9kYXDpOiIsICAweDE0MiwgICAxMCwgMjQsIDQwLCAxNQpFRElUVEVYVCBJRENfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLCAgIDYwLCAyMiwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpHUk9VUEJPWCAiJk1hcmdlbnM6IiwgICAgICAweDE0NCwgICAgIDEwLCA0MywxNjAsIDQ1CkxURVhUICAgICImRXNxdWVyZGE6IiwgICAgICAgIDB4MTQ1LCAgIDIwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX0xFRlRWQUxVRSwgICAgIDUwLCA1NSwgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZTdXBlcmlvcjoiLCAgICAgICAgIDB4MTQ4LCAgICAyMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9UT1BWQUxVRSwgICAgICA1MCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImRGlyZWl0YToiLCAgICAgICAweDE0QiwgMTAwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX1JJR0hUVkFMVUUsICAgMTMwLCA1NSwgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZJbmZlcmlvcjoiLCAgICAgIDB4MTRFLDEwMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwgIDEzMCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpERUZQVVNIQlVUVE9OICJPSyIsICAgICAgICAgSURPSywgICAgICAgICAgICAgICAgICAgMTgwLCAgMywgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIkNhbmNlbGFyIiwgICAgIElEQ0FOQ0VMLCAgICAgICAgICAgICAgIDE4MCwgMjEsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICImQWp1ZGEiLCAgICAgICBJREhFTFAsICAgICAgICAgICAgICAgIDE4MCwgMzksIDQwLCAxNSwgV1NfVEFCU1RPUAp9CgoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0VfQlJBWklMSUFOCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7ClNUUklOR19QQUdFU0VUVVBfSEVBREVSVkFMVUUsCSImZiIKU1RSSU5HX1BBR0VTRVRVUF9GT09URVJWQUxVRSwJIlDhZ2luYSAmcCIKClNUUklOR19OT1RFUEFELAkJCQkJIk5vdGVwYWQiClNUUklOR19FUlJPUiwJCQkJCSJFUlJPIgpTVFJJTkdfV0FSTklORywJCQkJCSJBVklTTyIKU1RSSU5HX0lORk8sCQkJCQkiSW5mb3JtYefjbyIKClNUUklOR19VTlRJVExFRCwJCQkJIihzZW0gbm9tZSkiCgpTVFJJTkdfQUxMX0ZJTEVTLAkJCQkiVG9kb3Mgb3MgYXJxdWl2b3MgKCouKikiClNUUklOR19URVhUX0ZJTEVTX1RYVCwJCQkiQXJxdWl2b3MgdGV4dG8gKCoudHh0KSIKClNUUklOR19UT09MQVJHRSwJCQkJIkFycXVpdm8gJyVzJyDpIG11aXRvIGxvbmdvIHBhcmEgbyBub3RlcGFkLlxuIFwKUG9yIGZhdm9yIHVzZSB1bSBlZGl0b3IgZGlmZXJlbnRlLiIKU1RSSU5HX05PVEVYVCwJCQkJCSJWb2PqIG7jbyBkaWdpdG91IG5lbmh1bSB0ZXh0by4gXApcblBvciBmYXZvciBkaWdpdGUgYWxndW1hIGNvaXNhIGUgdGVudGUgbm92YW1lbnRlIgpTVFJJTkdfRE9FU05PVEVYSVNULAkJCQkiQXJxdWl2byAnJXMnXG5u428gZXhpc3RlXG5cbiBcClZvY+ogZGVzZWphIGNyaWFyIHVtIG5vdm8gYXJxdWl2bz8iClNUUklOR19OT1RTQVZFRCwJCQkJIkFycXVpdm8gJyVzJ1xuZm9pIG1vZGlmaWNhZG9cblxuIFwKR29zdGFyaWEgZGUgc2FsdmFyIGFzIGFsdGVyYefVZXM/IgpTVFJJTkdfTk9URk9VTkQsCQkJCQkiJyVzJyBu428gcG9kZSBzZXIgZW5jb250cmFkby4iClNUUklOR19PVVRfT0ZfTUVNT1JZLAkJCSJO428gaOEgbWVt83JpYSBzdWZpY2llbnRlIHBhcmEgY29tcGxldGFyIGVzc2EgXAp0YXJlZmEuXG5GZWNoZSB1bWEgb3UgbWFpcyBhcGxpY2Hn9WVzIHBhcmEgYXVtZW50YXIgYSBxdWFudGlkYWRlIGRlIG1lbfNyaWEgbGl2cmUuIgp9CgpMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfUE9SVFVHVUVTRQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogU1RSSU5HX1BBR0VTRVRVUF9IRUFERVJWQUxVRSwJIiZmIgogU1RSSU5HX1BBR0VTRVRVUF9GT09URVJWQUxVRSwJIlDhZ2luYSAmcCIKCiBTVFJJTkdfTk9URVBBRCwJCSJOb3RlcGFkIgogU1RSSU5HX0VSUk9SLAkJCSJFUlJPIgogU1RSSU5HX1dBUk5JTkcsCQkiQVZJU08iCiBTVFJJTkdfSU5GTywJCQkiSW5mb3JtYefjbyIKCiBTVFJJTkdfVU5USVRMRUQsCQkiKHNlbSBub21lKSIKCiBTVFJJTkdfQUxMX0ZJTEVTLAkJIlRvZG9zIG9zIGFycXVpdm9zICgqLiopIgogU1RSSU5HX1RFWFRfRklMRVNfVFhULAkJIkZpY2hlaXJvcyBkZSB0ZXh0byAoKi50eHQpIgoKIFNUUklOR19UT09MQVJHRSwJCSJGaWNoZWlyb3MgJyVzJyDpIG11aXRvIGxvbmdvIHBhcmEgbyBub3RlcGFkLlxuIFwKIFBvciBmYXZvciB1c2UgdW0gZWRpdG9yIGRpZmVyZW50ZS4iCiBTVFJJTkdfTk9URVhULAkJCSJO428gZGlnaXRvdSBuZW5odW0gdGV4dG8uIFwKXG5Qb3IgZmF2b3IgZGlnaXRlIGFsZ3VtYSBjb2lzYSBlIHRlbnRlIG5vdmFtZW50ZSIKIFNUUklOR19ET0VTTk9URVhJU1QsCQkiRmljaGVpcm8gJyVzJ1xubuNvIGV4aXN0ZVxuXG4gXApEZXNlamEgY3JpYXIgdW0gbm92byBmaWNoZWlybz8iCiBTVFJJTkdfTk9UU0FWRUQsCQkiRmljaGVpcm8gJyVzJ1xuZm9pIG1vZGlmaWNhZG9cblxuIFwKR29zdGFyaWEgZGUgZ3JhdmFyIGFzIGFsdGVyYefVZXM/IgogU1RSSU5HX05PVEZPVU5ELAkJIiclcycgbuNvIHBvZGUgc2VyIGVuY29udHJhZG8uIgogU1RSSU5HX09VVF9PRl9NRU1PUlksCQkiTuNvIGjhIG1lbfNyaWEgc3VmaWNpZW50ZSBwYXJhIGNvbXBsZXRhciBlc3RhIFwKdGFyZWZhLlxuRmVjaGUgdW1hIG91IG1haXMgYXBsaWNh5/VlcyBwYXJhIGF1bWVudGFyIGEgcXVhbnRpZGFkZSBkZSBtZW3zcmlhIGxpdnJlLiIKfQo=