Li4gQ29weXJpZ2h0IERhdmlkIEFicmFoYW1zIDIwMDQuIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gaXMKLi4gc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi4uIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQoKSW4gdGhpcyBzZWN0aW9uIHdlJ2xsIHdhbGsgdGhyb3VnaCB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBmZXcKaXRlcmF0b3JzIHVzaW5nIGBgaXRlcmF0b3JfZmFjYWRlYGAsIGJhc2VkIGFyb3VuZCB0aGUgc2ltcGxlCmV4YW1wbGUgb2YgYSBsaW5rZWQgbGlzdCBvZiBwb2x5bW9ycGhpYyBvYmplY3RzLiAgVGhpcyBleGFtcGxlIHdhcwppbnNwaXJlZCBieSBhIGBwb3N0aW5nYF9fIGJ5IEtlaXRoIE1hY2RvbmFsZCBvbiB0aGUgYEJvb3N0LVVzZXJzYF8KbWFpbGluZyBsaXN0LgoKLi4gX2BCb29zdC1Vc2Vyc2A6IGh0dHA6Ly93d3cuYm9vc3Qub3JnL21vcmUvbWFpbGluZ19saXN0cy5odG0jdXNlcnMKCl9fIGh0dHA6Ly90aHJlYWQuZ21hbmUub3JnL2dtYW5lLmNvbXAubGliLmJvb3N0LnVzZXIvNTEwMAoKVGhlIFByb2JsZW0KLS0tLS0tLS0tLS0KClNheSB3ZSd2ZSB3cml0dGVuIGEgcG9seW1vcnBoaWMgbGlua2VkIGxpc3Qgbm9kZSBiYXNlIGNsYXNzOjoKCiAgIyBpbmNsdWRlIDxpb3N0cmVhbT4KCiAgc3RydWN0IG5vZGVfYmFzZQogIHsKICAgICAgbm9kZV9iYXNlKCkgOiBtX25leHQoMCkge30KCiAgICAgIC8vIEVhY2ggbm9kZSBtYW5hZ2VzIGFsbCBvZiBpdHMgdGFpbCBub2RlcwogICAgICB2aXJ0dWFsIH5ub2RlX2Jhc2UoKSB7IGRlbGV0ZSBtX25leHQ7IH0KCiAgICAgIC8vIEFjY2VzcyB0aGUgcmVzdCBvZiB0aGUgbGlzdAogICAgICBub2RlX2Jhc2UqIG5leHQoKSBjb25zdCB7IHJldHVybiBtX25leHQ7IH0KCiAgICAgIC8vIHByaW50IHRvIHRoZSBzdHJlYW0KICAgICAgdmlydHVhbCB2b2lkIHByaW50KHN0ZDo6b3N0cmVhbSYgcykgY29uc3QgPSAwOwogICAgICAKICAgICAgLy8gZG91YmxlIHRoZSB2YWx1ZQogICAgICB2aXJ0dWFsIHZvaWQgZG91YmxlX21lKCkgPSAwOwoKICAgICAgdm9pZCBhcHBlbmQobm9kZV9iYXNlKiBwKQogICAgICB7CiAgICAgICAgICBpZiAobV9uZXh0KSAKICAgICAgICAgICAgICBtX25leHQtPmFwcGVuZChwKTsgCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgbV9uZXh0ID0gcDsgCiAgICAgIH0KCiAgIHByaXZhdGU6CiAgICAgIG5vZGVfYmFzZSogbV9uZXh0OwogIH07CgpMaXN0cyBjYW4gaG9sZCBvYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyBieSBsaW5raW5nIHRvZ2V0aGVyCnNwZWNpYWxpemF0aW9ucyBvZiB0aGUgZm9sbG93aW5nIHRlbXBsYXRlOjoKCiAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgc3RydWN0IG5vZGUgOiBub2RlX2Jhc2UKICB7CiAgICAgIG5vZGUoVCB4KQogICAgICAgIDogbV92YWx1ZSh4KQogICAgICB7fQoKICAgICAgdm9pZCBwcmludChzdGQ6Om9zdHJlYW0mIHMpIGNvbnN0IHsgcyA8PCB0aGlzLT5tX3ZhbHVlOyB9CiAgICAgIHZvaWQgZG91YmxlX21lKCkgeyBtX3ZhbHVlICs9IG1fdmFsdWU7IH0KCiAgIHByaXZhdGU6CiAgICAgIFQgbV92YWx1ZTsKICB9OwoKQW5kIHdlIGNhbiBwcmludCBhbnkgbm9kZSB1c2luZyB0aGUgZm9sbG93aW5nIHN0cmVhbWluZyBvcGVyYXRvcjo6CgogIGlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBzLCBub2RlX2Jhc2UgY29uc3QmIG4pCiAgewogICAgICBuLnByaW50KHMpOwogICAgICByZXR1cm4gczsKICB9CgpPdXIgZmlyc3QgY2hhbGxlbmdlIGlzIHRvIGJ1aWxkIGFuIGFwcHJvcHJpYXRlIGl0ZXJhdG9yIG92ZXIgdGhlc2UKbGlzdHMuCgpBIEJhc2ljIEl0ZXJhdG9yIFVzaW5nIGBgaXRlcmF0b3JfZmFjYWRlYGAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpXZSB3aWxsIGNvbnN0cnVjdCBhIGBgbm9kZV9pdGVyYXRvcmBgIGNsYXNzIHVzaW5nIGluaGVyaXRhbmNlIGZyb20KYGBpdGVyYXRvcl9mYWNhZGVgYCB0byBpbXBsZW1lbnQgbW9zdCBvZiB0aGUgaXRlcmF0b3IncyBvcGVyYXRpb25zLgoKOjoKCiAgIyBpbmNsdWRlICJub2RlLmhwcCIKICAjIGluY2x1ZGUgPGJvb3N0L2l0ZXJhdG9yL2l0ZXJhdG9yX2ZhY2FkZS5ocHA+CgogIGNsYXNzIG5vZGVfaXRlcmF0b3IKICAgIDogcHVibGljIGJvb3N0OjppdGVyYXRvcl9mYWNhZGU8Li4uPgogIHsKICAgICAuLi4KICB9OwoKCgpUZW1wbGF0ZSBBcmd1bWVudHMgZm9yIGBgaXRlcmF0b3JfZmFjYWRlYGAKLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCgpgYGl0ZXJhdG9yX2ZhY2FkZWBgIGhhcyBzZXZlcmFsIHRlbXBsYXRlIHBhcmFtZXRlcnMsIHNvIHdlIG11c3QgZGVjaWRlCndoYXQgdHlwZXMgdG8gdXNlIGZvciB0aGUgYXJndW1lbnRzLiBUaGUgcGFyYW1ldGVycyBhcmUgYGBEZXJpdmVkYGAsCmBgVmFsdWVgYCwgYGBDYXRlZ29yeU9yVHJhdmVyc2FsYGAsIGBgUmVmZXJlbmNlYGAsIGFuZCBgYERpZmZlcmVuY2VgYC4KCgpgYERlcml2ZWRgYAonJycnJycnJycnJwoKQmVjYXVzZSBgYGl0ZXJhdG9yX2ZhY2FkZWBgIGlzIG1lYW50IHRvIGJlIHVzZWQgd2l0aCB0aGUgQ1JUUApbQ29wOTVdXyB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBpdGVyYXRvciBjbGFzcyBuYW1lIGl0c2VsZiwKYGBub2RlX2l0ZXJhdG9yYGAuCgpgYFZhbHVlYGAKJycnJycnJycnCgpUaGUgYGBWYWx1ZWBgIHBhcmFtZXRlciBkZXRlcm1pbmVzIHRoZSBgYG5vZGVfaXRlcmF0b3JgYFwgJ3MKYGB2YWx1ZV90eXBlYGAuICBJbiB0aGlzIGNhc2UsIHdlIGFyZSBpdGVyYXRpbmcgb3ZlciBgYG5vZGVfYmFzZWBgCm9iamVjdHMsIHNvIGBgVmFsdWVgYCB3aWxsIGJlIGBgbm9kZV9iYXNlYGAuCgoKYGBDYXRlZ29yeU9yVHJhdmVyc2FsYGAKJycnJycnJycnJycnJycnJycnJycnJycKCk5vdyB3ZSBoYXZlIHRvIGRldGVybWluZSB3aGljaCBgaXRlcmF0b3IgdHJhdmVyc2FsIGNvbmNlcHRgXyBvdXIKYGBub2RlX2l0ZXJhdG9yYGAgaXMgZ29pbmcgdG8gbW9kZWwuICBTaW5nbHktbGlua2VkIGxpc3RzIG9ubHkgaGF2ZQpmb3J3YXJkIGxpbmtzLCBzbyBvdXIgaXRlcmF0b3IgY2FuJ3QgY2FuJ3QgYmUgYSBgYmlkaXJlY3Rpb25hbAp0cmF2ZXJzYWwgaXRlcmF0b3JgXy4gIE91ciBpdGVyYXRvciBzaG91bGQgYmUgYWJsZSB0byBtYWtlIG11bHRpcGxlCnBhc3NlcyBvdmVyIHRoZSBzYW1lIGxpbmtlZCBsaXN0ICh1bmxpa2UsIHNheSwgYW4KYGBpc3RyZWFtX2l0ZXJhdG9yYGAgd2hpY2ggY29uc3VtZXMgdGhlIHN0cmVhbSBpdCB0cmF2ZXJzZXMpLCBzbyBpdAptdXN0IGJlIGEgYGZvcndhcmQgdHJhdmVyc2FsIGl0ZXJhdG9yYF8uICBUaGVyZWZvcmUsIHdlJ2xsIHBhc3MKYGBib29zdDo6Zm9yd2FyZF90cmF2ZXJzYWxfdGFnYGAgaW4gdGhpcyBwb3NpdGlvbiBbI2NhdGVnb3J5XV8uCgouLiBbI2NhdGVnb3J5XSBgYGl0ZXJhdG9yX2ZhY2FkZWBgIGFsc28gc3VwcG9ydHMgb2xkLXN0eWxlIGNhdGVnb3J5CiAgIHRhZ3MsIHNvIHdlIGNvdWxkIGhhdmUgcGFzc2VkIGBgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZ2BgIGhlcmU7CiAgIGVpdGhlciB3YXksIHRoZSByZXN1bHRpbmcgaXRlcmF0b3IncyBgYGl0ZXJhdG9yX2NhdGVnb3J5YGAgd2lsbAogICBlbmQgdXAgYmVpbmcgYGBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnYGAuCgpgYFJlZmVyZW5jZWBgCicnJycnJycnJycnJycKClRoZSBgYFJlZmVyZW5jZWBgIGFyZ3VtZW50IGJlY29tZXMgdGhlIHR5cGUgcmV0dXJuZWQgYnkKYGBub2RlX2l0ZXJhdG9yYGBcICdzIGRlcmVmZXJlbmNlIG9wZXJhdGlvbiwgYW5kIHdpbGwgYWxzbyBiZSB0aGUKc2FtZSBhcyBgYHN0ZDo6aXRlcmF0b3JfdHJhaXRzPG5vZGVfaXRlcmF0b3I+OjpyZWZlcmVuY2VgYC4gIFRoZQpsaWJyYXJ5J3MgZGVmYXVsdCBmb3IgdGhpcyBwYXJhbWV0ZXIgaXMgYGBWYWx1ZSZgYDsgc2luY2UKYGBub2RlX2Jhc2UmYGAgaXMgYSBnb29kIGNob2ljZSBmb3IgdGhlIGl0ZXJhdG9yJ3MgYGByZWZlcmVuY2VgYAp0eXBlLCB3ZSBjYW4gb21pdCB0aGlzIGFyZ3VtZW50LCBvciBwYXNzIGBgdXNlX2RlZmF1bHRgYC4KCmBgRGlmZmVyZW5jZWBgCicnJycnJycnJycnJycnCgpUaGUgYGBEaWZmZXJlbmNlYGAgYXJndW1lbnQgZGV0ZXJtaW5lcyBob3cgdGhlIGRpc3RhbmNlIGJldHdlZW4KdHdvIGBgbm9kZV9pdGVyYXRvcmBgXCBzIHdpbGwgYmUgbWVhc3VyZWQgYW5kIHdpbGwgYWxzbyBiZSB0aGUKc2FtZSBhcyBgYHN0ZDo6aXRlcmF0b3JfdHJhaXRzPG5vZGVfaXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGVgYC4KVGhlIGxpYnJhcnkncyBkZWZhdWx0IGZvciBgYERpZmZlcmVuY2VgYCBpcyBgYHN0ZDo6cHRyZGlmZl90YGAsIGFuCmFwcHJvcHJpYXRlIHR5cGUgZm9yIG1lYXN1cmluZyB0aGUgZGlzdGFuY2UgYmV0d2VlbiBhbnkgdHdvCmFkZHJlc3NlcyBpbiBtZW1vcnksIGFuZCBvbmUgdGhhdCB3b3JrcyBmb3IgYWxtb3N0IGFueSBpdGVyYXRvciwKc28gd2UgY2FuIG9taXQgdGhpcyBhcmd1bWVudCwgdG9vLgoKVGhlIGRlY2xhcmF0aW9uIG9mIGBgbm9kZV9pdGVyYXRvcmBgIHdpbGwgdGhlcmVmb3JlIGxvb2sgc29tZXRoaW5nCmxpa2U6OgoKICAjIGluY2x1ZGUgIm5vZGUuaHBwIgogICMgaW5jbHVkZSA8Ym9vc3QvaXRlcmF0b3IvaXRlcmF0b3JfZmFjYWRlLmhwcD4KCiAgY2xhc3Mgbm9kZV9pdGVyYXRvcgogICAgOiBwdWJsaWMgYm9vc3Q6Oml0ZXJhdG9yX2ZhY2FkZTwKICAgICAgICAgIG5vZGVfaXRlcmF0b3IKICAgICAgICAsIG5vZGVfYmFzZQogICAgICAgICwgYm9vc3Q6OmZvcndhcmRfdHJhdmVyc2FsX3RhZwogICAgICA+CiAgewogICAgIC4uLgogIH07CgpDb25zdHJ1Y3RvcnMgYW5kIERhdGEgTWVtYmVycwouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoKTmV4dCB3ZSBuZWVkIHRvIGRlY2lkZSBob3cgdG8gcmVwcmVzZW50IHRoZSBpdGVyYXRvcidzIHBvc2l0aW9uLgpUaGlzIHJlcHJlc2VudGF0aW9uIHdpbGwgdGFrZSB0aGUgZm9ybSBvZiBkYXRhIG1lbWJlcnMsIHNvIHdlJ2xsCmFsc28gbmVlZCB0byB3cml0ZSBjb25zdHJ1Y3RvcnMgdG8gaW5pdGlhbGl6ZSB0aGVtLiAgVGhlCmBgbm9kZV9pdGVyYXRvcmBgXCAncyBwb3NpdGlvbiBpcyBxdWl0ZSBuYXR1cmFsbHkgcmVwcmVzZW50ZWQgdXNpbmcKYSBwb2ludGVyIHRvIGEgYGBub2RlX2Jhc2VgYC4gIFdlJ2xsIG5lZWQgYSBjb25zdHJ1Y3RvciB0byBidWlsZCBhbgppdGVyYXRvciBmcm9tIGEgYGBub2RlX2Jhc2UqYGAsIGFuZCBhIGRlZmF1bHQgY29uc3RydWN0b3IgdG8Kc2F0aXNmeSB0aGUgYGZvcndhcmQgdHJhdmVyc2FsIGl0ZXJhdG9yYF8gcmVxdWlyZW1lbnRzIFsjZGVmYXVsdF1fLgpPdXIgYGBub2RlX2l0ZXJhdG9yYGAgdGhlbiBiZWNvbWVzOjoKCiAgIyBpbmNsdWRlICJub2RlLmhwcCIKICAjIGluY2x1ZGUgPGJvb3N0L2l0ZXJhdG9yL2l0ZXJhdG9yX2ZhY2FkZS5ocHA+CgogIGNsYXNzIG5vZGVfaXRlcmF0b3IKICAgIDogcHVibGljIGJvb3N0OjppdGVyYXRvcl9mYWNhZGU8CiAgICAgICAgICBub2RlX2l0ZXJhdG9yCiAgICAgICAgLCBub2RlX2Jhc2UKICAgICAgICAsIGJvb3N0Ojpmb3J3YXJkX3RyYXZlcnNhbF90YWcKICAgICAgPgogIHsKICAgcHVibGljOgogICAgICBub2RlX2l0ZXJhdG9yKCkKICAgICAgICA6IG1fbm9kZSgwKQogICAgICB7fQoKICAgICAgZXhwbGljaXQgbm9kZV9pdGVyYXRvcihub2RlX2Jhc2UqIHApCiAgICAgICAgOiBtX25vZGUocCkKICAgICAge30KCiAgIHByaXZhdGU6CiAgICAgIC4uLgogICAgICBub2RlX2Jhc2UqIG1fbm9kZTsKICB9OwoKLi4gWyNkZWZhdWx0XSBUZWNobmljYWxseSwgdGhlIEMrKyBzdGFuZGFyZCBwbGFjZXMgYWxtb3N0IG5vCiAgIHJlcXVpcmVtZW50cyBvbiBhIGRlZmF1bHQtY29uc3RydWN0ZWQgaXRlcmF0b3IsIHNvIGlmIHdlIHdlcmUKICAgcmVhbGx5IGNvbmNlcm5lZCB3aXRoIGVmZmljaWVuY3ksIHdlIGNvdWxkJ3ZlIHdyaXR0ZW4gdGhlCiAgIGRlZmF1bHQgY29uc3RydWN0b3IgdG8gbGVhdmUgYGBtX25vZGVgYCB1bmluaXRpYWxpemVkLgoKSW1wbGVtZW50aW5nIHRoZSBDb3JlIE9wZXJhdGlvbnMKLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KClRoZSBsYXN0IHN0ZXAgaXMgdG8gaW1wbGVtZW50IHRoZSBgY29yZSBvcGVyYXRpb25zYF8gcmVxdWlyZWQgYnkKdGhlIGNvbmNlcHRzIHdlIHdhbnQgb3VyIGl0ZXJhdG9yIHRvIG1vZGVsLiAgUmVmZXJyaW5nIHRvIHRoZQp0YWJsZV9fLCB3ZSBjYW4gc2VlIHRoYXQgdGhlIGZpcnN0IHRocmVlIHJvd3MgYXJlIGFwcGxpY2FibGUKYmVjYXVzZSBgYG5vZGVfaXRlcmF0b3JgYCBuZWVkcyB0byBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgZm9yCmByZWFkYWJsZSBpdGVyYXRvcmBfLCBgc2luZ2xlIHBhc3MgaXRlcmF0b3JgXywgYW5kIGBpbmNyZW1lbnRhYmxlCml0ZXJhdG9yYF8uICAKCl9fIGBjb3JlIG9wZXJhdGlvbnNgXwoKV2UgdGhlcmVmb3JlIG5lZWQgdG8gc3VwcGx5IGBgZGVyZWZlcmVuY2VgYCwKYGBlcXVhbGBgLCBhbmQgYGBpbmNyZW1lbnRgYCBtZW1iZXJzLiAgV2UgZG9uJ3Qgd2FudCB0aGVzZSBtZW1iZXJzCnRvIGJlY29tZSBwYXJ0IG9mIGBgbm9kZV9pdGVyYXRvcmBgXCAncyBwdWJsaWMgaW50ZXJmYWNlLCBzbyB3ZSBjYW4KbWFrZSB0aGVtIHByaXZhdGUgYW5kIGdyYW50IGZyaWVuZHNoaXAgdG8KYGBib29zdDo6aXRlcmF0b3JfY29yZV9hY2Nlc3NgYCwgYSAiYmFjay1kb29yIiB0aGF0CmBgaXRlcmF0b3JfZmFjYWRlYGAgdXNlcyB0byBnZXQgYWNjZXNzIHRvIHRoZSBjb3JlIG9wZXJhdGlvbnM6OgoKICAjIGluY2x1ZGUgIm5vZGUuaHBwIgogICMgaW5jbHVkZSA8Ym9vc3QvaXRlcmF0b3IvaXRlcmF0b3JfZmFjYWRlLmhwcD4KCiAgY2xhc3Mgbm9kZV9pdGVyYXRvcgogICAgOiBwdWJsaWMgYm9vc3Q6Oml0ZXJhdG9yX2ZhY2FkZTwKICAgICAgICAgIG5vZGVfaXRlcmF0b3IKICAgICAgICAsIG5vZGVfYmFzZQogICAgICAgICwgYm9vc3Q6OmZvcndhcmRfdHJhdmVyc2FsX3RhZwogICAgICA+CiAgewogICBwdWJsaWM6CiAgICAgIG5vZGVfaXRlcmF0b3IoKQogICAgICAgIDogbV9ub2RlKDApIHt9CgogICAgICBleHBsaWNpdCBub2RlX2l0ZXJhdG9yKG5vZGVfYmFzZSogcCkKICAgICAgICA6IG1fbm9kZShwKSB7fQoKICAgcHJpdmF0ZToKICAgICAgZnJpZW5kIGNsYXNzIGJvb3N0OjppdGVyYXRvcl9jb3JlX2FjY2VzczsKCiAgICAgIHZvaWQgaW5jcmVtZW50KCkgeyBtX25vZGUgPSBtX25vZGUtPm5leHQoKTsgfQoKICAgICAgYm9vbCBlcXVhbChub2RlX2l0ZXJhdG9yIGNvbnN0JiBvdGhlcikgY29uc3QKICAgICAgewogICAgICAgICAgcmV0dXJuIHRoaXMtPm1fbm9kZSA9PSBvdGhlci5tX25vZGU7CiAgICAgIH0KCiAgICAgIG5vZGVfYmFzZSYgZGVyZWZlcmVuY2UoKSBjb25zdCB7IHJldHVybiAqbV9ub2RlOyB9CgogICAgICBub2RlX2Jhc2UqIG1fbm9kZTsKICB9OwoKVm9pbOA7IGEgY29tcGxldGUgYW5kIGNvbmZvcm1pbmcgcmVhZGFibGUsIGZvcndhcmQtdHJhdmVyc2FsCml0ZXJhdG9yISAgRm9yIGEgd29ya2luZyBleGFtcGxlIG9mIGl0cyB1c2UsIHNlZSBgdGhpcyBwcm9ncmFtYF9fLgoKX18gLi4vZXhhbXBsZS9ub2RlX2l0ZXJhdG9yMS5jcHAKCkEgY29uc3RhbnQgYGBub2RlX2l0ZXJhdG9yYGAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLi4gU2lkZWJhcjo6IENvbnN0YW50IGFuZCBNdXRhYmxlIGl0ZXJhdG9ycwoKICAgVGhlIHRlcm0gKiptdXRhYmxlIGl0ZXJhdG9yKiogbWVhbnMgYW4gaXRlcmF0b3IgdGhyb3VnaCB3aGljaAogICB0aGUgb2JqZWN0IGl0IHJlZmVyZW5jZXMgKGl0cyAicmVmZXJlbnQiKSBjYW4gYmUgbW9kaWZpZWQuICBBCiAgICoqY29uc3RhbnQgaXRlcmF0b3IqKiBpcyBvbmUgd2hpY2ggZG9lc24ndCBhbGxvdyBtb2RpZmljYXRpb24gb2YKICAgaXRzIHJlZmVyZW50LiAgCgogICBUaGUgd29yZHMgKmNvbnN0YW50KiBhbmQgKm11dGFibGUqIGRvbid0IHJlZmVyIHRvIHRoZSBhYmlsaXR5IHRvCiAgIG1vZGlmeSB0aGUgaXRlcmF0b3IgaXRzZWxmLiAgRm9yIGV4YW1wbGUsIGFuIGBgaW50IGNvbnN0KmBgIGlzIGEKICAgbm9uLVwgYGBjb25zdGBgICpjb25zdGFudCBpdGVyYXRvciosIHdoaWNoIGNhbiBiZSBpbmNyZW1lbnRlZAogICBidXQgZG9lc24ndCBhbGxvdyBtb2RpZmljYXRpb24gb2YgaXRzIHJlZmVyZW50LCBhbmQgYGBpbnQqCiAgIGNvbnN0YGAgaXMgYSBgYGNvbnN0YGAgKm11dGFibGUgaXRlcmF0b3IqLCB3aGljaCBjYW5ub3QgYmUKICAgbW9kaWZpZWQgYnV0IHdoaWNoIGFsbG93cyBtb2RpZmljYXRpb24gb2YgaXRzIHJlZmVyZW50LgoKICAgQ29uZnVzaW5nPyAgV2UgYWdyZWUsIGJ1dCB0aG9zZSBhcmUgdGhlIHN0YW5kYXJkIHRlcm1zLiAgSXQKICAgcHJvYmFibHkgZG9lc24ndCBoZWxwIG11Y2ggdGhhdCBhIGNvbnRhaW5lcidzIGNvbnN0YW50IGl0ZXJhdG9yCiAgIGlzIGNhbGxlZCBgYGNvbnN0X2l0ZXJhdG9yYGAuCgpOb3csIG91ciBgYG5vZGVfaXRlcmF0b3JgYCBnaXZlcyBjbGllbnRzIGFjY2VzcyB0byBib3RoIGBgbm9kZWBgXAoncyBgYHByaW50KHN0ZDo6b3N0cmVhbSYpIGNvbnN0YGAgbWVtYmVyIGZ1bmN0aW9uLCBidXQgYWxzbyBpdHMKbXV0YXRpbmcgYGBkb3VibGVfbWUoKWBgIG1lbWJlci4gIElmIHdlIHdhbnRlZCB0byBidWlsZCBhCipjb25zdGFudCogYGBub2RlX2l0ZXJhdG9yYGAsIHdlJ2Qgb25seSBoYXZlIHRvIG1ha2UgdGhyZWUKY2hhbmdlczoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgY2xhc3MgY29uc3Rfbm9kZV9pdGVyYXRvcgogICAgOiBwdWJsaWMgYm9vc3Q6Oml0ZXJhdG9yX2ZhY2FkZTwKICAgICAgICAgIGNvbnN0X25vZGVfaXRlcmF0b3IKICAgICAgICAsIG5vZGVfYmFzZSAqKmNvbnN0KioKICAgICAgICAsIGJvb3N0Ojpmb3J3YXJkX3RyYXZlcnNhbF90YWcKICAgICAgPgogIHsKICAgcHVibGljOgogICAgICBjb25zdF9ub2RlX2l0ZXJhdG9yKCkKICAgICAgICA6IG1fbm9kZSgwKSB7fQoKICAgICAgZXhwbGljaXQgY29uc3Rfbm9kZV9pdGVyYXRvcihub2RlX2Jhc2UqIHApCiAgICAgICAgOiBtX25vZGUocCkge30KCiAgIHByaXZhdGU6CiAgICAgIGZyaWVuZCBjbGFzcyBib29zdDo6aXRlcmF0b3JfY29yZV9hY2Nlc3M7CgogICAgICB2b2lkIGluY3JlbWVudCgpIHsgbV9ub2RlID0gbV9ub2RlLT5uZXh0KCk7IH0KCiAgICAgIGJvb2wgZXF1YWwoY29uc3Rfbm9kZV9pdGVyYXRvciBjb25zdCYgb3RoZXIpIGNvbnN0CiAgICAgIHsKICAgICAgICAgIHJldHVybiB0aGlzLT5tX25vZGUgPT0gb3RoZXIubV9ub2RlOwogICAgICB9CgogICAgICBub2RlX2Jhc2UgKipjb25zdCoqXCAmIGRlcmVmZXJlbmNlKCkgY29uc3QgeyByZXR1cm4gXCptX25vZGU7IH0KCiAgICAgIG5vZGVfYmFzZSAqKmNvbnN0KipcICogbV9ub2RlOwogIH07CgouLiBTaWRlYmFyOjogYGBjb25zdGBgIGFuZCBhbiBpdGVyYXRvcidzIGBgdmFsdWVfdHlwZWBgCgogICBUaGUgQysrIHN0YW5kYXJkIHJlcXVpcmVzIGFuIGl0ZXJhdG9yJ3MgYGB2YWx1ZV90eXBlYGAgKm5vdCogYmUKICAgYGBjb25zdGBgXCAtcXVhbGlmaWVkLCBzbyBgYGl0ZXJhdG9yX2ZhY2FkZWBgIHN0cmlwcyB0aGUKICAgYGBjb25zdGBgIGZyb20gaXRzIGBgVmFsdWVgYCBwYXJhbWV0ZXIgaW4gb3JkZXIgdG8gcHJvZHVjZSB0aGUKICAgaXRlcmF0b3IncyBgYHZhbHVlX3R5cGVgYC4gIE1ha2luZyB0aGUgYGBWYWx1ZWBgIGFyZ3VtZW50CiAgIGBgY29uc3RgYCBwcm92aWRlcyBhIHVzZWZ1bCBoaW50IHRvIGBgaXRlcmF0b3JfZmFjYWRlYGAgdGhhdCB0aGUKICAgaXRlcmF0b3IgaXMgYSAqY29uc3RhbnQgaXRlcmF0b3IqLCBhbmQgdGhlIGRlZmF1bHQgYGBSZWZlcmVuY2VgYAogICBhcmd1bWVudCB3aWxsIGJlIGNvcnJlY3QgZm9yIGFsbCBsdmFsdWUgaXRlcmF0b3JzLgoKQXMgYSBtYXR0ZXIgb2YgZmFjdCwgYGBub2RlX2l0ZXJhdG9yYGAgYW5kIGBgY29uc3Rfbm9kZV9pdGVyYXRvcmBgCmFyZSBzbyBzaW1pbGFyIHRoYXQgaXQgbWFrZXMgc2Vuc2UgdG8gZmFjdG9yIHRoZSBjb21tb24gY29kZSBvdXQKaW50byBhIHRlbXBsYXRlIGFzIGZvbGxvd3M6OgoKICB0ZW1wbGF0ZSA8Y2xhc3MgVmFsdWU+CiAgY2xhc3Mgbm9kZV9pdGVyCiAgICA6IHB1YmxpYyBib29zdDo6aXRlcmF0b3JfZmFjYWRlPAogICAgICAgICAgbm9kZV9pdGVyPFZhbHVlPgogICAgICAgICwgVmFsdWUKICAgICAgICAsIGJvb3N0Ojpmb3J3YXJkX3RyYXZlcnNhbF90YWcKICAgICAgPgogIHsKICAgcHVibGljOgogICAgICBub2RlX2l0ZXIoKQogICAgICAgIDogbV9ub2RlKDApIHt9CgogICAgICBleHBsaWNpdCBub2RlX2l0ZXIoVmFsdWUqIHApCiAgICAgICAgOiBtX25vZGUocCkge30KCiAgIHByaXZhdGU6CiAgICAgIGZyaWVuZCBjbGFzcyBib29zdDo6aXRlcmF0b3JfY29yZV9hY2Nlc3M7CgogICAgICBib29sIGVxdWFsKG5vZGVfaXRlcjxWYWx1ZT4gY29uc3QmIG90aGVyKSBjb25zdAogICAgICB7CiAgICAgICAgICByZXR1cm4gdGhpcy0+bV9ub2RlID09IG90aGVyLm1fbm9kZTsKICAgICAgfQoKICAgICAgdm9pZCBpbmNyZW1lbnQoKQogICAgICB7IG1fbm9kZSA9IG1fbm9kZS0+bmV4dCgpOyB9CgogICAgICBWYWx1ZSYgZGVyZWZlcmVuY2UoKSBjb25zdAogICAgICB7IHJldHVybiAqbV9ub2RlOyB9CgogICAgICBWYWx1ZSogbV9ub2RlOwogIH07CiAgdHlwZWRlZiBub2RlX2l0ZXI8bm9kZV9iYXNlPiBub2RlX2l0ZXJhdG9yOwogIHR5cGVkZWYgbm9kZV9pdGVyPG5vZGVfYmFzZSBjb25zdD4gbm9kZV9jb25zdF9pdGVyYXRvcjsKCgpJbnRlcm9wZXJhYmlsaXR5Ci0tLS0tLS0tLS0tLS0tLS0KCk91ciBgYGNvbnN0X25vZGVfaXRlcmF0b3JgYCB3b3JrcyBwZXJmZWN0bHkgd2VsbCBvbiBpdHMgb3duLCBidXQKdGFrZW4gdG9nZXRoZXIgd2l0aCBgYG5vZGVfaXRlcmF0b3JgYCBpdCBkb2Vzbid0IHF1aXRlIG1lZXQKZXhwZWN0YXRpb25zLiAgRm9yIGV4YW1wbGUsIHdlJ2QgbGlrZSB0byBiZSBhYmxlIHRvIHBhc3MgYQpgYG5vZGVfaXRlcmF0b3JgYCB3aGVyZSBhIGBgbm9kZV9jb25zdF9pdGVyYXRvcmBgIHdhcyBleHBlY3RlZCwKanVzdCBhcyB5b3UgY2FuIHdpdGggYGBzdGQ6Omxpc3Q8aW50PmBgXCAncyBgYGl0ZXJhdG9yYGAgYW5kCmBgY29uc3RfaXRlcmF0b3JgYC4gIEZ1cnRoZXJtb3JlLCBnaXZlbiBhIGBgbm9kZV9pdGVyYXRvcmBgIGFuZCBhCmBgbm9kZV9jb25zdF9pdGVyYXRvcmBgIGludG8gdGhlIHNhbWUgbGlzdCwgd2Ugc2hvdWxkIGJlIGFibGUgdG8KY29tcGFyZSB0aGVtIGZvciBlcXVhbGl0eS4KClRoaXMgZXhwZWN0ZWQgYWJpbGl0eSB0byB1c2UgdHdvIGRpZmZlcmVudCBpdGVyYXRvciB0eXBlcyB0b2dldGhlcgppcyBrbm93biBhcyB8aW50ZXJvcGVyYWJpbGl0eXxfLiAgQWNoaWV2aW5nIGludGVyb3BlcmFiaWxpdHkgaW4Kb3VyIGNhc2UgaXMgYXMgc2ltcGxlIGFzIHRlbXBsYXRpemluZyB0aGUgYGBlcXVhbGBgIGZ1bmN0aW9uIGFuZAphZGRpbmcgYSB0ZW1wbGF0aXplZCBjb252ZXJ0aW5nIGNvbnN0cnVjdG9yIFsjYnJva2VuXV8gWyNyYW5kb21dXzo6CgogIHRlbXBsYXRlIDxjbGFzcyBWYWx1ZT4KICBjbGFzcyBub2RlX2l0ZXIKICAgIDogcHVibGljIGJvb3N0OjppdGVyYXRvcl9mYWNhZGU8CiAgICAgICAgICBub2RlX2l0ZXI8VmFsdWU+CiAgICAgICAgLCBWYWx1ZQogICAgICAgICwgYm9vc3Q6OmZvcndhcmRfdHJhdmVyc2FsX3RhZwogICAgICA+CiAgewogICBwdWJsaWM6CiAgICAgIG5vZGVfaXRlcigpCiAgICAgICAgOiBtX25vZGUoMCkge30KCiAgICAgIGV4cGxpY2l0IG5vZGVfaXRlcihWYWx1ZSogcCkKICAgICAgICA6IG1fbm9kZShwKSB7fQoKICAgICAgdGVtcGxhdGUgPGNsYXNzIE90aGVyVmFsdWU+CiAgICAgIG5vZGVfaXRlcihub2RlX2l0ZXI8T3RoZXJWYWx1ZT4gY29uc3QmIG90aGVyKQogICAgICAgIDogbV9ub2RlKG90aGVyLm1fbm9kZSkge30KCiAgIHByaXZhdGU6CiAgICAgIGZyaWVuZCBjbGFzcyBib29zdDo6aXRlcmF0b3JfY29yZV9hY2Nlc3M7CiAgICAgIHRlbXBsYXRlIDxjbGFzcz4gZnJpZW5kIGNsYXNzIG5vZGVfaXRlcjsKCiAgICAgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclZhbHVlPgogICAgICBib29sIGVxdWFsKG5vZGVfaXRlcjxPdGhlclZhbHVlPiBjb25zdCYgb3RoZXIpIGNvbnN0CiAgICAgIHsgCiAgICAgICAgICByZXR1cm4gdGhpcy0+bV9ub2RlID09IG90aGVyLm1fbm9kZTsKICAgICAgfQoKICAgICAgdm9pZCBpbmNyZW1lbnQoKQogICAgICB7IG1fbm9kZSA9IG1fbm9kZS0+bmV4dCgpOyB9CgogICAgICBWYWx1ZSYgZGVyZWZlcmVuY2UoKSBjb25zdAogICAgICB7IHJldHVybiAqbV9ub2RlOyB9CgogICAgICBWYWx1ZSogbV9ub2RlOwogIH07CiAgdHlwZWRlZiBpbXBsOjpub2RlX2l0ZXJhdG9yPG5vZGVfYmFzZT4gbm9kZV9pdGVyYXRvcjsKICB0eXBlZGVmIGltcGw6Om5vZGVfaXRlcmF0b3I8bm9kZV9iYXNlIGNvbnN0PiBub2RlX2NvbnN0X2l0ZXJhdG9yOwoKLi4gfGludGVyb3BlcmFiaWxpdHl8IHJlcGxhY2U6OiAqKmludGVyb3BlcmFiaWxpdHkqKgouLiBfaW50ZXJvcGVyYWJpbGl0eTogbmV3LWl0ZXItY29uY2VwdHMuaHRtbCNpbnRlcm9wZXJhYmxlLWl0ZXJhdG9ycy1saWItaW50ZXJvcGVyYWJsZS1pdGVyYXRvcnMKCi4uIFsjYnJva2VuXSBJZiB5b3UncmUgdXNpbmcgYW4gb2xkZXIgY29tcGlsZXIgYW5kIGl0IGNhbid0IGhhbmRsZQogICB0aGlzIGV4YW1wbGUsIHNlZSB0aGUgYGV4YW1wbGUgY29kZWBfXyBmb3Igd29ya2Fyb3VuZHMuCgouLiBbI3JhbmRvbV0gSWYgYGBub2RlX2l0ZXJhdG9yYGAgaGFkIGJlZW4gYSBgcmFuZG9tIGFjY2VzcwogICB0cmF2ZXJzYWwgaXRlcmF0b3JgXywgd2UnZCBoYXZlIGhhZCB0byB0ZW1wbGF0aXplIGl0cwogICBgYGRpc3RhbmNlX3RvYGAgZnVuY3Rpb24gYXMgd2VsbC4KCgpfXyAuLi9leGFtcGxlL25vZGVfaXRlcmF0b3IyLmhwcAoKWW91IGNhbiBzZWUgYW4gZXhhbXBsZSBwcm9ncmFtIHdoaWNoIGV4ZXJjaXNlcyBvdXIgaW50ZXJvcGVyYWJsZQppdGVyYXRvcnMgYGhlcmVgX18uCgpfXyAuLi9leGFtcGxlL25vZGVfaXRlcmF0b3IyLmNwcAoKVGVsbGluZyB0aGUgVHJ1dGgKLS0tLS0tLS0tLS0tLS0tLS0KCk5vdyBgYG5vZGVfaXRlcmF0b3JgYCBhbmQgYGBub2RlX2NvbnN0X2l0ZXJhdG9yYGAgYmVoYXZlIGV4YWN0bHkgYXMKeW91J2QgZXhwZWN0Li4uIGFsbW9zdC4gIFdlIGNhbiBjb21wYXJlIHRoZW0gYW5kIHdlIGNhbiBjb252ZXJ0IGluCm9uZSBkaXJlY3Rpb246IGZyb20gYGBub2RlX2l0ZXJhdG9yYGAgdG8gYGBub2RlX2NvbnN0X2l0ZXJhdG9yYGAuCklmIHdlIHRyeSB0byBjb252ZXJ0IGZyb20gYGBub2RlX2NvbnN0X2l0ZXJhdG9yYGAgdG8KYGBub2RlX2l0ZXJhdG9yYGAsIHdlJ2xsIGdldCBhbiBlcnJvciB3aGVuIHRoZSBjb252ZXJ0aW5nCmNvbnN0cnVjdG9yIHRyaWVzIHRvIGluaXRpYWxpemUgYGBub2RlX2l0ZXJhdG9yYGBcICdzIGBgbV9ub2RlYGAsIGEKYGBub2RlKmBgIHdpdGggYSBgYG5vZGUgY29uc3QqYGAuICBTbyB3aGF0J3MgdGhlIHByb2JsZW0/CgpUaGUgcHJvYmxlbSBpcyB0aGF0CmBgYm9vc3Q6OmBgXCB8aXNfY29udmVydGlibGV8X1wgYGA8bm9kZV9jb25zdF9pdGVyYXRvcixub2RlX2l0ZXJhdG9yPjo6dmFsdWVgYAp3aWxsIGJlIGBgdHJ1ZWBgLCBidXQgaXQgc2hvdWxkIGJlIGBgZmFsc2VgYC4gIHxpc19jb252ZXJ0aWJsZXxfCmxpZXMgYmVjYXVzZSBpdCBjYW4gb25seSBzZWUgYXMgZmFyIGFzIHRoZSAqZGVjbGFyYXRpb24qIG9mCmBgbm9kZV9pdGVyYGBcICdzIGNvbnZlcnRpbmcgY29uc3RydWN0b3IsIGJ1dCBjYW4ndCBsb29rIGluc2lkZSBhdAp0aGUgKmRlZmluaXRpb24qIHRvIG1ha2Ugc3VyZSBpdCB3aWxsIGNvbXBpbGUuICBBIHBlcmZlY3Qgc29sdXRpb24Kd291bGQgbWFrZSBgYG5vZGVfaXRlcmBgXCAncyBjb252ZXJ0aW5nIGNvbnN0cnVjdG9yIGRpc2FwcGVhciB3aGVuCnRoZSBgYG1fbm9kZWBgIGNvbnZlcnNpb24gd291bGQgZmFpbC4KCi4uIHxpc19jb252ZXJ0aWJsZXwgcmVwbGFjZTo6IGBgaXNfY29udmVydGlibGVgYAouLiBfaXNfY29udmVydGlibGU6ICAuLi8uLi90eXBlX3RyYWl0cy9pbmRleC5odG1sI3JlbGF0aW9uc2hpcHMKCkluIGZhY3QsIHRoYXQgc29ydCBvZiBtYWdpYyBpcyBwb3NzaWJsZSB1c2luZwp8ZW5hYmxlX2lmfF9fLiAgQnkgcmV3cml0aW5nIHRoZSBjb252ZXJ0aW5nIGNvbnN0cnVjdG9yIGFzCmZvbGxvd3MsIHdlIGNhbiByZW1vdmUgaXQgZnJvbSB0aGUgb3ZlcmxvYWQgc2V0IHdoZW4gaXQncyBub3QKYXBwcm9wcmlhdGU6OgoKICAjaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaXNfY29udmVydGlibGUuaHBwPgogICNpbmNsdWRlIDxib29zdC91dGlsaXR5L2VuYWJsZV9pZi5ocHA+CgogICAgLi4uCgogIHByaXZhdGU6IAogICAgc3RydWN0IGVuYWJsZXIge307CgogIHB1YmxpYzoKICAgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclZhbHVlPgogICAgbm9kZV9pdGVyKAogICAgICAgIG5vZGVfaXRlcjxPdGhlclZhbHVlPiBjb25zdCYgb3RoZXIKICAgICAgLCB0eXBlbmFtZSBib29zdDo6ZW5hYmxlX2lmPAogICAgICAgICAgICBib29zdDo6aXNfY29udmVydGlibGU8T3RoZXJWYWx1ZSosVmFsdWUqPgogICAgICAgICAgLCBlbmFibGVyCiAgICAgICAgPjo6dHlwZSA9IGVuYWJsZXIoKQogICAgKQogICAgICA6IG1fbm9kZShvdGhlci5tX25vZGUpIHt9CgouLiB8ZW5hYmxlX2lmfCByZXBsYWNlOjogYGBib29zdDo6ZW5hYmxlX2lmYGAKX18gLi4vLi4vdXRpbGl0eS9lbmFibGVfaWYuaHRtbAoKCldyYXAgVXAKLS0tLS0tLQoKVGhpcyBjb25jbHVkZXMgb3VyIGBgaXRlcmF0b3JfZmFjYWRlYGAgdHV0b3JpYWwsIGJ1dCBiZWZvcmUgeW91CnN0b3AgcmVhZGluZyB3ZSB1cmdlIHlvdSB0byB0YWtlIGEgbG9vayBhdCB8aXRlcmF0b3JfYWRhcHRvcnxfXy4KVGhlcmUncyBhbm90aGVyIHdheSB0byBhcHByb2FjaCB3cml0aW5nIHRoZXNlIGl0ZXJhdG9ycyB3aGljaCBtaWdodApldmVuIGJlIHN1cGVyaW9yLgoKLi4gfGl0ZXJhdG9yX2FkYXB0b3J8IHJlcGxhY2U6OiBgYGl0ZXJhdG9yX2FkYXB0b3JgYApfXyBpdGVyYXRvcl9hZGFwdG9yLmh0bWwKCi4uIF9gaXRlcmF0b3IgdHJhdmVyc2FsIGNvbmNlcHRgOiBuZXctaXRlci1jb25jZXB0cy5odG1sI2l0ZXJhdG9yLXRyYXZlcnNhbC1jb25jZXB0cy1saWItaXRlcmF0b3ItdHJhdmVyc2FsCi4uIF9gcmVhZGFibGUgaXRlcmF0b3JgOiBuZXctaXRlci1jb25jZXB0cy5odG1sI3JlYWRhYmxlLWl0ZXJhdG9ycy1saWItcmVhZGFibGUtaXRlcmF0b3JzCi4uIF9gbHZhbHVlIGl0ZXJhdG9yYDogbmV3LWl0ZXItY29uY2VwdHMuaHRtbCNsdmFsdWUtaXRlcmF0b3JzLWxpYi1sdmFsdWUtaXRlcmF0b3JzCi4uIF9gc2luZ2xlIHBhc3MgaXRlcmF0b3JgOiBuZXctaXRlci1jb25jZXB0cy5odG1sI3NpbmdsZS1wYXNzLWl0ZXJhdG9ycy1saWItc2luZ2xlLXBhc3MtaXRlcmF0b3JzCi4uIF9gaW5jcmVtZW50YWJsZSBpdGVyYXRvcmA6IG5ldy1pdGVyLWNvbmNlcHRzLmh0bWwjaW5jcmVtZW50YWJsZS1pdGVyYXRvcnMtbGliLWluY3JlbWVudGFibGUtaXRlcmF0b3JzCi4uIF9gZm9yd2FyZCB0cmF2ZXJzYWwgaXRlcmF0b3JgOiBuZXctaXRlci1jb25jZXB0cy5odG1sI2ZvcndhcmQtdHJhdmVyc2FsLWl0ZXJhdG9ycy1saWItZm9yd2FyZC10cmF2ZXJzYWwtaXRlcmF0b3JzCi4uIF9gYmlkaXJlY3Rpb25hbCB0cmF2ZXJzYWwgaXRlcmF0b3JgOiBuZXctaXRlci1jb25jZXB0cy5odG1sI2JpZGlyZWN0aW9uYWwtdHJhdmVyc2FsLWl0ZXJhdG9ycy1saWItYmlkaXJlY3Rpb25hbC10cmF2ZXJzYWwtaXRlcmF0b3JzCi4uIF9gcmFuZG9tIGFjY2VzcyB0cmF2ZXJzYWwgaXRlcmF0b3JgOiBuZXctaXRlci1jb25jZXB0cy5odG1sI3JhbmRvbS1hY2Nlc3MtdHJhdmVyc2FsLWl0ZXJhdG9ycy1saWItcmFuZG9tLWFjY2Vzcy10cmF2ZXJzYWwtaXRlcmF0b3JzCgo=