LyoKICogTm90ZXBhZAogKiBQb3J0dWd1ZXNlIExhbmd1YWdlIFN1cHBvcnQKICoKICogQ29weXJpZ2h0IDE5OTkgTWFyY2VsIEJhdXIgPGFsdmVzQGNvcnJlaW9uZXQuY29tLmJyPgogKiBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICogQ29weXJpZ2h0IDIwMDMgTWFyY2VsbyBEdWFydGUKICogQ29weXJpZ2h0IDIwMDQgQW3pcmljbyBKb3PpIE1lbG8KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0VfQlJBWklMSUFOCgpNQUlOX01FTlUgTUVOVQp7CiBQT1BVUCAiJkFycXVpdm8iIHsKICBNRU5VSVRFTSAiJk5vdm9cdEN0cmwrTiIsCQlDTURfTkVXCiAgTUVOVUlURU0gIkEmYnJpci4uLlx0Q3RybCtPIiwJCUNNRF9PUEVOCiAgTUVOVUlURU0gIiZTYWx2YXJcdEN0cmwrUyIsCQlDTURfU0FWRQogIE1FTlVJVEVNICJTYWx2YXIgJmNvbW8uLi4iLAlDTURfU0FWRV9BUwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImSW1wcmltaXIuLi5cdEN0cmwrUCIsCQlDTURfUFJJTlQKICBNRU5VSVRFTSAiQyZvbmZpZ3VyYXIgcOFnaW5hLi4uIiwJQ01EX1BBR0VfU0VUVVAKICBNRU5VSVRFTSAiQ29uZmlndXJhciBpJm1wcmVzc29yYS4uLiIsIENNRF9QUklOVEVSX1NFVFVQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlNhaSZyIiwJCUNNRF9FWElUCiB9ClBPUFVQICImRWRpdGFyIiB7CiAgTUVOVUlURU0gIiZEZXNmYXplclx0Q3RybCtaIiwgQ01EX1VORE8KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlJlY29ydGFyXHRDdHJsK1giLAlDTURfQ1VUCiAgTUVOVUlURU0gIiZDb3BpYXJcdEN0cmwrQyIsCUNNRF9DT1BZCiAgTUVOVUlURU0gIkMmb2xhclx0Q3RybCtWIiwJQ01EX1BBU1RFCiAgTUVOVUlURU0gIkUmeGNsdWlyXHREZWwiLAlDTURfREVMRVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlNlbGVjaW9uYXIgJnR1ZG8iLAlDTURfU0VMRUNUX0FMTAogIE1FTlVJVEVNICImRGF0YS9Ib3JhXHRGNSIsCUNNRF9USU1FX0RBVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlF1ZWJyYXIgYXV0b23hdGljYSBkZSBsaW5oYSIsCUNNRF9XUkFQCiAgTUVOVUlURU0gIiZGb250ZS4uLiIsICAgICAgICAgIENNRF9GT05UCiB9ClBPUFVQICImUGVzcXVpc2EiIHsKICBNRU5VSVRFTSAiJkxvY2FsaXphci4uLiIsCUNNRF9TRUFSQ0gKICBNRU5VSVRFTSAiTG9jYWxpemFyICZwcvN4aW1hXHRGMyIsCUNNRF9TRUFSQ0hfTkVYVAogfQpQT1BVUCAiJkFqdWRhIiB7CiAgTUVOVUlURU0gIiZDb250ZfpkbyIsCQlDTURfSEVMUF9DT05URU5UUwogIE1FTlVJVEVNICImUHJvY3VyYXIuLi4iLAlDTURfSEVMUF9TRUFSQ0gKICBNRU5VSVRFTSAiJkFqdWRhIG5hIGFqdWRhIiwJQ01EX0hFTFBfT05fSEVMUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIFBPUFVQICImSW5mb3JtYef1ZXMiIHsKICAgTUVOVUlURU0gIiZMaWNlbudhLi4uIiwJQ01EX0xJQ0VOU0UKICAgTUVOVUlURU0gIiZTRU0gR0FSQU5USUEuLi4iLAlDTURfTk9fV0FSUkFOVFkKICAgTUVOVUlURU0gIiZTb2JyZSBvIFdpbmUuLi4iLAlDTURfQUJPVVRfV0lORQogIH0KIH0KfQoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0UKCk1BSU5fTUVOVSBNRU5VCnsKIFBPUFVQICImRmljaGVpcm8iIHsKICBNRU5VSVRFTSAiJk5vdm8uLi4iLAkJQ01EX05FVwogIE1FTlVJVEVNICJBJmJyaXIiLAkJQ01EX09QRU4KICBNRU5VSVRFTSAiJkdyYXZhciIsCQlDTURfU0FWRQogIE1FTlVJVEVNICJHcmF2YXIgJmNvbW8uLi4iLAlDTURfU0FWRV9BUwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImSW1wcmltaXIiLAkJQ01EX1BSSU5UCiAgTUVOVUlURU0gIkMmb25maWd1cmFyIHDhZ2luYS4uLiIsCUNNRF9QQUdFX1NFVFVQCiAgTUVOVUlURU0gIkNvbmZpZ3VyYXIgaSZtcHJlc3NvcmEuLi4iLCBDTURfUFJJTlRFUl9TRVRVUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJTYWkmciIsCQlDTURfRVhJVAogfQpQT1BVUCAiJkVkaXRhciIgewogIE1FTlVJVEVNICImRGVzZmF6ZXJcdEN0cmwrWiIsIENNRF9VTkRPCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZDb3J0YXJcdEN0cmwrWCIsCUNNRF9DVVQKICBNRU5VSVRFTSAiJkNvcGlhclx0Q3RybCtDIiwJQ01EX0NPUFkKICBNRU5VSVRFTSAiQyZvbGFyXHRDdHJsK1YiLAlDTURfUEFTVEUKICBNRU5VSVRFTSAiRSZ4Y2x1aXJcdERlbCIsCUNNRF9ERUxFVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiU2VsZWNjaW9uYXIgJnR1ZG8iLAlDTURfU0VMRUNUX0FMTAogIE1FTlVJVEVNICImRGF0YS9Ib3JhXHRGNSIsCUNNRF9USU1FX0RBVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlF1ZWJyYXIgYXV0b23hdGljYSBkZSBsaW5oYSIsCUNNRF9XUkFQCiAgTUVOVUlURU0gIiZUaXBvIGRlIExldHJhLi4uIiwgICAgICAgICAgQ01EX0ZPTlQKIH0KUE9QVVAgIiZQZXNxdWlzYSIgewogIE1FTlVJVEVNICImTG9jYWxpemFyLi4uIiwJQ01EX1NFQVJDSAogIE1FTlVJVEVNICJMb2NhbGl6YXIgJnBy83hpbWFcdEYzIiwJQ01EX1NFQVJDSF9ORVhUCiB9ClBPUFVQICImQWp1ZGEiIHsKICBNRU5VSVRFTSAiJkNvbnRl+mRvIiwJCUNNRF9IRUxQX0NPTlRFTlRTCiAgTUVOVUlURU0gIiZQcm9jdXJhci4uLiIsCUNNRF9IRUxQX1NFQVJDSAogIE1FTlVJVEVNICImQWp1ZGEgbmEgYWp1ZGEiLAlDTURfSEVMUF9PTl9IRUxQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgUE9QVVAgIiZJbmZvcm1h5/Vlcy4uLiIgewogICBNRU5VSVRFTSAiJkxpY2Vu52EiLAkJQ01EX0xJQ0VOU0UKICAgTUVOVUlURU0gIiZTRU0gR0FSQU5USUEiLAlDTURfTk9fV0FSUkFOVFkKICAgTUVOVUlURU0gIiZBY2VyY2EgZG8gV2luZSIsCUNNRF9BQk9VVF9XSU5FCiAgfQogfQp9CgoKLyogRGlhbG9nIGBQYWdlIHNldHVwJyAqLwoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX05FVVRSQUwKCkRJQUxPR19QQUdFU0VUVVAgRElBTE9HIDAsIDAsIDIyNSwgOTUKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAiQ29uZmlndXJhciBw4WdpbmEiCnsKTFRFWFQgICAgIiZDYWJl52FsaG8gKG1tKToiLCAgMHgxNDAsICAxMCwgMDcsIDQwLCAxNQpFRElUVEVYVCBJRENfUEFHRVNFVFVQX0hFQURFUlZBTFVFLCAgIDYwLCAwNSwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImUm9kYXDpOiIsICAweDE0MiwgICAxMCwgMjQsIDQwLCAxNQpFRElUVEVYVCBJRENfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLCAgIDYwLCAyMiwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpHUk9VUEJPWCAiJk1hcmdlbnM6IiwgICAgICAweDE0NCwgICAgIDEwLCA0MywxNjAsIDQ1CkxURVhUICAgICImRXNxdWVyZGE6IiwgICAgICAgIDB4MTQ1LCAgIDIwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX0xFRlRWQUxVRSwgICAgIDUwLCA1NSwgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZTdXBlcmlvcjoiLCAgICAgICAgIDB4MTQ4LCAgICAyMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9UT1BWQUxVRSwgICAgICA1MCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImRGlyZWl0YToiLCAgICAgICAweDE0QiwgMTAwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX1JJR0hUVkFMVUUsICAgMTMwLCA1NSwgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZJbmZlcmlvcjoiLCAgICAgIDB4MTRFLDEwMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwgIDEzMCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpERUZQVVNIQlVUVE9OICJPSyIsICAgICAgICAgSURPSywgICAgICAgICAgICAgICAgICAgMTgwLCAgMywgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIkNhbmNlbGFyIiwgICAgIElEQ0FOQ0VMLCAgICAgICAgICAgICAgIDE4MCwgMjEsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICImQWp1ZGEiLCAgICAgICBJREhFTFAsICAgICAgICAgICAgICAgIDE4MCwgMzksIDQwLCAxNSwgV1NfVEFCU1RPUAp9CgoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0VfQlJBWklMSUFOCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7ClNUUklOR19QQUdFU0VUVVBfSEVBREVSVkFMVUUsCSImZiIKU1RSSU5HX1BBR0VTRVRVUF9GT09URVJWQUxVRSwJIlDhZ2luYSAmcCIKClNUUklOR19OT1RFUEFELAkJCQkJIk5vdGVwYWQiClNUUklOR19FUlJPUiwJCQkJCSJFUlJPIgpTVFJJTkdfV0FSTklORywJCQkJCSJBVklTTyIKU1RSSU5HX0lORk8sCQkJCQkiSW5mb3JtYefjbyIKClNUUklOR19VTlRJVExFRCwJCQkJIihzZW0gbm9tZSkiCgpTVFJJTkdfQUxMX0ZJTEVTLAkJCQkiVG9kb3Mgb3MgYXJxdWl2b3MgKCouKikiClNUUklOR19URVhUX0ZJTEVTX1RYVCwJCQkiQXJxdWl2b3MgdGV4dG8gKCoudHh0KSIKClNUUklOR19UT09MQVJHRSwJCQkJIkFycXVpdm8gJyVzJyDpIG11aXRvIGxvbmdvIHBhcmEgbyBub3RlcGFkLlxuIFwKUG9yIGZhdm9yIHVzZSB1bSBlZGl0b3IgZGlmZXJlbnRlLiIKU1RSSU5HX05PVEVYVCwJCQkJCSJWb2PqIG7jbyBkaWdpdG91IG5lbmh1bSB0ZXh0by4gXApcblBvciBmYXZvciBkaWdpdGUgYWxndW1hIGNvaXNhIGUgdGVudGUgbm92YW1lbnRlIgpTVFJJTkdfRE9FU05PVEVYSVNULAkJCQkiQXJxdWl2byAnJXMnXG5u428gZXhpc3RlXG5cbiBcClZvY+ogZGVzZWphIGNyaWFyIHVtIG5vdm8gYXJxdWl2bz8iClNUUklOR19OT1RTQVZFRCwJCQkJIkFycXVpdm8gJyVzJ1xuZm9pIG1vZGlmaWNhZG9cblxuIFwKR29zdGFyaWEgZGUgc2FsdmFyIGFzIGFsdGVyYefVZXM/IgpTVFJJTkdfTk9URk9VTkQsCQkJCQkiJyVzJyBu428gcG9kZSBzZXIgZW5jb250cmFkby4iClNUUklOR19PVVRfT0ZfTUVNT1JZLAkJCSJO428gaOEgbWVt83JpYSBzdWZpY2llbnRlIHBhcmEgY29tcGxldGFyIGVzc2EgXAp0YXJlZmEuIFxuRmVjaGUgdW1hIG91IG1haXMgYXBsaWNh5/VlcyBwYXJhIGF1bWVudGFyIGEgcXVhbnRpZGFkZSBkZSBtZW3zcmlhIGxpdnJlLiIKfQoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0UKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKIFNUUklOR19QQUdFU0VUVVBfSEVBREVSVkFMVUUsCSImZiIKIFNUUklOR19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsCSJQ4WdpbmEgJnAiCgogU1RSSU5HX05PVEVQQUQsCQkiTm90ZXBhZCIKIFNUUklOR19FUlJPUiwJCQkiRVJSTyIKIFNUUklOR19XQVJOSU5HLAkJIkFWSVNPIgogU1RSSU5HX0lORk8sCQkJIkluZm9ybWHn428iCgogU1RSSU5HX1VOVElUTEVELAkJIihzZW0gbm9tZSkiCgogU1RSSU5HX0FMTF9GSUxFUywJCSJUb2RvcyBvcyBhcnF1aXZvcyAoKi4qKSIKIFNUUklOR19URVhUX0ZJTEVTX1RYVCwJCSJGaWNoZWlyb3MgZGUgdGV4dG8gKCoudHh0KSIKCiBTVFJJTkdfVE9PTEFSR0UsCQkiRmljaGVpcm9zICclcycg6SBtdWl0byBsb25nbyBwYXJhIG8gbm90ZXBhZC5cbiBcCiBQb3IgZmF2b3IgdXNlIHVtIGVkaXRvciBkaWZlcmVudGUuIgogU1RSSU5HX05PVEVYVCwJCQkiTuNvIGRpZ2l0b3UgbmVuaHVtIHRleHRvLiBcCiBcblBvciBmYXZvciBkaWdpdGUgYWxndW1hIGNvaXNhIGUgdGVudGUgbm92YW1lbnRlIgogU1RSSU5HX0RPRVNOT1RFWElTVCwJCSJGaWNoZWlybyAnJXMnXG5u428gZXhpc3RlXG5cbiBcCkRlc2VqYSBjcmlhciB1bSBub3ZvIGZpY2hlaXJvPyIKIFNUUklOR19OT1RTQVZFRCwJCSJGaWNoZWlybyAnJXMnXG5mb2kgbW9kaWZpY2Fkb1xuXG4gXApHb3N0YXJpYSBkZSBncmF2YXIgYXMgYWx0ZXJh59Vlcz8iCiBTVFJJTkdfTk9URk9VTkQsCQkiJyVzJyBu428gcG9kZSBzZXIgZW5jb250cmFkby4iCiBTVFJJTkdfT1VUX09GX01FTU9SWSwJCSJO428gaOEgbWVt83JpYSBzdWZpY2llbnRlIHBhcmEgY29tcGxldGFyIGVzdGEgXAp0YXJlZmEuIFxuRmVjaGUgdW1hIG91IG1haXMgYXBsaWNh5/VlcyBwYXJhIGF1bWVudGFyIGEgcXVhbnRpZGFkZSBkZSBtZW3zcmlhIGxpdnJlLiIKfQo=