LyoKICogJElkOiBkYm94Mi1mbGFzaC5jLHYgMS4xMyAyMDA0LzExLzA0IDEzOjI0OjE0IGdsZWl4bmVyIEV4cCAkCiAqCiAqIEQtQm94IDIgZmxhc2ggZHJpdmVyCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CiNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgoKLyogcGFydGl0aW9uX2luZm8gZ2l2ZXMgZGV0YWlscyBvbiB0aGUgbG9naWNhbCBwYXJ0aXRpb25zIHRoYXQgdGhlIHNwbGl0IHRoZQogKiBzaW5nbGUgZmxhc2ggZGV2aWNlIGludG8uIElmIHRoZSBzaXplIGlmIHplcm8gd2UgdXNlIHVwIHRvIHRoZSBlbmQgb2YgdGhlCiAqIGRldmljZS4gKi8Kc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBhcnRpdGlvbl9pbmZvW109IHsKCXsKCS5uYW1lCQk9ICJCUiBib290bG9hZGVyIiwKCS5zaXplCQk9IDEyOCAqIDEwMjQsIAoJLm9mZnNldAkJPSAwLCAgICAgICAgICAgICAgICAgIAoJLm1hc2tfZmxhZ3MJPSBNVERfV1JJVEVBQkxFCgl9LAoJewoJLm5hbWUJCT0gIkZMRlMgKFUtQm9vdCkiLAoJLnNpemUJCT0gMTI4ICogMTAyNCwgCgkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwgCgkubWFza19mbGFncwk9IDAKCX0sCgl7CgkubmFtZQkJPSAiUm9vdCAoU3F1YXNoRlMpIiwJCgkuc2l6ZQkJPSA3MDQwICogMTAyNCwgCgkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwgCgkubWFza19mbGFncwk9IDAKCX0sCgl7CgkubmFtZQkJPSAidmFyIChKRkZTMikiLAoJLnNpemUJCT0gODk2ICogMTAyNCwgCgkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwgCgkubWFza19mbGFncwk9IDAKCX0sCgl7CgkubmFtZQkJPSAiRmxhc2ggd2l0aG91dCBib290bG9hZGVyIiwJCgkuc2l6ZQkJPSBNVERQQVJUX1NJWl9GVUxMLCAKCS5vZmZzZXQJCT0gMTI4ICogMTAyNCwgCgkubWFza19mbGFncwk9IDAKCX0sCgl7CgkubmFtZQkJPSAiQ29tcGxldGUgRmxhc2giLAkKCS5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsIAoJLm9mZnNldAkJPSAwLCAKCS5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRQoJfQp9OwoKI2RlZmluZSBOVU1fUEFSVElUSU9OUyAoc2l6ZW9mKHBhcnRpdGlvbl9pbmZvKSAvIHNpemVvZihwYXJ0aXRpb25faW5mb1swXSkpCgojZGVmaW5lIFdJTkRPV19BRERSIDB4MTAwMDAwMDAKI2RlZmluZSBXSU5ET1dfU0laRSAweDgwMDAwMAoKc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqbXltdGQ7CgoKc3RydWN0IG1hcF9pbmZvIGRib3gyX2ZsYXNoX21hcCA9IHsKCS5uYW1lCQk9ICJELUJveCAyIGZsYXNoIG1lbW9yeSIsCgkuc2l6ZQkJPSBXSU5ET1dfU0laRSwKCS5iYW5rd2lkdGgJPSA0LAoJLnBoeXMJCT0gV0lORE9XX0FERFIsCn07CgppbnQgX19pbml0IGluaXRfZGJveDJfZmxhc2godm9pZCkKewogICAgICAgCXByaW50ayhLRVJOX05PVElDRSAiRC1Cb3ggMiBmbGFzaCBkcml2ZXIgKHNpemUtPjB4JVggbWVtLT4weCVYKVxuIiwgV0lORE9XX1NJWkUsIFdJTkRPV19BRERSKTsKCWRib3gyX2ZsYXNoX21hcC52aXJ0ID0gaW9yZW1hcChXSU5ET1dfQUREUiwgV0lORE9XX1NJWkUpOwoKCWlmICghZGJveDJfZmxhc2hfbWFwLnZpcnQpIHsKCQlwcmludGsoIkZhaWxlZCB0byBpb3JlbWFwXG4iKTsKCQlyZXR1cm4gLUVJTzsKCX0KCXNpbXBsZV9tYXBfaW5pdCgmZGJveDJfZmxhc2hfbWFwKTsKCgkvLyBQcm9iZSBmb3IgZHVhbCBJbnRlbCAyOEYzMjAgb3IgZHVhbCBBTUQKCW15bXRkID0gZG9fbWFwX3Byb2JlKCJjZmlfcHJvYmUiLCAmZGJveDJfZmxhc2hfbWFwKTsKCWlmICghbXltdGQpIHsKCSAgICAvLyBQcm9iZSBmb3Igc2luZ2xlIEludGVsIDI4RjY0MAoJICAgIGRib3gyX2ZsYXNoX21hcC5iYW5rd2lkdGggPSAyOwoJCgkgICAgbXltdGQgPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICZkYm94Ml9mbGFzaF9tYXApOwoJfQoJICAgIAoJaWYgKG15bXRkKSB7CgkJbXltdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CgogICAgICAgICAgICAgICAgLyogQ3JlYXRlIE1URCBkZXZpY2VzIGZvciBlYWNoIHBhcnRpdGlvbi4gKi8KCSAgICAgICAgYWRkX210ZF9wYXJ0aXRpb25zKG15bXRkLCBwYXJ0aXRpb25faW5mbywgTlVNX1BBUlRJVElPTlMpOwoJCQoJCXJldHVybiAwOwoJfQoKCWlvdW5tYXAoKHZvaWQgKilkYm94Ml9mbGFzaF9tYXAudmlydCk7CglyZXR1cm4gLUVOWElPOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9kYm94Ml9mbGFzaCh2b2lkKQp7CglpZiAobXltdGQpIHsKCQlkZWxfbXRkX3BhcnRpdGlvbnMobXltdGQpOwoJCW1hcF9kZXN0cm95KG15bXRkKTsKCX0KCWlmIChkYm94Ml9mbGFzaF9tYXAudmlydCkgewoJCWlvdW5tYXAoKHZvaWQgKilkYm94Ml9mbGFzaF9tYXAudmlydCk7CgkJZGJveDJfZmxhc2hfbWFwLnZpcnQgPSAwOwoJfQp9Cgptb2R1bGVfaW5pdChpbml0X2Rib3gyX2ZsYXNoKTsKbW9kdWxlX2V4aXQoY2xlYW51cF9kYm94Ml9mbGFzaCk7CgoKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpNT0RVTEVfQVVUSE9SKCJL4XJpIERhdu3wc3NvbiA8a2RAZmxhZ2EuaXM+LCBCYXN0aWFuIEJsYW5rIDx3YWxkaUB0dXhib3gub3JnPiwgQWxleGFuZGVyIFdpbGQgPHdpbGRAdGUtZWxla3Ryb25pay5jb20+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiTVREIG1hcCBkcml2ZXIgZm9yIEQtQm94IDIgYm9hcmQiKTsK