LyoKICogTm90ZXBhZAogKiBQb3J0dWd1ZXNlIExhbmd1YWdlIFN1cHBvcnQKICoKICogQ29weXJpZ2h0IDE5OTkgTWFyY2VsIEJhdXIgPGFsdmVzQGNvcnJlaW9uZXQuY29tLmJyPgogKiBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICogQ29weXJpZ2h0IDIwMDMgTWFyY2VsbyBEdWFydGUKICogQ29weXJpZ2h0IDIwMDQgQW3pcmljbyBKb3PpIE1lbG8KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0VfQlJBWklMSUFOCgpNQUlOX01FTlUgTUVOVQp7CiBQT1BVUCAiJkFycXVpdm8iIHsKICBNRU5VSVRFTSAiJk5vdm9cdEN0cmwrTiIsCQlDTURfTkVXCiAgTUVOVUlURU0gIkEmYnJpci4uLlx0Q3RybCtPIiwJCUNNRF9PUEVOCiAgTUVOVUlURU0gIiZTYWx2YXJcdEN0cmwrUyIsCQlDTURfU0FWRQogIE1FTlVJVEVNICJTYWx2YXIgJmNvbW8uLi4iLAlDTURfU0FWRV9BUwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImSW1wcmltaXJcdEN0cmwrUCIsCQlDTURfUFJJTlQKICBNRU5VSVRFTSAiQyZvbmZpZ3VyYXIgcOFnaW5hLi4uIiwJQ01EX1BBR0VfU0VUVVAKICBNRU5VSVRFTSAiQ29uZmlndXJhciBpJm1wcmVzc29yYS4uLiIsIENNRF9QUklOVEVSX1NFVFVQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlNhaSZyIiwJCUNNRF9FWElUCiB9ClBPUFVQICImRWRpdGFyIiB7CiAgTUVOVUlURU0gIiZEZXNmYXplclx0Q3RybCtaIiwgQ01EX1VORE8KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlJlY29ydGFyXHRDdHJsK1giLAlDTURfQ1VUCiAgTUVOVUlURU0gIiZDb3BpYXJcdEN0cmwrQyIsCUNNRF9DT1BZCiAgTUVOVUlURU0gIkMmb2xhclx0Q3RybCtWIiwJQ01EX1BBU1RFCiAgTUVOVUlURU0gIkUmeGNsdWlyXHREZWwiLAlDTURfREVMRVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlNlbGVjaW9uYXIgJnR1ZG8iLAlDTURfU0VMRUNUX0FMTAogIE1FTlVJVEVNICImRGF0YS9Ib3JhXHRGNSIsCUNNRF9USU1FX0RBVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlF1ZWJyYXIgYXV0b23hdGljYSBkZSBsaW5oYSIsCUNNRF9XUkFQCiAgTUVOVUlURU0gIiZGb250ZS4uLiIsICAgICAgICAgIENNRF9GT05UCiB9ClBPUFVQICImUGVzcXVpc2EiIHsKICBNRU5VSVRFTSAiJkxvY2FsaXphci4uLiIsCUNNRF9TRUFSQ0gKICBNRU5VSVRFTSAiTG9jYWxpemFyICZwcvN4aW1hXHRGMyIsCUNNRF9TRUFSQ0hfTkVYVAogfQpQT1BVUCAiJkFqdWRhIiB7CiAgTUVOVUlURU0gIiZDb250ZfpkbyIsCQlDTURfSEVMUF9DT05URU5UUwogIE1FTlVJVEVNICImUHJvY3VyYXIuLi4iLAlDTURfSEVMUF9TRUFSQ0gKICBNRU5VSVRFTSAiJkFqdWRhIG5hIGFqdWRhIiwJQ01EX0hFTFBfT05fSEVMUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIFBPUFVQICImSW5mb3JtYef1ZXMuLi4iIHsKICAgTUVOVUlURU0gIiZMaWNlbudhIiwJCUNNRF9MSUNFTlNFCiAgIE1FTlVJVEVNICImU0VNIEdBUkFOVElBIiwJQ01EX05PX1dBUlJBTlRZCiAgIE1FTlVJVEVNICImU29icmUgbyBXaW5lIiwJQ01EX0FCT1VUX1dJTkUKICB9CiB9Cn0KCkxBTkdVQUdFIExBTkdfUE9SVFVHVUVTRSwgU1VCTEFOR19QT1JUVUdVRVNFCgpNQUlOX01FTlUgTUVOVQp7CiBQT1BVUCAiJkZpY2hlaXJvIiB7CiAgTUVOVUlURU0gIiZOb3ZvLi4uIiwJCUNNRF9ORVcKICBNRU5VSVRFTSAiQSZicmlyIiwJCUNNRF9PUEVOCiAgTUVOVUlURU0gIiZHcmF2YXIiLAkJQ01EX1NBVkUKICBNRU5VSVRFTSAiZ3JhdmFyICZjb21vLi4uIiwJQ01EX1NBVkVfQVMKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkltcHJpbWlyIiwJCUNNRF9QUklOVAogIE1FTlVJVEVNICJDJm9uZmlndXJhciBw4WdpbmEuLi4iLAlDTURfUEFHRV9TRVRVUAogIE1FTlVJVEVNICJDb25maWd1cmFyIGkmbXByZXNzb3JhLi4uIiwgQ01EX1BSSU5URVJfU0VUVVAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiU2FpJnIiLAkJQ01EX0VYSVQKIH0KUE9QVVAgIiZFZGl0YXIiIHsKICBNRU5VSVRFTSAiJkRlc2ZhemVyXHRDdHJsK1oiLCBDTURfVU5ETwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImUmVjb3J0YXJcdEN0cmwrWCIsCUNNRF9DVVQKICBNRU5VSVRFTSAiJkNvcGlhclx0Q3RybCtDIiwJQ01EX0NPUFkKICBNRU5VSVRFTSAiQyZvbGFyXHRDdHJsK1YiLAlDTURfUEFTVEUKICBNRU5VSVRFTSAiRSZ4Y2x1aXJcdERlbCIsCUNNRF9ERUxFVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiU2VsZWNpb25hciAmdHVkbyIsCUNNRF9TRUxFQ1RfQUxMCiAgTUVOVUlURU0gIiZEYXRhL0hvcmFcdEY1IiwJQ01EX1RJTUVfREFURQogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImUXVlYnJhciBhdXRvbeF0aWNhIGRlIGxpbmhhIiwJQ01EX1dSQVAKICBNRU5VSVRFTSAiJlRpcG8gZGUgTGV0cmEuLi4iLCAgICAgICAgICBDTURfRk9OVAogfQpQT1BVUCAiJlBlc3F1aXNhIiB7CiAgTUVOVUlURU0gIiZMb2NhbGl6YXIuLi4iLAlDTURfU0VBUkNICiAgTUVOVUlURU0gIkxvY2FsaXphciAmcHLzeGltYVx0RjMiLAlDTURfU0VBUkNIX05FWFQKIH0KUE9QVVAgIiZBanVkYSIgewogIE1FTlVJVEVNICImQ29udGX6ZG8iLAkJQ01EX0hFTFBfQ09OVEVOVFMKICBNRU5VSVRFTSAiJlByb2N1cmFyLi4uIiwJQ01EX0hFTFBfU0VBUkNICiAgTUVOVUlURU0gIiZBanVkYSBuYSBhanVkYSIsCUNNRF9IRUxQX09OX0hFTFAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBQT1BVUCAiJkluZm9ybWHn9WVzLi4uIiB7CiAgIE1FTlVJVEVNICImTGljZW7nYSIsCQlDTURfTElDRU5TRQogICBNRU5VSVRFTSAiJlNFTSBHQVJBTlRJQSIsCUNNRF9OT19XQVJSQU5UWQogICBNRU5VSVRFTSAiJkFjZXJjYSBkbyBXaW5lIiwJQ01EX0FCT1VUX1dJTkUKICB9CiB9Cn0KCgovKiBEaWFsb2cgYFBhZ2Ugc2V0dXAnICovCgpMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfTkVVVFJBTAoKRElBTE9HX1BBR0VTRVRVUCBESUFMT0cgMCwgMCwgMjI1LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpDQVBUSU9OICJDb25maWd1cmFyIHDhZ2luYSIKewpMVEVYVCAgICAiJkNhYmXnYWxobzoiLCAgMHgxNDAsICAgMTAsIDA3LCA0MCwgMTUKRURJVFRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDEsICAgICAgIDYwLCAwNSwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImUm9kYXDpOiIsICAweDE0MiwgICAxMCwgMjQsIDQwLCAxNQpFRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MywgICAgICAgNjAsIDIyLDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkdST1VQQk9YICImTWFyZ2VuczoiLCAgICAgIDB4MTQ0LCAgICAgMTAsIDQzLDE2MCwgNDUKTFRFWFQgICAgIiZFc3F1ZXJkYToiLCAgICAgICAgMHgxNDUsICAgMjAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9MRUZUVkFMVUUsKi8gICAweDE0NywgICAgICAgNTAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJlN1cGVyaW9yOiIsICAgICAgICAgMHgxNDgsICAgIDIwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfVE9QVkFMVUUsKi8gICAgMHgxNEEsICAgICAgICA1MCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImRGlyZWl0YToiLCAgICAgICAweDE0QiwgMTAwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfUklHSFRWQUxVRSwqLyAgMHgxNEQsICAgICAxMzAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJkluZmVyaW9yOiIsICAgICAgMHgxNEUsMTAwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfQk9UVE9NVkFMVUUsKi8gMHgxNTAsICAgIDEzMCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpERUZQVVNIQlVUVE9OICJPSyIsICAgICAgICAgSURPSywgICAgICAgICAgICAgICAgICAgMTgwLCAgMywgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIkNhbmNlbGFyIiwgICAgIElEQ0FOQ0VMLCAgICAgICAgICAgICAgIDE4MCwgMjEsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICImQWp1ZGEiLCAgICAgICBJREhFTFAsICAgICAgICAgICAgICAgIDE4MCwgMzksIDQwLCAxNSwgV1NfVEFCU1RPUAp9CgoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0VfQlJBWklMSUFOCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7ClNUUklOR19QQUdFU0VUVVBfSEVBREVSVkFMVUUsCSImbiIgICAgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsCSJQ4WdpbmEgJnMiICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9MRUZUVkFMVUUsCQkiMjAgbW0iICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX1JJR0hUVkFMVUUsCSIyMCBtbSIgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfVE9QVkFMVUUsCQkiMjUgbW0iICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLAkiMjUgbW0iICAgICAvKiBGSVhNRSAqLwoKU1RSSU5HX05PVEVQQUQsCQkJCQkiTm90ZXBhZCIKU1RSSU5HX0VSUk9SLAkJCQkJIkVSUk8iClNUUklOR19XQVJOSU5HLAkJCQkJIkFWSVNPIgpTVFJJTkdfSU5GTywJCQkJCSJJbmZvcm1h5+NvIgoKU1RSSU5HX1VOVElUTEVELAkJCQkiKHNlbSBub21lKSIKClNUUklOR19BTExfRklMRVMsCQkJCSJUb2RvcyBvcyBhcnF1aXZvcyAoKi4qKSIKU1RSSU5HX1RFWFRfRklMRVNfVFhULAkJCSJBcnF1aXZvcyB0ZXh0byAoKi50eHQpIgoKU1RSSU5HX1RPT0xBUkdFLAkJCQkiQXJxdWl2byAnJXMnIOkgbXVpdG8gbG9uZ28gcGFyYSBvIG5vdGVwYWQuXG4gXApQb3IgZmF2b3IgdXNlIHVtIGVkaXRvciBkaWZlcmVudGUuIgpTVFJJTkdfTk9URVhULAkJCQkJIlZvY+ogbuNvIGRpZ2l0b3UgbmVuaHVtIHRleHRvLiBcClxuUG9yIGZhdm9yIGRpZ2l0ZSBhbGd1bWEgY29pc2EgZSB0ZW50ZSBub3ZhbWVudGUiClNUUklOR19ET0VTTk9URVhJU1QsCQkJCSJBcnF1aXZvICclcydcbm7jbyBleGlzdGVcblxuIFwKVm9j6iBkZXNlamEgY3JpYXIgdW0gbm92byBhcnF1aXZvPyIKU1RSSU5HX05PVFNBVkVELAkJCQkiQXJxdWl2byAnJXMnXG5mb2kgbW9kaWZpY2Fkb1xuXG4gXApHb3N0YXJpYSBkZSBzYWx2YXIgYXMgYWx0ZXJh59Vlcz8iClNUUklOR19OT1RGT1VORCwJCQkJCSInJXMnIG7jbyBwb2RlIHNlciBlbmNvbnRyYWRvLiIKU1RSSU5HX09VVF9PRl9NRU1PUlksCQkJIk7jbyBo4SBtZW3zcmlhIHN1ZmljaWVudGUgcGFyYSBjb21wbGV0YXIgZXNzYSBcCnRhcmVmYS4gXG5GZWNoZSB1bWEgb3UgbWFpcyBhcGxpY2Hn9WVzIHBhcmEgYXVtZW50YXIgYSBxdWFudGlkYWRlIGRlIG1lbfNyaWEgbGl2cmUuIgp9CgpMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfUE9SVFVHVUVTRQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogU1RSSU5HX1BBR0VTRVRVUF9IRUFERVJWQUxVRSwJIiZuIiAgICAgICAgLyogRklYTUUgKi8KIFNUUklOR19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsCSJQ4WdpbmEgJnMiIC8qIEZJWE1FICovCiBTVFJJTkdfUEFHRVNFVFVQX0xFRlRWQUxVRSwJIjIwIG1tIiAgICAgLyogRklYTUUgKi8KIFNUUklOR19QQUdFU0VUVVBfUklHSFRWQUxVRSwJIjIwIG1tIiAgICAgLyogRklYTUUgKi8KIFNUUklOR19QQUdFU0VUVVBfVE9QVkFMVUUsCSIyNSBtbSIgICAgIC8qIEZJWE1FICovCiBTVFJJTkdfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLAkiMjUgbW0iICAgICAvKiBGSVhNRSAqLwoKIFNUUklOR19OT1RFUEFELAkJIk5vdGVwYWQiCiBTVFJJTkdfRVJST1IsCQkJIkVSUk8iCiBTVFJJTkdfV0FSTklORywJCSJBVklTTyIKIFNUUklOR19JTkZPLAkJCSJJbmZvcm1h5+NvIgoKIFNUUklOR19VTlRJVExFRCwJCSIoc2VtIG5vbWUpIgoKIFNUUklOR19BTExfRklMRVMsCQkiVG9kb3Mgb3MgYXJxdWl2b3MgKCouKikiCiBTVFJJTkdfVEVYVF9GSUxFU19UWFQsCQkiRmljaGVpcm9zIGRlIHRleHRvICgqLnR4dCkiCgogU1RSSU5HX1RPT0xBUkdFLAkJIkZpY2hlaXJvcyAnJXMnIOkgbXVpdG8gbG9uZ28gcGFyYSBvIG5vdGVwYWQuXG4gXAogUG9yIGZhdm9yIHVzZSB1bSBlZGl0b3IgZGlmZXJlbnRlLiIKIFNUUklOR19OT1RFWFQsCQkJIk7jbyBkaWdpdG91IG5lbmh1bSB0ZXh0by4gXAogXG5Qb3IgZmF2b3IgZGlnaXRlIGFsZ3VtYSBjb2lzYSBlIHRlbnRlIG5vdmFtZW50ZSIKIFNUUklOR19ET0VTTk9URVhJU1QsCQkiRmljaGVpcm8gJyVzJ1xubuNvIGV4aXN0ZVxuXG4gXApEZXNlamEgY3JpYXIgdW0gbm92byBmaWNoZWlybz8iCiBTVFJJTkdfTk9UU0FWRUQsCQkiRmljaGVpcm8gJyVzJ1xuZm9pIG1vZGlmaWNhZG9cblxuIFwKR29zdGFyaWEgZGUgZ3JhdmFyIGFzIGFsdGVyYefVZXM/IgogU1RSSU5HX05PVEZPVU5ELAkJIiclcycgbuNvIHBvZGUgc2VyIGVuY29udHJhZG8uIgogU1RSSU5HX09VVF9PRl9NRU1PUlksCQkiTuNvIGjhIG1lbfNyaWEgc3VmaWNpZW50ZSBwYXJhIGNvbXBsZXRhciBlc3RhIFwKdGFyZWZhLiBcbkZlY2hlIHVtYSBvdSBtYWlzIGFwbGljYef1ZXMgcGFyYSBhdW1lbnRhciBhIHF1YW50aWRhZGUgZGUgbWVt83JpYSBsaXZyZS4iCn0K