LyoKICogIE5vdGVwYWQgKFBvcnR1Z3Vlc2UgcmVzb3VyY2VzKQogKgogKiAgQ29weXJpZ2h0IDE5OTkgTWFyY2VsIEJhdXIgPGFsdmVzQGNvcnJlaW9uZXQuY29tLmJyPgogKiAgQ29weXJpZ2h0IDIwMDIgU3lsdmFpbiBQZXRyZW9sbGUgPHNwZXRyZW9sbGVAeWFob28uZnI+CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCk1BSU5fTUVOVSBNRU5VIExBTkdVQUdFIExBTkdfUE9SVFVHVUVTRSwgU1VCTEFOR19ORVVUUkFMCnsKIFBPUFVQICImQXJxdWl2byIgewogIE1FTlVJVEVNICImTm92by4uLiIsIDB4MTAwCiAgTUVOVUlURU0gIkEmYnJpciIsIDB4MTAxCiAgTUVOVUlURU0gIiZTYWx2YXIiLCAweDEwMgogIE1FTlVJVEVNICJTYWx2YXIgJmNvbW8uLi4iLCAweDEwMwogIE1FTlVJVEVNICImSW1wcmltaXIiLCAweDEwNAogIE1FTlVJVEVNICJDJm9uZmlndXJhciBQ4WdpbmEuLi4iLCAweDEwNQogIE1FTlVJVEVNICJDb25maWd1cmFyIEkmbXByZXNzb3JhLi4uIiwgMHgxMDYKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlNhaXIiLCAweDEwOAogfQpQT1BVUCAiJkVkaXRhciIgewogIE1FTlVJVEVNICImRGVzZmF6ZXJcdEN0cmwrWiIsIDB4MTEwCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIkMmb3J0YXJcdEN0cmwrWCIsIDB4MTExCiAgTUVOVUlURU0gIiZDb3BpYXJcdEN0cmwrQyIsIDB4MTEyCiAgTUVOVUlURU0gIkNvJmxhclx0Q3RybCtWIiwgMHgxMTMKICBNRU5VSVRFTSAiJkRlbGV0ZVx0RGVsIiwgMHgxMTQKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiU2VsZWNpb25hciAmVHVkbyIsIDB4MTE2CiAgTUVOVUlURU0gIiZEYXRhL0hvcmFcdEY1IiwgMHgxMTcKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlF1ZWJyYXIgbGluaGFzIGxvbmdhcyIsIDB4MTE5CiB9ClBPUFVQICImUGVzcXVpc2EiIHsKICBNRU5VSVRFTSAiUGVzcXVpc2FyLi4uIiwgMHgxMjAKICBNRU5VSVRFTSAiJlByb2N1cmFyIFBy83hpbWFcdEYzIiwgMHgxMjEKIH0KUE9QVVAgIiZBanVkYSIgewogIE1FTlVJVEVNICImQ29udGX6ZG8iLCAweDEzMAogIE1FTlVJVEVNICImUHJvY3VyYXIuLi4iLCAweDEzMQogIE1FTlVJVEVNICImQWp1ZGEgbmEgYWp1ZGEiLCAweDEzMgogIE1FTlVJVEVNIFNFUEFSQVRPUgogIFBPUFVQICJJbmYmb3JtYef1ZXMuLi4iIHsKICAgTUVOVUlURU0gIiZMaWNlbudhIiwgMHgxMzUKICAgTUVOVUlURU0gIiZTRU0gR0FSQU5USUEiLCAweDEzNgogICBNRU5VSVRFTSAiJlNvYnJlIFdpbmUiLCAweDEzNwogIH0KIH0KfSAKCi8qIERpYWxvZyBgUGFnZSBzZXR1cCcgKi8KCkRJQUxPR19QQUdFU0VUVVBfIERJQUxPRyAwLCAwLCAyMjUsIDk1CkxBTkdVQUdFIExBTkdfUE9SVFVHVUVTRSwgU1VCTEFOR19ORVVUUkFMClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpGT05UIDgsICJIZWx2IgpDQVBUSU9OICJDb25maWd1cmFyIFDhZ2luYSIKewpMVEVYVCAgICAiJkNhYmXnYWxobzoiLCAgMHgxNDAsICAgMTAsIDA3LCA0MCwgMTUKRURJVFRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDEsICAgICAgIDYwLCAwNSwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImUm9kYXDpOiIsICAweDE0MiwgICAxMCwgMjQsIDQwLCAxNQpFRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MywgICAgICAgNjAsIDIyLDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkdST1VQQk9YICImTWFyZ2VuczoiLCAgICAgIDB4MTQ0LCAgICAgMTAsIDQzLDE2MCwgNDUKTFRFWFQgICAgIiZFc3F1ZXJkYToiLCAgICAgICAgMHgxNDUsICAgMjAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9MRUZUVkFMVUUsKi8gICAweDE0NywgICAgICAgNTAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJlN1cGVyaW9yOiIsICAgICAgICAgMHgxNDgsICAgIDIwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfVE9QVkFMVUUsKi8gICAgMHgxNEEsICAgICAgICA1MCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImRGlyZWl0YToiLCAgICAgICAweDE0QiwgMTAwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfUklHSFRWQUxVRSwqLyAgMHgxNEQsICAgICAxMzAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJkluZmVyaW9yOiIsICAgICAgMHgxNEUsMTAwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfQk9UVE9NVkFMVUUsKi8gMHgxNTAsICAgIDEzMCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpERUZQVVNIQlVUVE9OICJPSyIsICAgICAgICAgMHgxNTEsICAgICAgICAgICAgICAgICAgIDE4MCwgIDMsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICJDYW5jZWxhciIsICAgICAweDE1MiwgICAgICAgICAgICAgICAxODAsIDIxLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiJkFqdWRhIiwgICAgICAgMHgxNTMsICAgICAgICAgICAgICAgIDE4MCwgMzksIDQwLCAxNSwgV1NfVEFCU1RPUAp9CgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSBMQU5HVUFHRSBMQU5HX1BPUlRVR1VFU0UsIFNVQkxBTkdfTkVVVFJBTAp7ClNUUklOR19QQUdFU0VUVVBfSEVBREVSVkFMVUUsCSImbiIgICAgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsCSJQ4WdpbmEgJnMiICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9MRUZUVkFMVUUsCQkiMjAgbW0iICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX1JJR0hUVkFMVUUsCSIyMCBtbSIgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfVE9QVkFMVUUsCQkiMjUgbW0iICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLAkiMjUgbW0iICAgICAvKiBGSVhNRSAqLwoKU1RSSU5HX05PVEVQQUQsCQkJCQkiTm90ZXBhZCIKU1RSSU5HX0VSUk9SLAkJCQkJIkVSUk8iClNUUklOR19XQVJOSU5HLAkJCQkJIkFWSVNPIgpTVFJJTkdfSU5GTywJCQkJCSJJbmZvcm1h5+NvIgoKU1RSSU5HX1VOVElUTEVELAkJCQkiKHNlbSBub21lKSIKClNUUklOR19BTExfRklMRVMsCQkJCSJUb2RvcyBvcyBhcnF1aXZvcyAoKi4qKSIKU1RSSU5HX1RFWFRfRklMRVNfVFhULAkJCSJBcnF1aXZvcyB0ZXh0byAoKi50eHQpIgoKU1RSSU5HX1RPT0xBUkdFLAkJCQkiQXJxdWl2byAnJXMnIOkgbXVpdG8gbG9uZ28gcGFyYSBvIG5vdGVwYWQuXG4gXApQb3IgZmF2b3IgdXNlIHVtIGVkaXRvciBkaWZlcmVudGUuIgpTVFJJTkdfTk9URVhULAkJCQkJIlZvY+ogbuNvIGRpZ2l0b3UgbmVuaHVtIHRleHRvLiBcClxuUG9yIGZhdm9yIGRpZ2l0ZSBhbGd1bWEgY29pc2EgZSB0ZW50ZSBub3ZhbWVudGUiClNUUklOR19ET0VTTk9URVhJU1QsCQkJCSJGaWxlICclcydcbmRvZXMgbm90IGV4aXN0XG5cbiBcCkRvIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBmaWxlID8iClNUUklOR19OT1RTQVZFRCwJCQkJIkFycXVpdm8gJyVzJ1xuZm9pIG1vZGlmaWNhZG9cblxuIFwKR29zdGFyaWEgZGUgc2FsdmFyIGFzIGFsdGVyYefVZXMgPyIKU1RSSU5HX05PVEZPVU5ELAkJCQkJIiclcycgbuNvIHBvZGUgc2VyIGVuY29udHJhZG8uIgpTVFJJTkdfT1VUX09GX01FTU9SWSwJCQkiTuNvIGjhIG1lbfNyaWEgc3VmaWNpZW50ZSBwYXJhIGNvbXBsZXRhciBlc3NhIFwKdGFyZWZhLiBcbkZlY2hlIHVtYSBvdSBtYWlzIGFwbGljYef1ZXMgcGFyYSBhdW1lbnRhciBhIHF1YW50aWRhZGUgZGUgbWVt83JpYSBcCmxpdnJlLiIKCn0KCg==