Ly89PT0tLS0gY3Rsb2NrLmNjIC0gQ29tbW9uIHRocmVhZHMgaW1wbGVtZW50YXRpb24gb2YgbG9ja3MgLS0tLS0tLS0tLS0tLS0tPT09Ly8KLy8KLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTWljcm8gVmlydHVhbCBNYWNoaW5lCi8vCi8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAKLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgovLwovLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwoKI2luY2x1ZGUgIm12bS9UaHJlYWRzL0NvbmQuaCIKI2luY2x1ZGUgIm12bS9UaHJlYWRzL0xvY2tzLmgiCiNpbmNsdWRlICJtdm0vVGhyZWFkcy9UaHJlYWQuaCIKI2luY2x1ZGUgImN0ZXJyb3IuaCIKI2luY2x1ZGUgPHN5cy90aW1lLmg+CgoKdXNpbmcgbmFtZXNwYWNlIG12bTsKCmlubGluZSBpbnQgYXRvbWljX3Rlc3RfYW5kX3Bhc3ModW5zaWduZWQgaW50ICpwdHIpIHsKCiNpZiBkZWZpbmVkKF9fcHBjX18pIHx8IGRlZmluZWQoX19wb3dlcnBjX18pCiAgaW50IHJlc3VsdDsKIyBpZiBkZWZpbmVkKF9fTUFDSF9fKQogIGNvbnN0IGludCB2YWw9MTsKCiAgYXNtIHZvbGF0aWxlKCIxOlxuIgojaWYgMAogICAgICAiICBsd3ogICAgJTAsMCglMSlcbiIgIC8qIHJlc3VsdCA8LSBwdHJbMF0gKi8KICAgICAgIiAgY21wd2kgICUwLDBcbiIKICAgICAgIiAgYm5lICAgIDFiXG4iCiNlbmRpZgogICAgICAiICBsd2FyeCAgJTAsMCwlMVxuIiAgIC8qIHJlc3VsdCA8LSBwdHJbMF0gKi8KICAgICAgIiAgY21wd2kgICUwLDBcbiIKICAgICAgIiAgYm5lICAgIDFiXG4iCiAgICAgICIgIHN0d2N4LiAlMiwwLCUxXG4iICAvKiBwdHJbMF0gPC0gMSAoc2kgcGFzIGQnYXV0cmUgYWNj6HMpICovCiAgICAgICIgIGJuZS0gICAxYlxuIgogICAgICAiICBpc3luY1xuIiAgICAgICAgICAgLyogZW1wZWNoZSB0b3V0ZSBleGVjdXRpb24gZCdpbnN0cnVjdGlvbiBhcHLocyBsZSBsb2NrISEhICovCiAgICAgIDoiPSZyIihyZXN1bHQpOiAiciIocHRyKSwgInIiKHZhbCk6ICJjcjAiLCAibWVtb3J5Iik7CiAgLyogbGUgJiBlbXBlY2hlIGdjYyBkJ3V0aWxpc2VyIGxlIG3qbWUgcmVnaXN0ZXIgcG91ciByZXN1bHQgZXQgbGVzIGVudHLpZXMuLi4gKi8KIyBlbHNlCiAgY29uc3QgaW50IHZhbD0xOwoKICBhc20gdm9sYXRpbGUoIjE6XG4iCiAgICAgICIgIGx3YXJ4ICAlMCwwLCUxXG4iICAgLyogcmVzdWx0IDwtIHB0clswXSAqLwogICAgICAiICBjbXB3aSAgJTAsMFxuIgogICAgICAiICBibmUgICAgMWJcbiIKICAgICAgIiAgc3R3Y3guICUyLDAsJTFcbiIgIC8qIHB0clswXSA8LSAxIChzaSBwYXMgZCdhdXRyZSBhY2PocykgKi8KICAgICAgIiAgYm5lLSAgIDFiXG4iCiAgICAgICIgIGlzeW5jXG4iICAgICAgICAgICAvKiBlbXBlY2hlIHRvdXRlIGV4ZWN1dGlvbiBkJ2luc3RydWN0aW9uIGFwcuhzIGxlIGxvY2shISEgKi8KICAgICAgOiI9JnIiKHJlc3VsdCk6ICJyIihwdHIpLCAiciIodmFsKTogImNyMCIsICJtZW1vcnkiKTsKICAvKiBsZSAmIGVtcGVjaGUgZ2NjIGQndXRpbGlzZXIgbGUgbeptZSByZWdpc3RlciBwb3VyIHJlc3VsdCBldCBsZXMgZW50cullcy4uLiAqLwojIGVuZGlmCgogIHJldHVybiByZXN1bHQ7CiNlbGlmIGRlZmluZWQoX19pMzg2X18pCgkvLyBhc20gKCJidHMgJDEsICUxOyBzYmJsICUwLCAlMCI6Ij1yIiAocmVzdWx0KToibSIgKCpwdHIpOiJtZW1vcnkiKTsKCXVuc2lnbmVkIGludCBvbGQ7CglpbnQgYz0wOwoJZG8gewoJCWFzbSB2b2xhdGlsZSgibW92bCAgICQxLCUwOyIKCQkJCQkJCQkgInhjaGdsICAlMCwgJTEiIDogIj0mciIob2xkKSA6ICJtIigqcHRyKSk7CgkJaWYoIW9sZCkKCQkJcmV0dXJuIDA7CgkJaWYoISgrK2MgJiAweGYpKQoJCQlUaHJlYWQ6OnlpZWxkKCk7Cgl9IHdoaWxlKDEpOwojZWxzZQojZXJyb3IgIkkgZG8gbm90IGtub3cgIGhvdyB0byBkbyBhbiBhdG9taWMgdGVzdCBhbmQgcGFzcyBvbiB5b3VyIG1hY2hpbmUiCiNlbmRpZgp9CgpMb2NrICpMb2NrOjphbGxvY1JlY3Vyc2l2ZSgpIHsKICByZXR1cm4gbmV3IExvY2tSZWN1cnNpdmUoKTsKfQoKTG9jayAqTG9jazo6YWxsb2NOb3JtYWwoKSB7CiAgcmV0dXJuIG5ldyBMb2NrTm9ybWFsKCk7Cn0KCnZvaWQgTG9jazo6ZGVzdHJveShMb2NrICpsKSB7Cn0KCmJvb2wgTG9jazo6c2VsZk93bmVyKExvY2sgKmwpIHsKICByZXR1cm4gbC0+b3duZXIoKSA9PSBUaHJlYWQ6OnNlbGYoKTsKfQoKaW50IExvY2s6OmdldE93bmVyKExvY2sgKmwpIHsKICByZXR1cm4gbC0+b3duZXIoKTsKfQoKdm9pZCBTcGluTG9jazo6c2xvY2soKSB7CiAgYXRvbWljX3Rlc3RfYW5kX3Bhc3MoJnZhbHVlKTsKfQoKdm9pZCBMb2NrTm9ybWFsOjpteV9sb2NrKExvY2sgKmwpIHsKICB1bnNpZ25lZCBpbnQgYyA9IDA7CgogIGwtPnNsb2NrKCk7CgogIHdoaWxlKGwtPm93bmVyKCkpIHsKICAgIGwtPnN1bmxvY2soKTsKICAgIFRocmVhZDo6eWllbGQoJmMpOwogICAgbC0+c2xvY2soKTsKICB9CiAgbC0+b3duZXIoVGhyZWFkOjpzZWxmKCkpOwogIGwtPnN1bmxvY2soKTsKfQoKdm9pZCBMb2NrTm9ybWFsOjpteV91bmxvY2soTG9jayAqbCkgeyAKICBsLT5vd25lcigwKTsgCn0KCmludCBMb2NrTm9ybWFsOjpteV90cnlsb2NrKExvY2sgKikgewogIGN0ZmF0YWwoIm5vdCBpbXBsZW1lbnRlZCIpOwogIHJldHVybiAtMTsKfQoKdm9pZCBMb2NrUmVjdXJzaXZlOjpteV9sb2NrKExvY2sgKmwpIHsKICB1bnNpZ25lZCBpbnQgYyA9IDA7CgogIGludCBzZWxmID0gVGhyZWFkOjpzZWxmKCk7CgogIGwtPnNsb2NrKCk7CiAgd2hpbGUobC0+b3duZXIoKSAmJiAobC0+b3duZXIoKSAhPSBzZWxmKSkgewogICAgbC0+c3VubG9jaygpOwogICAgVGhyZWFkOjp5aWVsZCgmYyk7CiAgICBsLT5zbG9jaygpOwogIH0KICBsLT5vd25lcihzZWxmKTsKICAoKExvY2tSZWN1cnNpdmUgKilsKS0+bisrOwogIGwtPnN1bmxvY2soKTsKfQoKICB2b2lkIExvY2tSZWN1cnNpdmU6Om15X3VubG9jayhMb2NrICpsKSB7IAogICAgaWYoIS0tKChMb2NrUmVjdXJzaXZlICopbCktPm4pCiAgICAgIGwtPm93bmVyKDApOyAKICB9CgppbnQgTG9ja1JlY3Vyc2l2ZTo6bXlfdHJ5bG9jayhMb2NrICopIHsKICBjdGZhdGFsKCJub3QgaW1wbGVtZW50ZWQiKTsKICByZXR1cm4gLTE7Cn0KCmludCBMb2NrUmVjdXJzaXZlOjpyZWN1cnNpb25fY291bnQoTG9jayAqbCl7CiAgcmV0dXJuICgoTG9ja1JlY3Vyc2l2ZSopbCktPm47Cn0KCmludCBMb2NrUmVjdXJzaXZlOjpteV91bmxvY2tfYWxsKExvY2sgKmwpewogIGludCBjb3VudCA9ICgoTG9ja1JlY3Vyc2l2ZSopbCktPm47CiAgKChMb2NrUmVjdXJzaXZlKilsKS0+biA9IDA7CiAgbC0+b3duZXIoMCk7CiAgcmV0dXJuIGNvdW50Owp9Cgp2b2lkIExvY2tSZWN1cnNpdmU6Om15X2xvY2tfYWxsKExvY2sgKmwsIGludCBjb3VudCl7CiAgTG9ja1JlY3Vyc2l2ZTo6bXlfbG9jayhsKTsKICAoKExvY2tSZWN1cnNpdmUqKWwpLT5uID0gY291bnQ7Cn0KCgoKCnZvaWQgQ29uZDo6d2FpdChMb2NrICpsKSB7CiAgdW5zaWduZWQgaW50IG49MDsKICB1bnNpZ25lZCBpbnQgbXlfYmFycmllciA9IG5vX2JhcnJpZXI7CgogIG5fd2FpdCsrOwkJCS8qIHVuIGF0dGVudGUgZGUgcGx1cyAqLwogIHdoaWxlKDEpIHsKICAgIGlmKG5vX2JhcnJpZXIgPT0gbXlfYmFycmllcikJCQkvKiBwYXMgZGUgYnJvYWRjYXN0ICovCiAgICAgIGlmKGdvKSB7CQkJCQkJCQkJCQkJLyogdW4gc2lnbmFsPyAqLwogICAgICAgIG5fd2FpdC0tOwkJCQkJCQkJCQkJLyogcHVzIHVuZSBhdHRlbnRlIGVuIG1vaW5zICovCiAgICAgICAgZ28tLTsJCQkJCQkJCQkJCQkJLyogcG91ciBsZSBwb2NoYWluICovCiAgICAgICAgcmV0dXJuOwogICAgICB9IGVsc2UgewkJCQkJCQkJCQkJCS8qIOAgbCdvdWVzdCByaWVuIGRlIG5vdXZlYXUgKi8KICAgICAgICBsLT51bmxvY2soKTsJCQkJCQkJCQkvKiBqZSByZW5kIGdlbnRpbGxlbWVudCBsZSBsb2NrICovCiAgICAgICAgVGhyZWFkOjp5aWVsZCgmbik7IAkJCQkvKiBqJ2F0dGVuZHMgcXUnb24gbWUgbGli6HJlLi4uICovCiAgICAgICAgbC0+bG9jaygpOwkJCQkJCQkJCQkvKiBqZSByZXByZW5kcyBtb24gbG9jayAqLwogICAgICB9CiAgICAgIGVsc2UJCQkJCQkJCQkJCQkJCQkvKiBvbiBhIGV1IHVuIGJyb2FkY2FzdCAqLwogICAgICAgIHJldHVybjsKICB9Cn0KCmludCBDb25kOjp0aW1lZF93YWl0KExvY2sgKmwsIHN0cnVjdCB0aW1ldmFsICpyZWYpIHsKICB1bnNpZ25lZCBpbnQJCW49MDsKICB1bnNpZ25lZCBpbnQJCW15X2JhcnJpZXIgPSBub19iYXJyaWVyOwogIHN0cnVjdCB0aW1ldmFsCW1heCwgY3VyOwoKICBnZXR0aW1lb2ZkYXkoJm1heCwgMCk7CiAgdGltZXJhZGQoJm1heCwgcmVmLCAmbWF4KTsKCiAgbl93YWl0Kys7CiAgd2hpbGUoMSkgewogICAgaWYobm9fYmFycmllciA9PSBteV9iYXJyaWVyKQkJCS8qIHBhcyBkZSBicm9hZGNhc3QgKi8KICAgICAgaWYoZ28pIHsJCQkJCQkJCQkJCQkvKiB1biBzaWduYWw/ICovCiAgICAgICAgbl93YWl0LS07CQkJCQkJCQkJCQkvKiBwdWlzIHVuZSBhdHRlbnRlIGVuIG1vaW5zICovCiAgICAgICAgZ28tLTsJCQkJCQkJCQkJCQkJLyogcG91ciBsZSBwb2NoYWluICovCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0gZWxzZSB7CQkJCQkJCQkJCQkJLyog4CBsJ291ZXN0IHJpZW4gZGUgbm91dmVhdSAqLwogICAgICAgIGdldHRpbWVvZmRheSgmY3VyLCAwKTsKICAgICAgICBpZih0aW1lcmNtcCgmY3VyLCAmbWF4LCA+PSkpIHsvKiB0aW1lc291dCDpY291bOkgKi8KICAgICAgICAgIG5fd2FpdC0tOwkJCQkJCQkJCQkvKiBvbiBuJ2F0dGVuZCBwbHVzICovCiAgICAgICAgICByZXR1cm4gMTsJCQkJCQkJCQkJLyogYydlc3QgbmlmICovCiAgICAgICAgfQoKICAgICAgICBsLT51bmxvY2soKTsKICAgICAgICB0aW1lcnN1YigmbWF4LCAmY3VyLCAmY3VyKTsJCS8qIGxlIHJlc3RlICovCiAgICAgICAgaWYoIWN1ci50dl9zZWMgJiYgKGN1ci50dl91c2VjIDw9IDIpKQogICAgICAgICAgVGhyZWFkOjp5aWVsZCgpOwkJCQkvKiBqJ2F0dGVuZHMgcXUnb24gbWUgbGli6HJlLi4uICovCiAgICAgICAgZWxzZQogICAgICAgICAgVGhyZWFkOjp5aWVsZCgmbik7CQkJLyogaidhdHRlbmRzIHF1J29uIG1lIGxpYuhyZS4uLiAqLwogICAgICAgIGwtPmxvY2soKTsJCQkJCQkJCQkJLyogamUgcmVwcmVuZHMgbW9uIGxvY2sgKi8KICAgICAgfQogICAgICBlbHNlCQkJCQkJCQkJCQkJCQkJLyogb24gYSBldSB1biBicm9hZGNhc3QgKi8KICAgICAgICByZXR1cm4gMDsKICB9Cn0KCnZvaWQgQ29uZDo6YnJvYWRjYXN0KCkgewogIG5vX2JhcnJpZXIrKzsKICBuX3dhaXQgPSAwOwp9Cgp2b2lkIENvbmQ6OnNpZ25hbCgpIHsKICBpZihuX3dhaXQ+Z28pIGdvKys7Cn0KCgpleHRlcm4gIkMiIHZvaWQgbG9ja19DKExvY2sqIGwpIHsKICByZXR1cm4gbC0+bG9jaygpOwp9CgpleHRlcm4gIkMiIHZvaWQgdW5sb2NrX0MoTG9jayogbCkgewogIHJldHVybiBsLT51bmxvY2soKTsKfQoKQ29uZCogQ29uZDo6YWxsb2NDb25kKCkgewogIHJldHVybiBuZXcgQ29uZCgpOwp9Cg==