ZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uLy5naXRhdHRyaWJ1dGVzIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vLmdpdGF0dHJpYnV0ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4NGQ3YwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uLy5naXRhdHRyaWJ1dGVzCkBAIC0wLDAgKzEsOTYgQEAKKyogdGV4dD1hdXRvICFlb2wgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLmdpdGF0dHJpYnV0ZXMgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KKworIyBTY3JpcHRpc2ggZm9ybWF0cworKi5iYXQgICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLmJzaCAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQveC1iZWFuc2hlbGwKKyouY2dpICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgorKi5jbWQgICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLmpzICAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvamF2YXNjcmlwdAorKi5waHAgICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3gtcGhwCisqLnBsICAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQveC1wZXJsCisqLnBtICAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQveC1wZXJsCisqLnB5ICAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQveC1weXRob24KKyouc2ggICAgICAgICBlb2w9bGYgc3ZuZW9sPUxGI3RleHQveC1zaAorY29uZmlndXJlICAgIGVvbD1sZiBzdm5lb2w9TEYjdGV4dC94LXNoCisKKyMgSW1hZ2UgZm9ybWF0cworKi5ibXAgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjaW1hZ2UvYm1wCisqLmdpZiAgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCNpbWFnZS9naWYKKyouaWNvICAgICAgICBiaW5hcnkgc3ZuZW9sPXVuc2V0I2ltYWdlL2ljbworKi5qcGVnICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjaW1hZ2UvanBlZworKi5qcGcgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjaW1hZ2UvanBlZworKi5wbmcgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjaW1hZ2UvcG5nCisqLnRpZiAgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCNpbWFnZS90aWZmCisqLnRpZmYgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCNpbWFnZS90aWZmCisqLnN2ZyAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI2ltYWdlL3N2ZyUyQnhtbAorCisjIERhdGEgZm9ybWF0cworKi5wZGYgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjYXBwbGljYXRpb24vcGRmCisqLmF2aSAgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCN2aWRlby9hdmkKKyouZG9jICAgICAgICBiaW5hcnkgc3ZuZW9sPXVuc2V0I2FwcGxpY2F0aW9uL21zd29yZAorKi5kc3AgICAgICAgIHRleHQgc3ZuZW9sPWNybGYjdGV4dC9wbGFpbgorKi5kc3cgICAgICAgIHRleHQgc3ZuZW9sPWNybGYjdGV4dC9wbGFpbgorKi5lcHMgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjYXBwbGljYXRpb24vcG9zdHNjcmlwdAorKi5neiAgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjYXBwbGljYXRpb24vZ3ppcAorKi5tb3YgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjdmlkZW8vcXVpY2t0aW1lCisqLm1wMyAgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCNhdWRpby9tcGVnCisqLnBwdCAgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCNhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludAorKi5wcyAgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjYXBwbGljYXRpb24vcG9zdHNjcmlwdAorKi5wc2QgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjYXBwbGljYXRpb24vcGhvdG9zaG9wCisqLnJkZiAgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCN0ZXh0L3JkZgorKi5yc3MgICAgICAgIHRleHQgc3ZuZW9sPXVuc2V0I3RleHQveG1sCisqLnJ0ZiAgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCN0ZXh0L3J0ZgorKi5zbG4gICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLnN3ZiAgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCNhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaAorKi50Z3ogICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjYXBwbGljYXRpb24vZ3ppcAorKi52Y3Byb2ogICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3htbAorKi52Y3hwcm9qICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3htbAorKi52c3Byb3BzICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3htbAorKi53YXYgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjYXVkaW8vd2F2CisqLnhscyAgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCNhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwKKyouemlwICAgICAgICBiaW5hcnkgc3ZuZW9sPXVuc2V0I2FwcGxpY2F0aW9uL3ppcAorCisjIFRleHQgZm9ybWF0cworLmh0YWNjZXNzICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLmJiayAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQveG1sCisqLmNtYWtlICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KKyouY3NzICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9jc3MKKyouZHRkICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC94bWwKKyouaHRtICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9odG1sCisqLmh0bWwgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvaHRtbAorKi5pbmkgICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLmxvZyAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KKyoubWFrICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgorKi5xYmsgICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLnJzdCAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KKyouc3FsICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC94LXNxbAorKi50eHQgICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLnhodG1sICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQveGh0bWwlMkJ4bWwKKyoueG1sICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC94bWwKKyoueHNkICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC94bWwKKyoueHNsICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC94bWwKKyoueHNsdCAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC94bWwKKyoueHVsICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC94dWwKKyoueW1sICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgorYm9vc3Qtbm8taW5zcGVjdCB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgorQ0hBTkdFUyAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCitDT1BZSU5HICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KK0lOU1RBTEwgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgorSmFtZmlsZSAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCitKYW1yb290ICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KK0phbWZpbGUudjIgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgorSmFtcnVsZXMgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCitNYWtlZmlsZSogICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KK1JFQURNRSAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgorVE9ETyAgICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisKKyMgQ29kZSBmb3JtYXRzCisqLmMgICAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KKyouY3BwICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgorKi5oICAgICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLmhwcCAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KKyouaXBwICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgorKi50cHAgICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLmphbSAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KKyouamF2YSAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vLnRyYXZpcy55bWwgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi8udHJhdmlzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWQ2ZmM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vLnRyYXZpcy55bWwKQEAgLTAsMCArMSwxNjIgQEAKKyMgQ29weXJpZ2h0IDIwMTYgUGV0ZXIgRGltb3YKKyMgQ29weXJpZ2h0IDIwMTcsIDIwMTggSmFtZXMgRS4gS2luZyBJSUkKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly9ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisjCisjIEdlbmVyaWMgVHJhdmlzIENJIGJ1aWxkIHNjcmlwdCBmb3IgYm9vc3RvcmcgcmVwb3NpdG9yaWVzCisjCisjIEluc3RydWN0aW9ucyBmb3IgY3VzdG9taXppbmcgdGhpcyBzY3JpcHQgZm9yIHlvdXIgbGlicmFyeToKKyMgCisjIDEuIEN1c3RvbWl6ZSB0aGUgY29tcGlsZXJzIGFuZCBsYW5ndWFnZSBsZXZlbHMgeW91IHdhbnQuCisjIDIuIElmIHlvdSBoYXZlIG1vdmUgdGhhbiBpbmNsdWRlLywgc3JjLywgdGVzdC8sIGV4YW1wbGUvLCBleGFtcGxlcy8sIG9yCisjICAgIHRvb2xzLyBkaXJlY3RvcmllcywgbW9kaWZ5IHlvdXIgVHJhdmlzIENJIHByb2plY3QgYW5kIGFkZCB0aGUgZW52aXJvbm1lbnQKKyMgICAgdmFyaWFibGUgREVQSU5TVC4gIEZvciBleGFtcGxlIGlmIHlvdXIgYnVpbGQgdXNlcyBjb2RlIGluICJiZW5jaC8iIGFuZAorIyAgICAiZm9nLyIgZGlyZWN0b3JpZXMsIHRoZW4gc2V0IERFUElOU1QgdG8gdGhlIGZvbGxvd2luZzoKKyMgICAgICAgIC0taW5jbHVkZSBiZW5jaCAtLWluY2x1ZGUgZm9nCisjIDMuIElmIHlvdSB3YW50IHRvIGVuYWJsZSBDb3Zlcml0eSBTY2FuLCB5b3UgbmVlZCB0byBwcm92aWRlIHRoZSBlbnZpcm9ubWVudAorIyAgICB2YXJpYWJsZXMgQ09WRVJJVFlfU0NBTl9UT0tFTiBhbmQgQ09WRVJJVFlfU0NBTl9OT1RJRklDQVRJT05fRU1BSUwgaW4KKyMgICAgeW91ciBnaXRodWIgc2V0dGluZ3MuCisjIDQuIEVuYWJsZSBwdWxsIHJlcXVlc3QgYnVpbGRzIGluIHlvdXIgYm9vc3RvcmcvPGxpYnJhcnk+IGFjY291bnQuCisjIDUuIENoYW5nZSB0aGUgZGVmYXVsdCBDKysgdmVyc2lvbiBpbiBjaS90cmF2aXMvKi5zaCAoc2VhcmNoIGZvciBDWFhTVEQpIGlmIG5lZWRlZC4KKyMKKyMgVGhhdCdzIGl0IC0gdGhlIHNjcmlwdHMgd2lsbCBkbyBldmVyeXRoaW5nIGVsc2UgZm9yIHlvdS4KKworc3VkbzogZmFsc2UKK2Rpc3Q6IHRydXN0eQorbGFuZ3VhZ2U6IGNwcAorCitlbnY6CisgIGdsb2JhbDoKKyAgIyBzZWU6IGh0dHA6Ly93d3cuYm9vc3Qub3JnL2J1aWxkL2RvYy9odG1sL2JidjIvb3ZlcnZpZXcvaW52b2NhdGlvbi5odG1sI2JidjIub3ZlcnZpZXcuaW52b2NhdGlvbi5wcm9wZXJ0aWVzCisgICMgdG8gdXNlIHRoZSBkZWZhdWx0IGZvciBhIGdpdmVuIGVudmlyb25tZW50LCBjb21tZW50IGl0IG91dDsgcmVjb21tZW5kIHlvdSBidWlsZCBkZWJ1ZyBhbmQgcmVsZWFzZSBob3dldmVyLi4KKyAgIyAtIEIyX0FERFJFU1NfTU9ERUw9YWRkcmVzcy1tb2RlbD02NCwzMgorICAjIC0gQjJfTElOSz1saW5rPXNoYXJlZCxzdGF0aWMKKyAgIyAtIEIyX1RIUkVBRElORz10aHJlYWRpbmc9bXVsdGksc2luZ2xlCisgICAgLSBCMl9WQVJJQU5UPXZhcmlhbnQ9cmVsZWFzZSxkZWJ1ZworCitpbnN0YWxsOgorICAtIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vamVraW5nMy9ib29zdC1jaS5naXQgYm9vc3QtY2kKKyAgLSBjcCAtcHIgYm9vc3QtY2kvY2kgYm9vc3QtY2kvLmNvZGVjb3YueW1sIC4KKyAgLSBzb3VyY2UgY2kvdHJhdmlzL2luc3RhbGwuc2gKKworYWRkb25zOgorICBhcHQ6CisgICAgcGFja2FnZXM6CisgICAgICAtIGJpbnV0aWxzLWdvbGQKKyAgICAgIC0gZ2RiCisgICAgICAtIGxpYmM2LWRiZworICAgICAgICAKK2JyYW5jaGVzOgorICBvbmx5OgorICAgIC0gZGV2ZWxvcAorICAgIC0gbWFzdGVyCisgICAgCitzY3JpcHQ6CisgIC0gY2QgJEJPT1NUX1JPT1QvbGlicy8kU0VMRgorICAtIGNpL3RyYXZpcy9idWlsZC5zaAorCitqb2JzOgorICBpbmNsdWRlOgorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIEpvYnMgdG8gcnVuIG9uIGV2ZXJ5IHB1bGwgcmVxdWVzdCAjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgIC0gb3M6IGxpbnV4CisgICAgICBlbnY6IAorICAgICAgICAtIENPTU1FTlQ9IkMrKzAzIgorICAgICAgICAtIFRPT0xTRVQ9Z2NjLGdjYy03LGNsYW5nCisgICAgICBhZGRvbnM6CisgICAgICAgIGFwdDoKKyAgICAgICAgICBwYWNrYWdlczoKKyAgICAgICAgICAgIC0gZysrLTcKKyAgICAgICAgICBzb3VyY2VzOgorICAgICAgICAgICAgLSB1YnVudHUtdG9vbGNoYWluLXItdGVzdAorICAgIC0gb3M6IGxpbnV4CisgICAgICBlbnY6IAorICAgICAgICAtIENPTU1FTlQ9IkMrKzExIgorICAgICAgICAtIFRPT0xTRVQ9Z2NjLGdjYy03LGNsYW5nCisgICAgICAgIC0gQ1hYU1REPTExCisgICAgICBhZGRvbnM6CisgICAgICAgIGFwdDoKKyAgICAgICAgICBwYWNrYWdlczoKKyAgICAgICAgICAgIC0gZysrLTcKKyAgICAgICAgICBzb3VyY2VzOgorICAgICAgICAgICAgLSB1YnVudHUtdG9vbGNoYWluLXItdGVzdAorICAgIC0gb3M6IGxpbnV4CisgICAgICBlbnY6IAorICAgICAgICAtIENPTU1FTlQ9dmFsZ3JpbmQKKyAgICAgICAgLSBUT09MU0VUPWNsYW5nIAorICAgICAgICAtIEIyX1ZBUklBTlQ9dmFyaWFudD1kZWJ1ZworICAgICAgICAtIFRFU1RGTEFHUz10ZXN0aW5nLmxhdW5jaGVyPXZhbGdyaW5kCisgICAgICAgIC0gVkFMR1JJTkRfT1BUUz0tLWVycm9yLWV4aXRjb2RlPTEKKyAgICAgIGFkZG9uczoKKyAgICAgICAgYXB0OgorICAgICAgICAgIHBhY2thZ2VzOgorICAgICAgICAgICAgLSBjbGFuZy01LjAKKyAgICAgICAgICAgIC0gbGlic3RkYysrLTctZGV2CisgICAgICAgICAgICAtIHZhbGdyaW5kCisgICAgICAgICAgc291cmNlczoKKyAgICAgICAgICAgIC0gbGx2bS10b29sY2hhaW4tdHJ1c3R5LTUuMAorICAgICAgICAgICAgLSB1YnVudHUtdG9vbGNoYWluLXItdGVzdAorCisgICAgLSBvczogbGludXgKKyAgICAgIGVudjoKKyAgICAgICAgLSBDT01NRU5UPWNwcGNoZWNrCisgICAgICBzY3JpcHQ6CisgICAgICAgIC0gY2QgJEJPT1NUX1JPT1QvbGlicy8kU0VMRgorICAgICAgICAtIGNpL3RyYXZpcy9jcHBjaGVjay5zaAorCisgICAgLSBvczogbGludXgKKyAgICAgIGVudjoKKyAgICAgICAgLSBDT01NRU5UPVVCU0FOCisgICAgICAgIC0gQjJfVkFSSUFOVD12YXJpYW50PWRlYnVnCisgICAgICAgIC0gVE9PTFNFVD1nY2MtNworICAgICAgICAtIENYWEZMQUdTPSJjeHhmbGFncz0tZm5vLW9taXQtZnJhbWUtcG9pbnRlciBjeHhmbGFncz0tZnNhbml0aXplPXVuZGVmaW5lZCBjeHhmbGFncz0tZm5vLXNhbml0aXplLXJlY292ZXI9dW5kZWZpbmVkIgorICAgICAgICAtIExJTktGTEFHUz0ibGlua2ZsYWdzPS1mc2FuaXRpemU9dW5kZWZpbmVkIGxpbmtmbGFncz0tZm5vLXNhbml0aXplLXJlY292ZXI9dW5kZWZpbmVkIGxpbmtmbGFncz0tZnVzZS1sZD1nb2xkIgorICAgICAgICAtIFVCU0FOX09QVElPTlM9cHJpbnRfc3RhY2t0cmFjZT0xCisgICAgICBhZGRvbnM6CisgICAgICAgIGFwdDoKKyAgICAgICAgICBwYWNrYWdlczoKKyAgICAgICAgICAgIC0gZysrLTcKKyAgICAgICAgICBzb3VyY2VzOgorICAgICAgICAgICAgLSB1YnVudHUtdG9vbGNoYWluLXItdGVzdAorCisgICAgLSBvczogbGludXgKKyAgICAgIGVudjogCisgICAgICAgIC0gQ09NTUVOVD1Db2RlQ292CisgICAgICAgIC0gVE9PTFNFVD1nY2MtNworICAgICAgYWRkb25zOgorICAgICAgICBhcHQ6CisgICAgICAgICAgcGFja2FnZXM6CisgICAgICAgICAgICAtIGdjYy03CisgICAgICAgICAgICAtIGcrKy03CisgICAgICAgICAgc291cmNlczoKKyAgICAgICAgICAgIC0gdWJ1bnR1LXRvb2xjaGFpbi1yLXRlc3QKKyAgICAgIHNjcmlwdDoKKyAgICAgICAgLSBwdXNoZCAvdG1wICYmIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vbGludXgtdGVzdC1wcm9qZWN0L2xjb3YuZ2l0ICYmIGV4cG9ydCBQQVRIPS90bXAvbGNvdi9iaW46JFBBVEggJiYgd2hpY2ggbGNvdiAmJiBsY292IC0tdmVyc2lvbiAmJiBwb3BkCisgICAgICAgIC0gY2QgJEJPT1NUX1JPT1QvbGlicy8kU0VMRgorICAgICAgICAtIGNpL3RyYXZpcy9jb2RlY292LnNoCisKKyAgIyBkb2VzIG5vdCB3b3JrIHdpdGggc291cmNlcyBpbnN0YWxsIHNoZWxsIHlldDogc2VlIAorICAjIGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9qZWtpbmczL3Rva2VuaXplci9qb2JzLzM4NDkwMzE4OQorICAjIGZvciBhIHR5cGljYWwgZmFpbHVyZQorICAjIC0gb3M6IG9zeAorICAjICAgb3N4X2ltYWdlOiB4Y29kZTkKKyAgIyAgIGVudjoKKyAgIyAgICAgLSBUT09MU0VUPWNsYW5nCisgICMgICAgIC0gQ1hYU1REPTAzLDExCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyBKb2JzIHRvIHJ1biBvbiBwdXNoZXMgdG8gbWFzdGVyLCBkZXZlbG9wICMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgICMgQ292ZXJpdHkgU2NhbgorICAgIC0gb3M6IGxpbnV4CisgICAgICBpZjogKGVudihDT1ZFUklUWV9TQ0FOX05PVElGSUNBVElPTl9FTUFJTCkgSVMgcHJlc2VudCkgQU5EIChicmFuY2ggSU4gKGRldmVsb3AsIG1hc3RlcikpIEFORCAodHlwZSBJTiAoY3JvbiwgcHVzaCkpCisgICAgICBlbnY6CisgICAgICAgIC0gQ09NTUVOVD0iQ292ZXJpdHkgU2NhbiIKKyAgICAgICAgLSBUT09MU0VUPWdjYworICAgICAgc2NyaXB0OgorICAgICAgICAtIGNkICRCT09TVF9ST09UL2xpYnMvJFNFTEYKKyAgICAgICAgLSBjaS90cmF2aXMvY292ZXJpdHkuc2gKKworbm90aWZpY2F0aW9uczoKKyAgZW1haWw6CisgICAgZmFsc2UKKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vSmFtZmlsZSBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL0phbWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBhY2U0NQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL0phbWZpbGUKQEAgLTAsMCArMSwxMSBAQAorIyAgQm9vc3QuRnVuY3Rpb24gTGlicmFyeSBKYW1maWxlCisjCisjICBDb3B5cmlnaHQgKGMpIDIwMTggSmFtZXMgRS4gS2luZyBJSUkKKyMKKyMgIFVzZSwgbW9kaWZpY2F0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZQorIyAgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUKKyMgIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBwbGVhc2Ugb3JkZXIgYnkgbmFtZSB0byBlYXNlIG1haW50ZW5hbmNlCitidWlsZC1wcm9qZWN0IGV4YW1wbGUgOworYnVpbGQtcHJvamVjdCB0ZXN0IDsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL0xJQ0VOU0UgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YjdjZDkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9MSUNFTlNFCkBAIC0wLDAgKzEsMjMgQEAKK0Jvb3N0IFNvZnR3YXJlIExpY2Vuc2UgLSBWZXJzaW9uIDEuMCAtIEF1Z3VzdCAxN3RoLCAyMDAzCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9yIG9yZ2FuaXphdGlvbgorb2J0YWluaW5nIGEgY29weSBvZiB0aGUgc29mdHdhcmUgYW5kIGFjY29tcGFueWluZyBkb2N1bWVudGF0aW9uIGNvdmVyZWQgYnkKK3RoaXMgbGljZW5zZSAodGhlICJTb2Z0d2FyZSIpIHRvIHVzZSwgcmVwcm9kdWNlLCBkaXNwbGF5LCBkaXN0cmlidXRlLAorZXhlY3V0ZSwgYW5kIHRyYW5zbWl0IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUKK1NvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHRoaXJkLXBhcnRpZXMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvCitkbyBzbywgYWxsIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZzoKKworVGhlIGNvcHlyaWdodCBub3RpY2VzIGluIHRoZSBTb2Z0d2FyZSBhbmQgdGhpcyBlbnRpcmUgc3RhdGVtZW50LCBpbmNsdWRpbmcKK3RoZSBhYm92ZSBsaWNlbnNlIGdyYW50LCB0aGlzIHJlc3RyaWN0aW9uIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCittdXN0IGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBpbiB3aG9sZSBvciBpbiBwYXJ0LCBhbmQKK2FsbCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTb2Z0d2FyZSwgdW5sZXNzIHN1Y2ggY29waWVzIG9yIGRlcml2YXRpdmUKK3dvcmtzIGFyZSBzb2xlbHkgaW4gdGhlIGZvcm0gb2YgbWFjaGluZS1leGVjdXRhYmxlIG9iamVjdCBjb2RlIGdlbmVyYXRlZCBieQorYSBzb3VyY2UgbGFuZ3VhZ2UgcHJvY2Vzc29yLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UCitTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQU5ZT05FIERJU1RSSUJVVElORyBUSEUgU09GVFdBUkUgQkUgTElBQkxFCitGT1IgQU5ZIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKK0FSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vUkVBRE1FLm1kIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTdlYWUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9SRUFETUUubWQKQEAgLTAsMCArMSwzNCBAQAorRnVuY3Rpb24sIHBhcnQgb2YgY29sbGVjdGlvbiBvZiB0aGUgW0Jvb3N0IEMrKyBMaWJyYXJpZXNdKGh0dHA6Ly9naXRodWIuY29tL2Jvb3N0b3JnKSwgY29udGFpbnMgYSBmYW1pbHkgb2YgY2xhc3MgdGVtcGxhdGVzIHRoYXQgYXJlIGZ1bmN0aW9uIG9iamVjdCB3cmFwcGVycy4KKworIyMjIExpY2Vuc2UKKworRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFtCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMF0oaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KS4KKworIyMjIFByb3BlcnRpZXMKKworKiBDKyswMworKiBIZWFkZXItT25seQorCisjIyMgQnVpbGQgU3RhdHVzCisKK0JyYW5jaCAgICAgICAgICB8IFRyYXZpcyB8IEFwcHZleW9yIHwgQ292ZXJpdHkgU2NhbiB8IGNvZGVjb3YuaW8gfCBEZXBzIHwgRG9jcyB8IFRlc3RzIHwKKzotLS0tLS0tLS0tLS0tOiB8IC0tLS0tLSB8IC0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0gfCAtLS0tIHwgLS0tLSB8IC0tLS0tIHwKK1tgbWFzdGVyYF0oaHR0cHM6Ly9naXRodWIuY29tL2Jvb3N0b3JnL2Z1bmN0aW9uL3RyZWUvbWFzdGVyKSB8IFshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2Jvb3N0b3JnL2Z1bmN0aW9uLnN2Zz9icmFuY2g9bWFzdGVyKV0oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2Jvb3N0b3JnL2Z1bmN0aW9uKSB8IFshW0J1aWxkIHN0YXR1c10oaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vYXBpL3Byb2plY3RzL3N0YXR1cy83dGd4NGFjNDRmaWtyODdkL2JyYW5jaC9tYXN0ZXI/c3ZnPXRydWUpXShodHRwczovL2NpLmFwcHZleW9yLmNvbS9wcm9qZWN0L2pla2luZzMvZnVuY3Rpb24tZDAzNnkvYnJhbmNoL21hc3RlcikgfCBbIVtDb3Zlcml0eSBTY2FuIEJ1aWxkIFN0YXR1c10oaHR0cHM6Ly9zY2FuLmNvdmVyaXR5LmNvbS9wcm9qZWN0cy8xNTg0My9iYWRnZS5zdmcpXShodHRwczovL3NjYW4uY292ZXJpdHkuY29tL3Byb2plY3RzL2Jvb3N0b3JnLWZ1bmN0aW9uKSB8IFshW2NvZGVjb3ZdKGh0dHBzOi8vY29kZWNvdi5pby9naC9ib29zdG9yZy9mdW5jdGlvbi9icmFuY2gvbWFzdGVyL2dyYXBoL2JhZGdlLnN2ZyldKGh0dHBzOi8vY29kZWNvdi5pby9naC9ib29zdG9yZy9mdW5jdGlvbi9icmFuY2gvbWFzdGVyKXwgWyFbRGVwc10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9kZXBzLW1hc3Rlci1icmlnaHRncmVlbi5zdmcpXShodHRwczovL3BkaW1vdi5naXRodWIuaW8vYm9vc3RkZXAtcmVwb3J0L21hc3Rlci9mdW5jdGlvbi5odG1sKSB8IFshW0RvY3VtZW50YXRpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvZG9jcy1tYXN0ZXItYnJpZ2h0Z3JlZW4uc3ZnKV0oaHR0cDovL3d3dy5ib29zdC5vcmcvZG9jL2xpYnMvbWFzdGVyL2RvYy9odG1sL2Z1bmN0aW9uLmh0bWwpIHwgWyFbRW50ZXIgdGhlIE1hdHJpeF0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9tYXRyaXgtbWFzdGVyLWJyaWdodGdyZWVuLnN2ZyldKGh0dHA6Ly93d3cuYm9vc3Qub3JnL2RldmVsb3BtZW50L3Rlc3RzL21hc3Rlci9kZXZlbG9wZXIvZnVuY3Rpb24uaHRtbCkKK1tgZGV2ZWxvcGBdKGh0dHBzOi8vZ2l0aHViLmNvbS9ib29zdG9yZy9mdW5jdGlvbi90cmVlL2RldmVsb3ApIHwgWyFbQnVpbGQgU3RhdHVzXShodHRwczovL3RyYXZpcy1jaS5vcmcvYm9vc3RvcmcvZnVuY3Rpb24uc3ZnP2JyYW5jaD1kZXZlbG9wKV0oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2Jvb3N0b3JnL2Z1bmN0aW9uKSB8IFshW0J1aWxkIHN0YXR1c10oaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vYXBpL3Byb2plY3RzL3N0YXR1cy83dGd4NGFjNDRmaWtyODdkL2JyYW5jaC9kZXZlbG9wP3N2Zz10cnVlKV0oaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vcHJvamVjdC9qZWtpbmczL2Z1bmN0aW9uLWQwMzZ5L2JyYW5jaC9kZXZlbG9wKSB8IFshW0NvdmVyaXR5IFNjYW4gQnVpbGQgU3RhdHVzXShodHRwczovL3NjYW4uY292ZXJpdHkuY29tL3Byb2plY3RzLzE1ODQzL2JhZGdlLnN2ZyldKGh0dHBzOi8vc2Nhbi5jb3Zlcml0eS5jb20vcHJvamVjdHMvYm9vc3RvcmctZnVuY3Rpb24pIHwgWyFbY29kZWNvdl0oaHR0cHM6Ly9jb2RlY292LmlvL2doL2Jvb3N0b3JnL2Z1bmN0aW9uL2JyYW5jaC9kZXZlbG9wL2dyYXBoL2JhZGdlLnN2ZyldKGh0dHBzOi8vY29kZWNvdi5pby9naC9ib29zdG9yZy9mdW5jdGlvbi9icmFuY2gvZGV2ZWxvcCkgfCBbIVtEZXBzXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL2RlcHMtZGV2ZWxvcC1icmlnaHRncmVlbi5zdmcpXShodHRwczovL3BkaW1vdi5naXRodWIuaW8vYm9vc3RkZXAtcmVwb3J0L2RldmVsb3AvZnVuY3Rpb24uaHRtbCkgfCBbIVtEb2N1bWVudGF0aW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL2RvY3MtZGV2ZWxvcC1icmlnaHRncmVlbi5zdmcpXShodHRwOi8vd3d3LmJvb3N0Lm9yZy9kb2MvbGlicy9kZXZlbG9wL2RvYy9odG1sL2Z1bmN0aW9uLmh0bWwpIHwgWyFbRW50ZXIgdGhlIE1hdHJpeF0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9tYXRyaXgtZGV2ZWxvcC1icmlnaHRncmVlbi5zdmcpXShodHRwOi8vd3d3LmJvb3N0Lm9yZy9kZXZlbG9wbWVudC90ZXN0cy9kZXZlbG9wL2RldmVsb3Blci9mdW5jdGlvbi5odG1sKQorCisjIyMgRGlyZWN0b3JpZXMKKworfCBOYW1lICAgICAgICB8IFB1cnBvc2UgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IC0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKK3wgYGRvY2AgICAgICAgfCBkb2N1bWVudGF0aW9uICAgICAgICAgICAgICAgICAgfAorfCBgZXhhbXBsZWAgICB8IGV4YW1wbGVzICAgICAgICAgICAgICAgICAgICAgICB8Cit8IGBpbmNsdWRlYCAgIHwgaGVhZGVycyAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYHRlc3RgICAgICAgfCB1bml0IHRlc3RzICAgICAgICAgICAgICAgICAgICAgfAorCisjIyMgTW9yZSBpbmZvcm1hdGlvbgorCisqIFtBc2sgcXVlc3Rpb25zXShodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zL2Fzaz90YWdzPWMlMkIlMkIsYm9vc3QsYm9vc3QtZnVuY3Rpb24pCisqIFtSZXBvcnQgYnVnc10oaHR0cHM6Ly9naXRodWIuY29tL2Jvb3N0b3JnL2Z1bmN0aW9uL2lzc3Vlcyk6IEJlIHN1cmUgdG8gbWVudGlvbiBCb29zdCB2ZXJzaW9uLCBwbGF0Zm9ybSBhbmQgY29tcGlsZXIgeW91J3JlIHVzaW5nLiBBIHNtYWxsIGNvbXBpbGFibGUgY29kZSBzYW1wbGUgdG8gcmVwcm9kdWNlIHRoZSBwcm9ibGVtIGlzIGFsd2F5cyBnb29kIGFzIHdlbGwuCisqIFN1Ym1pdCB5b3VyIHBhdGNoZXMgYXMgcHVsbCByZXF1ZXN0cyBhZ2FpbnN0ICoqZGV2ZWxvcCoqIGJyYW5jaC4gTm90ZSB0aGF0IGJ5IHN1Ym1pdHRpbmcgcGF0Y2hlcyB5b3UgYWdyZWUgdG8gbGljZW5zZSB5b3VyIG1vZGlmaWNhdGlvbnMgdW5kZXIgdGhlIFtCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMF0oaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KS4KKyogRGlzY3Vzc2lvbnMgYWJvdXQgdGhlIGxpYnJhcnkgYXJlIGhlbGQgb24gdGhlIFtCb29zdCBkZXZlbG9wZXJzIG1haWxpbmcgbGlzdF0oaHR0cDovL3d3dy5ib29zdC5vcmcvY29tbXVuaXR5L2dyb3Vwcy5odG1sI21haW4pLiBCZSBzdXJlIHRvIHJlYWQgdGhlIFtkaXNjdXNzaW9uIHBvbGljeV0oaHR0cDovL3d3dy5ib29zdC5vcmcvY29tbXVuaXR5L3BvbGljeS5odG1sKSBiZWZvcmUgcG9zdGluZyBhbmQgYWRkIHRoZSBgW2Z1bmN0aW9uXWAgdGFnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN1YmplY3QgbGluZS4KKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vYXBwdmV5b3IueW1sIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vYXBwdmV5b3IueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NGExNzgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9hcHB2ZXlvci55bWwKQEAgLTAsMCArMSw4MSBAQAorIyBDb3B5cmlnaHQgMjAxNiwgMjAxNyBQZXRlciBEaW1vdgorIyBDb3B5cmlnaHQgKEMpIDIwMTcsIDIwMTggSmFtZXMgRS4gS2luZyBJSUkKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly9ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCit2ZXJzaW9uOiAxLjAue2J1aWxkfS17YnJhbmNofQorCitzaGFsbG93X2Nsb25lOiB0cnVlCisKK2JyYW5jaGVzOgorICBvbmx5OgorICAgIC0gZGV2ZWxvcAorICAgIC0gbWFzdGVyCisKK21hdHJpeDoKKyAgYWxsb3dfZmFpbHVyZXM6CisgICAgLSBNQVlGQUlMOiB0cnVlCisKK2Vudmlyb25tZW50OgorICBnbG9iYWw6CisgICAgIyBzZWU6IGh0dHA6Ly93d3cuYm9vc3Qub3JnL2J1aWxkL2RvYy9odG1sL2JidjIvb3ZlcnZpZXcvaW52b2NhdGlvbi5odG1sI2JidjIub3ZlcnZpZXcuaW52b2NhdGlvbi5wcm9wZXJ0aWVzCisgICAgIyB0byB1c2UgdGhlIGRlZmF1bHQgZm9yIGEgZ2l2ZW4gZW52aXJvbm1lbnQsIGNvbW1lbnQgaXQgb3V0OyByZWNvbW1lbmQgeW91IGJ1aWxkIGRlYnVnIGFuZCByZWxlYXNlIGhvd2V2ZXIuLgorICAgICMgb24gV2luZG93cyBpdCBpcyBpbXBvcnRhbnQgdG8gZXhlcmNpc2UgYWxsIHRoZSBwb3NzaWJpbGl0aWVzLCBlc3BlY2lhbGx5IHNoYXJlZCB2cyBzdGF0aWMKKyAgICAjIEIyX0FERFJFU1NfTU9ERUw6IGFkZHJlc3MtbW9kZWw9NjQsMzIKKyAgICAjIEIyX0xJTks6IGxpbms9c2hhcmVkLHN0YXRpYworICAgICMgQjJfVEhSRUFESU5HOiB0aHJlYWRpbmc9bXVsdGksc2luZ2xlCisgICAgQjJfVkFSSUFOVDogdmFyaWFudD1yZWxlYXNlLGRlYnVnCisgICAgQ1hYU1REOiAwMworCisgIG1hdHJpeDoKKyAgICAtIEZMQVZPUjogVmlzdWFsIFN0dWRpbyAyMDE3CisgICAgICBBUFBWRVlPUl9CVUlMRF9XT1JLRVJfSU1BR0U6IFZpc3VhbCBTdHVkaW8gMjAxNworICAgICAgVE9PTFNFVDogbXN2Yy0xNC4xCisgICAgICBCMl9BRERSRVNTX01PREVMOiBhZGRyZXNzLW1vZGVsPTY0LDMyCisgICAgLSBGTEFWT1I6IFZpc3VhbCBTdHVkaW8gMjAxNQorICAgICAgQVBQVkVZT1JfQlVJTERfV09SS0VSX0lNQUdFOiBWaXN1YWwgU3R1ZGlvIDIwMTUKKyAgICAgIFRPT0xTRVQ6IG1zdmMtMTQuMAorICAgICAgQjJfQUREUkVTU19NT0RFTDogYWRkcmVzcy1tb2RlbD02NCwzMgorICAgIC0gRkxBVk9SOiBWaXN1YWwgU3R1ZGlvIDIwMTAsIDIwMTIsIDIwMTMKKyAgICAgIEFQUFZFWU9SX0JVSUxEX1dPUktFUl9JTUFHRTogVmlzdWFsIFN0dWRpbyAyMDEzCisgICAgICBUT09MU0VUOiBtc3ZjLTEwLjAsbXN2Yy0xMS4wLG1zdmMtMTIuMAorICAgIC0gRkxBVk9SOiBjeWd3aW4gKDMyLWJpdCkKKyAgICAgIEFQUFZFWU9SX0JVSUxEX1dPUktFUl9JTUFHRTogVmlzdWFsIFN0dWRpbyAyMDE3CisgICAgICBBRERQQVRIOiBDOlxjeWd3aW5cYmluOworICAgICAgQjJfQUREUkVTU19NT0RFTDogYWRkcmVzcy1tb2RlbD0zMgorICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vYm9vc3RvcmcvdGVzdC9pc3N1ZXMvMTQ0CisgICAgICBERUZJTkVTOiBkZWZpbmU9X1BPU0lYX0NfU09VUkNFPTIwMDExMkwKKyAgICAgIFRIUkVBRElORzogdGhyZWFkYXBpPXB0aHJlYWQKKyAgICAgIFRPT0xTRVQ6IGdjYworICAgIC0gRkxBVk9SOiBjeWd3aW4gKDY0LWJpdCkKKyAgICAgIEFQUFZFWU9SX0JVSUxEX1dPUktFUl9JTUFHRTogVmlzdWFsIFN0dWRpbyAyMDE3CisgICAgICBBRERQQVRIOiBDOlxjeWd3aW42NFxiaW47CisgICAgICBCMl9BRERSRVNTX01PREVMOiBhZGRyZXNzLW1vZGVsPTY0CisgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9ib29zdG9yZy90ZXN0L2lzc3Vlcy8xNDQKKyAgICAgIERFRklORVM6IGRlZmluZT1fUE9TSVhfQ19TT1VSQ0U9MjAwMTEyTAorICAgICAgVEhSRUFESU5HOiB0aHJlYWRhcGk9cHRocmVhZAorICAgICAgVE9PTFNFVDogZ2NjCisgICAgLSBGTEFWT1I6ICBtaW5ndzMyCisgICAgICBBUFBWRVlPUl9CVUlMRF9XT1JLRVJfSU1BR0U6IFZpc3VhbCBTdHVkaW8gMjAxNworICAgICAgQVJDSDogICAgaTY4NgorICAgICAgQjJfQUREUkVTU19NT0RFTDogYWRkcmVzcy1tb2RlbD0zMgorICAgICAgU0NSSVBUOiAgY2lcYXBwdmV5b3JcbWluZ3cuYmF0CisgICAgLSBGTEFWT1I6ICBtaW5ndzY0CisgICAgICBBUFBWRVlPUl9CVUlMRF9XT1JLRVJfSU1BR0U6IFZpc3VhbCBTdHVkaW8gMjAxNworICAgICAgQVJDSDogICAgeDg2XzY0CisgICAgICBCMl9BRERSRVNTX01PREVMOiBhZGRyZXNzLW1vZGVsPTY0CisgICAgICBTQ1JJUFQ6ICBjaVxhcHB2ZXlvclxtaW5ndy5iYXQKKworaW5zdGFsbDoKKyAgLSBzZXQgU0VMRj0lQVBQVkVZT1JfUFJPSkVDVF9OQU1FOi09XyUKKyAgLSBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2pla2luZzMvYm9vc3QtY2kuZ2l0IEM6XGJvb3N0LWNpCisgIC0geGNvcHkgL3MgL2UgL3EgL2kgQzpcYm9vc3QtY2lcY2kgLlxjaQorICAtIGNpXGFwcHZleW9yXGluc3RhbGwuYmF0CisKK2J1aWxkOiBvZmYKKwordGVzdF9zY3JpcHQ6CisgIC0gc2V0IFNFTEY9JUFQUFZFWU9SX1BST0pFQ1RfTkFNRTotPV8lCisgIC0gUEFUSD0lQUREUEFUSCUlUEFUSCUKKyAgLSBJRiBERUZJTkVEIFNDUklQVCAoY2FsbCBsaWJzXCVTRUxGJVwlU0NSSVBUJSkgRUxTRSAoYjIgbGlicy8lU0VMRiUgdG9vbHNldD0lVE9PTFNFVCUgY3h4c3RkPSVDWFhTVEQlICVDWFhGTEFHUyUgJURFRklORVMlICVUSFJFQURJTkclICVCMl9BRERSRVNTX01PREVMJSAlQjJfTElOSyUgJUIyX1RIUkVBRElORyUgJUIyX1ZBUklBTlQlIC1qMykKKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vZG9jL0phbWZpbGUudjIgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9kb2MvSmFtZmlsZS52MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2I4ZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vZG9jL0phbWZpbGUudjIKQEAgLTAsMCArMSwyNSBAQAorIyAgIENvcHlyaWdodCAoYykgMjAwMiBEb3VnbGFzIEdyZWdvciA8ZG91Zy5ncmVnb3IgLWF0LSBnbWFpbC5jb20+CisgIAorIyAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyMgICAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisjICAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorcHJvamVjdCBmdW5jdGlvbi9kb2MgOworaW1wb3J0IGJvb3N0Ym9vayA6IGJvb3N0Ym9vayA7CisKK2Jvb3N0Ym9vayBmdW5jdGlvbi1kb2MgCisgICAgOiAKKyAgICBmdW5jdGlvbi54bWwgCisgICAgOgorICAgICAgICA8eHNsOnBhcmFtPmJvb3N0LnJvb3Q9Li4vLi4vLi4vLi4KKyAgICAgICAgPGZvcm1hdD5wZGY6PHhzbDpwYXJhbT5ib29zdC51cmwucHJlZml4PWh0dHA6Ly93d3cuYm9vc3Qub3JnL2RvYy9saWJzL3JlbGVhc2UvZG9jL2h0bWwKKyAgICA7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2FsaWFzIGJvb3N0ZG9jCisgICAgOiBmdW5jdGlvbi54bWwKKyAgICA6CisgICAgOgorICAgIDogOworZXhwbGljaXQgYm9vc3Rkb2MgOworYWxpYXMgYm9vc3RyZWxlYXNlIDsKK2V4cGxpY2l0IGJvb3N0cmVsZWFzZSA7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9kb2MvZmFxLnhtbCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2RvYy9mYXEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOWRlMDQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9kb2MvZmFxLnhtbApAQCAtMCwwICsxLDE2MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgIENvcHlyaWdodCAoYykgMjAwMiBEb3VnbGFzIEdyZWdvciA8ZG91Zy5ncmVnb3IgLWF0LSBnbWFpbC5jb20+CisgIAorICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICAtLT4KKzwhRE9DVFlQRSBsaWJyYXJ5IFBVQkxJQyAiLS8vQm9vc3QvL0RURCBCb29zdEJvb2sgWE1MIFYxLjAvL0VOIgorICAiaHR0cDovL3d3dy5ib29zdC5vcmcvdG9vbHMvYm9vc3Rib29rL2R0ZC9ib29zdGJvb2suZHRkIj4KKzxzZWN0aW9uIGlkPSJmdW5jdGlvbi5mYXEiIGxhc3QtcmV2aXNpb249IiREYXRlJCI+CisgIDx0aXRsZT5GcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvdGl0bGU+CisKKzxxYW5kYXNldD4KKyAgPHFhbmRhZW50cnk+CisgICAgPHF1ZXN0aW9uPjxwYXJhPldoeSBjYW4ndCBJIGNvbXBhcmUKKyAgICA8Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbjwvY2xhc3NuYW1lPiBvYmplY3RzIHdpdGgKKyAgICA8Y29kZT5vcGVyYXRvcj09PC9jb2RlPiBvcgorICAgIDxjb2RlPm9wZXJhdG9yIT08L2NvZGU+PzwvcGFyYT48L3F1ZXN0aW9uPgorCisgICAgPGFuc3dlcj4KKyAgICAgIDxwYXJhPkNvbXBhcmlzb24gYmV0d2VlbiA8Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbjwvY2xhc3NuYW1lPgorICAgICAgb2JqZWN0cyBjYW5ub3QgYmUgaW1wbGVtZW50ZWQgIndlbGwiLCBhbmQgdGhlcmVmb3JlIHdpbGwgbm90IGJlCisgICAgICBpbXBsZW1lbnRlZC4gVGhlIHR5cGljYWwgc2VtYW50aWNzIHJlcXVlc3RlZCBmb3IgPGNvZGU+ZiA9PQorICAgICAgZzwvY29kZT4gZ2l2ZW4gPGNsYXNzbmFtZT5ib29zdDo6ZnVuY3Rpb248L2NsYXNzbmFtZT4gb2JqZWN0cworICAgICAgPGNvZGU+ZjwvY29kZT4gYW5kIDxjb2RlPmc8L2NvZGU+IGFyZTo8L3BhcmE+CisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPklmIDxjb2RlPmY8L2NvZGU+IGFuZCA8Y29kZT5nPC9jb2RlPgorICAgICAgICAgIHN0b3JlIGZ1bmN0aW9uIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSwgdXNlIHRoYXQgdHlwZSdzCisgICAgICAgICAgPGNvZGU+b3BlcmF0b3I9PTwvY29kZT4gdG8gY29tcGFyZQorICAgICAgICAgIHRoZW0uPC9zaW1wYXJhPjwvbGlzdGl0ZW0+IAorCisgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPklmIDxjb2RlPmY8L2NvZGU+IGFuZCA8Y29kZT5nPC9jb2RlPgorICAgICAgICAgIHN0b3JlIGZ1bmN0aW9uIG9iamVjdHMgb2YgZGlmZmVyZW50IHR5cGVzLCByZXR1cm4KKyAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4uPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgPHBhcmE+VGhlIHByb2JsZW0gb2NjdXJzIHdoZW4gdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdHMKKyAgICAgIHN0b3JlZCBieSBib3RoIDxjb2RlPmY8L2NvZGU+IGFuZCA8Y29kZT5nPC9jb2RlPiBkb2Vzbid0IGhhdmUgYW4KKyAgICAgIDxjb2RlPm9wZXJhdG9yPT08L2NvZGU+OiB3ZSB3b3VsZCBsaWtlIHRoZSBleHByZXNzaW9uIDxjb2RlPmYgPT0KKyAgICAgIGc8L2NvZGU+IHRvIGZhaWwgdG8gY29tcGlsZSwgYXMgb2NjdXJzIHdpdGgsIGUuZy4sIHRoZSBzdGFuZGFyZAorICAgICAgY29udGFpbmVycy4gSG93ZXZlciwgdGhpcyBpcyBub3QgaW1wbGVtZW50YWJsZSBmb3IKKyAgICAgIDxjbGFzc25hbWU+Ym9vc3Q6OmZ1bmN0aW9uPC9jbGFzc25hbWU+IGJlY2F1c2UgaXQgbmVjZXNzYXJpbHkKKyAgICAgICJlcmFzZXMiIHNvbWUgdHlwZSBpbmZvcm1hdGlvbiBhZnRlciBpdCBoYXMgYmVlbiBhc3NpZ25lZCBhCisgICAgICBmdW5jdGlvbiBvYmplY3QsIHNvIGl0IGNhbm5vdCB0cnkgdG8gY2FsbAorICAgICAgPGNvZGU+b3BlcmF0b3I9PTwvY29kZT4gbGF0ZXI6IGl0IG11c3QgZWl0aGVyIGZpbmQgYSB3YXkgdG8gY2FsbAorICAgICAgPGNvZGU+b3BlcmF0b3I9PTwvY29kZT4gbm93LCBvciBpdCB3aWxsIG5ldmVyIGJlIGFibGUgdG8gY2FsbCBpdAorICAgICAgbGF0ZXIuIE5vdGUsIGZvciBpbnN0YW5jZSwgd2hhdCBoYXBwZW5zIGlmIHlvdSB0cnkgdG8gcHV0IGEKKyAgICAgIDxjb2RlPmZsb2F0PC9jb2RlPiB2YWx1ZSBpbnRvIGEKKyAgICAgIDxjbGFzc25hbWU+Ym9vc3Q6OmZ1bmN0aW9uPC9jbGFzc25hbWU+IG9iamVjdDogeW91IHdpbGwgZ2V0IGFuCisgICAgICBlcnJvciBhdCB0aGUgYXNzaWdubWVudCBvcGVyYXRvciBvciBjb25zdHJ1Y3Rvciwgbm90IGluCisgICAgICA8Y29kZT5vcGVyYXRvcigpPC9jb2RlPiwgYmVjYXVzZSB0aGUgZnVuY3Rpb24tY2FsbCBleHByZXNzaW9uCisgICAgICBtdXN0IGJlIGJvdW5kIGluIHRoZSBjb25zdHJ1Y3RvciBvciBhc3NpZ25tZW50IG9wZXJhdG9yLjwvcGFyYT4KKworICAgICAgPHBhcmE+VGhlIG1vc3QgcHJvbWlzaW5nIGFwcHJvYWNoIGlzIHRvIGZpbmQgYSBtZXRob2Qgb2YKKyAgICAgIGRldGVybWluaW5nIGlmIDxjb2RlPm9wZXJhdG9yPT08L2NvZGU+IGNhbiBiZSBjYWxsZWQgZm9yIGEKKyAgICAgIHBhcnRpY3VsYXIgdHlwZSwgYW5kIHRoZW4gc3VwcG9ydGluZyBpdCBvbmx5IHdoZW4gaXQgaXMKKyAgICAgIGF2YWlsYWJsZTsgaW4gb3RoZXIgc2l0dWF0aW9ucywgYW4gZXhjZXB0aW9uIHdvdWxkIGJlCisgICAgICB0aHJvd24uIEhvd2V2ZXIsIHRvIGRhdGUgdGhlcmUgaXMgbm8ga25vd24gd2F5IHRvIGRldGVjdCBpZiBhbgorICAgICAgYXJiaXRyYXJ5IG9wZXJhdG9yIGV4cHJlc3Npb24gPGNvZGU+ZiA9PSBnPC9jb2RlPiBpcyBzdWl0YWJseQorICAgICAgZGVmaW5lZC4gVGhlIGJlc3Qgc29sdXRpb24ga25vd24gaGFzIHRoZSBmb2xsb3dpbmcgdW5kZXNpcmFibGUKKyAgICAgIHF1YWxpdGllczo8L3BhcmE+CisKKyAgICAgIDxvcmRlcmVkbGlzdD4KKyAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPkZhaWxzIGF0IGNvbXBpbGUtdGltZSBmb3Igb2JqZWN0cyB3aGVyZQorICAgICAgICA8Y29kZT5vcGVyYXRvcj09PC9jb2RlPiBpcyBub3QgYWNjZXNzaWJsZSAoZS5nLiwgYmVjYXVzZSBpdCBpcworICAgICAgICA8Y29kZT5wcml2YXRlPC9jb2RlPikuPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisKKyAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPkZhaWxzIGF0IGNvbXBpbGUtdGltZSBpZiBjYWxsaW5nCisgICAgICAgIDxjb2RlPm9wZXJhdG9yPT08L2NvZGU+IGlzIGFtYmlndW91cy48L3NpbXBhcmE+PC9saXN0aXRlbT4KKworICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+QXBwZWFycyB0byBiZSBjb3JyZWN0IGlmIHRoZQorICAgICAgICA8Y29kZT5vcGVyYXRvcj09PC9jb2RlPiBkZWNsYXJhdGlvbiBpcyBjb3JyZWN0LCBldmVuIHRob3VnaAorICAgICAgICA8Y29kZT5vcGVyYXRvcj09PC9jb2RlPiBtYXkgbm90IGNvbXBpbGUuPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICA8L29yZGVyZWRsaXN0PgorCisgICAgICA8cGFyYT5BbGwgb2YgdGhlc2UgcHJvYmxlbXMgdHJhbnNsYXRlIGludG8gZmFpbHVyZXMgaW4gdGhlCisgICAgICA8Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbjwvY2xhc3NuYW1lPiBjb25zdHJ1Y3RvcnMgb3IKKyAgICAgIGFzc2lnbm1lbnQgb3BlcmF0b3IsIDxlbXBoYXNpcz5ldmVuIGlmIHRoZSB1c2VyIG5ldmVyIGludm9rZXMKKyAgICAgIG9wZXJhdG9yPT08L2VtcGhhc2lzPi4gV2UgY2FuJ3QgZG8gdGhhdCB0byB1c2Vycy48L3BhcmE+CisKKyAgICAgIDxwYXJhPlRoZSBvdGhlciBvcHRpb24gaXMgdG8gcGxhY2UgdGhlIGJ1cmRlbiBvbiB1c2VycyB0aGF0IHdhbnQKKyAgICAgIHRvIHVzZSA8Y29kZT5vcGVyYXRvcj09PC9jb2RlPiwgZS5nLiwgYnkgcHJvdmlkaW5nIGFuCisgICAgICA8Y29kZT5pc19lcXVhbGl0eV9jb21wYXJhYmxlPC9jb2RlPiB0cmFpdCB0aGV5IG1heQorICAgICAgc3BlY2lhbGl6ZS4gVGhpcyBpcyBhIHdvcmthYmxlIHNvbHV0aW9uLCBidXQgaXMgZGFuZ2Vyb3VzIGluCisgICAgICBwcmFjdGljZSwgYmVjYXVzZSBmb3JnZXR0aW5nIHRvIHNwZWNpYWxpemUgdGhlIHRyYWl0IHdpbGwgcmVzdWx0CisgICAgICBpbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbnMgYmVpbmcgdGhyb3duIGZyb20KKyAgICAgIDxjbGFzc25hbWU+Ym9vc3Q6OmZ1bmN0aW9uPC9jbGFzc25hbWU+J3MKKyAgICAgIDxjb2RlPm9wZXJhdG9yPT08L2NvZGU+LiBUaGlzIGVzc2VudGlhbGx5IG5lZ2F0ZXMgdGhlIHVzZWZ1bG5lc3MKKyAgICAgIG9mIDxjb2RlPm9wZXJhdG9yPT08L2NvZGU+IGluIHRoZSBjb250ZXh0IGluIHdoaWNoIGl0IGlzIG1vc3QKKyAgICAgIGRlc2lyZWQ6IG11bHRpdGFyZ2V0IGNhbGxiYWNrcy4gVGhlCisgICAgICA8bGlicmFyeW5hbWU+U2lnbmFsczwvbGlicmFyeW5hbWU+IGxpYnJhcnkgaGFzIGEgd2F5IGFyb3VuZAorICAgICAgdGhpcy48L3BhcmE+CisgICAgPC9hbnN3ZXI+CisgIDwvcWFuZGFlbnRyeT4KKworICA8cWFuZGFlbnRyeT4KKyAgICA8cXVlc3Rpb24+PHBhcmE+SSBzZWUgdm9pZCBwb2ludGVyczsgaXMgdGhpcyBbbWVzc10gdHlwZSBzYWZlPzwvcGFyYT48L3F1ZXN0aW9uPgorICAgIDxhbnN3ZXI+Cis8cGFyYT5ZZXMsIDxjb21wdXRlcm91dHB1dD5ib29zdDo6ZnVuY3Rpb248L2NvbXB1dGVyb3V0cHV0PiBpcyB0eXBlCitzYWZlIGV2ZW4gdGhvdWdoIGl0IHVzZXMgdm9pZCBwb2ludGVycyBhbmQgcG9pbnRlcnMgdG8gZnVuY3Rpb25zCityZXR1cm5pbmcgdm9pZCBhbmQgdGFraW5nIG5vIGFyZ3VtZW50cy4gRXNzZW50aWFsbHksIGFsbCB0eXBlCitpbmZvcm1hdGlvbiBpcyBlbmNvZGVkIGluIHRoZSBmdW5jdGlvbnMgdGhhdCBtYW5hZ2UgYW5kIGludm9rZQorZnVuY3Rpb24gcG9pbnRlcnMgYW5kIGZ1bmN0aW9uIG9iamVjdHMuIE9ubHkgdGhlc2UgZnVuY3Rpb25zIGFyZQoraW5zdGFudGlhdGVkIHdpdGggdGhlIGV4YWN0IHR5cGUgdGhhdCBpcyBwb2ludGVkIHRvIGJ5IHRoZSB2b2lkCitwb2ludGVyIG9yIHBvaW50ZXIgdG8gdm9pZCBmdW5jdGlvbi4gVGhlIHJlYXNvbiB0aGF0IGJvdGggYXJlIHJlcXVpcmVkCitpcyB0aGF0IG9uZSBtYXkgY2FzdCBiZXR3ZWVuIHZvaWQgcG9pbnRlcnMgYW5kIG9iamVjdCBwb2ludGVycyBzYWZlbHkKK29yIGJldHdlZW4gZGlmZmVyZW50IHR5cGVzIG9mIGZ1bmN0aW9uIHBvaW50ZXJzIChwcm92aWRlZCB5b3UgZG9uJ3QKK2ludm9rZSBhIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCB0aGUgd3JvbmcgdHlwZSkuICA8L3BhcmE+CisgICAgPC9hbnN3ZXI+CisgIDwvcWFuZGFlbnRyeT4KKworICA8cWFuZGFlbnRyeT4KKyAgICA8cXVlc3Rpb24+PHBhcmE+V2h5IGFyZSB0aGVyZSB3b3JrYXJvdW5kcyBmb3Igdm9pZCByZXR1cm5zPyBDKysgYWxsb3dzIHRoZW0hPC9wYXJhPjwvcXVlc3Rpb24+CisgICAgPGFuc3dlcj48cGFyYT5Wb2lkIHJldHVybnMgYXJlIHBlcm1pdHRlZCBieSB0aGUgQysrIHN0YW5kYXJkLCBhcyBpbiB0aGlzIGNvZGUgc25pcHBldDoKKzxwcm9ncmFtbGlzdGluZz52b2lkIGYoKTsKK3ZvaWQgZygpIHsgcmV0dXJuIGYoKTsgfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+IFRoaXMgaXMgYSB2YWxpZCB1c2FnZSBvZiA8Y29tcHV0ZXJvdXRwdXQ+Ym9vc3Q6OmZ1bmN0aW9uPC9jb21wdXRlcm91dHB1dD4gYmVjYXVzZSB2b2lkIHJldHVybnMgYXJlIG5vdCB1c2VkLiBXaXRoIHZvaWQgcmV0dXJucywgd2Ugd291bGQgYXR0ZW1wdGluZyB0byBjb21waWxlIGlsbC1mb3JtZWQgY29kZSBzaW1pbGFyIHRvOgorPHByb2dyYW1saXN0aW5nPmludCBmKCk7Cit2b2lkIGcoKSB7IHJldHVybiBmKCk7IH08L3Byb2dyYW1saXN0aW5nPgorPC9wYXJhPgorCis8cGFyYT4gSW4gZXNzZW5jZSwgbm90IHVzaW5nIHZvaWQgcmV0dXJucyBhbGxvd3MKKzxjb21wdXRlcm91dHB1dD5ib29zdDo6ZnVuY3Rpb248L2NvbXB1dGVyb3V0cHV0PiB0byBzd2FsbG93IGEgcmV0dXJuIHZhbHVlLiBUaGlzIGlzCitjb25zaXN0ZW50IHdpdGggYWxsb3dpbmcgdGhlIHVzZXIgdG8gYXNzaWduIGFuZCBpbnZva2UgZnVuY3Rpb25zIGFuZAorZnVuY3Rpb24gb2JqZWN0cyB3aXRoIHBhcmFtZXRlcnMgdGhhdCBkb24ndCBleGFjdGx5IG1hdGNoLjwvcGFyYT4KKworICAgIDwvYW5zd2VyPgorICA8L3FhbmRhZW50cnk+CisKKyAgPHFhbmRhZW50cnk+CisgICAgPHF1ZXN0aW9uPjxwYXJhPldoeSAoZnVuY3Rpb24pIGNsb25pbmc/PC9wYXJhPjwvcXVlc3Rpb24+CisgICAgPGFuc3dlcj4KKyAgICAgIDxwYXJhPkluIE5vdmVtYmVyIGFuZCBEZWNlbWJlciBvZiAyMDAwLCB0aGUgaXNzdWUgb2YgY2xvbmluZworICAgICAgdnMuIHJlZmVyZW5jZSBjb3VudGluZyB3YXMgZGViYXRlZCBhdCBsZW5ndGggYW5kIGl0IHdhcyBkZWNpZGVkCisgICAgICB0aGF0IGNsb25pbmcgZ2F2ZSBtb3JlIHByZWRpY3RhYmxlIHNlbWFudGljcy4gSSB3b24ndCByZWhhc2ggdGhlCisgICAgICBkaXNjdXNzaW9uIGhlcmUsIGJ1dCBpZiBpdCBjbG9uaW5nIGlzIGluY29ycmVjdCBmb3IgYSBwYXJ0aWN1bGFyCisgICAgICBhcHBsaWNhdGlvbiBhIHJlZmVyZW5jZS1jb3VudGluZyBhbGxvY2F0b3IgY291bGQgYmUgdXNlZC48L3BhcmE+CisgICAgPC9hbnN3ZXI+CisgIDwvcWFuZGFlbnRyeT4KKworICA8cWFuZGFlbnRyeT4KKyAgICA8cXVlc3Rpb24+PHBhcmE+SG93IG11Y2ggb3ZlcmhlYWQgZG9lcyBhIGNhbGwgdGhyb3VnaCA8Y29kZT48Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbjwvY2xhc3NuYW1lPjwvY29kZT4gaW5jdXI/PC9wYXJhPjwvcXVlc3Rpb24+CisgICAgPGFuc3dlcj4KKyAgICAgIDxwYXJhPlRoZSBjb3N0IG9mIDxjb2RlPmJvb3N0OjpmdW5jdGlvbjwvY29kZT4gY2FuIGJlIHJlYXNvbmFibHkKKyAgICAgIGNvbnNpc3RlbnRseSBtZWFzdXJlZCBhdCBhcm91bmQgMjBucyArLy0gMTAgbnMgb24gYSBtb2Rlcm4gPjJHSHoKKyAgICAgIHBsYXRmb3JtIHZlcnN1cyBkaXJlY3RseSBpbmxpbmluZyB0aGUgY29kZS48L3BhcmE+CisKKyAgICAgIDxwYXJhPkhvd2V2ZXIsIHRoZSBwZXJmb3JtYW5jZSBvZiB5b3VyIGFwcGxpY2F0aW9uIG1heSBiZW5lZml0CisgICAgICBmcm9tIG9yIGJlIGRpc2FkdmFudGFnZWQgYnkgPGNvZGU+Ym9vc3Q6OmZ1bmN0aW9uPC9jb2RlPgorICAgICAgZGVwZW5kaW5nIG9uIGhvdyB5b3VyIEMrKyBvcHRpbWlzZXIgb3B0aW1pc2VzLiAgU2ltaWxhciB0byBhCisgICAgICBzdGFuZGFyZCBmdW5jdGlvbiBwb2ludGVyLCBkaWZmZXJlbmNlcyBvZiBvcmRlciBvZiAxMCUgaGF2ZSBiZWVuCisgICAgICBub3RlZCB0byB0aGUgYmVuZWZpdCBvciBkaXNhZHZhbnRhZ2Ugb2YgdXNpbmcKKyAgICAgIDxjb2RlPmJvb3N0OjpmdW5jdGlvbjwvY29kZT4gdG8gY2FsbCBhIGZ1bmN0aW9uIHRoYXQgY29udGFpbnMgYQorICAgICAgdGlnaHQgbG9vcCBkZXBlbmRpbmcgb24geW91ciBjb21waWxhdGlvbiBjaXJjdW1zdGFuY2VzLjwvcGFyYT4KKyAgICAgCisgICAgICA8cGFyYT5bQW5zd2VyIHByb3ZpZGVkIGJ5IE1hdHQgSHVyZC4gU2VlIDx1bGluayB1cmw9Imh0dHA6Ly9hcnRpY2xlLmdtYW5lLm9yZy9nbWFuZS5jb21wLmxpYi5ib29zdC5kZXZlbC8zMzI3OCIvPl08L3BhcmE+CisgICAgPC9hbnN3ZXI+CisgIDwvcWFuZGFlbnRyeT4KKzwvcWFuZGFzZXQ+IAorCis8L3NlY3Rpb24+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9kb2MvZnVuY3Rpb24ueG1sIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vZG9jL2Z1bmN0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjc1ZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vZG9jL2Z1bmN0aW9uLnhtbApAQCAtMCwwICsxLDYxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCFET0NUWVBFIGxpYnJhcnkgUFVCTElDICItLy9Cb29zdC8vRFREIEJvb3N0Qm9vayBYTUwgVjEuMC8vRU4iCisgICJodHRwOi8vd3d3LmJvb3N0Lm9yZy90b29scy9ib29zdGJvb2svZHRkL2Jvb3N0Ym9vay5kdGQiPgorPGxpYnJhcnkgbmFtZT0iRnVuY3Rpb24iIGRpcm5hbWU9ImZ1bmN0aW9uIiBpZD0iZnVuY3Rpb24iIAorICAgICAgICAgbGFzdC1yZXZpc2lvbj0iJERhdGUkIiAKKyAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKzxsaWJyYXJ5aW5mbz4KKyAgPGF1dGhvcj4KKyAgICA8Zmlyc3RuYW1lPkRvdWdsYXM8L2ZpcnN0bmFtZT4KKyAgICA8c3VybmFtZT5HcmVnb3I8L3N1cm5hbWU+CisgICAgPGVtYWlsPmRncmVnb3IgLWF0LSBjcy5pbmRpYW5hLmVkdTwvZW1haWw+CisgIDwvYXV0aG9yPgorCisgIDxjb3B5cmlnaHQ+CisgICAgPHllYXI+MjAwMTwveWVhcj4KKyAgICA8eWVhcj4yMDAyPC95ZWFyPgorICAgIDx5ZWFyPjIwMDM8L3llYXI+CisgICAgPHllYXI+MjAwNDwveWVhcj4KKyAgICA8aG9sZGVyPkRvdWdsYXMgR3JlZ29yPC9ob2xkZXI+CisgIDwvY29weXJpZ2h0PgorCisgIDxsZWdhbG5vdGljZT4KKyAgICA8cGFyYT5Vc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0CisgICAgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUKKyAgICA8ZmlsZW5hbWU+TElDRU5TRV8xXzAudHh0PC9maWxlbmFtZT4gb3IgY29weSBhdCA8dWxpbmsKKyAgICB1cmw9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCI+aHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0PC91bGluaz4pPC9wYXJhPgorICA8L2xlZ2Fsbm90aWNlPgorCisgIDxsaWJyYXJ5cHVycG9zZT5GdW5jdGlvbiBvYmplY3Qgd3JhcHBlcnMgZm9yIGRlZmVycmVkIGNhbGxzIG9yIGNhbGxiYWNrczwvbGlicmFyeXB1cnBvc2U+CisgIDxsaWJyYXJ5Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnk6aGlnaGVyLW9yZGVyIi8+Cis8L2xpYnJhcnlpbmZvPgorCis8dGl0bGU+Qm9vc3QuRnVuY3Rpb248L3RpdGxlPgorCis8c2VjdGlvbiBpZD0iZnVuY3Rpb24uaW50cm8iPgorPHRpdGxlPkludHJvZHVjdGlvbjwvdGl0bGU+IAorPHBhcmE+VGhlIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkgY29udGFpbnMgYSBmYW1pbHkgb2YgY2xhc3MgdGVtcGxhdGVzCit0aGF0IGFyZSBmdW5jdGlvbiBvYmplY3Qgd3JhcHBlcnMuIFRoZSBub3Rpb24gaXMgc2ltaWxhciB0byBhCitnZW5lcmFsaXplZCBjYWxsYmFjay4gSXQgc2hhcmVzIGZlYXR1cmVzIHdpdGggZnVuY3Rpb24gcG9pbnRlcnMgaW4KK3RoYXQgYm90aCBkZWZpbmUgYSBjYWxsIGludGVyZmFjZSAoZS5nLiwgYSBmdW5jdGlvbiB0YWtpbmcgdHdvIGludGVnZXIKK2FyZ3VtZW50cyBhbmQgcmV0dXJuaW5nIGEgZmxvYXRpbmctcG9pbnQgdmFsdWUpIHRocm91Z2ggd2hpY2ggc29tZQoraW1wbGVtZW50YXRpb24gY2FuIGJlIGNhbGxlZCwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIGludm9rZWQKK21heSBjaGFuZ2UgdGhyb3VnaG91dCB0aGUgY291cnNlIG9mIHRoZSBwcm9ncmFtLjwvcGFyYT4KKworPHBhcmE+IEdlbmVyYWxseSwgYW55IHBsYWNlIGluIHdoaWNoIGEgZnVuY3Rpb24gcG9pbnRlciB3b3VsZCBiZSB1c2VkCit0byBkZWZlciBhIGNhbGwgb3IgbWFrZSBhIGNhbGxiYWNrLCBCb29zdC5GdW5jdGlvbiBjYW4gYmUgdXNlZCBpbnN0ZWFkCit0byBhbGxvdyB0aGUgdXNlciBncmVhdGVyIGZsZXhpYmlsaXR5IGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKK3RhcmdldC4gVGFyZ2V0cyBjYW4gYmUgYW55ICdjb21wYXRpYmxlJyBmdW5jdGlvbiBvYmplY3QgKG9yIGZ1bmN0aW9uCitwb2ludGVyKSwgbWVhbmluZyB0aGF0IHRoZSBhcmd1bWVudHMgdG8gdGhlIGludGVyZmFjZSBkZXNpZ25hdGVkIGJ5CitCb29zdC5GdW5jdGlvbiBjYW4gYmUgY29udmVydGVkIHRvIHRoZSBhcmd1bWVudHMgb2YgdGhlIHRhcmdldAorZnVuY3Rpb24gb2JqZWN0LjwvcGFyYT4KKzwvc2VjdGlvbj4KKworPHhpOmluY2x1ZGUgaHJlZj0iaGlzdG9yeS54bWwiLz4KKzx4aTppbmNsdWRlIGhyZWY9InR1dG9yaWFsLnhtbCIvPgorPHhpOmluY2x1ZGUgaHJlZj0icmVmZXJlbmNlLnhtbCIvPgorPHhpOmluY2x1ZGUgaHJlZj0iZmFxLnhtbCIvPgorPHhpOmluY2x1ZGUgaHJlZj0ibWlzYy54bWwiLz4KKzx4aTppbmNsdWRlIGhyZWY9InRlc3RzLnhtbCIvPgorCis8L2xpYnJhcnk+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9kb2MvaGlzdG9yeS54bWwgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9kb2MvaGlzdG9yeS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlY2Q0MgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2RvYy9oaXN0b3J5LnhtbApAQCAtMCwwICsxLDE0NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgIENvcHlyaWdodCAoYykgMjAwMiBEb3VnbGFzIEdyZWdvciA8ZG91Zy5ncmVnb3IgLWF0LSBnbWFpbC5jb20+CisgIAorICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICAtLT4KKzwhRE9DVFlQRSBsaWJyYXJ5IFBVQkxJQyAiLS8vQm9vc3QvL0RURCBCb29zdEJvb2sgWE1MIFYxLjAvL0VOIgorICAiaHR0cDovL3d3dy5ib29zdC5vcmcvdG9vbHMvYm9vc3Rib29rL2R0ZC9ib29zdGJvb2suZHRkIj4KKzxzZWN0aW9uIGlkPSJmdW5jdGlvbi5oaXN0b3J5IiBsYXN0LXJldmlzaW9uPSIkRGF0ZSQiPgorICA8dGl0bGU+SGlzdG9yeSAmYW1wOyBDb21wYXRpYmlsaXR5IE5vdGVzPC90aXRsZT4KKworPGl0ZW1pemVkbGlzdCBzcGFjaW5nPSJjb21wYWN0Ij4KKworICA8bGlzdGl0ZW0+PHBhcmE+PGJvbGQ+VmVyc2lvbiAxLjUyLjA8L2JvbGQ+OiA8L3BhcmE+CisgICAgPGl0ZW1pemVkbGlzdCBzcGFjaW5nPSJjb21wYWN0Ij4KKyAgICAgIDxsaXN0aXRlbT48cGFyYT5Nb3ZlIGNvbnN0cnVjdG9ycyBhbmQgbW92ZSBhc3NpZ25tZW50IAorICAgICAgb3BlcmF0b3JzIGFkZGVkIChvbmx5IGZvciBjb21waWxlcnMgd2l0aCBDKysxMSBydmFsdWUgCisgICAgICByZWZlcmVuY2VzIHN1cHBvcnQpLiBPcmlnaW5hbCBwYXRjaAorICAgICAgY29udHJpYnV0ZWQgYnkgQW50b255IFBvbHVraGluLjwvcGFyYT48L2xpc3RpdGVtPgorICAgIDwvaXRlbWl6ZWRsaXN0PgorICA8L2xpc3RpdGVtPgorCisgIDxsaXN0aXRlbT48cGFyYT48Ym9sZD5WZXJzaW9uIDEuMzcuMDwvYm9sZD46IDwvcGFyYT4KKyAgICA8aXRlbWl6ZWRsaXN0IHNwYWNpbmc9ImNvbXBhY3QiPgorICAgICAgPGxpc3RpdGVtPjxwYXJhPkltcHJvdmVkIHRoZSBwZXJmb3JtYW5jZSBvZiBCb29zdC5GdW5jdGlvbidzCisgICAgICBzd2FwKCkgb3BlcmF0aW9uIGZvciBsYXJnZSBmdW5jdGlvbiBvYmplY3RzLiBPcmlnaW5hbCBwYXRjaAorICAgICAgY29udHJpYnV0ZWQgYnkgTmllbHMgRGVra2VyLjwvcGFyYT48L2xpc3RpdGVtPgorCisgICAgICA8bGlzdGl0ZW0+PHBhcmE+QWRkZWQgYSBuZXcgaGVhZGVyICZsdDtib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90eXBlb2YuaHBwJmd0OyB0aGF0IHByb3ZpZGVzIHN1cHBvcnQgZm9yIHVzaW5nIHRoZSBCb29zdC5UeXBlb2YgbGlicmFyeSBvbiBCb29zdC5GdW5jdGlvbiBvYmplY3RzLjwvcGFyYT48L2xpc3RpdGVtPgorCisgICAgICA8bGlzdGl0ZW0+PHBhcmE+QWRkZWQgYSBuZXcgaGVhZGVyICZsdDtib29zdC9mdW5jdGlvbi9mdW5jdGlvbl9md2QuaHBwJmd0OyB0aGF0IHByb3ZpZGVzIHN1cHBvcnQgZm9yIHVzaW5nIHRoZSBCb29zdC5UeXBlb2YgbGlicmFyeSBvbiBCb29zdC5GdW5jdGlvbiBvYmplY3RzLjwvcGFyYT48L2xpc3RpdGVtPgorCisgICAgICA8bGlzdGl0ZW0+PHBhcmE+VGhlIDxtZXRob2RuYW1lIGFsdD0iYm9vc3Q6OmZ1bmN0aW9uOjp0YXJnZXQiPnRhcmdldDwvbWV0aG9kbmFtZT4oKQorICAgICAgZnVuY3Rpb24gbm93IHJlc3BlY3RzIHRoZSBjdi1xdWFsaWZpZXJzIG9mIGZ1bmN0aW9uIG9iamVjdHMKKyAgICAgIHN0b3JlZCBieSByZWZlcmVuY2UKKyAgICAgICh1c2luZyA8Y2xhc3NuYW1lPmJvb3N0OjpyZWZlcmVuY2Vfd3JhcHBlcjwvY2xhc3NuYW1lPiksIHN1Y2gKKyAgICAgIHRoYXQgYSByZWZlcmVuY2UgdG8gYSA8Y29kZT5jb25zdDwvY29kZT4gZnVuY3Rpb24gb2JqZWN0IGNhbm5vdAorICAgICAgYmUgYWNjZXNzZWQgYXMgYSByZWZlcmVuY2UgdG8gYSBub24tPGNvZGU+Y29uc3Q8L2NvZGU+IGZ1bmN0aW9uCisgICAgICBvYmplY3QuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgPC9pdGVtaXplZGxpc3Q+CisgIDwvbGlzdGl0ZW0+CisKKyAgPGxpc3RpdGVtPjxwYXJhPjxib2xkPlZlcnNpb24gMS4zNi4wPC9ib2xkPjogPC9wYXJhPgorICAgIDxpdGVtaXplZGxpc3Qgc3BhY2luZz0iY29tcGFjdCI+CisgICAgICA8bGlzdGl0ZW0+PHBhcmE+Qm9vc3QuRnVuY3Rpb24gbm93IGltcGxlbWVudHMgYWxsb2NhdG9yIHN1cHBvcnQKKyAgICAgIGluIHRoZSBzYW1lIHdheSB0aGF0IGlzIGlzIHByb3ZpZGVkIGluIEMrKzB4LCBiYXNlZCBvbiBDKysKKyAgICAgIGNvbW1pdHRlZQorICAgICAgcHJvcG9zYWwgPHVsaW5rIHVybD0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9wYXBlcnMvMjAwNy9uMjMwOC5odG1sIj5OMjMwODwvdWxpbms+LiBUaGlzCisgICAgICBjaGFuZ2UgcmVtb3ZlcyB0aGUgPGNvbXB1dGVyb3V0cHV0PkFsbG9jYXRvcjwvY29tcHV0ZXJvdXRwdXQ+CisgICAgICB0ZW1wbGF0ZSBwYXJhbWV0ZXIgb2YgPGNsYXNzbmFtZT5ib29zdDo6ZnVuY3Rpb248L2NsYXNzbmFtZT4gaW4KKyAgICAgIGZhdm9yIG9mIGEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhbiBhcmd1bWVudC4gV2hpbGUgdGhpcyBpcyBhCisgICAgICBiYWNrd2FyZC1pbmNvbXBhdGlibGUgY2hhbmdlLCBpdCBpcyBsaWtlbHkgdG8gYWZmZWN0IG9ubHkgYSBmZXcKKyAgICAgIHVzZXJzLiBUaGlzIGNoYW5nZSB0byBGdW5jdGlvbiB3YXMgY29udHJpYnV0ZWQgYnkgRW1pbAorICAgICAgRG90Y2hldnNraSwgd2hpY2ggYWxzbyBhdXRob3JlZCB0aGUgY29ycmVzcG9uZGluZyBDKysgY29tbWl0dGVlCisgICAgICBwcm9wb3NhbC48L3BhcmE+PC9saXN0aXRlbT4KKyAgICA8L2l0ZW1pemVkbGlzdD4KKyAgPC9saXN0aXRlbT4KKworICA8bGlzdGl0ZW0+PHBhcmE+PGJvbGQ+VmVyc2lvbiAxLjM0LjA8L2JvbGQ+OiA8L3BhcmE+IAorICAgIDxpdGVtaXplZGxpc3Qgc3BhY2luZz0iY29tcGFjdCI+CisgICAgICA8bGlzdGl0ZW0+PHBhcmE+Qm9vc3QuRnVuY3Rpb24gbm93IGltcGxlbWVudHMgYSBzbWFsbCBidWZmZXIgb3B0aW1pemF0aW9uLCB3aGljaCBjYW4gZHJhc3RpY2FsbHkgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugd2hlbiBjb3B5aW5nIG9yIGNvbnN0cnVjdGlvbiBCb29zdC5GdW5jdGlvbiBvYmplY3RzIHN0b3Jpbmcgc21hbGwgZnVuY3Rpb24gb2JqZWN0cy4gRm9yIGluc3RhbmNlLCA8Y29kZT5iaW5kKCZhbXA7WDpmb28sICZhbXA7eCwgXzEsIF8yKTwvY29kZT4gcmVxdWlyZXMgbm8gaGVhcCBhbGxvY2F0aW9uIHdoZW4gcGxhY2VkIGludG8gYSBCb29zdC5GdW5jdGlvbiBvYmplY3QuIE5vdGUgdGhhdCBzb21lIGV4Y2VwdGlvbi1zYWZldHkgZ3VhcmFudGVlcyBoYXZlIGNoYW5nZWQ6IGFzc2lnbm1lbnQgcHJvdmlkZXMgdGhlIGJhc2ljIGV4Y2VwdGlvbiBndWFyYW50ZWUgYW5kIDxjb2RlPnN3YXAoKTwvY29kZT4gbWF5IHRocm93LjwvcGFyYT48L2xpc3RpdGVtPgorICAgIDwvaXRlbWl6ZWRsaXN0PgorICA8L2xpc3RpdGVtPgorCisgIDxsaXN0aXRlbT48cGFyYT48Ym9sZD5WZXJzaW9uIDEuMzAuMDwvYm9sZD46IDwvcGFyYT4gCisgICAgPGl0ZW1pemVkbGlzdCBzcGFjaW5nPSJjb21wYWN0Ij4KKyAgICAgIDxsaXN0aXRlbT48cGFyYT5BbGwgZmVhdHVyZXMgZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEuMjkuMCBoYXZlCisgICAgICBiZWVuIHJlbW92ZWQgZnJvbSBCb29zdC5GdW5jdGlvbi48L3BhcmE+PC9saXN0aXRlbT4KKyAKKyAgICAgIDxsaXN0aXRlbT48cGFyYT48Y29kZT48Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbjwvY2xhc3NuYW1lPjwvY29kZT4KKyAgICAgIGFuZCA8Y29kZT48Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbk48L2NsYXNzbmFtZT48L2NvZGU+IG9iamVjdHMKKyAgICAgIGNhbiBiZSBhc3NpZ25lZCB0byAwIChzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byBjYWxsaW5nCisgICAgICA8Y29kZT48bWV0aG9kbmFtZQorICAgICAgYWx0PSJib29zdDo6ZnVuY3Rpb246OmNsZWFyIj5jbGVhcjwvbWV0aG9kbmFtZT4oKTwvY29kZT4pIGFuZAorICAgICAgY29tcGFyZWQgYWdhaW5zdCAwIChzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byBjYWxsaW5nCisgICAgICA8Y29kZT48bWV0aG9kbmFtZQorICAgICAgYWx0PSJib29zdDo6ZnVuY3Rpb246OmVtcHR5Ij5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT4pLjwvcGFyYT48L2xpc3RpdGVtPgorCisgICAgICA8bGlzdGl0ZW0+PHBhcmE+VGhlIEJvb3N0LkZ1bmN0aW9uIGNvZGUgaXMgbm93IGdlbmVyYXRlZAorICAgICAgZW50aXJlbHkgYnkgdGhlIDxsaWJyYXJ5bmFtZT5QcmVwcm9jZXNzb3I8L2xpYnJhcnluYW1lPiBsaWJyYXJ5LAorICAgICAgc28gaXQgaXMgbm93IHBvc3NpYmxlIHRvIGdlbmVyYXRlCisgICAgICA8Y29kZT48Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbjwvY2xhc3NuYW1lPjwvY29kZT4gYW5kCisgICAgICA8Y29kZT48Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbk48L2NsYXNzbmFtZT48L2NvZGU+IGNsYXNzCisgICAgICB0ZW1wbGF0ZXMgZm9yIGFueSBudW1iZXIgb2YgYXJndW1lbnRzLjwvcGFyYT48L2xpc3RpdGVtPgorCisgICAgICA8bGlzdGl0ZW0+PHBhcmE+VGhlCisgICAgICA8Y2xhc3NuYW1lPmJvb3N0OjpiYWRfZnVuY3Rpb25fY2FsbDwvY2xhc3NuYW1lPiBleGNlcHRpb24gY2xhc3MKKyAgICAgIHdhcyBpbnRyb2R1Y2VkLjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgPC9pdGVtaXplZGxpc3Q+CisgIDwvbGlzdGl0ZW0+CisKKyAgPGxpc3RpdGVtPjxwYXJhPjxib2xkPlZlcnNpb24gMS4yOS4wPC9ib2xkPjoKKyAgQm9vc3QuRnVuY3Rpb24gaGFzIGJlZW4gcGFydGlhbGx5IHJlZGVzaWduZWQgdG8gbWluaW1pemUgdGhlCisgIGludGVyZmFjZSBhbmQgbWFrZSBpdCBjbGVhbmVyLiBTZXZlcmFsIHNlbGRvbS0gb3IgbmV2ZXItdXNlZAorICBmZWF0dXJlcyBvZiB0aGUgb2xkZXIgQm9vc3QuRnVuY3Rpb24gaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwKKyAgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUuIEhlcmUgaXMgYSBsaXN0IG9mIGZlYXR1cmVzIHRoYXQgaGF2ZQorICBiZWVuIGRlcHJlY2F0ZWQsIHRoZSBsaWtlbHkgaW1wYWN0IG9mIHRoZSBkZXByZWNhdGlvbnMsIGFuZCBob3cgdG8KKyAgYWRqdXN0IHlvdXIgY29kZToKKworPGl0ZW1pemVkbGlzdCBzcGFjaW5nPSJjb21wYWN0Ij4KKyAgPGxpc3RpdGVtPjxwYXJhPlRoZSA8Y29tcHV0ZXJvdXRwdXQ+Ym9vc3Q6OmZ1bmN0aW9uPC9jb21wdXRlcm91dHB1dD4gY2xhc3MgdGVtcGxhdGUgc3ludGF4IGhhcworICBjaGFuZ2VkLiBUaGUgb2xkIHN5bnRheCwgZS5nLiwgPGNvbXB1dGVyb3V0cHV0PmJvb3N0OjpmdW5jdGlvbiZsdDtpbnQsIGZsb2F0LAorICBkb3VibGUsIHN0ZDo6c3RyaW5nJmd0OzwvY29tcHV0ZXJvdXRwdXQ+LCBoYXMgYmVlbiBjaGFuZ2VkIHRvIGEgbW9yZSBuYXR1cmFsCisgIHN5bnRheCA8Y29tcHV0ZXJvdXRwdXQ+Ym9vc3Q6OmZ1bmN0aW9uJmx0O2ludCAoZmxvYXQsIGRvdWJsZSwKKyAgc3RkOjpzdHJpbmcpJmd0OzwvY29tcHV0ZXJvdXRwdXQ+LCB3aGVyZSBhbGwgcmV0dXJuIGFuZCBhcmd1bWVudCB0eXBlcyBhcmUKKyAgZW5jb2RlZCBpbiBhIHNpbmdsZSBmdW5jdGlvbiB0eXBlIHBhcmFtZXRlci4gQW55IG90aGVyIHRlbXBsYXRlCisgIHBhcmFtZXRlcnMgKGUuZy4sIHRoZSA8Y29tcHV0ZXJvdXRwdXQ+QWxsb2NhdG9yPC9jb21wdXRlcm91dHB1dD4pIGZvbGxvdyB0aGlzIHNpbmdsZQorICBwYXJhbWV0ZXIuPC9wYXJhPgorCisgIDxwYXJhPiBUaGUgcmVzb2x1dGlvbiB0byB0aGlzIGNoYW5nZSBkZXBlbmRzIG9uIHRoZQorICBhYmlsaXRpZXMgb2YgeW91ciBjb21waWxlcjogaWYgeW91ciBjb21waWxlciBzdXBwb3J0cyB0ZW1wbGF0ZQorICBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGFuZCBjYW4gcGFyc2UgZnVuY3Rpb24gdHlwZXMgKG1vc3QgZG8pLCBtb2RpZnkgCisgIHlvdXIgY29kZSB0byB1c2UgdGhlIG5ld2VyCisgIHN5bnRheCAocHJlZmVyYWJsZSkgb3IgZGlyZWN0bHkgdXNlIG9uZSBvZiB0aGUKKyAgPGNvbXB1dGVyb3V0cHV0PmZ1bmN0aW9uTjwvY29tcHV0ZXJvdXRwdXQ+IGNsYXNzZXMgd2hvc2Ugc3ludGF4IGhhcyBub3QKKyAgY2hhbmdlZC4gSWYgeW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IHRlbXBsYXRlIHBhcnRpYWwKKyAgc3BlY2lhbGl6YXRpb24gb3IgZnVuY3Rpb24gdHlwZXMsIHlvdSBtdXN0IHRha2UgdGhlIGxhdHRlciBvcHRpb24gYW5kIAorICB1c2UgdGhlIG51bWJlcmVkIEJvb3N0LkZ1bmN0aW9uIGNsYXNzZXMuIFRoaXMgb3B0aW9uIG1lcmVseSByZXF1aXJlcyAKKyAgY2hhbmdpbmcgdHlwZXMgc3VjaCBhcyA8Y29tcHV0ZXJvdXRwdXQ+Ym9vc3Q6OmZ1bmN0aW9uJmx0O3ZvaWQsIGludCwgaW50Jmd0OzwvY29tcHV0ZXJvdXRwdXQ+CisgIHRvIDxjb21wdXRlcm91dHB1dD5ib29zdDo6ZnVuY3Rpb24yJmx0O3ZvaWQsIGludCwgaW50Jmd0OzwvY29tcHV0ZXJvdXRwdXQ+IChhZGRpbmcgdGhlIG51bWJlciBvZgorICBmdW5jdGlvbiBhcmd1bWVudHMgdG8gdGhlIGVuZCBvZiB0aGUgY2xhc3MgbmFtZSkuPC9wYXJhPgorCisgIDxwYXJhPiBTdXBwb3J0IGZvciB0aGUgb2xkIHN5bnRheCB3aXRoIHRoZQorICA8Y29tcHV0ZXJvdXRwdXQ+Ym9vc3Q6OmZ1bmN0aW9uPC9jb21wdXRlcm91dHB1dD4gY2xhc3MgdGVtcGxhdGUgd2lsbCBwZXJzaXN0IGZvciBhIHNob3J0CisgIHdoaWxlLCBidXQgd2lsbCBldmVudHVhbGx5IGJlIHJlbW92ZWQgc28gdGhhdCB3ZSBjYW4gcHJvdmlkZSBiZXR0ZXIKKyAgZXJyb3IgbWVzc2FnZXMgYW5kIGxpbmsgY29tcGF0aWJpbGl0eS4gPC9wYXJhPjwvbGlzdGl0ZW0+IAorCisgIDxsaXN0aXRlbT48cGFyYT5UaGUgaW52b2NhdGlvbgorICBwb2xpY3kgdGVtcGxhdGUgcGFyYW1ldGVyICg8Y29tcHV0ZXJvdXRwdXQ+UG9saWN5PC9jb21wdXRlcm91dHB1dD4pIGhhcyBiZWVuIGRlcHJlY2F0ZWQKKyAgYW5kIHdpbGwgYmUgcmVtb3ZlZC4gVGhlcmUgaXMgbm8gZGlyZWN0IGVxdWl2YWxlbnQgdG8gdGhpcyByYXJlbHkKKyAgdXNlZCBmZWF0dXJlLjwvcGFyYT48L2xpc3RpdGVtPiAKKworICA8bGlzdGl0ZW0+PHBhcmE+VGhlIG1peGluIHRlbXBsYXRlIHBhcmFtZXRlcgorICAoPGNvbXB1dGVyb3V0cHV0Pk1peGluPC9jb21wdXRlcm91dHB1dD4pIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZC4gVGhlcmUKKyAgaXMgbm90IGRpcmVjdCBlcXVpdmFsZW50IHRvIHRoaXMgcmFyZWx5IHVzZWQgZmVhdHVyZS48L3BhcmE+PC9saXN0aXRlbT4gCisKKyAgPGxpc3RpdGVtPjxwYXJhPlRoZQorICA8Y29tcHV0ZXJvdXRwdXQ+c2V0PC9jb21wdXRlcm91dHB1dD4gbWV0aG9kcyBoYXZlIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZQorICByZW1vdmVkLiBVc2UgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IgaW5zdGVhZC48L3BhcmE+PC9saXN0aXRlbT4KKzwvaXRlbWl6ZWRsaXN0PgorPC9wYXJhPgorPC9saXN0aXRlbT4KKzwvaXRlbWl6ZWRsaXN0PgorPC9zZWN0aW9uPgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vZG9jL21pc2MueG1sIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vZG9jL21pc2MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMDkwNmMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9kb2MvbWlzYy54bWwKQEAgLTAsMCArMSw3MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgIENvcHlyaWdodCAoYykgMjAwMiBEb3VnbGFzIEdyZWdvciA8ZG91Zy5ncmVnb3IgLWF0LSBnbWFpbC5jb20+CisgIAorICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICAtLT4KKzwhRE9DVFlQRSBsaWJyYXJ5IFBVQkxJQyAiLS8vQm9vc3QvL0RURCBCb29zdEJvb2sgWE1MIFYxLjAvL0VOIgorICAiaHR0cDovL3d3dy5ib29zdC5vcmcvdG9vbHMvYm9vc3Rib29rL2R0ZC9ib29zdGJvb2suZHRkIj4KKzxzZWN0aW9uIGlkPSJmdW5jdGlvbi5taXNjIiBsYXN0LXJldmlzaW9uPSIkRGF0ZSQiPgorICA8dGl0bGU+TWlzY2VsbGFuZW91cyBOb3RlczwvdGl0bGU+CisKKyAgPHNlY3Rpb24+CisgICAgPHRpdGxlPkJvb3N0LkZ1bmN0aW9uIHZzLiBGdW5jdGlvbiBQb2ludGVyczwvdGl0bGU+Cis8cGFyYT5Cb29zdC5GdW5jdGlvbiBoYXMgc2V2ZXJhbCBhZHZhbnRhZ2VzIG92ZXIgZnVuY3Rpb24gcG9pbnRlcnMsIG5hbWVseToKKworPGl0ZW1pemVkbGlzdCBzcGFjaW5nPSJjb21wYWN0Ij4KKyAgIDxsaXN0aXRlbT48cGFyYT5Cb29zdC5GdW5jdGlvbiBhbGxvd3MgYXJiaXRyYXJ5IGNvbXBhdGlibGUgZnVuY3Rpb24gb2JqZWN0cyB0byBiZSB0YXJnZXRzIChpbnN0ZWFkIG9mIHJlcXVpcmluZyBhbiBleGFjdCBmdW5jdGlvbiBzaWduYXR1cmUpLjwvcGFyYT48L2xpc3RpdGVtPgorICAgPGxpc3RpdGVtPjxwYXJhPkJvb3N0LkZ1bmN0aW9uIG1heSBiZSB1c2VkIHdpdGggYXJndW1lbnQtYmluZGluZyBhbmQgb3RoZXIgZnVuY3Rpb24gb2JqZWN0IGNvbnN0cnVjdGlvbiBsaWJyYXJpZXMuPC9wYXJhPjwvbGlzdGl0ZW0+CisgICA8bGlzdGl0ZW0+PHBhcmE+Qm9vc3QuRnVuY3Rpb24gaGFzIHByZWRpY3RpYmxlIGJlaGF2aW9yIHdoZW4gYW4gZW1wdHkgZnVuY3Rpb24gb2JqZWN0IGlzIGNhbGxlZC4gPC9wYXJhPjwvbGlzdGl0ZW0+Cis8L2l0ZW1pemVkbGlzdD48L3BhcmE+CisKKzxwYXJhPiBBbmQsIG9mIGNvdXJzZSwgZnVuY3Rpb24gcG9pbnRlcnMgaGF2ZSBzZXZlcmFsIGFkdmFudGFnZXMgb3ZlciBCb29zdC5GdW5jdGlvbjoKKworPGl0ZW1pemVkbGlzdCBzcGFjaW5nPSJjb21wYWN0Ij4KKyAgICA8bGlzdGl0ZW0+PHBhcmE+IEZ1bmN0aW9uIHBvaW50ZXJzIGFyZSBzbWFsbGVyICh0aGUgc2l6ZSBvZiBvbmUgcG9pbnRlciBpbnN0ZWFkIG9mIGZvdXIgb3IgbW9yZSkgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgPGxpc3RpdGVtPjxwYXJhPiBGdW5jdGlvbiBwb2ludGVycyBhcmUgZmFzdGVyIChCb29zdC5GdW5jdGlvbiBtYXkgcmVxdWlyZSB0d28gY2FsbHMgdGhyb3VnaCBmdW5jdGlvbiBwb2ludGVycykgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgPGxpc3RpdGVtPjxwYXJhPiBGdW5jdGlvbiBwb2ludGVycyBhcmUgYmFja3dhcmQtY29tcGF0aWJsZSB3aXRoIEMgbGlicmFyaWVzLjwvcGFyYT48L2xpc3RpdGVtPgorICAgIDxsaXN0aXRlbT48cGFyYT4gTW9yZSByZWFkYWJsZSBlcnJvciBtZXNzYWdlcy4gPC9wYXJhPjwvbGlzdGl0ZW0+Cis8L2l0ZW1pemVkbGlzdD4KKzwvcGFyYT4KKyAgPC9zZWN0aW9uPgorCisgIDxzZWN0aW9uPgorICAgIDx0aXRsZT5QZXJmb3JtYW5jZTwvdGl0bGU+CisKKzxzZWN0aW9uPgorICA8dGl0bGU+RnVuY3Rpb24gb2JqZWN0IHdyYXBwZXIgc2l6ZTwvdGl0bGU+CisgIDxwYXJhPiBGdW5jdGlvbiBvYmplY3Qgd3JhcHBlcnMgd2lsbCBiZSB0aGUgc2l6ZSBvZiBhIHN0cnVjdCBjb250YWluaW5nIGEgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIgYW5kIHR3byBkYXRhIHBvaW50ZXJzLiBUaGUgYWN0dWFsIHNpemUgY2FuIHZhcnkgc2lnbmlmaWNhbnRseSBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgcGxhdGZvcm07IG9uIDMyLWJpdCBNYWMgT1MgWCB3aXRoIEdDQywgdGhpcyBhbW91bnRzIHRvIDE2IGJ5dGVzLCB3aGlsZSBpdCBpcyAzMiBieXRlcyBXaW5kb3dzIHdpdGggVmlzdWFsIEMrKy4gQWRkaXRpb25hbGx5LCB0aGUgZnVuY3Rpb24gb2JqZWN0IHRhcmdldCBtYXkgYmUgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLCBpZiBpdCBjYW5ub3QgYmUgcGxhY2VkIGludG8gdGhlIHNtYWxsLW9iamVjdCBidWZmZXIgaW4gdGhlIDxjb2RlPmJvb3N0OjpmdW5jdGlvbjwvY29kZT4gb2JqZWN0LjwvcGFyYT4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24+CisgIDx0aXRsZT5Db3B5aW5nIGVmZmljaWVuY3k8L3RpdGxlPgorICA8cGFyYT4gQ29weWluZyBmdW5jdGlvbiBvYmplY3Qgd3JhcHBlcnMgbWF5IHJlcXVpcmUgYWxsb2NhdGluZyBtZW1vcnkgZm9yIGEgY29weSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0IHRhcmdldC4gVGhlIGRlZmF1bHQgYWxsb2NhdG9yIG1heSBiZSByZXBsYWNlZCB3aXRoIGEgZmFzdGVyIGN1c3RvbSBhbGxvY2F0b3Igb3Igb25lIG1heSBjaG9vc2UgdG8gYWxsb3cgdGhlIGZ1bmN0aW9uIG9iamVjdCB3cmFwcGVycyB0byBvbmx5IHN0b3JlIGZ1bmN0aW9uIG9iamVjdCB0YXJnZXRzIGJ5IHJlZmVyZW5jZSAodXNpbmcgPGNvbXB1dGVyb3V0cHV0PnJlZjwvY29tcHV0ZXJvdXRwdXQ+KSBpZiB0aGUgY29zdCBvZiB0aGlzIGNsb25pbmcgYmVjb21lcyBwcm9oaWJpdGl2ZS4gU21hbGwgZnVuY3Rpb24gb2JqZWN0cyBjYW4gYmUgc3RvcmVkIHdpdGhpbiB0aGUgPGNvZGU+Ym9vc3Q6OmZ1bmN0aW9uPC9jb2RlPiBvYmplY3QgaXRzZWxmLCBpbXByb3ZpbmcgY29weWluZyBlZmZpY2llbmN5LjwvcGFyYT4KKyA8L3NlY3Rpb24+CisKKzxzZWN0aW9uPgorICA8dGl0bGU+SW52b2NhdGlvbiBlZmZpY2llbmN5PC90aXRsZT4KKzxwYXJhPiBXaXRoIGEgcHJvcGVybHkgaW5saW5pbmcgY29tcGlsZXIsIGFuIGludm9jYXRpb24gb2YgYSBmdW5jdGlvbiBvYmplY3QgcmVxdWlyZXMgb25lIGNhbGwgdGhyb3VnaCBhIGZ1bmN0aW9uIHBvaW50ZXIuIElmIHRoZSBjYWxsIGlzIHRvIGEgZnJlZSBmdW5jdGlvbiBwb2ludGVyLCBhbiBhZGRpdGlvbmFsIGNhbGwgbXVzdCBiZSBtYWRlIHRvIHRoYXQgZnVuY3Rpb24gcG9pbnRlciAodW5sZXNzIHRoZSBjb21waWxlciBoYXMgdmVyeSBwb3dlcmZ1bCBpbnRlcnByb2NlZHVyYWwgYW5hbHlzaXMpLjwvcGFyYT4KKyAgPC9zZWN0aW9uPgorPC9zZWN0aW9uPgorCisgIDxzZWN0aW9uPgorICAgIDx0aXRsZT5Db21iYXR0aW5nIHZpcnR1YWwgZnVuY3Rpb24gImJsb2F0IjwvdGl0bGU+Cis8cGFyYT4gVGhlIHVzZSBvZiB2aXJ0dWFsIGZ1bmN0aW9ucyB0ZW5kcyB0byBjYXVzZSAnY29kZSBibG9hdCcgb24gbWFueSBjb21waWxlcnMuIFdoZW4gYSBjbGFzcyBjb250YWlucyBhIHZpcnR1YWwgZnVuY3Rpb24sIGl0IGlzIG5lY2Vzc2FyeSB0byBlbWl0IGFuIGFkZGl0aW9uYWwgZnVuY3Rpb24gdGhhdCBjbGFzc2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuIEl0IGhhcyBiZWVuIG91ciBleHBlcmllbmNlIHRoYXQgdGhlc2UgYXV4aWxpYXJ5IGZ1bmN0aW9ucyBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgZXhlY3V0YWJsZSBzaWduaWZpY2FudGx5IHdoZW4gbWFueSA8Y29tcHV0ZXJvdXRwdXQ+Ym9vc3Q6OmZ1bmN0aW9uPC9jb21wdXRlcm91dHB1dD4gb2JqZWN0cyBhcmUgdXNlZC4gPC9wYXJhPgorCis8cGFyYT4gSW4gQm9vc3QuRnVuY3Rpb24sIGFuIGFsdGVybmF0aXZlIGJ1dCBlcXVpdmFsZW50IGFwcHJvYWNoIHdhcyB0YWtlbiB1c2luZyBmcmVlIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIHZpcnR1YWwgZnVuY3Rpb25zLiBUaGUgQm9vc3QuRnVuY3Rpb24gb2JqZWN0IGVzc2VudGlhbGx5IGhvbGRzIHR3byBwb2ludGVycyB0byBtYWtlIGEgdmFsaWQgdGFyZ2V0IGNhbGw6IGEgdm9pZCBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbiBvYmplY3QgaXQgY29udGFpbnMgYW5kIGEgdm9pZCBwb2ludGVyIHRvIGFuICJpbnZva2VyIiB0aGF0IGNhbiBjYWxsIHRoZSBmdW5jdGlvbiBvYmplY3QsIGdpdmVuIHRoZSBmdW5jdGlvbiBwb2ludGVyLiBUaGlzIGludm9rZXIgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWUgY29udmVyc2lvbnMgQm9vc3QuRnVuY3Rpb24gcHJvdmlkZXMuIEEgdGhpcmQgcG9pbnRlciBwb2ludHMgdG8gYSBmcmVlIGZ1bmN0aW9uIGNhbGxlZCB0aGUgIm1hbmFnZXIiLCB3aGljaCBoYW5kbGVzIHRoZSBjbG9uaW5nIGFuZCBkZXN0cnVjdGlvbiBvZiBmdW5jdGlvbiBvYmplY3RzLiBUaGUgc2NoZW1lIGlzIHR5cGVzYWZlIGJlY2F1c2UgdGhlIG9ubHkgZnVuY3Rpb25zIHRoYXQgYWN0dWFsbHkgaGFuZGxlIHRoZSBmdW5jdGlvbiBvYmplY3QsIHRoZSBpbnZva2VyIGFuZCB0aGUgbWFuYWdlciwgYXJlIGluc3RhbnRpYXRlZCBnaXZlbiB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LCBzbyB0aGV5IGNhbiBzYWZlbHkgY2FzdCB0aGUgaW5jb21pbmcgdm9pZCBwb2ludGVyICh0aGUgZnVuY3Rpb24gb2JqZWN0IHBvaW50ZXIpIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlLjwvcGFyYT4KKyAgPC9zZWN0aW9uPgorCisgIDxzZWN0aW9uPgorICAgIDx0aXRsZT5BY2tub3dsZWRnZW1lbnRzPC90aXRsZT4gCisKKyAgICA8cGFyYT4gTWFueSBwZW9wbGUgd2VyZSBpbnZvbHZlZCBpbiB0aGUgY29uc3RydWN0aW9uIG9mIHRoaXMKKyAgICBsaWJyYXJ5LiBXaWxsaWFtIEtlbXBmLCBKZXNzZSBKb25lcyBhbmQgS2FybCBOZWxzb24gd2VyZSBhbGwKKyAgICBleHRyZW1lbHkgaGVscGZ1bCBpbiBpc29sYXRpbmcgYW4gaW50ZXJmYWNlIGFuZCBzY29wZSBmb3IgdGhlCisgICAgbGlicmFyeS4gSm9obiBNYWRkb2NrIG1hbmFnZWQgdGhlIGZvcm1hbCByZXZpZXcsIGFuZCBtYW55CisgICAgcmV2aWV3ZXJzIGdhdmUgZXhjZWxsZW50IGNvbW1lbnRzIG9uIGludGVyZmFjZSwgaW1wbGVtZW50YXRpb24sCisgICAgYW5kIGRvY3VtZW50YXRpb24uIFBldGVyIERpbW92IGxlZCB1cyB0byB0aGUgZnVuY3Rpb24KKyAgICBkZWNsYXJhdG9yLWJhc2VkIHN5bnRheC48L3BhcmE+CisgIDwvc2VjdGlvbj4KKzwvc2VjdGlvbj4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2RvYy9yZWZlcmVuY2UueG1sIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vZG9jL3JlZmVyZW5jZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRkYzY2MwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2RvYy9yZWZlcmVuY2UueG1sCkBAIC0wLDAgKzEsOTkyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICAgQ29weXJpZ2h0IChjKSAyMDAyIERvdWdsYXMgR3JlZ29yIDxkb3VnLmdyZWdvciAtYXQtIGdtYWlsLmNvbT4KKyAgCisgICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgICAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisgICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgIC0tPgorPCFET0NUWVBFIGxpYnJhcnkgUFVCTElDICItLy9Cb29zdC8vRFREIEJvb3N0Qm9vayBYTUwgVjEuMC8vRU4iCisgICJodHRwOi8vd3d3LmJvb3N0Lm9yZy90b29scy9ib29zdGJvb2svZHRkL2Jvb3N0Ym9vay5kdGQiPgorCis8bGlicmFyeS1yZWZlcmVuY2UgaWQ9ImZ1bmN0aW9uLnJlZmVyZW5jZSIgbGFzdC1yZXZpc2lvbj0iJERhdGUkIj4KKworPHNlY3Rpb24gaWQ9ImZ1bmN0aW9uLmRlZmluaXRpb25zIj4KKyAgPHRpdGxlPkRlZmluaXRpb25zPC90aXRsZT4KKzxwYXJhPgorICA8aXRlbWl6ZWRsaXN0PgorICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPkEgZnVuY3Rpb24gb2JqZWN0IDxjb21wdXRlcm91dHB1dD5mPC9jb21wdXRlcm91dHB1dD4gaXMKKyAgICAgIDxlbXBoYXNpcz5jb21wYXRpYmxlPC9lbXBoYXNpcz4gaWYgZm9yIHRoZSBnaXZlbiBzZXQgb2YgYXJndW1lbnQKKyAgICAgIHR5cGVzIDxjb21wdXRlcm91dHB1dD5BcmcxPC9jb21wdXRlcm91dHB1dD4sCisgICAgICA8Y29tcHV0ZXJvdXRwdXQ+QXJnMjwvY29tcHV0ZXJvdXRwdXQ+LCAuLi4sCisgICAgICA8Y29tcHV0ZXJvdXRwdXQ+QXJnTjwvY29tcHV0ZXJvdXRwdXQ+IGFuZCBhCisgICAgICByZXR1cm4gdHlwZSA8Y29tcHV0ZXJvdXRwdXQ+UmVzdWx0VHlwZTwvY29tcHV0ZXJvdXRwdXQ+LCB0aGUKKyAgICAgIGFwcHJvcHJpYXRlIGZvbGxvd2luZyBmdW5jdGlvbiBpcyB3ZWxsLWZvcm1lZDoKKzxwcm9ncmFtbGlzdGluZz4KKyAgPGVtcGhhc2lzPi8vIGlmIFJlc3VsdFR5cGUgaXMgbm90IDxlbXBoYXNpcyByb2xlPSJib2xkIj52b2lkPC9lbXBoYXNpcz48L2VtcGhhc2lzPgorICBSZXN1bHRUeXBlIGZvbyhBcmcxIGFyZzEsIEFyZzIgYXJnMiwgLi4uLCBBcmc8ZW1waGFzaXM+TjwvZW1waGFzaXM+IGFyZzxlbXBoYXNpcz5OPC9lbXBoYXNpcz4pCisgIHsKKyAgICA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+cmV0dXJuPC9lbXBoYXNpcz4gZihhcmcxLCBhcmcyLCAuLi4sIGFyZzxlbXBoYXNpcz5OPC9lbXBoYXNpcz4pOworICB9CisKKyAgPGVtcGhhc2lzPi8vIGlmIFJlc3VsdFR5cGUgaXMgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPnZvaWQ8L2VtcGhhc2lzPjwvZW1waGFzaXM+CisgIFJlc3VsdFR5cGUgZm9vKEFyZzEgYXJnMSwgQXJnMiBhcmcyLCAuLi4sIEFyZzxlbXBoYXNpcz5OPC9lbXBoYXNpcz4gYXJnPGVtcGhhc2lzPk48L2VtcGhhc2lzPikKKyAgeworICAgIGYoYXJnMSwgYXJnMiwgLi4uLCBhcmc8ZW1waGFzaXM+TjwvZW1waGFzaXM+KTsKKyAgfQorPC9wcm9ncmFtbGlzdGluZz48L3BhcmE+CisKKyAgICAgIDxwYXJhPiBBIHNwZWNpYWwgcHJvdmlzaW9uIGlzIG1hZGUgZm9yIHBvaW50ZXJzIHRvIG1lbWJlcgorICAgICAgZnVuY3Rpb25zLiBUaG91Z2ggdGhleSBhcmUgbm90IGZ1bmN0aW9uIG9iamVjdHMsIEJvb3N0LkZ1bmN0aW9uCisgICAgICB3aWxsIGFkYXB0IHRoZW0gaW50ZXJuYWxseSB0byBmdW5jdGlvbiBvYmplY3RzLiBUaGlzIHJlcXVpcmVzCisgICAgICB0aGF0IGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gb2YgdGhlIGZvcm0gPGNvZGU+UgorICAgICAgKFg6OiptZikoQXJnMSwgQXJnMiwgLi4uLCBBcmdOKQorICAgICAgY3YtcXVhbHM8L2NvZGU+IGJlIGFkYXB0ZWQgdG8gYQorICAgICAgZnVuY3Rpb24gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsIG9wZXJhdG9yCisgICAgICBvdmVybG9hZHM6Cis8cHJvZ3JhbWxpc3Rpbmc+CisgIDxlbXBoYXNpcyByb2xlPSJib2xkIj50ZW1wbGF0ZTwvZW1waGFzaXM+Jmx0OzxlbXBoYXNpcyByb2xlPSJib2xkIj50eXBlbmFtZSBQPC9lbXBoYXNpcz4mZ3Q7CisgIFIgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPm9wZXJhdG9yPC9lbXBoYXNpcz4oKSg8ZW1waGFzaXM+Y3YtcXVhbHM8L2VtcGhhc2lzPiBQJmFtcDsgeCwgQXJnMSBhcmcxLCBBcmcyIGFyZzIsIC4uLiwgQXJnPGVtcGhhc2lzPk48L2VtcGhhc2lzPiBhcmc8ZW1waGFzaXM+TjwvZW1waGFzaXM+KSA8ZW1waGFzaXMgcm9sZT0iYm9sZCI+Y29uc3Q8L2VtcGhhc2lzPgorICB7CisgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPnJldHVybjwvZW1waGFzaXM+ICgqeCkuKm1mKGFyZzEsIGFyZzIsIC4uLiwgYXJnPGVtcGhhc2lzPk48L2VtcGhhc2lzPik7CisgIH0KKzwvcHJvZ3JhbWxpc3Rpbmc+Cis8L3BhcmE+CisgICAgPC9saXN0aXRlbT4KKyAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT5BIGZ1bmN0aW9uIG9iamVjdCA8Y29kZT5mPC9jb2RlPiBvZgorICAgICAgdHlwZSA8Y29kZT5GPC9jb2RlPiBpcworICAgICAgPGVtcGhhc2lzPnN0YXRlbGVzczwvZW1waGFzaXM+IGlmIGl0IGlzIGEgZnVuY3Rpb24gcG9pbnRlciBvciBpZgorICAgICAgPGNvZGU+PGNsYXNzbmFtZT5ib29zdDo6aXNfc3RhdGVsZXNzPC9jbGFzc25hbWU+Jmx0O0YmZ3Q7PC9jb2RlPgorICAgICAgaXMgdHJ1ZS4gVGhlIGNvbnN0cnVjdGlvbiBvZiBvciBjb3B5IHRvIGEgQm9vc3QuRnVuY3Rpb24gb2JqZWN0CisgICAgICBmcm9tIGEgc3RhdGVsZXNzIGZ1bmN0aW9uIG9iamVjdCB3aWxsIG5vdCBjYXVzZSBleGNlcHRpb25zIHRvIGJlCisgICAgICB0aHJvd24gYW5kIHdpbGwgbm90IGFsbG9jYXRlIGFueSBzdG9yYWdlLgorICAgICAgPC9wYXJhPgorICAgIDwvbGlzdGl0ZW0+CisgIDwvaXRlbWl6ZWRsaXN0PgorPC9wYXJhPgorPC9zZWN0aW9uPgorCis8aGVhZGVyIG5hbWU9ImJvb3N0L2Z1bmN0aW9uLmhwcCI+Cis8bmFtZXNwYWNlIG5hbWU9ImJvb3N0Ij4KKyAgPGNsYXNzIG5hbWU9ImJhZF9mdW5jdGlvbl9jYWxsIj4KKyAgICA8aW5oZXJpdCBhY2Nlc3M9InB1YmxpYyI+PGNsYXNzbmFtZT5zdGQ6OnJ1bnRpbWVfZXJyb3I8L2NsYXNzbmFtZT48L2luaGVyaXQ+CisgICAgPHB1cnBvc2U+QW4gZXhjZXB0aW9uIHR5cGUgdGhyb3duIHdoZW4gYW4gaW5zdGFuY2Ugb2YgYSA8Y29kZT5mdW5jdGlvbjwvY29kZT4gb2JqZWN0IGlzIGVtcHR5IHdoZW4gaW52b2tlZC48L3B1cnBvc2U+CisgICAgPGNvbnN0cnVjdG9yPgorICAgICAgPGVmZmVjdHM+PHNpbXBhcmE+Q29uc3RydWN0cyBhIDxjb2RlPjxjbGFzc25hbWU+YmFkX2Z1bmN0aW9uX2NhbGw8L2NsYXNzbmFtZT48L2NvZGU+IGV4Y2VwdGlvbiBvYmplY3QuPC9zaW1wYXJhPjwvZWZmZWN0cz4KKyAgICA8L2NvbnN0cnVjdG9yPgorICA8L2NsYXNzPgorCisgIDxjbGFzcyBuYW1lPSJmdW5jdGlvbl9iYXNlIj4KKyAgICA8cHVycG9zZT5UaGUgY29tbW9uIGJhc2UgY2xhc3MgZm9yIGFsbCBCb29zdC5GdW5jdGlvbgorICAgIG9iamVjdHMuIE9iamVjdHMgb2YgdHlwZSBmdW5jdGlvbl9iYXNlIG1heSBub3QgYmUgY3JlYXRlZAorICAgIGRpcmVjdGx5LjwvcHVycG9zZT4KKworICAgIDxtZXRob2QtZ3JvdXAgbmFtZT0iY2FwYWNpdHkiPgorICAgICAgPG1ldGhvZCBuYW1lPSJlbXB0eSIgY3Y9ImNvbnN0Ij4KKyAgICAgICAgPHR5cGU+Ym9vbDwvdHlwZT4KKyAgICAgICAgPHJldHVybnM+PHNpbXBhcmE+PGNvZGU+ZmFsc2U8L2NvZGU+IGlmIDxjb2RlPnRoaXM8L2NvZGU+IGhhcyBhIHRhcmdldCwgYW5kIDxjb2RlPnRydWU8L2NvZGU+IG90aGVyd2lzZS48L3NpbXBhcmE+PC9yZXR1cm5zPgorICAgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93Ljwvc2ltcGFyYT48L3Rocm93cz4KKyAgICAgIDwvbWV0aG9kPgorICAgIDwvbWV0aG9kLWdyb3VwPgorCisgICAgPG1ldGhvZC1ncm91cCBuYW1lPSJ0YXJnZXQgYWNjZXNzIj4KKyAgICAgIDxvdmVybG9hZGVkLW1ldGhvZCBuYW1lPSJ0YXJnZXQiPgorICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgIDx0ZW1wbGF0ZT4gCisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+RnVuY3Rvcio8L3R5cGU+CisgICAgICAgIDwvc2lnbmF0dXJlPgorICAgICAgICA8c2lnbmF0dXJlIGN2PSJjb25zdCI+CisgICAgICAgICAgPHRlbXBsYXRlPiAKKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGdW5jdG9yIi8+CisgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8dHlwZT5jb25zdCBGdW5jdG9yKjwvdHlwZT4KKyAgICAgICAgPC9zaWduYXR1cmU+CisKKyAgICAgICAgPHJldHVybnM+PHNpbXBhcmE+SWYgPGNvZGU+dGhpczwvY29kZT4gc3RvcmVzIGEgdGFyZ2V0IG9mIHR5cGUKKyAgICAgICAgPGNvZGU+RnVuY3RvcjwvY29kZT4sIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlCisgICAgICAgIHRhcmdldC4gT3RoZXJ3aXNlLCByZXR1cm5zIHRoZSBOVUxMCisgICAgICAgIHBvaW50ZXIuPC9zaW1wYXJhPjwvcmV0dXJucz4KKworICAgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93Ljwvc2ltcGFyYT48L3Rocm93cz4KKyAgICAgIDwvb3ZlcmxvYWRlZC1tZXRob2Q+CisKKyAgICAgIDxtZXRob2QgbmFtZT0iY29udGFpbnMiIGN2PSJjb25zdCI+CisgICAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICA8dHlwZT5ib29sPC90eXBlPgorICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPgorICAgICAgICAgIDxwYXJhbXR5cGU+Y29uc3QgRnVuY3RvciZhbXA7PC9wYXJhbXR5cGU+CisgICAgICAgIDwvcGFyYW1ldGVyPgorICAgICAgICA8cmV0dXJucz48c2ltcGFyYT48Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT50aGlzLSZndDs8bWV0aG9kbmFtZT50YXJnZXQ8L21ldGhvZG5hbWU+Jmx0O0Z1bmN0b3ImZ3Q7KCk8L2NvZGU+IGlzIG5vbi1OVUxMIGFuZCA8Y29kZT48ZnVuY3Rpb25uYW1lPmZ1bmN0aW9uX2VxdWFsPC9mdW5jdGlvbm5hbWU+KCoodGhpcy0mZ3Q7dGFyZ2V0Jmx0O0Z1bmN0b3ImZ3Q7KCkpLCBmKTwvY29kZT48L3NpbXBhcmE+PC9yZXR1cm5zPgorIAorICAgICAgPC9tZXRob2Q+CisKKyAgICAgIDxtZXRob2QgbmFtZT0idGFyZ2V0X3R5cGUiIGN2PSJjb25zdCI+CisgICAgICAgIDx0eXBlPmNvbnN0IHN0ZDo6dHlwZV9pbmZvJmFtcDs8L3R5cGU+CisgICAgICAgIDxyZXR1cm5zPjxzaW1wYXJhPjxjb2RlPnR5cGVpZDwvY29kZT4gb2YgdGhlIHRhcmdldCBmdW5jdGlvbiBvYmplY3QsIG9yIDxjb2RlPnR5cGVpZCh2b2lkKTwvY29kZT4gaWYgPGNvZGU+dGhpcy0mZ3Q7PG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvZGU+LiBXb3JrcyBldmVuIHdpdGggUlRUSSBvZmYuPC9zaW1wYXJhPjwvcmV0dXJucz4KKyAgICAgICAgPHRocm93cz48c2ltcGFyYT5XaWxsIG5vdCB0aHJvdy48L3NpbXBhcmE+PC90aHJvd3M+CisgICAgICA8L21ldGhvZD4KKyAgICA8L21ldGhvZC1ncm91cD4KKyAgPC9jbGFzcz4KKworICA8Y2xhc3MgbmFtZT0iZnVuY3Rpb25OIj4KKyAgICA8dGVtcGxhdGU+CisgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iUiIvPgorICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlQxIi8+CisgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVDIiLz4KKyAgICAgIDx0ZW1wbGF0ZS12YXJhcmdzLz4KKyAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUTiIvPgorICAgIDwvdGVtcGxhdGU+CisKKyAgICA8aW5oZXJpdCBhY2Nlc3M9InB1YmxpYyI+PGNsYXNzbmFtZT5mdW5jdGlvbl9iYXNlPC9jbGFzc25hbWU+PC9pbmhlcml0PgorCisgICAgPHB1cnBvc2U+QSBzZXQgb2YgZ2VuZXJhbGl6ZWQgZnVuY3Rpb24gcG9pbnRlcnMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgY2FsbGJhY2tzIG9yIHdyYXBwaW5nIGZ1bmN0aW9uIG9iamVjdHMuPC9wdXJwb3NlPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgPHBhcmE+Q2xhc3MgdGVtcGxhdGUgPGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4gaXMKKyAgICAgIGFjdHVhbGx5IGEgZmFtaWx5IG9mIHJlbGF0ZWQgY2xhc3NlcyA8Y2xhc3NuYW1lCisgICAgICBhbHQ9ImZ1bmN0aW9uTiI+ZnVuY3Rpb24wPC9jbGFzc25hbWU+LCA8Y2xhc3NuYW1lCisgICAgICBhbHQ9ImZ1bmN0aW9uTiI+ZnVuY3Rpb24xPC9jbGFzc25hbWU+LCBldGMuLCB1cCB0byBzb21lCisgICAgICBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIG1heGltdW0uIEluIHRoaXMgY29udGV4dCwgPGNvZGU+TjwvY29kZT4KKyAgICAgIHJlZmVycyB0byB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMuPC9wYXJhPgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8dHlwZWRlZiBuYW1lPSJyZXN1bHRfdHlwZSI+PHR5cGU+UjwvdHlwZT48L3R5cGVkZWY+CisgICAgPHR5cGVkZWYgbmFtZT0iYXJndW1lbnRfdHlwZSI+CisgICAgICA8dHlwZT5UMTwvdHlwZT48cHVycG9zZT5JZiBOID09IDE8L3B1cnBvc2U+CisgICAgPC90eXBlZGVmPgorICAgIDx0eXBlZGVmIG5hbWU9ImZpcnN0X2FyZ3VtZW50X3R5cGUiPgorICAgICAgPHR5cGU+VDE8L3R5cGU+CisgICAgICA8cHVycG9zZT5JZiBOID09IDI8L3B1cnBvc2U+CisgICAgPC90eXBlZGVmPgorICAgIDx0eXBlZGVmIG5hbWU9InNlY29uZF9hcmd1bWVudF90eXBlIj4KKyAgICAgIDx0eXBlPlQyPC90eXBlPgorICAgICAgPHB1cnBvc2U+SWYgTiA9PSAyPC9wdXJwb3NlPgorICAgIDwvdHlwZWRlZj4KKyAgICA8dHlwZWRlZiBuYW1lPSJhcmcxX3R5cGUiPjx0eXBlPlQxPC90eXBlPjwvdHlwZWRlZj4KKyAgICA8dHlwZWRlZiBuYW1lPSJhcmcyX3R5cGUiPjx0eXBlPlQyPC90eXBlPjwvdHlwZWRlZj4KKyAgICA8dHlwZWRlZiBuYW1lPSIuLi4iPjx0eXBlLz48L3R5cGVkZWY+CisgICAgPHR5cGVkZWYgbmFtZT0iYXJnTl90eXBlIj48dHlwZT5UTjwvdHlwZT48L3R5cGVkZWY+CisKKyAgICA8c3RhdGljLWNvbnN0YW50IG5hbWU9ImFyaXR5Ij4KKyAgICAgIDx0eXBlPmludDwvdHlwZT4KKyAgICAgIDxkZWZhdWx0Pk48L2RlZmF1bHQ+CisgICAgPC9zdGF0aWMtY29uc3RhbnQ+CisKKyAgICA8c3RydWN0IG5hbWU9InNpZyI+CisgICAgICA8dGVtcGxhdGU+CisgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJBcmdzIi8+CisgICAgICA8L3RlbXBsYXRlPgorCisgICAgICA8cHVycG9zZT4KKyAgICAgICAgPHNpbXBhcmE+PGxpYnJhcnluYW1lPkxhbWJkYTwvbGlicmFyeW5hbWU+IGxpYnJhcnkgc3VwcG9ydDwvc2ltcGFyYT4KKyAgICAgIDwvcHVycG9zZT4KKworICAgICAgPHR5cGVkZWYgbmFtZT0idHlwZSI+PHR5cGU+cmVzdWx0X3R5cGU8L3R5cGU+PC90eXBlZGVmPgorICAgIDwvc3RydWN0PgorCisgICAgPGNvbnN0cnVjdG9yPgorICAgICAgPHBvc3Rjb25kaXRpb25zPjxzaW1wYXJhPjxjb2RlPnRoaXMtJmd0OzxtZXRob2RuYW1lPmVtcHR5PC9tZXRob2RuYW1lPigpPC9jb2RlPjwvc2ltcGFyYT48L3Bvc3Rjb25kaXRpb25zPgorICAgICAgPHRocm93cz48c2ltcGFyYT5XaWxsIG5vdCB0aHJvdy48L3NpbXBhcmE+PC90aHJvd3M+CisgICAgPC9jb25zdHJ1Y3Rvcj4KKworICAgIDxjb25zdHJ1Y3Rvcj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+CisgICAgICAgIDxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4mYW1wOzwvcGFyYW10eXBlPgorICAgICAgPC9wYXJhbWV0ZXI+CisgICAgICA8cG9zdGNvbmRpdGlvbnM+PHNpbXBhcmE+Q29udGFpbnMgYSBjb3B5IG9mIHRoZSA8Y29kZT5mPC9jb2RlPidzIHRhcmdldCwgaWYgaXQgaGFzIG9uZSwgb3IgaXMgZW1wdHkgaWYgPGNvZGU+Zi48bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT4uPC9zaW1wYXJhPjwvcG9zdGNvbmRpdGlvbnM+CisgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93IHVubGVzcyBjb3B5aW5nIHRoZSB0YXJnZXQgb2YgPGNvZGU+ZjwvY29kZT4gdGhyb3dzLjwvc2ltcGFyYT48L3Rocm93cz4KKyAgICA8L2NvbnN0cnVjdG9yPgorCisgICAgPGNvbnN0cnVjdG9yPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj4KKyAgICAgICAgPHBhcmFtdHlwZT48Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPiZhbXA7JmFtcDs8L3BhcmFtdHlwZT4KKyAgICAgIDwvcGFyYW1ldGVyPgorICAgICAgPHJlcXVpcmVzPjxzaW1wYXJhPkMrKzExIGNvbXBhdGlibGUgY29tcGlsZXIuPC9zaW1wYXJhPjwvcmVxdWlyZXM+CisgICAgICA8cG9zdGNvbmRpdGlvbnM+PHNpbXBhcmE+TW92ZXMgdGhlIHZhbHVlIGZyb20gPGNvZGU+ZjwvY29kZT4gdG8gPGNvZGU+KnRoaXM8L2NvZGU+LiBJZiB0aGUgYXJndW1lbnQgaGFzIGl0cyBmdW5jdGlvbiBvYmplY3QgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLCBpdHMgYnVmZmVyIHdpbGwgYmUgYXNzaWduZWQgdG8gPGNvZGU+KnRoaXM8L2NvZGU+IGxlYXZpbmcgYXJndW1lbnQgZW1wdHkuPC9zaW1wYXJhPjwvcG9zdGNvbmRpdGlvbnM+CisgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93IHVubGVzcyBhcmd1bWVudCBoYXMgaXRzIGZ1bmN0aW9uIG9iamVjdCBhbGxvY2F0ZWQgbm90IG9uIHRoZSBoZWFwIGFuZCBjb3B5aW5nIHRoZSB0YXJnZXQgb2YgPGNvZGU+ZjwvY29kZT4gdGhyb3dzLjwvc2ltcGFyYT48L3Rocm93cz4KKyAgICA8L2NvbnN0cnVjdG9yPgorICAgIAorICAgIDxjb25zdHJ1Y3Rvcj4KKyAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkYiLz4KKyAgICAgIDwvdGVtcGxhdGU+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPjxwYXJhbXR5cGU+RjwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgPHJlcXVpcmVzPjxzaW1wYXJhPkYgaXMgYSBmdW5jdGlvbiBvYmplY3QgQ2FsbGFibGUgZnJvbSA8Y29kZT50aGlzPC9jb2RlPi48L3NpbXBhcmE+PC9yZXF1aXJlcz4KKyAgICAgIDxwb3N0Y29uZGl0aW9ucz48c2ltcGFyYT48Y29kZT4qdGhpczwvY29kZT4gdGFyZ2V0cyBhIGNvcHkgb2YgPGNvZGU+ZjwvY29kZT4gaWYgPGNvZGU+ZjwvY29kZT4gaXMgbm9uZW1wdHksIG9yIDxjb2RlPnRoaXMtJmd0OzxtZXRob2RuYW1lPmVtcHR5PC9tZXRob2RuYW1lPigpPC9jb2RlPiBpZiA8Y29kZT5mPC9jb2RlPiBpcyBlbXB0eS48L3NpbXBhcmE+PC9wb3N0Y29uZGl0aW9ucz4KKyAgICA8L2NvbnN0cnVjdG9yPgorCisgICAgPGNvbnN0cnVjdG9yPgorICAgICAgPHRlbXBsYXRlPgorICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRiIvPgorICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iQWxsb2NhdG9yIi8+CisgICAgICA8L3RlbXBsYXRlPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj48cGFyYW10eXBlPkY8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iYWxsb2MiPjxwYXJhbXR5cGU+QWxsb2NhdG9yPC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICA8cmVxdWlyZXM+PHNpbXBhcmE+RiBpcyBhIGZ1bmN0aW9uIG9iamVjdCBDYWxsYWJsZSBmcm9tIDxjb2RlPnRoaXM8L2NvZGU+LCBBbGxvY2F0b3IgaXMgYW4gYWxsb2NhdG9yLiBUaGUgY29weSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBvZiBBbGxvY2F0b3Igc2hhbGwgbm90IHRocm93Ljwvc2ltcGFyYT48L3JlcXVpcmVzPgorICAgICAgPHBvc3Rjb25kaXRpb25zPjxzaW1wYXJhPjxjb2RlPip0aGlzPC9jb2RlPiB0YXJnZXRzIGEgY29weSBvZiA8Y29kZT5mPC9jb2RlPiBpZiA8Y29kZT5mPC9jb2RlPiBpcyBub25lbXB0eSwgb3IgPGNvZGU+dGhpcy0mZ3Q7PG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvZGU+IGlmIDxjb2RlPmY8L2NvZGU+IGlzIGVtcHR5Ljwvc2ltcGFyYT48L3Bvc3Rjb25kaXRpb25zPgorCisgICAgICA8ZWZmZWN0cz48c2ltcGFyYT5JZiBtZW1vcnkgYWxsb2NhdGlvbiBpcyByZXF1aXJlZCwgdGhlIGdpdmVuIGFsbG9jYXRvciAob3IgYSBjb3B5IG9mIGl0KSB3aWxsIGJlIHVzZWQgdG8gYWxsb2NhdGUgdGhhdCBtZW1vcnkuPC9zaW1wYXJhPjwvZWZmZWN0cz4KKyAgICA8L2NvbnN0cnVjdG9yPgorCisgICAgPGRlc3RydWN0b3I+CisgICAgICA8ZWZmZWN0cz48c2ltcGFyYT5JZiA8Y29kZT4hdGhpcy0mZ3Q7PG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvZGU+LCBkZXN0cm95cyB0aGUgdGFyZ2V0IG9mIHRoaXMuPC9zaW1wYXJhPjwvZWZmZWN0cz4KKworICAgIDwvZGVzdHJ1Y3Rvcj4KKworICAgIDxjb3B5LWFzc2lnbm1lbnQ+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPgorICAgICAgICA8cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb25OPC9jbGFzc25hbWU+JmFtcDs8L3BhcmFtdHlwZT4KKyAgICAgIDwvcGFyYW1ldGVyPgorICAgICAgPHBvc3Rjb25kaXRpb25zPjxzaW1wYXJhPklmIGNvcHkgY29uc3RydWN0aW9uIGRvZXMgbm90IHRocm93LCA8Y29kZT4qdGhpczwvY29kZT4gdGFyZ2V0cyBhIGNvcHkgb2YgPGNvZGU+ZjwvY29kZT4ncyB0YXJnZXQsIGlmIGl0IGhhcyBvbmUsIG9yIGlzIGVtcHR5IGlmIDxjb2RlPmYuPG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvZGU+LiBJZiBjb3B5IGNvbnN0cnVjdGlvbiBkb2VzIHRocm93LCA8Y29kZT50aGlzLSZndDs8bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT4uPC9zaW1wYXJhPjwvcG9zdGNvbmRpdGlvbnM+CisgICAgPC9jb3B5LWFzc2lnbm1lbnQ+CisgICAgCisgICAgPGNvcHktYXNzaWdubWVudD4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+CisgICAgICAgIDxwYXJhbXR5cGU+PGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4mYW1wOyZhbXA7PC9wYXJhbXR5cGU+CisgICAgICA8L3BhcmFtZXRlcj4KKyAgICAgIDxyZXF1aXJlcz48c2ltcGFyYT5DKysxMSBjb21wYXRpYmxlIGNvbXBpbGVyLjwvc2ltcGFyYT48L3JlcXVpcmVzPgorICAgICAgPHBvc3Rjb25kaXRpb25zPjxzaW1wYXJhPk1vdmVzIHRoZSB2YWx1ZSBmcm9tIDxjb2RlPmY8L2NvZGU+IHRvIDxjb2RlPip0aGlzPC9jb2RlPi4gSWYgdGhlIGFyZ3VtZW50IGhhcyBpdHMgZnVuY3Rpb24gb2JqZWN0IGFsbG9jYXRlZCBvbiB0aGUgaGVhcCwgaXRzIGJ1ZmZlciB3aWxsIGJlIGFzc2lnbmVkIHRvIDxjb2RlPip0aGlzPC9jb2RlPiBsZWF2aW5nIGFyZ3VtZW50IGVtcHR5Ljwvc2ltcGFyYT48L3Bvc3Rjb25kaXRpb25zPgorICAgICAgPHRocm93cz48c2ltcGFyYT5XaWxsIG5vdCB0aHJvdyB1bmxlc3MgYXJndW1lbnQgaGFzIGl0cyBmdW5jdGlvbiBvYmplY3QgYWxsb2NhdGVkIG5vdCBvbiB0aGUgaGVhcCBhbmQgY29weWluZyB0aGUgdGFyZ2V0IG9mIDxjb2RlPmY8L2NvZGU+IHRocm93cy48L3NpbXBhcmE+PC90aHJvd3M+CisgICAgPC9jb3B5LWFzc2lnbm1lbnQ+CisKKyAgICA8bWV0aG9kLWdyb3VwIG5hbWU9Im1vZGlmaWVycyI+CisgICAgICA8bWV0aG9kIG5hbWU9InN3YXAiPgorICAgICAgICA8dHlwZT52b2lkPC90eXBlPgorICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4mYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8ZWZmZWN0cz48c2ltcGFyYT5JbnRlcmNoYW5nZXMgdGhlIHRhcmdldHMgb2YgPGNvZGU+KnRoaXM8L2NvZGU+IGFuZCA8Y29kZT5mPC9jb2RlPi48L3NpbXBhcmE+PC9lZmZlY3RzPgorICAgICAgPC9tZXRob2Q+CisKKyAgICAgIDxtZXRob2QgbmFtZT0iY2xlYXIiPgorICAgICAgICA8dHlwZT52b2lkPC90eXBlPgorICAgICAgICA8cG9zdGNvbmRpdGlvbnM+PHNpbXBhcmE+dGhpcy0mZ3Q7PG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L3NpbXBhcmE+PC9wb3N0Y29uZGl0aW9ucz4KKyAgICAgIDwvbWV0aG9kPgorICAgIDwvbWV0aG9kLWdyb3VwPgorCisgICAgPG1ldGhvZC1ncm91cCBuYW1lPSJjYXBhY2l0eSI+CisgICAgICA8bWV0aG9kIG5hbWU9ImVtcHR5IiBjdj0iY29uc3QiPgorICAgICAgICA8dHlwZT5ib29sPC90eXBlPgorICAgICAgICA8cmV0dXJucz48c2ltcGFyYT48Y29kZT5mYWxzZTwvY29kZT4gaWYgPGNvZGU+dGhpczwvY29kZT4gaGFzIGEgdGFyZ2V0LCBhbmQgPGNvZGU+dHJ1ZTwvY29kZT4gb3RoZXJ3aXNlLjwvc2ltcGFyYT48L3JldHVybnM+CisgICAgICAgIDx0aHJvd3M+PHNpbXBhcmE+V2lsbCBub3QgdGhyb3cuPC9zaW1wYXJhPjwvdGhyb3dzPgorICAgICAgPC9tZXRob2Q+CisKKyAgICAgIDxtZXRob2QgbmFtZT0iY29udmVyc2lvbi1vcGVyYXRvciIgY3Y9ImNvbnN0Ij4KKyAgICAgICAgPHR5cGU+c2FmZV9ib29sPC90eXBlPgorICAgICAgICA8cmV0dXJucz48c2ltcGFyYT5BIDxjb2RlPnNhZmVfYm9vbDwvY29kZT4gdGhhdCBldmFsdWF0ZXMgPGNvZGU+ZmFsc2U8L2NvZGU+IGluIGEgYm9vbGVhbiBjb250ZXh0IHdoZW4gPGNvZGU+dGhpcy0mZ3Q7PG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvZGU+LCBhbmQgPGNvZGU+dHJ1ZTwvY29kZT4gb3RoZXJ3aXNlLjwvc2ltcGFyYT48L3JldHVybnM+CisgICAgICAgIDx0aHJvd3M+PHNpbXBhcmE+V2lsbCBub3QgdGhyb3cuPC9zaW1wYXJhPjwvdGhyb3dzPgorICAgICAgPC9tZXRob2Q+CisKKyAgICAgIDxtZXRob2QgbmFtZT0ib3BlcmF0b3IhIiBjdj0iY29uc3QiPgorICAgICAgICA8dHlwZT5ib29sPC90eXBlPgorICAgICAgICA8cmV0dXJucz48c2ltcGFyYT48Y29kZT50aGlzLSZndDs8bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT48L3NpbXBhcmE+PC9yZXR1cm5zPgorICAgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93Ljwvc2ltcGFyYT48L3Rocm93cz4KKyAgICAgIDwvbWV0aG9kPgorICAgIDwvbWV0aG9kLWdyb3VwPgorCisgICAgPG1ldGhvZC1ncm91cCBuYW1lPSJ0YXJnZXQgYWNjZXNzIj4KKyAgICAgIDxvdmVybG9hZGVkLW1ldGhvZCBuYW1lPSJ0YXJnZXQiPgorICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgIDx0ZW1wbGF0ZT4gCisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+RnVuY3Rvcio8L3R5cGU+CisgICAgICAgIDwvc2lnbmF0dXJlPgorICAgICAgICA8c2lnbmF0dXJlIGN2PSJjb25zdCI+CisgICAgICAgICAgPHRlbXBsYXRlPiAKKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGdW5jdG9yIi8+CisgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8dHlwZT5jb25zdCBGdW5jdG9yKjwvdHlwZT4KKyAgICAgICAgPC9zaWduYXR1cmU+CisKKyAgICAgICAgPHJldHVybnM+PHNpbXBhcmE+SWYgPGNvZGU+dGhpczwvY29kZT4gc3RvcmVzIGEgdGFyZ2V0IG9mIHR5cGUKKyAgICAgICAgPGNvZGU+RnVuY3RvcjwvY29kZT4sIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlCisgICAgICAgIHRhcmdldC4gT3RoZXJ3aXNlLCByZXR1cm5zIHRoZSBOVUxMCisgICAgICAgIHBvaW50ZXIuPC9zaW1wYXJhPjwvcmV0dXJucz4KKworICAgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93Ljwvc2ltcGFyYT48L3Rocm93cz4KKyAgICAgIDwvb3ZlcmxvYWRlZC1tZXRob2Q+CisKKyAgICAgIDxtZXRob2QgbmFtZT0iY29udGFpbnMiIGN2PSJjb25zdCI+CisgICAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICA8dHlwZT5ib29sPC90eXBlPgorICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPgorICAgICAgICAgIDxwYXJhbXR5cGU+Y29uc3QgRnVuY3RvciZhbXA7PC9wYXJhbXR5cGU+CisgICAgICAgIDwvcGFyYW1ldGVyPgorICAgICAgICA8cmV0dXJucz48c2ltcGFyYT48Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT50aGlzLSZndDs8bWV0aG9kbmFtZT50YXJnZXQ8L21ldGhvZG5hbWU+Jmx0O0Z1bmN0b3ImZ3Q7KCk8L2NvZGU+IGlzIG5vbi1OVUxMIGFuZCA8Y29kZT48ZnVuY3Rpb25uYW1lPmZ1bmN0aW9uX2VxdWFsPC9mdW5jdGlvbm5hbWU+KCoodGhpcy0mZ3Q7dGFyZ2V0Jmx0O0Z1bmN0b3ImZ3Q7KCkpLCBmKTwvY29kZT48L3NpbXBhcmE+PC9yZXR1cm5zPgorIAorICAgICAgPC9tZXRob2Q+CisKKyAgICAgIDxtZXRob2QgbmFtZT0idGFyZ2V0X3R5cGUiIGN2PSJjb25zdCI+CisgICAgICAgIDx0eXBlPmNvbnN0IHN0ZDo6dHlwZV9pbmZvJmFtcDs8L3R5cGU+CisgICAgICAgIDxyZXR1cm5zPjxzaW1wYXJhPjxjb2RlPnR5cGVpZDwvY29kZT4gb2YgdGhlIHRhcmdldCBmdW5jdGlvbiBvYmplY3QsIG9yIDxjb2RlPnR5cGVpZCh2b2lkKTwvY29kZT4gaWYgPGNvZGU+dGhpcy0mZ3Q7PG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvZGU+Ljwvc2ltcGFyYT48L3JldHVybnM+CisgICAgICAgIDx0aHJvd3M+PHNpbXBhcmE+V2lsbCBub3QgdGhyb3cuPC9zaW1wYXJhPjwvdGhyb3dzPgorICAgICAgPC9tZXRob2Q+CisKKyAgICA8L21ldGhvZC1ncm91cD4KKworICAgIDxtZXRob2QtZ3JvdXAgbmFtZT0iaW52b2NhdGlvbiI+CisgICAgICA8bWV0aG9kIG5hbWU9Im9wZXJhdG9yKCkiIGN2PSJjb25zdCI+CisgICAgICAgIDx0eXBlPnJlc3VsdF90eXBlPC90eXBlPgorICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImExIj48cGFyYW10eXBlPmFyZzFfdHlwZTwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImEyIj48cGFyYW10eXBlPmFyZzJfdHlwZTwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8cGFyYW1ldGVyPjxwYXJhbXR5cGU+Li4uPC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iYU4iPjxwYXJhbXR5cGU+YXJnTl90eXBlPC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDxlZmZlY3RzPjxzaW1wYXJhPjxjb2RlPmYoYTEsIGEyLCAuLi4sIGFOKTwvY29kZT4sIHdoZXJlIDxjb2RlPmY8L2NvZGU+IGlzIHRoZSB0YXJnZXQgb2YgPGNvZGU+KnRoaXM8L2NvZGU+Ljwvc2ltcGFyYT48L2VmZmVjdHM+CisgICAgICAgIDxyZXR1cm5zPjxzaW1wYXJhPmlmIDxjb2RlPlI8L2NvZGU+IGlzIDxjb2RlPnZvaWQ8L2NvZGU+LCBub3RoaW5nIGlzIHJldHVybmVkOyBvdGhlcndpc2UsIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGNhbGwgdG8gPGNvZGU+ZjwvY29kZT4gaXMgcmV0dXJuZWQuPC9zaW1wYXJhPjwvcmV0dXJucz4KKyAgICAgICAgPHRocm93cz48c2ltcGFyYT48Y29kZT48Y2xhc3NuYW1lPmJhZF9mdW5jdGlvbl9jYWxsPC9jbGFzc25hbWU+PC9jb2RlPiBpZiA8Y29kZT50aGlzLSZndDs8bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT4uIE90aGVyd2lzZSwgbWF5IHRocm91Z2ggYW55IGV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlIHRhcmdldCBmdW5jdGlvbiA8Y29kZT5mPC9jb2RlPi48L3NpbXBhcmE+PC90aHJvd3M+CisgICAgICA8L21ldGhvZD4KKyAgICA8L21ldGhvZC1ncm91cD4KKworICAgIDxmcmVlLWZ1bmN0aW9uLWdyb3VwIG5hbWU9InNwZWNpYWxpemVkIGFsZ29yaXRobXMiPgorICAgICAgPGZ1bmN0aW9uIG5hbWU9InN3YXAiPgorICAgICAgICA8dGVtcGxhdGU+CisgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlQxIi8+CisgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlQyIi8+CisgICAgICAgICAgPHRlbXBsYXRlLXZhcmFyZ3MvPgorICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUTiIvPgorICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICA8dHlwZT52b2lkPC90eXBlPgorICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYxIj48cGFyYW10eXBlPjxjbGFzc25hbWU+ZnVuY3Rpb25OPC9jbGFzc25hbWU+Jmx0O1QxLCBUMiwgLi4uLCBUTiZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYyIj48cGFyYW10eXBlPjxjbGFzc25hbWU+ZnVuY3Rpb25OPC9jbGFzc25hbWU+Jmx0O1QxLCBUMiwgLi4uLCBUTiZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8ZWZmZWN0cz48c2ltcGFyYT48Y29kZT5mMS48bWV0aG9kbmFtZT5zd2FwPC9tZXRob2RuYW1lPihmMik8L2NvZGU+PC9zaW1wYXJhPjwvZWZmZWN0cz4KKyAgICAgIDwvZnVuY3Rpb24+CisgICAgPC9mcmVlLWZ1bmN0aW9uLWdyb3VwPgorCisgICAgPGZyZWUtZnVuY3Rpb24tZ3JvdXAgbmFtZT0iY29tcGFyaXNvbiBvcGVyYXRvcnMiPgorICAgICAgPG92ZXJsb2FkZWQtZnVuY3Rpb24gbmFtZT0ib3BlcmF0b3I9PSI+CisgICAgICAgIDxzaWduYXR1cmU+CisgICAgICAgICAgPHRlbXBsYXRlPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlQxIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVDIiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS12YXJhcmdzLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUTiIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkZ1bmN0b3IiLz4KKyAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgIDx0eXBlPmJvb2w8L3R5cGU+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj48cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb25OPC9jbGFzc25hbWU+Jmx0O1QxLCBUMiwgLi4uLCBUTiZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZyI+PHBhcmFtdHlwZT5GdW5jdG9yPC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDwvc2lnbmF0dXJlPgorICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUMSIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlQyIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdmFyYXJncy8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVE4iLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGdW5jdG9yIi8+CisgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8dHlwZT5ib29sPC90eXBlPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZyI+PHBhcmFtdHlwZT5GdW5jdG9yPC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj48cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb25OPC9jbGFzc25hbWU+Jmx0O1QxLCBUMiwgLi4uLCBUTiZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8L3NpZ25hdHVyZT4gICAgICAgIAorICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUMSIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlQyIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdmFyYXJncy8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVE4iLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGdW5jdG9yIi8+CisgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8dHlwZT5ib29sPC90eXBlPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+PHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPiZsdDtUMSwgVDIsIC4uLiwgVE4mZ3Q7JmFtcDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImciPjxwYXJhbXR5cGU+PGNsYXNzbmFtZT5yZWZlcmVuY2Vfd3JhcHBlcjwvY2xhc3NuYW1lPiZsdDtGdW5jdG9yJmd0OzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8L3NpZ25hdHVyZT4KKyAgICAgICAgPHNpZ25hdHVyZT4KKyAgICAgICAgICA8dGVtcGxhdGU+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVDEiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUMiIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXZhcmFyZ3MvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlROIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+Ym9vbDwvdHlwZT4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImciPjxwYXJhbXR5cGU+PGNsYXNzbmFtZT5yZWZlcmVuY2Vfd3JhcHBlcjwvY2xhc3NuYW1lPiZsdDtGdW5jdG9yJmd0OzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+PHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPiZsdDtUMSwgVDIsIC4uLiwgVE4mZ3Q7JmFtcDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPC9zaWduYXR1cmU+ICAgICAgICAKKyAgICAgICAgPHNpZ25hdHVyZT4KKyAgICAgICAgICA8dGVtcGxhdGU+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVDEiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUMiIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXZhcmFyZ3MvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlROIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVTEiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJVMiIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXZhcmFyZ3MvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlVOIi8+CisgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8dHlwZT52b2lkPC90eXBlPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZjEiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4mbHQ7VDEsIFQyLCAuLi4sIFROJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmMiI+PHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPiZsdDtVMSwgVTIsIC4uLiwgVU4mZ3Q7JmFtcDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPC9zaWduYXR1cmU+CisKKyAgICAgICAgPHJldHVybnM+PHNpbXBhcmE+VHJ1ZSB3aGVuIDxjb2RlPmY8L2NvZGU+IHN0b3JlcyBhbiBvYmplY3Qgb2YKKyAgICAgICAgdHlwZSA8Y29kZT5GdW5jdG9yPC9jb2RlPiBhbmQgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcHBsaWVzOgorICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT48Y29kZT5nPC9jb2RlPiBpcyBvZiB0eXBlCisgICAgICAgICAgICA8Y29kZT48Y2xhc3NuYW1lPnJlZmVyZW5jZV93cmFwcGVyPC9jbGFzc25hbWU+Jmx0O0Z1bmN0b3ImZ3Q7PC9jb2RlPgorICAgICAgICAgICAgYW5kIDxjb2RlPmYudGFyZ2V0Jmx0O0Z1bmN0b3ImZ3Q7KCkgPT0gZy48bWV0aG9kbmFtZQorICAgICAgICAgICAgYWx0PSJyZWZlcmVuY2Vfd3JhcHBlcjo6Z2V0X3BvaW50ZXIiPmdldF9wb2ludGVyPC9tZXRob2RuYW1lPigpPC9jb2RlPi48L3NpbXBhcmE+PC9saXN0aXRlbT4KKworICAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPjxjb2RlPmc8L2NvZGU+IGlzIG5vdCBvZiB0eXBlCisgICAgICAgICAgICA8Y29kZT48Y2xhc3NuYW1lPnJlZmVyZW5jZV93cmFwcGVyPC9jbGFzc25hbWU+Jmx0O0Z1bmN0b3ImZ3Q7PC9jb2RlPgorICAgICAgICAgICAgYW5kCisgICAgICAgICAgICA8Y29kZT48ZnVuY3Rpb25uYW1lPmZ1bmN0aW9uX2VxdWFsPC9mdW5jdGlvbm5hbWU+KCooZi50YXJnZXQmbHQ7RnVuY3RvciZndDsoKSksCisgICAgICAgICAgICBnKTwvY29kZT4uPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisKKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8L3NpbXBhcmE+PC9yZXR1cm5zPgorCisgICAgICAgIDxub3Rlcz48c2ltcGFyYT48Y29kZT48Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPjwvY29kZT4KKyAgICAgICAgb2JqZWN0cyBhcmUgbm90CisgICAgICAgIDxjb25jZXB0bmFtZT5FcXVhbGl0eUNvbXBhcmFibGU8L2NvbmNlcHRuYW1lPi48L3NpbXBhcmE+PC9ub3Rlcz4KKworICAgICAgICA8cmF0aW9uYWxlPjxzaW1wYXJhPlRoZSA8Y29kZT5zYWZlX2Jvb2w8L2NvZGU+IGNvbnZlcnNpb24KKyAgICAgICAgb3BlbnMgYSBsb29waG9sZSB3aGVyZWJ5IHR3byA8Y29kZT5mdW5jdGlvbk48L2NvZGU+CisgICAgICAgIGluc3RhbmNlcyBjYW4gYmUgY29tcGFyZWQgdmlhIDxjb2RlPj09PC9jb2RlPiwgYWx0aG91Z2ggdGhpcworICAgICAgICBpcyBub3QgZmVhc2libGUgdG8gaW1wbGVtZW50LiBUaGUgdW5kZWZpbmVkIDxjb2RlPnZvaWQKKyAgICAgICAgb3BlcmF0b3I9PTwvY29kZT4gY2xvc2VzIHRoZSBsb29waG9sZSBhbmQgZW5zdXJlcyBhCisgICAgICAgIGNvbXBpbGUtdGltZSBvciBsaW5rLXRpbWUgZXJyb3IuPC9zaW1wYXJhPjwvcmF0aW9uYWxlPgorICAgICAgPC9vdmVybG9hZGVkLWZ1bmN0aW9uPgorCisgICAgICA8b3ZlcmxvYWRlZC1mdW5jdGlvbiBuYW1lPSJvcGVyYXRvciE9Ij4KKyAgICAgICAgPHNpZ25hdHVyZT4KKyAgICAgICAgICA8dGVtcGxhdGU+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVDEiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUMiIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXZhcmFyZ3MvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlROIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+Ym9vbDwvdHlwZT4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4mbHQ7VDEsIFQyLCAuLi4sIFROJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJnIj48cGFyYW10eXBlPkZ1bmN0b3I8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPC9zaWduYXR1cmU+CisgICAgICAgIDxzaWduYXR1cmU+CisgICAgICAgICAgPHRlbXBsYXRlPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlQxIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVDIiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS12YXJhcmdzLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUTiIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkZ1bmN0b3IiLz4KKyAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgIDx0eXBlPmJvb2w8L3R5cGU+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJnIj48cGFyYW10eXBlPkZ1bmN0b3I8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4mbHQ7VDEsIFQyLCAuLi4sIFROJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDwvc2lnbmF0dXJlPiAgICAgICAgCisgICAgICAgIDxzaWduYXR1cmU+CisgICAgICAgICAgPHRlbXBsYXRlPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlQxIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVDIiLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS12YXJhcmdzLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUTiIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkZ1bmN0b3IiLz4KKyAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgIDx0eXBlPmJvb2w8L3R5cGU+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj48cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb25OPC9jbGFzc25hbWU+Jmx0O1QxLCBUMiwgLi4uLCBUTiZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZyI+PHBhcmFtdHlwZT48Y2xhc3NuYW1lPnJlZmVyZW5jZV93cmFwcGVyPC9jbGFzc25hbWU+Jmx0O0Z1bmN0b3ImZ3Q7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDwvc2lnbmF0dXJlPgorICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUMSIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlQyIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdmFyYXJncy8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVE4iLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGdW5jdG9yIi8+CisgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8dHlwZT5ib29sPC90eXBlPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZyI+PHBhcmFtdHlwZT48Y2xhc3NuYW1lPnJlZmVyZW5jZV93cmFwcGVyPC9jbGFzc25hbWU+Jmx0O0Z1bmN0b3ImZ3Q7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj48cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb25OPC9jbGFzc25hbWU+Jmx0O1QxLCBUMiwgLi4uLCBUTiZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8L3NpZ25hdHVyZT4gICAgICAgIAorICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJUMSIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlQyIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdmFyYXJncy8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVE4iLz4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJVMSIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlUyIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdmFyYXJncy8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iVU4iLz4KKyAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgIDx0eXBlPnZvaWQ8L3R5cGU+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmMSI+PHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPiZsdDtUMSwgVDIsIC4uLiwgVE4mZ3Q7JmFtcDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYyIj48cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb25OPC9jbGFzc25hbWU+Jmx0O1UxLCBVMiwgLi4uLCBVTiZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8L3NpZ25hdHVyZT4KKworICAgICAgICA8cmV0dXJucz48c2ltcGFyYT5UcnVlIHdoZW4gPGNvZGU+ZjwvY29kZT4gZG9lcyBub3Qgc3RvcmUgYW4KKyAgICAgICAgb2JqZWN0IG9mIHR5cGUgPGNvZGU+RnVuY3RvcjwvY29kZT4gb3IgaXQgc3RvcmVzIGFuIG9iamVjdCBvZgorICAgICAgICB0eXBlIDxjb2RlPkZ1bmN0b3I8L2NvZGU+IGFuZCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgICAgIGFwcGxpZXM6CisgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKworICAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPjxjb2RlPmc8L2NvZGU+IGlzIG9mIHR5cGUKKyAgICAgICAgICAgIDxjb2RlPjxjbGFzc25hbWU+cmVmZXJlbmNlX3dyYXBwZXI8L2NsYXNzbmFtZT4mbHQ7RnVuY3RvciZndDs8L2NvZGU+CisgICAgICAgICAgICBhbmQgPGNvZGU+Zi50YXJnZXQmbHQ7RnVuY3RvciZndDsoKSAhPSBnLjxtZXRob2RuYW1lCisgICAgICAgICAgICBhbHQ9InJlZmVyZW5jZV93cmFwcGVyOjpnZXRfcG9pbnRlciI+Z2V0X3BvaW50ZXI8L21ldGhvZG5hbWU+KCk8L2NvZGU+Ljwvc2ltcGFyYT48L2xpc3RpdGVtPgorCisgICAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+PGNvZGU+ZzwvY29kZT4gaXMgbm90IG9mIHR5cGUKKyAgICAgICAgICAgIDxjb2RlPjxjbGFzc25hbWU+cmVmZXJlbmNlX3dyYXBwZXI8L2NsYXNzbmFtZT4mbHQ7RnVuY3RvciZndDs8L2NvZGU+CisgICAgICAgICAgICBhbmQgPGNvZGU+ITxmdW5jdGlvbm5hbWU+ZnVuY3Rpb25fZXF1YWw8L2Z1bmN0aW9ubmFtZT4oKihmLnRhcmdldCZsdDtGdW5jdG9yJmd0OygpKSwgZyk8L2NvZGU+Ljwvc2ltcGFyYT48L2xpc3RpdGVtPgorCisgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgPC9zaW1wYXJhPjwvcmV0dXJucz4KKworICAgICAgICA8bm90ZXM+PHNpbXBhcmE+PGNvZGU+PGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT48L2NvZGU+CisgICAgICAgIG9iamVjdHMgYXJlIG5vdAorICAgICAgICA8Y29uY2VwdG5hbWU+RXF1YWxpdHlDb21wYXJhYmxlPC9jb25jZXB0bmFtZT4uPC9zaW1wYXJhPjwvbm90ZXM+CisKKyAgICAgICAgPHJhdGlvbmFsZT48c2ltcGFyYT5UaGUgPGNvZGU+c2FmZV9ib29sPC9jb2RlPiBjb252ZXJzaW9uCisgICAgICAgIG9wZW5zIGEgbG9vcGhvbGUgd2hlcmVieSB0d28gPGNvZGU+ZnVuY3Rpb25OPC9jb2RlPgorICAgICAgICBpbnN0YW5jZXMgY2FuIGJlIGNvbXBhcmVkIHZpYSA8Y29kZT4hPTwvY29kZT4sIGFsdGhvdWdoIHRoaXMKKyAgICAgICAgaXMgbm90IGZlYXNpYmxlIHRvIGltcGxlbWVudC4gVGhlIHVuZGVmaW5lZCA8Y29kZT52b2lkCisgICAgICAgIG9wZXJhdG9yIT08L2NvZGU+IGNsb3NlcyB0aGUgbG9vcGhvbGUgYW5kIGVuc3VyZXMgYQorICAgICAgICBjb21waWxlLXRpbWUgb3IgbGluay10aW1lIGVycm9yLjwvc2ltcGFyYT48L3JhdGlvbmFsZT4KKyAgICAgIDwvb3ZlcmxvYWRlZC1mdW5jdGlvbj4KKyAgICA8L2ZyZWUtZnVuY3Rpb24tZ3JvdXA+CisgIDwvY2xhc3M+CisKKyAgPGNsYXNzIG5hbWU9ImZ1bmN0aW9uIj4KKyAgICA8dGVtcGxhdGU+CisgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iU2lnbmF0dXJlIj4KKyAgICAgICAgPHB1cnBvc2U+RnVuY3Rpb24gdHlwZSBSIChUMSwgVDIsIC4uLiwgVE4pPC9wdXJwb3NlPgorICAgICAgPC90ZW1wbGF0ZS10eXBlLXBhcmFtZXRlcj4KKyAgICA8L3RlbXBsYXRlPgorICAgIDxpbmhlcml0IGFjY2Vzcz0icHVibGljIj48Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPiZsdDtSLCBUMSwgVDIsIC4uLiwgVE4mZ3Q7PC9pbmhlcml0PgorCisgICAgPHB1cnBvc2U+QSBnZW5lcmFsaXplZCBmdW5jdGlvbiBwb2ludGVyIHRoYXQgY2FuIGJlIHVzZWQgZm9yCisgICAgY2FsbGJhY2tzIG9yIHdyYXBwaW5nIGZ1bmN0aW9uIG9iamVjdHMuPC9wdXJwb3NlPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgPHBhcmE+Q2xhc3MgdGVtcGxhdGUgPGNsYXNzbmFtZT5mdW5jdGlvbjwvY2xhc3NuYW1lPiBpcyBhIHRoaW4KKyAgICAgIHdyYXBwZXIgYXJvdW5kIHRoZSBudW1iZXJlZCBjbGFzcyB0ZW1wbGF0ZXMgPGNsYXNzbmFtZQorICAgICAgYWx0PSJmdW5jdGlvbk4iPmZ1bmN0aW9uMDwvY2xhc3NuYW1lPiwgPGNsYXNzbmFtZQorICAgICAgYWx0PSJmdW5jdGlvbk4iPmZ1bmN0aW9uMTwvY2xhc3NuYW1lPiwgZXRjLiBJdCBhY2NlcHRzIGEKKyAgICAgIGZ1bmN0aW9uIHR5cGUgd2l0aCBOIGFyZ3VtZW50cyBhbmQgd2lsbCB3aWxsIGRlcml2ZSBmcm9tCisgICAgICA8Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPiBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgYXJndW1lbnRzCisgICAgICBpdCByZWNlaXZlcy48L3BhcmE+CisKKyAgICAgIDxwYXJhPlRoZSBzZW1hbnRpY3Mgb2YgYWxsIG9wZXJhdGlvbnMgaW4gY2xhc3MgdGVtcGxhdGUKKyAgICAgIDxjbGFzc25hbWU+ZnVuY3Rpb248L2NsYXNzbmFtZT4gYXJlIGVxdWl2YWxlbnQgdG8gdGhhdCBvZiB0aGUKKyAgICAgIHVuZGVybHlpbmcgPGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4gb2JqZWN0LCBhbHRob3VnaAorICAgICAgYWRkaXRpb25hbCBtZW1iZXIgZnVuY3Rpb25zIGFyZSByZXF1aXJlZCB0byBhbGxvdyBwcm9wZXIgY29weQorICAgICAgY29uc3RydWN0aW9uIGFuZCBjb3B5IGFzc2lnbm1lbnQgb2YgZnVuY3Rpb24gb2JqZWN0cy48L3BhcmE+CisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDx0eXBlZGVmIG5hbWU9InJlc3VsdF90eXBlIj48dHlwZT5SPC90eXBlPjwvdHlwZWRlZj4KKyAgICA8dHlwZWRlZiBuYW1lPSJhcmd1bWVudF90eXBlIj4KKyAgICAgIDx0eXBlPlQxPC90eXBlPjxwdXJwb3NlPklmIE4gPT0gMTwvcHVycG9zZT4KKyAgICA8L3R5cGVkZWY+CisgICAgPHR5cGVkZWYgbmFtZT0iZmlyc3RfYXJndW1lbnRfdHlwZSI+CisgICAgICA8dHlwZT5UMTwvdHlwZT4KKyAgICAgIDxwdXJwb3NlPklmIE4gPT0gMjwvcHVycG9zZT4KKyAgICA8L3R5cGVkZWY+CisgICAgPHR5cGVkZWYgbmFtZT0ic2Vjb25kX2FyZ3VtZW50X3R5cGUiPgorICAgICAgPHR5cGU+VDI8L3R5cGU+CisgICAgICA8cHVycG9zZT5JZiBOID09IDI8L3B1cnBvc2U+CisgICAgPC90eXBlZGVmPgorICAgIDx0eXBlZGVmIG5hbWU9ImFyZzFfdHlwZSI+PHR5cGU+VDE8L3R5cGU+PC90eXBlZGVmPgorICAgIDx0eXBlZGVmIG5hbWU9ImFyZzJfdHlwZSI+PHR5cGU+VDI8L3R5cGU+PC90eXBlZGVmPgorICAgIDx0eXBlZGVmIG5hbWU9Ii4uLiI+PHR5cGUvPjwvdHlwZWRlZj4KKyAgICA8dHlwZWRlZiBuYW1lPSJhcmdOX3R5cGUiPjx0eXBlPlROPC90eXBlPjwvdHlwZWRlZj4KKworICAgIDxzdGF0aWMtY29uc3RhbnQgbmFtZT0iYXJpdHkiPgorICAgICAgPHR5cGU+aW50PC90eXBlPgorICAgICAgPGRlZmF1bHQ+TjwvZGVmYXVsdD4KKyAgICA8L3N0YXRpYy1jb25zdGFudD4KKworICAgIDxzdHJ1Y3QgbmFtZT0ic2lnIj4KKyAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkFyZ3MiLz4KKyAgICAgIDwvdGVtcGxhdGU+CisKKyAgICAgIDxwdXJwb3NlPgorICAgICAgICA8c2ltcGFyYT48bGlicmFyeW5hbWU+TGFtYmRhPC9saWJyYXJ5bmFtZT4gbGlicmFyeSBzdXBwb3J0PC9zaW1wYXJhPgorICAgICAgPC9wdXJwb3NlPgorCisgICAgICA8dHlwZWRlZiBuYW1lPSJ0eXBlIj48dHlwZT5yZXN1bHRfdHlwZTwvdHlwZT48L3R5cGVkZWY+CisgICAgPC9zdHJ1Y3Q+CisKKyAgICA8Y29uc3RydWN0b3I+CisgICAgICA8cG9zdGNvbmRpdGlvbnM+PHNpbXBhcmE+PGNvZGU+dGhpcy0mZ3Q7PG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvZGU+PC9zaW1wYXJhPjwvcG9zdGNvbmRpdGlvbnM+CisgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93Ljwvc2ltcGFyYT48L3Rocm93cz4KKyAgICA8L2NvbnN0cnVjdG9yPgorCisgICAgPGNvbnN0cnVjdG9yPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj4KKyAgICAgICAgPHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uTjwvY2xhc3NuYW1lPiZhbXA7PC9wYXJhbXR5cGU+CisgICAgICA8L3BhcmFtZXRlcj4KKyAgICAgIDxwb3N0Y29uZGl0aW9ucz48c2ltcGFyYT5Db250YWlucyBhIGNvcHkgb2YgdGhlIDxjb2RlPmY8L2NvZGU+J3MgdGFyZ2V0LCBpZiBpdCBoYXMgb25lLCBvciBpcyBlbXB0eSBpZiA8Y29kZT5mLjxtZXRob2RuYW1lPmVtcHR5PC9tZXRob2RuYW1lPigpPC9jb2RlPi48L3NpbXBhcmE+PC9wb3N0Y29uZGl0aW9ucz4KKyAgICAgIDx0aHJvd3M+PHNpbXBhcmE+V2lsbCBub3QgdGhyb3cgdW5sZXNzIGNvcHlpbmcgdGhlIHRhcmdldCBvZiA8Y29kZT5mPC9jb2RlPiB0aHJvd3MuPC9zaW1wYXJhPjwvdGhyb3dzPgorICAgIDwvY29uc3RydWN0b3I+CisgICAgICAgIAorICAgIDxjb25zdHJ1Y3Rvcj4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+CisgICAgICAgIDxwYXJhbXR5cGU+PGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4mYW1wOyZhbXA7PC9wYXJhbXR5cGU+CisgICAgICA8L3BhcmFtZXRlcj4KKyAgICAgIDxyZXF1aXJlcz48c2ltcGFyYT5DKysxMSBjb21wYXRpYmxlIGNvbXBpbGVyLjwvc2ltcGFyYT48L3JlcXVpcmVzPgorICAgICAgPHBvc3Rjb25kaXRpb25zPjxzaW1wYXJhPk1vdmVzIHRoZSB2YWx1ZSBmcm9tIDxjb2RlPmY8L2NvZGU+IHRvIDxjb2RlPip0aGlzPC9jb2RlPi4gSWYgdGhlIGFyZ3VtZW50IGhhcyBpdHMgZnVuY3Rpb24gb2JqZWN0IGFsbG9jYXRlZCBvbiB0aGUgaGVhcCwgaXRzIGJ1ZmZlciB3aWxsIGJlIGFzc2lnbmVkIHRvIDxjb2RlPip0aGlzPC9jb2RlPiBsZWF2aW5nIGFyZ3VtZW50IGVtcHR5Ljwvc2ltcGFyYT48L3Bvc3Rjb25kaXRpb25zPgorICAgICAgPHRocm93cz48c2ltcGFyYT5XaWxsIG5vdCB0aHJvdyB1bmxlc3MgYXJndW1lbnQgaGFzIGl0cyBmdW5jdGlvbiBvYmplY3QgYWxsb2NhdGVkIG5vdCBvbiB0aGUgaGVhcCBhbmQgY29weWluZyB0aGUgdGFyZ2V0IG9mIDxjb2RlPmY8L2NvZGU+IHRocm93cy48L3NpbXBhcmE+PC90aHJvd3M+CisgICAgPC9jb25zdHJ1Y3Rvcj4KKyAgICAKKyAgICA8Y29uc3RydWN0b3I+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPgorICAgICAgICA8cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb248L2NsYXNzbmFtZT4mYW1wOzwvcGFyYW10eXBlPgorICAgICAgPC9wYXJhbWV0ZXI+CisgICAgICA8cG9zdGNvbmRpdGlvbnM+PHNpbXBhcmE+Q29udGFpbnMgYSBjb3B5IG9mIHRoZSA8Y29kZT5mPC9jb2RlPidzIHRhcmdldCwgaWYgaXQgaGFzIG9uZSwgb3IgaXMgZW1wdHkgaWYgPGNvZGU+Zi48bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT4uPC9zaW1wYXJhPjwvcG9zdGNvbmRpdGlvbnM+CisgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93IHVubGVzcyBjb3B5aW5nIHRoZSB0YXJnZXQgb2YgPGNvZGU+ZjwvY29kZT4gdGhyb3dzLjwvc2ltcGFyYT48L3Rocm93cz4KKyAgICA8L2NvbnN0cnVjdG9yPgorCisgICAgPGNvbnN0cnVjdG9yPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj4KKyAgICAgICAgPHBhcmFtdHlwZT48Y2xhc3NuYW1lPmZ1bmN0aW9uPC9jbGFzc25hbWU+JmFtcDsmYW1wOzwvcGFyYW10eXBlPgorICAgICAgPC9wYXJhbWV0ZXI+CisgICAgICA8cmVxdWlyZXM+PHNpbXBhcmE+QysrMTEgY29tcGF0aWJsZSBjb21waWxlci48L3NpbXBhcmE+PC9yZXF1aXJlcz4KKyAgICAgIDxwb3N0Y29uZGl0aW9ucz48c2ltcGFyYT5Nb3ZlcyB0aGUgdmFsdWUgZnJvbSA8Y29kZT5mPC9jb2RlPiB0byA8Y29kZT4qdGhpczwvY29kZT4uIElmIHRoZSBhcmd1bWVudCBoYXMgaXRzIGZ1bmN0aW9uIG9iamVjdCBhbGxvY2F0ZWQgb24gdGhlIGhlYXAsIGl0cyBidWZmZXIgd2lsbCBiZSBhc3NpZ25lZCB0byA8Y29kZT4qdGhpczwvY29kZT4gbGVhdmluZyBhcmd1bWVudCBlbXB0eS48L3NpbXBhcmE+PC9wb3N0Y29uZGl0aW9ucz4KKyAgICAgIDx0aHJvd3M+PHNpbXBhcmE+V2lsbCBub3QgdGhyb3cgdW5sZXNzIGFyZ3VtZW50IGhhcyBpdHMgZnVuY3Rpb24gb2JqZWN0IGFsbG9jYXRlZCBub3Qgb24gdGhlIGhlYXAgYW5kIGNvcHlpbmcgdGhlIHRhcmdldCBvZiA8Y29kZT5mPC9jb2RlPiB0aHJvd3MuPC9zaW1wYXJhPjwvdGhyb3dzPgorICAgIDwvY29uc3RydWN0b3I+CisgICAgCisgICAgPGNvbnN0cnVjdG9yPgorICAgICAgPHRlbXBsYXRlPgorICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRiIvPgorICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+PHBhcmFtdHlwZT5GPC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICA8cmVxdWlyZXM+PHNpbXBhcmE+RiBpcyBhIGZ1bmN0aW9uIG9iamVjdCBDYWxsYWJsZSBmcm9tIDxjb2RlPnRoaXM8L2NvZGU+Ljwvc2ltcGFyYT48L3JlcXVpcmVzPgorICAgICAgPHBvc3Rjb25kaXRpb25zPjxzaW1wYXJhPjxjb2RlPip0aGlzPC9jb2RlPiB0YXJnZXRzIGEgY29weSBvZiA8Y29kZT5mPC9jb2RlPiBpZiA8Y29kZT5mPC9jb2RlPiBpcyBub25lbXB0eSwgb3IgPGNvZGU+dGhpcy0mZ3Q7PG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvZGU+IGlmIDxjb2RlPmY8L2NvZGU+IGlzIGVtcHR5Ljwvc2ltcGFyYT48L3Bvc3Rjb25kaXRpb25zPgorICAgIDwvY29uc3RydWN0b3I+CisKKyAgICA8Y29uc3RydWN0b3I+CisgICAgICA8dGVtcGxhdGU+CisgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGIi8+CisgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJBbGxvY2F0b3IiLz4KKyAgICAgIDwvdGVtcGxhdGU+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPjxwYXJhbXR5cGU+RjwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJhbGxvYyI+PHBhcmFtdHlwZT5BbGxvY2F0b3I8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgIDxyZXF1aXJlcz48c2ltcGFyYT5GIGlzIGEgZnVuY3Rpb24gb2JqZWN0IENhbGxhYmxlIGZyb20gPGNvZGU+dGhpczwvY29kZT4sIEFsbG9jYXRvciBpcyBhbiBhbGxvY2F0b3IuIFRoZSBjb3B5IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIG9mIEFsbG9jYXRvciBzaGFsbCBub3QgdGhyb3cuPC9zaW1wYXJhPjwvcmVxdWlyZXM+CisgICAgICA8cG9zdGNvbmRpdGlvbnM+PHNpbXBhcmE+PGNvZGU+KnRoaXM8L2NvZGU+IHRhcmdldHMgYSBjb3B5IG9mIDxjb2RlPmY8L2NvZGU+IGlmIDxjb2RlPmY8L2NvZGU+IGlzIG5vbmVtcHR5LCBvciA8Y29kZT50aGlzLSZndDs8bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT4gaWYgPGNvZGU+ZjwvY29kZT4gaXMgZW1wdHkuPC9zaW1wYXJhPjwvcG9zdGNvbmRpdGlvbnM+CisKKyAgICAgIDxlZmZlY3RzPjxzaW1wYXJhPklmIG1lbW9yeSBhbGxvY2F0aW9uIGlzIHJlcXVpcmVkLCB0aGUgZ2l2ZW4gYWxsb2NhdG9yIChvciBhIGNvcHkgb2YgaXQpIHdpbGwgYmUgdXNlZCB0byBhbGxvY2F0ZSB0aGF0IG1lbW9yeS48L3NpbXBhcmE+PC9lZmZlY3RzPgorICAgIDwvY29uc3RydWN0b3I+CisKKyAgICA8ZGVzdHJ1Y3Rvcj4KKyAgICAgIDxlZmZlY3RzPjxzaW1wYXJhPklmIDxjb2RlPiF0aGlzLSZndDs8bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT4sIGRlc3Ryb3lzIHRoZSB0YXJnZXQgb2YgPGNvZGU+dGhpczwvY29kZT4uPC9zaW1wYXJhPjwvZWZmZWN0cz4KKworICAgIDwvZGVzdHJ1Y3Rvcj4KKworICAgIDxjb3B5LWFzc2lnbm1lbnQ+CisgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPgorICAgICAgICA8cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb25OPC9jbGFzc25hbWU+JmFtcDs8L3BhcmFtdHlwZT4KKyAgICAgIDwvcGFyYW1ldGVyPgorICAgICAgPHBvc3Rjb25kaXRpb25zPjxzaW1wYXJhPklmIGNvcHkgY29uc3RydWN0aW9uIGRvZXMgbm90IHRocm93LCA8Y29kZT4qdGhpczwvY29kZT4gdGFyZ2V0cyBhIGNvcHkgb2YgPGNvZGU+ZjwvY29kZT4ncyB0YXJnZXQsIGlmIGl0IGhhcyBvbmUsIG9yIGlzIGVtcHR5IGlmIDxjb2RlPmYuPG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvZGU+LiBJZiBjb3B5IGNvbnN0cnVjdGlvbiBkb2VzIHRocm93LCA8Y29kZT50aGlzLSZndDs8bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT4uPC9zaW1wYXJhPjwvcG9zdGNvbmRpdGlvbnM+CisgICAgPC9jb3B5LWFzc2lnbm1lbnQ+CisgICAgCisgICAgPGNvcHktYXNzaWdubWVudD4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+CisgICAgICAgIDxwYXJhbXR5cGU+PGNsYXNzbmFtZT5mdW5jdGlvbk48L2NsYXNzbmFtZT4mYW1wOyZhbXA7PC9wYXJhbXR5cGU+CisgICAgICA8L3BhcmFtZXRlcj4KKyAgICAgIDxyZXF1aXJlcz48c2ltcGFyYT5DKysxMSBjb21wYXRpYmxlIGNvbXBpbGVyLjwvc2ltcGFyYT48L3JlcXVpcmVzPgorICAgICAgPHBvc3Rjb25kaXRpb25zPjxzaW1wYXJhPk1vdmVzIHRoZSB2YWx1ZSBmcm9tIDxjb2RlPmY8L2NvZGU+IHRvIDxjb2RlPip0aGlzPC9jb2RlPi4gSWYgdGhlIGFyZ3VtZW50IGhhcyBpdHMgZnVuY3Rpb24gb2JqZWN0IGFsbG9jYXRlZCBvbiB0aGUgaGVhcCwgaXRzIGJ1ZmZlciB3aWxsIGJlIGFzc2lnbmVkIHRvIDxjb2RlPip0aGlzPC9jb2RlPiBsZWF2aW5nIGFyZ3VtZW50IGVtcHR5Ljwvc2ltcGFyYT48L3Bvc3Rjb25kaXRpb25zPgorICAgICAgPHRocm93cz48c2ltcGFyYT5XaWxsIG5vdCB0aHJvdyB1bmxlc3MgYXJndW1lbnQgaGFzIGl0cyBmdW5jdGlvbiBvYmplY3QgYWxsb2NhdGVkIG5vdCBvbiB0aGUgaGVhcCBhbmQgY29weWluZyB0aGUgdGFyZ2V0IG9mIDxjb2RlPmY8L2NvZGU+IHRocm93cy48L3NpbXBhcmE+PC90aHJvd3M+CisgICAgPC9jb3B5LWFzc2lnbm1lbnQ+CisKKyAgICA8Y29weS1hc3NpZ25tZW50PgorICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj4KKyAgICAgICAgPHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uPC9jbGFzc25hbWU+JmFtcDs8L3BhcmFtdHlwZT4KKyAgICAgIDwvcGFyYW1ldGVyPgorICAgICAgPHBvc3Rjb25kaXRpb25zPjxzaW1wYXJhPklmIGNvcHkgY29uc3RydWN0aW9uIG9mIHRoZSB0YXJnZXQgb2YgPGNvZGU+ZjwvY29kZT4gZG9lcyBub3QgdGhyb3csIDxjb2RlPip0aGlzPC9jb2RlPiB0YXJnZXRzIGEgY29weSBvZiA8Y29kZT5mPC9jb2RlPidzIHRhcmdldCwgaWYgaXQgaGFzIG9uZSwgb3IgaXMgZW1wdHkgaWYgPGNvZGU+Zi48bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT4uIDwvc2ltcGFyYT48L3Bvc3Rjb25kaXRpb25zPgorICAgICAgPHRocm93cz48c2ltcGFyYT5XaWxsIG5vdCB0aHJvdyB3aGVuIHRoZSB0YXJnZXQgb2YgPGNvZGU+ZjwvY29kZT4gaXMgYSBzdGF0ZWxlc3MgZnVuY3Rpb24gb2JqZWN0IG9yIGEgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbiBvYmplY3QuIElmIGNvcHkgY29uc3RydWN0aW9uIGRvZXMgdGhyb3csIDxjb2RlPnRoaXMtJmd0OzxtZXRob2RuYW1lPmVtcHR5PC9tZXRob2RuYW1lPigpPC9jb2RlPi48L3NpbXBhcmE+PC90aHJvd3M+CisgICAgPC9jb3B5LWFzc2lnbm1lbnQ+CisgICAgCisgICAgPGNvcHktYXNzaWdubWVudD4KKyAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+CisgICAgICAgIDxwYXJhbXR5cGU+PGNsYXNzbmFtZT5mdW5jdGlvbjwvY2xhc3NuYW1lPiZhbXA7JmFtcDs8L3BhcmFtdHlwZT4KKyAgICAgIDwvcGFyYW1ldGVyPgorICAgICAgPHJlcXVpcmVzPjxzaW1wYXJhPkMrKzExIGNvbXBhdGlibGUgY29tcGlsZXIuPC9zaW1wYXJhPjwvcmVxdWlyZXM+CisgICAgICA8cG9zdGNvbmRpdGlvbnM+PHNpbXBhcmE+TW92ZXMgdGhlIHZhbHVlIGZyb20gPGNvZGU+ZjwvY29kZT4gdG8gPGNvZGU+KnRoaXM8L2NvZGU+LiBJZiB0aGUgYXJndW1lbnQgaGFzIGl0cyBmdW5jdGlvbiBvYmplY3QgYWxsb2NhdGVkIG9uIHRoZSBoZWFwLCBpdHMgYnVmZmVyIHdpbGwgYmUgYXNzaWduZWQgdG8gPGNvZGU+KnRoaXM8L2NvZGU+IGxlYXZpbmcgYXJndW1lbnQgZW1wdHkuPC9zaW1wYXJhPjwvcG9zdGNvbmRpdGlvbnM+CisgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93IHVubGVzcyBhcmd1bWVudCBoYXMgaXRzIGZ1bmN0aW9uIG9iamVjdCBhbGxvY2F0ZWQgbm90IG9uIHRoZSBoZWFwIGFuZCBjb3B5aW5nIHRoZSB0YXJnZXQgb2YgPGNvZGU+ZjwvY29kZT4gdGhyb3dzLjwvc2ltcGFyYT48L3Rocm93cz4KKyAgICA8L2NvcHktYXNzaWdubWVudD4KKworICAgIDxtZXRob2QtZ3JvdXAgbmFtZT0ibW9kaWZpZXJzIj4KKyAgICAgIDxtZXRob2QgbmFtZT0ic3dhcCI+CisgICAgICAgIDx0eXBlPnZvaWQ8L3R5cGU+CisgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+PHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uPC9jbGFzc25hbWU+JmFtcDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPGVmZmVjdHM+PHNpbXBhcmE+SW50ZXJjaGFuZ2VzIHRoZSB0YXJnZXRzIG9mIDxjb2RlPip0aGlzPC9jb2RlPiBhbmQgPGNvZGU+ZjwvY29kZT4uPC9zaW1wYXJhPjwvZWZmZWN0cz4KKyAgICAgIDwvbWV0aG9kPgorCisgICAgICA8bWV0aG9kIG5hbWU9ImNsZWFyIj4KKyAgICAgICAgPHR5cGU+dm9pZDwvdHlwZT4KKyAgICAgICAgPHBvc3Rjb25kaXRpb25zPjxzaW1wYXJhPjxjb2RlPnRoaXMtJmd0OzxtZXRob2RuYW1lPmVtcHR5PC9tZXRob2RuYW1lPigpPC9jb2RlPjwvc2ltcGFyYT48L3Bvc3Rjb25kaXRpb25zPgorICAgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93Ljwvc2ltcGFyYT48L3Rocm93cz4KKyAgICAgIDwvbWV0aG9kPgorICAgIDwvbWV0aG9kLWdyb3VwPgorCisgICAgPG1ldGhvZC1ncm91cCBuYW1lPSJjYXBhY2l0eSI+CisgICAgICA8bWV0aG9kIG5hbWU9ImVtcHR5IiBjdj0iY29uc3QiPgorICAgICAgICA8dHlwZT5ib29sPC90eXBlPgorICAgICAgICA8cmV0dXJucz48c2ltcGFyYT48Y29kZT5mYWxzZTwvY29kZT4gaWYgPGNvZGU+dGhpczwvY29kZT4gaGFzIGEgdGFyZ2V0LCBhbmQgPGNvZGU+dHJ1ZTwvY29kZT4gb3RoZXJ3aXNlLjwvc2ltcGFyYT48L3JldHVybnM+CisgICAgICAgIDx0aHJvd3M+PHNpbXBhcmE+V2lsbCBub3QgdGhyb3cuPC9zaW1wYXJhPjwvdGhyb3dzPgorICAgICAgPC9tZXRob2Q+CisKKyAgICAgIDxtZXRob2QgbmFtZT0iY29udmVyc2lvbi1vcGVyYXRvciIgY3Y9ImNvbnN0Ij4KKyAgICAgICAgPHR5cGU+c2FmZV9ib29sPC90eXBlPgorICAgICAgICA8cmV0dXJucz48c2ltcGFyYT5BIDxjb2RlPnNhZmVfYm9vbDwvY29kZT4gdGhhdCBldmFsdWF0ZXMgPGNvZGU+ZmFsc2U8L2NvZGU+IGluIGEgYm9vbGVhbiBjb250ZXh0IHdoZW4gPGNvZGU+dGhpcy0mZ3Q7PG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvZGU+LCBhbmQgPGNvZGU+dHJ1ZTwvY29kZT4gb3RoZXJ3aXNlLjwvc2ltcGFyYT48L3JldHVybnM+CisgICAgICAgIDx0aHJvd3M+PHNpbXBhcmE+V2lsbCBub3QgdGhyb3cuPC9zaW1wYXJhPjwvdGhyb3dzPgorICAgICAgPC9tZXRob2Q+CisKKyAgICAgIDxtZXRob2QgbmFtZT0ib3BlcmF0b3IhIiBjdj0iY29uc3QiPgorICAgICAgICA8dHlwZT5ib29sPC90eXBlPgorICAgICAgICA8cmV0dXJucz48c2ltcGFyYT48Y29kZT50aGlzLSZndDs8bWV0aG9kbmFtZT5lbXB0eTwvbWV0aG9kbmFtZT4oKTwvY29kZT48L3NpbXBhcmE+PC9yZXR1cm5zPgorICAgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93Ljwvc2ltcGFyYT48L3Rocm93cz4KKyAgICAgIDwvbWV0aG9kPgorICAgIDwvbWV0aG9kLWdyb3VwPgorCisgICAgPG1ldGhvZC1ncm91cCBuYW1lPSJ0YXJnZXQgYWNjZXNzIj4KKyAgICAgIDxvdmVybG9hZGVkLW1ldGhvZCBuYW1lPSJ0YXJnZXQiPgorICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgIDx0ZW1wbGF0ZT4gCisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+RnVuY3Rvcio8L3R5cGU+CisgICAgICAgIDwvc2lnbmF0dXJlPgorICAgICAgICA8c2lnbmF0dXJlIGN2PSJjb25zdCI+CisgICAgICAgICAgPHRlbXBsYXRlPiAKKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJGdW5jdG9yIi8+CisgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICA8dHlwZT5jb25zdCBGdW5jdG9yKjwvdHlwZT4KKyAgICAgICAgPC9zaWduYXR1cmU+CisKKyAgICAgICAgPHJldHVybnM+PHNpbXBhcmE+SWYgPGNvZGU+dGhpczwvY29kZT4gc3RvcmVzIGEgdGFyZ2V0IG9mIHR5cGUKKyAgICAgICAgPGNvZGU+RnVuY3RvcjwvY29kZT4sIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlCisgICAgICAgIHRhcmdldC4gT3RoZXJ3aXNlLCByZXR1cm5zIHRoZSBOVUxMCisgICAgICAgIHBvaW50ZXIuPC9zaW1wYXJhPjwvcmV0dXJucz4KKyAgICAgICAgPHRocm93cz48c2ltcGFyYT5XaWxsIG5vdCB0aHJvdy48L3NpbXBhcmE+PC90aHJvd3M+CisgICAgICA8L292ZXJsb2FkZWQtbWV0aG9kPgorCisgICAgICA8bWV0aG9kIG5hbWU9ImNvbnRhaW5zIiBjdj0iY29uc3QiPgorICAgICAgICA8dGVtcGxhdGU+CisgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkZ1bmN0b3IiLz4KKyAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgPHR5cGU+Ym9vbDwvdHlwZT4KKyAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj4KKyAgICAgICAgICA8cGFyYW10eXBlPmNvbnN0IEZ1bmN0b3ImYW1wOzwvcGFyYW10eXBlPgorICAgICAgICA8L3BhcmFtZXRlcj4KKyAgICAgICAgPHJldHVybnM+PHNpbXBhcmE+PGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+dGhpcy0mZ3Q7PG1ldGhvZG5hbWU+dGFyZ2V0PC9tZXRob2RuYW1lPiZsdDtGdW5jdG9yJmd0OygpPC9jb2RlPiBpcyBub24tTlVMTCBhbmQgPGNvZGU+PGZ1bmN0aW9ubmFtZT5mdW5jdGlvbl9lcXVhbDwvZnVuY3Rpb25uYW1lPigqKHRoaXMtJmd0O3RhcmdldCZsdDtGdW5jdG9yJmd0OygpKSwgZik8L2NvZGU+PC9zaW1wYXJhPjwvcmV0dXJucz4KKyAKKyAgICAgIDwvbWV0aG9kPgorCisgICAgICA8bWV0aG9kIG5hbWU9InRhcmdldF90eXBlIiBjdj0iY29uc3QiPgorICAgICAgICA8dHlwZT5jb25zdCBzdGQ6OnR5cGVfaW5mbyZhbXA7PC90eXBlPgorICAgICAgICA8cmV0dXJucz48c2ltcGFyYT48Y29kZT50eXBlaWQ8L2NvZGU+IG9mIHRoZSB0YXJnZXQgZnVuY3Rpb24gb2JqZWN0LCBvciA8Y29kZT50eXBlaWQodm9pZCk8L2NvZGU+IGlmIDxjb2RlPnRoaXMtJmd0OzxtZXRob2RuYW1lPmVtcHR5PC9tZXRob2RuYW1lPigpPC9jb2RlPi48L3NpbXBhcmE+PC9yZXR1cm5zPgorICAgICAgICA8dGhyb3dzPjxzaW1wYXJhPldpbGwgbm90IHRocm93Ljwvc2ltcGFyYT48L3Rocm93cz4KKyAgICAgIDwvbWV0aG9kPgorICAgIDwvbWV0aG9kLWdyb3VwPgorCisgICAgPG1ldGhvZC1ncm91cCBuYW1lPSJpbnZvY2F0aW9uIj4KKyAgICAgIDxtZXRob2QgbmFtZT0ib3BlcmF0b3IoKSIgY3Y9ImNvbnN0Ij4KKyAgICAgICAgPHR5cGU+cmVzdWx0X3R5cGU8L3R5cGU+CisgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iYTEiPjxwYXJhbXR5cGU+YXJnMV90eXBlPC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iYTIiPjxwYXJhbXR5cGU+YXJnMl90eXBlPC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDxwYXJhbWV0ZXI+PHBhcmFtdHlwZT4uLi48L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJhTiI+PHBhcmFtdHlwZT5hcmdOX3R5cGU8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPGVmZmVjdHM+PHNpbXBhcmE+PGNvZGU+ZihhMSwgYTIsIC4uLiwgYU4pPC9jb2RlPiwgd2hlcmUgPGNvZGU+ZjwvY29kZT4gaXMgdGhlIHRhcmdldCBvZiA8Y29kZT4qdGhpczwvY29kZT4uPC9zaW1wYXJhPjwvZWZmZWN0cz4KKyAgICAgICAgPHJldHVybnM+PHNpbXBhcmE+aWYgPGNvZGU+UjwvY29kZT4gaXMgPGNvZGU+dm9pZDwvY29kZT4sIG5vdGhpbmcgaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSwgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgY2FsbCB0byA8Y29kZT5mPC9jb2RlPiBpcyByZXR1cm5lZC48L3NpbXBhcmE+PC9yZXR1cm5zPgorICAgICAgICA8dGhyb3dzPjxzaW1wYXJhPjxjb2RlPjxjbGFzc25hbWU+YmFkX2Z1bmN0aW9uX2NhbGw8L2NsYXNzbmFtZT48L2NvZGU+IGlmIDxjb2RlPnRoaXMtJmd0OzxtZXRob2RuYW1lPmVtcHR5PC9tZXRob2RuYW1lPigpPC9jb2RlPi4gT3RoZXJ3aXNlLCBtYXkgdGhyb3VnaCBhbnkgZXhjZXB0aW9uIHRocm93biBieSB0aGUgdGFyZ2V0IGZ1bmN0aW9uIDxjb2RlPmY8L2NvZGU+Ljwvc2ltcGFyYT48L3Rocm93cz4KKyAgICAgIDwvbWV0aG9kPgorICAgIDwvbWV0aG9kLWdyb3VwPgorCisgICAgPGZyZWUtZnVuY3Rpb24tZ3JvdXAgbmFtZT0ic3BlY2lhbGl6ZWQgYWxnb3JpdGhtcyI+CisgICAgICA8ZnVuY3Rpb24gbmFtZT0ic3dhcCI+CisgICAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iU2lnbmF0dXJlIi8+CisgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgIDx0eXBlPnZvaWQ8L3R5cGU+CisgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZjEiPjxwYXJhbXR5cGU+PGNsYXNzbmFtZT5mdW5jdGlvbjwvY2xhc3NuYW1lPiZsdDtTaWduYXR1cmUmZ3Q7JmFtcDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmMiI+PHBhcmFtdHlwZT48Y2xhc3NuYW1lPmZ1bmN0aW9uPC9jbGFzc25hbWU+Jmx0O1NpZ25hdHVyZSZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8ZWZmZWN0cz48c2ltcGFyYT48Y29kZT5mMS48bWV0aG9kbmFtZT5zd2FwPC9tZXRob2RuYW1lPihmMik8L2NvZGU+PC9zaW1wYXJhPjwvZWZmZWN0cz4KKyAgICAgIDwvZnVuY3Rpb24+CisgICAgPC9mcmVlLWZ1bmN0aW9uLWdyb3VwPgorCisgICAgPGZyZWUtZnVuY3Rpb24tZ3JvdXAgbmFtZT0iY29tcGFyaXNvbiBvcGVyYXRvcnMiPgorICAgICAgPG92ZXJsb2FkZWQtZnVuY3Rpb24gbmFtZT0ib3BlcmF0b3I9PSI+CisgICAgICAgIDxzaWduYXR1cmU+CisgICAgICAgICAgPHRlbXBsYXRlPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlNpZ25hdHVyZSIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkZ1bmN0b3IiLz4KKyAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgIDx0eXBlPmJvb2w8L3R5cGU+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj48cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb248L2NsYXNzbmFtZT4mbHQ7U2lnbmF0dXJlJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJnIj48cGFyYW10eXBlPkZ1bmN0b3I8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPC9zaWduYXR1cmU+CisgICAgICAgIDxzaWduYXR1cmU+CisgICAgICAgICAgPHRlbXBsYXRlPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlNpZ25hdHVyZSIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkZ1bmN0b3IiLz4KKyAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgIDx0eXBlPmJvb2w8L3R5cGU+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJnIj48cGFyYW10eXBlPkZ1bmN0b3I8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbjwvY2xhc3NuYW1lPiZsdDtTaWduYXR1cmUmZ3Q7JmFtcDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPC9zaWduYXR1cmU+ICAgICAgICAKKyAgICAgICAgPHNpZ25hdHVyZT4KKyAgICAgICAgICA8dGVtcGxhdGU+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iU2lnbmF0dXJlIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+Ym9vbDwvdHlwZT4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbjwvY2xhc3NuYW1lPiZsdDtTaWduYXR1cmUmZ3Q7JmFtcDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImciPjxwYXJhbXR5cGU+PGNsYXNzbmFtZT5yZWZlcmVuY2Vfd3JhcHBlcjwvY2xhc3NuYW1lPiZsdDtGdW5jdG9yJmd0OzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8L3NpZ25hdHVyZT4KKyAgICAgICAgPHNpZ25hdHVyZT4KKyAgICAgICAgICA8dGVtcGxhdGU+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iU2lnbmF0dXJlIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+Ym9vbDwvdHlwZT4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImciPjxwYXJhbXR5cGU+PGNsYXNzbmFtZT5yZWZlcmVuY2Vfd3JhcHBlcjwvY2xhc3NuYW1lPiZsdDtGdW5jdG9yJmd0OzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+PHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uPC9jbGFzc25hbWU+Jmx0O1NpZ25hdHVyZSZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8L3NpZ25hdHVyZT4gICAgICAgIAorICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJTaWduYXR1cmUxIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iU2lnbmF0dXJlMiIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+dm9pZDwvdHlwZT4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYxIj48cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb248L2NsYXNzbmFtZT4mbHQ7U2lnbmF0dXJlMSZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZjIiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbjwvY2xhc3NuYW1lPiZsdDtTaWduYXR1cmUyJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDwvc2lnbmF0dXJlPgorCisgICAgICAgIDxyZXR1cm5zPjxzaW1wYXJhPlRydWUgd2hlbiA8Y29kZT5mPC9jb2RlPiBzdG9yZXMgYW4gb2JqZWN0IG9mCisgICAgICAgIHR5cGUgPGNvZGU+RnVuY3RvcjwvY29kZT4gYW5kIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXBwbGllczoKKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorCisgICAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+PGNvZGU+ZzwvY29kZT4gaXMgb2YgdHlwZQorICAgICAgICAgICAgPGNvZGU+PGNsYXNzbmFtZT5yZWZlcmVuY2Vfd3JhcHBlcjwvY2xhc3NuYW1lPiZsdDtGdW5jdG9yJmd0OzwvY29kZT4KKyAgICAgICAgICAgIGFuZCA8Y29kZT5mLnRhcmdldCZsdDtGdW5jdG9yJmd0OygpID09IGcuPG1ldGhvZG5hbWUKKyAgICAgICAgICAgIGFsdD0icmVmZXJlbmNlX3dyYXBwZXI6OmdldF9wb2ludGVyIj5nZXRfcG9pbnRlcjwvbWV0aG9kbmFtZT4oKTwvY29kZT4uPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT48Y29kZT5nPC9jb2RlPiBpcyBub3Qgb2YgdHlwZQorICAgICAgICAgICAgPGNvZGU+PGNsYXNzbmFtZT5yZWZlcmVuY2Vfd3JhcHBlcjwvY2xhc3NuYW1lPiZsdDtGdW5jdG9yJmd0OzwvY29kZT4KKyAgICAgICAgICAgIGFuZCA8Y29kZT48ZnVuY3Rpb25uYW1lPmZ1bmN0aW9uX2VxdWFsczwvZnVuY3Rpb25uYW1lPigqKGYudGFyZ2V0Jmx0O0Z1bmN0b3ImZ3Q7KCkpLCBnKTwvY29kZT4uPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisKKyAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8L3NpbXBhcmE+PC9yZXR1cm5zPgorCisgICAgICAgIDxub3Rlcz48c2ltcGFyYT48Y29kZT48Y2xhc3NuYW1lPmZ1bmN0aW9uPC9jbGFzc25hbWU+PC9jb2RlPgorICAgICAgICBvYmplY3RzIGFyZSBub3QKKyAgICAgICAgPGNvbmNlcHRuYW1lPkVxdWFsaXR5Q29tcGFyYWJsZTwvY29uY2VwdG5hbWU+Ljwvc2ltcGFyYT48L25vdGVzPgorCisgICAgICAgIDxyYXRpb25hbGU+PHNpbXBhcmE+VGhlIDxjb2RlPnNhZmVfYm9vbDwvY29kZT4gY29udmVyc2lvbgorICAgICAgICBvcGVucyBhIGxvb3Bob2xlIHdoZXJlYnkgdHdvIDxjb2RlPmZ1bmN0aW9uPC9jb2RlPgorICAgICAgICBpbnN0YW5jZXMgY2FuIGJlIGNvbXBhcmVkIHZpYSA8Y29kZT49PTwvY29kZT4sIGFsdGhvdWdoIHRoaXMKKyAgICAgICAgaXMgbm90IGZlYXNpYmxlIHRvIGltcGxlbWVudC4gVGhlIHVuZGVmaW5lZCA8Y29kZT52b2lkCisgICAgICAgIG9wZXJhdG9yPT08L2NvZGU+IGNsb3NlcyB0aGUgbG9vcGhvbGUgYW5kIGVuc3VyZXMgYQorICAgICAgICBjb21waWxlLXRpbWUgb3IgbGluay10aW1lIGVycm9yLjwvc2ltcGFyYT48L3JhdGlvbmFsZT4KKyAgICAgIDwvb3ZlcmxvYWRlZC1mdW5jdGlvbj4KKworICAgICAgPG92ZXJsb2FkZWQtZnVuY3Rpb24gbmFtZT0ib3BlcmF0b3IhPSI+CisgICAgICAgIDxzaWduYXR1cmU+CisgICAgICAgICAgPHRlbXBsYXRlPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlNpZ25hdHVyZSIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkZ1bmN0b3IiLz4KKyAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgIDx0eXBlPmJvb2w8L3R5cGU+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJmIj48cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb248L2NsYXNzbmFtZT4mbHQ7U2lnbmF0dXJlJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJnIj48cGFyYW10eXBlPkZ1bmN0b3I8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPC9zaWduYXR1cmU+CisgICAgICAgIDxzaWduYXR1cmU+CisgICAgICAgICAgPHRlbXBsYXRlPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IlNpZ25hdHVyZSIvPgorICAgICAgICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkZ1bmN0b3IiLz4KKyAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgIDx0eXBlPmJvb2w8L3R5cGU+CisgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJnIj48cGFyYW10eXBlPkZ1bmN0b3I8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbjwvY2xhc3NuYW1lPiZsdDtTaWduYXR1cmUmZ3Q7JmFtcDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgPC9zaWduYXR1cmU+ICAgICAgICAKKyAgICAgICAgPHNpZ25hdHVyZT4KKyAgICAgICAgICA8dGVtcGxhdGU+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iU2lnbmF0dXJlIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+Ym9vbDwvdHlwZT4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbjwvY2xhc3NuYW1lPiZsdDtTaWduYXR1cmUmZ3Q7JmFtcDs8L3BhcmFtdHlwZT48L3BhcmFtZXRlcj4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImciPjxwYXJhbXR5cGU+PGNsYXNzbmFtZT5yZWZlcmVuY2Vfd3JhcHBlcjwvY2xhc3NuYW1lPiZsdDtGdW5jdG9yJmd0OzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8L3NpZ25hdHVyZT4KKyAgICAgICAgPHNpZ25hdHVyZT4KKyAgICAgICAgICA8dGVtcGxhdGU+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iU2lnbmF0dXJlIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRnVuY3RvciIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+Ym9vbDwvdHlwZT4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImciPjxwYXJhbXR5cGU+PGNsYXNzbmFtZT5yZWZlcmVuY2Vfd3JhcHBlcjwvY2xhc3NuYW1lPiZsdDtGdW5jdG9yJmd0OzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZiI+PHBhcmFtdHlwZT5jb25zdCA8Y2xhc3NuYW1lPmZ1bmN0aW9uPC9jbGFzc25hbWU+Jmx0O1NpZ25hdHVyZSZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICA8L3NpZ25hdHVyZT4gICAgICAgIAorICAgICAgICA8c2lnbmF0dXJlPgorICAgICAgICAgIDx0ZW1wbGF0ZT4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZS10eXBlLXBhcmFtZXRlciBuYW1lPSJTaWduYXR1cmUxIi8+CisgICAgICAgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iU2lnbmF0dXJlMiIvPgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgPHR5cGU+dm9pZDwvdHlwZT4KKyAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImYxIj48cGFyYW10eXBlPmNvbnN0IDxjbGFzc25hbWU+ZnVuY3Rpb248L2NsYXNzbmFtZT4mbHQ7U2lnbmF0dXJlMSZndDsmYW1wOzwvcGFyYW10eXBlPjwvcGFyYW1ldGVyPgorICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZjIiPjxwYXJhbXR5cGU+Y29uc3QgPGNsYXNzbmFtZT5mdW5jdGlvbjwvY2xhc3NuYW1lPiZsdDtTaWduYXR1cmUyJmd0OyZhbXA7PC9wYXJhbXR5cGU+PC9wYXJhbWV0ZXI+CisgICAgICAgIDwvc2lnbmF0dXJlPgorCisgICAgICAgIDxyZXR1cm5zPjxzaW1wYXJhPlRydWUgd2hlbiA8Y29kZT5mPC9jb2RlPiBkb2VzIG5vdCBzdG9yZSBhbgorICAgICAgICBvYmplY3Qgb2YgdHlwZSA8Y29kZT5GdW5jdG9yPC9jb2RlPiBvciBpdCBzdG9yZXMgYW4gb2JqZWN0IG9mCisgICAgICAgIHR5cGUgPGNvZGU+RnVuY3RvcjwvY29kZT4gYW5kIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICAgICAgYXBwbGllczoKKyAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorCisgICAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+PGNvZGU+ZzwvY29kZT4gaXMgb2YgdHlwZQorICAgICAgICAgICAgPGNvZGU+PGNsYXNzbmFtZT5yZWZlcmVuY2Vfd3JhcHBlcjwvY2xhc3NuYW1lPiZsdDtGdW5jdG9yJmd0OzwvY29kZT4KKyAgICAgICAgICAgIGFuZCA8Y29kZT5mLnRhcmdldCZsdDtGdW5jdG9yJmd0OygpICE9IGcuPG1ldGhvZG5hbWUKKyAgICAgICAgICAgIGFsdD0icmVmZXJlbmNlX3dyYXBwZXI6OmdldF9wb2ludGVyIj5nZXRfcG9pbnRlcjwvbWV0aG9kbmFtZT4oKTwvY29kZT4uPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT48Y29kZT5nPC9jb2RlPiBpcyBub3Qgb2YgdHlwZQorICAgICAgICAgICAgPGNvZGU+PGNsYXNzbmFtZT5yZWZlcmVuY2Vfd3JhcHBlcjwvY2xhc3NuYW1lPiZsdDtGdW5jdG9yJmd0OzwvY29kZT4KKyAgICAgICAgICAgIGFuZCA8Y29kZT4hPGZ1bmN0aW9ubmFtZT5mdW5jdGlvbl9lcXVhbHM8L2Z1bmN0aW9ubmFtZT4oKihmLnRhcmdldCZsdDtGdW5jdG9yJmd0OygpKSwgZyk8L2NvZGU+Ljwvc2ltcGFyYT48L2xpc3RpdGVtPgorCisgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgPC9zaW1wYXJhPjwvcmV0dXJucz4KKworICAgICAgICA8bm90ZXM+PHNpbXBhcmE+PGNvZGU+PGNsYXNzbmFtZT5mdW5jdGlvbjwvY2xhc3NuYW1lPjwvY29kZT4KKyAgICAgICAgb2JqZWN0cyBhcmUgbm90CisgICAgICAgIDxjb25jZXB0bmFtZT5FcXVhbGl0eUNvbXBhcmFibGU8L2NvbmNlcHRuYW1lPi48L3NpbXBhcmE+PC9ub3Rlcz4KKworICAgICAgICA8cmF0aW9uYWxlPjxzaW1wYXJhPlRoZSA8Y29kZT5zYWZlX2Jvb2w8L2NvZGU+IGNvbnZlcnNpb24KKyAgICAgICAgb3BlbnMgYSBsb29waG9sZSB3aGVyZWJ5IHR3byA8Y29kZT5mdW5jdGlvbjwvY29kZT4KKyAgICAgICAgaW5zdGFuY2VzIGNhbiBiZSBjb21wYXJlZCB2aWEgPGNvZGU+IT08L2NvZGU+LCBhbHRob3VnaCB0aGlzCisgICAgICAgIGlzIG5vdCBmZWFzaWJsZSB0byBpbXBsZW1lbnQuIFRoZSB1bmRlZmluZWQgPGNvZGU+dm9pZAorICAgICAgICBvcGVyYXRvciE9PC9jb2RlPiBjbG9zZXMgdGhlIGxvb3Bob2xlIGFuZCBlbnN1cmVzIGEKKyAgICAgICAgY29tcGlsZS10aW1lIG9yIGxpbmstdGltZSBlcnJvci48L3NpbXBhcmE+PC9yYXRpb25hbGU+CisgICAgICA8L292ZXJsb2FkZWQtZnVuY3Rpb24+CisgICAgPC9mcmVlLWZ1bmN0aW9uLWdyb3VwPgorICA8L2NsYXNzPgorPC9uYW1lc3BhY2U+Cis8L2hlYWRlcj4KKworPGhlYWRlciBuYW1lPSJib29zdC9mdW5jdGlvbl9lcXVhbC5ocHAiPgorICA8bmFtZXNwYWNlIG5hbWU9ImJvb3N0Ij4KKyAgPGZ1bmN0aW9uIG5hbWU9ImZ1bmN0aW9uX2VxdWFsIj4KKyAgICA8dGVtcGxhdGU+CisgICAgICA8dGVtcGxhdGUtdHlwZS1wYXJhbWV0ZXIgbmFtZT0iRiIvPgorICAgICAgPHRlbXBsYXRlLXR5cGUtcGFyYW1ldGVyIG5hbWU9IkciLz4KKyAgICA8L3RlbXBsYXRlPgorICAgIDx0eXBlPmJvb2w8L3R5cGU+CisgICAgPHBhcmFtZXRlciBuYW1lPSJmIj4KKyAgICAgIDxwYXJhbXR5cGU+Y29uc3QgRiZhbXA7PC9wYXJhbXR5cGU+CisgICAgPC9wYXJhbWV0ZXI+CisgICAgPHBhcmFtZXRlciBuYW1lPSJnIj4KKyAgICAgIDxwYXJhbXR5cGU+Y29uc3QgRyZhbXA7PC9wYXJhbXR5cGU+CisgICAgPC9wYXJhbWV0ZXI+CisgICAgPHB1cnBvc2U+PHNpbXBhcmE+Q29tcGFyZSB0d28gZnVuY3Rpb24gb2JqZWN0cyBmb3IgZXF1YWxpdHkuPC9zaW1wYXJhPjwvcHVycG9zZT4KKyAgICA8cmV0dXJucz48c2ltcGFyYT48Y29kZT5mID09IGc8L2NvZGU+Ljwvc2ltcGFyYT48L3JldHVybnM+CisgICAgPHRocm93cz48c2ltcGFyYT5Pbmx5IGlmIDxjb2RlPmYgPT0gZzwvY29kZT4gdGhyb3dzLjwvc2ltcGFyYT48L3Rocm93cz4KKyAgPC9mdW5jdGlvbj4KKyAgPC9uYW1lc3BhY2U+Cis8L2hlYWRlcj4KKzwvbGlicmFyeS1yZWZlcmVuY2U+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9kb2MvdGVzdHMueG1sIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vZG9jL3Rlc3RzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjE0MTczCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vZG9jL3Rlc3RzLnhtbApAQCAtMCwwICsxLDI1OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgIENvcHlyaWdodCAoYykgMjAwMiBEb3VnbGFzIEdyZWdvciA8ZG91Zy5ncmVnb3IgLWF0LSBnbWFpbC5jb20+CisgIAorICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICAtLT4KKzwhRE9DVFlQRSBsaWJyYXJ5IFBVQkxJQyAiLS8vQm9vc3QvL0RURCBCb29zdEJvb2sgWE1MIFYxLjAvL0VOIgorICAiaHR0cDovL3d3dy5ib29zdC5vcmcvdG9vbHMvYm9vc3Rib29rL2R0ZC9ib29zdGJvb2suZHRkIj4KKzx0ZXN0c3VpdGUgaWQ9ImZ1bmN0aW9uLnRlc3RzdWl0ZSIgbGFzdC1yZXZpc2lvbj0iJERhdGUkIj4KKyAgPHJ1bi10ZXN0IGZpbGVuYW1lPSJmdW5jdGlvbl90ZXN0LmNwcCIgbmFtZT0ibGliX2Z1bmN0aW9uX3Rlc3QiPgorICAgIDxwdXJwb3NlPjxwYXJhPlRlc3QgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgPGNsYXNzbmFtZT5ib29zdDo6ZnVuY3Rpb248L2NsYXNzbmFtZT4gY2xhc3MgdGVtcGxhdGUuPC9wYXJhPjwvcHVycG9zZT4KKyAgICA8aWYtZmFpbHM+PHBhcmE+VGhlIDxjbGFzc25hbWU+Ym9vc3Q6OmZ1bmN0aW9uPC9jbGFzc25hbWU+IGNsYXNzIHRlbXBsYXRlIG1heSBub3QgYmUgdXNhYmxlIG9uIHlvdXIgY29tcGlsZXIuIEhvd2V2ZXIsIHRoZSBsaWJyYXJ5IG1heSBzdGlsbCBiZSB1c2FibGUgdmlhIHRoZSA8Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbk48L2NsYXNzbmFtZT4gY2xhc3MgdGVtcGxhdGVzLjwvcGFyYT48L2lmLWZhaWxzPgorICA8L3J1bi10ZXN0PgorCisgIDxydW4tdGVzdCBmaWxlbmFtZT0iZnVuY3Rpb25fbl90ZXN0LmNwcCI+CisgICAgPHB1cnBvc2U+PHBhcmE+VGVzdCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSA8Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbk48L2NsYXNzbmFtZT4gY2xhc3MgdGVtcGxhdGVzLjwvcGFyYT48L3B1cnBvc2U+CisgIDwvcnVuLXRlc3Q+CisKKyAgPHJ1bi10ZXN0IGZpbGVuYW1lPSJhbGxvY2F0b3JfdGVzdC5jcHAiPgorICAgIDxwdXJwb3NlPjxwYXJhPlRlc3QgdGhlIHVzZSBvZiBjdXN0b20gYWxsb2NhdG9ycy48L3BhcmE+PC9wdXJwb3NlPgorICAgIDxpZi1mYWlscz48cGFyYT5BbGxvY2F0b3JzIGFyZSBpZ25vcmVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbi48L3BhcmE+PC9pZi1mYWlscz4KKyAgPC9ydW4tdGVzdD4KKworICA8cnVuLXRlc3QgZmlsZW5hbWU9InN0YXRlbGVzc190ZXN0LmNwcCI+CisgICAgPHB1cnBvc2U+PHBhcmE+VGVzdCB0aGUgb3B0aW1pemF0aW9uIG9mIHN0YXRlbGVzcyBmdW5jdGlvbiBvYmplY3RzIGluIHRoZSBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5LjwvcGFyYT48L3B1cnBvc2U+CisgICAgPGlmLWZhaWxzPjxwYXJhPlRoZSBleGNlcHRpb24tc2FmZXR5IGFuZCBwZXJmb3JtYW5jZSBndWFyYW50ZWVzIGdpdmVuIGZvciBzdGF0ZWxlc3MgZnVuY3Rpb24gb2JqZWN0cyBtYXkgbm90IGJlIG1ldCBieSB0aGUgaW1wbGVtZW50YXRpb24uPC9wYXJhPjwvaWYtZmFpbHM+CisgIDwvcnVuLXRlc3Q+CisKKyAgPHJ1bi10ZXN0IGZpbGVuYW1lPSJsYW1iZGFfdGVzdC5jcHAiPgorICAgIDxwdXJwb3NlPjxwYXJhPlRlc3QgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gQm9vc3QuRnVuY3Rpb24gYW5kIEJvb3N0LkxhbWJkYS48L3BhcmE+PC9wdXJwb3NlPgorICAgIDxpZi1mYWlscz48cGFyYT5FaXRoZXIgQm9vc3QuTGFtYmRhIGRvZXMgbm90IHdvcmsgb24gdGhlIHBsYXRmb3JtLCBvciBCb29zdC5GdW5jdGlvbiBjYW5ub3Qgc2FmZWx5IGJlIGFwcGxpZWQgd2l0aG91dCB0aGUgdXNlIG9mIDxmdW5jdGlvbm5hbWU+Ym9vc3Q6OnVubGFtYmRhPC9mdW5jdGlvbm5hbWU+LjwvcGFyYT48L2lmLWZhaWxzPgorICA8L3J1bi10ZXN0PgorCisgIDxydW4tdGVzdCBmaWxlbmFtZT0iY29udGFpbnNfdGVzdC5jcHAiPgorICAgIDxwdXJwb3NlPjxwYXJhPlRlc3QgdGhlIG9wZXJhdGlvbiBvZiB0aGUKKyAgICA8Y29kZT48bWV0aG9kbmFtZT50YXJnZXQ8L21ldGhvZG5hbWU+PC9jb2RlPiBtZW1iZXIgZnVuY3Rpb24gYW5kIHRoZQorICAgIGVxdWFsaXR5IG9wZXJhdG9ycy48L3BhcmE+PC9wdXJwb3NlPgorICA8L3J1bi10ZXN0PgorCisgIDxjb21waWxlLWZhaWwtdGVzdCBmaWxlbmFtZT0iZnVuY3Rpb25fdGVzdF9mYWlsMS5jcHAiPgorICAgIDxwdXJwb3NlPjxwYXJhPlRlc3QgdGhlIChpbmNvcnJlY3QhKSB1c2Ugb2YgY29tcGFyaXNvbnMgYmV0d2VlbiBCb29zdC5GdW5jdGlvbiBmdW5jdGlvbiBvYmplY3RzLjwvcGFyYT48L3B1cnBvc2U+CisgICAgPGlmLWZhaWxzPjxwYXJhPkludHVpdGl2ZSAoYnV0IGluY29ycmVjdCEpIGNvZGUgbWF5IGNvbXBpbGUgYW5kIHdpbGwgZ2l2ZSBtZWFuaW5nbGVzcyByZXN1bHRzLjwvcGFyYT48L2lmLWZhaWxzPgorICA8L2NvbXBpbGUtZmFpbC10ZXN0PgorCisgIDxjb21waWxlLWZhaWwtdGVzdCBmaWxlbmFtZT0iZnVuY3Rpb25fdGVzdF9mYWlsMi5jcHAiPgorICAgIDxwdXJwb3NlPjxwYXJhPlRlc3QgdGhlIHVzZSBvZiBhbiBpbmNvbXBhdGlibGUgZnVuY3Rpb24gb2JqZWN0IHdpdGggQm9vc3QuRnVuY3Rpb248L3BhcmE+PC9wdXJwb3NlPgorICAgIDxpZi1mYWlscz48cGFyYT5JbmNvcnJlY3QgY29kZSBtYXkgY29tcGlsZSAod2l0aCBwb3RlbnRpYWxseSB1bmV4cGVjdGVkIHJlc3VsdHMpLjwvcGFyYT48L2lmLWZhaWxzPgorICA8L2NvbXBpbGUtZmFpbC10ZXN0PgorCisgIDxjb21waWxlLXRlc3QgZmlsZW5hbWU9ImZ1bmN0aW9uXzMwLmNwcCI+CisgICAgPHB1cnBvc2U+PHBhcmE+VGVzdCB0aGUgZ2VuZXJhdGlvbiBvZiBhIEJvb3N0LkZ1bmN0aW9uIGZ1bmN0aW9uIG9iamVjdCBhZGFwdG9yIGFjY2VwdGluZyAzMCBhcmd1bWVudHMuPC9wYXJhPjwvcHVycG9zZT4KKyAgICA8aWYtZmFpbHM+PHBhcmE+VGhlIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkgbWF5IHdvcmsgZm9yIGZ1bmN0aW9uIG9iamVjdCBhZGFwdG9ycyBvZiB1cCB0byAxMCBwYXJhbWV0ZXJzLCBidXQgd2lsbCBiZSB1bmFibGUgdG8gZ2VuZXJhdGUgYWRhcHRvcnMgZm9yIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgcGFyYW1ldGVycy4gRmFpbHVyZSBvZnRlbiBpbmRpY2F0ZXMgYW4gZXJyb3IgaW4gdGhlIGNvbXBpbGVyJ3MgcHJlcHJvY2Vzc29yLjwvcGFyYT48L2lmLWZhaWxzPgorICA8L2NvbXBpbGUtdGVzdD4gCisKKyAgPHJ1bi10ZXN0IGZpbGVuYW1lPSJmdW5jdGlvbl9hcml0aF9jeHg5OC5jcHAiPgorICAgIDxzb3VyY2U+CisgICAgPCFbQ0RBVEFbCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorXV0+CisKKzxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLm11bF9pbnRzIi8+Cis8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5pbnRfZGl2Ii8+CisKK2ludCBtYWluKCkKK3sKKyAgICA8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5hcml0aC5jeHg5OCIvPgorICAgIDxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLnVzZV9pbnRfZGl2Ii8+CisgICAgPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwuY2FsbF9pbnRfZGl2Ii8+CisgICAgPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwuY2hlY2tfZW1wdHkiLz4KKyAgICA8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5jbGVhciIvPgorICAgIDxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLnVzZV9tdWxfaW50cyIvPgorICAKKyAgICByZXR1cm4gMDsKK30KKzwvc291cmNlPgorICAgIDxwdXJwb3NlPjxwYXJhPlRlc3QgdGhlIGZpcnN0IHR1dG9yaWFsIGV4YW1wbGUuPC9wYXJhPjwvcHVycG9zZT4KKyAgPC9ydW4tdGVzdD4KKworICA8cnVuLXRlc3QgZmlsZW5hbWU9ImZ1bmN0aW9uX2FyaXRoX3BvcnRhYmxlLmNwcCI+CisgICAgPHNvdXJjZT4KKyAgICA8IVtDREFUQVsKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CitdXT4KKzxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLm11bF9pbnRzIi8+Cis8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5pbnRfZGl2Ii8+CitpbnQgbWFpbigpCit7CisgICAgPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwuYXJpdGgucG9ydGFibGUiLz4KKyAgICA8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC51c2VfaW50X2RpdiIvPgorICAgIDxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLmNhbGxfaW50X2RpdiIvPgorICAgIDxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLmNoZWNrX2VtcHR5Ii8+CisgICAgPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwuY2xlYXIiLz4KKyAgICA8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC51c2VfbXVsX2ludHMiLz4KKworICAgIHJldHVybiAwOworfQorPC9zb3VyY2U+CisgICAgPHB1cnBvc2U+PHBhcmE+VGVzdCB0aGUgZmlyc3QgdHV0b3JpYWwgZXhhbXBsZS48L3BhcmE+PC9wdXJwb3NlPgorICA8L3J1bi10ZXN0PgorCisgIDxydW4tdGVzdCBmaWxlbmFtZT0ic3VtX2F2Z19jeHg5OC5jcHAiPgorICAgIDxzb3VyY2U+CisgICAgPCFbQ0RBVEFbCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorXV0+Cis8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5zdW1fYXZnIi8+CitpbnQgbWFpbigpCit7CisgICAgPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwuc3VtX2F2Z19kZWNsLmN4eDk4Ii8+CisgICAgPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwudXNlX3N1bV9hdmciLz4KKworICAgIHJldHVybiAwOworfQorPC9zb3VyY2U+CisgICAgPHB1cnBvc2U+PHBhcmE+VGVzdCB0aGUgc2Vjb25kIHR1dG9yaWFsIGV4YW1wbGUuPC9wYXJhPjwvcHVycG9zZT4KKyAgPC9ydW4tdGVzdD4KKworICA8cnVuLXRlc3QgZmlsZW5hbWU9InN1bV9hdmdfcG9ydGFibGUuY3BwIj4KKyAgICA8c291cmNlPgorICAgIDwhW0NEQVRBWworI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KK11dPgorPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwuc3VtX2F2ZyIvPgoraW50IG1haW4oKQoreworICAgIDxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLnN1bV9hdmdfZGVjbC5wb3J0YWJsZSIvPgorICAgIDxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLnVzZV9zdW1fYXZnIi8+CisKKyAgICByZXR1cm4gMDsKK30KKzwvc291cmNlPgorICAgIDxwdXJwb3NlPjxwYXJhPlRlc3QgdGhlIHNlY29uZCB0dXRvcmlhbCBleGFtcGxlLjwvcGFyYT48L3B1cnBvc2U+CisgIDwvcnVuLXRlc3Q+CisKKyAgPHJ1bi10ZXN0IGZpbGVuYW1lPSJtZW1fZnVuX2N4eDk4LmNwcCI+CisgICAgPHNvdXJjZT4KKyAgICA8IVtDREFUQVsKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KK11dPgorPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwuWCIvPgoraW50IFg6OmZvbyhpbnQgeCkgeyByZXR1cm4gLXg7IH0KKworaW50IG1haW4oKQoreworICAgIDxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLm1lbV9mdW4uY3h4OTgiLz4KKworICAgIHJldHVybiAwOworfQorPC9zb3VyY2U+ICAgIAorICAgIDxwdXJwb3NlPjxwYXJhPlRlc3QgbWVtYmVyIGZ1bmN0aW9uIGV4YW1wbGUgZnJvbSB0dXRvcmlhbC48L3BhcmE+PC9wdXJwb3NlPgorICA8L3J1bi10ZXN0PgorCisgIDxydW4tdGVzdCBmaWxlbmFtZT0ibWVtX2Z1bl9wb3J0YWJsZS5jcHAiPgorICAgIDxzb3VyY2U+CisgICAgPCFbQ0RBVEFbCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CitdXT4KKzxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLlgiLz4KK2ludCBYOjpmb28oaW50IHgpIHsgcmV0dXJuIC14OyB9CisKK2ludCBtYWluKCkKK3sKKyAgICA8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5tZW1fZnVuLnBvcnRhYmxlIi8+CisKKyAgICByZXR1cm4gMDsKK30KKzwvc291cmNlPiAgICAKKyAgICA8cHVycG9zZT48cGFyYT5UZXN0IG1lbWJlciBmdW5jdGlvbiBleGFtcGxlIGZyb20gdHV0b3JpYWwuPC9wYXJhPjwvcHVycG9zZT4KKyAgPC9ydW4tdGVzdD4KKworICA8cnVuLXRlc3QgZmlsZW5hbWU9InN0ZF9iaW5kX2N4eDk4LmNwcCI+CisgICAgPHNvdXJjZT4KKyAgICA8IVtDREFUQVsKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KK11dPgorPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwuWCIvPgoraW50IFg6OmZvbyhpbnQgeCkgeyByZXR1cm4gLXg7IH0KKworaW50IG1haW4oKQoreworICAgIDxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLnN0ZF9iaW5kLmN4eDk4Ii8+CisKKyAgICByZXR1cm4gMDsKK30KKzwvc291cmNlPgorICAgIDxwdXJwb3NlPjxwYXJhPlRlc3Qgc3RhbmRhcmQgYmluZGVycyBleGFtcGxlIGZyb20gdHV0b3JpYWwuPC9wYXJhPjwvcHVycG9zZT4KKyAgPC9ydW4tdGVzdD4KKworICA8cnVuLXRlc3QgZmlsZW5hbWU9InN0ZF9iaW5kX3BvcnRhYmxlLmNwcCI+CisgICAgPHNvdXJjZT4KKyAgICA8IVtDREFUQVsKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KK11dPgorPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwuWCIvPgoraW50IFg6OmZvbyhpbnQgeCkgeyByZXR1cm4gLXg7IH0KKworaW50IG1haW4oKQoreworICAgIDxzbmlwcGV0IG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLnN0ZF9iaW5kLnBvcnRhYmxlIi8+CisKKyAgICByZXR1cm4gMDsKK30KKzwvc291cmNlPgorICAgIDxwdXJwb3NlPjxwYXJhPlRlc3Qgc3RhbmRhcmQgYmluZGVycyBleGFtcGxlIGZyb20gdHV0b3JpYWwuPC9wYXJhPjwvcHVycG9zZT4KKyAgPC9ydW4tdGVzdD4KKworICA8cnVuLXRlc3QgZmlsZW5hbWU9ImZ1bmN0aW9uX3JlZl9jeHg5OC5jcHAiPgorICAgIDxzb3VyY2U+Cis8IVtDREFUQVsKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CitdXT4KKworc3RydWN0IHN0YXRlZnVsX3R5cGUgeyBpbnQgb3BlcmF0b3IoKShpbnQpIGNvbnN0IHsgcmV0dXJuIDA7IH0gfTsKKworaW50IG1haW4oKQoreworICA8c25pcHBldCBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5yZWYuY3h4OTgiLz4KKworICAgIHJldHVybiAwOworfQorPC9zb3VyY2U+CisgICAgPHB1cnBvc2U+PHBhcmE+VGVzdCA8ZnVuY3Rpb25uYW1lPmJvb3N0OjpyZWY8L2Z1bmN0aW9ubmFtZT4gZXhhbXBsZSBmcm9tIHR1dG9yaWFsLjwvcGFyYT48L3B1cnBvc2U+CisgIDwvcnVuLXRlc3Q+CisKKyAgPHJ1bi10ZXN0IGZpbGVuYW1lPSJmdW5jdGlvbl9yZWZfcG9ydGFibGUuY3BwIj4KKyAgICA8c291cmNlPgorPCFbQ0RBVEFbCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorXV0+CisKK3N0cnVjdCBzdGF0ZWZ1bF90eXBlIHsgaW50IG9wZXJhdG9yKCkoaW50KSBjb25zdCB7IHJldHVybiAwOyB9IH07CisKK2ludCBtYWluKCkKK3sKKyAgPHNuaXBwZXQgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwucmVmLnBvcnRhYmxlIi8+CisKKyAgICByZXR1cm4gMDsKK30KKzwvc291cmNlPgorICAgIDxwdXJwb3NlPjxwYXJhPlRlc3QgPGZ1bmN0aW9ubmFtZT5ib29zdDo6cmVmPC9mdW5jdGlvbm5hbWU+IGV4YW1wbGUgZnJvbSB0dXRvcmlhbC48L3BhcmE+PC9wdXJwb3NlPgorICA8L3J1bi10ZXN0PgorPC90ZXN0c3VpdGU+CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9kb2MvdHV0b3JpYWwueG1sIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vZG9jL3R1dG9yaWFsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDM4MTJiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vZG9jL3R1dG9yaWFsLnhtbApAQCAtMCwwICsxLDM2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgIENvcHlyaWdodCAoYykgMjAwMiBEb3VnbGFzIEdyZWdvciA8ZG91Zy5ncmVnb3IgLWF0LSBnbWFpbC5jb20+CisgIAorICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICAtLT4KKzwhRE9DVFlQRSBsaWJyYXJ5IFBVQkxJQyAiLS8vQm9vc3QvL0RURCBCb29zdEJvb2sgWE1MIFYxLjAvL0VOIgorICAiaHR0cDovL3d3dy5ib29zdC5vcmcvdG9vbHMvYm9vc3Rib29rL2R0ZC9ib29zdGJvb2suZHRkIj4KKzxzZWN0aW9uIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIiBpZD0iZnVuY3Rpb24udHV0b3JpYWwiCisgICAgICAgICBsYXN0LXJldmlzaW9uPSIkRGF0ZSQiPgorPHRpdGxlPlR1dG9yaWFsPC90aXRsZT4KKworPHVzaW5nLW5hbWVzcGFjZSBuYW1lPSJib29zdCIvPgorCis8cGFyYT4gQm9vc3QuRnVuY3Rpb24gaGFzIHR3byBzeW50YWN0aWNhbCBmb3JtczogdGhlIHByZWZlcnJlZCBmb3JtCithbmQgdGhlIHBvcnRhYmxlIGZvcm0uIFRoZSBwcmVmZXJyZWQgZm9ybSBmaXRzIG1vcmUgY2xvc2VseSB3aXRoIHRoZQorQysrIGxhbmd1YWdlIGFuZCByZWR1Y2VzIHRoZSBudW1iZXIgb2Ygc2VwYXJhdGUgdGVtcGxhdGUgcGFyYW1ldGVycwordGhhdCBuZWVkIHRvIGJlIGNvbnNpZGVyZWQsIG9mdGVuIGltcHJvdmluZyByZWFkYWJpbGl0eTsgaG93ZXZlciwgdGhlCitwcmVmZXJyZWQgZm9ybSBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXMgZHVlIHRvIGNvbXBpbGVyCitidWdzLiBUaGUgY29tcGF0aWJsZSBmb3JtIHdpbGwgd29yayBvbiBhbGwgY29tcGlsZXJzIHN1cHBvcnRlZCBieQorQm9vc3QuRnVuY3Rpb24uIENvbnN1bHQgdGhlIHRhYmxlIGJlbG93IHRvIGRldGVybWluZSB3aGljaCBzeW50YWN0aWMKK2Zvcm0gdG8gdXNlIGZvciB5b3VyIGNvbXBpbGVyLgorCisgIDxpbmZvcm1hbHRhYmxlPgorICAgIDx0Z3JvdXAgY29scz0iMiIgYWxpZ249ImxlZnQiPgorICAgICAgPHRoZWFkPgorICAgICAgICA8cm93PgorICAgICAgICAgIDxlbnRyeT5QcmVmZXJyZWQgc3ludGF4PC9lbnRyeT4KKyAgICAgICAgICA8ZW50cnk+UG9ydGFibGUgc3ludGF4PC9lbnRyeT4KKyAgICAgICAgPC9yb3c+CisgICAgICA8L3RoZWFkPgorICAgICAgPHRib2R5PgorICAgICAgICA8cm93PgorICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Qgc3BhY2luZz0iY29tcGFjdCI+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT5HTlUgQysrIDIuOTUueCwgMy4wLnggYW5kIGxhdGVyIHZlcnNpb25zPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT5Db21lYXUgQysrIDQuMi40NS4yPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT5TR0kgTUlQU3BybyA3LjMuMDwvc2ltcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+SW50ZWwgQysrIDUuMCwgNi4wPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT5Db21wYXEncyBjeHggNi4yPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisJICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPk1pY3Jvc29mdCBWaXN1YWwgQysrIDcuMSBhbmQgbGF0ZXIgdmVyc2lvbnM8L3NpbXBhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdCBzcGFjaW5nPSJjb21wYWN0Ij4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPjxlbXBoYXNpcz5BbnkgY29tcGlsZXIgc3VwcG9ydGluZyB0aGUgcHJlZmVycmVkIHN5bnRheDwvZW1waGFzaXM+PC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT5NaWNyb3NvZnQgVmlzdWFsIEMrKyA2LjAsIDcuMDwvc2ltcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+Qm9ybGFuZCBDKysgNS41LjE8L3NpbXBhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPlN1biBXb3JrU2hvcCA2IHVwZGF0ZSAyIEMrKyA1LjM8L3NpbXBhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPk1ldHJvd2Vya3MgQ29kZVdhcnJpb3IgOC4xPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICA8L2VudHJ5PgorICAgICAgICA8L3Jvdz4KKyAgICAgIDwvdGJvZHk+CisgICAgPC90Z3JvdXA+CisgIDwvaW5mb3JtYWx0YWJsZT4KKworPC9wYXJhPgorCis8cGFyYT4gSWYgeW91ciBjb21waWxlciBkb2VzIG5vdCBhcHBlYXIgaW4gdGhpcyBsaXN0LCBwbGVhc2UgdHJ5IHRoZSBwcmVmZXJyZWQgc3ludGF4IGFuZCByZXBvcnQgeW91ciByZXN1bHRzIHRvIHRoZSBCb29zdCBsaXN0IHNvIHRoYXQgd2UgY2FuIGtlZXAgdGhpcyB0YWJsZSB1cC10by1kYXRlLjwvcGFyYT4KKworPHVzaW5nLWNsYXNzIG5hbWU9ImJvb3N0OjpmdW5jdGlvbiIvPgorCis8c2VjdGlvbj4KKzx0aXRsZT5CYXNpYyBVc2FnZTwvdGl0bGU+IDxwYXJhPiBBIGZ1bmN0aW9uIHdyYXBwZXIgaXMgZGVmaW5lZCBzaW1wbHkKK2J5IGluc3RhbnRpYXRpbmcgdGhlIDxjb21wdXRlcm91dHB1dD5mdW5jdGlvbjwvY29tcHV0ZXJvdXRwdXQ+IGNsYXNzCit0ZW1wbGF0ZSB3aXRoIHRoZSBkZXNpcmVkIHJldHVybiB0eXBlIGFuZCBhcmd1bWVudCB0eXBlcywgZm9ybXVsYXRlZAorYXMgYSBDKysgZnVuY3Rpb24gdHlwZS4gQW55IG51bWJlciBvZiBhcmd1bWVudHMgbWF5IGJlIHN1cHBsaWVkLCB1cCB0bworc29tZSBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGxpbWl0ICgxMCBpcyB0aGUgZGVmYXVsdCBtYXhpbXVtKS4gVGhlCitmb2xsb3dpbmcgZGVjbGFyZXMgYSBmdW5jdGlvbiBvYmplY3Qgd3JhcHBlcgorPGNvbXB1dGVyb3V0cHV0PmY8L2NvbXB1dGVyb3V0cHV0PiB0aGF0IHRha2VzIHR3bworPGNvbXB1dGVyb3V0cHV0PmludDwvY29tcHV0ZXJvdXRwdXQ+IHBhcmFtZXRlcnMgYW5kIHJldHVybnMgYQorPGNvbXB1dGVyb3V0cHV0PmZsb2F0PC9jb21wdXRlcm91dHB1dD46CisKKyAgPGluZm9ybWFsdGFibGU+CisgICAgPHRncm91cCBjb2xzPSIyIiBhbGlnbj0ibGVmdCI+CisgICAgICA8dGhlYWQ+CisgICAgICAgIDxyb3c+CisgICAgICAgICAgPGVudHJ5PlByZWZlcnJlZCBzeW50YXg8L2VudHJ5PgorICAgICAgICAgIDxlbnRyeT5Qb3J0YWJsZSBzeW50YXg8L2VudHJ5PgorICAgICAgICA8L3Jvdz4KKyAgICAgIDwvdGhlYWQ+CisgICAgICA8dGJvZHk+CisgICAgICAgIDxyb3c+CisgICAgICAgICAgPGVudHJ5PgorPHByb2dyYW1saXN0aW5nIG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLmFyaXRoLmN4eDk4Ij48Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbjwvY2xhc3NuYW1lPiZsdDtmbG9hdCAoaW50IHgsIGludCB5KSZndDsgZjs8L3Byb2dyYW1saXN0aW5nPgorPC9lbnRyeT4KKzxlbnRyeT4KKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5hcml0aC5wb3J0YWJsZSI+PGNsYXNzbmFtZSBhbHQ9ImZ1bmN0aW9uTiI+Ym9vc3Q6OmZ1bmN0aW9uMjwvY2xhc3NuYW1lPiZsdDtmbG9hdCwgaW50LCBpbnQmZ3Q7IGY7PC9wcm9ncmFtbGlzdGluZz4KKzwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgIDwvdGJvZHk+CisgICAgICA8L3Rncm91cD4KKyAgICA8L2luZm9ybWFsdGFibGU+Cis8L3BhcmE+CisKKzxwYXJhPiBCeSBkZWZhdWx0LCBmdW5jdGlvbiBvYmplY3Qgd3JhcHBlcnMgYXJlIGVtcHR5LCBzbyB3ZSBjYW4gY3JlYXRlIGEgCitmdW5jdGlvbiBvYmplY3QgdG8gYXNzaWduIHRvIDxjb21wdXRlcm91dHB1dD5mPC9jb21wdXRlcm91dHB1dD46CisKKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5pbnRfZGl2Ij5zdHJ1Y3QgaW50X2RpdiB7IAorICBmbG9hdCBvcGVyYXRvcigpKGludCB4LCBpbnQgeSkgY29uc3QgeyByZXR1cm4gKChmbG9hdCl4KS95OyB9OyAKK307PC9wcm9ncmFtbGlzdGluZz4KKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC51c2VfaW50X2RpdiI+ZiA9IGludF9kaXYoKTs8L3Byb2dyYW1saXN0aW5nPgorPC9wYXJhPgorCis8cGFyYT4gTm93IHdlIGNhbiB1c2UgPGNvbXB1dGVyb3V0cHV0PmY8L2NvbXB1dGVyb3V0cHV0PiB0byBleGVjdXRlCit0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QKKzxjb21wdXRlcm91dHB1dD5pbnRfZGl2PC9jb21wdXRlcm91dHB1dD46CisKKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5jYWxsX2ludF9kaXYiPnN0ZDo6Y291dCAmbHQ7Jmx0OyBmKDUsIDMpICZsdDsmbHQ7IHN0ZDo6ZW5kbDs8L3Byb2dyYW1saXN0aW5nPgorPC9wYXJhPgorCis8cGFyYT4gV2UgYXJlIGZyZWUgdG8gYXNzaWduIGFueSBjb21wYXRpYmxlIGZ1bmN0aW9uIG9iamVjdCB0bworPGNvbXB1dGVyb3V0cHV0PmY8L2NvbXB1dGVyb3V0cHV0Pi4gSWYKKzxjb21wdXRlcm91dHB1dD5pbnRfZGl2PC9jb21wdXRlcm91dHB1dD4gaGFkIGJlZW4gZGVjbGFyZWQgdG8gdGFrZSB0d28KKzxjb21wdXRlcm91dHB1dD5sb25nPC9jb21wdXRlcm91dHB1dD4gb3BlcmFuZHMsIHRoZSBpbXBsaWNpdAorY29udmVyc2lvbnMgd291bGQgaGF2ZSBiZWVuIGFwcGxpZWQgdG8gdGhlIGFyZ3VtZW50cyB3aXRob3V0IGFueSB1c2VyCitpbnRlcmZlcmVuY2UuIFRoZSBvbmx5IGxpbWl0IG9uIHRoZSB0eXBlcyBvZiBhcmd1bWVudHMgaXMgdGhhdCB0aGV5IGJlCitDb3B5Q29uc3RydWN0aWJsZSwgc28gd2UgY2FuIGV2ZW4gdXNlIHJlZmVyZW5jZXMgYW5kIGFycmF5czoKKworICA8aW5mb3JtYWx0YWJsZT4KKyAgICA8dGdyb3VwIGNvbHM9IjEiIGFsaWduPSJsZWZ0Ij4KKyAgICAgIDx0aGVhZD48cm93PjxlbnRyeT5QcmVmZXJyZWQgc3ludGF4PC9lbnRyeT48L3Jvdz48L3RoZWFkPgorICAgICAgPHRib2R5PgorICAgICAgICA8cm93PgorICAgICAgICAgIDxlbnRyeT4KKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5zdW1fYXZnX2RlY2wuY3h4OTgiPjxjbGFzc25hbWU+Ym9vc3Q6OmZ1bmN0aW9uPC9jbGFzc25hbWU+Jmx0O3ZvaWQgKGludCB2YWx1ZXNbXSwgaW50IG4sIGludCZhbXA7IHN1bSwgZmxvYXQmYW1wOyBhdmcpJmd0OyBzdW1fYXZnOzwvcHJvZ3JhbWxpc3Rpbmc+Cis8L2VudHJ5PgorICAgICAgICA8L3Jvdz4KKyAgICAgIDwvdGJvZHk+CisgICAgPC90Z3JvdXA+IAorICA8L2luZm9ybWFsdGFibGU+CisgIDxpbmZvcm1hbHRhYmxlPgorICAgIDx0Z3JvdXAgY29scz0iMSIgYWxpZ249ImxlZnQiPgorICAgICAgPHRoZWFkPjxyb3c+PGVudHJ5PlBvcnRhYmxlIHN5bnRheDwvZW50cnk+PC9yb3c+PC90aGVhZD4KKyAgICAgIDx0Ym9keT4KKyAgICAgICAgPHJvdz4KKzxlbnRyeT4KKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5zdW1fYXZnX2RlY2wucG9ydGFibGUiPjxjbGFzc25hbWUgYWx0PSJmdW5jdGlvbk4iPmJvb3N0OjpmdW5jdGlvbjQ8L2NsYXNzbmFtZT4mbHQ7dm9pZCwgaW50KiwgaW50LCBpbnQmYW1wOywgZmxvYXQmYW1wOyZndDsgc3VtX2F2Zzs8L3Byb2dyYW1saXN0aW5nPgorPC9lbnRyeT4KKyAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgPC90Ym9keT4KKyAgICAgIDwvdGdyb3VwPgorICAgIDwvaW5mb3JtYWx0YWJsZT4KKworPHByb2dyYW1saXN0aW5nIG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLnN1bV9hdmciPnZvaWQgZG9fc3VtX2F2ZyhpbnQgdmFsdWVzW10sIGludCBuLCBpbnQmYW1wOyBzdW0sIGZsb2F0JmFtcDsgYXZnKQoreworICBzdW0gPSAwOworICBmb3IgKGludCBpID0gMDsgaSAmbHQ7IG47IGkrKykKKyAgICBzdW0gKz0gdmFsdWVzW2ldOworICBhdmcgPSAoZmxvYXQpc3VtIC8gbjsKK308L3Byb2dyYW1saXN0aW5nPgorCisKKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC51c2Vfc3VtX2F2ZyI+c3VtX2F2ZyA9ICZhbXA7ZG9fc3VtX2F2Zzs8L3Byb2dyYW1saXN0aW5nPgorPC9wYXJhPgorCis8cGFyYT4gSW52b2tpbmcgYSBmdW5jdGlvbiBvYmplY3Qgd3JhcHBlciB0aGF0IGRvZXMgbm90IGFjdHVhbGx5Citjb250YWluIGEgZnVuY3Rpb24gb2JqZWN0IGlzIGEgcHJlY29uZGl0aW9uIHZpb2xhdGlvbiwgbXVjaCBsaWtlCit0cnlpbmcgdG8gY2FsbCB0aHJvdWdoIGEgbnVsbCBmdW5jdGlvbiBwb2ludGVyLCBhbmQgd2lsbCB0aHJvdyBhIDxjbGFzc25hbWU+YmFkX2Z1bmN0aW9uX2NhbGw8L2NsYXNzbmFtZT4gZXhjZXB0aW9uKS4gV2UgY2FuIGNoZWNrIGZvciBhbgorZW1wdHkgZnVuY3Rpb24gb2JqZWN0IHdyYXBwZXIgYnkgdXNpbmcgaXQgaW4gYSBib29sZWFuIGNvbnRleHQgKGl0IGV2YWx1YXRlcyA8Y29tcHV0ZXJvdXRwdXQ+dHJ1ZTwvY29tcHV0ZXJvdXRwdXQ+IGlmIHRoZSB3cmFwcGVyIGlzIG5vdCBlbXB0eSkgb3IgY29tcGFyZSBpdCBhZ2FpbnN0IDxjb21wdXRlcm91dHB1dD4wPC9jb21wdXRlcm91dHB1dD4uIEZvciBpbnN0YW5jZToKKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5jaGVja19lbXB0eSI+aWYgKGYpCisgIHN0ZDo6Y291dCAmbHQ7Jmx0OyBmKDUsIDMpICZsdDsmbHQ7IHN0ZDo6ZW5kbDsKK2Vsc2UKKyAgc3RkOjpjb3V0ICZsdDsmbHQ7ICJmIGhhcyBubyB0YXJnZXQsIHNvIGl0IGlzIHVuc2FmZSB0byBjYWxsIiAmbHQ7Jmx0OyBzdGQ6OmVuZGw7PC9wcm9ncmFtbGlzdGluZz4KKzwvcGFyYT4KKworPHBhcmE+IEFsdGVybmF0aXZlbHksCis8Y29tcHV0ZXJvdXRwdXQ+PG1ldGhvZG5hbWU+ZW1wdHk8L21ldGhvZG5hbWU+KCk8L2NvbXB1dGVyb3V0cHV0PgorbWV0aG9kIHdpbGwgcmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSB3cmFwcGVyIGlzIGVtcHR5LiAgPC9wYXJhPgorCis8cGFyYT4gRmluYWxseSwgd2UgY2FuIGNsZWFyIG91dCBhIGZ1bmN0aW9uIHRhcmdldCBieSBhc3NpZ25pbmcgaXQgdG8gPGNvbXB1dGVyb3V0cHV0PjA8L2NvbXB1dGVyb3V0cHV0PiBvciBieSBjYWxsaW5nIHRoZSA8Y29tcHV0ZXJvdXRwdXQ+PG1ldGhvZG5hbWU+Y2xlYXI8L21ldGhvZG5hbWU+KCk8L2NvbXB1dGVyb3V0cHV0PiBtZW1iZXIgZnVuY3Rpb24sIGUuZy4sIAorPHByb2dyYW1saXN0aW5nIG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLmNsZWFyIj5mID0gMDs8L3Byb2dyYW1saXN0aW5nPgorPC9wYXJhPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uPgorICA8dGl0bGU+RnJlZSBmdW5jdGlvbnM8L3RpdGxlPgorPHBhcmE+IEZyZWUgZnVuY3Rpb24gcG9pbnRlcnMgY2FuIGJlIGNvbnNpZGVyZWQgc2luZ2xldG9uIGZ1bmN0aW9uIG9iamVjdHMgd2l0aCBjb25zdCBmdW5jdGlvbiBjYWxsIG9wZXJhdG9ycywgYW5kIGNhbiB0aGVyZWZvcmUgYmUgZGlyZWN0bHkgdXNlZCB3aXRoIHRoZSBmdW5jdGlvbiBvYmplY3Qgd3JhcHBlcnM6IAorPHByb2dyYW1saXN0aW5nIG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLm11bF9pbnRzIj5mbG9hdCBtdWxfaW50cyhpbnQgeCwgaW50IHkpIHsgcmV0dXJuICgoZmxvYXQpeCkgKiB5OyB9PC9wcm9ncmFtbGlzdGluZz4KKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC51c2VfbXVsX2ludHMiPmYgPSAmYW1wO211bF9pbnRzOzwvcHJvZ3JhbWxpc3Rpbmc+Cis8L3BhcmE+CisKKzxwYXJhPiBOb3RlIHRoYXQgdGhlIDxjb21wdXRlcm91dHB1dD4mYW1wOzwvY29tcHV0ZXJvdXRwdXQ+IGlzbid0IHJlYWxseSBuZWNlc3NhcnkgdW5sZXNzIHlvdSBoYXBwZW4gdG8gYmUgdXNpbmcgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbiA2LiA8L3BhcmE+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uPgorICA8dGl0bGU+TWVtYmVyIGZ1bmN0aW9uczwvdGl0bGU+CisKKzxwYXJhPiBJbiBtYW55IHN5c3RlbXMsIGNhbGxiYWNrcyBvZnRlbiBjYWxsIHRvIG1lbWJlciBmdW5jdGlvbnMgb2YgYQorcGFydGljdWxhciBvYmplY3QuIFRoaXMgaXMgb2Z0ZW4gcmVmZXJyZWQgdG8gYXMgImFyZ3VtZW50IGJpbmRpbmciLAorYW5kIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgQm9vc3QuRnVuY3Rpb24uIFRoZSB1c2Ugb2YgbWVtYmVyIGZ1bmN0aW9ucworZGlyZWN0bHksIGhvd2V2ZXIsIGlzIHN1cHBvcnRlZCwgc28gdGhlIGZvbGxvd2luZyBjb2RlIGlzIHZhbGlkOgorCis8cHJvZ3JhbWxpc3RpbmcgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwuWCI+c3RydWN0IFggeworICBpbnQgZm9vKGludCk7Cit9OzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgPGluZm9ybWFsdGFibGU+CisgICAgPHRncm91cCBjb2xzPSIyIiBhbGlnbj0ibGVmdCI+CisgICAgICA8dGhlYWQ+CisgICAgICAgIDxyb3c+CisgICAgICAgICAgPGVudHJ5PlByZWZlcnJlZCBzeW50YXg8L2VudHJ5PgorICAgICAgICAgIDxlbnRyeT5Qb3J0YWJsZSBzeW50YXg8L2VudHJ5PgorICAgICAgICA8L3Jvdz4KKyAgICAgIDwvdGhlYWQ+CisgICAgICA8dGJvZHk+CisgICAgICAgIDxyb3c+CisgICAgICAgICAgPGVudHJ5PgorPHByb2dyYW1saXN0aW5nIG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLm1lbV9mdW4uY3h4OTgiPjxjbGFzc25hbWU+Ym9vc3Q6OmZ1bmN0aW9uPC9jbGFzc25hbWU+Jmx0O2ludCAoWCosIGludCkmZ3Q7IGY7CisKK2YgPSAmYW1wO1g6OmZvbzsKKyAgCitYIHg7CitmKCZhbXA7eCwgNSk7PC9wcm9ncmFtbGlzdGluZz4KKzwvZW50cnk+Cis8ZW50cnk+Cis8cHJvZ3JhbWxpc3RpbmcgbmFtZT0iZnVuY3Rpb24udHV0b3JpYWwubWVtX2Z1bi5wb3J0YWJsZSI+PGNsYXNzbmFtZSBhbHQ9ImZ1bmN0aW9uTiI+Ym9vc3Q6OmZ1bmN0aW9uMjwvY2xhc3NuYW1lPiZsdDtpbnQsIFgqLCBpbnQmZ3Q7IGY7CisKK2YgPSAmYW1wO1g6OmZvbzsKKyAgCitYIHg7CitmKCZhbXA7eCwgNSk7PC9wcm9ncmFtbGlzdGluZz4KKzwvZW50cnk+Cis8L3Jvdz4KKzwvdGJvZHk+Cis8L3Rncm91cD4KKzwvaW5mb3JtYWx0YWJsZT4KKzwvcGFyYT4KKworPHBhcmE+IFNldmVyYWwgbGlicmFyaWVzIGV4aXN0IHRoYXQgc3VwcG9ydCBhcmd1bWVudCBiaW5kaW5nLiBUaHJlZSBzdWNoIGxpYnJhcmllcyBhcmUgc3VtbWFyaXplZCBiZWxvdzoKKzxpdGVtaXplZGxpc3Q+CisgIDxsaXN0aXRlbT4gPHBhcmE+PGxpYnJhcnluYW1lPkJpbmQ8L2xpYnJhcnluYW1lPi4gVGhpcyBsaWJyYXJ5IGFsbG93cyBiaW5kaW5nIG9mCisgIGFyZ3VtZW50cyBmb3IgYW55IGZ1bmN0aW9uIG9iamVjdC4gSXQgaXMgbGlnaHR3ZWlnaHQgYW5kIHZlcnkKKyAgcG9ydGFibGUuPC9wYXJhPjwvbGlzdGl0ZW0+CisKKyAgPGxpc3RpdGVtPiA8cGFyYT5UaGUgQysrIFN0YW5kYXJkIGxpYnJhcnkuIFVzaW5nCisgIDxjb21wdXRlcm91dHB1dD5zdGQ6OmJpbmQxc3Q8L2NvbXB1dGVyb3V0cHV0PiBhbmQKKyAgPGNvbXB1dGVyb3V0cHV0PnN0ZDo6bWVtX2Z1bjwvY29tcHV0ZXJvdXRwdXQ+IHRvZ2V0aGVyIG9uZSBjYW4gYmluZAorICB0aGUgb2JqZWN0IG9mIGEgcG9pbnRlci10by1tZW1iZXIgZnVuY3Rpb24gZm9yIHVzZSB3aXRoCisgIEJvb3N0LkZ1bmN0aW9uOgorCisgIDxpbmZvcm1hbHRhYmxlPgorICAgIDx0Z3JvdXAgY29scz0iMiIgYWxpZ249ImxlZnQiPgorICAgICAgPHRoZWFkPgorICAgICAgICA8cm93PgorICAgICAgICAgIDxlbnRyeT5QcmVmZXJyZWQgc3ludGF4PC9lbnRyeT4KKyAgICAgICAgICA8ZW50cnk+UG9ydGFibGUgc3ludGF4PC9lbnRyeT4KKyAgICAgICAgPC9yb3c+CisgICAgICA8L3RoZWFkPgorICAgICAgPHRib2R5PgorICAgICAgICA8cm93PgorICAgICAgICAgIDxlbnRyeT4KKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5zdGRfYmluZC5jeHg5OCI+ICA8Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbjwvY2xhc3NuYW1lPiZsdDtpbnQgKGludCkmZ3Q7IGY7CitYIHg7CitmID0gc3RkOjpiaW5kMXN0KAorICAgICAgc3RkOjptZW1fZnVuKCZhbXA7WDo6Zm9vKSwgJmFtcDt4KTsKK2YoNSk7IC8vIENhbGwgeC5mb28oNSk8L3Byb2dyYW1saXN0aW5nPgorPC9lbnRyeT4KKzxlbnRyeT4KKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5zdGRfYmluZC5wb3J0YWJsZSI+ICA8Y2xhc3NuYW1lIGFsdD0iZnVuY3Rpb25OIj5ib29zdDo6ZnVuY3Rpb24xPC9jbGFzc25hbWU+Jmx0O2ludCwgaW50Jmd0OyBmOworWCB4OworZiA9IHN0ZDo6YmluZDFzdCgKKyAgICAgIHN0ZDo6bWVtX2Z1bigmYW1wO1g6OmZvbyksICZhbXA7eCk7CitmKDUpOyAvLyBDYWxsIHguZm9vKDUpPC9wcm9ncmFtbGlzdGluZz4KKzwvZW50cnk+CisgICAgICAgICAgPC9yb3c+CisgICAgICAgIDwvdGJvZHk+CisgICAgICA8L3Rncm91cD4KKyAgICA8L2luZm9ybWFsdGFibGU+Cis8L3BhcmE+Cis8L2xpc3RpdGVtPgorCisgIDxsaXN0aXRlbT48cGFyYT5UaGUgPGxpYnJhcnluYW1lPkxhbWJkYTwvbGlicmFyeW5hbWU+IGxpYnJhcnkuIFRoaXMgbGlicmFyeSBwcm92aWRlcyBhIHBvd2VyZnVsIGNvbXBvc2l0aW9uIG1lY2hhbmlzbSB0byBjb25zdHJ1Y3QgZnVuY3Rpb24gb2JqZWN0cyB0aGF0IHVzZXMgdmVyeSBuYXR1cmFsIEMrKyBzeW50YXguIExhbWJkYSByZXF1aXJlcyBhIGNvbXBpbGVyIHRoYXQgaXMgcmVhc29uYWJseSBjb25mb3JtYW50IHRvIHRoZSBDKysgc3RhbmRhcmQuIDwvcGFyYT48L2xpc3RpdGVtPgorPC9pdGVtaXplZGxpc3Q+Cis8L3BhcmE+CisKKzwvc2VjdGlvbj4KKworPHNlY3Rpb24+CisgIDx0aXRsZT5SZWZlcmVuY2VzIHRvIEZ1bmN0aW9uIE9iamVjdHM8L3RpdGxlPiA8cGFyYT4gSW4gc29tZSBjYXNlcyBpdCBpcworICBleHBlbnNpdmUgKG9yIHNlbWFudGljYWxseSBpbmNvcnJlY3QpIHRvIGhhdmUgQm9vc3QuRnVuY3Rpb24gY2xvbmUgYQorICBmdW5jdGlvbiBvYmplY3QuIEluIHN1Y2ggY2FzZXMsIGl0IGlzIHBvc3NpYmxlIHRvIHJlcXVlc3QgdGhhdAorICBCb29zdC5GdW5jdGlvbiBrZWVwIG9ubHkgYSByZWZlcmVuY2UgdG8gdGhlIGFjdHVhbCBmdW5jdGlvbgorICBvYmplY3QuIFRoaXMgaXMgZG9uZSB1c2luZyB0aGUgPGNvbXB1dGVyb3V0cHV0PnJlZjwvY29tcHV0ZXJvdXRwdXQ+CisgIGFuZCA8Y29tcHV0ZXJvdXRwdXQ+Y3JlZjwvY29tcHV0ZXJvdXRwdXQ+IGZ1bmN0aW9ucyB0byB3cmFwIGEKKyAgcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24gb2JqZWN0OgorCisgIDxpbmZvcm1hbHRhYmxlPgorICAgIDx0Z3JvdXAgY29scz0iMiIgYWxpZ249ImxlZnQiPgorICAgICAgPHRoZWFkPgorICAgICAgICA8cm93PgorICAgICAgICAgIDxlbnRyeT5QcmVmZXJyZWQgc3ludGF4PC9lbnRyeT4KKyAgICAgICAgICA8ZW50cnk+UG9ydGFibGUgc3ludGF4PC9lbnRyeT4KKyAgICAgICAgPC9yb3c+CisgICAgICA8L3RoZWFkPgorICAgICAgPHRib2R5PgorICAgICAgICA8cm93PgorICAgICAgICAgIDxlbnRyeT4KKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5yZWYuY3h4OTgiPnN0YXRlZnVsX3R5cGUgYV9mdW5jdGlvbl9vYmplY3Q7Cis8Y2xhc3NuYW1lPmJvb3N0OjpmdW5jdGlvbjwvY2xhc3NuYW1lPiZsdDtpbnQgKGludCkmZ3Q7IGY7CitmID0gPGZ1bmN0aW9ubmFtZT5ib29zdDo6cmVmPC9mdW5jdGlvbm5hbWU+KGFfZnVuY3Rpb25fb2JqZWN0KTsKKworPGNsYXNzbmFtZT5ib29zdDo6ZnVuY3Rpb248L2NsYXNzbmFtZT4mbHQ7aW50IChpbnQpJmd0OyBmMihmKTs8L3Byb2dyYW1saXN0aW5nPgorPC9lbnRyeT4KKzxlbnRyeT4KKzxwcm9ncmFtbGlzdGluZyBuYW1lPSJmdW5jdGlvbi50dXRvcmlhbC5yZWYucG9ydGFibGUiPnN0YXRlZnVsX3R5cGUgYV9mdW5jdGlvbl9vYmplY3Q7Cis8Y2xhc3NuYW1lIGFsdD0iZnVuY3Rpb25OIj5ib29zdDo6ZnVuY3Rpb24xPC9jbGFzc25hbWU+Jmx0O2ludCwgaW50Jmd0OyBmOworZiA9IDxmdW5jdGlvbm5hbWU+Ym9vc3Q6OnJlZjwvZnVuY3Rpb25uYW1lPihhX2Z1bmN0aW9uX29iamVjdCk7CisKKzxjbGFzc25hbWUgYWx0PSJmdW5jdGlvbk4iPmJvb3N0OjpmdW5jdGlvbjE8L2NsYXNzbmFtZT4mbHQ7aW50LCBpbnQmZ3Q7IGYyKGYpOzwvcHJvZ3JhbWxpc3Rpbmc+Cis8L2VudHJ5PgorICAgICAgICAgIDwvcm93PgorICAgICAgICA8L3Rib2R5PgorICAgICAgPC90Z3JvdXA+CisgICAgPC9pbmZvcm1hbHRhYmxlPgorPC9wYXJhPgorCis8cGFyYT4gSGVyZSwgPGNvbXB1dGVyb3V0cHV0PmY8L2NvbXB1dGVyb3V0cHV0PiB3aWxsIG5vdCBtYWtlIGEgY29weQorb2YgPGNvbXB1dGVyb3V0cHV0PmFfZnVuY3Rpb25fb2JqZWN0PC9jb21wdXRlcm91dHB1dD4sIG5vciB3aWxsCis8Y29tcHV0ZXJvdXRwdXQ+ZjI8L2NvbXB1dGVyb3V0cHV0PiB3aGVuIGl0IGlzIHRhcmdldGVkIHRvCis8Y29tcHV0ZXJvdXRwdXQ+ZjwvY29tcHV0ZXJvdXRwdXQ+J3MgcmVmZXJlbmNlIHRvCis8Y29tcHV0ZXJvdXRwdXQ+YV9mdW5jdGlvbl9vYmplY3Q8L2NvbXB1dGVyb3V0cHV0Pi4gQWRkaXRpb25hbGx5LCB3aGVuCit1c2luZyByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uIG9iamVjdHMsIEJvb3N0LkZ1bmN0aW9uIHdpbGwgbm90IHRocm93CitleGNlcHRpb25zIGR1cmluZyBhc3NpZ25tZW50IG9yIGNvbnN0cnVjdGlvbi4KKzwvcGFyYT4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24+CisgIDx0aXRsZT5Db21wYXJpbmcgQm9vc3QuRnVuY3Rpb24gZnVuY3Rpb24gb2JqZWN0czwvdGl0bGU+CisKKyAgPHBhcmE+RnVuY3Rpb24gb2JqZWN0IHdyYXBwZXJzIGNhbiBiZSBjb21wYXJlZCB2aWEgPGNvZGU+PT08L2NvZGU+CisgIG9yIDxjb2RlPiE9PC9jb2RlPiBhZ2FpbnN0IGFueSBmdW5jdGlvbiBvYmplY3QgdGhhdCBjYW4gYmUgc3RvcmVkCisgIHdpdGhpbiB0aGUgd3JhcHBlci4gSWYgdGhlIGZ1bmN0aW9uIG9iamVjdCB3cmFwcGVyIGNvbnRhaW5zIGEKKyAgZnVuY3Rpb24gb2JqZWN0IG9mIHRoYXQgdHlwZSwgaXQgd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0IHRoZSBnaXZlbgorICBmdW5jdGlvbiBvYmplY3QgKHdoaWNoIG11c3QgYmUgZWl0aGVyIGJlCisgIDxjb25jZXB0bmFtZT5FcXVhbGl0eUNvbXBhcmFibGU8L2NvbmNlcHRuYW1lPiBvciBoYXZlIGFuIG92ZXJsb2FkZWQgPGZ1bmN0aW9ubmFtZT5ib29zdDo6ZnVuY3Rpb25fZXF1YWw8L2Z1bmN0aW9ubmFtZT4pLiBGb3IgaW5zdGFuY2U6PC9wYXJhPgorICAKKyAgPHByb2dyYW1saXN0aW5nIG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLmNvbXBhcmUiPmludCBjb21wdXRlX3dpdGhfWChYKiwgaW50KTsKKworZiA9ICZhbXA7WDo6Zm9vOworYXNzZXJ0KGYgPT0gJmFtcDtYOjpmb28pOworYXNzZXJ0KCZhbXA7Y29tcHV0ZV93aXRoX1ggIT0gZik7PC9wcm9ncmFtbGlzdGluZz4KKworICAgPHBhcmE+V2hlbiBjb21wYXJpbmcgYWdhaW5zdCBhbiBpbnN0YW5jZSBvZgorICAgPGNvZGU+PGNsYXNzbmFtZT5yZWZlcmVuY2Vfd3JhcHBlcjwvY2xhc3NuYW1lPjwvY29kZT4sIHRoZSBhZGRyZXNzCisgICBvZiB0aGUgb2JqZWN0IGluIHRoZQorICAgPGNvZGU+PGNsYXNzbmFtZT5yZWZlcmVuY2Vfd3JhcHBlcjwvY2xhc3NuYW1lPjwvY29kZT4gaXMgY29tcGFyZWQKKyAgIGFnYWluc3QgdGhlIGFkZHJlc3Mgb2YgdGhlIG9iamVjdCBzdG9yZWQgYnkgdGhlIGZ1bmN0aW9uIG9iamVjdAorICAgd3JhcHBlcjo8L3BhcmE+CisKKyAgPHByb2dyYW1saXN0aW5nIG5hbWU9ImZ1bmN0aW9uLnR1dG9yaWFsLmNvbXBhcmUtcmVmIj5hX3N0YXRlZnVsX29iamVjdCBzbzEsIHNvMjsKK2YgPSA8ZnVuY3Rpb25uYW1lPmJvb3N0OjpyZWY8L2Z1bmN0aW9ubmFtZT4oc28xKTsKK2Fzc2VydChmID09IDxmdW5jdGlvbm5hbWU+Ym9vc3Q6OnJlZjwvZnVuY3Rpb25uYW1lPihzbzEpKTsKK2Fzc2VydChmID09IHNvMSk7IDxlbXBoYXNpcz4vLyBPbmx5IGlmIGFfc3RhdGVmdWxfb2JqZWN0IGlzIDxjb25jZXB0bmFtZT5FcXVhbGl0eUNvbXBhcmFibGU8L2NvbmNlcHRuYW1lPjwvZW1waGFzaXM+Cithc3NlcnQoZiAhPSA8ZnVuY3Rpb25uYW1lPmJvb3N0OjpyZWY8L2Z1bmN0aW9ubmFtZT4oc28yKSk7PC9wcm9ncmFtbGlzdGluZz4KKworPC9zZWN0aW9uPgorCis8L3NlY3Rpb24+CisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2V4YW1wbGUvSmFtZmlsZS52MiBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2V4YW1wbGUvSmFtZmlsZS52MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzcwNmMwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vZXhhbXBsZS9KYW1maWxlLnYyCkBAIC0wLDAgKzEsMjAgQEAKKyMgIEJvb3N0LkZ1bmN0aW9uIExpYnJhcnkgZXhhbXBsZSBKYW1maWxlCisjCisjICBDb3B5cmlnaHQgKGMpIDIwMDggSmFtZXMgRS4gS2luZyBJSUkKKyMKKyMgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnktCisjICBpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKK2ltcG9ydCBvcyA7CitpbXBvcnQgdGVzdGluZyA7CisKK3Byb2plY3QKKyAgICA6ICAgcmVxdWlyZW1lbnRzCisgICAgOworCit0ZXN0LXN1aXRlICJmdW5jdGlvbi1leGFtcGxlcyIKKyAgIDogICAgWyBydW4gYmluZDFzdC5jcHAgXQorICAgICAgICBbIHJ1biBpbnRfZGl2LmNwcCBdCisgICAgICAgIFsgcnVuIHN1bV9hdmcuY3BwIF0KKyAgIDsKKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vZXhhbXBsZS9iaW5kMXN0LmNwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2V4YW1wbGUvYmluZDFzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk2MjJjNwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2V4YW1wbGUvYmluZDFzdC5jcHAKQEAgLTAsMCArMSwzMiBAQAorLy8gQm9vc3QuRnVuY3Rpb24gbGlicmFyeSBleGFtcGxlcworCisvLyAgQ29weXJpZ2h0IERvdWdsYXMgR3JlZ29yIDIwMDEtMjAwMy4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCitzdHJ1Y3QgWCB7CisgIFgoaW50IHZhbCkgOiB2YWx1ZSh2YWwpIHt9CisKKyAgaW50IGZvbyhpbnQgeCkgeyByZXR1cm4geCAqIHZhbHVlOyB9CisKKyAgaW50IHZhbHVlOworfTsKKworCitpbnQKK21haW4oKQoreworICBib29zdDo6ZnVuY3Rpb248aW50IChpbnQpPiBmOworICBYIHgoNyk7CisgIGYgPSBzdGQ6OmJpbmQxc3Qoc3RkOjptZW1fZnVuKCZYOjpmb28pLCAmeCk7CisKKyAgc3RkOjpjb3V0IDw8IGYoNSkgPDwgc3RkOjplbmRsOyAvLyBDYWxsIHguZm9vKDUpCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vZXhhbXBsZS9pbnRfZGl2LmNwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2V4YW1wbGUvaW50X2Rpdi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxOGJkMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2V4YW1wbGUvaW50X2Rpdi5jcHAKQEAgLTAsMCArMSwyNiBAQAorLy8gQm9vc3QuRnVuY3Rpb24gbGlicmFyeSBleGFtcGxlcworCisvLyAgQ29weXJpZ2h0IERvdWdsYXMgR3JlZ29yIDIwMDEtMjAwMy4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKworc3RydWN0IGludF9kaXYgeworICBmbG9hdCBvcGVyYXRvcigpKGludCB4LCBpbnQgeSkgY29uc3QgeyByZXR1cm4gKChmbG9hdCl4KS95OyB9OworfTsKKworaW50CittYWluKCkKK3sKKyAgYm9vc3Q6OmZ1bmN0aW9uPGZsb2F0IChpbnQsIGludCk+IGY7CisgIGYgPSBpbnRfZGl2KCk7CisKKyAgc3RkOjpjb3V0IDw8IGYoNSwgMykgPDwgc3RkOjplbmRsOyAvLyAxLjY2NjY3CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9leGFtcGxlL3N1bV9hdmcuY3BwIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vZXhhbXBsZS9zdW1fYXZnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODMxZWYxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vZXhhbXBsZS9zdW1fYXZnLmNwcApAQCAtMCwwICsxLDM4IEBACisvLyBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5IGV4YW1wbGVzCisKKy8vICBDb3B5cmlnaHQgRG91Z2xhcyBHcmVnb3IgMjAwMS0yMDAzLiBVc2UsIG1vZGlmaWNhdGlvbiBhbmQKKy8vICBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbgorLy8gIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorCit2b2lkIGRvX3N1bV9hdmcoaW50IHZhbHVlc1tdLCBpbnQgbiwgaW50JiBzdW0sIGZsb2F0JiBhdmcpCit7CisgIHN1bSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHN1bSArPSB2YWx1ZXNbaV07CisgIGF2ZyA9IChmbG9hdClzdW0gLyBuOworfQorCitpbnQKK21haW4oKQoreworICAvLyBUaGUgc2Vjb25kIHBhcmFtZXRlciBzaG91bGQgYmUgaW50W10sIGJ1dCBzb21lIGNvbXBpbGVycyAoZS5nLiwgR0NDKQorICAvLyBjb21wbGFpbiBhYm91dCB0aGlzCisgIGJvb3N0OjpmdW5jdGlvbjx2b2lkIChpbnQqLCBpbnQsIGludCYsIGZsb2F0Jik+IHN1bV9hdmc7CisKKyAgc3VtX2F2ZyA9ICZkb19zdW1fYXZnOworCisgIGludCB2YWx1ZXNbNV0gPSB7IDEsIDEsIDIsIDMsIDUgfTsKKyAgaW50IHN1bTsKKyAgZmxvYXQgYXZnOworICBzdW1fYXZnKHZhbHVlcywgNSwgc3VtLCBhdmcpOworCisgIHN0ZDo6Y291dCA8PCAic3VtID0gIiA8PCBzdW0gPDwgc3RkOjplbmRsOworICBzdGQ6OmNvdXQgPDwgImF2ZyA9ICIgPDwgYXZnIDw8IHN0ZDo6ZW5kbDsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uLmhwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24uaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YTI1YWIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uLmhwcApAQCAtMCwwICsxLDc0IEBACisvLyBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5CisKKy8vICBDb3B5cmlnaHQgRG91Z2xhcyBHcmVnb3IgMjAwMS0yMDAzLiBVc2UsIG1vZGlmaWNhdGlvbiBhbmQKKy8vICBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbgorLy8gIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL2Z1bmN0aW9uCisKKy8vIFdpbGxpYW0gS2VtcGYsIEplc3NlIEpvbmVzIGFuZCBLYXJsIE5lbHNvbiB3ZXJlIGFsbCB2ZXJ5IGhlbHBmdWwgaW4gdGhlCisvLyBkZXNpZ24gb2YgdGhpcyBsaWJyYXJ5LgorCisjaWZuZGVmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTCisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1MgMTAKKyNlbmRpZiAvLyBCT09TVF9GVU5DVElPTl9NQVhfQVJHUworCisjaWYgIWRlZmluZWQoQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCkgfHwgKEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgIT0gQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1MpCisKKyNpZiAhZGVmaW5lZChCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEKQorI2RlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEIDAKKyNlbmRpZgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4gLy8gdW5hcnlfZnVuY3Rpb24sIGJpbmFyeV9mdW5jdGlvbgorCisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL2l0ZXJhdGUuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2RldGFpbC93b3JrYXJvdW5kLmhwcD4KKworLy8gSW5jbHVkZSB0aGUgcHJvbG9ndWUgaGVyZSBzbyB0aGF0IHRoZSB1c2Ugb2YgZmlsZS1sZXZlbCBpdGVyYXRpb24KKy8vIGluIGFueXRoaW5nIHRoYXQgbWF5IGJlIGluY2x1ZGVkIGJ5IGZ1bmN0aW9uX3RlbXBsYXRlLmhwcCBkb2Vzbid0IGJyZWFrCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZGV0YWlsL3Byb2xvZ3VlLmhwcD4KKworLy8gT2xkZXIgVmlzdWFsIEFnZSBDKysgdmVyc2lvbiBkbyBub3QgaGFuZGxlIHRoZSBmaWxlIGl0ZXJhdGlvbiB3ZWxsCisjaWYgQk9PU1RfV09SS0FST1VORChfX0lCTUNQUF9fLCA+PSA1MDApICYmIEJPT1NUX1dPUktBUk9VTkQoX19JQk1DUFBfXywgPCA4MDApCisjICBpZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHUyA+PSAwCisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uMC5ocHA+CisjICBlbmRpZgorIyAgaWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1MgPj0gMQorIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbjEuaHBwPgorIyAgZW5kaWYKKyMgIGlmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTID49IDIKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb24yLmhwcD4KKyMgIGVuZGlmCisjICBpZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHUyA+PSAzCisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uMy5ocHA+CisjICBlbmRpZgorIyAgaWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1MgPj0gNAorIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbjQuaHBwPgorIyAgZW5kaWYKKyMgIGlmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTID49IDUKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb241LmhwcD4KKyMgIGVuZGlmCisjICBpZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHUyA+PSA2CisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uNi5ocHA+CisjICBlbmRpZgorIyAgaWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1MgPj0gNworIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbjcuaHBwPgorIyAgZW5kaWYKKyMgIGlmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTID49IDgKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb244LmhwcD4KKyMgIGVuZGlmCisjICBpZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHUyA+PSA5CisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uOS5ocHA+CisjICBlbmRpZgorIyAgaWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1MgPj0gMTAKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb24xMC5ocHA+CisjICBlbmRpZgorI2Vsc2UKKy8vIFdoYXQgaXMgdGhlICczJyBmb3I/CisjICBkZWZpbmUgQk9PU1RfUFBfSVRFUkFUSU9OX1BBUkFNU18xICgzLCgwLEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTLDxib29zdC9mdW5jdGlvbi9kZXRhaWwvZnVuY3Rpb25faXRlcmF0ZS5ocHA+KSkKKyMgIGluY2x1ZGUgQk9PU1RfUFBfSVRFUkFURSgpCisjICB1bmRlZiBCT09TVF9QUF9JVEVSQVRJT05fUEFSQU1TXzEKKyNlbmRpZgorCisjZW5kaWYgLy8gIWRlZmluZWQoQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCkgfHwgKEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgIT0gQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1MpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uL2RldGFpbC9mdW5jdGlvbl9pdGVyYXRlLmhwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZGV0YWlsL2Z1bmN0aW9uX2l0ZXJhdGUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNzBiMzYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uL2RldGFpbC9mdW5jdGlvbl9pdGVyYXRlLmhwcApAQCAtMCwwICsxLDE2IEBACisvLyBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5CisKKy8vICBDb3B5cmlnaHQgRG91Z2xhcyBHcmVnb3IgMjAwMy4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKyNpZiAhZGVmaW5lZChCT09TVF9QUF9JU19JVEVSQVRJTkcpCisjIGVycm9yIEJvb3N0LkZ1bmN0aW9uIC0gZG8gbm90IGluY2x1ZGUgdGhpcyBmaWxlIQorI2VuZGlmCisKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgQk9PU1RfUFBfSVRFUkFUSU9OKCkKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9kZXRhaWwvbWF5YmVfaW5jbHVkZS5ocHA+CisjdW5kZWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MKKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9kZXRhaWwvZ2VuX21heWJlX2luY2x1ZGUucGwgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uL2RldGFpbC9nZW5fbWF5YmVfaW5jbHVkZS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQwOTg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9kZXRhaWwvZ2VuX21heWJlX2luY2x1ZGUucGwKQEAgLTAsMCArMSwzOSBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjCisjIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgRG91Z2xhcyBHcmVnb3IgKGdyZWdvZEBjcy5ycGkuZWR1KQorIworIyBQZXJtaXNzaW9uIHRvIGNvcHksIHVzZSwgc2VsbCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGlzIGdyYW50ZWQKKyMgcHJvdmlkZWQgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcy4KKyMgUGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGNvZGUgYW5kIHRvIGRpc3RyaWJ1dGUgbW9kaWZpZWQgY29kZSBpcyBncmFudGVkCisjIHByb3ZpZGVkIHRoaXMgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMsIGFuZCBhIG5vdGljZQorIyB0aGF0IHRoZSBjb2RlIHdhcyBtb2RpZmllZCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBjb3B5cmlnaHQgbm90aWNlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHksCisjIGFuZCB3aXRoIG5vIGNsYWltIGFzIHRvIGl0cyBzdWl0YWJpbGl0eSBmb3IgYW55IHB1cnBvc2UuCisjCisjIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKK3VzZSBFbmdsaXNoOworCiskbWF4X2FyZ3MgPSAkQVJHVlswXTsKKworb3BlbiAoT1VULCAiPm1heWJlX2luY2x1ZGUuaHBwIikgb3IgZGllKCJDYW5ub3Qgd3JpdGUgdG8gbWF5YmVfaW5jbHVkZS5ocHAiKTsKK2Zvcigkb25fYXJnID0gMDsgJG9uX2FyZyA8PSAkbWF4X2FyZ3M7ICsrJG9uX2FyZykgeworICAgIGlmICgkb25fYXJnID09IDApIHsKKwlwcmludCBPVVQgIiNpZiI7CisgICAgfQorICAgIGVsc2UgeworCXByaW50IE9VVCAiI2VsaWYiOworICAgIH0KKyAgICBwcmludCBPVVQgIiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSAkb25fYXJnXG4iOworICAgIHByaW50IE9VVCAiIyAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRFxuIjsKKyAgICBwcmludCBPVVQgIiMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEICRvbl9hcmdcbiI7CisgICAgcHJpbnQgT1VUICIjICBpZm5kZWYgQk9PU1RfRlVOQ1RJT05fJG9uX2FyZ1xuIjsKKyAgICBwcmludCBPVVQgIiMgICAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OXyRvbl9hcmdcbiI7CisgICAgcHJpbnQgT1VUICIjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcD5cbiI7CisgICAgcHJpbnQgT1VUICIjICBlbmRpZlxuIjsKK30KK3ByaW50IE9VVCAiI2Vsc2VcbiI7CitwcmludCBPVVQgIiMgIGVycm9yIENhbm5vdCBoYW5kbGUgQm9vc3QuRnVuY3Rpb24gb2JqZWN0cyB0aGF0IGFjY2VwdCBtb3JlIHRoYW4gJG1heF9hcmdzIGFyZ3VtZW50cyFcbiI7CitwcmludCBPVVQgIiNlbmRpZlxuIjsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZGV0YWlsL21heWJlX2luY2x1ZGUuaHBwIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9kZXRhaWwvbWF5YmVfaW5jbHVkZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4ODkwNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZGV0YWlsL21heWJlX2luY2x1ZGUuaHBwCkBAIC0wLDAgKzEsMzY5IEBACisvLyBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5CisKKy8vICBDb3B5cmlnaHQgRG91Z2xhcyBHcmVnb3IgMjAwMy4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKworI2lmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDAKKyMgIHVuZGVmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQKKyMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEIDAKKyMgIGlmbmRlZiBCT09TVF9GVU5DVElPTl8wCisjICAgIGRlZmluZSBCT09TVF9GVU5DVElPTl8wCisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcD4KKyMgIGVuZGlmCisjZWxpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSAxCisjICB1bmRlZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVECisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCAxCisjICBpZm5kZWYgQk9PU1RfRlVOQ1RJT05fMQorIyAgICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fMQorIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90ZW1wbGF0ZS5ocHA+CisjICBlbmRpZgorI2VsaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPT0gMgorIyAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRAorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgMgorIyAgaWZuZGVmIEJPT1NUX0ZVTkNUSU9OXzIKKyMgICAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OXzIKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdGVtcGxhdGUuaHBwPgorIyAgZW5kaWYKKyNlbGlmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDMKKyMgIHVuZGVmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQKKyMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEIDMKKyMgIGlmbmRlZiBCT09TVF9GVU5DVElPTl8zCisjICAgIGRlZmluZSBCT09TVF9GVU5DVElPTl8zCisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcD4KKyMgIGVuZGlmCisjZWxpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSA0CisjICB1bmRlZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVECisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCA0CisjICBpZm5kZWYgQk9PU1RfRlVOQ1RJT05fNAorIyAgICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fNAorIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90ZW1wbGF0ZS5ocHA+CisjICBlbmRpZgorI2VsaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPT0gNQorIyAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRAorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgNQorIyAgaWZuZGVmIEJPT1NUX0ZVTkNUSU9OXzUKKyMgICAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OXzUKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdGVtcGxhdGUuaHBwPgorIyAgZW5kaWYKKyNlbGlmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDYKKyMgIHVuZGVmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQKKyMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEIDYKKyMgIGlmbmRlZiBCT09TVF9GVU5DVElPTl82CisjICAgIGRlZmluZSBCT09TVF9GVU5DVElPTl82CisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcD4KKyMgIGVuZGlmCisjZWxpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSA3CisjICB1bmRlZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVECisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCA3CisjICBpZm5kZWYgQk9PU1RfRlVOQ1RJT05fNworIyAgICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fNworIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90ZW1wbGF0ZS5ocHA+CisjICBlbmRpZgorI2VsaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPT0gOAorIyAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRAorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgOAorIyAgaWZuZGVmIEJPT1NUX0ZVTkNUSU9OXzgKKyMgICAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OXzgKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdGVtcGxhdGUuaHBwPgorIyAgZW5kaWYKKyNlbGlmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDkKKyMgIHVuZGVmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQKKyMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEIDkKKyMgIGlmbmRlZiBCT09TVF9GVU5DVElPTl85CisjICAgIGRlZmluZSBCT09TVF9GVU5DVElPTl85CisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcD4KKyMgIGVuZGlmCisjZWxpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSAxMAorIyAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRAorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgMTAKKyMgIGlmbmRlZiBCT09TVF9GVU5DVElPTl8xMAorIyAgICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fMTAKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdGVtcGxhdGUuaHBwPgorIyAgZW5kaWYKKyNlbGlmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDExCisjICB1bmRlZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVECisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCAxMQorIyAgaWZuZGVmIEJPT1NUX0ZVTkNUSU9OXzExCisjICAgIGRlZmluZSBCT09TVF9GVU5DVElPTl8xMQorIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90ZW1wbGF0ZS5ocHA+CisjICBlbmRpZgorI2VsaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPT0gMTIKKyMgIHVuZGVmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQKKyMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEIDEyCisjICBpZm5kZWYgQk9PU1RfRlVOQ1RJT05fMTIKKyMgICAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OXzEyCisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcD4KKyMgIGVuZGlmCisjZWxpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSAxMworIyAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRAorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgMTMKKyMgIGlmbmRlZiBCT09TVF9GVU5DVElPTl8xMworIyAgICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fMTMKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdGVtcGxhdGUuaHBwPgorIyAgZW5kaWYKKyNlbGlmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDE0CisjICB1bmRlZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVECisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCAxNAorIyAgaWZuZGVmIEJPT1NUX0ZVTkNUSU9OXzE0CisjICAgIGRlZmluZSBCT09TVF9GVU5DVElPTl8xNAorIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90ZW1wbGF0ZS5ocHA+CisjICBlbmRpZgorI2VsaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPT0gMTUKKyMgIHVuZGVmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQKKyMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEIDE1CisjICBpZm5kZWYgQk9PU1RfRlVOQ1RJT05fMTUKKyMgICAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OXzE1CisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcD4KKyMgIGVuZGlmCisjZWxpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSAxNgorIyAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRAorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgMTYKKyMgIGlmbmRlZiBCT09TVF9GVU5DVElPTl8xNgorIyAgICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fMTYKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdGVtcGxhdGUuaHBwPgorIyAgZW5kaWYKKyNlbGlmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDE3CisjICB1bmRlZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVECisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCAxNworIyAgaWZuZGVmIEJPT1NUX0ZVTkNUSU9OXzE3CisjICAgIGRlZmluZSBCT09TVF9GVU5DVElPTl8xNworIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90ZW1wbGF0ZS5ocHA+CisjICBlbmRpZgorI2VsaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPT0gMTgKKyMgIHVuZGVmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQKKyMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEIDE4CisjICBpZm5kZWYgQk9PU1RfRlVOQ1RJT05fMTgKKyMgICAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OXzE4CisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcD4KKyMgIGVuZGlmCisjZWxpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSAxOQorIyAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRAorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgMTkKKyMgIGlmbmRlZiBCT09TVF9GVU5DVElPTl8xOQorIyAgICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fMTkKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdGVtcGxhdGUuaHBwPgorIyAgZW5kaWYKKyNlbGlmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDIwCisjICB1bmRlZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVECisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCAyMAorIyAgaWZuZGVmIEJPT1NUX0ZVTkNUSU9OXzIwCisjICAgIGRlZmluZSBCT09TVF9GVU5DVElPTl8yMAorIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90ZW1wbGF0ZS5ocHA+CisjICBlbmRpZgorI2VsaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPT0gMjEKKyMgIHVuZGVmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQKKyMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEIDIxCisjICBpZm5kZWYgQk9PU1RfRlVOQ1RJT05fMjEKKyMgICAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OXzIxCisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcD4KKyMgIGVuZGlmCisjZWxpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSAyMgorIyAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRAorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgMjIKKyMgIGlmbmRlZiBCT09TVF9GVU5DVElPTl8yMgorIyAgICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fMjIKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdGVtcGxhdGUuaHBwPgorIyAgZW5kaWYKKyNlbGlmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDIzCisjICB1bmRlZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVECisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCAyMworIyAgaWZuZGVmIEJPT1NUX0ZVTkNUSU9OXzIzCisjICAgIGRlZmluZSBCT09TVF9GVU5DVElPTl8yMworIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90ZW1wbGF0ZS5ocHA+CisjICBlbmRpZgorI2VsaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPT0gMjQKKyMgIHVuZGVmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQKKyMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEIDI0CisjICBpZm5kZWYgQk9PU1RfRlVOQ1RJT05fMjQKKyMgICAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OXzI0CisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcD4KKyMgIGVuZGlmCisjZWxpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSAyNQorIyAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRAorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgMjUKKyMgIGlmbmRlZiBCT09TVF9GVU5DVElPTl8yNQorIyAgICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fMjUKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdGVtcGxhdGUuaHBwPgorIyAgZW5kaWYKKyNlbGlmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDI2CisjICB1bmRlZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVECisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCAyNgorIyAgaWZuZGVmIEJPT1NUX0ZVTkNUSU9OXzI2CisjICAgIGRlZmluZSBCT09TVF9GVU5DVElPTl8yNgorIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90ZW1wbGF0ZS5ocHA+CisjICBlbmRpZgorI2VsaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPT0gMjcKKyMgIHVuZGVmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQKKyMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEIDI3CisjICBpZm5kZWYgQk9PU1RfRlVOQ1RJT05fMjcKKyMgICAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OXzI3CisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcD4KKyMgIGVuZGlmCisjZWxpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSAyOAorIyAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRAorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgMjgKKyMgIGlmbmRlZiBCT09TVF9GVU5DVElPTl8yOAorIyAgICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fMjgKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdGVtcGxhdGUuaHBwPgorIyAgZW5kaWYKKyNlbGlmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDI5CisjICB1bmRlZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVECisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCAyOQorIyAgaWZuZGVmIEJPT1NUX0ZVTkNUSU9OXzI5CisjICAgIGRlZmluZSBCT09TVF9GVU5DVElPTl8yOQorIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90ZW1wbGF0ZS5ocHA+CisjICBlbmRpZgorI2VsaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPT0gMzAKKyMgIHVuZGVmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQKKyMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEIDMwCisjICBpZm5kZWYgQk9PU1RfRlVOQ1RJT05fMzAKKyMgICAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OXzMwCisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcD4KKyMgIGVuZGlmCisjZWxpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSAzMQorIyAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRAorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgMzEKKyMgIGlmbmRlZiBCT09TVF9GVU5DVElPTl8zMQorIyAgICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fMzEKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdGVtcGxhdGUuaHBwPgorIyAgZW5kaWYKKyNlbGlmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDMyCisjICB1bmRlZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVECisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCAzMgorIyAgaWZuZGVmIEJPT1NUX0ZVTkNUSU9OXzMyCisjICAgIGRlZmluZSBCT09TVF9GVU5DVElPTl8zMgorIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90ZW1wbGF0ZS5ocHA+CisjICBlbmRpZgorI2VsaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPT0gMzMKKyMgIHVuZGVmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQKKyMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEIDMzCisjICBpZm5kZWYgQk9PU1RfRlVOQ1RJT05fMzMKKyMgICAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OXzMzCisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcD4KKyMgIGVuZGlmCisjZWxpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSAzNAorIyAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRAorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgMzQKKyMgIGlmbmRlZiBCT09TVF9GVU5DVElPTl8zNAorIyAgICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fMzQKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdGVtcGxhdGUuaHBwPgorIyAgZW5kaWYKKyNlbGlmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDM1CisjICB1bmRlZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVECisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCAzNQorIyAgaWZuZGVmIEJPT1NUX0ZVTkNUSU9OXzM1CisjICAgIGRlZmluZSBCT09TVF9GVU5DVElPTl8zNQorIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90ZW1wbGF0ZS5ocHA+CisjICBlbmRpZgorI2VsaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPT0gMzYKKyMgIHVuZGVmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQKKyMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEIDM2CisjICBpZm5kZWYgQk9PU1RfRlVOQ1RJT05fMzYKKyMgICAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OXzM2CisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcD4KKyMgIGVuZGlmCisjZWxpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSAzNworIyAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRAorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgMzcKKyMgIGlmbmRlZiBCT09TVF9GVU5DVElPTl8zNworIyAgICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fMzcKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdGVtcGxhdGUuaHBwPgorIyAgZW5kaWYKKyNlbGlmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDM4CisjICB1bmRlZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVECisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCAzOAorIyAgaWZuZGVmIEJPT1NUX0ZVTkNUSU9OXzM4CisjICAgIGRlZmluZSBCT09TVF9GVU5DVElPTl8zOAorIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90ZW1wbGF0ZS5ocHA+CisjICBlbmRpZgorI2VsaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPT0gMzkKKyMgIHVuZGVmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQKKyMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEIDM5CisjICBpZm5kZWYgQk9PU1RfRlVOQ1RJT05fMzkKKyMgICAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OXzM5CisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcD4KKyMgIGVuZGlmCisjZWxpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSA0MAorIyAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRAorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgNDAKKyMgIGlmbmRlZiBCT09TVF9GVU5DVElPTl80MAorIyAgICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fNDAKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdGVtcGxhdGUuaHBwPgorIyAgZW5kaWYKKyNlbGlmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDQxCisjICB1bmRlZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVECisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCA0MQorIyAgaWZuZGVmIEJPT1NUX0ZVTkNUSU9OXzQxCisjICAgIGRlZmluZSBCT09TVF9GVU5DVElPTl80MQorIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90ZW1wbGF0ZS5ocHA+CisjICBlbmRpZgorI2VsaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPT0gNDIKKyMgIHVuZGVmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQKKyMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEIDQyCisjICBpZm5kZWYgQk9PU1RfRlVOQ1RJT05fNDIKKyMgICAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OXzQyCisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcD4KKyMgIGVuZGlmCisjZWxpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSA0MworIyAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRAorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgNDMKKyMgIGlmbmRlZiBCT09TVF9GVU5DVElPTl80MworIyAgICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fNDMKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdGVtcGxhdGUuaHBwPgorIyAgZW5kaWYKKyNlbGlmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDQ0CisjICB1bmRlZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVECisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCA0NAorIyAgaWZuZGVmIEJPT1NUX0ZVTkNUSU9OXzQ0CisjICAgIGRlZmluZSBCT09TVF9GVU5DVElPTl80NAorIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90ZW1wbGF0ZS5ocHA+CisjICBlbmRpZgorI2VsaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPT0gNDUKKyMgIHVuZGVmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQKKyMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEIDQ1CisjICBpZm5kZWYgQk9PU1RfRlVOQ1RJT05fNDUKKyMgICAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OXzQ1CisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcD4KKyMgIGVuZGlmCisjZWxpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSA0NgorIyAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRAorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgNDYKKyMgIGlmbmRlZiBCT09TVF9GVU5DVElPTl80NgorIyAgICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fNDYKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdGVtcGxhdGUuaHBwPgorIyAgZW5kaWYKKyNlbGlmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDQ3CisjICB1bmRlZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVECisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCA0NworIyAgaWZuZGVmIEJPT1NUX0ZVTkNUSU9OXzQ3CisjICAgIGRlZmluZSBCT09TVF9GVU5DVElPTl80NworIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90ZW1wbGF0ZS5ocHA+CisjICBlbmRpZgorI2VsaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPT0gNDgKKyMgIHVuZGVmIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQKKyMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVEIDQ4CisjICBpZm5kZWYgQk9PU1RfRlVOQ1RJT05fNDgKKyMgICAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OXzQ4CisjICAgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcD4KKyMgIGVuZGlmCisjZWxpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSA0OQorIyAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRAorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTX0RFRklORUQgNDkKKyMgIGlmbmRlZiBCT09TVF9GVU5DVElPTl80OQorIyAgICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fNDkKKyMgICAgaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdGVtcGxhdGUuaHBwPgorIyAgZW5kaWYKKyNlbGlmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDUwCisjICB1bmRlZiBCT09TVF9GVU5DVElPTl9NQVhfQVJHU19ERUZJTkVECisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1NfREVGSU5FRCA1MAorIyAgaWZuZGVmIEJPT1NUX0ZVTkNUSU9OXzUwCisjICAgIGRlZmluZSBCT09TVF9GVU5DVElPTl81MAorIyAgICBpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90ZW1wbGF0ZS5ocHA+CisjICBlbmRpZgorI2Vsc2UKKyMgIGVycm9yIENhbm5vdCBoYW5kbGUgQm9vc3QuRnVuY3Rpb24gb2JqZWN0cyB0aGF0IGFjY2VwdCBtb3JlIHRoYW4gNTAgYXJndW1lbnRzIQorI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uL2RldGFpbC9wcm9sb2d1ZS5ocHAgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uL2RldGFpbC9wcm9sb2d1ZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNkMGYwNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZGV0YWlsL3Byb2xvZ3VlLmhwcApAQCAtMCwwICsxLDI2IEBACisvLyBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5CisKKy8vICBDb3B5cmlnaHQgRG91Z2xhcyBHcmVnb3IgMjAwMi0yMDAzLiBVc2UsIG1vZGlmaWNhdGlvbiBhbmQKKy8vICBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbgorLy8gIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZworCisjaWZuZGVmIEJPT1NUX0ZVTkNUSU9OX1BST0xPR1VFX0hQUAorI2RlZmluZSBCT09TVF9GVU5DVElPTl9QUk9MT0dVRV9IUFAKKyMgIGluY2x1ZGUgPGNhc3NlcnQ+CisjICBpbmNsdWRlIDxhbGdvcml0aG0+CisjICBpbmNsdWRlIDxib29zdC9jb25maWcvbm9fdHIxL2Z1bmN0aW9uYWwuaHBwPiAvLyB1bmFyeV9mdW5jdGlvbiwgYmluYXJ5X2Z1bmN0aW9uCisjICBpbmNsdWRlIDxib29zdC90aHJvd19leGNlcHRpb24uaHBwPgorIyAgaW5jbHVkZSA8Ym9vc3QvY29uZmlnLmhwcD4KKyMgIGluY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX2Jhc2UuaHBwPgorIyAgaW5jbHVkZSA8Ym9vc3QvbWVtX2ZuLmhwcD4KKyMgIGluY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2lzX2ludGVncmFsLmhwcD4KKyMgIGluY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9lbnVtLmhwcD4KKyMgIGluY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9lbnVtX3BhcmFtcy5ocHA+CisjICBpbmNsdWRlIDxib29zdC9wcmVwcm9jZXNzb3IvY2F0LmhwcD4KKyMgIGluY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9yZXBlYXQuaHBwPgorIyAgaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL2luYy5ocHA+CisjICBpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pc192b2lkLmhwcD4KKyNlbmRpZiAvLyBCT09TVF9GVU5DVElPTl9QUk9MT0dVRV9IUFAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZnVuY3Rpb24wLmhwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZnVuY3Rpb24wLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWEwMmU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9mdW5jdGlvbjAuaHBwCkBAIC0wLDAgKzEsMTIgQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKworLy8gIENvcHlyaWdodCBEb3VnbGFzIEdyZWdvciAyMDAyLTIwMDMuIFVzZSwgbW9kaWZpY2F0aW9uIGFuZAorLy8gIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uCisvLyAgMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgMAorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2RldGFpbC9tYXliZV9pbmNsdWRlLmhwcD4KKyN1bmRlZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9mdW5jdGlvbjEuaHBwIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9mdW5jdGlvbjEuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwODk3MTUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uMS5ocHAKQEAgLTAsMCArMSwxMiBAQAorLy8gQm9vc3QuRnVuY3Rpb24gbGlicmFyeQorCisvLyAgQ29weXJpZ2h0IERvdWdsYXMgR3JlZ29yIDIwMDItMjAwMy4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKworI2RlZmluZSBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyAxCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZGV0YWlsL21heWJlX2luY2x1ZGUuaHBwPgorI3VuZGVmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uMTAuaHBwIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9mdW5jdGlvbjEwLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTYyNzI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9mdW5jdGlvbjEwLmhwcApAQCAtMCwwICsxLDEyIEBACisvLyBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5CisKKy8vICBDb3B5cmlnaHQgRG91Z2xhcyBHcmVnb3IgMjAwMi0yMDAzLiBVc2UsIG1vZGlmaWNhdGlvbiBhbmQKKy8vICBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbgorLy8gIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZworCisjZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTIDEwCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZGV0YWlsL21heWJlX2luY2x1ZGUuaHBwPgorI3VuZGVmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uMi5ocHAgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uMi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM4YmY5NwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZnVuY3Rpb24yLmhwcApAQCAtMCwwICsxLDEyIEBACisvLyBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5CisKKy8vICBDb3B5cmlnaHQgRG91Z2xhcyBHcmVnb3IgMjAwMi0yMDAzLiBVc2UsIG1vZGlmaWNhdGlvbiBhbmQKKy8vICBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbgorLy8gIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZworCisjZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTIDIKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9kZXRhaWwvbWF5YmVfaW5jbHVkZS5ocHA+CisjdW5kZWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZnVuY3Rpb24zLmhwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZnVuY3Rpb24zLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWQxYTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9mdW5jdGlvbjMuaHBwCkBAIC0wLDAgKzEsMTIgQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKworLy8gIENvcHlyaWdodCBEb3VnbGFzIEdyZWdvciAyMDAyLTIwMDMuIFVzZSwgbW9kaWZpY2F0aW9uIGFuZAorLy8gIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uCisvLyAgMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgMworI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2RldGFpbC9tYXliZV9pbmNsdWRlLmhwcD4KKyN1bmRlZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9mdW5jdGlvbjQuaHBwIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9mdW5jdGlvbjQuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMzQ5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uNC5ocHAKQEAgLTAsMCArMSwxMiBAQAorLy8gQm9vc3QuRnVuY3Rpb24gbGlicmFyeQorCisvLyAgQ29weXJpZ2h0IERvdWdsYXMgR3JlZ29yIDIwMDItMjAwMy4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKworI2RlZmluZSBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA0CisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZGV0YWlsL21heWJlX2luY2x1ZGUuaHBwPgorI3VuZGVmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uNS5ocHAgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uNS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzMDVlYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZnVuY3Rpb241LmhwcApAQCAtMCwwICsxLDEyIEBACisvLyBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5CisKKy8vICBDb3B5cmlnaHQgRG91Z2xhcyBHcmVnb3IgMjAwMi0yMDAzLiBVc2UsIG1vZGlmaWNhdGlvbiBhbmQKKy8vICBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbgorLy8gIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZworCisjZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTIDUKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9kZXRhaWwvbWF5YmVfaW5jbHVkZS5ocHA+CisjdW5kZWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZnVuY3Rpb242LmhwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZnVuY3Rpb242LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjYwOTE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9mdW5jdGlvbjYuaHBwCkBAIC0wLDAgKzEsMTIgQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKworLy8gIENvcHlyaWdodCBEb3VnbGFzIEdyZWdvciAyMDAyLTIwMDMuIFVzZSwgbW9kaWZpY2F0aW9uIGFuZAorLy8gIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uCisvLyAgMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgNgorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2RldGFpbC9tYXliZV9pbmNsdWRlLmhwcD4KKyN1bmRlZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9mdW5jdGlvbjcuaHBwIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9mdW5jdGlvbjcuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NTQyZWQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uNy5ocHAKQEAgLTAsMCArMSwxMiBAQAorLy8gQm9vc3QuRnVuY3Rpb24gbGlicmFyeQorCisvLyAgQ29weXJpZ2h0IERvdWdsYXMgR3JlZ29yIDIwMDItMjAwMy4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKworI2RlZmluZSBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA3CisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZGV0YWlsL21heWJlX2luY2x1ZGUuaHBwPgorI3VuZGVmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uOC5ocHAgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uOC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyYzM3NgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZnVuY3Rpb244LmhwcApAQCAtMCwwICsxLDEyIEBACisvLyBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5CisKKy8vICBDb3B5cmlnaHQgRG91Z2xhcyBHcmVnb3IgMjAwMi0yMDAzLiBVc2UsIG1vZGlmaWNhdGlvbiBhbmQKKy8vICBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbgorLy8gIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZworCisjZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTIDgKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9kZXRhaWwvbWF5YmVfaW5jbHVkZS5ocHA+CisjdW5kZWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZnVuY3Rpb245LmhwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZnVuY3Rpb245LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTBlMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9mdW5jdGlvbjkuaHBwCkBAIC0wLDAgKzEsMTIgQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKworLy8gIENvcHlyaWdodCBEb3VnbGFzIEdyZWdvciAyMDAyLTIwMDMuIFVzZSwgbW9kaWZpY2F0aW9uIGFuZAorLy8gIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uCisvLyAgMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgOQorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2RldGFpbC9tYXliZV9pbmNsdWRlLmhwcD4KKyN1bmRlZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9mdW5jdGlvbl9iYXNlLmhwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fYmFzZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxYWZmYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fYmFzZS5ocHAKQEAgLTAsMCArMSw4ODYgQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKworLy8gIENvcHlyaWdodCBEb3VnbGFzIEdyZWdvciAyMDAxLTIwMDYKKy8vICBDb3B5cmlnaHQgRW1pbCBEb3RjaGV2c2tpIDIwMDcKKy8vICBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorLy8gIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKworI2lmbmRlZiBCT09TVF9GVU5DVElPTl9CQVNFX0hFQURFUgorI2RlZmluZSBCT09TVF9GVU5DVElPTl9CQVNFX0hFQURFUgorCisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPGJvb3N0L2NvbmZpZy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvYXNzZXJ0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9pbnRlZ2VyLmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX2luZGV4LmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9oYXNfdHJpdmlhbF9jb3B5LmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9oYXNfdHJpdmlhbF9kZXN0cnVjdG9yLmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pc19jb25zdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaXNfaW50ZWdyYWwuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2lzX3ZvbGF0aWxlLmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9jb21wb3NpdGVfdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxib29zdC9yZWYuaHBwPgorI2luY2x1ZGUgPGJvb3N0L21wbC9pZi5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZGV0YWlsL3dvcmthcm91bmQuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2FsaWdubWVudF9vZi5ocHA+CisjaWZuZGVmIEJPT1NUX05PX1NGSU5BRQorIyAgaW5jbHVkZSAiYm9vc3QvdXRpbGl0eS9lbmFibGVfaWYuaHBwIgorI2Vsc2UKKyMgIGluY2x1ZGUgImJvb3N0L21wbC9ib29sLmhwcCIKKyNlbmRpZgorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uX2VxdWFsLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbl9md2QuaHBwPgorCisjaWYgZGVmaW5lZChCT09TVF9NU1ZDKQorIyAgIHByYWdtYSB3YXJuaW5nKCBwdXNoICkKKyMgICBwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ3OTMgKSAvLyBjb21wbGFpbnQgYWJvdXQgbmF0aXZlIGNvZGUgZ2VuZXJhdGlvbgorIyAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDEyNyApIC8vICJjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50IgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fSUNMKSAmJiBfX0lDTCA8PSA2MDAgfHwgZGVmaW5lZChfX01XRVJLU19fKSAmJiBfX01XRVJLU19fIDwgMHgyNDA2ICYmICFkZWZpbmVkKEJPT1NUX1NUUklDVF9DT05GSUcpCisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fVEFSR0VUX0ZJWCh4KSB4CisjZWxzZQorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX1RBUkdFVF9GSVgoeCkKKyNlbmRpZiAvLyBfX0lDTCBldGMKKworIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX0VOQUJMRV9JRl9OT1RfSU5URUdSQUwoRnVuY3RvcixUeXBlKSAgICAgICAgICAgICAgXAorICAgICAgdHlwZW5hbWUgOjpib29zdDo6ZW5hYmxlX2lmX2M8ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICEoOjpib29zdDo6aXNfaW50ZWdyYWw8RnVuY3Rvcj46OnZhbHVlKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZT46OnR5cGUKKworbmFtZXNwYWNlIGJvb3N0IHsKKyAgbmFtZXNwYWNlIGRldGFpbCB7CisgICAgbmFtZXNwYWNlIGZ1bmN0aW9uIHsKKyAgICAgIGNsYXNzIFg7CisKKyAgICAgIC8qKgorICAgICAgICogQSBidWZmZXIgdXNlZCB0byBzdG9yZSBzbWFsbCBmdW5jdGlvbiBvYmplY3RzIGluCisgICAgICAgKiBib29zdDo6ZnVuY3Rpb24uIEl0IGlzIGEgdW5pb24gY29udGFpbmluZyBmdW5jdGlvbiBwb2ludGVycywKKyAgICAgICAqIG9iamVjdCBwb2ludGVycywgYW5kIGEgc3RydWN0dXJlIHRoYXQgcmVzZW1ibGVzIGEgYm91bmQKKyAgICAgICAqIG1lbWJlciBmdW5jdGlvbiBwb2ludGVyLgorICAgICAgICovCisgICAgICB1bmlvbiBmdW5jdGlvbl9idWZmZXJfbWVtYmVycworICAgICAgeworICAgICAgICAvLyBGb3IgcG9pbnRlcnMgdG8gZnVuY3Rpb24gb2JqZWN0cworICAgICAgICB0eXBlZGVmIHZvaWQqIG9ial9wdHJfdDsKKyAgICAgICAgbXV0YWJsZSBvYmpfcHRyX3Qgb2JqX3B0cjsKKworICAgICAgICAvLyBGb3IgcG9pbnRlcnMgdG8gc3RkOjp0eXBlX2luZm8gb2JqZWN0cworICAgICAgICBzdHJ1Y3QgdHlwZV90IHsKKyAgICAgICAgICAvLyAoZ2V0X2Z1bmN0b3JfdHlwZV90YWcsIGNoZWNrX2Z1bmN0b3JfdHlwZV90YWcpLgorICAgICAgICAgIGNvbnN0IGJvb3N0Ojp0eXBlaW5kZXg6OnR5cGVfaW5mbyogdHlwZTsKKworICAgICAgICAgIC8vIFdoZXRoZXIgdGhlIHR5cGUgaXMgY29uc3QtcXVhbGlmaWVkLgorICAgICAgICAgIGJvb2wgY29uc3RfcXVhbGlmaWVkOworICAgICAgICAgIC8vIFdoZXRoZXIgdGhlIHR5cGUgaXMgdm9sYXRpbGUtcXVhbGlmaWVkLgorICAgICAgICAgIGJvb2wgdm9sYXRpbGVfcXVhbGlmaWVkOworICAgICAgICB9IHR5cGU7CisKKyAgICAgICAgLy8gRm9yIGZ1bmN0aW9uIHBvaW50ZXJzIG9mIGFsbCBraW5kcworICAgICAgICB0eXBlZGVmIHZvaWQgKCpmdW5jX3B0cl90KSgpOworICAgICAgICBtdXRhYmxlIGZ1bmNfcHRyX3QgZnVuY19wdHI7CisKKyAgICAgICAgLy8gRm9yIGJvdW5kIG1lbWJlciBwb2ludGVycworICAgICAgICBzdHJ1Y3QgYm91bmRfbWVtZnVuY19wdHJfdCB7CisgICAgICAgICAgdm9pZCAoWDo6Km1lbWZ1bmNfcHRyKShpbnQpOworICAgICAgICAgIHZvaWQqIG9ial9wdHI7CisgICAgICAgIH0gYm91bmRfbWVtZnVuY19wdHI7CisKKyAgICAgICAgLy8gRm9yIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb24gb2JqZWN0cy4gV2UgZXhwbGljaXRseSBrZWVwCisgICAgICAgIC8vIHRyYWNrIG9mIHRoZSBjdi1xdWFsaWZpZXJzIG9uIHRoZSBvYmplY3QgcmVmZXJlbmNlZC4KKyAgICAgICAgc3RydWN0IG9ial9yZWZfdCB7CisgICAgICAgICAgbXV0YWJsZSB2b2lkKiBvYmpfcHRyOworICAgICAgICAgIGJvb2wgaXNfY29uc3RfcXVhbGlmaWVkOworICAgICAgICAgIGJvb2wgaXNfdm9sYXRpbGVfcXVhbGlmaWVkOworICAgICAgICB9IG9ial9yZWY7CisgICAgICB9OworCisgICAgICB1bmlvbiBmdW5jdGlvbl9idWZmZXIKKyAgICAgIHsKKyAgICAgICAgLy8gVHlwZS1zcGVjaWZpYyB1bmlvbiBtZW1iZXJzCisgICAgICAgIG11dGFibGUgZnVuY3Rpb25fYnVmZmVyX21lbWJlcnMgbWVtYmVyczsKKworICAgICAgICAvLyBUbyByZWxheCBhbGlhc2luZyBjb25zdHJhaW50cworICAgICAgICBtdXRhYmxlIGNoYXIgZGF0YVtzaXplb2YoZnVuY3Rpb25fYnVmZmVyX21lbWJlcnMpXTsKKyAgICAgIH07CisKKyAgICAgIC8qKgorICAgICAgICogVGhlIHVudXNhYmxlIGNsYXNzIGlzIGEgcGxhY2Vob2xkZXIgZm9yIHVudXNlZCBmdW5jdGlvbiBhcmd1bWVudHMKKyAgICAgICAqIEl0IGlzIGFsc28gY29tcGxldGVseSB1bnVzYWJsZSBleGNlcHQgdGhhdCBpdCBjb25zdHJ1Y3RhYmxlIGZyb20KKyAgICAgICAqIGFueXRoaW5nLiBUaGlzIGhlbHBzIGNvbXBpbGVycyB3aXRob3V0IHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gdG8KKyAgICAgICAqIGhhbmRsZSBCb29zdC5GdW5jdGlvbiBvYmplY3RzIHJldHVybmluZyB2b2lkLgorICAgICAgICovCisgICAgICBzdHJ1Y3QgdW51c2FibGUKKyAgICAgIHsKKyAgICAgICAgdW51c2FibGUoKSB7fQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB1bnVzYWJsZShjb25zdCBUJikge30KKyAgICAgIH07CisKKyAgICAgIC8qIERldGVybWluZSB0aGUgcmV0dXJuIHR5cGUuIFRoaXMgc3VwcG9ydHMgY29tcGlsZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQKKyAgICAgICAqIHZvaWQgcmV0dXJucyBvciBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGJ5IHNpbGVudGx5IGNoYW5naW5nIHRoZSByZXR1cm4KKyAgICAgICAqIHR5cGUgdG8gInVudXNhYmxlIi4KKyAgICAgICAqLworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGZ1bmN0aW9uX3JldHVybl90eXBlIHsgdHlwZWRlZiBUIHR5cGU7IH07CisKKyAgICAgIHRlbXBsYXRlPD4KKyAgICAgIHN0cnVjdCBmdW5jdGlvbl9yZXR1cm5fdHlwZTx2b2lkPgorICAgICAgeworICAgICAgICB0eXBlZGVmIHVudXNhYmxlIHR5cGU7CisgICAgICB9OworCisgICAgICAvLyBUaGUgb3BlcmF0aW9uIHR5cGUgdG8gcGVyZm9ybSBvbiB0aGUgZ2l2ZW4gZnVuY3Rvci9mdW5jdGlvbiBwb2ludGVyCisgICAgICBlbnVtIGZ1bmN0b3JfbWFuYWdlcl9vcGVyYXRpb25fdHlwZSB7CisgICAgICAgIGNsb25lX2Z1bmN0b3JfdGFnLAorICAgICAgICBtb3ZlX2Z1bmN0b3JfdGFnLAorICAgICAgICBkZXN0cm95X2Z1bmN0b3JfdGFnLAorICAgICAgICBjaGVja19mdW5jdG9yX3R5cGVfdGFnLAorICAgICAgICBnZXRfZnVuY3Rvcl90eXBlX3RhZworICAgICAgfTsKKworICAgICAgLy8gVGFncyB1c2VkIHRvIGRlY2lkZSBiZXR3ZWVuIGRpZmZlcmVudCB0eXBlcyBvZiBmdW5jdGlvbnMKKyAgICAgIHN0cnVjdCBmdW5jdGlvbl9wdHJfdGFnIHt9OworICAgICAgc3RydWN0IGZ1bmN0aW9uX29ial90YWcge307CisgICAgICBzdHJ1Y3QgbWVtYmVyX3B0cl90YWcge307CisgICAgICBzdHJ1Y3QgZnVuY3Rpb25fb2JqX3JlZl90YWcge307CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEY+CisgICAgICBjbGFzcyBnZXRfZnVuY3Rpb25fdGFnCisgICAgICB7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbXBsOjppZl9jPChpc19wb2ludGVyPEY+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX3B0cl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX29ial90YWc+Ojp0eXBlIHB0cl9vcl9vYmpfdGFnOworCisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbXBsOjppZl9jPChpc19tZW1iZXJfcG9pbnRlcjxGPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJfcHRyX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX29yX29ial90YWc+Ojp0eXBlIHB0cl9vcl9vYmpfb3JfbWVtX3RhZzsKKworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIG1wbDo6aWZfYzwoaXNfcmVmZXJlbmNlX3dyYXBwZXI8Rj46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25fb2JqX3JlZl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9vcl9vYmpfb3JfbWVtX3RhZz46OnR5cGUgb3JfcmVmX3RhZzsKKworICAgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIG9yX3JlZl90YWcgdHlwZTsKKyAgICAgIH07CisKKyAgICAgIC8vIFRoZSB0cml2aWFsIG1hbmFnZXIgZG9lcyBub3RoaW5nIGJ1dCByZXR1cm4gdGhlIHNhbWUgcG9pbnRlciAoaWYgd2UKKyAgICAgIC8vIGFyZSBjbG9uaW5nKSBvciByZXR1cm4gdGhlIG51bGwgcG9pbnRlciAoaWYgd2UgYXJlIGRlbGV0aW5nKS4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEY+CisgICAgICBzdHJ1Y3QgcmVmZXJlbmNlX21hbmFnZXIKKyAgICAgIHsKKyAgICAgICAgc3RhdGljIGlubGluZSB2b2lkCisgICAgICAgIG1hbmFnZShjb25zdCBmdW5jdGlvbl9idWZmZXImIGluX2J1ZmZlciwgZnVuY3Rpb25fYnVmZmVyJiBvdXRfYnVmZmVyLAorICAgICAgICAgICAgICAgZnVuY3Rvcl9tYW5hZ2VyX29wZXJhdGlvbl90eXBlIG9wKQorICAgICAgICB7CisgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgIGNhc2UgY2xvbmVfZnVuY3Rvcl90YWc6CisgICAgICAgICAgICBvdXRfYnVmZmVyLm1lbWJlcnMub2JqX3JlZiA9IGluX2J1ZmZlci5tZW1iZXJzLm9ial9yZWY7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIG1vdmVfZnVuY3Rvcl90YWc6CisgICAgICAgICAgICBvdXRfYnVmZmVyLm1lbWJlcnMub2JqX3JlZiA9IGluX2J1ZmZlci5tZW1iZXJzLm9ial9yZWY7CisgICAgICAgICAgICBpbl9idWZmZXIubWVtYmVycy5vYmpfcmVmLm9ial9wdHIgPSAwOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgY2FzZSBkZXN0cm95X2Z1bmN0b3JfdGFnOgorICAgICAgICAgICAgb3V0X2J1ZmZlci5tZW1iZXJzLm9ial9yZWYub2JqX3B0ciA9IDA7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBjYXNlIGNoZWNrX2Z1bmN0b3JfdHlwZV90YWc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSB0aGUgc2FtZSB0eXBlLiBXZSBjYW4gYWRkCisgICAgICAgICAgICAgIC8vIGN2LXF1YWxpZmllcnMsIGJ1dCB3ZSBjYW4ndCB0YWtlIHRoZW0gYXdheS4KKyAgICAgICAgICAgICAgaWYgKCpvdXRfYnVmZmVyLm1lbWJlcnMudHlwZS50eXBlID09IGJvb3N0Ojp0eXBlaW5kZXg6OnR5cGVfaWQ8Rj4oKQorICAgICAgICAgICAgICAgICAgJiYgKCFpbl9idWZmZXIubWVtYmVycy5vYmpfcmVmLmlzX2NvbnN0X3F1YWxpZmllZAorICAgICAgICAgICAgICAgICAgICAgIHx8IG91dF9idWZmZXIubWVtYmVycy50eXBlLmNvbnN0X3F1YWxpZmllZCkKKyAgICAgICAgICAgICAgICAgICYmICghaW5fYnVmZmVyLm1lbWJlcnMub2JqX3JlZi5pc192b2xhdGlsZV9xdWFsaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgICB8fCBvdXRfYnVmZmVyLm1lbWJlcnMudHlwZS52b2xhdGlsZV9xdWFsaWZpZWQpKQorICAgICAgICAgICAgICAgIG91dF9idWZmZXIubWVtYmVycy5vYmpfcHRyID0gaW5fYnVmZmVyLm1lbWJlcnMub2JqX3JlZi5vYmpfcHRyOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb3V0X2J1ZmZlci5tZW1iZXJzLm9ial9wdHIgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgY2FzZSBnZXRfZnVuY3Rvcl90eXBlX3RhZzoKKyAgICAgICAgICAgIG91dF9idWZmZXIubWVtYmVycy50eXBlLnR5cGUgPSAmYm9vc3Q6OnR5cGVpbmRleDo6dHlwZV9pZDxGPigpLnR5cGVfaW5mbygpOworICAgICAgICAgICAgb3V0X2J1ZmZlci5tZW1iZXJzLnR5cGUuY29uc3RfcXVhbGlmaWVkID0gaW5fYnVmZmVyLm1lbWJlcnMub2JqX3JlZi5pc19jb25zdF9xdWFsaWZpZWQ7CisgICAgICAgICAgICBvdXRfYnVmZmVyLm1lbWJlcnMudHlwZS52b2xhdGlsZV9xdWFsaWZpZWQgPSBpbl9idWZmZXIubWVtYmVycy5vYmpfcmVmLmlzX3ZvbGF0aWxlX3F1YWxpZmllZDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIC8qKgorICAgICAgICogRGV0ZXJtaW5lIGlmIGJvb3N0OjpmdW5jdGlvbiBjYW4gdXNlIHRoZSBzbWFsbC1vYmplY3QKKyAgICAgICAqIG9wdGltaXphdGlvbiB3aXRoIHRoZSBmdW5jdGlvbiBvYmplY3QgdHlwZSBGLgorICAgICAgICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGPgorICAgICAgc3RydWN0IGZ1bmN0aW9uX2FsbG93c19zbWFsbF9vYmplY3Rfb3B0aW1pemF0aW9uCisgICAgICB7CisgICAgICAgIEJPT1NUX1NUQVRJQ19DT05TVEFOVAorICAgICAgICAgIChib29sLAorICAgICAgICAgICB2YWx1ZSA9ICgoc2l6ZW9mKEYpIDw9IHNpemVvZihmdW5jdGlvbl9idWZmZXIpICYmCisgICAgICAgICAgICAgICAgICAgICAoYWxpZ25tZW50X29mPGZ1bmN0aW9uX2J1ZmZlcj46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgJSBhbGlnbm1lbnRfb2Y8Rj46OnZhbHVlID09IDApKSkpOworICAgICAgfTsKKworICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEYsdHlwZW5hbWUgQT4KKyAgICAgIHN0cnVjdCBmdW5jdG9yX3dyYXBwZXI6IHB1YmxpYyBGLCBwdWJsaWMgQQorICAgICAgeworICAgICAgICBmdW5jdG9yX3dyYXBwZXIoIEYgZiwgQSBhICk6CisgICAgICAgICAgRihmKSwKKyAgICAgICAgICBBKGEpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmN0b3Jfd3JhcHBlcihjb25zdCBmdW5jdG9yX3dyYXBwZXImIGYpIDoKKyAgICAgICAgICBGKHN0YXRpY19jYXN0PGNvbnN0IEYmPihmKSksCisgICAgICAgICAgQShzdGF0aWNfY2FzdDxjb25zdCBBJj4oZikpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgLyoqCisgICAgICAgKiBUaGUgZnVuY3Rvcl9tYW5hZ2VyIGNsYXNzIGNvbnRhaW5zIGEgc3RhdGljIGZ1bmN0aW9uICJtYW5hZ2UiIHdoaWNoCisgICAgICAgKiBjYW4gY2xvbmUgb3IgZGVzdHJveSB0aGUgZ2l2ZW4gZnVuY3Rpb24vZnVuY3Rpb24gb2JqZWN0IHBvaW50ZXIuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgICBzdHJ1Y3QgZnVuY3Rvcl9tYW5hZ2VyX2NvbW1vbgorICAgICAgeworICAgICAgICB0eXBlZGVmIEZ1bmN0b3IgZnVuY3Rvcl90eXBlOworCisgICAgICAgIC8vIEZ1bmN0aW9uIHBvaW50ZXJzCisgICAgICAgIHN0YXRpYyBpbmxpbmUgdm9pZAorICAgICAgICBtYW5hZ2VfcHRyKGNvbnN0IGZ1bmN0aW9uX2J1ZmZlciYgaW5fYnVmZmVyLCBmdW5jdGlvbl9idWZmZXImIG91dF9idWZmZXIsCisgICAgICAgICAgICAgICAgZnVuY3Rvcl9tYW5hZ2VyX29wZXJhdGlvbl90eXBlIG9wKQorICAgICAgICB7CisgICAgICAgICAgaWYgKG9wID09IGNsb25lX2Z1bmN0b3JfdGFnKQorICAgICAgICAgICAgb3V0X2J1ZmZlci5tZW1iZXJzLmZ1bmNfcHRyID0gaW5fYnVmZmVyLm1lbWJlcnMuZnVuY19wdHI7CisgICAgICAgICAgZWxzZSBpZiAob3AgPT0gbW92ZV9mdW5jdG9yX3RhZykgeworICAgICAgICAgICAgb3V0X2J1ZmZlci5tZW1iZXJzLmZ1bmNfcHRyID0gaW5fYnVmZmVyLm1lbWJlcnMuZnVuY19wdHI7CisgICAgICAgICAgICBpbl9idWZmZXIubWVtYmVycy5mdW5jX3B0ciA9IDA7CisgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PSBkZXN0cm95X2Z1bmN0b3JfdGFnKQorICAgICAgICAgICAgb3V0X2J1ZmZlci5tZW1iZXJzLmZ1bmNfcHRyID0gMDsKKyAgICAgICAgICBlbHNlIGlmIChvcCA9PSBjaGVja19mdW5jdG9yX3R5cGVfdGFnKSB7CisgICAgICAgICAgICBpZiAoKm91dF9idWZmZXIubWVtYmVycy50eXBlLnR5cGUgPT0gYm9vc3Q6OnR5cGVpbmRleDo6dHlwZV9pZDxGdW5jdG9yPigpKQorICAgICAgICAgICAgICBvdXRfYnVmZmVyLm1lbWJlcnMub2JqX3B0ciA9ICZpbl9idWZmZXIubWVtYmVycy5mdW5jX3B0cjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgb3V0X2J1ZmZlci5tZW1iZXJzLm9ial9wdHIgPSAwOworICAgICAgICAgIH0gZWxzZSAvKiBvcCA9PSBnZXRfZnVuY3Rvcl90eXBlX3RhZyAqLyB7CisgICAgICAgICAgICBvdXRfYnVmZmVyLm1lbWJlcnMudHlwZS50eXBlID0gJmJvb3N0Ojp0eXBlaW5kZXg6OnR5cGVfaWQ8RnVuY3Rvcj4oKS50eXBlX2luZm8oKTsKKyAgICAgICAgICAgIG91dF9idWZmZXIubWVtYmVycy50eXBlLmNvbnN0X3F1YWxpZmllZCA9IGZhbHNlOworICAgICAgICAgICAgb3V0X2J1ZmZlci5tZW1iZXJzLnR5cGUudm9sYXRpbGVfcXVhbGlmaWVkID0gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRnVuY3Rpb24gb2JqZWN0cyB0aGF0IGZpdCBpbiB0aGUgc21hbGwtb2JqZWN0IGJ1ZmZlci4KKyAgICAgICAgc3RhdGljIGlubGluZSB2b2lkCisgICAgICAgIG1hbmFnZV9zbWFsbChjb25zdCBmdW5jdGlvbl9idWZmZXImIGluX2J1ZmZlciwgZnVuY3Rpb25fYnVmZmVyJiBvdXRfYnVmZmVyLAorICAgICAgICAgICAgICAgIGZ1bmN0b3JfbWFuYWdlcl9vcGVyYXRpb25fdHlwZSBvcCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChvcCA9PSBjbG9uZV9mdW5jdG9yX3RhZyB8fCBvcCA9PSBtb3ZlX2Z1bmN0b3JfdGFnKSB7CisgICAgICAgICAgICBjb25zdCBmdW5jdG9yX3R5cGUqIGluX2Z1bmN0b3IgPQorICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGZ1bmN0b3JfdHlwZSo+KGluX2J1ZmZlci5kYXRhKTsKKyAgICAgICAgICAgIG5ldyAocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4ob3V0X2J1ZmZlci5kYXRhKSkgZnVuY3Rvcl90eXBlKCppbl9mdW5jdG9yKTsKKworICAgICAgICAgICAgaWYgKG9wID09IG1vdmVfZnVuY3Rvcl90YWcpIHsKKyAgICAgICAgICAgICAgZnVuY3Rvcl90eXBlKiBmID0gcmVpbnRlcnByZXRfY2FzdDxmdW5jdG9yX3R5cGUqPihpbl9idWZmZXIuZGF0YSk7CisgICAgICAgICAgICAgICh2b2lkKWY7IC8vIHN1cHByZXNzIHdhcm5pbmcgYWJvdXQgdGhlIHZhbHVlIG9mIGYgbm90IGJlaW5nIHVzZWQgKE1TVkMpCisgICAgICAgICAgICAgIGYtPn5GdW5jdG9yKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PSBkZXN0cm95X2Z1bmN0b3JfdGFnKSB7CisgICAgICAgICAgICAvLyBTb21lIGNvbXBpbGVycyAoQm9ybGFuZCwgdmM2LCAuLi4pIGFyZSB1bmhhcHB5IHdpdGggfmZ1bmN0b3JfdHlwZS4KKyAgICAgICAgICAgICBmdW5jdG9yX3R5cGUqIGYgPSByZWludGVycHJldF9jYXN0PGZ1bmN0b3JfdHlwZSo+KG91dF9idWZmZXIuZGF0YSk7CisgICAgICAgICAgICAgKHZvaWQpZjsgLy8gc3VwcHJlc3Mgd2FybmluZyBhYm91dCB0aGUgdmFsdWUgb2YgZiBub3QgYmVpbmcgdXNlZCAoTVNWQykKKyAgICAgICAgICAgICBmLT5+RnVuY3RvcigpOworICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT0gY2hlY2tfZnVuY3Rvcl90eXBlX3RhZykgeworICAgICAgICAgICAgIGlmICgqb3V0X2J1ZmZlci5tZW1iZXJzLnR5cGUudHlwZSA9PSBib29zdDo6dHlwZWluZGV4Ojp0eXBlX2lkPEZ1bmN0b3I+KCkpCisgICAgICAgICAgICAgIG91dF9idWZmZXIubWVtYmVycy5vYmpfcHRyID0gaW5fYnVmZmVyLmRhdGE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIG91dF9idWZmZXIubWVtYmVycy5vYmpfcHRyID0gMDsKKyAgICAgICAgICB9IGVsc2UgLyogb3AgPT0gZ2V0X2Z1bmN0b3JfdHlwZV90YWcgKi8geworICAgICAgICAgICAgb3V0X2J1ZmZlci5tZW1iZXJzLnR5cGUudHlwZSA9ICZib29zdDo6dHlwZWluZGV4Ojp0eXBlX2lkPEZ1bmN0b3I+KCkudHlwZV9pbmZvKCk7CisgICAgICAgICAgICBvdXRfYnVmZmVyLm1lbWJlcnMudHlwZS5jb25zdF9xdWFsaWZpZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG91dF9idWZmZXIubWVtYmVycy50eXBlLnZvbGF0aWxlX3F1YWxpZmllZCA9IGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICAgIHN0cnVjdCBmdW5jdG9yX21hbmFnZXIKKyAgICAgIHsKKyAgICAgIHByaXZhdGU6CisgICAgICAgIHR5cGVkZWYgRnVuY3RvciBmdW5jdG9yX3R5cGU7CisKKyAgICAgICAgLy8gRnVuY3Rpb24gcG9pbnRlcnMKKyAgICAgICAgc3RhdGljIGlubGluZSB2b2lkCisgICAgICAgIG1hbmFnZXIoY29uc3QgZnVuY3Rpb25fYnVmZmVyJiBpbl9idWZmZXIsIGZ1bmN0aW9uX2J1ZmZlciYgb3V0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICBmdW5jdG9yX21hbmFnZXJfb3BlcmF0aW9uX3R5cGUgb3AsIGZ1bmN0aW9uX3B0cl90YWcpCisgICAgICAgIHsKKyAgICAgICAgICBmdW5jdG9yX21hbmFnZXJfY29tbW9uPEZ1bmN0b3I+OjptYW5hZ2VfcHRyKGluX2J1ZmZlcixvdXRfYnVmZmVyLG9wKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZ1bmN0aW9uIG9iamVjdHMgdGhhdCBmaXQgaW4gdGhlIHNtYWxsLW9iamVjdCBidWZmZXIuCisgICAgICAgIHN0YXRpYyBpbmxpbmUgdm9pZAorICAgICAgICBtYW5hZ2VyKGNvbnN0IGZ1bmN0aW9uX2J1ZmZlciYgaW5fYnVmZmVyLCBmdW5jdGlvbl9idWZmZXImIG91dF9idWZmZXIsCisgICAgICAgICAgICAgICAgZnVuY3Rvcl9tYW5hZ2VyX29wZXJhdGlvbl90eXBlIG9wLCBtcGw6OnRydWVfKQorICAgICAgICB7CisgICAgICAgICAgZnVuY3Rvcl9tYW5hZ2VyX2NvbW1vbjxGdW5jdG9yPjo6bWFuYWdlX3NtYWxsKGluX2J1ZmZlcixvdXRfYnVmZmVyLG9wKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZ1bmN0aW9uIG9iamVjdHMgdGhhdCByZXF1aXJlIGhlYXAgYWxsb2NhdGlvbgorICAgICAgICBzdGF0aWMgaW5saW5lIHZvaWQKKyAgICAgICAgbWFuYWdlcihjb25zdCBmdW5jdGlvbl9idWZmZXImIGluX2J1ZmZlciwgZnVuY3Rpb25fYnVmZmVyJiBvdXRfYnVmZmVyLAorICAgICAgICAgICAgICAgIGZ1bmN0b3JfbWFuYWdlcl9vcGVyYXRpb25fdHlwZSBvcCwgbXBsOjpmYWxzZV8pCisgICAgICAgIHsKKyAgICAgICAgICBpZiAob3AgPT0gY2xvbmVfZnVuY3Rvcl90YWcpIHsKKyAgICAgICAgICAgIC8vIENsb25lIHRoZSBmdW5jdG9yCisgICAgICAgICAgICAvLyBHQ0MgMi45NS4zIGdldHMgdGhlIENWIHF1YWxpZmllcnMgd3JvbmcgaGVyZSwgc28gd2UKKyAgICAgICAgICAgIC8vIGNhbid0IGRvIHRoZSBzdGF0aWNfY2FzdCB0aGF0IHdlIHNob3VsZCBkby4KKyAgICAgICAgICAgIC8vIGpld2lsbGNvOiBDaGFuZ2luZyB0aGlzIHRvIHN0YXRpY19jYXN0IGJlY2F1c2UgR0NDIDIuOTUuMyBpcworICAgICAgICAgICAgLy8gb2Jzb2xldGUuCisgICAgICAgICAgICBjb25zdCBmdW5jdG9yX3R5cGUqIGYgPQorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBmdW5jdG9yX3R5cGUqPihpbl9idWZmZXIubWVtYmVycy5vYmpfcHRyKTsKKyAgICAgICAgICAgIGZ1bmN0b3JfdHlwZSogbmV3X2YgPSBuZXcgZnVuY3Rvcl90eXBlKCpmKTsKKyAgICAgICAgICAgIG91dF9idWZmZXIubWVtYmVycy5vYmpfcHRyID0gbmV3X2Y7CisgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PSBtb3ZlX2Z1bmN0b3JfdGFnKSB7CisgICAgICAgICAgICBvdXRfYnVmZmVyLm1lbWJlcnMub2JqX3B0ciA9IGluX2J1ZmZlci5tZW1iZXJzLm9ial9wdHI7CisgICAgICAgICAgICBpbl9idWZmZXIubWVtYmVycy5vYmpfcHRyID0gMDsKKyAgICAgICAgICB9IGVsc2UgaWYgKG9wID09IGRlc3Ryb3lfZnVuY3Rvcl90YWcpIHsKKyAgICAgICAgICAgIC8qIENhc3QgZnJvbSB0aGUgdm9pZCBwb2ludGVyIHRvIHRoZSBmdW5jdG9yIHBvaW50ZXIgdHlwZSAqLworICAgICAgICAgICAgZnVuY3Rvcl90eXBlKiBmID0KKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZnVuY3Rvcl90eXBlKj4ob3V0X2J1ZmZlci5tZW1iZXJzLm9ial9wdHIpOworICAgICAgICAgICAgZGVsZXRlIGY7CisgICAgICAgICAgICBvdXRfYnVmZmVyLm1lbWJlcnMub2JqX3B0ciA9IDA7CisgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PSBjaGVja19mdW5jdG9yX3R5cGVfdGFnKSB7CisgICAgICAgICAgICBpZiAoKm91dF9idWZmZXIubWVtYmVycy50eXBlLnR5cGUgPT0gYm9vc3Q6OnR5cGVpbmRleDo6dHlwZV9pZDxGdW5jdG9yPigpKQorICAgICAgICAgICAgICBvdXRfYnVmZmVyLm1lbWJlcnMub2JqX3B0ciA9IGluX2J1ZmZlci5tZW1iZXJzLm9ial9wdHI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIG91dF9idWZmZXIubWVtYmVycy5vYmpfcHRyID0gMDsKKyAgICAgICAgICB9IGVsc2UgLyogb3AgPT0gZ2V0X2Z1bmN0b3JfdHlwZV90YWcgKi8geworICAgICAgICAgICAgb3V0X2J1ZmZlci5tZW1iZXJzLnR5cGUudHlwZSA9ICZib29zdDo6dHlwZWluZGV4Ojp0eXBlX2lkPEZ1bmN0b3I+KCkudHlwZV9pbmZvKCk7CisgICAgICAgICAgICBvdXRfYnVmZmVyLm1lbWJlcnMudHlwZS5jb25zdF9xdWFsaWZpZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG91dF9idWZmZXIubWVtYmVycy50eXBlLnZvbGF0aWxlX3F1YWxpZmllZCA9IGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvciBmdW5jdGlvbiBvYmplY3RzLCB3ZSBkZXRlcm1pbmUgd2hldGhlciB0aGUgZnVuY3Rpb24KKyAgICAgICAgLy8gb2JqZWN0IGNhbiB1c2UgdGhlIHNtYWxsLW9iamVjdCBvcHRpbWl6YXRpb24gYnVmZmVyIG9yCisgICAgICAgIC8vIHdoZXRoZXIgd2UgbmVlZCB0byBhbGxvY2F0ZSBpdCBvbiB0aGUgaGVhcC4KKyAgICAgICAgc3RhdGljIGlubGluZSB2b2lkCisgICAgICAgIG1hbmFnZXIoY29uc3QgZnVuY3Rpb25fYnVmZmVyJiBpbl9idWZmZXIsIGZ1bmN0aW9uX2J1ZmZlciYgb3V0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICBmdW5jdG9yX21hbmFnZXJfb3BlcmF0aW9uX3R5cGUgb3AsIGZ1bmN0aW9uX29ial90YWcpCisgICAgICAgIHsKKyAgICAgICAgICBtYW5hZ2VyKGluX2J1ZmZlciwgb3V0X2J1ZmZlciwgb3AsCisgICAgICAgICAgICAgICAgICBtcGw6OmJvb2xfPChmdW5jdGlvbl9hbGxvd3Nfc21hbGxfb2JqZWN0X29wdGltaXphdGlvbjxmdW5jdG9yX3R5cGU+Ojp2YWx1ZSk+KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yIG1lbWJlciBwb2ludGVycywgd2UgdXNlIHRoZSBzbWFsbC1vYmplY3Qgb3B0aW1pemF0aW9uIGJ1ZmZlci4KKyAgICAgICAgc3RhdGljIGlubGluZSB2b2lkCisgICAgICAgIG1hbmFnZXIoY29uc3QgZnVuY3Rpb25fYnVmZmVyJiBpbl9idWZmZXIsIGZ1bmN0aW9uX2J1ZmZlciYgb3V0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICBmdW5jdG9yX21hbmFnZXJfb3BlcmF0aW9uX3R5cGUgb3AsIG1lbWJlcl9wdHJfdGFnKQorICAgICAgICB7CisgICAgICAgICAgbWFuYWdlcihpbl9idWZmZXIsIG91dF9idWZmZXIsIG9wLCBtcGw6OnRydWVfKCkpOworICAgICAgICB9CisKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgLyogRGlzcGF0Y2ggdG8gYW4gYXBwcm9wcmlhdGUgbWFuYWdlciBiYXNlZCBvbiB3aGV0aGVyIHdlIGhhdmUgYQorICAgICAgICAgICBmdW5jdGlvbiBwb2ludGVyIG9yIGEgZnVuY3Rpb24gb2JqZWN0IHBvaW50ZXIuICovCisgICAgICAgIHN0YXRpYyBpbmxpbmUgdm9pZAorICAgICAgICBtYW5hZ2UoY29uc3QgZnVuY3Rpb25fYnVmZmVyJiBpbl9idWZmZXIsIGZ1bmN0aW9uX2J1ZmZlciYgb3V0X2J1ZmZlciwKKyAgICAgICAgICAgICAgIGZ1bmN0b3JfbWFuYWdlcl9vcGVyYXRpb25fdHlwZSBvcCkKKyAgICAgICAgeworICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZ2V0X2Z1bmN0aW9uX3RhZzxmdW5jdG9yX3R5cGU+Ojp0eXBlIHRhZ190eXBlOworICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICBjYXNlIGdldF9mdW5jdG9yX3R5cGVfdGFnOgorICAgICAgICAgICAgb3V0X2J1ZmZlci5tZW1iZXJzLnR5cGUudHlwZSA9ICZib29zdDo6dHlwZWluZGV4Ojp0eXBlX2lkPGZ1bmN0b3JfdHlwZT4oKS50eXBlX2luZm8oKTsKKyAgICAgICAgICAgIG91dF9idWZmZXIubWVtYmVycy50eXBlLmNvbnN0X3F1YWxpZmllZCA9IGZhbHNlOworICAgICAgICAgICAgb3V0X2J1ZmZlci5tZW1iZXJzLnR5cGUudm9sYXRpbGVfcXVhbGlmaWVkID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbWFuYWdlcihpbl9idWZmZXIsIG91dF9idWZmZXIsIG9wLCB0YWdfdHlwZSgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3IsIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICAgIHN0cnVjdCBmdW5jdG9yX21hbmFnZXJfYQorICAgICAgeworICAgICAgcHJpdmF0ZToKKyAgICAgICAgdHlwZWRlZiBGdW5jdG9yIGZ1bmN0b3JfdHlwZTsKKworICAgICAgICAvLyBGdW5jdGlvbiBwb2ludGVycworICAgICAgICBzdGF0aWMgaW5saW5lIHZvaWQKKyAgICAgICAgbWFuYWdlcihjb25zdCBmdW5jdGlvbl9idWZmZXImIGluX2J1ZmZlciwgZnVuY3Rpb25fYnVmZmVyJiBvdXRfYnVmZmVyLAorICAgICAgICAgICAgICAgIGZ1bmN0b3JfbWFuYWdlcl9vcGVyYXRpb25fdHlwZSBvcCwgZnVuY3Rpb25fcHRyX3RhZykKKyAgICAgICAgeworICAgICAgICAgIGZ1bmN0b3JfbWFuYWdlcl9jb21tb248RnVuY3Rvcj46Om1hbmFnZV9wdHIoaW5fYnVmZmVyLG91dF9idWZmZXIsb3ApOworICAgICAgICB9CisKKyAgICAgICAgLy8gRnVuY3Rpb24gb2JqZWN0cyB0aGF0IGZpdCBpbiB0aGUgc21hbGwtb2JqZWN0IGJ1ZmZlci4KKyAgICAgICAgc3RhdGljIGlubGluZSB2b2lkCisgICAgICAgIG1hbmFnZXIoY29uc3QgZnVuY3Rpb25fYnVmZmVyJiBpbl9idWZmZXIsIGZ1bmN0aW9uX2J1ZmZlciYgb3V0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICBmdW5jdG9yX21hbmFnZXJfb3BlcmF0aW9uX3R5cGUgb3AsIG1wbDo6dHJ1ZV8pCisgICAgICAgIHsKKyAgICAgICAgICBmdW5jdG9yX21hbmFnZXJfY29tbW9uPEZ1bmN0b3I+OjptYW5hZ2Vfc21hbGwoaW5fYnVmZmVyLG91dF9idWZmZXIsb3ApOworICAgICAgICB9CisKKyAgICAgICAgLy8gRnVuY3Rpb24gb2JqZWN0cyB0aGF0IHJlcXVpcmUgaGVhcCBhbGxvY2F0aW9uCisgICAgICAgIHN0YXRpYyBpbmxpbmUgdm9pZAorICAgICAgICBtYW5hZ2VyKGNvbnN0IGZ1bmN0aW9uX2J1ZmZlciYgaW5fYnVmZmVyLCBmdW5jdGlvbl9idWZmZXImIG91dF9idWZmZXIsCisgICAgICAgICAgICAgICAgZnVuY3Rvcl9tYW5hZ2VyX29wZXJhdGlvbl90eXBlIG9wLCBtcGw6OmZhbHNlXykKKyAgICAgICAgeworICAgICAgICAgIHR5cGVkZWYgZnVuY3Rvcl93cmFwcGVyPEZ1bmN0b3IsQWxsb2NhdG9yPiBmdW5jdG9yX3dyYXBwZXJfdHlwZTsKKyNpZiBkZWZpbmVkKEJPT1NUX05PX0NYWDExX0FMTE9DQVRPUikKKyAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIEFsbG9jYXRvcjo6dGVtcGxhdGUgcmViaW5kPGZ1bmN0b3Jfd3JhcHBlcl90eXBlPjo6b3RoZXIKKyAgICAgICAgICAgIHdyYXBwZXJfYWxsb2NhdG9yX3R5cGU7CisgICAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB3cmFwcGVyX2FsbG9jYXRvcl90eXBlOjpwb2ludGVyIHdyYXBwZXJfYWxsb2NhdG9yX3BvaW50ZXJfdHlwZTsKKyNlbHNlCisgICAgICAgICAgdXNpbmcgd3JhcHBlcl9hbGxvY2F0b3JfdHlwZSA9IHR5cGVuYW1lIHN0ZDo6YWxsb2NhdG9yX3RyYWl0czxBbGxvY2F0b3I+Ojp0ZW1wbGF0ZSByZWJpbmRfYWxsb2M8ZnVuY3Rvcl93cmFwcGVyX3R5cGU+OworICAgICAgICAgIHVzaW5nIHdyYXBwZXJfYWxsb2NhdG9yX3BvaW50ZXJfdHlwZSA9IHR5cGVuYW1lIHN0ZDo6YWxsb2NhdG9yX3RyYWl0czx3cmFwcGVyX2FsbG9jYXRvcl90eXBlPjo6cG9pbnRlcjsKKyNlbmRpZgorCisgICAgICAgICAgaWYgKG9wID09IGNsb25lX2Z1bmN0b3JfdGFnKSB7CisgICAgICAgICAgICAvLyBDbG9uZSB0aGUgZnVuY3RvcgorICAgICAgICAgICAgLy8gR0NDIDIuOTUuMyBnZXRzIHRoZSBDViBxdWFsaWZpZXJzIHdyb25nIGhlcmUsIHNvIHdlCisgICAgICAgICAgICAvLyBjYW4ndCBkbyB0aGUgc3RhdGljX2Nhc3QgdGhhdCB3ZSBzaG91bGQgZG8uCisgICAgICAgICAgICBjb25zdCBmdW5jdG9yX3dyYXBwZXJfdHlwZSogZiA9CisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGZ1bmN0b3Jfd3JhcHBlcl90eXBlKj4oaW5fYnVmZmVyLm1lbWJlcnMub2JqX3B0cik7CisgICAgICAgICAgICB3cmFwcGVyX2FsbG9jYXRvcl90eXBlIHdyYXBwZXJfYWxsb2NhdG9yKHN0YXRpY19jYXN0PEFsbG9jYXRvciBjb25zdCAmPigqZikpOworICAgICAgICAgICAgd3JhcHBlcl9hbGxvY2F0b3JfcG9pbnRlcl90eXBlIGNvcHkgPSB3cmFwcGVyX2FsbG9jYXRvci5hbGxvY2F0ZSgxKTsKKyNpZiBkZWZpbmVkKEJPT1NUX05PX0NYWDExX0FMTE9DQVRPUikKKyAgICAgICAgICAgIHdyYXBwZXJfYWxsb2NhdG9yLmNvbnN0cnVjdChjb3B5LCAqZik7CisjZWxzZQorICAgICAgICAgICAgc3RkOjphbGxvY2F0b3JfdHJhaXRzPHdyYXBwZXJfYWxsb2NhdG9yX3R5cGU+Ojpjb25zdHJ1Y3Qod3JhcHBlcl9hbGxvY2F0b3IsIGNvcHksICpmKTsKKyNlbmRpZgorCisgICAgICAgICAgICAvLyBHZXQgYmFjayB0byB0aGUgb3JpZ2luYWwgcG9pbnRlciB0eXBlCisgICAgICAgICAgICBmdW5jdG9yX3dyYXBwZXJfdHlwZSogbmV3X2YgPSBzdGF0aWNfY2FzdDxmdW5jdG9yX3dyYXBwZXJfdHlwZSo+KGNvcHkpOworICAgICAgICAgICAgb3V0X2J1ZmZlci5tZW1iZXJzLm9ial9wdHIgPSBuZXdfZjsKKyAgICAgICAgICB9IGVsc2UgaWYgKG9wID09IG1vdmVfZnVuY3Rvcl90YWcpIHsKKyAgICAgICAgICAgIG91dF9idWZmZXIubWVtYmVycy5vYmpfcHRyID0gaW5fYnVmZmVyLm1lbWJlcnMub2JqX3B0cjsKKyAgICAgICAgICAgIGluX2J1ZmZlci5tZW1iZXJzLm9ial9wdHIgPSAwOworICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT0gZGVzdHJveV9mdW5jdG9yX3RhZykgeworICAgICAgICAgICAgLyogQ2FzdCBmcm9tIHRoZSB2b2lkIHBvaW50ZXIgdG8gdGhlIGZ1bmN0b3Jfd3JhcHBlcl90eXBlICovCisgICAgICAgICAgICBmdW5jdG9yX3dyYXBwZXJfdHlwZSogdmljdGltID0KKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZnVuY3Rvcl93cmFwcGVyX3R5cGUqPihpbl9idWZmZXIubWVtYmVycy5vYmpfcHRyKTsKKyAgICAgICAgICAgIHdyYXBwZXJfYWxsb2NhdG9yX3R5cGUgd3JhcHBlcl9hbGxvY2F0b3Ioc3RhdGljX2Nhc3Q8QWxsb2NhdG9yIGNvbnN0ICY+KCp2aWN0aW0pKTsKKyNpZiBkZWZpbmVkKEJPT1NUX05PX0NYWDExX0FMTE9DQVRPUikKKyAgICAgICAgICAgIHdyYXBwZXJfYWxsb2NhdG9yLmRlc3Ryb3kodmljdGltKTsKKyNlbHNlCisgICAgICAgICAgICBzdGQ6OmFsbG9jYXRvcl90cmFpdHM8d3JhcHBlcl9hbGxvY2F0b3JfdHlwZT46OmRlc3Ryb3kod3JhcHBlcl9hbGxvY2F0b3IsIHZpY3RpbSk7CisjZW5kaWYKKyAgICAgICAgICAgIHdyYXBwZXJfYWxsb2NhdG9yLmRlYWxsb2NhdGUodmljdGltLDEpOworICAgICAgICAgICAgb3V0X2J1ZmZlci5tZW1iZXJzLm9ial9wdHIgPSAwOworICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT0gY2hlY2tfZnVuY3Rvcl90eXBlX3RhZykgeworICAgICAgICAgICAgaWYgKCpvdXRfYnVmZmVyLm1lbWJlcnMudHlwZS50eXBlID09IGJvb3N0Ojp0eXBlaW5kZXg6OnR5cGVfaWQ8RnVuY3Rvcj4oKSkKKyAgICAgICAgICAgICAgb3V0X2J1ZmZlci5tZW1iZXJzLm9ial9wdHIgPSBpbl9idWZmZXIubWVtYmVycy5vYmpfcHRyOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBvdXRfYnVmZmVyLm1lbWJlcnMub2JqX3B0ciA9IDA7CisgICAgICAgICAgfSBlbHNlIC8qIG9wID09IGdldF9mdW5jdG9yX3R5cGVfdGFnICovIHsKKyAgICAgICAgICAgIG91dF9idWZmZXIubWVtYmVycy50eXBlLnR5cGUgPSAmYm9vc3Q6OnR5cGVpbmRleDo6dHlwZV9pZDxGdW5jdG9yPigpLnR5cGVfaW5mbygpOworICAgICAgICAgICAgb3V0X2J1ZmZlci5tZW1iZXJzLnR5cGUuY29uc3RfcXVhbGlmaWVkID0gZmFsc2U7CisgICAgICAgICAgICBvdXRfYnVmZmVyLm1lbWJlcnMudHlwZS52b2xhdGlsZV9xdWFsaWZpZWQgPSBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGb3IgZnVuY3Rpb24gb2JqZWN0cywgd2UgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZ1bmN0aW9uCisgICAgICAgIC8vIG9iamVjdCBjYW4gdXNlIHRoZSBzbWFsbC1vYmplY3Qgb3B0aW1pemF0aW9uIGJ1ZmZlciBvcgorICAgICAgICAvLyB3aGV0aGVyIHdlIG5lZWQgdG8gYWxsb2NhdGUgaXQgb24gdGhlIGhlYXAuCisgICAgICAgIHN0YXRpYyBpbmxpbmUgdm9pZAorICAgICAgICBtYW5hZ2VyKGNvbnN0IGZ1bmN0aW9uX2J1ZmZlciYgaW5fYnVmZmVyLCBmdW5jdGlvbl9idWZmZXImIG91dF9idWZmZXIsCisgICAgICAgICAgICAgICAgZnVuY3Rvcl9tYW5hZ2VyX29wZXJhdGlvbl90eXBlIG9wLCBmdW5jdGlvbl9vYmpfdGFnKQorICAgICAgICB7CisgICAgICAgICAgbWFuYWdlcihpbl9idWZmZXIsIG91dF9idWZmZXIsIG9wLAorICAgICAgICAgICAgICAgICAgbXBsOjpib29sXzwoZnVuY3Rpb25fYWxsb3dzX3NtYWxsX29iamVjdF9vcHRpbWl6YXRpb248ZnVuY3Rvcl90eXBlPjo6dmFsdWUpPigpKTsKKyAgICAgICAgfQorCisgICAgICBwdWJsaWM6CisgICAgICAgIC8qIERpc3BhdGNoIHRvIGFuIGFwcHJvcHJpYXRlIG1hbmFnZXIgYmFzZWQgb24gd2hldGhlciB3ZSBoYXZlIGEKKyAgICAgICAgICAgZnVuY3Rpb24gcG9pbnRlciBvciBhIGZ1bmN0aW9uIG9iamVjdCBwb2ludGVyLiAqLworICAgICAgICBzdGF0aWMgaW5saW5lIHZvaWQKKyAgICAgICAgbWFuYWdlKGNvbnN0IGZ1bmN0aW9uX2J1ZmZlciYgaW5fYnVmZmVyLCBmdW5jdGlvbl9idWZmZXImIG91dF9idWZmZXIsCisgICAgICAgICAgICAgICBmdW5jdG9yX21hbmFnZXJfb3BlcmF0aW9uX3R5cGUgb3ApCisgICAgICAgIHsKKyAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIGdldF9mdW5jdGlvbl90YWc8ZnVuY3Rvcl90eXBlPjo6dHlwZSB0YWdfdHlwZTsKKyAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgY2FzZSBnZXRfZnVuY3Rvcl90eXBlX3RhZzoKKyAgICAgICAgICAgIG91dF9idWZmZXIubWVtYmVycy50eXBlLnR5cGUgPSAmYm9vc3Q6OnR5cGVpbmRleDo6dHlwZV9pZDxmdW5jdG9yX3R5cGU+KCkudHlwZV9pbmZvKCk7CisgICAgICAgICAgICBvdXRfYnVmZmVyLm1lbWJlcnMudHlwZS5jb25zdF9xdWFsaWZpZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG91dF9idWZmZXIubWVtYmVycy50eXBlLnZvbGF0aWxlX3F1YWxpZmllZCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1hbmFnZXIoaW5fYnVmZmVyLCBvdXRfYnVmZmVyLCBvcCwgdGFnX3R5cGUoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9OworCisgICAgICAvLyBBIHR5cGUgdGhhdCBpcyBvbmx5IHVzZWQgZm9yIGNvbXBhcmlzb25zIGFnYWluc3QgemVybworICAgICAgc3RydWN0IHVzZWxlc3NfY2xlYXJfdHlwZSB7fTsKKworI2lmZGVmIEJPT1NUX05PX1NGSU5BRQorICAgICAgLy8gVGhlc2Ugcm91dGluZXMgcGVyZm9ybSBjb21wYXJpc29ucyBiZXR3ZWVuIGEgQm9vc3QuRnVuY3Rpb24KKyAgICAgIC8vIG9iamVjdCBhbmQgYW4gYXJiaXRyYXJ5IGZ1bmN0aW9uIG9iamVjdCAod2hlbiB0aGUgbGFzdAorICAgICAgLy8gcGFyYW1ldGVyIGlzIG1wbDo6Ym9vbF88ZmFsc2U+KSBvciBhZ2FpbnN0IHplcm8gKHdoZW4gdGhlCisgICAgICAvLyBsYXN0IHBhcmFtZXRlciBpcyBtcGw6OmJvb2xfPHRydWU+KS4gVGhleSBhcmUgb25seSBuZWNlc3NhcnkKKyAgICAgIC8vIGZvciBjb21waWxlcnMgdGhhdCBkb24ndCBzdXBwb3J0IFNGSU5BRS4KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBGdW5jdG9yPgorICAgICAgICBib29sCisgICAgICAgIGNvbXBhcmVfZXF1YWwoY29uc3QgRnVuY3Rpb24mIGYsIGNvbnN0IEZ1bmN0b3ImLCBpbnQsIG1wbDo6Ym9vbF88dHJ1ZT4pCisgICAgICAgIHsgcmV0dXJuIGYuZW1wdHkoKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgRnVuY3Rvcj4KKyAgICAgICAgYm9vbAorICAgICAgICBjb21wYXJlX25vdF9lcXVhbChjb25zdCBGdW5jdGlvbiYgZiwgY29uc3QgRnVuY3RvciYsIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXBsOjpib29sXzx0cnVlPikKKyAgICAgICAgeyByZXR1cm4gIWYuZW1wdHkoKTsgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgRnVuY3Rvcj4KKyAgICAgICAgYm9vbAorICAgICAgICBjb21wYXJlX2VxdWFsKGNvbnN0IEZ1bmN0aW9uJiBmLCBjb25zdCBGdW5jdG9yJiBnLCBsb25nLAorICAgICAgICAgICAgICAgICAgICAgIG1wbDo6Ym9vbF88ZmFsc2U+KQorICAgICAgICB7CisgICAgICAgICAgaWYgKGNvbnN0IEZ1bmN0b3IqIGZwID0gZi50ZW1wbGF0ZSB0YXJnZXQ8RnVuY3Rvcj4oKSkKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbl9lcXVhbCgqZnAsIGcpOworICAgICAgICAgIGVsc2UgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uLCB0eXBlbmFtZSBGdW5jdG9yPgorICAgICAgICBib29sCisgICAgICAgIGNvbXBhcmVfZXF1YWwoY29uc3QgRnVuY3Rpb24mIGYsIGNvbnN0IHJlZmVyZW5jZV93cmFwcGVyPEZ1bmN0b3I+JiBnLAorICAgICAgICAgICAgICAgICAgICAgIGludCwgbXBsOjpib29sXzxmYWxzZT4pCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoY29uc3QgRnVuY3RvciogZnAgPSBmLnRlbXBsYXRlIHRhcmdldDxGdW5jdG9yPigpKQorICAgICAgICAgICAgcmV0dXJuIGZwID09IGcuZ2V0X3BvaW50ZXIoKTsKKyAgICAgICAgICBlbHNlIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUgRnVuY3Rvcj4KKyAgICAgICAgYm9vbAorICAgICAgICBjb21wYXJlX25vdF9lcXVhbChjb25zdCBGdW5jdGlvbiYgZiwgY29uc3QgRnVuY3RvciYgZywgbG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXBsOjpib29sXzxmYWxzZT4pCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoY29uc3QgRnVuY3RvciogZnAgPSBmLnRlbXBsYXRlIHRhcmdldDxGdW5jdG9yPigpKQorICAgICAgICAgICAgcmV0dXJuICFmdW5jdGlvbl9lcXVhbCgqZnAsIGcpOworICAgICAgICAgIGVsc2UgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgICAgIGJvb2wKKyAgICAgICAgY29tcGFyZV9ub3RfZXF1YWwoY29uc3QgRnVuY3Rpb24mIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZV93cmFwcGVyPEZ1bmN0b3I+JiBnLCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1wbDo6Ym9vbF88ZmFsc2U+KQorICAgICAgICB7CisgICAgICAgICAgaWYgKGNvbnN0IEZ1bmN0b3IqIGZwID0gZi50ZW1wbGF0ZSB0YXJnZXQ8RnVuY3Rvcj4oKSkKKyAgICAgICAgICAgIHJldHVybiBmcCAhPSBnLmdldF9wb2ludGVyKCk7CisgICAgICAgICAgZWxzZSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorI2VuZGlmIC8vIEJPT1NUX05PX1NGSU5BRQorCisgICAgICAvKioKKyAgICAgICAqIFN0b3JlcyB0aGUgIm1hbmFnZXIiIHBvcnRpb24gb2YgdGhlIHZ0YWJsZSBmb3IgYQorICAgICAgICogYm9vc3Q6OmZ1bmN0aW9uIG9iamVjdC4KKyAgICAgICAqLworICAgICAgc3RydWN0IHZ0YWJsZV9iYXNlCisgICAgICB7CisgICAgICAgIHZvaWQgKCptYW5hZ2VyKShjb25zdCBmdW5jdGlvbl9idWZmZXImIGluX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX2J1ZmZlciYgb3V0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0b3JfbWFuYWdlcl9vcGVyYXRpb25fdHlwZSBvcCk7CisgICAgICB9OworICAgIH0gLy8gZW5kIG5hbWVzcGFjZSBmdW5jdGlvbgorICB9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCisKKy8qKgorICogVGhlIGZ1bmN0aW9uX2Jhc2UgY2xhc3MgY29udGFpbnMgdGhlIGJhc2ljIGVsZW1lbnRzIG5lZWRlZCBmb3IgdGhlCisgKiBmdW5jdGlvbjEsIGZ1bmN0aW9uMiwgZnVuY3Rpb24zLCBldGMuIGNsYXNzZXMuIEl0IGlzIGNvbW1vbiB0byBhbGwKKyAqIGZ1bmN0aW9ucyAoYW5kIGFzIHN1Y2ggY2FuIGJlIHVzZWQgdG8gdGVsbCBpZiB3ZSBoYXZlIG9uZSBvZiB0aGUKKyAqIGZ1bmN0aW9uTiBvYmplY3RzKS4KKyAqLworY2xhc3MgZnVuY3Rpb25fYmFzZQoreworcHVibGljOgorICBmdW5jdGlvbl9iYXNlKCkgOiB2dGFibGUoMCkgeyB9CisKKyAgLyoqIERldGVybWluZSBpZiB0aGUgZnVuY3Rpb24gaXMgZW1wdHkgKGkuZS4sIGhhcyBubyB0YXJnZXQpLiAqLworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gIXZ0YWJsZTsgfQorCisgIC8qKiBSZXRyaWV2ZSB0aGUgdHlwZSBvZiB0aGUgc3RvcmVkIGZ1bmN0aW9uIG9iamVjdCwgb3IgdHlwZV9pZDx2b2lkPigpCisgICAgICBpZiB0aGlzIGlzIGVtcHR5LiAqLworICBjb25zdCBib29zdDo6dHlwZWluZGV4Ojp0eXBlX2luZm8mIHRhcmdldF90eXBlKCkgY29uc3QKKyAgeworICAgIGlmICghdnRhYmxlKSByZXR1cm4gYm9vc3Q6OnR5cGVpbmRleDo6dHlwZV9pZDx2b2lkPigpLnR5cGVfaW5mbygpOworCisgICAgZGV0YWlsOjpmdW5jdGlvbjo6ZnVuY3Rpb25fYnVmZmVyIHR5cGU7CisgICAgZ2V0X3Z0YWJsZSgpLT5tYW5hZ2VyKGZ1bmN0b3IsIHR5cGUsIGRldGFpbDo6ZnVuY3Rpb246OmdldF9mdW5jdG9yX3R5cGVfdGFnKTsKKyAgICByZXR1cm4gKnR5cGUubWVtYmVycy50eXBlLnR5cGU7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIEZ1bmN0b3IqIHRhcmdldCgpCisgICAgeworICAgICAgaWYgKCF2dGFibGUpIHJldHVybiAwOworCisgICAgICBkZXRhaWw6OmZ1bmN0aW9uOjpmdW5jdGlvbl9idWZmZXIgdHlwZV9yZXN1bHQ7CisgICAgICB0eXBlX3Jlc3VsdC5tZW1iZXJzLnR5cGUudHlwZSA9ICZib29zdDo6dHlwZWluZGV4Ojp0eXBlX2lkPEZ1bmN0b3I+KCkudHlwZV9pbmZvKCk7CisgICAgICB0eXBlX3Jlc3VsdC5tZW1iZXJzLnR5cGUuY29uc3RfcXVhbGlmaWVkID0gaXNfY29uc3Q8RnVuY3Rvcj46OnZhbHVlOworICAgICAgdHlwZV9yZXN1bHQubWVtYmVycy50eXBlLnZvbGF0aWxlX3F1YWxpZmllZCA9IGlzX3ZvbGF0aWxlPEZ1bmN0b3I+Ojp2YWx1ZTsKKyAgICAgIGdldF92dGFibGUoKS0+bWFuYWdlcihmdW5jdG9yLCB0eXBlX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6OmZ1bmN0aW9uOjpjaGVja19mdW5jdG9yX3R5cGVfdGFnKTsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxGdW5jdG9yKj4odHlwZV9yZXN1bHQubWVtYmVycy5vYmpfcHRyKTsKKyAgICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICBjb25zdCBGdW5jdG9yKiB0YXJnZXQoKSBjb25zdAorICAgIHsKKyAgICAgIGlmICghdnRhYmxlKSByZXR1cm4gMDsKKworICAgICAgZGV0YWlsOjpmdW5jdGlvbjo6ZnVuY3Rpb25fYnVmZmVyIHR5cGVfcmVzdWx0OworICAgICAgdHlwZV9yZXN1bHQubWVtYmVycy50eXBlLnR5cGUgPSAmYm9vc3Q6OnR5cGVpbmRleDo6dHlwZV9pZDxGdW5jdG9yPigpLnR5cGVfaW5mbygpOworICAgICAgdHlwZV9yZXN1bHQubWVtYmVycy50eXBlLmNvbnN0X3F1YWxpZmllZCA9IHRydWU7CisgICAgICB0eXBlX3Jlc3VsdC5tZW1iZXJzLnR5cGUudm9sYXRpbGVfcXVhbGlmaWVkID0gaXNfdm9sYXRpbGU8RnVuY3Rvcj46OnZhbHVlOworICAgICAgZ2V0X3Z0YWJsZSgpLT5tYW5hZ2VyKGZ1bmN0b3IsIHR5cGVfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDo6ZnVuY3Rpb246OmNoZWNrX2Z1bmN0b3JfdHlwZV90YWcpOworICAgICAgLy8gR0NDIDIuOTUuMyBnZXRzIHRoZSBDViBxdWFsaWZpZXJzIHdyb25nIGhlcmUsIHNvIHdlCisgICAgICAvLyBjYW4ndCBkbyB0aGUgc3RhdGljX2Nhc3QgdGhhdCB3ZSBzaG91bGQgZG8uCisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgRnVuY3Rvcio+KHR5cGVfcmVzdWx0Lm1lbWJlcnMub2JqX3B0cik7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIEY+CisgICAgYm9vbCBjb250YWlucyhjb25zdCBGJiBmKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChjb25zdCBGKiBmcCA9IHRoaXMtPnRlbXBsYXRlIHRhcmdldDxGPigpKQorICAgICAgeworICAgICAgICByZXR1cm4gZnVuY3Rpb25fZXF1YWwoKmZwLCBmKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fIDw9IDMKKyAgLy8gR0NDIDMuMyBhbmQgbmV3ZXIgY2Fubm90IGNvcHkgd2l0aCB0aGUgZ2xvYmFsIG9wZXJhdG9yPT0sIGR1ZSB0bworICAvLyBwcm9ibGVtcyB3aXRoIGluc3RhbnRpYXRpb24gb2YgZnVuY3Rpb24gcmV0dXJuIHR5cGVzIGJlZm9yZSBpdAorICAvLyBoYXMgYmVlbiB2ZXJpZmllZCB0aGF0IHRoZSBhcmd1bWVudCB0eXBlcyBtYXRjaCB1cC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICBCT09TVF9GVU5DVElPTl9FTkFCTEVfSUZfTk9UX0lOVEVHUkFMKEZ1bmN0b3IsIGJvb2wpCisgICAgb3BlcmF0b3I9PShGdW5jdG9yIGcpIGNvbnN0CisgICAgeworICAgICAgaWYgKGNvbnN0IEZ1bmN0b3IqIGZwID0gdGFyZ2V0PEZ1bmN0b3I+KCkpCisgICAgICAgIHJldHVybiBmdW5jdGlvbl9lcXVhbCgqZnAsIGcpOworICAgICAgZWxzZSByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgQk9PU1RfRlVOQ1RJT05fRU5BQkxFX0lGX05PVF9JTlRFR1JBTChGdW5jdG9yLCBib29sKQorICAgIG9wZXJhdG9yIT0oRnVuY3RvciBnKSBjb25zdAorICAgIHsKKyAgICAgIGlmIChjb25zdCBGdW5jdG9yKiBmcCA9IHRhcmdldDxGdW5jdG9yPigpKQorICAgICAgICByZXR1cm4gIWZ1bmN0aW9uX2VxdWFsKCpmcCwgZyk7CisgICAgICBlbHNlIHJldHVybiB0cnVlOworICAgIH0KKyNlbmRpZgorCitwdWJsaWM6IC8vIHNob3VsZCBiZSBwcm90ZWN0ZWQsIGJ1dCBHQ0MgMi45NS4zIHdpbGwgZmFpbCB0byBhbGxvdyBhY2Nlc3MKKyAgZGV0YWlsOjpmdW5jdGlvbjo6dnRhYmxlX2Jhc2UqIGdldF92dGFibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8ZGV0YWlsOjpmdW5jdGlvbjo6dnRhYmxlX2Jhc2UqPigKKyAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHN0ZDo6c2l6ZV90Pih2dGFibGUpICYgfnN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PigweDAxKSk7CisgIH0KKworICBib29sIGhhc190cml2aWFsX2NvcHlfYW5kX2Rlc3Ryb3koKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjpzaXplX3Q+KHZ0YWJsZSkgJiAweDAxOworICB9CisKKyAgZGV0YWlsOjpmdW5jdGlvbjo6dnRhYmxlX2Jhc2UqIHZ0YWJsZTsKKyAgbXV0YWJsZSBkZXRhaWw6OmZ1bmN0aW9uOjpmdW5jdGlvbl9idWZmZXIgZnVuY3RvcjsKK307CisKKyNpZiBkZWZpbmVkKEJPT1NUX0NMQU5HKQorIyAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyMgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3dlYWstdnRhYmxlcyIKKyNlbmRpZgorLyoqCisgKiBUaGUgYmFkX2Z1bmN0aW9uX2NhbGwgZXhjZXB0aW9uIGNsYXNzIGlzIHRocm93biB3aGVuIGEgYm9vc3Q6OmZ1bmN0aW9uCisgKiBvYmplY3QgaXMgaW52b2tlZAorICovCitjbGFzcyBiYWRfZnVuY3Rpb25fY2FsbCA6IHB1YmxpYyBzdGQ6OnJ1bnRpbWVfZXJyb3IKK3sKK3B1YmxpYzoKKyAgYmFkX2Z1bmN0aW9uX2NhbGwoKSA6IHN0ZDo6cnVudGltZV9lcnJvcigiY2FsbCB0byBlbXB0eSBib29zdDo6ZnVuY3Rpb24iKSB7fQorfTsKKyNpZiBkZWZpbmVkKEJPT1NUX0NMQU5HKQorIyAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKKyNpZm5kZWYgQk9PU1RfTk9fU0ZJTkFFCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGZ1bmN0aW9uX2Jhc2UmIGYsCisgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDo6ZnVuY3Rpb246OnVzZWxlc3NfY2xlYXJfdHlwZSopCit7CisgIHJldHVybiBmLmVtcHR5KCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgZnVuY3Rpb25fYmFzZSYgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOjpmdW5jdGlvbjo6dXNlbGVzc19jbGVhcl90eXBlKikKK3sKKyAgcmV0dXJuICFmLmVtcHR5KCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oZGV0YWlsOjpmdW5jdGlvbjo6dXNlbGVzc19jbGVhcl90eXBlKiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnVuY3Rpb25fYmFzZSYgZikKK3sKKyAgcmV0dXJuIGYuZW1wdHkoKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShkZXRhaWw6OmZ1bmN0aW9uOjp1c2VsZXNzX2NsZWFyX3R5cGUqLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmdW5jdGlvbl9iYXNlJiBmKQoreworICByZXR1cm4gIWYuZW1wdHkoKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQk9PU1RfTk9fU0ZJTkFFCisvLyBDb21wYXJpc29ucyBiZXR3ZWVuIGJvb3N0OjpmdW5jdGlvbiBvYmplY3RzIGFuZCBhcmJpdHJhcnkgZnVuY3Rpb24gb2JqZWN0cwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBmdW5jdGlvbl9iYXNlJiBmLCBGdW5jdG9yIGcpCisgIHsKKyAgICB0eXBlZGVmIG1wbDo6Ym9vbF88KGlzX2ludGVncmFsPEZ1bmN0b3I+Ojp2YWx1ZSk+IGludGVncmFsOworICAgIHJldHVybiBkZXRhaWw6OmZ1bmN0aW9uOjpjb21wYXJlX2VxdWFsKGYsIGcsIDAsIGludGVncmFsKCkpOworICB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oRnVuY3RvciBnLCBjb25zdCBmdW5jdGlvbl9iYXNlJiBmKQorICB7CisgICAgdHlwZWRlZiBtcGw6OmJvb2xfPChpc19pbnRlZ3JhbDxGdW5jdG9yPjo6dmFsdWUpPiBpbnRlZ3JhbDsKKyAgICByZXR1cm4gZGV0YWlsOjpmdW5jdGlvbjo6Y29tcGFyZV9lcXVhbChmLCBnLCAwLCBpbnRlZ3JhbCgpKTsKKyAgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGZ1bmN0aW9uX2Jhc2UmIGYsIEZ1bmN0b3IgZykKKyAgeworICAgIHR5cGVkZWYgbXBsOjpib29sXzwoaXNfaW50ZWdyYWw8RnVuY3Rvcj46OnZhbHVlKT4gaW50ZWdyYWw7CisgICAgcmV0dXJuIGRldGFpbDo6ZnVuY3Rpb246OmNvbXBhcmVfbm90X2VxdWFsKGYsIGcsIDAsIGludGVncmFsKCkpOworICB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oRnVuY3RvciBnLCBjb25zdCBmdW5jdGlvbl9iYXNlJiBmKQorICB7CisgICAgdHlwZWRlZiBtcGw6OmJvb2xfPChpc19pbnRlZ3JhbDxGdW5jdG9yPjo6dmFsdWUpPiBpbnRlZ3JhbDsKKyAgICByZXR1cm4gZGV0YWlsOjpmdW5jdGlvbjo6Y29tcGFyZV9ub3RfZXF1YWwoZiwgZywgMCwgaW50ZWdyYWwoKSk7CisgIH0KKyNlbHNlCisKKyMgIGlmICEoZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA8PSAzKQorLy8gQ29tcGFyaXNvbnMgYmV0d2VlbiBib29zdDo6ZnVuY3Rpb24gb2JqZWN0cyBhbmQgYXJiaXRyYXJ5IGZ1bmN0aW9uCisvLyBvYmplY3RzLiBHQ0MgMy4zIGFuZCBiZWZvcmUgaGFzIGFuIG9ibm94aW91cyBidWcgdGhhdCBwcmV2ZW50cyB0aGlzCisvLyBmcm9tIHdvcmtpbmcuCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICBCT09TVF9GVU5DVElPTl9FTkFCTEVfSUZfTk9UX0lOVEVHUkFMKEZ1bmN0b3IsIGJvb2wpCisgIG9wZXJhdG9yPT0oY29uc3QgZnVuY3Rpb25fYmFzZSYgZiwgRnVuY3RvciBnKQorICB7CisgICAgaWYgKGNvbnN0IEZ1bmN0b3IqIGZwID0gZi50ZW1wbGF0ZSB0YXJnZXQ8RnVuY3Rvcj4oKSkKKyAgICAgIHJldHVybiBmdW5jdGlvbl9lcXVhbCgqZnAsIGcpOworICAgIGVsc2UgcmV0dXJuIGZhbHNlOworICB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgIEJPT1NUX0ZVTkNUSU9OX0VOQUJMRV9JRl9OT1RfSU5URUdSQUwoRnVuY3RvciwgYm9vbCkKKyAgb3BlcmF0b3I9PShGdW5jdG9yIGcsIGNvbnN0IGZ1bmN0aW9uX2Jhc2UmIGYpCisgIHsKKyAgICBpZiAoY29uc3QgRnVuY3RvciogZnAgPSBmLnRlbXBsYXRlIHRhcmdldDxGdW5jdG9yPigpKQorICAgICAgcmV0dXJuIGZ1bmN0aW9uX2VxdWFsKGcsICpmcCk7CisgICAgZWxzZSByZXR1cm4gZmFsc2U7CisgIH0KKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgQk9PU1RfRlVOQ1RJT05fRU5BQkxFX0lGX05PVF9JTlRFR1JBTChGdW5jdG9yLCBib29sKQorICBvcGVyYXRvciE9KGNvbnN0IGZ1bmN0aW9uX2Jhc2UmIGYsIEZ1bmN0b3IgZykKKyAgeworICAgIGlmIChjb25zdCBGdW5jdG9yKiBmcCA9IGYudGVtcGxhdGUgdGFyZ2V0PEZ1bmN0b3I+KCkpCisgICAgICByZXR1cm4gIWZ1bmN0aW9uX2VxdWFsKCpmcCwgZyk7CisgICAgZWxzZSByZXR1cm4gdHJ1ZTsKKyAgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICBCT09TVF9GVU5DVElPTl9FTkFCTEVfSUZfTk9UX0lOVEVHUkFMKEZ1bmN0b3IsIGJvb2wpCisgIG9wZXJhdG9yIT0oRnVuY3RvciBnLCBjb25zdCBmdW5jdGlvbl9iYXNlJiBmKQorICB7CisgICAgaWYgKGNvbnN0IEZ1bmN0b3IqIGZwID0gZi50ZW1wbGF0ZSB0YXJnZXQ8RnVuY3Rvcj4oKSkKKyAgICAgIHJldHVybiAhZnVuY3Rpb25fZXF1YWwoZywgKmZwKTsKKyAgICBlbHNlIHJldHVybiB0cnVlOworICB9CisjICBlbmRpZgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICBCT09TVF9GVU5DVElPTl9FTkFCTEVfSUZfTk9UX0lOVEVHUkFMKEZ1bmN0b3IsIGJvb2wpCisgIG9wZXJhdG9yPT0oY29uc3QgZnVuY3Rpb25fYmFzZSYgZiwgcmVmZXJlbmNlX3dyYXBwZXI8RnVuY3Rvcj4gZykKKyAgeworICAgIGlmIChjb25zdCBGdW5jdG9yKiBmcCA9IGYudGVtcGxhdGUgdGFyZ2V0PEZ1bmN0b3I+KCkpCisgICAgICByZXR1cm4gZnAgPT0gZy5nZXRfcG9pbnRlcigpOworICAgIGVsc2UgcmV0dXJuIGZhbHNlOworICB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgIEJPT1NUX0ZVTkNUSU9OX0VOQUJMRV9JRl9OT1RfSU5URUdSQUwoRnVuY3RvciwgYm9vbCkKKyAgb3BlcmF0b3I9PShyZWZlcmVuY2Vfd3JhcHBlcjxGdW5jdG9yPiBnLCBjb25zdCBmdW5jdGlvbl9iYXNlJiBmKQorICB7CisgICAgaWYgKGNvbnN0IEZ1bmN0b3IqIGZwID0gZi50ZW1wbGF0ZSB0YXJnZXQ8RnVuY3Rvcj4oKSkKKyAgICAgIHJldHVybiBnLmdldF9wb2ludGVyKCkgPT0gZnA7CisgICAgZWxzZSByZXR1cm4gZmFsc2U7CisgIH0KKwordGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgQk9PU1RfRlVOQ1RJT05fRU5BQkxFX0lGX05PVF9JTlRFR1JBTChGdW5jdG9yLCBib29sKQorICBvcGVyYXRvciE9KGNvbnN0IGZ1bmN0aW9uX2Jhc2UmIGYsIHJlZmVyZW5jZV93cmFwcGVyPEZ1bmN0b3I+IGcpCisgIHsKKyAgICBpZiAoY29uc3QgRnVuY3RvciogZnAgPSBmLnRlbXBsYXRlIHRhcmdldDxGdW5jdG9yPigpKQorICAgICAgcmV0dXJuIGZwICE9IGcuZ2V0X3BvaW50ZXIoKTsKKyAgICBlbHNlIHJldHVybiB0cnVlOworICB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgIEJPT1NUX0ZVTkNUSU9OX0VOQUJMRV9JRl9OT1RfSU5URUdSQUwoRnVuY3RvciwgYm9vbCkKKyAgb3BlcmF0b3IhPShyZWZlcmVuY2Vfd3JhcHBlcjxGdW5jdG9yPiBnLCBjb25zdCBmdW5jdGlvbl9iYXNlJiBmKQorICB7CisgICAgaWYgKGNvbnN0IEZ1bmN0b3IqIGZwID0gZi50ZW1wbGF0ZSB0YXJnZXQ8RnVuY3Rvcj4oKSkKKyAgICAgIHJldHVybiBnLmdldF9wb2ludGVyKCkgIT0gZnA7CisgICAgZWxzZSByZXR1cm4gdHJ1ZTsKKyAgfQorCisjZW5kaWYgLy8gQ29tcGlsZXIgc3VwcG9ydGluZyBTRklOQUUKKworbmFtZXNwYWNlIGRldGFpbCB7CisgIG5hbWVzcGFjZSBmdW5jdGlvbiB7CisgICAgaW5saW5lIGJvb2wgaGFzX2VtcHR5X3RhcmdldChjb25zdCBmdW5jdGlvbl9iYXNlKiBmKQorICAgIHsKKyAgICAgIHJldHVybiBmLT5lbXB0eSgpOworICAgIH0KKworI2lmIEJPT1NUX1dPUktBUk9VTkQoQk9PU1RfTVNWQywgPD0gMTMxMCkKKyAgICBpbmxpbmUgYm9vbCBoYXNfZW1wdHlfdGFyZ2V0KGNvbnN0IHZvaWQqKQorICAgIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisjZWxzZQorICAgIGlubGluZSBib29sIGhhc19lbXB0eV90YXJnZXQoLi4uKQorICAgIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisjZW5kaWYKKyAgfSAvLyBlbmQgbmFtZXNwYWNlIGZ1bmN0aW9uCit9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIGVuZCBuYW1lc3BhY2UgYm9vc3QKKworI3VuZGVmIEJPT1NUX0ZVTkNUSU9OX0VOQUJMRV9JRl9OT1RfSU5URUdSQUwKKworI2lmIGRlZmluZWQoQk9PU1RfTVNWQykKKyMgICBwcmFnbWEgd2FybmluZyggcG9wICkKKyNlbmRpZgorCisjZW5kaWYgLy8gQk9PU1RfRlVOQ1RJT05fQkFTRV9IRUFERVIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fZndkLmhwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fZndkLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzliNTA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9mdW5jdGlvbl9md2QuaHBwCkBAIC0wLDAgKzEsNjkgQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKy8vICBDb3B5cmlnaHQgKEMpIERvdWdsYXMgR3JlZ29yIDIwMDgKKy8vCisvLyAgVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdAorLy8gIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZQorLy8gIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKy8vCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisjaWZuZGVmIEJPT1NUX0ZVTkNUSU9OX0ZXRF9IUFAKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fRldEX0hQUAorI2luY2x1ZGUgPGJvb3N0L2NvbmZpZy5ocHA+CisKKyNpZiBkZWZpbmVkKF9fc2dpKSAmJiBkZWZpbmVkKF9DT01QSUxFUl9WRVJTSU9OKSAmJiBfQ09NUElMRVJfVkVSU0lPTiA8PSA3MzAgJiYgIWRlZmluZWQoQk9PU1RfU1RSSUNUX0NPTkZJRykKKy8vIFdvcmsgYXJvdW5kIGEgY29tcGlsZXIgYnVnLgorLy8gYm9vc3Q6OnB5dGhvbjo6b2JqZWN0czo6ZnVuY3Rpb24gaGFzIHRvIGJlIHNlZW4gYnkgdGhlIGNvbXBpbGVyIGJlZm9yZSB0aGUKKy8vIGJvb3N0OjpmdW5jdGlvbiBjbGFzcyB0ZW1wbGF0ZS4KK25hbWVzcGFjZSBib29zdCB7IG5hbWVzcGFjZSBweXRob24geyBuYW1lc3BhY2Ugb2JqZWN0cyB7CisgIGNsYXNzIGZ1bmN0aW9uOworfX19CisjZW5kaWYKKworI2lmIGRlZmluZWQoQk9PU1RfQkNCX1BBUlRJQUxfU1BFQ0lBTElaQVRJT05fQlVHKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgfHwgIShkZWZpbmVkKEJPT1NUX1NUUklDVF9DT05GSUcpIHx8ICFkZWZpbmVkKF9fU1VOUFJPX0NDKSB8fCBfX1NVTlBST19DQyA+IDB4NTQwKQorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX05PX0ZVTkNUSU9OX1RZUEVfU1lOVEFYCisjZW5kaWYKKworbmFtZXNwYWNlIGJvb3N0IHsKKyAgY2xhc3MgYmFkX2Z1bmN0aW9uX2NhbGw7CisKKyNpZiAhZGVmaW5lZChCT09TVF9GVU5DVElPTl9OT19GVU5DVElPTl9UWVBFX1NZTlRBWCkKKyAgLy8gUHJlZmVycmVkIHN5bnRheAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTaWduYXR1cmU+IGNsYXNzIGZ1bmN0aW9uOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFNpZ25hdHVyZT4KKyAgaW5saW5lIHZvaWQgc3dhcChmdW5jdGlvbjxTaWduYXR1cmU+JiBmMSwgZnVuY3Rpb248U2lnbmF0dXJlPiYgZjIpCisgIHsKKyAgICBmMS5zd2FwKGYyKTsKKyAgfQorI2VuZGlmIC8vIGhhdmUgcGFydGlhbCBzcGVjaWFsaXphdGlvbgorCisgIC8vIFBvcnRhYmxlIHN5bnRheAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBSPiBjbGFzcyBmdW5jdGlvbjA7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQxPiBjbGFzcyBmdW5jdGlvbjE7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4gY2xhc3MgZnVuY3Rpb24yOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPiBjbGFzcyBmdW5jdGlvbjM7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0PiAKKyAgICBjbGFzcyBmdW5jdGlvbjQ7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LAorICAgICAgICAgICB0eXBlbmFtZSBUNT4gCisgICAgY2xhc3MgZnVuY3Rpb241OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwKKyAgICAgICAgICAgdHlwZW5hbWUgVDUsIHR5cGVuYW1lIFQ2PiAKKyAgICBjbGFzcyBmdW5jdGlvbjY7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LAorICAgICAgICAgICB0eXBlbmFtZSBUNSwgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3PiAKKyAgICBjbGFzcyBmdW5jdGlvbjc7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LAorICAgICAgICAgICB0eXBlbmFtZSBUNSwgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOD4gCisgICAgY2xhc3MgZnVuY3Rpb244OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzLCB0eXBlbmFtZSBUNCwKKyAgICAgICAgICAgdHlwZW5hbWUgVDUsIHR5cGVuYW1lIFQ2LCB0eXBlbmFtZSBUNywgdHlwZW5hbWUgVDgsIHR5cGVuYW1lIFQ5PiAKKyAgICBjbGFzcyBmdW5jdGlvbjk7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0LAorICAgICAgICAgICB0eXBlbmFtZSBUNSwgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksCisgICAgICAgICAgIHR5cGVuYW1lIFQxMD4gCisgICAgY2xhc3MgZnVuY3Rpb24xMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdGVtcGxhdGUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3N2I2MGEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3RlbXBsYXRlLmhwcApAQCAtMCwwICsxLDExOTEgQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKworLy8gIENvcHlyaWdodCBEb3VnbGFzIEdyZWdvciAyMDAxLTIwMDYKKy8vICBDb3B5cmlnaHQgRW1pbCBEb3RjaGV2c2tpIDIwMDcKKy8vICBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorLy8gIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKworLy8gTm90ZTogdGhpcyBoZWFkZXIgaXMgYSBoZWFkZXIgdGVtcGxhdGUgYW5kIG11c3QgTk9UIGhhdmUgbXVsdGlwbGUtaW5jbHVzaW9uCisvLyBwcm90ZWN0aW9uLgorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2RldGFpbC9wcm9sb2d1ZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZGV0YWlsL25vX2V4Y2VwdGlvbnNfc3VwcG9ydC5ocHA+CisKKyNpZiBkZWZpbmVkKEJPT1NUX01TVkMpCisjICAgcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorIyAgIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDEyNyApIC8vICJjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50IgorI2VuZGlmCisKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfUEFSTVMgQk9PU1RfUFBfRU5VTV9QQVJBTVMoQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MsIHR5cGVuYW1lIFQpCisKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfQVJHUyBCT09TVF9QUF9FTlVNX1BBUkFNUyhCT09TVF9GVU5DVElPTl9OVU1fQVJHUywgVCkKKworI2RlZmluZSBCT09TVF9GVU5DVElPTl9QQVJNKEosSSxEKSBCT09TVF9QUF9DQVQoVCxJKSBCT09TVF9QUF9DQVQoYSxJKQorCisjZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX1BBUk1TIEJPT1NUX1BQX0VOVU0oQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MsQk9PU1RfRlVOQ1RJT05fUEFSTSxCT09TVF9QUF9FTVBUWSkKKworI2lmZGVmIEJPT1NUX05PX0NYWDExX1JWQUxVRV9SRUZFUkVOQ0VTCisjICAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX0FSR1MgQk9PU1RfUFBfRU5VTV9QQVJBTVMoQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MsIGEpCisjZWxzZQorIyAgIGluY2x1ZGUgPGJvb3N0L21vdmUvdXRpbGl0eV9jb3JlLmhwcD4KKyMgICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fQVJHKEosSSxEKSA6OmJvb3N0Ojpmb3J3YXJkPCBCT09TVF9QUF9DQVQoVCxJKSA+KEJPT1NUX1BQX0NBVChhLEkpKQorIyAgIGRlZmluZSBCT09TVF9GVU5DVElPTl9BUkdTIEJPT1NUX1BQX0VOVU0oQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MsQk9PU1RfRlVOQ1RJT05fQVJHLEJPT1NUX1BQX0VNUFRZKQorI2VuZGlmCisKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fQVJHX1RZUEUoSixJLEQpIFwKKyAgdHlwZWRlZiBCT09TVF9QUF9DQVQoVCxJKSBCT09TVF9QUF9DQVQoQk9PU1RfUFBfQ0FUKGFyZywgQk9PU1RfUFBfSU5DKEkpKSxfdHlwZSk7CisKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fQVJHX1RZUEVTIEJPT1NUX1BQX1JFUEVBVChCT09TVF9GVU5DVElPTl9OVU1fQVJHUyxCT09TVF9GVU5DVElPTl9BUkdfVFlQRSxCT09TVF9QUF9FTVBUWSkKKworLy8gQ29tbWEgaWYgbm9uemVybyBudW1iZXIgb2YgYXJndW1lbnRzCisjaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPT0gMAorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX0NPTU1BCisjZWxzZQorIyAgZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX0NPTU1BICwKKyNlbmRpZiAvLyBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA+IDAKKworLy8gQ2xhc3MgbmFtZXMgdXNlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIGNvZGUKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fRlVOQ1RJT04gQk9PU1RfSk9JTihmdW5jdGlvbixCT09TVF9GVU5DVElPTl9OVU1fQVJHUykKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fRlVOQ1RJT05fSU5WT0tFUiBcCisgIEJPT1NUX0pPSU4oZnVuY3Rpb25faW52b2tlcixCT09TVF9GVU5DVElPTl9OVU1fQVJHUykKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fVk9JRF9GVU5DVElPTl9JTlZPS0VSIFwKKyAgQk9PU1RfSk9JTih2b2lkX2Z1bmN0aW9uX2ludm9rZXIsQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MpCisjZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OX09CSl9JTlZPS0VSIFwKKyAgQk9PU1RfSk9JTihmdW5jdGlvbl9vYmpfaW52b2tlcixCT09TVF9GVU5DVElPTl9OVU1fQVJHUykKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fVk9JRF9GVU5DVElPTl9PQkpfSU5WT0tFUiBcCisgIEJPT1NUX0pPSU4odm9pZF9mdW5jdGlvbl9vYmpfaW52b2tlcixCT09TVF9GVU5DVElPTl9OVU1fQVJHUykKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fRlVOQ1RJT05fUkVGX0lOVk9LRVIgXAorICBCT09TVF9KT0lOKGZ1bmN0aW9uX3JlZl9pbnZva2VyLEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTKQorI2RlZmluZSBCT09TVF9GVU5DVElPTl9WT0lEX0ZVTkNUSU9OX1JFRl9JTlZPS0VSIFwKKyAgQk9PU1RfSk9JTih2b2lkX2Z1bmN0aW9uX3JlZl9pbnZva2VyLEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTKQorI2RlZmluZSBCT09TVF9GVU5DVElPTl9NRU1CRVJfSU5WT0tFUiBcCisgIEJPT1NUX0pPSU4oZnVuY3Rpb25fbWVtX2ludm9rZXIsQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MpCisjZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX1ZPSURfTUVNQkVSX0lOVk9LRVIgXAorICBCT09TVF9KT0lOKGZ1bmN0aW9uX3ZvaWRfbWVtX2ludm9rZXIsQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MpCisjZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX0dFVF9GVU5DVElPTl9JTlZPS0VSIFwKKyAgQk9PU1RfSk9JTihnZXRfZnVuY3Rpb25faW52b2tlcixCT09TVF9GVU5DVElPTl9OVU1fQVJHUykKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fR0VUX0ZVTkNUSU9OX09CSl9JTlZPS0VSIFwKKyAgQk9PU1RfSk9JTihnZXRfZnVuY3Rpb25fb2JqX2ludm9rZXIsQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MpCisjZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX0dFVF9GVU5DVElPTl9SRUZfSU5WT0tFUiBcCisgIEJPT1NUX0pPSU4oZ2V0X2Z1bmN0aW9uX3JlZl9pbnZva2VyLEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTKQorI2RlZmluZSBCT09TVF9GVU5DVElPTl9HRVRfTUVNQkVSX0lOVk9LRVIgXAorICBCT09TVF9KT0lOKGdldF9tZW1iZXJfaW52b2tlcixCT09TVF9GVU5DVElPTl9OVU1fQVJHUykKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fR0VUX0lOVk9LRVIgXAorICBCT09TVF9KT0lOKGdldF9pbnZva2VyLEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTKQorI2RlZmluZSBCT09TVF9GVU5DVElPTl9WVEFCTEUgQk9PU1RfSk9JTihiYXNpY192dGFibGUsQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MpCisKKyNpZm5kZWYgQk9PU1RfTk9fVk9JRF9SRVRVUk5TCisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fVk9JRF9SRVRVUk5fVFlQRSB2b2lkCisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fUkVUVVJOKFgpIFgKKyNlbHNlCisjICBkZWZpbmUgQk9PU1RfRlVOQ1RJT05fVk9JRF9SRVRVUk5fVFlQRSBib29zdDo6ZGV0YWlsOjpmdW5jdGlvbjo6dW51c2FibGUKKyMgIGRlZmluZSBCT09TVF9GVU5DVElPTl9SRVRVUk4oWCkgWDsgcmV0dXJuIEJPT1NUX0ZVTkNUSU9OX1ZPSURfUkVUVVJOX1RZUEUgKCkKKyNlbmRpZgorCituYW1lc3BhY2UgYm9vc3QgeworICBuYW1lc3BhY2UgZGV0YWlsIHsKKyAgICBuYW1lc3BhY2UgZnVuY3Rpb24geworICAgICAgdGVtcGxhdGU8CisgICAgICAgIHR5cGVuYW1lIEZ1bmN0aW9uUHRyLAorICAgICAgICB0eXBlbmFtZSBSIEJPT1NUX0ZVTkNUSU9OX0NPTU1BCisgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX1BBUk1TCisgICAgICAgID4KKyAgICAgIHN0cnVjdCBCT09TVF9GVU5DVElPTl9GVU5DVElPTl9JTlZPS0VSCisgICAgICB7CisgICAgICAgIHN0YXRpYyBSIGludm9rZShmdW5jdGlvbl9idWZmZXImIGZ1bmN0aW9uX3B0ciBCT09TVF9GVU5DVElPTl9DT01NQQorICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfRlVOQ1RJT05fUEFSTVMpCisgICAgICAgIHsKKyAgICAgICAgICBGdW5jdGlvblB0ciBmID0gcmVpbnRlcnByZXRfY2FzdDxGdW5jdGlvblB0cj4oZnVuY3Rpb25fcHRyLm1lbWJlcnMuZnVuY19wdHIpOworICAgICAgICAgIHJldHVybiBmKEJPT1NUX0ZVTkNUSU9OX0FSR1MpOworICAgICAgICB9CisgICAgICB9OworCisgICAgICB0ZW1wbGF0ZTwKKyAgICAgICAgdHlwZW5hbWUgRnVuY3Rpb25QdHIsCisgICAgICAgIHR5cGVuYW1lIFIgQk9PU1RfRlVOQ1RJT05fQ09NTUEKKyAgICAgICAgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfUEFSTVMKKyAgICAgICAgPgorICAgICAgc3RydWN0IEJPT1NUX0ZVTkNUSU9OX1ZPSURfRlVOQ1RJT05fSU5WT0tFUgorICAgICAgeworICAgICAgICBzdGF0aWMgQk9PU1RfRlVOQ1RJT05fVk9JRF9SRVRVUk5fVFlQRQorICAgICAgICBpbnZva2UoZnVuY3Rpb25fYnVmZmVyJiBmdW5jdGlvbl9wdHIgQk9PU1RfRlVOQ1RJT05fQ09NTUEKKyAgICAgICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1BBUk1TKQorCisgICAgICAgIHsKKyAgICAgICAgICBGdW5jdGlvblB0ciBmID0gcmVpbnRlcnByZXRfY2FzdDxGdW5jdGlvblB0cj4oZnVuY3Rpb25fcHRyLm1lbWJlcnMuZnVuY19wdHIpOworICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1JFVFVSTihmKEJPT1NUX0ZVTkNUSU9OX0FSR1MpKTsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgdGVtcGxhdGU8CisgICAgICAgIHR5cGVuYW1lIEZ1bmN0aW9uT2JqLAorICAgICAgICB0eXBlbmFtZSBSIEJPT1NUX0ZVTkNUSU9OX0NPTU1BCisgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX1BBUk1TCisgICAgICA+CisgICAgICBzdHJ1Y3QgQk9PU1RfRlVOQ1RJT05fRlVOQ1RJT05fT0JKX0lOVk9LRVIKKyAgICAgIHsKKyAgICAgICAgc3RhdGljIFIgaW52b2tlKGZ1bmN0aW9uX2J1ZmZlciYgZnVuY3Rpb25fb2JqX3B0ciBCT09TVF9GVU5DVElPTl9DT01NQQorICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfRlVOQ1RJT05fUEFSTVMpCisKKyAgICAgICAgeworICAgICAgICAgIEZ1bmN0aW9uT2JqKiBmOworICAgICAgICAgIGlmIChmdW5jdGlvbl9hbGxvd3Nfc21hbGxfb2JqZWN0X29wdGltaXphdGlvbjxGdW5jdGlvbk9iaj46OnZhbHVlKQorICAgICAgICAgICAgZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8RnVuY3Rpb25PYmoqPihmdW5jdGlvbl9vYmpfcHRyLmRhdGEpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGYgPSByZWludGVycHJldF9jYXN0PEZ1bmN0aW9uT2JqKj4oZnVuY3Rpb25fb2JqX3B0ci5tZW1iZXJzLm9ial9wdHIpOworICAgICAgICAgIHJldHVybiAoKmYpKEJPT1NUX0ZVTkNUSU9OX0FSR1MpOworICAgICAgICB9CisgICAgICB9OworCisgICAgICB0ZW1wbGF0ZTwKKyAgICAgICAgdHlwZW5hbWUgRnVuY3Rpb25PYmosCisgICAgICAgIHR5cGVuYW1lIFIgQk9PU1RfRlVOQ1RJT05fQ09NTUEKKyAgICAgICAgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfUEFSTVMKKyAgICAgID4KKyAgICAgIHN0cnVjdCBCT09TVF9GVU5DVElPTl9WT0lEX0ZVTkNUSU9OX09CSl9JTlZPS0VSCisgICAgICB7CisgICAgICAgIHN0YXRpYyBCT09TVF9GVU5DVElPTl9WT0lEX1JFVFVSTl9UWVBFCisgICAgICAgIGludm9rZShmdW5jdGlvbl9idWZmZXImIGZ1bmN0aW9uX29ial9wdHIgQk9PU1RfRlVOQ1RJT05fQ09NTUEKKyAgICAgICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1BBUk1TKQorCisgICAgICAgIHsKKyAgICAgICAgICBGdW5jdGlvbk9iaiogZjsKKyAgICAgICAgICBpZiAoZnVuY3Rpb25fYWxsb3dzX3NtYWxsX29iamVjdF9vcHRpbWl6YXRpb248RnVuY3Rpb25PYmo+Ojp2YWx1ZSkKKyAgICAgICAgICAgIGYgPSByZWludGVycHJldF9jYXN0PEZ1bmN0aW9uT2JqKj4oZnVuY3Rpb25fb2JqX3B0ci5kYXRhKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBmID0gcmVpbnRlcnByZXRfY2FzdDxGdW5jdGlvbk9iaio+KGZ1bmN0aW9uX29ial9wdHIubWVtYmVycy5vYmpfcHRyKTsKKyAgICAgICAgICBCT09TVF9GVU5DVElPTl9SRVRVUk4oKCpmKShCT09TVF9GVU5DVElPTl9BUkdTKSk7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIHRlbXBsYXRlPAorICAgICAgICB0eXBlbmFtZSBGdW5jdGlvbk9iaiwKKyAgICAgICAgdHlwZW5hbWUgUiBCT09TVF9GVU5DVElPTl9DT01NQQorICAgICAgICBCT09TVF9GVU5DVElPTl9URU1QTEFURV9QQVJNUworICAgICAgPgorICAgICAgc3RydWN0IEJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OX1JFRl9JTlZPS0VSCisgICAgICB7CisgICAgICAgIHN0YXRpYyBSIGludm9rZShmdW5jdGlvbl9idWZmZXImIGZ1bmN0aW9uX29ial9wdHIgQk9PU1RfRlVOQ1RJT05fQ09NTUEKKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1BBUk1TKQorCisgICAgICAgIHsKKyAgICAgICAgICBGdW5jdGlvbk9iaiogZiA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEZ1bmN0aW9uT2JqKj4oZnVuY3Rpb25fb2JqX3B0ci5tZW1iZXJzLm9ial9wdHIpOworICAgICAgICAgIHJldHVybiAoKmYpKEJPT1NUX0ZVTkNUSU9OX0FSR1MpOworICAgICAgICB9CisgICAgICB9OworCisgICAgICB0ZW1wbGF0ZTwKKyAgICAgICAgdHlwZW5hbWUgRnVuY3Rpb25PYmosCisgICAgICAgIHR5cGVuYW1lIFIgQk9PU1RfRlVOQ1RJT05fQ09NTUEKKyAgICAgICAgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfUEFSTVMKKyAgICAgID4KKyAgICAgIHN0cnVjdCBCT09TVF9GVU5DVElPTl9WT0lEX0ZVTkNUSU9OX1JFRl9JTlZPS0VSCisgICAgICB7CisgICAgICAgIHN0YXRpYyBCT09TVF9GVU5DVElPTl9WT0lEX1JFVFVSTl9UWVBFCisgICAgICAgIGludm9rZShmdW5jdGlvbl9idWZmZXImIGZ1bmN0aW9uX29ial9wdHIgQk9PU1RfRlVOQ1RJT05fQ09NTUEKKyAgICAgICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1BBUk1TKQorCisgICAgICAgIHsKKyAgICAgICAgICBGdW5jdGlvbk9iaiogZiA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEZ1bmN0aW9uT2JqKj4oZnVuY3Rpb25fb2JqX3B0ci5tZW1iZXJzLm9ial9wdHIpOworICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1JFVFVSTigoKmYpKEJPT1NUX0ZVTkNUSU9OX0FSR1MpKTsKKyAgICAgICAgfQorICAgICAgfTsKKworI2lmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID4gMAorICAgICAgLyogSGFuZGxlIGludm9jYXRpb24gb2YgbWVtYmVyIHBvaW50ZXJzLiAqLworICAgICAgdGVtcGxhdGU8CisgICAgICAgIHR5cGVuYW1lIE1lbWJlclB0ciwKKyAgICAgICAgdHlwZW5hbWUgUiBCT09TVF9GVU5DVElPTl9DT01NQQorICAgICAgICBCT09TVF9GVU5DVElPTl9URU1QTEFURV9QQVJNUworICAgICAgPgorICAgICAgc3RydWN0IEJPT1NUX0ZVTkNUSU9OX01FTUJFUl9JTlZPS0VSCisgICAgICB7CisgICAgICAgIHN0YXRpYyBSIGludm9rZShmdW5jdGlvbl9idWZmZXImIGZ1bmN0aW9uX29ial9wdHIgQk9PU1RfRlVOQ1RJT05fQ09NTUEKKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1BBUk1TKQorCisgICAgICAgIHsKKyAgICAgICAgICBNZW1iZXJQdHIqIGYgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxNZW1iZXJQdHIqPihmdW5jdGlvbl9vYmpfcHRyLmRhdGEpOworICAgICAgICAgIHJldHVybiBib29zdDo6bWVtX2ZuKCpmKShCT09TVF9GVU5DVElPTl9BUkdTKTsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgdGVtcGxhdGU8CisgICAgICAgIHR5cGVuYW1lIE1lbWJlclB0ciwKKyAgICAgICAgdHlwZW5hbWUgUiBCT09TVF9GVU5DVElPTl9DT01NQQorICAgICAgICBCT09TVF9GVU5DVElPTl9URU1QTEFURV9QQVJNUworICAgICAgPgorICAgICAgc3RydWN0IEJPT1NUX0ZVTkNUSU9OX1ZPSURfTUVNQkVSX0lOVk9LRVIKKyAgICAgIHsKKyAgICAgICAgc3RhdGljIEJPT1NUX0ZVTkNUSU9OX1ZPSURfUkVUVVJOX1RZUEUKKyAgICAgICAgaW52b2tlKGZ1bmN0aW9uX2J1ZmZlciYgZnVuY3Rpb25fb2JqX3B0ciBCT09TVF9GVU5DVElPTl9DT01NQQorICAgICAgICAgICAgICAgQk9PU1RfRlVOQ1RJT05fUEFSTVMpCisKKyAgICAgICAgeworICAgICAgICAgIE1lbWJlclB0ciogZiA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PE1lbWJlclB0cio+KGZ1bmN0aW9uX29ial9wdHIuZGF0YSk7CisgICAgICAgICAgQk9PU1RfRlVOQ1RJT05fUkVUVVJOKGJvb3N0OjptZW1fZm4oKmYpKEJPT1NUX0ZVTkNUSU9OX0FSR1MpKTsKKyAgICAgICAgfQorICAgICAgfTsKKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTwKKyAgICAgICAgdHlwZW5hbWUgRnVuY3Rpb25QdHIsCisgICAgICAgIHR5cGVuYW1lIFIgQk9PU1RfRlVOQ1RJT05fQ09NTUEKKyAgICAgICAgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfUEFSTVMKKyAgICAgID4KKyAgICAgIHN0cnVjdCBCT09TVF9GVU5DVElPTl9HRVRfRlVOQ1RJT05fSU5WT0tFUgorICAgICAgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIG1wbDo6aWZfYzwoaXNfdm9pZDxSPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1ZPSURfRlVOQ1RJT05fSU5WT0tFUjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSIEJPT1NUX0ZVTkNUSU9OX0NPTU1BCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9GVU5DVElPTl9GVU5DVElPTl9JTlZPS0VSPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgQk9PU1RfRlVOQ1RJT05fQ09NTUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9GVU5DVElPTl9URU1QTEFURV9BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSB0eXBlOworICAgICAgfTsKKworICAgICAgdGVtcGxhdGU8CisgICAgICAgIHR5cGVuYW1lIEZ1bmN0aW9uT2JqLAorICAgICAgICB0eXBlbmFtZSBSIEJPT1NUX0ZVTkNUSU9OX0NPTU1BCisgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX1BBUk1TCisgICAgICAgPgorICAgICAgc3RydWN0IEJPT1NUX0ZVTkNUSU9OX0dFVF9GVU5DVElPTl9PQkpfSU5WT0tFUgorICAgICAgeworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIG1wbDo6aWZfYzwoaXNfdm9pZDxSPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1ZPSURfRlVOQ1RJT05fT0JKX0lOVk9LRVI8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25PYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUiBCT09TVF9GVU5DVElPTl9DT01NQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX0FSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfRlVOQ1RJT05fRlVOQ1RJT05fT0JKX0lOVk9LRVI8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25PYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUiBCT09TVF9GVU5DVElPTl9DT01NQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX0FSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlIHR5cGU7CisgICAgICB9OworCisgICAgICB0ZW1wbGF0ZTwKKyAgICAgICAgdHlwZW5hbWUgRnVuY3Rpb25PYmosCisgICAgICAgIHR5cGVuYW1lIFIgQk9PU1RfRlVOQ1RJT05fQ09NTUEKKyAgICAgICAgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfUEFSTVMKKyAgICAgICA+CisgICAgICBzdHJ1Y3QgQk9PU1RfRlVOQ1RJT05fR0VUX0ZVTkNUSU9OX1JFRl9JTlZPS0VSCisgICAgICB7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbXBsOjppZl9jPChpc192b2lkPFI+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfRlVOQ1RJT05fVk9JRF9GVU5DVElPTl9SRUZfSU5WT0tFUjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbk9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSIEJPT1NUX0ZVTkNUSU9OX0NPTU1BCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9GVU5DVElPTl9GVU5DVElPTl9SRUZfSU5WT0tFUjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbk9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSIEJPT1NUX0ZVTkNUSU9OX0NPTU1BCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgICAgICAgID46OnR5cGUgdHlwZTsKKyAgICAgIH07CisKKyNpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA+IDAKKyAgICAgIC8qIFJldHJpZXZlIHRoZSBhcHByb3ByaWF0ZSBpbnZva2VyIGZvciBhIG1lbWJlciBwb2ludGVyLiAgKi8KKyAgICAgIHRlbXBsYXRlPAorICAgICAgICB0eXBlbmFtZSBNZW1iZXJQdHIsCisgICAgICAgIHR5cGVuYW1lIFIgQk9PU1RfRlVOQ1RJT05fQ09NTUEKKyAgICAgICAgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfUEFSTVMKKyAgICAgICA+CisgICAgICBzdHJ1Y3QgQk9PU1RfRlVOQ1RJT05fR0VUX01FTUJFUl9JTlZPS0VSCisgICAgICB7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgbXBsOjppZl9jPChpc192b2lkPFI+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfRlVOQ1RJT05fVk9JRF9NRU1CRVJfSU5WT0tFUjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUiBCT09TVF9GVU5DVElPTl9DT01NQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX0FSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfRlVOQ1RJT05fTUVNQkVSX0lOVk9LRVI8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgQk9PU1RfRlVOQ1RJT05fQ09NTUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9GVU5DVElPTl9URU1QTEFURV9BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZSB0eXBlOworICAgICAgfTsKKyNlbmRpZgorCisgICAgICAvKiBHaXZlbiB0aGUgdGFnIHJldHVybmVkIGJ5IGdldF9mdW5jdGlvbl90YWcsIHJldHJpZXZlIHRoZQorICAgICAgICAgYWN0dWFsIGludm9rZXIgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiBmdW5jdGlvbgorICAgICAgICAgb2JqZWN0LgorCisgICAgICAgICBFYWNoIHNwZWNpYWxpemF0aW9uIGNvbnRhaW5zIGFuICJhcHBseSIgbmVzdGVkIGNsYXNzIHRlbXBsYXRlCisgICAgICAgICB0aGF0IGFjY2VwdHMgdGhlIGZ1bmN0aW9uIG9iamVjdCwgcmV0dXJuIHR5cGUsIGZ1bmN0aW9uCisgICAgICAgICBhcmd1bWVudCB0eXBlcywgYW5kIGFsbG9jYXRvci4gVGhlIHJlc3VsdGluZyAiYXBwbHkiIGNsYXNzCisgICAgICAgICBjb250YWlucyB0d28gdHlwZWRlZnMsICJpbnZva2VyX3R5cGUiIGFuZCAibWFuYWdlcl90eXBlIiwKKyAgICAgICAgIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlIGludm9rZXIgYW5kIG1hbmFnZXIgdHlwZXMuICovCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUYWc+CisgICAgICBzdHJ1Y3QgQk9PU1RfRlVOQ1RJT05fR0VUX0lOVk9LRVIgeyB9OworCisgICAgICAvKiBSZXRyaWV2ZSB0aGUgaW52b2tlciBmb3IgYSBmdW5jdGlvbiBwb2ludGVyLiAqLworICAgICAgdGVtcGxhdGU8PgorICAgICAgc3RydWN0IEJPT1NUX0ZVTkNUSU9OX0dFVF9JTlZPS0VSPGZ1bmN0aW9uX3B0cl90YWc+CisgICAgICB7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uUHRyLAorICAgICAgICAgICAgICAgICB0eXBlbmFtZSBSIEJPT1NUX0ZVTkNUSU9OX0NPTU1BIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX1BBUk1TPgorICAgICAgICBzdHJ1Y3QgYXBwbHkKKyAgICAgICAgeworICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQk9PU1RfRlVOQ1RJT05fR0VUX0ZVTkNUSU9OX0lOVk9LRVI8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSIEJPT1NUX0ZVTkNUSU9OX0NPTU1BCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX0FSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICAgICAgICAgIGludm9rZXJfdHlwZTsKKworICAgICAgICAgIHR5cGVkZWYgZnVuY3Rvcl9tYW5hZ2VyPEZ1bmN0aW9uUHRyPiBtYW5hZ2VyX3R5cGU7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rpb25QdHIsCisgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFIgQk9PU1RfRlVOQ1RJT05fQ09NTUEgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfUEFSTVMsCisgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICAgICAgc3RydWN0IGFwcGx5X2EKKyAgICAgICAgeworICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQk9PU1RfRlVOQ1RJT05fR0VUX0ZVTkNUSU9OX0lOVk9LRVI8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSIEJPT1NUX0ZVTkNUSU9OX0NPTU1BCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX0FSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICAgICAgICAgIGludm9rZXJfdHlwZTsKKworICAgICAgICAgIHR5cGVkZWYgZnVuY3Rvcl9tYW5hZ2VyPEZ1bmN0aW9uUHRyPiBtYW5hZ2VyX3R5cGU7CisgICAgICAgIH07CisgICAgICB9OworCisjaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPiAwCisgICAgICAvKiBSZXRyaWV2ZSB0aGUgaW52b2tlciBmb3IgYSBtZW1iZXIgcG9pbnRlci4gKi8KKyAgICAgIHRlbXBsYXRlPD4KKyAgICAgIHN0cnVjdCBCT09TVF9GVU5DVElPTl9HRVRfSU5WT0tFUjxtZW1iZXJfcHRyX3RhZz4KKyAgICAgIHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWVtYmVyUHRyLAorICAgICAgICAgICAgICAgICB0eXBlbmFtZSBSIEJPT1NUX0ZVTkNUSU9OX0NPTU1BIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX1BBUk1TPgorICAgICAgICBzdHJ1Y3QgYXBwbHkKKyAgICAgICAgeworICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQk9PU1RfRlVOQ1RJT05fR0VUX01FTUJFUl9JTlZPS0VSPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgQk9PU1RfRlVOQ1RJT05fQ09NTUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgICAgPjo6dHlwZQorICAgICAgICAgICAgaW52b2tlcl90eXBlOworCisgICAgICAgICAgdHlwZWRlZiBmdW5jdG9yX21hbmFnZXI8TWVtYmVyUHRyPiBtYW5hZ2VyX3R5cGU7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWVtYmVyUHRyLAorICAgICAgICAgICAgICAgICB0eXBlbmFtZSBSIEJPT1NUX0ZVTkNUSU9OX0NPTU1BIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX1BBUk1TLAorICAgICAgICAgICAgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgICAgIHN0cnVjdCBhcHBseV9hCisgICAgICAgIHsKKyAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIEJPT1NUX0ZVTkNUSU9OX0dFVF9NRU1CRVJfSU5WT0tFUjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSIEJPT1NUX0ZVTkNUSU9OX0NPTU1BCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX0FSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICAgICAgICAgIGludm9rZXJfdHlwZTsKKworICAgICAgICAgIHR5cGVkZWYgZnVuY3Rvcl9tYW5hZ2VyPE1lbWJlclB0cj4gbWFuYWdlcl90eXBlOworICAgICAgICB9OworICAgICAgfTsKKyNlbmRpZgorCisgICAgICAvKiBSZXRyaWV2ZSB0aGUgaW52b2tlciBmb3IgYSBmdW5jdGlvbiBvYmplY3QuICovCisgICAgICB0ZW1wbGF0ZTw+CisgICAgICBzdHJ1Y3QgQk9PU1RfRlVOQ1RJT05fR0VUX0lOVk9LRVI8ZnVuY3Rpb25fb2JqX3RhZz4KKyAgICAgIHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rpb25PYmosCisgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFIgQk9PU1RfRlVOQ1RJT05fQ09NTUEgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfUEFSTVM+CisgICAgICAgIHN0cnVjdCBhcHBseQorICAgICAgICB7CisgICAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBCT09TVF9GVU5DVElPTl9HRVRfRlVOQ1RJT05fT0JKX0lOVk9LRVI8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSIEJPT1NUX0ZVTkNUSU9OX0NPTU1BCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX0FSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID46OnR5cGUKKyAgICAgICAgICAgIGludm9rZXJfdHlwZTsKKworICAgICAgICAgIHR5cGVkZWYgZnVuY3Rvcl9tYW5hZ2VyPEZ1bmN0aW9uT2JqPiBtYW5hZ2VyX3R5cGU7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rpb25PYmosCisgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFIgQk9PU1RfRlVOQ1RJT05fQ09NTUEgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfUEFSTVMsCisgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICAgICAgc3RydWN0IGFwcGx5X2EKKyAgICAgICAgeworICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQk9PU1RfRlVOQ1RJT05fR0VUX0ZVTkNUSU9OX09CSl9JTlZPS0VSPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbk9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUiBCT09TVF9GVU5DVElPTl9DT01NQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9GVU5DVElPTl9URU1QTEFURV9BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlCisgICAgICAgICAgICBpbnZva2VyX3R5cGU7CisKKyAgICAgICAgICB0eXBlZGVmIGZ1bmN0b3JfbWFuYWdlcl9hPEZ1bmN0aW9uT2JqLCBBbGxvY2F0b3I+IG1hbmFnZXJfdHlwZTsKKyAgICAgICAgfTsKKyAgICAgIH07CisKKyAgICAgIC8qIFJldHJpZXZlIHRoZSBpbnZva2VyIGZvciBhIHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uIG9iamVjdC4gKi8KKyAgICAgIHRlbXBsYXRlPD4KKyAgICAgIHN0cnVjdCBCT09TVF9GVU5DVElPTl9HRVRfSU5WT0tFUjxmdW5jdGlvbl9vYmpfcmVmX3RhZz4KKyAgICAgIHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmVmV3JhcHBlciwKKyAgICAgICAgICAgICAgICAgdHlwZW5hbWUgUiBCT09TVF9GVU5DVElPTl9DT01NQSBCT09TVF9GVU5DVElPTl9URU1QTEFURV9QQVJNUz4KKyAgICAgICAgc3RydWN0IGFwcGx5CisgICAgICAgIHsKKyAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIEJPT1NUX0ZVTkNUSU9OX0dFVF9GVU5DVElPTl9SRUZfSU5WT0tFUjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgUmVmV3JhcHBlcjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUiBCT09TVF9GVU5DVElPTl9DT01NQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9GVU5DVElPTl9URU1QTEFURV9BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlCisgICAgICAgICAgICBpbnZva2VyX3R5cGU7CisKKyAgICAgICAgICB0eXBlZGVmIHJlZmVyZW5jZV9tYW5hZ2VyPHR5cGVuYW1lIFJlZldyYXBwZXI6OnR5cGU+IG1hbmFnZXJfdHlwZTsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSZWZXcmFwcGVyLAorICAgICAgICAgICAgICAgICB0eXBlbmFtZSBSIEJPT1NUX0ZVTkNUSU9OX0NPTU1BIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX1BBUk1TLAorICAgICAgICAgICAgICAgICB0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgICAgIHN0cnVjdCBhcHBseV9hCisgICAgICAgIHsKKyAgICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIEJPT1NUX0ZVTkNUSU9OX0dFVF9GVU5DVElPTl9SRUZfSU5WT0tFUjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgUmVmV3JhcHBlcjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUiBCT09TVF9GVU5DVElPTl9DT01NQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9GVU5DVElPTl9URU1QTEFURV9BUkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICA+Ojp0eXBlCisgICAgICAgICAgICBpbnZva2VyX3R5cGU7CisKKyAgICAgICAgICB0eXBlZGVmIHJlZmVyZW5jZV9tYW5hZ2VyPHR5cGVuYW1lIFJlZldyYXBwZXI6OnR5cGU+IG1hbmFnZXJfdHlwZTsKKyAgICAgICAgfTsKKyAgICAgIH07CisKKworICAgICAgLyoqCisgICAgICAgKiB2dGFibGUgZm9yIGEgc3BlY2lmaWMgYm9vc3Q6OmZ1bmN0aW9uIGluc3RhbmNlLiBUaGlzCisgICAgICAgKiBzdHJ1Y3R1cmUgbXVzdCBiZSBhbiBhZ2dyZWdhdGUgc28gdGhhdCB3ZSBjYW4gdXNlIHN0YXRpYworICAgICAgICogaW5pdGlhbGl6YXRpb24gaW4gYm9vc3Q6OmZ1bmN0aW9uJ3MgYXNzaWduX3RvIGFuZCBhc3NpZ25fdG9fYQorICAgICAgICogbWVtYmVycy4gSXQgdGhlcmVmb3JlIGNhbm5vdCBoYXZlIGFueSBjb25zdHJ1Y3RvcnMsCisgICAgICAgKiBkZXN0cnVjdG9ycywgYmFzZSBjbGFzc2VzLCBldGMuCisgICAgICAgKi8KKyAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIgQk9PU1RfRlVOQ1RJT05fQ09NTUEgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfUEFSTVM+CisgICAgICBzdHJ1Y3QgQk9PU1RfRlVOQ1RJT05fVlRBQkxFCisgICAgICB7CisjaWZuZGVmIEJPT1NUX05PX1ZPSURfUkVUVVJOUworICAgICAgICB0eXBlZGVmIFIgICAgICAgICByZXN1bHRfdHlwZTsKKyNlbHNlCisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZnVuY3Rpb25fcmV0dXJuX3R5cGU8Uj46OnR5cGUgcmVzdWx0X3R5cGU7CisjZW5kaWYgLy8gQk9PU1RfTk9fVk9JRF9SRVRVUk5TCisKKyAgICAgICAgdHlwZWRlZiByZXN1bHRfdHlwZSAoKmludm9rZXJfdHlwZSkoZnVuY3Rpb25fYnVmZmVyJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9GVU5DVElPTl9DT01NQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9GVU5DVElPTl9URU1QTEFURV9BUkdTKTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGPgorICAgICAgICBib29sIGFzc2lnbl90byhGIGYsIGZ1bmN0aW9uX2J1ZmZlciYgZnVuY3RvcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgZ2V0X2Z1bmN0aW9uX3RhZzxGPjo6dHlwZSB0YWc7CisgICAgICAgICAgcmV0dXJuIGFzc2lnbl90byhmLCBmdW5jdG9yLCB0YWcoKSk7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRix0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgICAgIGJvb2wgYXNzaWduX3RvX2EoRiBmLCBmdW5jdGlvbl9idWZmZXImIGZ1bmN0b3IsIEFsbG9jYXRvciBhKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBnZXRfZnVuY3Rpb25fdGFnPEY+Ojp0eXBlIHRhZzsKKyAgICAgICAgICByZXR1cm4gYXNzaWduX3RvX2EoZiwgZnVuY3RvciwgYSwgdGFnKCkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjbGVhcihmdW5jdGlvbl9idWZmZXImIGZ1bmN0b3IpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYmFzZS5tYW5hZ2VyKQorICAgICAgICAgICAgYmFzZS5tYW5hZ2VyKGZ1bmN0b3IsIGZ1bmN0b3IsIGRlc3Ryb3lfZnVuY3Rvcl90YWcpOworICAgICAgICB9CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIC8vIEZ1bmN0aW9uIHBvaW50ZXJzCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uUHRyPgorICAgICAgICBib29sCisgICAgICAgIGFzc2lnbl90byhGdW5jdGlvblB0ciBmLCBmdW5jdGlvbl9idWZmZXImIGZ1bmN0b3IsIGZ1bmN0aW9uX3B0cl90YWcpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICB0aGlzLT5jbGVhcihmdW5jdG9yKTsKKyAgICAgICAgICBpZiAoZikgeworICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGEgcmVpbnRlcnByZXQgY2FzdCwgYnV0IHNvbWUgY29tcGlsZXJzIGluc2lzdAorICAgICAgICAgICAgLy8gb24gZ2l2aW5nIGN2LXF1YWxpZmllcnMgdG8gZnJlZSBmdW5jdGlvbnMKKyAgICAgICAgICAgIGZ1bmN0b3IubWVtYmVycy5mdW5jX3B0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAoKikoKT4oZik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvblB0cix0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgICAgIGJvb2wKKyAgICAgICAgYXNzaWduX3RvX2EoRnVuY3Rpb25QdHIgZiwgZnVuY3Rpb25fYnVmZmVyJiBmdW5jdG9yLCBBbGxvY2F0b3IsIGZ1bmN0aW9uX3B0cl90YWcpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gYXNzaWduX3RvKGYsZnVuY3RvcixmdW5jdGlvbl9wdHJfdGFnKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWVtYmVyIHBvaW50ZXJzCisjaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPiAwCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE1lbWJlclB0cj4KKyAgICAgICAgYm9vbCBhc3NpZ25fdG8oTWVtYmVyUHRyIGYsIGZ1bmN0aW9uX2J1ZmZlciYgZnVuY3RvciwgbWVtYmVyX3B0cl90YWcpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAvLyBEUEcgVEJEOiBBZGQgZXhwbGljaXQgc3VwcG9ydCBmb3IgbWVtYmVyIGZ1bmN0aW9uCisgICAgICAgICAgLy8gb2JqZWN0cywgc28gd2UgaW52b2tlIHRocm91Z2ggbWVtX2ZuKCkgYnV0IHdlIHJldGFpbiB0aGUKKyAgICAgICAgICAvLyByaWdodCB0YXJnZXRfdHlwZSgpIHZhbHVlcy4KKyAgICAgICAgICBpZiAoZikgeworICAgICAgICAgICAgdGhpcy0+YXNzaWduX3RvKGJvb3N0OjptZW1fZm4oZiksIGZ1bmN0b3IpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgTWVtYmVyUHRyLHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICAgICAgYm9vbCBhc3NpZ25fdG9fYShNZW1iZXJQdHIgZiwgZnVuY3Rpb25fYnVmZmVyJiBmdW5jdG9yLCBBbGxvY2F0b3IgYSwgbWVtYmVyX3B0cl90YWcpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAvLyBEUEcgVEJEOiBBZGQgZXhwbGljaXQgc3VwcG9ydCBmb3IgbWVtYmVyIGZ1bmN0aW9uCisgICAgICAgICAgLy8gb2JqZWN0cywgc28gd2UgaW52b2tlIHRocm91Z2ggbWVtX2ZuKCkgYnV0IHdlIHJldGFpbiB0aGUKKyAgICAgICAgICAvLyByaWdodCB0YXJnZXRfdHlwZSgpIHZhbHVlcy4KKyAgICAgICAgICBpZiAoZikgeworICAgICAgICAgICAgdGhpcy0+YXNzaWduX3RvX2EoYm9vc3Q6Om1lbV9mbihmKSwgZnVuY3RvciwgYSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8vIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID4gMAorCisgICAgICAgIC8vIEZ1bmN0aW9uIG9iamVjdHMKKyAgICAgICAgLy8gQXNzaWduIHRvIGEgZnVuY3Rpb24gb2JqZWN0IHVzaW5nIHRoZSBzbWFsbCBvYmplY3Qgb3B0aW1pemF0aW9uCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uT2JqPgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbl9mdW5jdG9yKEZ1bmN0aW9uT2JqIGYsIGZ1bmN0aW9uX2J1ZmZlciYgZnVuY3RvciwgbXBsOjp0cnVlXykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgIG5ldyAocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oZnVuY3Rvci5kYXRhKSkgRnVuY3Rpb25PYmooZik7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rpb25PYmosdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbl9mdW5jdG9yX2EoRnVuY3Rpb25PYmogZiwgZnVuY3Rpb25fYnVmZmVyJiBmdW5jdG9yLCBBbGxvY2F0b3IsIG1wbDo6dHJ1ZV8pIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICBhc3NpZ25fZnVuY3RvcihmLGZ1bmN0b3IsbXBsOjp0cnVlXygpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFzc2lnbiB0byBhIGZ1bmN0aW9uIG9iamVjdCBhbGxvY2F0ZWQgb24gdGhlIGhlYXAuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uT2JqPgorICAgICAgICB2b2lkCisgICAgICAgIGFzc2lnbl9mdW5jdG9yKEZ1bmN0aW9uT2JqIGYsIGZ1bmN0aW9uX2J1ZmZlciYgZnVuY3RvciwgbXBsOjpmYWxzZV8pIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICBmdW5jdG9yLm1lbWJlcnMub2JqX3B0ciA9IG5ldyBGdW5jdGlvbk9iaihmKTsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvbk9iaix0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgICAgIHZvaWQKKyAgICAgICAgYXNzaWduX2Z1bmN0b3JfYShGdW5jdGlvbk9iaiBmLCBmdW5jdGlvbl9idWZmZXImIGZ1bmN0b3IsIEFsbG9jYXRvciBhLCBtcGw6OmZhbHNlXykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgIHR5cGVkZWYgZnVuY3Rvcl93cmFwcGVyPEZ1bmN0aW9uT2JqLEFsbG9jYXRvcj4gZnVuY3Rvcl93cmFwcGVyX3R5cGU7CisjaWYgZGVmaW5lZChCT09TVF9OT19DWFgxMV9BTExPQ0FUT1IpCisgICAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBBbGxvY2F0b3I6OnRlbXBsYXRlIHJlYmluZDxmdW5jdG9yX3dyYXBwZXJfdHlwZT46Om90aGVyCisgICAgICAgICAgICB3cmFwcGVyX2FsbG9jYXRvcl90eXBlOworICAgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgd3JhcHBlcl9hbGxvY2F0b3JfdHlwZTo6cG9pbnRlciB3cmFwcGVyX2FsbG9jYXRvcl9wb2ludGVyX3R5cGU7CisjZWxzZQorICAgICAgICAgIHVzaW5nIHdyYXBwZXJfYWxsb2NhdG9yX3R5cGUgPSB0eXBlbmFtZSBzdGQ6OmFsbG9jYXRvcl90cmFpdHM8QWxsb2NhdG9yPjo6dGVtcGxhdGUgcmViaW5kX2FsbG9jPGZ1bmN0b3Jfd3JhcHBlcl90eXBlPjsKKyAgICAgICAgICB1c2luZyB3cmFwcGVyX2FsbG9jYXRvcl9wb2ludGVyX3R5cGUgPSB0eXBlbmFtZSBzdGQ6OmFsbG9jYXRvcl90cmFpdHM8d3JhcHBlcl9hbGxvY2F0b3JfdHlwZT46OnBvaW50ZXI7CisjZW5kaWYKKyAgICAgICAgICB3cmFwcGVyX2FsbG9jYXRvcl90eXBlIHdyYXBwZXJfYWxsb2NhdG9yKGEpOworICAgICAgICAgIHdyYXBwZXJfYWxsb2NhdG9yX3BvaW50ZXJfdHlwZSBjb3B5ID0gd3JhcHBlcl9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7CisjaWYgZGVmaW5lZChCT09TVF9OT19DWFgxMV9BTExPQ0FUT1IpCisgICAgICAgICAgd3JhcHBlcl9hbGxvY2F0b3IuY29uc3RydWN0KGNvcHksIGZ1bmN0b3Jfd3JhcHBlcl90eXBlKGYsYSkpOworI2Vsc2UKKyAgICAgICAgICBzdGQ6OmFsbG9jYXRvcl90cmFpdHM8d3JhcHBlcl9hbGxvY2F0b3JfdHlwZT46OmNvbnN0cnVjdCh3cmFwcGVyX2FsbG9jYXRvciwgY29weSwgZnVuY3Rvcl93cmFwcGVyX3R5cGUoZixhKSk7CisjZW5kaWYKKyAgICAgICAgICBmdW5jdG9yX3dyYXBwZXJfdHlwZSogbmV3X2YgPSBzdGF0aWNfY2FzdDxmdW5jdG9yX3dyYXBwZXJfdHlwZSo+KGNvcHkpOworICAgICAgICAgIGZ1bmN0b3IubWVtYmVycy5vYmpfcHRyID0gbmV3X2Y7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdGlvbk9iaj4KKyAgICAgICAgYm9vbAorICAgICAgICBhc3NpZ25fdG8oRnVuY3Rpb25PYmogZiwgZnVuY3Rpb25fYnVmZmVyJiBmdW5jdG9yLCBmdW5jdGlvbl9vYmpfdGFnKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgaWYgKCFib29zdDo6ZGV0YWlsOjpmdW5jdGlvbjo6aGFzX2VtcHR5X3RhcmdldChib29zdDo6YWRkcmVzc29mKGYpKSkgeworICAgICAgICAgICAgYXNzaWduX2Z1bmN0b3IoZiwgZnVuY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wbDo6Ym9vbF88KGZ1bmN0aW9uX2FsbG93c19zbWFsbF9vYmplY3Rfb3B0aW1pemF0aW9uPEZ1bmN0aW9uT2JqPjo6dmFsdWUpPigpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0aW9uT2JqLHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICAgICAgYm9vbAorICAgICAgICBhc3NpZ25fdG9fYShGdW5jdGlvbk9iaiBmLCBmdW5jdGlvbl9idWZmZXImIGZ1bmN0b3IsIEFsbG9jYXRvciBhLCBmdW5jdGlvbl9vYmpfdGFnKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgaWYgKCFib29zdDo6ZGV0YWlsOjpmdW5jdGlvbjo6aGFzX2VtcHR5X3RhcmdldChib29zdDo6YWRkcmVzc29mKGYpKSkgeworICAgICAgICAgICAgYXNzaWduX2Z1bmN0b3JfYShmLCBmdW5jdG9yLCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBsOjpib29sXzwoZnVuY3Rpb25fYWxsb3dzX3NtYWxsX29iamVjdF9vcHRpbWl6YXRpb248RnVuY3Rpb25PYmo+Ojp2YWx1ZSk+KCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWZlcmVuY2UgdG8gYSBmdW5jdGlvbiBvYmplY3QKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rpb25PYmo+CisgICAgICAgIGJvb2wKKyAgICAgICAgYXNzaWduX3RvKGNvbnN0IHJlZmVyZW5jZV93cmFwcGVyPEZ1bmN0aW9uT2JqPiYgZiwKKyAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX2J1ZmZlciYgZnVuY3RvciwgZnVuY3Rpb25fb2JqX3JlZl90YWcpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICBmdW5jdG9yLm1lbWJlcnMub2JqX3JlZi5vYmpfcHRyID0gKHZvaWQgKikoZi5nZXRfcG9pbnRlcigpKTsKKyAgICAgICAgICBmdW5jdG9yLm1lbWJlcnMub2JqX3JlZi5pc19jb25zdF9xdWFsaWZpZWQgPSBpc19jb25zdDxGdW5jdGlvbk9iaj46OnZhbHVlOworICAgICAgICAgIGZ1bmN0b3IubWVtYmVycy5vYmpfcmVmLmlzX3ZvbGF0aWxlX3F1YWxpZmllZCA9IGlzX3ZvbGF0aWxlPEZ1bmN0aW9uT2JqPjo6dmFsdWU7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rpb25PYmosdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgICAgICBib29sCisgICAgICAgIGFzc2lnbl90b19hKGNvbnN0IHJlZmVyZW5jZV93cmFwcGVyPEZ1bmN0aW9uT2JqPiYgZiwKKyAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX2J1ZmZlciYgZnVuY3RvciwgQWxsb2NhdG9yLCBmdW5jdGlvbl9vYmpfcmVmX3RhZykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBhc3NpZ25fdG8oZixmdW5jdG9yLGZ1bmN0aW9uX29ial9yZWZfdGFnKCkpOworICAgICAgICB9CisKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgdnRhYmxlX2Jhc2UgYmFzZTsKKyAgICAgICAgaW52b2tlcl90eXBlIGludm9rZXI7CisgICAgICB9OworICAgIH0gLy8gZW5kIG5hbWVzcGFjZSBmdW5jdGlvbgorICB9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCisKKyAgdGVtcGxhdGU8CisgICAgdHlwZW5hbWUgUiBCT09TVF9GVU5DVElPTl9DT01NQQorICAgIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX1BBUk1TCisgID4KKyAgY2xhc3MgQk9PU1RfRlVOQ1RJT05fRlVOQ1RJT04gOiBwdWJsaWMgZnVuY3Rpb25fYmFzZQorICB7CisgIHB1YmxpYzoKKyNpZm5kZWYgQk9PU1RfTk9fVk9JRF9SRVRVUk5TCisgICAgdHlwZWRlZiBSICAgICAgICAgcmVzdWx0X3R5cGU7CisjZWxzZQorICAgIHR5cGVkZWYgIHR5cGVuYW1lIGJvb3N0OjpkZXRhaWw6OmZ1bmN0aW9uOjpmdW5jdGlvbl9yZXR1cm5fdHlwZTxSPjo6dHlwZQorICAgICAgcmVzdWx0X3R5cGU7CisjZW5kaWYgLy8gQk9PU1RfTk9fVk9JRF9SRVRVUk5TCisKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIGJvb3N0OjpkZXRhaWw6OmZ1bmN0aW9uOjpCT09TVF9GVU5DVElPTl9WVEFCTEU8CisgICAgICAgICAgICAgIFIgQk9PU1RfRlVOQ1RJT05fQ09NTUEgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfQVJHUz4KKyAgICAgIHZ0YWJsZV90eXBlOworCisgICAgdnRhYmxlX3R5cGUqIGdldF92dGFibGUoKSBjb25zdCB7CisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2dGFibGVfdHlwZSo+KAorICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdGQ6OnNpemVfdD4odnRhYmxlKSAmIH5zdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oMHgwMSkpOworICAgIH0KKworICAgIHN0cnVjdCBjbGVhcl90eXBlIHt9OworCisgIHB1YmxpYzoKKyAgICBCT09TVF9TVEFUSUNfQ09OU1RBTlQoaW50LCBhcmdzID0gQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MpOworCisgICAgLy8gYWRkIHNpZ25hdHVyZSBmb3IgYm9vc3Q6OmxhbWJkYQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ3M+CisgICAgc3RydWN0IHNpZworICAgIHsKKyAgICAgIHR5cGVkZWYgcmVzdWx0X3R5cGUgdHlwZTsKKyAgICB9OworCisjaWYgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgPT0gMQorICAgIHR5cGVkZWYgVDAgYXJndW1lbnRfdHlwZTsKKyNlbGlmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTID09IDIKKyAgICB0eXBlZGVmIFQwIGZpcnN0X2FyZ3VtZW50X3R5cGU7CisgICAgdHlwZWRlZiBUMSBzZWNvbmRfYXJndW1lbnRfdHlwZTsKKyNlbmRpZgorCisgICAgQk9PU1RfU1RBVElDX0NPTlNUQU5UKGludCwgYXJpdHkgPSBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyk7CisgICAgQk9PU1RfRlVOQ1RJT05fQVJHX1RZUEVTCisKKyAgICB0eXBlZGVmIEJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OIHNlbGZfdHlwZTsKKworICAgIEJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OKCkgOiBmdW5jdGlvbl9iYXNlKCkgeyB9CisKKyAgICAvLyBNU1ZDIGNob2tlcyBpZiB0aGUgZm9sbG93aW5nIHR3byBjb25zdHJ1Y3RvcnMgYXJlIGNvbGxhcHNlZCBpbnRvCisgICAgLy8gb25lIHdpdGggYSBkZWZhdWx0IHBhcmFtZXRlci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorICAgIEJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OKEZ1bmN0b3IgQk9PU1RfRlVOQ1RJT05fVEFSR0VUX0ZJWChjb25zdCAmKSBmCisjaWZuZGVmIEJPT1NUX05PX1NGSU5BRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICx0eXBlbmFtZSBib29zdDo6ZW5hYmxlX2lmX2M8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoaXNfaW50ZWdyYWw8RnVuY3Rvcj46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ+Ojp0eXBlID0gMAorI2VuZGlmIC8vIEJPT1NUX05PX1NGSU5BRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOgorICAgICAgZnVuY3Rpb25fYmFzZSgpCisgICAgeworICAgICAgdGhpcy0+YXNzaWduX3RvKGYpOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yLHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICBCT09TVF9GVU5DVElPTl9GVU5DVElPTihGdW5jdG9yIEJPT1NUX0ZVTkNUSU9OX1RBUkdFVF9GSVgoY29uc3QgJikgZiwgQWxsb2NhdG9yIGEKKyNpZm5kZWYgQk9PU1RfTk9fU0ZJTkFFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHR5cGVuYW1lIGJvb3N0OjplbmFibGVfaWZfYzwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoaXNfaW50ZWdyYWw8RnVuY3Rvcj46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ+Ojp0eXBlID0gMAorI2VuZGlmIC8vIEJPT1NUX05PX1NGSU5BRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOgorICAgICAgZnVuY3Rpb25fYmFzZSgpCisgICAgeworICAgICAgdGhpcy0+YXNzaWduX3RvX2EoZixhKTsKKyAgICB9CisKKyNpZm5kZWYgQk9PU1RfTk9fU0ZJTkFFCisgICAgQk9PU1RfRlVOQ1RJT05fRlVOQ1RJT04oY2xlYXJfdHlwZSopIDogZnVuY3Rpb25fYmFzZSgpIHsgfQorI2Vsc2UKKyAgICBCT09TVF9GVU5DVElPTl9GVU5DVElPTihpbnQgemVybykgOiBmdW5jdGlvbl9iYXNlKCkKKyAgICB7CisgICAgICBCT09TVF9BU1NFUlQoemVybyA9PSAwKTsKKyAgICB9CisjZW5kaWYKKworICAgIEJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OKGNvbnN0IEJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OJiBmKSA6IGZ1bmN0aW9uX2Jhc2UoKQorICAgIHsKKyAgICAgIHRoaXMtPmFzc2lnbl90b19vd24oZik7CisgICAgfQorCisjaWZuZGVmIEJPT1NUX05PX0NYWDExX1JWQUxVRV9SRUZFUkVOQ0VTCisgICAgQk9PU1RfRlVOQ1RJT05fRlVOQ1RJT04oQk9PU1RfRlVOQ1RJT05fRlVOQ1RJT04mJiBmKSA6IGZ1bmN0aW9uX2Jhc2UoKQorICAgIHsKKyAgICAgIHRoaXMtPm1vdmVfYXNzaWduKGYpOworICAgIH0KKyNlbmRpZgorCisgICAgfkJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OKCkgeyBjbGVhcigpOyB9CisKKyAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKEJPT1NUX0ZVTkNUSU9OX1BBUk1TKSBjb25zdAorICAgIHsKKyAgICAgIGlmICh0aGlzLT5lbXB0eSgpKQorICAgICAgICBib29zdDo6dGhyb3dfZXhjZXB0aW9uKGJhZF9mdW5jdGlvbl9jYWxsKCkpOworCisgICAgICByZXR1cm4gZ2V0X3Z0YWJsZSgpLT5pbnZva2VyCisgICAgICAgICAgICAgICAodGhpcy0+ZnVuY3RvciBCT09TVF9GVU5DVElPTl9DT01NQSBCT09TVF9GVU5DVElPTl9BUkdTKTsKKyAgICB9CisKKyAgICAvLyBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiB3aGVuIHRvIHVzZSBCT09TVF9GVU5DVElPTl9GVU5DVElPTiBhbmQKKyAgICAvLyB3aGVuIHRvIHVzZSBzZWxmX3R5cGUgaXMgb2Jub3hpb3VzLiBNU1ZDIGNhbm5vdCBoYW5kbGUgc2VsZl90eXBlIGFzCisgICAgLy8gdGhlIHJldHVybiB0eXBlIG9mIHRoZXNlIGFzc2lnbm1lbnQgb3BlcmF0b3JzLCBidXQgQm9ybGFuZCBDKysgY2Fubm90CisgICAgLy8gaGFuZGxlIEJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OIGFzIHRoZSB0eXBlIG9mIHRoZSB0ZW1wb3JhcnkgdG8KKyAgICAvLyBjb25zdHJ1Y3QuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyNpZm5kZWYgQk9PU1RfTk9fU0ZJTkFFCisgICAgdHlwZW5hbWUgYm9vc3Q6OmVuYWJsZV9pZl9jPAorICAgICAgICAgICAgICAgICAgIShpc19pbnRlZ3JhbDxGdW5jdG9yPjo6dmFsdWUpLAorICAgICAgICAgICAgICAgQk9PU1RfRlVOQ1RJT05fRlVOQ1RJT04mPjo6dHlwZQorI2Vsc2UKKyAgICBCT09TVF9GVU5DVElPTl9GVU5DVElPTiYKKyNlbmRpZgorICAgIG9wZXJhdG9yPShGdW5jdG9yIEJPT1NUX0ZVTkNUSU9OX1RBUkdFVF9GSVgoY29uc3QgJikgZikKKyAgICB7CisgICAgICB0aGlzLT5jbGVhcigpOworICAgICAgQk9PU1RfVFJZICB7CisgICAgICAgIHRoaXMtPmFzc2lnbl90byhmKTsKKyAgICAgIH0gQk9PU1RfQ0FUQ0ggKC4uLikgeworICAgICAgICB2dGFibGUgPSAwOworICAgICAgICBCT09TVF9SRVRIUk9XOworICAgICAgfQorICAgICAgQk9PU1RfQ0FUQ0hfRU5ECisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3IsdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgIHZvaWQgYXNzaWduKEZ1bmN0b3IgQk9PU1RfRlVOQ1RJT05fVEFSR0VUX0ZJWChjb25zdCAmKSBmLCBBbGxvY2F0b3IgYSkKKyAgICB7CisgICAgICB0aGlzLT5jbGVhcigpOworICAgICAgQk9PU1RfVFJZeworICAgICAgICB0aGlzLT5hc3NpZ25fdG9fYShmLGEpOworICAgICAgfSBCT09TVF9DQVRDSCAoLi4uKSB7CisgICAgICAgIHZ0YWJsZSA9IDA7CisgICAgICAgIEJPT1NUX1JFVEhST1c7CisgICAgICB9CisgICAgICBCT09TVF9DQVRDSF9FTkQKKyAgICB9CisKKyNpZm5kZWYgQk9PU1RfTk9fU0ZJTkFFCisgICAgQk9PU1RfRlVOQ1RJT05fRlVOQ1RJT04mIG9wZXJhdG9yPShjbGVhcl90eXBlKikKKyAgICB7CisgICAgICB0aGlzLT5jbGVhcigpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbHNlCisgICAgQk9PU1RfRlVOQ1RJT05fRlVOQ1RJT04mIG9wZXJhdG9yPShpbnQgemVybykKKyAgICB7CisgICAgICBCT09TVF9BU1NFUlQoemVybyA9PSAwKTsKKyAgICAgIHRoaXMtPmNsZWFyKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBBc3NpZ25tZW50IGZyb20gYW5vdGhlciBCT09TVF9GVU5DVElPTl9GVU5DVElPTgorICAgIEJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OJiBvcGVyYXRvcj0oY29uc3QgQk9PU1RfRlVOQ1RJT05fRlVOQ1RJT04mIGYpCisgICAgeworICAgICAgaWYgKCZmID09IHRoaXMpCisgICAgICAgIHJldHVybiAqdGhpczsKKworICAgICAgdGhpcy0+Y2xlYXIoKTsKKyAgICAgIEJPT1NUX1RSWSB7CisgICAgICAgIHRoaXMtPmFzc2lnbl90b19vd24oZik7CisgICAgICB9IEJPT1NUX0NBVENIICguLi4pIHsKKyAgICAgICAgdnRhYmxlID0gMDsKKyAgICAgICAgQk9PU1RfUkVUSFJPVzsKKyAgICAgIH0KKyAgICAgIEJPT1NUX0NBVENIX0VORAorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworI2lmbmRlZiBCT09TVF9OT19DWFgxMV9SVkFMVUVfUkVGRVJFTkNFUworICAgIC8vIE1vdmUgYXNzaWdubWVudCBmcm9tIGFub3RoZXIgQk9PU1RfRlVOQ1RJT05fRlVOQ1RJT04KKyAgICBCT09TVF9GVU5DVElPTl9GVU5DVElPTiYgb3BlcmF0b3I9KEJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OJiYgZikKKyAgICB7CisgICAgICBpZiAoJmYgPT0gdGhpcykKKyAgICAgICAgcmV0dXJuICp0aGlzOworCisgICAgICB0aGlzLT5jbGVhcigpOworICAgICAgQk9PU1RfVFJZIHsKKyAgICAgICAgdGhpcy0+bW92ZV9hc3NpZ24oZik7CisgICAgICB9IEJPT1NUX0NBVENIICguLi4pIHsKKyAgICAgICAgdnRhYmxlID0gMDsKKyAgICAgICAgQk9PU1RfUkVUSFJPVzsKKyAgICAgIH0KKyAgICAgIEJPT1NUX0NBVENIX0VORAorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyNlbmRpZgorCisgICAgdm9pZCBzd2FwKEJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OJiBvdGhlcikKKyAgICB7CisgICAgICBpZiAoJm90aGVyID09IHRoaXMpCisgICAgICAgIHJldHVybjsKKworICAgICAgQk9PU1RfRlVOQ1RJT05fRlVOQ1RJT04gdG1wOworICAgICAgdG1wLm1vdmVfYXNzaWduKCp0aGlzKTsKKyAgICAgIHRoaXMtPm1vdmVfYXNzaWduKG90aGVyKTsKKyAgICAgIG90aGVyLm1vdmVfYXNzaWduKHRtcCk7CisgICAgfQorCisgICAgLy8gQ2xlYXIgb3V0IGEgdGFyZ2V0LCBpZiB0aGVyZSBpcyBvbmUKKyAgICB2b2lkIGNsZWFyKCkKKyAgICB7CisgICAgICBpZiAodnRhYmxlKSB7CisgICAgICAgIGlmICghdGhpcy0+aGFzX3RyaXZpYWxfY29weV9hbmRfZGVzdHJveSgpKQorICAgICAgICAgIGdldF92dGFibGUoKS0+Y2xlYXIodGhpcy0+ZnVuY3Rvcik7CisgICAgICAgIHZ0YWJsZSA9IDA7CisgICAgICB9CisgICAgfQorCisjaWYgKGRlZmluZWQgX19TVU5QUk9fQ0MpICYmIChfX1NVTlBST19DQyA8PSAweDUzMCkgJiYgIShkZWZpbmVkIEJPT1NUX05PX0NPTVBJTEVSX0NPTkZJRykKKyAgICAvLyBTdW4gQysrIDUuMyBjYW4ndCBoYW5kbGUgdGhlIHNhZmVfYm9vbCBpZGlvbSwgc28gZG9uJ3QgdXNlIGl0CisgICAgb3BlcmF0b3IgYm9vbCAoKSBjb25zdCB7IHJldHVybiAhdGhpcy0+ZW1wdHkoKTsgfQorI2Vsc2UKKyAgcHJpdmF0ZToKKyAgICBzdHJ1Y3QgZHVtbXkgeworICAgICAgdm9pZCBub25udWxsKCkge30KKyAgICB9OworCisgICAgdHlwZWRlZiB2b2lkIChkdW1teTo6KnNhZmVfYm9vbCkoKTsKKworICBwdWJsaWM6CisgICAgb3BlcmF0b3Igc2FmZV9ib29sICgpIGNvbnN0CisgICAgICB7IHJldHVybiAodGhpcy0+ZW1wdHkoKSk/IDAgOiAmZHVtbXk6Om5vbm51bGw7IH0KKworICAgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QKKyAgICAgIHsgcmV0dXJuIHRoaXMtPmVtcHR5KCk7IH0KKyNlbmRpZgorCisgIHByaXZhdGU6CisgICAgdm9pZCBhc3NpZ25fdG9fb3duKGNvbnN0IEJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OJiBmKQorICAgIHsKKyAgICAgIGlmICghZi5lbXB0eSgpKSB7CisgICAgICAgIHRoaXMtPnZ0YWJsZSA9IGYudnRhYmxlOworICAgICAgICBpZiAodGhpcy0+aGFzX3RyaXZpYWxfY29weV9hbmRfZGVzdHJveSgpKQorICAgICAgICAgIC8vIERvbid0IG9wZXJhdGUgb24gc3RvcmFnZSBkaXJlY3RseSBzaW5jZSB1bmlvbiB0eXBlIGRvZXNuJ3QgcmVsYXgKKyAgICAgICAgICAvLyBzdHJpY3QgYWxpYXNpbmcgcnVsZXMsIGRlc3BpdGUgb2YgaGF2aW5nIG1lbWJlciBjaGFyIHR5cGUuCisgICAgICAgICAgc3RkOjptZW1jcHkodGhpcy0+ZnVuY3Rvci5kYXRhLCBmLmZ1bmN0b3IuZGF0YSwgc2l6ZW9mKGJvb3N0OjpkZXRhaWw6OmZ1bmN0aW9uOjpmdW5jdGlvbl9idWZmZXIpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGdldF92dGFibGUoKS0+YmFzZS5tYW5hZ2VyKGYuZnVuY3RvciwgdGhpcy0+ZnVuY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6ZGV0YWlsOjpmdW5jdGlvbjo6Y2xvbmVfZnVuY3Rvcl90YWcpOworICAgICAgfQorICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEZ1bmN0b3I+CisgICAgdm9pZCBhc3NpZ25fdG8oRnVuY3RvciBmKQorICAgIHsKKyAgICAgIHVzaW5nIGJvb3N0OjpkZXRhaWw6OmZ1bmN0aW9uOjp2dGFibGVfYmFzZTsKKworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBib29zdDo6ZGV0YWlsOjpmdW5jdGlvbjo6Z2V0X2Z1bmN0aW9uX3RhZzxGdW5jdG9yPjo6dHlwZSB0YWc7CisgICAgICB0eXBlZGVmIGJvb3N0OjpkZXRhaWw6OmZ1bmN0aW9uOjpCT09TVF9GVU5DVElPTl9HRVRfSU5WT0tFUjx0YWc+IGdldF9pbnZva2VyOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBnZXRfaW52b2tlcjo6CisgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgYXBwbHk8RnVuY3RvciwgUiBCT09TVF9GVU5DVElPTl9DT01NQQorICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfQVJHUz4KKyAgICAgICAgaGFuZGxlcl90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGhhbmRsZXJfdHlwZTo6aW52b2tlcl90eXBlIGludm9rZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaGFuZGxlcl90eXBlOjptYW5hZ2VyX3R5cGUgbWFuYWdlcl90eXBlOworCisgICAgICAvLyBOb3RlOiBpdCBpcyBleHRyZW1lbHkgaW1wb3J0YW50IHRoYXQgdGhpcyBpbml0aWFsaXphdGlvbiB1c2UKKyAgICAgIC8vIHN0YXRpYyBpbml0aWFsaXphdGlvbi4gT3RoZXJ3aXNlLCB3ZSB3aWxsIGhhdmUgYSByYWNlCisgICAgICAvLyBjb25kaXRpb24gaGVyZSBpbiBtdWx0aS10aHJlYWRlZCBjb2RlLiBTZWUKKyAgICAgIC8vIGh0dHA6Ly90aHJlYWQuZ21hbmUub3JnL2dtYW5lLmNvbXAubGliLmJvb3N0LmRldmVsLzE2NDkwMi8uCisgICAgICBzdGF0aWMgY29uc3QgdnRhYmxlX3R5cGUgc3RvcmVkX3Z0YWJsZSA9CisgICAgICAgIHsgeyAmbWFuYWdlcl90eXBlOjptYW5hZ2UgfSwgJmludm9rZXJfdHlwZTo6aW52b2tlIH07CisKKyAgICAgIGlmIChzdG9yZWRfdnRhYmxlLmFzc2lnbl90byhmLCBmdW5jdG9yKSkgeworICAgICAgICBzdGQ6OnNpemVfdCB2YWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjpzaXplX3Q+KCZzdG9yZWRfdnRhYmxlLmJhc2UpOworICAgICAgICAvLyBjb3Zlcml0eVtwb2ludGxlc3NfZXhwcmVzc2lvbl06IHN1cHByZXNzIGNvdmVyaXR5IHdhcm5pbmdzIG9uIGFwcGFyYW50IGlmKGNvbnN0KS4KKyAgICAgICAgaWYgKGJvb3N0OjpoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yPEZ1bmN0b3I+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgYm9vc3Q6Omhhc190cml2aWFsX2Rlc3RydWN0b3I8RnVuY3Rvcj46OnZhbHVlICYmCisgICAgICAgICAgICBib29zdDo6ZGV0YWlsOjpmdW5jdGlvbjo6ZnVuY3Rpb25fYWxsb3dzX3NtYWxsX29iamVjdF9vcHRpbWl6YXRpb248RnVuY3Rvcj46OnZhbHVlKQorICAgICAgICAgIHZhbHVlIHw9IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PigweDAxKTsKKyAgICAgICAgdnRhYmxlID0gcmVpbnRlcnByZXRfY2FzdDxib29zdDo6ZGV0YWlsOjpmdW5jdGlvbjo6dnRhYmxlX2Jhc2UgKj4odmFsdWUpOworICAgICAgfSBlbHNlCisgICAgICAgIHZ0YWJsZSA9IDA7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcix0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgdm9pZCBhc3NpZ25fdG9fYShGdW5jdG9yIGYsQWxsb2NhdG9yIGEpCisgICAgeworICAgICAgdXNpbmcgYm9vc3Q6OmRldGFpbDo6ZnVuY3Rpb246OnZ0YWJsZV9iYXNlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGJvb3N0OjpkZXRhaWw6OmZ1bmN0aW9uOjpnZXRfZnVuY3Rpb25fdGFnPEZ1bmN0b3I+Ojp0eXBlIHRhZzsKKyAgICAgIHR5cGVkZWYgYm9vc3Q6OmRldGFpbDo6ZnVuY3Rpb246OkJPT1NUX0ZVTkNUSU9OX0dFVF9JTlZPS0VSPHRhZz4gZ2V0X2ludm9rZXI7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGdldF9pbnZva2VyOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSBhcHBseV9hPEZ1bmN0b3IsIFIgQk9PU1RfRlVOQ1RJT05fQ09NTUEKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9GVU5DVElPTl9URU1QTEFURV9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRvcj4KKyAgICAgICAgaGFuZGxlcl90eXBlOworCisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGhhbmRsZXJfdHlwZTo6aW52b2tlcl90eXBlIGludm9rZXJfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaGFuZGxlcl90eXBlOjptYW5hZ2VyX3R5cGUgbWFuYWdlcl90eXBlOworCisgICAgICAvLyBOb3RlOiBpdCBpcyBleHRyZW1lbHkgaW1wb3J0YW50IHRoYXQgdGhpcyBpbml0aWFsaXphdGlvbiB1c2UKKyAgICAgIC8vIHN0YXRpYyBpbml0aWFsaXphdGlvbi4gT3RoZXJ3aXNlLCB3ZSB3aWxsIGhhdmUgYSByYWNlCisgICAgICAvLyBjb25kaXRpb24gaGVyZSBpbiBtdWx0aS10aHJlYWRlZCBjb2RlLiBTZWUKKyAgICAgIC8vIGh0dHA6Ly90aHJlYWQuZ21hbmUub3JnL2dtYW5lLmNvbXAubGliLmJvb3N0LmRldmVsLzE2NDkwMi8uCisgICAgICBzdGF0aWMgY29uc3QgdnRhYmxlX3R5cGUgc3RvcmVkX3Z0YWJsZSA9CisgICAgICAgIHsgeyAmbWFuYWdlcl90eXBlOjptYW5hZ2UgfSwgJmludm9rZXJfdHlwZTo6aW52b2tlIH07CisKKyAgICAgIGlmIChzdG9yZWRfdnRhYmxlLmFzc2lnbl90b19hKGYsIGZ1bmN0b3IsIGEpKSB7CisgICAgICAgIHN0ZDo6c2l6ZV90IHZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxzdGQ6OnNpemVfdD4oJnN0b3JlZF92dGFibGUuYmFzZSk7CisgICAgICAgIC8vIGNvdmVyaXR5W3BvaW50bGVzc19leHByZXNzaW9uXTogc3VwcHJlc3MgY292ZXJpdHkgd2FybmluZ3Mgb24gYXBwYXJhbnQgaWYoY29uc3QpLgorICAgICAgICBpZiAoYm9vc3Q6Omhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I8RnVuY3Rvcj46OnZhbHVlICYmCisgICAgICAgICAgICBib29zdDo6aGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjxGdW5jdG9yPjo6dmFsdWUgJiYKKyAgICAgICAgICAgIGJvb3N0OjpkZXRhaWw6OmZ1bmN0aW9uOjpmdW5jdGlvbl9hbGxvd3Nfc21hbGxfb2JqZWN0X29wdGltaXphdGlvbjxGdW5jdG9yPjo6dmFsdWUpCisgICAgICAgICAgdmFsdWUgfD0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KDB4MDEpOworICAgICAgICB2dGFibGUgPSByZWludGVycHJldF9jYXN0PGJvb3N0OjpkZXRhaWw6OmZ1bmN0aW9uOjp2dGFibGVfYmFzZSAqPih2YWx1ZSk7CisgICAgICB9IGVsc2UKKyAgICAgICAgdnRhYmxlID0gMDsKKyAgICB9CisKKyAgICAvLyBNb3ZlcyB0aGUgdmFsdWUgZnJvbSB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50IHRvICp0aGlzLiBJZiB0aGUgYXJndW1lbnQKKyAgICAvLyBoYXMgaXRzIGZ1bmN0aW9uIG9iamVjdCBhbGxvY2F0ZWQgb24gdGhlIGhlYXAsIG1vdmVfYXNzaWduIHdpbGwgcGFzcworICAgIC8vIGl0cyBidWZmZXIgdG8gKnRoaXMsIGFuZCBzZXQgdGhlIGFyZ3VtZW50J3MgYnVmZmVyIHBvaW50ZXIgdG8gTlVMTC4KKyAgICB2b2lkIG1vdmVfYXNzaWduKEJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OJiBmKQorICAgIHsKKyAgICAgIGlmICgmZiA9PSB0aGlzKQorICAgICAgICByZXR1cm47CisKKyAgICAgIEJPT1NUX1RSWSB7CisgICAgICAgIGlmICghZi5lbXB0eSgpKSB7CisgICAgICAgICAgdGhpcy0+dnRhYmxlID0gZi52dGFibGU7CisgICAgICAgICAgaWYgKHRoaXMtPmhhc190cml2aWFsX2NvcHlfYW5kX2Rlc3Ryb3koKSkKKyAgICAgICAgICAgIC8vIERvbid0IG9wZXJhdGUgb24gc3RvcmFnZSBkaXJlY3RseSBzaW5jZSB1bmlvbiB0eXBlIGRvZXNuJ3QgcmVsYXgKKyAgICAgICAgICAgIC8vIHN0cmljdCBhbGlhc2luZyBydWxlcywgZGVzcGl0ZSBvZiBoYXZpbmcgbWVtYmVyIGNoYXIgdHlwZS4KKyAgICAgICAgICAgIHN0ZDo6bWVtY3B5KHRoaXMtPmZ1bmN0b3IuZGF0YSwgZi5mdW5jdG9yLmRhdGEsIHNpemVvZih0aGlzLT5mdW5jdG9yLmRhdGEpKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBnZXRfdnRhYmxlKCktPmJhc2UubWFuYWdlcihmLmZ1bmN0b3IsIHRoaXMtPmZ1bmN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OmRldGFpbDo6ZnVuY3Rpb246Om1vdmVfZnVuY3Rvcl90YWcpOworICAgICAgICAgIGYudnRhYmxlID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjbGVhcigpOworICAgICAgICB9CisgICAgICB9IEJPT1NUX0NBVENIICguLi4pIHsKKyAgICAgICAgdnRhYmxlID0gMDsKKyAgICAgICAgQk9PU1RfUkVUSFJPVzsKKyAgICAgIH0KKyAgICAgIEJPT1NUX0NBVENIX0VORAorICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBSIEJPT1NUX0ZVTkNUSU9OX0NPTU1BIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX1BBUk1TPgorICBpbmxpbmUgdm9pZCBzd2FwKEJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OPAorICAgICAgICAgICAgICAgICAgICAgUiBCT09TVF9GVU5DVElPTl9DT01NQQorICAgICAgICAgICAgICAgICAgICAgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfQVJHUworICAgICAgICAgICAgICAgICAgID4mIGYxLAorICAgICAgICAgICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OPAorICAgICAgICAgICAgICAgICAgICAgUiBCT09TVF9GVU5DVElPTl9DT01NQQorICAgICAgICAgICAgICAgICAgICAgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfQVJHUworICAgICAgICAgICAgICAgICAgID4mIGYyKQorICB7CisgICAgZjEuc3dhcChmMik7CisgIH0KKworLy8gUG9pc29uIGNvbXBhcmlzb25zIGJldHdlZW4gYm9vc3Q6OmZ1bmN0aW9uIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZS4KK3RlbXBsYXRlPHR5cGVuYW1lIFIgQk9PU1RfRlVOQ1RJT05fQ09NTUEgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfUEFSTVM+CisgIHZvaWQgb3BlcmF0b3I9PShjb25zdCBCT09TVF9GVU5DVElPTl9GVU5DVElPTjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUiBCT09TVF9GVU5DVElPTl9DT01NQQorICAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9GVU5DVElPTl9URU1QTEFURV9BUkdTPiYsCisgICAgICAgICAgICAgICAgICBjb25zdCBCT09TVF9GVU5DVElPTl9GVU5DVElPTjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUiBCT09TVF9GVU5DVElPTl9DT01NQQorICAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9GVU5DVElPTl9URU1QTEFURV9BUkdTPiYpOwordGVtcGxhdGU8dHlwZW5hbWUgUiBCT09TVF9GVU5DVElPTl9DT01NQSBCT09TVF9GVU5DVElPTl9URU1QTEFURV9QQVJNUz4KKyAgdm9pZCBvcGVyYXRvciE9KGNvbnN0IEJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OPAorICAgICAgICAgICAgICAgICAgICAgICAgICBSIEJPT1NUX0ZVTkNUSU9OX0NPTU1BCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX0FSR1M+JiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OPAorICAgICAgICAgICAgICAgICAgICAgICAgICBSIEJPT1NUX0ZVTkNUSU9OX0NPTU1BCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX0FSR1M+JiApOworCisjaWYgIWRlZmluZWQoQk9PU1RfRlVOQ1RJT05fTk9fRlVOQ1RJT05fVFlQRV9TWU5UQVgpCisKKyNpZiBCT09TVF9GVU5DVElPTl9OVU1fQVJHUyA9PSAwCisjZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX1BBUlRJQUxfU1BFQyBSICh2b2lkKQorI2Vsc2UKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fUEFSVElBTF9TUEVDIFIgKEJPT1NUX1BQX0VOVU1fUEFSQU1TKEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTLFQpKQorI2VuZGlmCisKK3RlbXBsYXRlPHR5cGVuYW1lIFIgQk9PU1RfRlVOQ1RJT05fQ09NTUEKKyAgICAgICAgIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX1BBUk1TPgorY2xhc3MgZnVuY3Rpb248Qk9PU1RfRlVOQ1RJT05fUEFSVElBTF9TUEVDPgorICA6IHB1YmxpYyBCT09TVF9GVU5DVElPTl9GVU5DVElPTjxSIEJPT1NUX0ZVTkNUSU9OX0NPTU1BIEJPT1NUX0ZVTkNUSU9OX1RFTVBMQVRFX0FSR1M+Cit7CisgIHR5cGVkZWYgQk9PU1RfRlVOQ1RJT05fRlVOQ1RJT048UiBCT09TVF9GVU5DVElPTl9DT01NQSBCT09TVF9GVU5DVElPTl9URU1QTEFURV9BUkdTPiBiYXNlX3R5cGU7CisgIHR5cGVkZWYgZnVuY3Rpb24gc2VsZl90eXBlOworCisgIHN0cnVjdCBjbGVhcl90eXBlIHt9OworCitwdWJsaWM6CisKKyAgZnVuY3Rpb24oKSA6IGJhc2VfdHlwZSgpIHt9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgZnVuY3Rpb24oRnVuY3RvciBmCisjaWZuZGVmIEJPT1NUX05PX1NGSU5BRQorICAgICAgICAgICAsdHlwZW5hbWUgYm9vc3Q6OmVuYWJsZV9pZl9jPAorICAgICAgICAgICAgICAgICAgICAgICAgICAhKGlzX2ludGVncmFsPEZ1bmN0b3I+Ojp2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgIGludD46OnR5cGUgPSAwCisjZW5kaWYKKyAgICAgICAgICAgKSA6CisgICAgYmFzZV90eXBlKGYpCisgIHsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yLHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgZnVuY3Rpb24oRnVuY3RvciBmLCBBbGxvY2F0b3IgYQorI2lmbmRlZiBCT09TVF9OT19TRklOQUUKKyAgICAgICAgICAgLHR5cGVuYW1lIGJvb3N0OjplbmFibGVfaWZfYzwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICEoaXNfaW50ZWdyYWw8RnVuY3Rvcj46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50Pjo6dHlwZSA9IDAKKyNlbmRpZgorICAgICAgICAgICApIDoKKyAgICBiYXNlX3R5cGUoZixhKQorICB7CisgIH0KKworI2lmbmRlZiBCT09TVF9OT19TRklOQUUKKyAgZnVuY3Rpb24oY2xlYXJfdHlwZSopIDogYmFzZV90eXBlKCkge30KKyNlbmRpZgorCisgIGZ1bmN0aW9uKGNvbnN0IHNlbGZfdHlwZSYgZikgOiBiYXNlX3R5cGUoc3RhdGljX2Nhc3Q8Y29uc3QgYmFzZV90eXBlJj4oZikpe30KKworICBmdW5jdGlvbihjb25zdCBiYXNlX3R5cGUmIGYpIDogYmFzZV90eXBlKHN0YXRpY19jYXN0PGNvbnN0IGJhc2VfdHlwZSY+KGYpKXt9CisKKyNpZm5kZWYgQk9PU1RfTk9fQ1hYMTFfUlZBTFVFX1JFRkVSRU5DRVMKKyAgLy8gTW92ZSBjb25zdHJ1Y3RvcnMKKyAgZnVuY3Rpb24oc2VsZl90eXBlJiYgZik6IGJhc2VfdHlwZShzdGF0aWNfY2FzdDxiYXNlX3R5cGUmJj4oZikpe30KKyAgZnVuY3Rpb24oYmFzZV90eXBlJiYgZik6IGJhc2VfdHlwZShzdGF0aWNfY2FzdDxiYXNlX3R5cGUmJj4oZikpe30KKyNlbmRpZgorCisgIHNlbGZfdHlwZSYgb3BlcmF0b3I9KGNvbnN0IHNlbGZfdHlwZSYgZikKKyAgeworICAgIHNlbGZfdHlwZShmKS5zd2FwKCp0aGlzKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworI2lmbmRlZiBCT09TVF9OT19DWFgxMV9SVkFMVUVfUkVGRVJFTkNFUworICBzZWxmX3R5cGUmIG9wZXJhdG9yPShzZWxmX3R5cGUmJiBmKQorICB7CisgICAgc2VsZl90eXBlKHN0YXRpY19jYXN0PHNlbGZfdHlwZSYmPihmKSkuc3dhcCgqdGhpcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgorI2lmbmRlZiBCT09TVF9OT19TRklOQUUKKyAgdHlwZW5hbWUgYm9vc3Q6OmVuYWJsZV9pZl9jPAorICAgICAgICAgICAgICAgICAgICAgICAgICEoaXNfaW50ZWdyYWw8RnVuY3Rvcj46OnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmX3R5cGUmPjo6dHlwZQorI2Vsc2UKKyAgc2VsZl90eXBlJgorI2VuZGlmCisgIG9wZXJhdG9yPShGdW5jdG9yIGYpCisgIHsKKyAgICBzZWxmX3R5cGUoZikuc3dhcCgqdGhpcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyNpZm5kZWYgQk9PU1RfTk9fU0ZJTkFFCisgIHNlbGZfdHlwZSYgb3BlcmF0b3I9KGNsZWFyX3R5cGUqKQorICB7CisgICAgdGhpcy0+Y2xlYXIoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyNlbmRpZgorCisgIHNlbGZfdHlwZSYgb3BlcmF0b3I9KGNvbnN0IGJhc2VfdHlwZSYgZikKKyAgeworICAgIHNlbGZfdHlwZShmKS5zd2FwKCp0aGlzKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworI2lmbmRlZiBCT09TVF9OT19DWFgxMV9SVkFMVUVfUkVGRVJFTkNFUworICBzZWxmX3R5cGUmIG9wZXJhdG9yPShiYXNlX3R5cGUmJiBmKQorICB7CisgICAgc2VsZl90eXBlKHN0YXRpY19jYXN0PGJhc2VfdHlwZSYmPihmKSkuc3dhcCgqdGhpcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYKK307CisKKyN1bmRlZiBCT09TVF9GVU5DVElPTl9QQVJUSUFMX1NQRUMKKyNlbmRpZiAvLyBoYXZlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24KKworfSAvLyBlbmQgbmFtZXNwYWNlIGJvb3N0CisKKy8vIENsZWFudXAgYWZ0ZXIgb3Vyc2VsdmVzLi4uCisjdW5kZWYgQk9PU1RfRlVOQ1RJT05fVlRBQkxFCisjdW5kZWYgQk9PU1RfRlVOQ1RJT05fQ09NTUEKKyN1bmRlZiBCT09TVF9GVU5DVElPTl9GVU5DVElPTgorI3VuZGVmIEJPT1NUX0ZVTkNUSU9OX0ZVTkNUSU9OX0lOVk9LRVIKKyN1bmRlZiBCT09TVF9GVU5DVElPTl9WT0lEX0ZVTkNUSU9OX0lOVk9LRVIKKyN1bmRlZiBCT09TVF9GVU5DVElPTl9GVU5DVElPTl9PQkpfSU5WT0tFUgorI3VuZGVmIEJPT1NUX0ZVTkNUSU9OX1ZPSURfRlVOQ1RJT05fT0JKX0lOVk9LRVIKKyN1bmRlZiBCT09TVF9GVU5DVElPTl9GVU5DVElPTl9SRUZfSU5WT0tFUgorI3VuZGVmIEJPT1NUX0ZVTkNUSU9OX1ZPSURfRlVOQ1RJT05fUkVGX0lOVk9LRVIKKyN1bmRlZiBCT09TVF9GVU5DVElPTl9NRU1CRVJfSU5WT0tFUgorI3VuZGVmIEJPT1NUX0ZVTkNUSU9OX1ZPSURfTUVNQkVSX0lOVk9LRVIKKyN1bmRlZiBCT09TVF9GVU5DVElPTl9HRVRfRlVOQ1RJT05fSU5WT0tFUgorI3VuZGVmIEJPT1NUX0ZVTkNUSU9OX0dFVF9GVU5DVElPTl9PQkpfSU5WT0tFUgorI3VuZGVmIEJPT1NUX0ZVTkNUSU9OX0dFVF9GVU5DVElPTl9SRUZfSU5WT0tFUgorI3VuZGVmIEJPT1NUX0ZVTkNUSU9OX0dFVF9NRU1fRlVOQ1RJT05fSU5WT0tFUgorI3VuZGVmIEJPT1NUX0ZVTkNUSU9OX0dFVF9JTlZPS0VSCisjdW5kZWYgQk9PU1RfRlVOQ1RJT05fVEVNUExBVEVfUEFSTVMKKyN1bmRlZiBCT09TVF9GVU5DVElPTl9URU1QTEFURV9BUkdTCisjdW5kZWYgQk9PU1RfRlVOQ1RJT05fUEFSTVMKKyN1bmRlZiBCT09TVF9GVU5DVElPTl9QQVJNCisjaWZkZWYgQk9PU1RfRlVOQ1RJT05fQVJHCisjICAgdW5kZWYgQk9PU1RfRlVOQ1RJT05fQVJHCisjZW5kaWYKKyN1bmRlZiBCT09TVF9GVU5DVElPTl9BUkdTCisjdW5kZWYgQk9PU1RfRlVOQ1RJT05fQVJHX1RZUEUKKyN1bmRlZiBCT09TVF9GVU5DVElPTl9BUkdfVFlQRVMKKyN1bmRlZiBCT09TVF9GVU5DVElPTl9WT0lEX1JFVFVSTl9UWVBFCisjdW5kZWYgQk9PU1RfRlVOQ1RJT05fUkVUVVJOCisKKyNpZiBkZWZpbmVkKEJPT1NUX01TVkMpCisjICAgcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdHlwZW9mLmhwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fdHlwZW9mLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDZkYzE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9mdW5jdGlvbl90eXBlb2YuaHBwCkBAIC0wLDAgKzEsNDUgQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkgLSBUeXBlb2Ygc3VwcG9ydAorLy8gIENvcHlyaWdodCAoQykgRG91Z2xhcyBHcmVnb3IgMjAwOAorLy8KKy8vICBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0CisvLyAgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuICAoU2VlIGFjY29tcGFueWluZyBmaWxlCisvLyAgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorLy8KKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKyNpZm5kZWYgQk9PU1RfRlVOQ1RJT05fVFlQRU9GX0hQUAorI2RlZmluZSBCT09TVF9GVU5DVElPTl9UWVBFT0ZfSFBQCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb25fZndkLmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlb2YvdHlwZW9mLmhwcD4KKworI2luY2x1ZGUgQk9PU1RfVFlQRU9GX0lOQ1JFTUVOVF9SRUdJU1RSQVRJT05fR1JPVVAoKQorCitCT09TVF9UWVBFT0ZfUkVHSVNURVJfVFlQRShib29zdDo6YmFkX2Z1bmN0aW9uX2NhbGwpCisKKyNpZiAhZGVmaW5lZChCT09TVF9GVU5DVElPTl9OT19GVU5DVElPTl9UWVBFX1NZTlRBWCkKK0JPT1NUX1RZUEVPRl9SRUdJU1RFUl9URU1QTEFURShib29zdDo6ZnVuY3Rpb24sICh0eXBlbmFtZSkpCisjZW5kaWYKKworQk9PU1RfVFlQRU9GX1JFR0lTVEVSX1RFTVBMQVRFKGJvb3N0OjpmdW5jdGlvbjAsICh0eXBlbmFtZSkpCitCT09TVF9UWVBFT0ZfUkVHSVNURVJfVEVNUExBVEUoYm9vc3Q6OmZ1bmN0aW9uMSwgKHR5cGVuYW1lKSh0eXBlbmFtZSkpCitCT09TVF9UWVBFT0ZfUkVHSVNURVJfVEVNUExBVEUoYm9vc3Q6OmZ1bmN0aW9uMiwgKHR5cGVuYW1lKSh0eXBlbmFtZSkodHlwZW5hbWUpKQorQk9PU1RfVFlQRU9GX1JFR0lTVEVSX1RFTVBMQVRFKGJvb3N0OjpmdW5jdGlvbjMsIAorICAodHlwZW5hbWUpKHR5cGVuYW1lKSh0eXBlbmFtZSkodHlwZW5hbWUpKQorQk9PU1RfVFlQRU9GX1JFR0lTVEVSX1RFTVBMQVRFKGJvb3N0OjpmdW5jdGlvbjQsIAorICAodHlwZW5hbWUpKHR5cGVuYW1lKSh0eXBlbmFtZSkodHlwZW5hbWUpKHR5cGVuYW1lKSkKK0JPT1NUX1RZUEVPRl9SRUdJU1RFUl9URU1QTEFURShib29zdDo6ZnVuY3Rpb241LCAKKyAgKHR5cGVuYW1lKSh0eXBlbmFtZSkodHlwZW5hbWUpKHR5cGVuYW1lKSh0eXBlbmFtZSkodHlwZW5hbWUpKQorQk9PU1RfVFlQRU9GX1JFR0lTVEVSX1RFTVBMQVRFKGJvb3N0OjpmdW5jdGlvbjYsIAorICAodHlwZW5hbWUpKHR5cGVuYW1lKSh0eXBlbmFtZSkodHlwZW5hbWUpKHR5cGVuYW1lKSh0eXBlbmFtZSkodHlwZW5hbWUpKQorQk9PU1RfVFlQRU9GX1JFR0lTVEVSX1RFTVBMQVRFKGJvb3N0OjpmdW5jdGlvbjcsIAorICAodHlwZW5hbWUpKHR5cGVuYW1lKSh0eXBlbmFtZSkodHlwZW5hbWUpKHR5cGVuYW1lKSh0eXBlbmFtZSkodHlwZW5hbWUpCisgICh0eXBlbmFtZSkpCitCT09TVF9UWVBFT0ZfUkVHSVNURVJfVEVNUExBVEUoYm9vc3Q6OmZ1bmN0aW9uOCwgCisgICh0eXBlbmFtZSkodHlwZW5hbWUpKHR5cGVuYW1lKSh0eXBlbmFtZSkodHlwZW5hbWUpKHR5cGVuYW1lKSh0eXBlbmFtZSkKKyAgKHR5cGVuYW1lKSh0eXBlbmFtZSkpCitCT09TVF9UWVBFT0ZfUkVHSVNURVJfVEVNUExBVEUoYm9vc3Q6OmZ1bmN0aW9uOSwgCisgICh0eXBlbmFtZSkodHlwZW5hbWUpKHR5cGVuYW1lKSh0eXBlbmFtZSkodHlwZW5hbWUpKHR5cGVuYW1lKSh0eXBlbmFtZSkKKyAgKHR5cGVuYW1lKSh0eXBlbmFtZSkodHlwZW5hbWUpKQorQk9PU1RfVFlQRU9GX1JFR0lTVEVSX1RFTVBMQVRFKGJvb3N0OjpmdW5jdGlvbjEwLCAKKyAgKHR5cGVuYW1lKSh0eXBlbmFtZSkodHlwZW5hbWUpKHR5cGVuYW1lKSh0eXBlbmFtZSkodHlwZW5hbWUpKHR5cGVuYW1lKQorICAodHlwZW5hbWUpKHR5cGVuYW1lKSh0eXBlbmFtZSkodHlwZW5hbWUpKQorI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uL2dlbl9mdW5jdGlvbl9OLnBsIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9nZW5fZnVuY3Rpb25fTi5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGYxMjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5jbHVkZS9ib29zdC9mdW5jdGlvbi9nZW5fZnVuY3Rpb25fTi5wbApAQCAtMCwwICsxLDI2IEBACisjIS91c3IvYmluL3BlcmwgLXcKKyMKKyMgQm9vc3QuRnVuY3Rpb24gbGlicmFyeQorIworIyBDb3B5cmlnaHQgRG91Z2xhcyBHcmVnb3IgMjAwMS0yMDAzLiBVc2UsIG1vZGlmaWNhdGlvbiBhbmQKKyMgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKyMgMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisjIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyMKKyMgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZwordXNlIEVuZ2xpc2g7CisKK2lmICgkI0FSR1YgPCAwKSB7CisgIHByaW50ICJVc2FnZTogcGVybCBnZW5fZnVuY3Rpb25fTiA8bnVtYmVyIG9mIGFyZ3VtZW50cz5cbiI7CisgIGV4aXQ7Cit9CisKKworJHRvdGFsTnVtQXJncyA9ICRBUkdWWzBdOworZm9yICgkbnVtQXJncyA9IDA7ICRudW1BcmdzIDw9ICR0b3RhbE51bUFyZ3M7ICsrJG51bUFyZ3MpIHsKKyAgb3BlbiBPVVQsICI+ZnVuY3Rpb24kbnVtQXJncy5ocHAiOworICBwcmludCBPVVQgIiNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTlVNX0FSR1MgJG51bUFyZ3NcbiI7CisgIHByaW50IE9VVCAiI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2RldGFpbC9tYXliZV9pbmNsdWRlLmhwcD5cbiI7CisgIHByaW50IE9VVCAiI3VuZGVmIEJPT1NUX0ZVTkNUSU9OX05VTV9BUkdTXG4iOworICBjbG9zZSBPVVQ7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uX2VxdWFsLmhwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL2luY2x1ZGUvYm9vc3QvZnVuY3Rpb25fZXF1YWwuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNzZjNzUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmNsdWRlL2Jvb3N0L2Z1bmN0aW9uX2VxdWFsLmhwcApAQCAtMCwwICsxLDI4IEBACisvLyAgQ29weXJpZ2h0IERvdWdsYXMgR3JlZ29yIDIwMDQuCisvLyAgQ29weXJpZ2h0IDIwMDUgUGV0ZXIgRGltb3YKKworLy8gIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0bworLy8gIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKy8vICAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisjaWZuZGVmIEJPT1NUX0ZVTkNUSU9OX0VRVUFMX0hQUAorI2RlZmluZSBCT09TVF9GVU5DVElPTl9FUVVBTF9IUFAKKworbmFtZXNwYWNlIGJvb3N0IHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRiwgdHlwZW5hbWUgRz4KKyAgYm9vbCBmdW5jdGlvbl9lcXVhbF9pbXBsKGNvbnN0IEYmIGYsIGNvbnN0IEcmIGcsIGxvbmcpCisgIHsgcmV0dXJuIGYgPT0gZzsgfQorCisvLyBmdW5jdGlvbl9lcXVhbF9pbXBsIG5lZWRzIHRvIGJlIHVucXVhbGlmaWVkIHRvIHBpY2sKKy8vIHVzZXIgb3ZlcmxvYWRzIG9uIHR3by1waGFzZSBjb21waWxlcnMKKwordGVtcGxhdGU8dHlwZW5hbWUgRiwgdHlwZW5hbWUgRz4KKyAgYm9vbCBmdW5jdGlvbl9lcXVhbChjb25zdCBGJiBmLCBjb25zdCBHJiBnKQorICB7IHJldHVybiBmdW5jdGlvbl9lcXVhbF9pbXBsKGYsIGcsIDApOyB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBib29zdAorCisjZW5kaWYgLy8gQk9PU1RfRlVOQ1RJT05fRVFVQUxfSFBQCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi9pbmRleC5odG1sIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2Q0MGQyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vaW5kZXguaHRtbApAQCAtMCwwICsxLDIwIEBACis8aHRtbD4KKzwhLS0KKyAgIENvcHlyaWdodCAoYykgMjAwMiBEb3VnbGFzIEdyZWdvciA8ZG91Zy5ncmVnb3IgLWF0LSBnbWFpbC5jb20+CisgIAorICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICAtLT4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDsgVVJMPS4uLy4uL2RvYy9odG1sL2Z1bmN0aW9uLmh0bWwiPgorPC9oZWFkPgorPGJvZHk+CitBdXRvbWF0aWMgcmVkaXJlY3Rpb24gZmFpbGVkLCBwbGVhc2UgZ28gdG8KKzxhIGhyZWY9Ii4uLy4uL2RvYy9odG1sL2Z1bmN0aW9uLmh0bWwiPi4uLy4uL2RvYy9odG1sL2Z1bmN0aW9uLmh0bWw8L2E+ICZuYnNwOzxocj4KKzxwPqkgQ29weXJpZ2h0IEJlbWFuIERhd2VzLCAyMDAxPC9wPgorPHA+RGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyAKK2ZpbGUgPGEgaHJlZj0iLi4vLi4vTElDRU5TRV8xXzAudHh0Ij5MSUNFTlNFXzFfMC50eHQ8L2E+IG9yIGNvcHkgCithdCA8YSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQiPnd3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0PC9hPik8L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vbWV0YS9saWJyYXJpZXMuanNvbiBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL21ldGEvbGlicmFyaWVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1MjMxOQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL21ldGEvbGlicmFyaWVzLmpzb24KQEAgLTAsMCArMSwxOCBAQAoreworICAgICJrZXkiOiAiZnVuY3Rpb24iLAorICAgICJuYW1lIjogIkZ1bmN0aW9uIiwKKyAgICAiYXV0aG9ycyI6IFsKKyAgICAgICAgIkRvdWcgR3JlZ29yIgorICAgIF0sCisgICAgImRlc2NyaXB0aW9uIjogIkZ1bmN0aW9uIG9iamVjdCB3cmFwcGVycyBmb3IgZGVmZXJyZWQgY2FsbHMgb3IgY2FsbGJhY2tzLiIsCisgICAgInN0ZCI6IFsKKyAgICAgICAgInRyMSIKKyAgICBdLAorICAgICJjYXRlZ29yeSI6IFsKKyAgICAgICAgIkZ1bmN0aW9uLW9iamVjdHMiLAorICAgICAgICAiUHJvZ3JhbW1pbmciCisgICAgXSwKKyAgICAibWFpbnRhaW5lcnMiOiBbCisgICAgICAgICJEb3VnbGFzIEdyZWdvciA8ZGdyZWdvciAtYXQtIGNzLmluZGlhbmEuZWR1PiIKKyAgICBdCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L0phbWZpbGUudjIgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L0phbWZpbGUudjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkMTZiNAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvSmFtZmlsZS52MgpAQCAtMCwwICsxLDc1IEBACisjIEZ1bmN0aW9uIGxpYnJhcnkKKworIyBDb3B5cmlnaHQgRG91Z2xhcyBHcmVnb3IgMjAwMS0yMDAzLiBVc2UsIG1vZGlmaWNhdGlvbiBhbmQKKyMgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKyMgMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisjIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnLworCitwcm9qZWN0CisgICAgOiByZXF1aXJlbWVudHMgPHRvb2xzZXQ+bXN2Yzo8YXN5bmNoLWV4Y2VwdGlvbnM+b24KKyAgICA6IHNvdXJjZS1sb2NhdGlvbiAkKEJPT1NUX1JPT1QpCisgICAgOworCisjIGJyaW5nIGluIHJ1bGVzIGZvciB0ZXN0aW5nCitpbXBvcnQgdGVzdGluZyA7CisKK3sKKworICB0ZXN0LXN1aXRlIGZ1bmN0aW9uCisgICAgOiAKKyAgWyBydW4gbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3Rlc3QuY3BwIDogIDogIDogIDogbGliX2Z1bmN0aW9uX3Rlc3QgXQorCisgIFsgcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl90ZXN0LmNwcCA6ICA6ICA6IDxydHRpPm9mZiA6IGxpYl9mdW5jdGlvbl90ZXN0X25vX3J0dGkgXQorCisgIFsgcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9uX3Rlc3QuY3BwIDogIDogIDogIDogIF0KKworICBbIHJ1biBsaWJzL2Z1bmN0aW9uL3Rlc3QvYWxsb2NhdG9yX3Rlc3QuY3BwIC4uLy4uLy4uL2xpYnMvdGVzdC9idWlsZC8vYm9vc3RfdGVzdF9leGVjX21vbml0b3IgOiAgOiAgOiAgOiAgXQorCisgIFsgcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9zdGF0ZWxlc3NfdGVzdC5jcHAgLi4vLi4vLi4vbGlicy90ZXN0L2J1aWxkLy9ib29zdF90ZXN0X2V4ZWNfbW9uaXRvciA6ICA6ICA6ICA6ICBdCisKKyAgWyBydW4gbGlicy9mdW5jdGlvbi90ZXN0L2xhbWJkYV90ZXN0LmNwcCAuLi8uLi8uLi9saWJzL3Rlc3QvYnVpbGQvL2Jvb3N0X3Rlc3RfZXhlY19tb25pdG9yIDogIDogIDogIDogIF0KKworICBbIGNvbXBpbGUtZmFpbCBsaWJzL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fdGVzdF9mYWlsMS5jcHAgOiAgOiAgOiAgOiAgXQorCisgIFsgY29tcGlsZS1mYWlsIGxpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl90ZXN0X2ZhaWwyLmNwcCA6ICA6ICA6ICA6ICBdCisKKyAgWyBjb21waWxlIGxpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl8zMC5jcHAgOiAgOiAgOiAgOiAgXSAKKworICBbIGNvbXBpbGUgbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uXzMwX3JlcGVhdC5jcHAgOiAgOiAgOiAgOiAgXSAKKworICBbIHJ1biBsaWJzL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fYXJpdGhfY3h4OTguY3BwIDogIDogIDogIDogIF0KKworICBbIHJ1biBsaWJzL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fYXJpdGhfcG9ydGFibGUuY3BwIDogIDogIDogIDogIF0KKworICBbIHJ1biBsaWJzL2Z1bmN0aW9uL3Rlc3Qvc3VtX2F2Z19jeHg5OC5jcHAgOiAgOiAgOiAgOiAgXQorCisgIFsgcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9zdW1fYXZnX3BvcnRhYmxlLmNwcCA6ICA6ICA6ICA6ICBdCisKKyAgWyBydW4gbGlicy9mdW5jdGlvbi90ZXN0L21lbV9mdW5fY3h4OTguY3BwIDogIDogIDogIDogIF0KKworICBbIHJ1biBsaWJzL2Z1bmN0aW9uL3Rlc3QvbWVtX2Z1bl9wb3J0YWJsZS5jcHAgOiAgOiAgOiAgOiAgXQorCisgIFsgcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9zdGRfYmluZF9jeHg5OC5jcHAgOiAgOiAgOiAgOiAgXQorCisgIFsgcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9zdGRfYmluZF9wb3J0YWJsZS5jcHAgOiAgOiAgOiAgOiAgXQorCisgIFsgcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9yZWZfY3h4OTguY3BwIDogIDogIDogIDogIF0KKworICBbIHJ1biBsaWJzL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fcmVmX3BvcnRhYmxlLmNwcCA6ICA6ICA6ICA6ICBdCisgIAorICBbIHJ1biBsaWJzL2Z1bmN0aW9uL3Rlc3QvY29udGFpbnNfdGVzdC5jcHAgOiA6IDogOiBdCisgICAKKyAgWyBydW4gbGlicy9mdW5jdGlvbi90ZXN0L2NvbnRhaW5zMl90ZXN0LmNwcCA6IDogOiA6IF0KKyAgIAorICBbIHJ1biBsaWJzL2Z1bmN0aW9uL3Rlc3Qvbm90aHJvd19zd2FwLmNwcCA6ICA6ICA6ICA6ICBdCisKKyAgWyBydW4gbGlicy9mdW5jdGlvbi90ZXN0L3J2YWx1ZXNfdGVzdC5jcHAgOiAgOiAgOiAgOiAgXQorCisgIFsgY29tcGlsZSBsaWJzL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fdHlwZW9mX3Rlc3QuY3BwIF0KKworICBbIHJ1biBsaWJzL2Z1bmN0aW9uL3Rlc3QvcmVzdWx0X2FyZ190eXBlc190ZXN0LmNwcCBdCisgOworfQorICAgICAgCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L2FsbG9jYXRvcl90ZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvYWxsb2NhdG9yX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NDNiMmIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L2FsbG9jYXRvcl90ZXN0LmNwcApAQCAtMCwwICsxLDEzNyBAQAorLy8gQm9vc3QuRnVuY3Rpb24gbGlicmFyeQorCisvLyAgQ29weXJpZ2h0IERvdWdsYXMgR3JlZ29yIDIwMDEtMjAwMy4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvbWluaW1hbC5ocHA+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBib29zdDsKKworc3RhdGljIGludCBhbGxvY19jb3VudCA9IDA7CitzdGF0aWMgaW50IGRlYWxsb2NfY291bnQgPSAwOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGNvdW50aW5nX2FsbG9jYXRvciA6IHB1YmxpYyBzdGQ6OmFsbG9jYXRvcjxUPgoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICBzdHJ1Y3QgcmViaW5kCisgIHsKKyAgICB0eXBlZGVmIGNvdW50aW5nX2FsbG9jYXRvcjxVPiBvdGhlcjsKKyAgfTsKKworICBjb3VudGluZ19hbGxvY2F0b3IoKQorICB7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICBjb3VudGluZ19hbGxvY2F0b3IoIGNvdW50aW5nX2FsbG9jYXRvcjxVPiApCisgIHsKKyAgfQorCisgIFQqIGFsbG9jYXRlKHN0ZDo6c2l6ZV90IG4pCisgIHsKKyAgICBhbGxvY19jb3VudCsrOworICAgIHJldHVybiBzdGQ6OmFsbG9jYXRvcjxUPjo6YWxsb2NhdGUobik7CisgIH0KKworICB2b2lkIGRlYWxsb2NhdGUoVCogcCwgc3RkOjpzaXplX3QgbikKKyAgeworICAgIGRlYWxsb2NfY291bnQrKzsKKyAgICBzdGQ6OmFsbG9jYXRvcjxUPjo6ZGVhbGxvY2F0ZShwLCBuKTsKKyAgfQorfTsKKworc3RydWN0IGVuYWJsZV9zbWFsbF9vYmplY3Rfb3B0aW1pemF0aW9uCit7Cit9OworCitzdHJ1Y3QgZGlzYWJsZV9zbWFsbF9vYmplY3Rfb3B0aW1pemF0aW9uCit7CisgIGludCB1bnVzZWRfc3RhdGVfZGF0YVszMl07Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgYmFzZT4KK3N0cnVjdCBwbHVzX2ludDogYmFzZQoreworICBpbnQgb3BlcmF0b3IoKShpbnQgeCwgaW50IHkpIGNvbnN0IHsgcmV0dXJuIHggKyB5OyB9Cit9OworCitzdGF0aWMgaW50IGRvX21pbnVzKGludCB4LCBpbnQgeSkgeyByZXR1cm4geC15OyB9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBiYXNlPgorc3RydWN0IERvTm90aGluZzogYmFzZQoreworICB2b2lkIG9wZXJhdG9yKCkoKSBjb25zdCB7fQorfTsKKworc3RhdGljIHZvaWQgZG9fbm90aGluZygpIHt9CisKK2ludAordGVzdF9tYWluKGludCwgY2hhcipbXSkKK3sKKyAgZnVuY3Rpb24yPGludCwgaW50LCBpbnQ+IGY7CisgIGYuYXNzaWduKCBwbHVzX2ludDxkaXNhYmxlX3NtYWxsX29iamVjdF9vcHRpbWl6YXRpb24+KCksIGNvdW50aW5nX2FsbG9jYXRvcjxpbnQ+KCkgKTsKKyAgZi5jbGVhcigpOworICBCT09TVF9DSEVDSyhhbGxvY19jb3VudCA9PSAxKTsKKyAgQk9PU1RfQ0hFQ0soZGVhbGxvY19jb3VudCA9PSAxKTsKKyAgYWxsb2NfY291bnQgPSAwOworICBkZWFsbG9jX2NvdW50ID0gMDsKKyAgZi5hc3NpZ24oIHBsdXNfaW50PGVuYWJsZV9zbWFsbF9vYmplY3Rfb3B0aW1pemF0aW9uPigpLCBjb3VudGluZ19hbGxvY2F0b3I8aW50PigpICk7CisgIGYuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0soYWxsb2NfY291bnQgPT0gMCk7CisgIEJPT1NUX0NIRUNLKGRlYWxsb2NfY291bnQgPT0gMCk7CisgIGYuYXNzaWduKCBwbHVzX2ludDxkaXNhYmxlX3NtYWxsX29iamVjdF9vcHRpbWl6YXRpb24+KCksIHN0ZDo6YWxsb2NhdG9yPGludD4oKSApOworICBmLmNsZWFyKCk7CisgIGYuYXNzaWduKCBwbHVzX2ludDxlbmFibGVfc21hbGxfb2JqZWN0X29wdGltaXphdGlvbj4oKSwgc3RkOjphbGxvY2F0b3I8aW50PigpICk7CisgIGYuY2xlYXIoKTsKKworICBhbGxvY19jb3VudCA9IDA7CisgIGRlYWxsb2NfY291bnQgPSAwOworICBmLmFzc2lnbiggJmRvX21pbnVzLCBjb3VudGluZ19hbGxvY2F0b3I8aW50PigpICk7CisgIGYuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0soYWxsb2NfY291bnQgPT0gMCk7CisgIEJPT1NUX0NIRUNLKGRlYWxsb2NfY291bnQgPT0gMCk7CisgIGYuYXNzaWduKCAmZG9fbWludXMsIHN0ZDo6YWxsb2NhdG9yPGludD4oKSApOworICBmLmNsZWFyKCk7CisKKyAgZnVuY3Rpb24wPHZvaWQ+IGZ2OworICBhbGxvY19jb3VudCA9IDA7CisgIGRlYWxsb2NfY291bnQgPSAwOworICBmdi5hc3NpZ24oIERvTm90aGluZzxkaXNhYmxlX3NtYWxsX29iamVjdF9vcHRpbWl6YXRpb24+KCksIGNvdW50aW5nX2FsbG9jYXRvcjxpbnQ+KCkgKTsKKyAgZnYuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0soYWxsb2NfY291bnQgPT0gMSk7CisgIEJPT1NUX0NIRUNLKGRlYWxsb2NfY291bnQgPT0gMSk7CisgIGFsbG9jX2NvdW50ID0gMDsKKyAgZGVhbGxvY19jb3VudCA9IDA7CisgIGZ2LmFzc2lnbiggRG9Ob3RoaW5nPGVuYWJsZV9zbWFsbF9vYmplY3Rfb3B0aW1pemF0aW9uPigpLCBjb3VudGluZ19hbGxvY2F0b3I8aW50PigpICk7CisgIGZ2LmNsZWFyKCk7CisgIEJPT1NUX0NIRUNLKGFsbG9jX2NvdW50ID09IDApOworICBCT09TVF9DSEVDSyhkZWFsbG9jX2NvdW50ID09IDApOworICBmdi5hc3NpZ24oIERvTm90aGluZzxkaXNhYmxlX3NtYWxsX29iamVjdF9vcHRpbWl6YXRpb24+KCksIHN0ZDo6YWxsb2NhdG9yPGludD4oKSApOworICBmdi5jbGVhcigpOworICBmdi5hc3NpZ24oIERvTm90aGluZzxlbmFibGVfc21hbGxfb2JqZWN0X29wdGltaXphdGlvbj4oKSwgc3RkOjphbGxvY2F0b3I8aW50PigpICk7CisgIGZ2LmNsZWFyKCk7CisKKyAgYWxsb2NfY291bnQgPSAwOworICBkZWFsbG9jX2NvdW50ID0gMDsKKyAgZnYuYXNzaWduKCAmZG9fbm90aGluZywgY291bnRpbmdfYWxsb2NhdG9yPGludD4oKSApOworICBmdi5jbGVhcigpOworICBCT09TVF9DSEVDSyhhbGxvY19jb3VudCA9PSAwKTsKKyAgQk9PU1RfQ0hFQ0soZGVhbGxvY19jb3VudCA9PSAwKTsKKyAgZnYuYXNzaWduKCAmZG9fbm90aGluZywgc3RkOjphbGxvY2F0b3I8aW50PigpICk7CisgIGZ2LmNsZWFyKCk7CisgIAorICBmdW5jdGlvbjA8dm9pZD4gZnYyOworICBmdi5hc3NpZ24oJmRvX25vdGhpbmcsIHN0ZDo6YWxsb2NhdG9yPGludD4oKSApOworICBmdjIuYXNzaWduKGZ2LCBzdGQ6OmFsbG9jYXRvcjxpbnQ+KCkgKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvY29udGFpbnMyX3Rlc3QuY3BwIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9jb250YWluczJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2ZDQ3OQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvY29udGFpbnMyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsODggQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKworLy8gIENvcHlyaWdodCBEb3VnbGFzIEdyZWdvciAyMDA0LgorLy8gIENvcHlyaWdodCAyMDA1IFBldGVyIERpbW92CisKKy8vICBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8KKy8vICB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisvLyAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC9kZXRhaWwvbGlnaHR3ZWlnaHRfdGVzdC5ocHA+CisKK3N0YXRpYyBpbnQgZm9ydHlfdHdvKCkKK3sKKyAgICByZXR1cm4gNDI7Cit9CisKK3N0cnVjdCBTZXZlbnRlZW4KK3sKKyAgICBpbnQgb3BlcmF0b3IoKSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gMTc7CisgICAgfQorfTsKKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNldmVudGVlbiYsIGNvbnN0IFNldmVudGVlbiYpCit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0cnVjdCBSZXR1cm5JbnQKK3sKKyAgICBleHBsaWNpdCBSZXR1cm5JbnQoaW50IHZhbHVlKSA6IHZhbHVlKHZhbHVlKQorICAgIHsKKyAgICB9CisKKyAgICBpbnQgb3BlcmF0b3IoKSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgaW50IHZhbHVlOworfTsKKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJldHVybkludCYgeCwgY29uc3QgUmV0dXJuSW50JiB5KQoreworICAgIHJldHVybiB4LnZhbHVlID09IHkudmFsdWU7Cit9CisKK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBSZXR1cm5JbnQmIHgsIGNvbnN0IFJldHVybkludCYgeSkKK3sKKyAgICByZXR1cm4geC52YWx1ZSAhPSB5LnZhbHVlOworfQorCitpbnQgbWFpbigpCit7CisgICAgYm9vc3Q6OmZ1bmN0aW9uMDxpbnQ+IGZuOworCisgICAgZm4gPSAmZm9ydHlfdHdvOworCisgICAgQk9PU1RfVEVTVCggZm4oKSA9PSA0MiApOworCisgICAgQk9PU1RfVEVTVCggZm4uY29udGFpbnMoJmZvcnR5X3R3bykgKTsKKyAgICBCT09TVF9URVNUKCAhZm4uY29udGFpbnMoIFNldmVudGVlbigpICkgKTsKKyAgICBCT09TVF9URVNUKCAhZm4uY29udGFpbnMoIFJldHVybkludCgwKSApICk7CisgICAgQk9PU1RfVEVTVCggIWZuLmNvbnRhaW5zKCBSZXR1cm5JbnQoMTIpICkgKTsKKworICAgIGZuID0gU2V2ZW50ZWVuKCk7CisKKyAgICBCT09TVF9URVNUKCBmbigpID09IDE3ICk7CisKKyAgICBCT09TVF9URVNUKCAhZm4uY29udGFpbnMoICZmb3J0eV90d28gKSApOworICAgIEJPT1NUX1RFU1QoIGZuLmNvbnRhaW5zKCBTZXZlbnRlZW4oKSApICk7CisgICAgQk9PU1RfVEVTVCggIWZuLmNvbnRhaW5zKCBSZXR1cm5JbnQoMCkgKSApOworICAgIEJPT1NUX1RFU1QoICFmbi5jb250YWlucyggUmV0dXJuSW50KDEyKSApICk7CisKKyAgICBmbiA9IFJldHVybkludCgxMik7CisKKyAgICBCT09TVF9URVNUKCBmbigpID09IDEyICk7CisKKyAgICBCT09TVF9URVNUKCAhZm4uY29udGFpbnMoICZmb3J0eV90d28gKSApOworICAgIEJPT1NUX1RFU1QoICFmbi5jb250YWlucyggU2V2ZW50ZWVuKCkgKSApOworICAgIEJPT1NUX1RFU1QoICFmbi5jb250YWlucyggUmV0dXJuSW50KDApICkgKTsKKyAgICBCT09TVF9URVNUKCBmbi5jb250YWlucyggUmV0dXJuSW50KDEyKSApICk7CisKKyAgICByZXR1cm4gYm9vc3Q6OnJlcG9ydF9lcnJvcnMoKTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvY29udGFpbnNfdGVzdC5jcHAgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L2NvbnRhaW5zX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMTE1NTkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L2NvbnRhaW5zX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMjM1IEBACisvLyBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5CisKKy8vICBDb3B5cmlnaHQgRG91Z2xhcyBHcmVnb3IgMjAwNC4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L21pbmltYWwuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC9yZWYuaHBwPgorCitzdGF0aWMgaW50IGZvcnR5X3R3bygpIHsgcmV0dXJuIDQyOyB9CisKK3N0cnVjdCBTZXZlbnRlZW4KK3sKKyAgaW50IG9wZXJhdG9yKCkoKSBjb25zdCB7IHJldHVybiAxNzsgfQorfTsKKworc3RydWN0IFJldHVybkludAoreworICBleHBsaWNpdCBSZXR1cm5JbnQoaW50IHZhbHVlKSA6IHZhbHVlKHZhbHVlKSB7fQorCisgIGludCBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0KKworICBpbnQgdmFsdWU7Cit9OworCitib29sIG9wZXJhdG9yPT0oY29uc3QgUmV0dXJuSW50JiB4LCBjb25zdCBSZXR1cm5JbnQmIHkpCit7IHJldHVybiB4LnZhbHVlID09IHkudmFsdWU7IH0KKworYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJldHVybkludCYgeCwgY29uc3QgUmV0dXJuSW50JiB5KQoreyByZXR1cm4geC52YWx1ZSAhPSB5LnZhbHVlOyB9CisKK25hbWVzcGFjZSBjb250YWluX3Rlc3QgeworCitzdHJ1Y3QgUmV0dXJuSW50RkUKK3sKKyAgZXhwbGljaXQgUmV0dXJuSW50RkUoaW50IHZhbHVlKSA6IHZhbHVlKHZhbHVlKSB7fQorCisgIGludCBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0KKworICBpbnQgdmFsdWU7Cit9OworCit9CisKKyNpZm5kZWYgQk9PU1RfTk9fQVJHVU1FTlRfREVQRU5ERU5UX0xPT0tVUAorCituYW1lc3BhY2UgY29udGFpbl90ZXN0IHsKKyMgaWZuZGVmIEJPT1NUX05PX0ZVTkNUSU9OX1RFTVBMQVRFX09SREVSSU5HCitib29sIGZ1bmN0aW9uX2VxdWFsKGNvbnN0IFJldHVybkludEZFJiB4LCBjb25zdCBSZXR1cm5JbnRGRSYgeSkKK3sgcmV0dXJuIHgudmFsdWUgPT0geS52YWx1ZTsgfQorIyBlbHNlCitib29sIGZ1bmN0aW9uX2VxdWFsX2ltcGwoY29uc3QgUmV0dXJuSW50RkUmIHgsIGNvbnN0IFJldHVybkludEZFJiB5LCBpbnQpCit7IHJldHVybiB4LnZhbHVlID09IHkudmFsdWU7IH0KKyMgZW5kaWYgLy8gI2lmbmRlZiBCT09TVF9OT19GVU5DVElPTl9URU1QTEFURV9PUkRFUklORworfQorI2Vsc2UgLy8gQk9PU1RfTk9fQVJHVU1FTlRfREVQRU5ERU5UX0xPT0tVUAorbmFtZXNwYWNlIGJvb3N0IHsKKyMgaWZuZGVmIEJPT1NUX05PX0ZVTkNUSU9OX1RFTVBMQVRFX09SREVSSU5HCitib29sIAorZnVuY3Rpb25fZXF1YWwoY29uc3QgY29udGFpbl90ZXN0OjpSZXR1cm5JbnRGRSYgeCwgCisgICAgICAgICAgICAgICBjb25zdCBjb250YWluX3Rlc3Q6OlJldHVybkludEZFJiB5KQoreyByZXR1cm4geC52YWx1ZSA9PSB5LnZhbHVlOyB9CisjIGVsc2UKK2Jvb2wgCitmdW5jdGlvbl9lcXVhbF9pbXBsKGNvbnN0IGNvbnRhaW5fdGVzdDo6UmV0dXJuSW50RkUmIHgsIAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluX3Rlc3Q6OlJldHVybkludEZFJiB5LCBpbnQpCit7IHJldHVybiB4LnZhbHVlID09IHkudmFsdWU7IH0KKyMgZW5kaWYKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB0YXJnZXRfdGVzdCgpCit7CisgIGJvb3N0OjpmdW5jdGlvbjA8aW50PiBmOworCisgIGYgPSAmZm9ydHlfdHdvOworICBCT09TVF9DSEVDSygqZi50YXJnZXQ8aW50ICgqKSgpPigpID09ICZmb3J0eV90d28pOworICBCT09TVF9DSEVDSyghZi50YXJnZXQ8U2V2ZW50ZWVuPigpKTsKKworICBmID0gU2V2ZW50ZWVuKCk7CisgIEJPT1NUX0NIRUNLKCFmLnRhcmdldDxpbnQgKCopKCk+KCkpOworICBCT09TVF9DSEVDSyhmLnRhcmdldDxTZXZlbnRlZW4+KCkpOworCisgIFNldmVudGVlbiB0aGlzX3NldmVudGVlbjsKKyAgZiA9IGJvb3N0OjpyZWYodGhpc19zZXZlbnRlZW4pOworICBCT09TVF9DSEVDSyghZi50YXJnZXQ8aW50ICgqKSgpPigpKTsKKyAgQk9PU1RfQ0hFQ0soZi50YXJnZXQ8U2V2ZW50ZWVuPigpKTsKKyAgQk9PU1RfQ0hFQ0soZi50YXJnZXQ8U2V2ZW50ZWVuPigpID09ICZ0aGlzX3NldmVudGVlbik7CisKKyAgY29uc3QgU2V2ZW50ZWVuIGNvbnN0X3NldmVudGVlbiA9IHRoaXNfc2V2ZW50ZWVuOworICBmID0gYm9vc3Q6OnJlZihjb25zdF9zZXZlbnRlZW4pOworICBCT09TVF9DSEVDSyghZi50YXJnZXQ8aW50ICgqKSgpPigpKTsKKyAgQk9PU1RfQ0hFQ0soZi50YXJnZXQ8Y29uc3QgU2V2ZW50ZWVuPigpKTsKKyAgQk9PU1RfQ0hFQ0soZi50YXJnZXQ8Y29uc3QgU2V2ZW50ZWVuPigpID09ICZjb25zdF9zZXZlbnRlZW4pOworICBCT09TVF9DSEVDSyhmLnRhcmdldDxjb25zdCB2b2xhdGlsZSBTZXZlbnRlZW4+KCkpOworICBCT09TVF9DSEVDSyghZi50YXJnZXQ8U2V2ZW50ZWVuPigpKTsKKyAgQk9PU1RfQ0hFQ0soIWYudGFyZ2V0PHZvbGF0aWxlIFNldmVudGVlbj4oKSk7Cit9CisKK3N0YXRpYyB2b2lkIGVxdWFsX3Rlc3QoKQoreworICBib29zdDo6ZnVuY3Rpb24wPGludD4gZjsKKworICBmID0gJmZvcnR5X3R3bzsKKyAgQk9PU1RfQ0hFQ0soZiA9PSAmZm9ydHlfdHdvKTsKKyAgQk9PU1RfQ0hFQ0soZiAhPSBSZXR1cm5JbnQoMTcpKTsKKyNpZiAhKGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPD0gMykKKyAgQk9PU1RfQ0hFQ0soJmZvcnR5X3R3byA9PSBmKTsKKyAgQk9PU1RfQ0hFQ0soUmV0dXJuSW50KDE3KSAhPSBmKTsKKyNlbmRpZgorCisgIEJPT1NUX0NIRUNLKGYuY29udGFpbnMoJmZvcnR5X3R3bykpOworCisgIGYgPSBSZXR1cm5JbnQoMTcpOworICBCT09TVF9DSEVDSyhmICE9ICZmb3J0eV90d28pOworICBCT09TVF9DSEVDSyhmID09IFJldHVybkludCgxNykpOworICBCT09TVF9DSEVDSyhmICE9IFJldHVybkludCgxNikpOworI2lmICEoZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA8PSAzKQorICBCT09TVF9DSEVDSygmZm9ydHlfdHdvICE9IGYpOworICBCT09TVF9DSEVDSyhSZXR1cm5JbnQoMTcpID09IGYpOworICBCT09TVF9DSEVDSyhSZXR1cm5JbnQoMTYpICE9IGYpOworI2VuZGlmCisKKyAgQk9PU1RfQ0hFQ0soZi5jb250YWlucyhSZXR1cm5JbnQoMTcpKSk7CisKKyAgZiA9IGNvbnRhaW5fdGVzdDo6UmV0dXJuSW50RkUoMTcpOworICBCT09TVF9DSEVDSyhmICE9ICZmb3J0eV90d28pOworICBCT09TVF9DSEVDSyhmID09IGNvbnRhaW5fdGVzdDo6UmV0dXJuSW50RkUoMTcpKTsKKyAgQk9PU1RfQ0hFQ0soZiAhPSBjb250YWluX3Rlc3Q6OlJldHVybkludEZFKDE2KSk7CisjaWYgIShkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fIDw9IDMpCisgIEJPT1NUX0NIRUNLKCZmb3J0eV90d28gIT0gZik7CisgIEJPT1NUX0NIRUNLKGNvbnRhaW5fdGVzdDo6UmV0dXJuSW50RkUoMTcpID09IGYpOworICBCT09TVF9DSEVDSyhjb250YWluX3Rlc3Q6OlJldHVybkludEZFKDE2KSAhPSBmKTsKKyNlbmRpZgorCisgIEJPT1NUX0NIRUNLKGYuY29udGFpbnMoY29udGFpbl90ZXN0OjpSZXR1cm5JbnRGRSgxNykpKTsKKworI2lmICFkZWZpbmVkKEJPT1NUX0ZVTkNUSU9OX05PX0ZVTkNUSU9OX1RZUEVfU1lOVEFYKQorICBib29zdDo6ZnVuY3Rpb248aW50KHZvaWQpPiBnOworCisgIGcgPSAmZm9ydHlfdHdvOworICBCT09TVF9DSEVDSyhnID09ICZmb3J0eV90d28pOworICBCT09TVF9DSEVDSyhnICE9IFJldHVybkludCgxNykpOworIyAgaWYgIShkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fIDw9IDMpCisgIEJPT1NUX0NIRUNLKCZmb3J0eV90d28gPT0gZyk7CisgIEJPT1NUX0NIRUNLKFJldHVybkludCgxNykgIT0gZyk7CisjICBlbmRpZgorCisgIGcgPSBSZXR1cm5JbnQoMTcpOworICBCT09TVF9DSEVDSyhnICE9ICZmb3J0eV90d28pOworICBCT09TVF9DSEVDSyhnID09IFJldHVybkludCgxNykpOworICBCT09TVF9DSEVDSyhnICE9IFJldHVybkludCgxNikpOworIyAgaWYgIShkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fIDw9IDMpCisgIEJPT1NUX0NIRUNLKCZmb3J0eV90d28gIT0gZyk7CisgIEJPT1NUX0NIRUNLKFJldHVybkludCgxNykgPT0gZyk7CisgIEJPT1NUX0NIRUNLKFJldHVybkludCgxNikgIT0gZyk7CisjICBlbmRpZgorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHJlZl9lcXVhbF90ZXN0KCkKK3sKKyAgeworICAgIFJldHVybkludCByaSgxNyk7CisgICAgYm9vc3Q6OmZ1bmN0aW9uMDxpbnQ+IGYgPSBib29zdDo6cmVmKHJpKTsKKworICAgIC8vIFJlZmVyZW5jZXMgYW5kIHZhbHVlcyBhcmUgZXF1YWwKKyAgICBCT09TVF9DSEVDSyhmID09IGJvb3N0OjpyZWYocmkpKTsKKyAgICBCT09TVF9DSEVDSyhmID09IHJpKTsKKyAgICBCT09TVF9DSEVDSyhib29zdDo6cmVmKHJpKSA9PSBmKTsKKyAgICBCT09TVF9DSEVDSyghKGYgIT0gYm9vc3Q6OnJlZihyaSkpKTsKKyAgICBCT09TVF9DSEVDSyghKGYgIT0gcmkpKTsKKyAgICBCT09TVF9DSEVDSyghKGJvb3N0OjpyZWYocmkpICE9IGYpKTsKKyNpZiAhKGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPD0gMykKKyAgICBCT09TVF9DSEVDSyhyaSA9PSBmKTsKKyAgICBCT09TVF9DSEVDSyghKHJpICE9IGYpKTsKKyNlbmRpZgorCisgICAgLy8gVmFsdWVzIGVxdWFsLCByZWZlcmVuY2VzIGluZXF1YWwKKyAgICBSZXR1cm5JbnQgcmkyKDE3KTsKKyAgICBCT09TVF9DSEVDSyhmID09IHJpMik7CisgICAgQk9PU1RfQ0hFQ0soZiAhPSBib29zdDo6cmVmKHJpMikpOworICAgIEJPT1NUX0NIRUNLKGJvb3N0OjpyZWYocmkyKSAhPSBmKTsKKyAgICBCT09TVF9DSEVDSyghKGYgIT0gcmkyKSk7CisgICAgQk9PU1RfQ0hFQ0soIShmID09IGJvb3N0OjpyZWYocmkyKSkpOworICAgIEJPT1NUX0NIRUNLKCEoYm9vc3Q6OnJlZihyaTIpID09IGYpKTsKKyNpZiAhKGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPD0gMykKKyAgICBCT09TVF9DSEVDSyhyaTIgPT0gZik7CisgICAgQk9PU1RfQ0hFQ0soIShyaTIgIT0gZikpOworI2VuZGlmIAorICB9CisKKyNpZiAhZGVmaW5lZChCT09TVF9GVU5DVElPTl9OT19GVU5DVElPTl9UWVBFX1NZTlRBWCkKKyAgeworICAgIFJldHVybkludCByaSgxNyk7CisgICAgYm9vc3Q6OmZ1bmN0aW9uPGludCh2b2lkKT4gZiA9IGJvb3N0OjpyZWYocmkpOworCisgICAgLy8gUmVmZXJlbmNlcyBhbmQgdmFsdWVzIGFyZSBlcXVhbAorICAgIEJPT1NUX0NIRUNLKGYgPT0gYm9vc3Q6OnJlZihyaSkpOworICAgIEJPT1NUX0NIRUNLKGYgPT0gcmkpOworICAgIEJPT1NUX0NIRUNLKGJvb3N0OjpyZWYocmkpID09IGYpOworICAgIEJPT1NUX0NIRUNLKCEoZiAhPSBib29zdDo6cmVmKHJpKSkpOworICAgIEJPT1NUX0NIRUNLKCEoZiAhPSByaSkpOworICAgIEJPT1NUX0NIRUNLKCEoYm9vc3Q6OnJlZihyaSkgIT0gZikpOworIyAgaWYgIShkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fIDw9IDMpCisgICAgQk9PU1RfQ0hFQ0socmkgPT0gZik7CisgICAgQk9PU1RfQ0hFQ0soIShyaSAhPSBmKSk7CisjICBlbmRpZgorCisgICAgLy8gVmFsdWVzIGVxdWFsLCByZWZlcmVuY2VzIGluZXF1YWwKKyAgICBSZXR1cm5JbnQgcmkyKDE3KTsKKyAgICBCT09TVF9DSEVDSyhmID09IHJpMik7CisgICAgQk9PU1RfQ0hFQ0soZiAhPSBib29zdDo6cmVmKHJpMikpOworICAgIEJPT1NUX0NIRUNLKGJvb3N0OjpyZWYocmkyKSAhPSBmKTsKKyAgICBCT09TVF9DSEVDSyghKGYgIT0gcmkyKSk7CisgICAgQk9PU1RfQ0hFQ0soIShmID09IGJvb3N0OjpyZWYocmkyKSkpOworICAgIEJPT1NUX0NIRUNLKCEoYm9vc3Q6OnJlZihyaTIpID09IGYpKTsKKyMgIGlmICEoZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA8PSAzKQorICAgIEJPT1NUX0NIRUNLKHJpMiA9PSBmKTsKKyAgICBCT09TVF9DSEVDSyghKHJpMiAhPSBmKSk7CisjICBlbmRpZgorICB9CisjZW5kaWYKK30KKworaW50IHRlc3RfbWFpbihpbnQsIGNoYXIqW10pCit7CisgIHRhcmdldF90ZXN0KCk7CisgIGVxdWFsX3Rlc3QoKTsKKyAgcmVmX2VxdWFsX3Rlc3QoKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fMzAuY3BwIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl8zMC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI5MWI3NQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fMzAuY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKworLy8gIENvcHlyaWdodCBEb3VnbGFzIEdyZWdvciAyMDAyLTIwMDMuIFVzZSwgbW9kaWZpY2F0aW9uIGFuZAorLy8gIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uCisvLyAgMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisKKy8vIE1ha2Ugc3VyZSB3ZSBkb24ndCB0cnkgdG8gcmVkZWZpbmUgZnVuY3Rpb24yCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24vZnVuY3Rpb24yLmhwcD4KKworLy8gRGVmaW5lIGFsbCBCb29zdC5GdW5jdGlvbiBjbGFzcyB0ZW1wbGF0ZXMgdXAgdG8gMzAgYXJndW1lbnRzCisjZGVmaW5lIEJPT1NUX0ZVTkNUSU9OX01BWF9BUkdTIDMwCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorCitpbnQgbWFpbigpCit7CisgIGJvb3N0OjpmdW5jdGlvbjA8ZmxvYXQ+IGYwOworCisgIGJvb3N0OjpmdW5jdGlvbjMwPGZsb2F0LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsCisgICAgICAgICAgICAgICAgICAgIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwKKyAgICAgICAgICAgICAgICAgICAgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50PiBmMzA7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl8zMF9yZXBlYXQuY3BwIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl8zMF9yZXBlYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MTA3MDYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uXzMwX3JlcGVhdC5jcHAKQEAgLTAsMCArMSwzNSBAQAorLy8gQm9vc3QuRnVuY3Rpb24gbGlicmFyeQorCisvLyAgQ29weXJpZ2h0IERvdWdsYXMgR3JlZ29yIDIwMDItMjAwMy4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKworLy8gTWFrZSBzdXJlIHdlIGRvbid0IHRyeSB0byByZWRlZmluZSBmdW5jdGlvbjIKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi9mdW5jdGlvbjIuaHBwPgorCisvLyBEZWZpbmUgYWxsIEJvb3N0LkZ1bmN0aW9uIGNsYXNzIHRlbXBsYXRlcyB1cCB0byAzMCBhcmd1bWVudHMKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1MgMjAKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1MKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1MgNDAKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1MKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1MgMjUKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjdW5kZWYgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1MKKyNkZWZpbmUgQk9PU1RfRlVOQ1RJT05fTUFYX0FSR1MgMzAKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorCitpbnQgbWFpbigpCit7CisgIGJvb3N0OjpmdW5jdGlvbjA8ZmxvYXQ+IGYwOworCisgIGJvb3N0OjpmdW5jdGlvbjMwPGZsb2F0LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsCisgICAgICAgICAgICAgICAgICAgIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwKKyAgICAgICAgICAgICAgICAgICAgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50PiBmMzA7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9hcml0aF9jeHg5OC5jcHAgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX2FyaXRoX2N4eDk4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDI5NzY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9hcml0aF9jeHg5OC5jcHAKQEAgLTAsMCArMSwzNCBAQAorLy8gRnVuY3Rpb24gbGlicmFyeQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBEb3VnbGFzIEdyZWdvcgorCisvLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIAorLy8gTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgCisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpIAorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnLworCisgICAgCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisKK2Zsb2F0IG11bF9pbnRzKGludCB4LCBpbnQgeSkgeyByZXR1cm4gKChmbG9hdCl4KSAqIHk7IH0KK3N0cnVjdCBpbnRfZGl2IHsgCisgIGZsb2F0IG9wZXJhdG9yKCkoaW50IHgsIGludCB5KSBjb25zdCB7IHJldHVybiAoKGZsb2F0KXgpL3k7IH07IAorfTsKKworaW50IG1haW4oKQoreworICAgIGJvb3N0OjpmdW5jdGlvbjxmbG9hdCAoaW50IHgsIGludCB5KT4gZjsKKyAgICBmID0gaW50X2RpdigpOworICAgIHN0ZDo6Y291dCA8PCBmKDUsIDMpIDw8IHN0ZDo6ZW5kbDsKKyAgICBpZiAoZikKKyAgc3RkOjpjb3V0IDw8IGYoNSwgMykgPDwgc3RkOjplbmRsOworZWxzZQorICBzdGQ6OmNvdXQgPDwgImYgaGFzIG5vIHRhcmdldCwgc28gaXQgaXMgdW5zYWZlIHRvIGNhbGwiIDw8IHN0ZDo6ZW5kbDsKKyAgICBmID0gMDsKKyAgICBmID0gJm11bF9pbnRzOworICAKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fYXJpdGhfcG9ydGFibGUuY3BwIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9hcml0aF9wb3J0YWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhZjYyYwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fYXJpdGhfcG9ydGFibGUuY3BwCkBAIC0wLDAgKzEsMzIgQEAKKy8vIEZ1bmN0aW9uIGxpYnJhcnkKKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgRG91Z2xhcyBHcmVnb3IKKworLy8gVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSAKKy8vIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IAorLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KSAKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZy8KKworICAgIAorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworZmxvYXQgbXVsX2ludHMoaW50IHgsIGludCB5KSB7IHJldHVybiAoKGZsb2F0KXgpICogeTsgfQorc3RydWN0IGludF9kaXYgeyAKKyAgZmxvYXQgb3BlcmF0b3IoKShpbnQgeCwgaW50IHkpIGNvbnN0IHsgcmV0dXJuICgoZmxvYXQpeCkveTsgfTsgCit9OworaW50IG1haW4oKQoreworICAgIGJvb3N0OjpmdW5jdGlvbjI8ZmxvYXQsIGludCwgaW50PiBmOworICAgIGYgPSBpbnRfZGl2KCk7CisgICAgc3RkOjpjb3V0IDw8IGYoNSwgMykgPDwgc3RkOjplbmRsOworICAgIGlmIChmKQorICBzdGQ6OmNvdXQgPDwgZig1LCAzKSA8PCBzdGQ6OmVuZGw7CitlbHNlCisgIHN0ZDo6Y291dCA8PCAiZiBoYXMgbm8gdGFyZ2V0LCBzbyBpdCBpcyB1bnNhZmUgdG8gY2FsbCIgPDwgc3RkOjplbmRsOworICAgIGYgPSAwOworICAgIGYgPSAmbXVsX2ludHM7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fbl90ZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fbl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGQ3MTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9uX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNjk3IEBACisvLyBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5CisKKy8vICBDb3B5cmlnaHQgRG91Z2xhcyBHcmVnb3IgMjAwMS0yMDAzLiBVc2UsIG1vZGlmaWNhdGlvbiBhbmQKKy8vICBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbgorLy8gIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZworCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9taW5pbWFsLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHN0cmluZz4KKwordXNpbmcgbmFtZXNwYWNlIGJvb3N0OwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6Om5lZ2F0ZTsKKworaW50IGdsb2JhbF9pbnQ7CisKK3N0cnVjdCB3cml0ZV9maXZlX29iaiB7IHZvaWQgb3BlcmF0b3IoKSgpIGNvbnN0IHsgZ2xvYmFsX2ludCA9IDU7IH0gfTsKK3N0cnVjdCB3cml0ZV90aHJlZV9vYmogeyBpbnQgb3BlcmF0b3IoKSgpIGNvbnN0IHsgZ2xvYmFsX2ludCA9IDM7IHJldHVybiA3OyB9fTsKK3N0YXRpYyB2b2lkIHdyaXRlX2ZpdmUoKSB7IGdsb2JhbF9pbnQgPSA1OyB9CitzdGF0aWMgdm9pZCB3cml0ZV90aHJlZSgpIHsgZ2xvYmFsX2ludCA9IDM7IH0KK3N0cnVjdCBnZW5lcmF0ZV9maXZlX29iaiB7IGludCBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gNTsgfSB9Oworc3RydWN0IGdlbmVyYXRlX3RocmVlX29iaiB7IGludCBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gMzsgfSB9Oworc3RhdGljIGludCBnZW5lcmF0ZV9maXZlKCkgeyByZXR1cm4gNTsgfQorc3RhdGljIGludCBnZW5lcmF0ZV90aHJlZSgpIHsgcmV0dXJuIDM7IH0KK3N0YXRpYyBzdHJpbmcgaWRlbnRpdHlfc3RyKGNvbnN0IHN0cmluZyYgcykgeyByZXR1cm4gczsgfQorc3RhdGljIHN0cmluZyBzdHJpbmdfY2F0KGNvbnN0IHN0cmluZyYgczEsIGNvbnN0IHN0cmluZyYgczIpIHsgcmV0dXJuIHMxK3MyOyB9CitzdGF0aWMgaW50IHN1bV9pbnRzKGludCB4LCBpbnQgeSkgeyByZXR1cm4geCt5OyB9CisKK3N0cnVjdCB3cml0ZV9jb25zdF8xX25vbmNvbnN0XzIKK3sKKyAgdm9pZCBvcGVyYXRvcigpKCkgeyBnbG9iYWxfaW50ID0gMjsgfQorICB2b2lkIG9wZXJhdG9yKCkoKSBjb25zdCB7IGdsb2JhbF9pbnQgPSAxOyB9Cit9OworCitzdHJ1Y3QgYWRkX3RvX29iagoreworICBhZGRfdG9fb2JqKGludCB2KSA6IHZhbHVlKHYpIHt9CisKKyAgaW50IG9wZXJhdG9yKCkoaW50IHgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlICsgeDsgfQorCisgIGludCB2YWx1ZTsKK307CisKK3N0YXRpYyB2b2lkCit0ZXN0X3plcm9fYXJncygpCit7CisgIHR5cGVkZWYgZnVuY3Rpb24wPHZvaWQ+IGZ1bmNfdm9pZF90eXBlOworCisgIHdyaXRlX2ZpdmVfb2JqIGZpdmUgPSB3cml0ZV9maXZlX29iaigpOyAvLyBJbml0aWFsaXphdGlvbiBmb3IgQm9ybGFuZCBDKysgNS41CisgIHdyaXRlX3RocmVlX29iaiB0aHJlZSA9IHdyaXRlX3RocmVlX29iaigpOyAvLyBEaXR0bworCisgIC8vIERlZmF1bHQgY29uc3RydWN0aW9uCisgIGZ1bmNfdm9pZF90eXBlIHYxOworICBCT09TVF9DSEVDSyh2MS5lbXB0eSgpKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGFuIGVtcHR5IGZ1bmN0aW9uCisgIHYxID0gZml2ZTsKKyAgQk9PU1RfQ0hFQ0soIXYxLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24gb2YgYSBmdW5jdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjEoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBjbGVhcigpIG1ldGhvZAorICB2MS5jbGVhcigpOworICBCT09TVF9DSEVDSyghdjEpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYW4gZW1wdHkgZnVuY3Rpb24KKyAgdjEgPSB0aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXYxLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24gYW5kIHNlbGYtYXNzaWdubWVudAorICBnbG9iYWxfaW50ID0gMDsKKyAgdjEgPSB2MTsKKyAgdjEoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uCisgIHYxID0gZml2ZTsKKworICAvLyBJbnZvY2F0aW9uIGFuZCBzZWxmLWFzc2lnbm1lbnQKKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYxID0gKHYxKTsKKyAgdjEoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBjbGVhcgorICB2MSA9IDA7CisgIEJPT1NUX0NIRUNLKHYxLmVtcHR5KCkpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYW4gZW1wdHkgZnVuY3Rpb24gZnJvbSBhIGZyZWUgZnVuY3Rpb24KKyAgdjEgPSAmd3JpdGVfZml2ZTsKKyAgQk9PU1RfQ0hFQ0soIXYxLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYxKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIG5vbi1lbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2MSA9ICZ3cml0ZV90aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXYxLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYxKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisKKyAgLy8gQXNzaWdubWVudAorICB2MSA9IGZpdmU7CisgIEJPT1NUX0NIRUNLKCF2MS5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MSgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYSBub24tZW1wdHkgZnVuY3Rpb24gZnJvbSBhIGZyZWUgZnVuY3Rpb24KKyAgdjEgPSB3cml0ZV90aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXYxLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYxKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisKKyAgLy8gQ29uc3RydWN0aW9uIGZyb20gYW5vdGhlciBmdW5jdGlvbiAodGhhdCBpcyBlbXB0eSkKKyAgdjEuY2xlYXIoKTsKKyAgZnVuY192b2lkX3R5cGUgdjIodjEpOworICBCT09TVF9DSEVDSyghdjI/IHRydWUgOiBmYWxzZSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbgorICB2MiA9IHRocmVlOworICBCT09TVF9DSEVDSyghdjIuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjIoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uCisgIHYyID0gKGZpdmUpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgdjIuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0sodjIuZW1wdHkoKSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2MiA9ICgmd3JpdGVfZml2ZSk7CisgIEJPT1NUX0NIRUNLKHYyPyB0cnVlIDogZmFsc2UpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIG5vbi1lbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2MiA9ICZ3cml0ZV90aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXYyLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisKKyAgLy8gU3dhcHBpbmcKKyAgdjEgPSBmaXZlOworICBzd2FwKHYxLCB2Mik7CisgIHYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisgIHYxKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisgIHN3YXAodjEsIHYyKTsKKyAgdjEuY2xlYXIoKTsKKworICAvLyBBc3NpZ25tZW50CisgIHYyID0gZml2ZTsKKyAgQk9PU1RfQ0hFQ0soIXYyLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIG5vbi1lbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2MiA9ICZ3cml0ZV90aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXYyLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIGZ1bmN0aW9uIGZyb20gYW4gZW1wdHkgZnVuY3Rpb24KKyAgdjIgPSB2MTsKKyAgQk9PU1RfQ0hFQ0sodjIuZW1wdHkoKSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIGZ1bmN0aW9uIGZyb20gYSBmdW5jdGlvbiB3aXRoIGEgZnVuY3RvcgorICB2MSA9IHRocmVlOworICB2MiA9IHYxOworICBCT09TVF9DSEVDSyghdjEuZW1wdHkoKSk7CisgIEJPT1NUX0NIRUNLKCF2Mi5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MSgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworICBnbG9iYWxfaW50ID0gMDsKKyAgdjIoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ24gdG8gYSBmdW5jdGlvbiBmcm9tIGEgZnVuY3Rpb24gd2l0aCBhIGZ1bmN0aW9uCisgIHYyID0gJndyaXRlX2ZpdmU7CisgIHYxID0gdjI7CisgIEJPT1NUX0NIRUNLKCF2MS5lbXB0eSgpKTsKKyAgQk9PU1RfQ0hFQ0soIXYyLmVtcHR5KCkpOworICBnbG9iYWxfaW50ID0gMDsKKyAgdjEoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQ29uc3RydWN0IGEgZnVuY3Rpb24gZ2l2ZW4gYW5vdGhlciBmdW5jdGlvbiBjb250YWluaW5nIGEgZnVuY3Rpb24KKyAgZnVuY192b2lkX3R5cGUgdjModjEpOworCisgIC8vIEludm9jYXRpb24gb2YgYSBmdW5jdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjMoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBjbGVhcigpIG1ldGhvZAorICB2My5jbGVhcigpOworICBCT09TVF9DSEVDSyghdjM/IHRydWUgOiBmYWxzZSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbgorICB2MyA9IHRocmVlOworICBCT09TVF9DSEVDSyghdjMuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjMoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uCisgIHYzID0gZml2ZTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MygpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIGNsZWFyKCkKKyAgdjMuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0sodjMuZW1wdHkoKSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2MyA9ICZ3cml0ZV9maXZlOworICBCT09TVF9DSEVDSyghdjMuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjMoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uIGZyb20gYSBmcmVlIGZ1bmN0aW9uCisgIHYzID0gJndyaXRlX3RocmVlOworICBCT09TVF9DSEVDSyghdjMuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjMoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50CisgIHYzID0gZml2ZTsKKyAgQk9PU1RfQ0hFQ0soIXYzLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYzKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQ29uc3RydWN0aW9uIG9mIGEgZnVuY3Rpb24gZnJvbSBhIGZ1bmN0aW9uIGNvbnRhaW5pbmcgYSBmdW5jdG9yCisgIGZ1bmNfdm9pZF90eXBlIHY0KHYzKTsKKworICAvLyBJbnZvY2F0aW9uIG9mIGEgZnVuY3Rpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY0KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gY2xlYXIoKSBtZXRob2QKKyAgdjQuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0sodjQuZW1wdHkoKSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbgorICB2NCA9IHRocmVlOworICBCT09TVF9DSEVDSyghdjQuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjQoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uCisgIHY0ID0gZml2ZTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NCgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIGNsZWFyKCkKKyAgdjQuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0sodjQuZW1wdHkoKSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2NCA9ICZ3cml0ZV9maXZlOworICBCT09TVF9DSEVDSyghdjQuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjQoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uIGZyb20gYSBmcmVlIGZ1bmN0aW9uCisgIHY0ID0gJndyaXRlX3RocmVlOworICBCT09TVF9DSEVDSyghdjQuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjQoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50CisgIHY0ID0gZml2ZTsKKyAgQk9PU1RfQ0hFQ0soIXY0LmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY0KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQ29uc3RydWN0aW9uIG9mIGEgZnVuY3Rpb24gZnJvbSBhIGZ1bmN0b3IKKyAgZnVuY192b2lkX3R5cGUgdjUoZml2ZSk7CisKKyAgLy8gSW52b2NhdGlvbiBvZiBhIGZ1bmN0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NSgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIGNsZWFyKCkgbWV0aG9kCisgIHY1LmNsZWFyKCk7CisgIEJPT1NUX0NIRUNLKHY1LmVtcHR5KCkpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYW4gZW1wdHkgZnVuY3Rpb24KKyAgdjUgPSB0aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXY1LmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY1KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIG5vbi1lbXB0eSBmdW5jdGlvbgorICB2NSA9IGZpdmU7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjUoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBjbGVhcigpCisgIHY1LmNsZWFyKCk7CisgIEJPT1NUX0NIRUNLKHY1LmVtcHR5KCkpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYW4gZW1wdHkgZnVuY3Rpb24gZnJvbSBhIGZyZWUgZnVuY3Rpb24KKyAgdjUgPSAmd3JpdGVfZml2ZTsKKyAgQk9PU1RfQ0hFQ0soIXY1LmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY1KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIG5vbi1lbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2NSA9ICZ3cml0ZV90aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXY1LmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY1KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisKKyAgLy8gQXNzaWdubWVudAorICB2NSA9IGZpdmU7CisgIEJPT1NUX0NIRUNLKCF2NS5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NSgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIENvbnN0cnVjdGlvbiBvZiBhIGZ1bmN0aW9uIGZyb20gYSBmdW5jdGlvbgorICBmdW5jX3ZvaWRfdHlwZSB2Nigmd3JpdGVfZml2ZSk7CisKKyAgLy8gSW52b2NhdGlvbiBvZiBhIGZ1bmN0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NigpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIGNsZWFyKCkgbWV0aG9kCisgIHY2LmNsZWFyKCk7CisgIEJPT1NUX0NIRUNLKHY2LmVtcHR5KCkpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYW4gZW1wdHkgZnVuY3Rpb24KKyAgdjYgPSB0aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXY2LmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY2KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIG5vbi1lbXB0eSBmdW5jdGlvbgorICB2NiA9IGZpdmU7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjYoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBjbGVhcigpCisgIHY2LmNsZWFyKCk7CisgIEJPT1NUX0NIRUNLKHY2LmVtcHR5KCkpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYW4gZW1wdHkgZnVuY3Rpb24gZnJvbSBhIGZyZWUgZnVuY3Rpb24KKyAgdjYgPSAmd3JpdGVfZml2ZTsKKyAgQk9PU1RfQ0hFQ0soIXY2LmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY2KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIG5vbi1lbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2NiA9ICZ3cml0ZV90aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXY2LmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY2KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisKKyAgLy8gQXNzaWdubWVudAorICB2NiA9IGZpdmU7CisgIEJPT1NUX0NIRUNLKCF2Ni5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NigpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIENvbnN0IHZzLiBub24tY29uc3QKKyAgLy8gSW5pdGlhbGl6YXRpb24gZm9yIEJvcmxhbmQgQysrIDUuNQorICB3cml0ZV9jb25zdF8xX25vbmNvbnN0XzIgb25lX29yX3R3byA9IHdyaXRlX2NvbnN0XzFfbm9uY29uc3RfMigpOyAKKyAgY29uc3QgZnVuY3Rpb24wPHZvaWQ+IHY3KG9uZV9vcl90d28pOworICBmdW5jdGlvbjA8dm9pZD4gdjgob25lX29yX3R3byk7CisKKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY3KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMik7CisKKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY4KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMik7CisKKyAgLy8gVGVzdCBjb25zdHJ1Y3Rpb24gZnJvbSAwIGFuZCBjb21wYXJpc29uIHRvIDAKKyAgZnVuY192b2lkX3R5cGUgdjkoMCk7CisgIEJPT1NUX0NIRUNLKHY5ID09IDApOworIyBpZiAhZGVmaW5lZChfX1NVTlBST19DQykgfHwgX19TVU5QUk9fQ0MgPiAweDU0MCB8fCBkZWZpbmVkKEJPT1NUX1NUUklDVF9DT05GSUcpCisgIEJPT1NUX0NIRUNLKDAgPT0gdjkpOworI2Vsc2UKKyAgQk9PU1RfQ0hFQ0sodjkuZW1wdHkoKSk7CisjZW5kaWYKKworICAvLyBUZXN0IHJldHVybiB2YWx1ZXMKKyAgdHlwZWRlZiBmdW5jdGlvbjA8aW50PiBmdW5jX2ludF90eXBlOworICAvLyBJbml0aWFsaXphdGlvbiBmb3IgQm9ybGFuZCBDKysgNS41CisgIGdlbmVyYXRlX2ZpdmVfb2JqIGdlbl9maXZlID0gZ2VuZXJhdGVfZml2ZV9vYmooKTsKKyAgZ2VuZXJhdGVfdGhyZWVfb2JqIGdlbl90aHJlZSA9IGdlbmVyYXRlX3RocmVlX29iaigpOworICBmdW5jX2ludF90eXBlIGkwKGdlbl9maXZlKTsKKworICBCT09TVF9DSEVDSyhpMCgpID09IDUpOworICBpMCA9IGdlbl90aHJlZTsKKyAgQk9PU1RfQ0hFQ0soaTAoKSA9PSAzKTsKKyAgaTAgPSAmZ2VuZXJhdGVfZml2ZTsKKyAgQk9PU1RfQ0hFQ0soaTAoKSA9PSA1KTsKKyAgaTAgPSAmZ2VuZXJhdGVfdGhyZWU7CisgIEJPT1NUX0NIRUNLKGkwKCkgPT0gMyk7CisgIEJPT1NUX0NIRUNLKGkwPyB0cnVlIDogZmFsc2UpOworICBpMC5jbGVhcigpOworICBCT09TVF9DSEVDSyghaTA/IHRydWUgOiBmYWxzZSk7CisKKyAgLy8gVGVzdCByZXR1cm4gdmFsdWVzIHdpdGggY29tcGF0aWJsZSB0eXBlcworICB0eXBlZGVmIGZ1bmN0aW9uMDxsb25nPiBmdW5jX2xvbmdfdHlwZTsKKyAgZnVuY19sb25nX3R5cGUgaTEoZ2VuX2ZpdmUpOworCisgIEJPT1NUX0NIRUNLKGkxKCkgPT0gNSk7CisgIGkxID0gZ2VuX3RocmVlOworICBCT09TVF9DSEVDSyhpMSgpID09IDMpOworICBpMSA9ICZnZW5lcmF0ZV9maXZlOworICBCT09TVF9DSEVDSyhpMSgpID09IDUpOworICBpMSA9ICZnZW5lcmF0ZV90aHJlZTsKKyAgQk9PU1RfQ0hFQ0soaTEoKSA9PSAzKTsKKyAgQk9PU1RfQ0hFQ0soaTE/IHRydWUgOiBmYWxzZSk7CisgIGkxLmNsZWFyKCk7CisgIEJPT1NUX0NIRUNLKCFpMT8gdHJ1ZSA6IGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfb25lX2FyZygpCit7CisgIG5lZ2F0ZTxpbnQ+IG5lZyA9IG5lZ2F0ZTxpbnQ+KCk7IC8vIEluaXRpYWxpemF0aW9uIGZvciBCb3JsYW5kIEMrKyA1LjUKKworICBmdW5jdGlvbjE8aW50LCBpbnQ+IGYxKG5lZyk7CisgIEJPT1NUX0NIRUNLKGYxKDUpID09IC01KTsKKworICBmdW5jdGlvbjE8c3RyaW5nLCBzdHJpbmc+IGlkKCZpZGVudGl0eV9zdHIpOworICBCT09TVF9DSEVDSyhpZCgic3RyIikgPT0gInN0ciIpOworCisgIGZ1bmN0aW9uMTxzdGQ6OnN0cmluZywgY29uc3QgY2hhcio+IGlkMigmaWRlbnRpdHlfc3RyKTsKKyAgQk9PU1RfQ0hFQ0soaWQyKCJmb28iKSA9PSAiZm9vIik7CisKKyAgYWRkX3RvX29iaiBhZGRfdG8oNSk7CisgIGZ1bmN0aW9uMTxpbnQsIGludD4gZjIoYWRkX3RvKTsKKyAgQk9PU1RfQ0hFQ0soZjIoMykgPT0gOCk7CisKKyAgY29uc3QgZnVuY3Rpb24xPGludCwgaW50PiBjZjIoYWRkX3RvKTsKKyAgQk9PU1RfQ0hFQ0soY2YyKDMpID09IDgpOworfQorCitzdGF0aWMgdm9pZAordGVzdF90d29fYXJncygpCit7CisgIGZ1bmN0aW9uMjxzdHJpbmcsIGNvbnN0IHN0cmluZyYsIGNvbnN0IHN0cmluZyY+IGNhdCgmc3RyaW5nX2NhdCk7CisgIEJPT1NUX0NIRUNLKGNhdCgic3RyIiwgImluZyIpID09ICJzdHJpbmciKTsKKworICBmdW5jdGlvbjI8aW50LCBzaG9ydCwgc2hvcnQ+IHN1bSgmc3VtX2ludHMpOworICBCT09TVF9DSEVDSyhzdW0oMiwgMykgPT0gNSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2VtcHRpbmVzcygpCit7CisgIGZ1bmN0aW9uMDxmbG9hdD4gZjE7CisgIEJPT1NUX0NIRUNLKGYxLmVtcHR5KCkpOworCisgIGZ1bmN0aW9uMDxmbG9hdD4gZjI7CisgIGYyID0gZjE7CisgIEJPT1NUX0NIRUNLKGYyLmVtcHR5KCkpOworCisgIGZ1bmN0aW9uMDxkb3VibGU+IGYzOworICBmMyA9IGYyOworICBCT09TVF9DSEVDSyhmMy5lbXB0eSgpKTsKK30KKworc3RydWN0IFggeworICBYKGludCB2KSA6IHZhbHVlKHYpIHt9CisKKyAgaW50IHR3aWNlKCkgY29uc3QgeyByZXR1cm4gMip2YWx1ZTsgfQorICBpbnQgcGx1cyhpbnQgdikgeyByZXR1cm4gdmFsdWUgKyB2OyB9CisKKyAgaW50IHZhbHVlOworfTsKKworc3RhdGljIHZvaWQKK3Rlc3RfbWVtYmVyX2Z1bmN0aW9ucygpCit7CisKKyAgYm9vc3Q6OmZ1bmN0aW9uMTxpbnQsIFgqPiBmMSgmWDo6dHdpY2UpOworCisgIFggb25lKDEpOworICBYIGZpdmUoNSk7CisKKyAgQk9PU1RfQ0hFQ0soZjEoJm9uZSkgPT0gMik7CisgIEJPT1NUX0NIRUNLKGYxKCZmaXZlKSA9PSAxMCk7CisKKyAgYm9vc3Q6OmZ1bmN0aW9uMTxpbnQsIFgqPiBmMV8yOworICBmMV8yID0gJlg6OnR3aWNlOworCisgIEJPT1NUX0NIRUNLKGYxXzIoJm9uZSkgPT0gMik7CisgIEJPT1NUX0NIRUNLKGYxXzIoJmZpdmUpID09IDEwKTsKKworICBib29zdDo6ZnVuY3Rpb24yPGludCwgWCYsIGludD4gZjIoJlg6OnBsdXMpOworICBCT09TVF9DSEVDSyhmMihvbmUsIDMpID09IDQpOworICBCT09TVF9DSEVDSyhmMihmaXZlLCA0KSA9PSA5KTsKK30KKworc3RydWN0IGFkZF93aXRoX3Rocm93X29uX2NvcHkgeworICBpbnQgb3BlcmF0b3IoKShpbnQgeCwgaW50IHkpIGNvbnN0IHsgcmV0dXJuIHgreTsgfQorCisgIGFkZF93aXRoX3Rocm93X29uX2NvcHkoKSB7fQorCisgIGFkZF93aXRoX3Rocm93X29uX2NvcHkoY29uc3QgYWRkX3dpdGhfdGhyb3dfb25fY29weSYpCisgIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIkJ1dCB0aGlzIENBTidUIHRocm93Iik7CisgIH0KKworICBhZGRfd2l0aF90aHJvd19vbl9jb3B5JiBvcGVyYXRvcj0oY29uc3QgYWRkX3dpdGhfdGhyb3dfb25fY29weSYpCisgIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIkJ1dCB0aGlzIENBTidUIHRocm93Iik7CisgIH0KK307CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlZigpCit7CisgIGFkZF93aXRoX3Rocm93X29uX2NvcHkgYXRjOworICB0cnkgeworICAgIGJvb3N0OjpmdW5jdGlvbjI8aW50LCBpbnQsIGludD4gZihyZWYoYXRjKSk7CisgICAgQk9PU1RfQ0hFQ0soZigxLCAzKSA9PSA0KTsKKyAgfQorICBjYXRjaChzdGQ6OnJ1bnRpbWVfZXJyb3IgZSkgeworICAgIEJPT1NUX0VSUk9SKCJOb250aHJvd2luZyBjb25zdHJ1Y3RvciB0aHJldyBhbiBleGNlcHRpb24iKTsKKyAgfQorfQorCitzdGF0aWMgdW5zaWduZWQgY29uc3RydWN0aW9uX2NvdW50ID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBkZXN0cnVjdGlvbl9jb3VudCA9IDA7CisKK3N0cnVjdCBNeVNtYWxsRnVuY3RvciB7CisgIE15U21hbGxGdW5jdG9yKCkgeyArK2NvbnN0cnVjdGlvbl9jb3VudDsgfQorICBNeVNtYWxsRnVuY3Rvcihjb25zdCBNeVNtYWxsRnVuY3RvciAmKSB7ICsrY29uc3RydWN0aW9uX2NvdW50OyB9CisgIH5NeVNtYWxsRnVuY3RvcigpIHsgKytkZXN0cnVjdGlvbl9jb3VudDsgfQorICBpbnQgb3BlcmF0b3IoKSgpIHsgcmV0dXJuIDA7IH0KKyB9OworCitzdHJ1Y3QgTXlMYXJnZUZ1bmN0b3IgeworICBNeUxhcmdlRnVuY3RvcigpIHsgKytjb25zdHJ1Y3Rpb25fY291bnQ7IH0KKyAgTXlMYXJnZUZ1bmN0b3IoY29uc3QgTXlMYXJnZUZ1bmN0b3IgJikgeyArK2NvbnN0cnVjdGlvbl9jb3VudDsgfQorICB+TXlMYXJnZUZ1bmN0b3IoKSB7ICsrZGVzdHJ1Y3Rpb25fY291bnQ7IH0KKyAgaW50IG9wZXJhdG9yKCkoKSB7IHJldHVybiAwOyB9CisKKyAgZmxvYXQgZGF0YVsxMjhdOworIH07CisKK3ZvaWQgdGVzdF9jb25zdHJ1Y3RfZGVzdHJveV9jb3VudCgpCit7CisgIHsKKyAgICBib29zdDo6ZnVuY3Rpb24wPGludD4gZjsKKyAgICBib29zdDo6ZnVuY3Rpb24wPGludD4gZzsKKyAgICBmID0gTXlTbWFsbEZ1bmN0b3IoKTsKKyAgICBnID0gTXlTbWFsbEZ1bmN0b3IoKTsKKyAgICBmLnN3YXAoZyk7CisgIH0KKworICAvLyBNeVNtYWxsRnVuY3RvciBvYmplY3RzIHNob3VsZCBiZSBjb25zdHJ1Y3RlZCBhcyBtYW55IHRpbWVzIGFzCisgIC8vIHRoZXkgYXJlIGRlc3Ryb3llZC4KKyAgQk9PU1RfQ0hFQ0soY29uc3RydWN0aW9uX2NvdW50ID09IGRlc3RydWN0aW9uX2NvdW50KTsKKyAKKyAgY29uc3RydWN0aW9uX2NvdW50ID0gMDsKKyAgZGVzdHJ1Y3Rpb25fY291bnQgPSAwOworICB7CisgICAgYm9vc3Q6OmZ1bmN0aW9uMDxpbnQ+IGY7CisgICAgYm9vc3Q6OmZ1bmN0aW9uMDxpbnQ+IGc7CisgICAgZiA9IE15TGFyZ2VGdW5jdG9yKCk7CisgICAgZyA9IE15TGFyZ2VGdW5jdG9yKCk7CisgICAgZi5zd2FwKGcpOworICAgfQorCisgICAvLyBNeUxhcmdlRnVuY3RvciBvYmplY3RzIHNob3VsZCBiZSBjb25zdHJ1Y3RlZCBhcyBtYW55IHRpbWVzIGFzCisgICAvLyB0aGV5IGFyZSBkZXN0cm95ZWQuCisgICBCT09TVF9DSEVDSyhjb25zdHJ1Y3Rpb25fY291bnQgPT0gZGVzdHJ1Y3Rpb25fY291bnQpOworfQorCitpbnQgdGVzdF9tYWluKGludCwgY2hhciogW10pCit7CisgIHRlc3RfemVyb19hcmdzKCk7CisgIHRlc3Rfb25lX2FyZygpOworICB0ZXN0X3R3b19hcmdzKCk7CisgIHRlc3RfZW1wdGluZXNzKCk7CisgIHRlc3RfbWVtYmVyX2Z1bmN0aW9ucygpOworICB0ZXN0X3JlZigpOworICB0ZXN0X2NvbnN0cnVjdF9kZXN0cm95X2NvdW50KCk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9yZWZfY3h4OTguY3BwIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9yZWZfY3h4OTguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZjVlYzMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3JlZl9jeHg5OC5jcHAKQEAgLTAsMCArMSwyNyBAQAorLy8gRnVuY3Rpb24gbGlicmFyeQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBEb3VnbGFzIEdyZWdvcgorCisvLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIAorLy8gTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgCisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpIAorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnLworCisKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKworc3RydWN0IHN0YXRlZnVsX3R5cGUgeyBpbnQgb3BlcmF0b3IoKShpbnQpIGNvbnN0IHsgcmV0dXJuIDA7IH0gfTsKKworaW50IG1haW4oKQoreworICAgIHN0YXRlZnVsX3R5cGUgYV9mdW5jdGlvbl9vYmplY3Q7CisgIGJvb3N0OjpmdW5jdGlvbjxpbnQgKGludCk+IGY7CisgIGYgPSBib29zdDo6cmVmKGFfZnVuY3Rpb25fb2JqZWN0KTsKKworICBib29zdDo6ZnVuY3Rpb248aW50IChpbnQpPiBmMihmKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9yZWZfcG9ydGFibGUuY3BwIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9yZWZfcG9ydGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YmViMTAKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3JlZl9wb3J0YWJsZS5jcHAKQEAgLTAsMCArMSwyNyBAQAorLy8gRnVuY3Rpb24gbGlicmFyeQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBEb3VnbGFzIEdyZWdvcgorCisvLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIAorLy8gTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgCisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpIAorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnLworCisKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKworc3RydWN0IHN0YXRlZnVsX3R5cGUgeyBpbnQgb3BlcmF0b3IoKShpbnQpIGNvbnN0IHsgcmV0dXJuIDA7IH0gfTsKKworaW50IG1haW4oKQoreworICAgIHN0YXRlZnVsX3R5cGUgYV9mdW5jdGlvbl9vYmplY3Q7CisgIGJvb3N0OjpmdW5jdGlvbjE8aW50LCBpbnQ+IGY7CisgIGYgPSBib29zdDo6cmVmKGFfZnVuY3Rpb25fb2JqZWN0KTsKKworICBib29zdDo6ZnVuY3Rpb24xPGludCwgaW50PiBmMihmKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl90ZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NlNDM2NQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fdGVzdC5jcHAKQEAgLTAsMCArMSw4MTEgQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKworLy8gIENvcHlyaWdodCBEb3VnbGFzIEdyZWdvciAyMDAxLTIwMDMuIFVzZSwgbW9kaWZpY2F0aW9uIGFuZAorLy8gIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uCisvLyAgMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L21pbmltYWwuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCit1c2luZyBib29zdDo6ZnVuY3Rpb247Cit1c2luZyBzdGQ6OnN0cmluZzsKKworaW50IGdsb2JhbF9pbnQ7CisKK3N0cnVjdCB3cml0ZV9maXZlX29iaiB7IHZvaWQgb3BlcmF0b3IoKSgpIGNvbnN0IHsgZ2xvYmFsX2ludCA9IDU7IH0gfTsKK3N0cnVjdCB3cml0ZV90aHJlZV9vYmogeyBpbnQgb3BlcmF0b3IoKSgpIGNvbnN0IHsgZ2xvYmFsX2ludCA9IDM7IHJldHVybiA3OyB9fTsKK3N0YXRpYyB2b2lkIHdyaXRlX2ZpdmUoKSB7IGdsb2JhbF9pbnQgPSA1OyB9CitzdGF0aWMgdm9pZCB3cml0ZV90aHJlZSgpIHsgZ2xvYmFsX2ludCA9IDM7IH0KK3N0cnVjdCBnZW5lcmF0ZV9maXZlX29iaiB7IGludCBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gNTsgfSB9Oworc3RydWN0IGdlbmVyYXRlX3RocmVlX29iaiB7IGludCBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1cm4gMzsgfSB9Oworc3RhdGljIGludCBnZW5lcmF0ZV9maXZlKCkgeyByZXR1cm4gNTsgfQorc3RhdGljIGludCBnZW5lcmF0ZV90aHJlZSgpIHsgcmV0dXJuIDM7IH0KK3N0YXRpYyBzdHJpbmcgaWRlbnRpdHlfc3RyKGNvbnN0IHN0cmluZyYgcykgeyByZXR1cm4gczsgfQorc3RhdGljIHN0cmluZyBzdHJpbmdfY2F0KGNvbnN0IHN0cmluZyYgczEsIGNvbnN0IHN0cmluZyYgczIpIHsgcmV0dXJuIHMxK3MyOyB9CitzdGF0aWMgaW50IHN1bV9pbnRzKGludCB4LCBpbnQgeSkgeyByZXR1cm4geCt5OyB9CisKK3N0cnVjdCB3cml0ZV9jb25zdF8xX25vbmNvbnN0XzIKK3sKKyAgdm9pZCBvcGVyYXRvcigpKCkgeyBnbG9iYWxfaW50ID0gMjsgfQorICB2b2lkIG9wZXJhdG9yKCkoKSBjb25zdCB7IGdsb2JhbF9pbnQgPSAxOyB9Cit9OworCitzdHJ1Y3QgYWRkX3RvX29iagoreworICBhZGRfdG9fb2JqKGludCB2KSA6IHZhbHVlKHYpIHt9CisKKyAgaW50IG9wZXJhdG9yKCkoaW50IHgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlICsgeDsgfQorCisgIGludCB2YWx1ZTsKK307CisKK3N0YXRpYyB2b2lkCit0ZXN0X3plcm9fYXJncygpCit7CisgIHR5cGVkZWYgZnVuY3Rpb248dm9pZCAoKT4gZnVuY192b2lkX3R5cGU7CisKKyAgd3JpdGVfZml2ZV9vYmogZml2ZTsKKyAgd3JpdGVfdGhyZWVfb2JqIHRocmVlOworCisgIC8vIERlZmF1bHQgY29uc3RydWN0aW9uCisgIGZ1bmNfdm9pZF90eXBlIHYxOworICBCT09TVF9DSEVDSyh2MS5lbXB0eSgpKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGFuIGVtcHR5IGZ1bmN0aW9uCisgIHYxID0gZml2ZTsKKyAgQk9PU1RfQ0hFQ0sodjEgIT0gMCk7CisKKyAgLy8gSW52b2NhdGlvbiBvZiBhIGZ1bmN0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MSgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIGNsZWFyKCkgbWV0aG9kCisgIHYxLmNsZWFyKCk7CisgIEJPT1NUX0NIRUNLKHYxID09IDApOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYW4gZW1wdHkgZnVuY3Rpb24KKyAgdjEgPSB0aHJlZTsKKyAgQk9PU1RfQ0hFQ0soIXYxLmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24gYW5kIHNlbGYtYXNzaWdubWVudAorICBnbG9iYWxfaW50ID0gMDsKKyAgdjEgPSB2MTsKKyAgdjEoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uCisgIHYxID0gZml2ZTsKKworICAvLyBJbnZvY2F0aW9uIGFuZCBzZWxmLWFzc2lnbm1lbnQKKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYxID0gKHYxKTsKKyAgdjEoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBjbGVhcgorICB2MSA9IDA7CisgIEJPT1NUX0NIRUNLKDAgPT0gdjEpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYW4gZW1wdHkgZnVuY3Rpb24gZnJvbSBhIGZyZWUgZnVuY3Rpb24KKyAgdjEgPSBCT09TVF9GVU5DVElPTl9UQVJHRVRfRklYKCYpIHdyaXRlX2ZpdmU7CisgIEJPT1NUX0NIRUNLKDAgIT0gdjEpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYxKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIG5vbi1lbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2MSA9IEJPT1NUX0ZVTkNUSU9OX1RBUkdFVF9GSVgoJikgd3JpdGVfdGhyZWU7CisgIEJPT1NUX0NIRUNLKCF2MS5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MSgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworCisgIC8vIEFzc2lnbm1lbnQKKyAgdjEgPSBmaXZlOworICBCT09TVF9DSEVDSyghdjEuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjEoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uIGZyb20gYSBmcmVlIGZ1bmN0aW9uCisgIHYxID0gJndyaXRlX3RocmVlOworICBCT09TVF9DSEVDSyghdjEuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjEoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBDb25zdHJ1Y3Rpb24gZnJvbSBhbm90aGVyIGZ1bmN0aW9uICh0aGF0IGlzIGVtcHR5KQorICB2MS5jbGVhcigpOworICBmdW5jX3ZvaWRfdHlwZSB2Mih2MSk7CisgIEJPT1NUX0NIRUNLKCF2Mj8gdHJ1ZSA6IGZhbHNlKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGFuIGVtcHR5IGZ1bmN0aW9uCisgIHYyID0gdGhyZWU7CisgIEJPT1NUX0NIRUNLKCF2Mi5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MigpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYSBub24tZW1wdHkgZnVuY3Rpb24KKyAgdjIgPSAoZml2ZSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjIoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICB2Mi5jbGVhcigpOworICBCT09TVF9DSEVDSyh2Mi5lbXB0eSgpKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGFuIGVtcHR5IGZ1bmN0aW9uIGZyb20gYSBmcmVlIGZ1bmN0aW9uCisgIHYyID0gKEJPT1NUX0ZVTkNUSU9OX1RBUkdFVF9GSVgoJikgd3JpdGVfZml2ZSk7CisgIEJPT1NUX0NIRUNLKHYyPyB0cnVlIDogZmFsc2UpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhIG5vbi1lbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2MiA9IEJPT1NUX0ZVTkNUSU9OX1RBUkdFVF9GSVgoJikgd3JpdGVfdGhyZWU7CisgIEJPT1NUX0NIRUNLKCF2Mi5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MigpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworCisgIC8vIFN3YXBwaW5nCisgIHYxID0gZml2ZTsKKyAgc3dhcCh2MSwgdjIpOworICB2MigpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworICB2MSgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworICBzd2FwKHYxLCB2Mik7CisgIHYxLmNsZWFyKCk7CisKKyAgLy8gQXNzaWdubWVudAorICB2MiA9IGZpdmU7CisgIEJPT1NUX0NIRUNLKCF2Mi5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MigpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYSBub24tZW1wdHkgZnVuY3Rpb24gZnJvbSBhIGZyZWUgZnVuY3Rpb24KKyAgdjIgPSAmd3JpdGVfdGhyZWU7CisgIEJPT1NUX0NIRUNLKCF2Mi5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MigpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYSBmdW5jdGlvbiBmcm9tIGFuIGVtcHR5IGZ1bmN0aW9uCisgIHYyID0gdjE7CisgIEJPT1NUX0NIRUNLKHYyLmVtcHR5KCkpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYSBmdW5jdGlvbiBmcm9tIGEgZnVuY3Rpb24gd2l0aCBhIGZ1bmN0b3IKKyAgdjEgPSB0aHJlZTsKKyAgdjIgPSB2MTsKKyAgQk9PU1RfQ0hFQ0soIXYxLmVtcHR5KCkpOworICBCT09TVF9DSEVDSyghdjIuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjEoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisKKyAgLy8gQXNzaWduIHRvIGEgZnVuY3Rpb24gZnJvbSBhIGZ1bmN0aW9uIHdpdGggYSBmdW5jdGlvbgorICB2MiA9IEJPT1NUX0ZVTkNUSU9OX1RBUkdFVF9GSVgoJikgd3JpdGVfZml2ZTsKKyAgdjEgPSB2MjsKKyAgQk9PU1RfQ0hFQ0soIXYxLmVtcHR5KCkpOworICBCT09TVF9DSEVDSyghdjIuZW1wdHkoKSk7CisgIGdsb2JhbF9pbnQgPSAwOworICB2MSgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworICBnbG9iYWxfaW50ID0gMDsKKyAgdjIoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBDb25zdHJ1Y3QgYSBmdW5jdGlvbiBnaXZlbiBhbm90aGVyIGZ1bmN0aW9uIGNvbnRhaW5pbmcgYSBmdW5jdGlvbgorICBmdW5jX3ZvaWRfdHlwZSB2Myh2MSk7CisKKyAgLy8gSW52b2NhdGlvbiBvZiBhIGZ1bmN0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MygpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIGNsZWFyKCkgbWV0aG9kCisgIHYzLmNsZWFyKCk7CisgIEJPT1NUX0NIRUNLKCF2Mz8gdHJ1ZSA6IGZhbHNlKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGFuIGVtcHR5IGZ1bmN0aW9uCisgIHYzID0gdGhyZWU7CisgIEJPT1NUX0NIRUNLKCF2My5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MygpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYSBub24tZW1wdHkgZnVuY3Rpb24KKyAgdjMgPSBmaXZlOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHYzKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gY2xlYXIoKQorICB2My5jbGVhcigpOworICBCT09TVF9DSEVDSyh2My5lbXB0eSgpKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGFuIGVtcHR5IGZ1bmN0aW9uIGZyb20gYSBmcmVlIGZ1bmN0aW9uCisgIHYzID0gJndyaXRlX2ZpdmU7CisgIEJPT1NUX0NIRUNLKCF2My5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MygpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYSBub24tZW1wdHkgZnVuY3Rpb24gZnJvbSBhIGZyZWUgZnVuY3Rpb24KKyAgdjMgPSAmd3JpdGVfdGhyZWU7CisgIEJPT1NUX0NIRUNLKCF2My5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2MygpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworCisgIC8vIEFzc2lnbm1lbnQKKyAgdjMgPSBmaXZlOworICBCT09TVF9DSEVDSyghdjMuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjMoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBDb25zdHJ1Y3Rpb24gb2YgYSBmdW5jdGlvbiBmcm9tIGEgZnVuY3Rpb24gY29udGFpbmluZyBhIGZ1bmN0b3IKKyAgZnVuY192b2lkX3R5cGUgdjQodjMpOworCisgIC8vIEludm9jYXRpb24gb2YgYSBmdW5jdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjQoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBjbGVhcigpIG1ldGhvZAorICB2NC5jbGVhcigpOworICBCT09TVF9DSEVDSyh2NC5lbXB0eSgpKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGFuIGVtcHR5IGZ1bmN0aW9uCisgIHY0ID0gdGhyZWU7CisgIEJPT1NUX0NIRUNLKCF2NC5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NCgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYSBub24tZW1wdHkgZnVuY3Rpb24KKyAgdjQgPSBmaXZlOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY0KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gY2xlYXIoKQorICB2NC5jbGVhcigpOworICBCT09TVF9DSEVDSyh2NC5lbXB0eSgpKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGFuIGVtcHR5IGZ1bmN0aW9uIGZyb20gYSBmcmVlIGZ1bmN0aW9uCisgIHY0ID0gJndyaXRlX2ZpdmU7CisgIEJPT1NUX0NIRUNLKCF2NC5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NCgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIEFzc2lnbm1lbnQgdG8gYSBub24tZW1wdHkgZnVuY3Rpb24gZnJvbSBhIGZyZWUgZnVuY3Rpb24KKyAgdjQgPSAmd3JpdGVfdGhyZWU7CisgIEJPT1NUX0NIRUNLKCF2NC5lbXB0eSgpKTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NCgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDMpOworCisgIC8vIEFzc2lnbm1lbnQKKyAgdjQgPSBmaXZlOworICBCT09TVF9DSEVDSyghdjQuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjQoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBDb25zdHJ1Y3Rpb24gb2YgYSBmdW5jdGlvbiBmcm9tIGEgZnVuY3RvcgorICBmdW5jX3ZvaWRfdHlwZSB2NShmaXZlKTsKKworICAvLyBJbnZvY2F0aW9uIG9mIGEgZnVuY3Rpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY1KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gY2xlYXIoKSBtZXRob2QKKyAgdjUuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0sodjUuZW1wdHkoKSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbgorICB2NSA9IHRocmVlOworICBCT09TVF9DSEVDSyghdjUuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjUoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uCisgIHY1ID0gZml2ZTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NSgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIGNsZWFyKCkKKyAgdjUuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0sodjUuZW1wdHkoKSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2NSA9ICZ3cml0ZV9maXZlOworICBCT09TVF9DSEVDSyghdjUuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjUoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uIGZyb20gYSBmcmVlIGZ1bmN0aW9uCisgIHY1ID0gJndyaXRlX3RocmVlOworICBCT09TVF9DSEVDSyghdjUuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjUoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50CisgIHY1ID0gZml2ZTsKKyAgQk9PU1RfQ0hFQ0soIXY1LmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY1KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQ29uc3RydWN0aW9uIG9mIGEgZnVuY3Rpb24gZnJvbSBhIGZ1bmN0aW9uCisgIGZ1bmNfdm9pZF90eXBlIHY2KCZ3cml0ZV9maXZlKTsKKworICAvLyBJbnZvY2F0aW9uIG9mIGEgZnVuY3Rpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY2KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gY2xlYXIoKSBtZXRob2QKKyAgdjYuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0sodjYuZW1wdHkoKSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbgorICB2NiA9IHRocmVlOworICBCT09TVF9DSEVDSyghdjYuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjYoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uCisgIHY2ID0gZml2ZTsKKworICAvLyBJbnZvY2F0aW9uCisgIGdsb2JhbF9pbnQgPSAwOworICB2NigpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDUpOworCisgIC8vIGNsZWFyKCkKKyAgdjYuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0sodjYuZW1wdHkoKSk7CisKKyAgLy8gQXNzaWdubWVudCB0byBhbiBlbXB0eSBmdW5jdGlvbiBmcm9tIGEgZnJlZSBmdW5jdGlvbgorICB2NiA9ICZ3cml0ZV9maXZlOworICBCT09TVF9DSEVDSyghdjYuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjYoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKworICAvLyBBc3NpZ25tZW50IHRvIGEgbm9uLWVtcHR5IGZ1bmN0aW9uIGZyb20gYSBmcmVlIGZ1bmN0aW9uCisgIHY2ID0gJndyaXRlX3RocmVlOworICBCT09TVF9DSEVDSyghdjYuZW1wdHkoKSk7CisKKyAgLy8gSW52b2NhdGlvbgorICBnbG9iYWxfaW50ID0gMDsKKyAgdjYoKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSAzKTsKKworICAvLyBBc3NpZ25tZW50CisgIHY2ID0gZml2ZTsKKyAgQk9PU1RfQ0hFQ0soIXY2LmVtcHR5KCkpOworCisgIC8vIEludm9jYXRpb24KKyAgZ2xvYmFsX2ludCA9IDA7CisgIHY2KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNSk7CisKKyAgLy8gQ29uc3QgdnMuIG5vbi1jb25zdAorICB3cml0ZV9jb25zdF8xX25vbmNvbnN0XzIgb25lX29yX3R3bzsKKyAgY29uc3QgZnVuY3Rpb248dm9pZCAoKT4gdjcob25lX29yX3R3byk7CisgIGZ1bmN0aW9uPHZvaWQgKCk+IHY4KG9uZV9vcl90d28pOworCisgIGdsb2JhbF9pbnQgPSAwOworICB2NygpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDIpOworCisgIGdsb2JhbF9pbnQgPSAwOworICB2OCgpOworICBCT09TVF9DSEVDSyhnbG9iYWxfaW50ID09IDIpOworCisgIC8vIFRlc3QgY29uc3RydWN0aW9uIGZyb20gMCBhbmQgY29tcGFyaXNvbiB0byAwCisgIGZ1bmNfdm9pZF90eXBlIHY5KDApOworICBCT09TVF9DSEVDSyh2OSA9PSAwKTsKKyAgQk9PU1RfQ0hFQ0soMCA9PSB2OSk7CisKKyAgLy8gVGVzdCByZXR1cm4gdmFsdWVzCisgIHR5cGVkZWYgZnVuY3Rpb248aW50ICgpPiBmdW5jX2ludF90eXBlOworICBnZW5lcmF0ZV9maXZlX29iaiBnZW5fZml2ZTsKKyAgZ2VuZXJhdGVfdGhyZWVfb2JqIGdlbl90aHJlZTsKKworICBmdW5jX2ludF90eXBlIGkwKGdlbl9maXZlKTsKKworICBCT09TVF9DSEVDSyhpMCgpID09IDUpOworICBpMCA9IGdlbl90aHJlZTsKKyAgQk9PU1RfQ0hFQ0soaTAoKSA9PSAzKTsKKyAgaTAgPSAmZ2VuZXJhdGVfZml2ZTsKKyAgQk9PU1RfQ0hFQ0soaTAoKSA9PSA1KTsKKyAgaTAgPSAmZ2VuZXJhdGVfdGhyZWU7CisgIEJPT1NUX0NIRUNLKGkwKCkgPT0gMyk7CisgIEJPT1NUX0NIRUNLKGkwPyB0cnVlIDogZmFsc2UpOworICBpMC5jbGVhcigpOworICBCT09TVF9DSEVDSyghaTA/IHRydWUgOiBmYWxzZSk7CisKKyAgLy8gVGVzdCByZXR1cm4gdmFsdWVzIHdpdGggY29tcGF0aWJsZSB0eXBlcworICB0eXBlZGVmIGZ1bmN0aW9uPGxvbmcgKCk+IGZ1bmNfbG9uZ190eXBlOworICBmdW5jX2xvbmdfdHlwZSBpMShnZW5fZml2ZSk7CisKKyAgQk9PU1RfQ0hFQ0soaTEoKSA9PSA1KTsKKyAgaTEgPSBnZW5fdGhyZWU7CisgIEJPT1NUX0NIRUNLKGkxKCkgPT0gMyk7CisgIGkxID0gJmdlbmVyYXRlX2ZpdmU7CisgIEJPT1NUX0NIRUNLKGkxKCkgPT0gNSk7CisgIGkxID0gJmdlbmVyYXRlX3RocmVlOworICBCT09TVF9DSEVDSyhpMSgpID09IDMpOworICBCT09TVF9DSEVDSyhpMT8gdHJ1ZSA6IGZhbHNlKTsKKyAgaTEuY2xlYXIoKTsKKyAgQk9PU1RfQ0hFQ0soIWkxPyB0cnVlIDogZmFsc2UpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9vbmVfYXJnKCkKK3sKKyAgc3RkOjpuZWdhdGU8aW50PiBuZWc7CisKKyAgZnVuY3Rpb248aW50IChpbnQpPiBmMShuZWcpOworICBCT09TVF9DSEVDSyhmMSg1KSA9PSAtNSk7CisKKyAgZnVuY3Rpb248c3RyaW5nIChzdHJpbmcpPiBpZCgmaWRlbnRpdHlfc3RyKTsKKyAgQk9PU1RfQ0hFQ0soaWQoInN0ciIpID09ICJzdHIiKTsKKworICBmdW5jdGlvbjxzdHJpbmcgKGNvbnN0IGNoYXIqKT4gaWQyKCZpZGVudGl0eV9zdHIpOworICBCT09TVF9DSEVDSyhpZDIoImZvbyIpID09ICJmb28iKTsKKworICBhZGRfdG9fb2JqIGFkZF90byg1KTsKKyAgZnVuY3Rpb248aW50IChpbnQpPiBmMihhZGRfdG8pOworICBCT09TVF9DSEVDSyhmMigzKSA9PSA4KTsKKworICBjb25zdCBmdW5jdGlvbjxpbnQgKGludCk+IGNmMihhZGRfdG8pOworICBCT09TVF9DSEVDSyhjZjIoMykgPT0gOCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3R3b19hcmdzKCkKK3sKKyAgZnVuY3Rpb248c3RyaW5nIChjb25zdCBzdHJpbmcmLCBjb25zdCBzdHJpbmcmKT4gY2F0KCZzdHJpbmdfY2F0KTsKKyAgQk9PU1RfQ0hFQ0soY2F0KCJzdHIiLCAiaW5nIikgPT0gInN0cmluZyIpOworCisgIGZ1bmN0aW9uPGludCAoc2hvcnQsIHNob3J0KT4gc3VtKCZzdW1faW50cyk7CisgIEJPT1NUX0NIRUNLKHN1bSgyLCAzKSA9PSA1KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfZW1wdGluZXNzKCkKK3sKKyAgZnVuY3Rpb248ZmxvYXQgKCk+IGYxOworICBCT09TVF9DSEVDSyhmMS5lbXB0eSgpKTsKKworICBmdW5jdGlvbjxmbG9hdCAoKT4gZjI7CisgIGYyID0gZjE7CisgIEJPT1NUX0NIRUNLKGYyLmVtcHR5KCkpOworCisgIGZ1bmN0aW9uPGRvdWJsZSAoKT4gZjM7CisgIGYzID0gZjI7CisgIEJPT1NUX0NIRUNLKGYzLmVtcHR5KCkpOworfQorCitzdHJ1Y3QgWCB7CisgIFgoaW50IHYpIDogdmFsdWUodikge30KKworICBpbnQgdHdpY2UoKSBjb25zdCB7IHJldHVybiAyKnZhbHVlOyB9CisgIGludCBwbHVzKGludCB2KSB7IHJldHVybiB2YWx1ZSArIHY7IH0KKworICBpbnQgdmFsdWU7Cit9OworCitzdGF0aWMgdm9pZAordGVzdF9tZW1iZXJfZnVuY3Rpb25zKCkKK3sKKyAgYm9vc3Q6OmZ1bmN0aW9uPGludCAoWCopPiBmMSgmWDo6dHdpY2UpOworCisgIFggb25lKDEpOworICBYIGZpdmUoNSk7CisKKyAgQk9PU1RfQ0hFQ0soZjEoJm9uZSkgPT0gMik7CisgIEJPT1NUX0NIRUNLKGYxKCZmaXZlKSA9PSAxMCk7CisKKyAgYm9vc3Q6OmZ1bmN0aW9uPGludCAoWCopPiBmMV8yOworICBmMV8yID0gJlg6OnR3aWNlOworCisgIEJPT1NUX0NIRUNLKGYxXzIoJm9uZSkgPT0gMik7CisgIEJPT1NUX0NIRUNLKGYxXzIoJmZpdmUpID09IDEwKTsKKworICBib29zdDo6ZnVuY3Rpb248aW50IChYJiwgaW50KT4gZjIoJlg6OnBsdXMpOworICBCT09TVF9DSEVDSyhmMihvbmUsIDMpID09IDQpOworICBCT09TVF9DSEVDSyhmMihmaXZlLCA0KSA9PSA5KTsKK30KKworc3RydWN0IGFkZF93aXRoX3Rocm93X29uX2NvcHkgeworICBpbnQgb3BlcmF0b3IoKShpbnQgeCwgaW50IHkpIGNvbnN0IHsgcmV0dXJuIHgreTsgfQorCisgIGFkZF93aXRoX3Rocm93X29uX2NvcHkoKSB7fQorCisgIGFkZF93aXRoX3Rocm93X29uX2NvcHkoY29uc3QgYWRkX3dpdGhfdGhyb3dfb25fY29weSYpCisgIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIkJ1dCB0aGlzIENBTidUIHRocm93Iik7CisgIH0KKworICBhZGRfd2l0aF90aHJvd19vbl9jb3B5JiBvcGVyYXRvcj0oY29uc3QgYWRkX3dpdGhfdGhyb3dfb25fY29weSYpCisgIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIkJ1dCB0aGlzIENBTidUIHRocm93Iik7CisgIH0KK307CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlZigpCit7CisgIGFkZF93aXRoX3Rocm93X29uX2NvcHkgYXRjOworICB0cnkgeworICAgIGJvb3N0OjpmdW5jdGlvbjxpbnQgKGludCwgaW50KT4gZihib29zdDo6cmVmKGF0YykpOworICAgIEJPT1NUX0NIRUNLKGYoMSwgMykgPT0gNCk7CisgIH0KKyAgY2F0Y2goc3RkOjpydW50aW1lX2Vycm9yIGUpIHsKKyAgICBCT09TVF9FUlJPUigiTm9udGhyb3dpbmcgY29uc3RydWN0b3IgdGhyZXcgYW4gZXhjZXB0aW9uIik7CisgIH0KK30KKworI2lmIEJPT1NUX1dPUktBUk9VTkQoQk9PU1RfR0NDLCA+PSA3MDAwMCAmJiBCT09TVF9HQ0MgPCA4MDAwMCkgJiYgX19jcGx1c3BsdXMgPj0gMjAxNzAwCisKKy8vIGh0dHBzOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTgxMzExCisjcHJhZ21hIG1lc3NhZ2UoIlNraXBwaW5nIHRlc3RfZW1wdHlfcmVmIG9uIGcrKyA3IC1zdGQ9YysrMTciKQorCitzdGF0aWMgdm9pZCB0ZXN0X2VtcHR5X3JlZigpCit7Cit9CisKKyNlbHNlCisKK3N0YXRpYyB2b2lkIGR1bW15KCkge30KKworc3RhdGljIHZvaWQgdGVzdF9lbXB0eV9yZWYoKQoreworICBib29zdDo6ZnVuY3Rpb248dm9pZCgpPiBmMTsKKyAgYm9vc3Q6OmZ1bmN0aW9uPHZvaWQoKT4gZjIoYm9vc3Q6OnJlZihmMSkpOworCisgIHRyeSB7CisgICAgZjIoKTsKKyAgICBCT09TVF9FUlJPUigiRXhjZXB0aW9uIGRpZG4ndCB0aHJvdyBmb3IgcmVmZXJlbmNlIHRvIGVtcHR5IGZ1bmN0aW9uLiIpOworICB9CisgIGNhdGNoKHN0ZDo6cnVudGltZV9lcnJvciBlKSB7fQorCisgIGYxID0gZHVtbXk7CisKKyAgdHJ5IHsKKyAgICBmMigpOworICB9CisgIGNhdGNoKHN0ZDo6cnVudGltZV9lcnJvciBlKSB7CisgICAgQk9PU1RfRVJST1IoIkVycm9yIGNhbGxpbmcgcmVmZXJlbmNlZCBmdW5jdGlvbi4iKTsKKyAgfQorfQorCisjZW5kaWYKKworCitzdGF0aWMgdm9pZCB0ZXN0X2V4Y2VwdGlvbigpCit7CisgIGJvb3N0OjpmdW5jdGlvbjxpbnQgKGludCwgaW50KT4gZjsKKyAgdHJ5IHsKKyAgICBmKDUsIDQpOworICAgIEJPT1NUX0NIRUNLKGZhbHNlKTsKKyAgfQorICBjYXRjaChib29zdDo6YmFkX2Z1bmN0aW9uX2NhbGwpIHsKKyAgICAvLyBva2F5CisgIH0KK30KKwordHlwZWRlZiBib29zdDo6ZnVuY3Rpb248IHZvaWQgKiAodm9pZCAqIHJlYWRlcikgPiByZWFkZXJfdHlwZTsKK3R5cGVkZWYgc3RkOjpwYWlyPGludCwgcmVhZGVyX3R5cGU+IG1hcHBlZF90eXBlOworCitzdGF0aWMgdm9pZCB0ZXN0X2ltcGxpY2l0KCkKK3sKKyAgbWFwcGVkX3R5cGUgbTsKKyAgbSA9IG1hcHBlZF90eXBlKCk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfY2FsbF9vYmooYm9vc3Q6OmZ1bmN0aW9uPGludCAoaW50LCBpbnQpPiBmKQoreworICBCT09TVF9DSEVDSyghZi5lbXB0eSgpKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9jYWxsX2NyZWYoY29uc3QgYm9vc3Q6OmZ1bmN0aW9uPGludCAoaW50LCBpbnQpPiYgZikKK3sKKyAgQk9PU1RfQ0hFQ0soIWYuZW1wdHkoKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfY2FsbCgpCit7CisgIHRlc3RfY2FsbF9vYmooc3RkOjpwbHVzPGludD4oKSk7CisgIHRlc3RfY2FsbF9jcmVmKHN0ZDo6cGx1czxpbnQ+KCkpOworfQorCitzdHJ1Y3QgYmlnX2FnZ3JlZ2F0aW5nX3N0cnVjdHVyZSB7CisgIGludCBkaXNhYmxlX3NtYWxsX29iamVjdHNfb3B0aW1pemF0aW9uc1szMl07CisgICAgCisgIGJpZ19hZ2dyZWdhdGluZ19zdHJ1Y3R1cmUoKQorICB7CisgICAgKysgZ2xvYmFsX2ludDsKKyAgfQorICAgIAorICBiaWdfYWdncmVnYXRpbmdfc3RydWN0dXJlKGNvbnN0IGJpZ19hZ2dyZWdhdGluZ19zdHJ1Y3R1cmUmKQorICB7CisgICAgKysgZ2xvYmFsX2ludDsKKyAgfQorCisgIH5iaWdfYWdncmVnYXRpbmdfc3RydWN0dXJlKCkKKyAgeworICAgIC0tIGdsb2JhbF9pbnQ7CisgIH0KKyAgICAKKyAgdm9pZCBvcGVyYXRvcigpKCkgCisgIHsKKyAgICArKyBnbG9iYWxfaW50OworICB9CisKKyAgdm9pZCBvcGVyYXRvcigpKGludCkgCisgIHsKKyAgICArKyBnbG9iYWxfaW50OworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgRnVuY3Rpb25UPgorc3RhdGljIHZvaWQgdGVzdF9tb3ZlX3NlbWFudGljcygpIAoreworICB0eXBlZGVmIEZ1bmN0aW9uVCBmMV90eXBlOworCisgIGJpZ19hZ2dyZWdhdGluZ19zdHJ1Y3R1cmUgb2JqOworICAKKyAgZjFfdHlwZSBmMSA9IG9iajsKKyAgZ2xvYmFsX2ludCA9IDA7CisgIGYxKCk7CisgIAorICBCT09TVF9DSEVDSyghZjEuZW1wdHkoKSk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMSk7CisgIAorI2lmbmRlZiBCT09TVF9OT19DWFgxMV9SVkFMVUVfUkVGRVJFTkNFUworICAvLyBUZXN0aW5nIHJ2YWx1ZSBjb25zdHJ1Y3RvcnMKKyAgZjFfdHlwZSBmMihzdGF0aWNfY2FzdDxmMV90eXBlJiY+KGYxKSk7CisgIEJPT1NUX0NIRUNLKGYxLmVtcHR5KCkpOworICBCT09TVF9DSEVDSyghZjIuZW1wdHkoKSk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMSk7CisgIGYyKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMik7CisgIAorICBmMV90eXBlIGYzKHN0YXRpY19jYXN0PGYxX3R5cGUmJj4oZjIpKTsKKyAgQk9PU1RfQ0hFQ0soZjEuZW1wdHkoKSk7CisgIEJPT1NUX0NIRUNLKGYyLmVtcHR5KCkpOworICBCT09TVF9DSEVDSyghZjMuZW1wdHkoKSk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMik7CisgIGYzKCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisgICAgCisgIC8vIFRlc3RpbmcgbW92ZSBhc3NpZ25tZW50CisgIGYxX3R5cGUgZjQ7CisgIEJPT1NUX0NIRUNLKGY0LmVtcHR5KCkpOworICBmNCA9IHN0YXRpY19jYXN0PGYxX3R5cGUmJj4oZjMpOworICBCT09TVF9DSEVDSyhmMS5lbXB0eSgpKTsKKyAgQk9PU1RfQ0hFQ0soZjIuZW1wdHkoKSk7CisgIEJPT1NUX0NIRUNLKGYzLmVtcHR5KCkpOworICBCT09TVF9DSEVDSyghZjQuZW1wdHkoKSk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gMyk7CisgIGY0KCk7CisgIEJPT1NUX0NIRUNLKGdsb2JhbF9pbnQgPT0gNCk7CisgIAorICAvLyBUZXN0aW5nIHNlbGYgbW92ZSBhc3NpZ25tZW50CisgIGY0ID0gc3RhdGljX2Nhc3Q8ZjFfdHlwZSYmPihmNCk7CisgIEJPT1NUX0NIRUNLKCFmNC5lbXB0eSgpKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA0KTsKKworICAvLyBUZXN0aW5nLCB0aGF0IG5vIG1lbW9yeSBsZWFrZWQgd2hlbiBhc3NpZ25pbmcgdG8gbm9uZW1wdHkgZnVuY3Rpb24KKyAgZjQgPSBvYmo7CisgIEJPT1NUX0NIRUNLKCFmNC5lbXB0eSgpKTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA0KTsKKyAgZjFfdHlwZSBmNSA9IG9iajsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA1KTsKKyAgZjQgPSBzdGF0aWNfY2FzdDxmMV90eXBlJiY+KGY1KTsKKyAgQk9PU1RfQ0hFQ0soZ2xvYmFsX2ludCA9PSA0KTsKKyAgCisjZW5kaWYgIAorfQorCitpbnQgdGVzdF9tYWluKGludCwgY2hhciogW10pCit7CisgIHRlc3RfemVyb19hcmdzKCk7CisgIHRlc3Rfb25lX2FyZygpOworICB0ZXN0X3R3b19hcmdzKCk7CisgIHRlc3RfZW1wdGluZXNzKCk7CisgIHRlc3RfbWVtYmVyX2Z1bmN0aW9ucygpOworICB0ZXN0X3JlZigpOworICB0ZXN0X2VtcHR5X3JlZigpOworICB0ZXN0X2V4Y2VwdGlvbigpOworICB0ZXN0X2ltcGxpY2l0KCk7CisgIHRlc3RfY2FsbCgpOworICB0ZXN0X21vdmVfc2VtYW50aWNzPGZ1bmN0aW9uPHZvaWQoKT4gPigpOworICB0ZXN0X21vdmVfc2VtYW50aWNzPGJvb3N0OjpmdW5jdGlvbjA8dm9pZD4gPigpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl90ZXN0X2ZhaWwxLmNwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fdGVzdF9mYWlsMS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTljNTk5YwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fdGVzdF9mYWlsMS5jcHAKQEAgLTAsMCArMSwyOCBAQAorLy8gQm9vc3QuRnVuY3Rpb24gbGlicmFyeQorCisvLyAgQ29weXJpZ2h0IChDKSBEb3VnbGFzIEdyZWdvciAyMDAxLTIwMDUuIFVzZSwgbW9kaWZpY2F0aW9uIGFuZAorLy8gIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uCisvLyAgMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L21pbmltYWwuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBib29zdDsKKworaW50Cit0ZXN0X21haW4oaW50LCBjaGFyKltdKQoreworICBmdW5jdGlvbjA8aW50PiBmMTsKKyAgZnVuY3Rpb24wPGludD4gZjI7CisKKyAgaWYgKGYxID09IGYyKSB7CisgIH0KKworICBCT09TVF9FUlJPUigiVGhpcyBzaG91bGQgbm90IGhhdmUgY29tcGlsZWQuIik7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3Rlc3RfZmFpbDIuY3BwIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl90ZXN0X2ZhaWwyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2YyZDIyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl90ZXN0X2ZhaWwyLmNwcApAQCAtMCwwICsxLDI3IEBACisvLyBCb29zdC5GdW5jdGlvbiBsaWJyYXJ5CisKKy8vICBDb3B5cmlnaHQgKEMpIERvdWdsYXMgR3JlZ29yIDIwMDEtMjAwNS4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvbWluaW1hbC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIGJvb3N0OworCitzdGF0aWMgaW50IGJhZF9mbihmbG9hdCBmKSB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGYpOyB9CisKK2ludAordGVzdF9tYWluKGludCwgY2hhcipbXSkKK3sKKyAgZnVuY3Rpb24wPGludD4gZjE7CisgIGYxID0gYmFkX2ZuOworCisgIEJPT1NUX0VSUk9SKCJUaGlzIHNob3VsZCBub3QgaGF2ZSBjb21waWxlZC4iKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fdHlwZW9mX3Rlc3QuY3BwIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl90eXBlb2ZfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3N2NhYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvZnVuY3Rpb25fdHlwZW9mX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTggQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKworLy8gIENvcHlyaWdodCBEb3VnbGFzIEdyZWdvciAyMDA4LiBVc2UsIG1vZGlmaWNhdGlvbiBhbmQKKy8vICBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbgorLy8gIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZworI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uL2Z1bmN0aW9uX3R5cGVvZi5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVvZi90eXBlb2YuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2lzX3NhbWUuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3N0YXRpY19hc3NlcnQuaHBwPgorCit2b2lkIGYoYm9vc3Q6OmZ1bmN0aW9uMDx2b2lkPiBmLCBib29zdDo6ZnVuY3Rpb24wPHZvaWQ+IGcpCit7CisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGJvb3N0Ojppc19zYW1lPGJvb3N0OjpmdW5jdGlvbjA8dm9pZD4sIEJPT1NUX1RZUEVPRihmID0gZyk+Ojp2YWx1ZSkpOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9sYW1iZGFfdGVzdC5jcHAgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L2xhbWJkYV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWJjYTU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9sYW1iZGFfdGVzdC5jcHAKQEAgLTAsMCArMSwzOCBAQAorLy8gQm9vc3QuRnVuY3Rpb24gbGlicmFyeQorCisvLyAgQ29weXJpZ2h0IERvdWdsYXMgR3JlZ29yIDIwMDItMjAwMy4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGNzdGRsaWI+CisKKyNpbmNsdWRlIDxib29zdC90ZXN0L21pbmltYWwuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2xhbWJkYS9sYW1iZGEuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2xhbWJkYS9iaW5kLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisKK3N0YXRpYyB1bnNpZ25lZAorZnVuY19pbXBsKGludCBhcmcxLCBib29sIGFyZzIsIGRvdWJsZSBhcmczKQoreworICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICByZXR1cm4gYWJzIChzdGF0aWNfY2FzdDxpbnQ+KChhcmcyID8gYXJnMSA6IDIgKiBhcmcxKSAqIGFyZzMpKTsKK30KKworaW50IHRlc3RfbWFpbihpbnQsIGNoYXIqW10pCit7CisgIHVzaW5nIGJvb3N0OjpmdW5jdGlvbjsKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OjpsYW1iZGE7CisKKyAgZnVuY3Rpb24gPHVuc2lnbmVkKGJvb2wsIGRvdWJsZSk+IGYxID0gYmluZChmdW5jX2ltcGwsIDE1LCBfMSwgXzIpOworICBmdW5jdGlvbiA8dW5zaWduZWQoZG91YmxlKT4gICAgICAgZjIgPSBib29zdDo6bGFtYmRhOjpiaW5kKGYxLCBmYWxzZSwgXzEpOworICBmdW5jdGlvbiA8dW5zaWduZWQoKT4gICAgICAgICAgICAgZjMgPSBib29zdDo6bGFtYmRhOjpiaW5kKGYyLCA0LjApOworCisgIGYzKCk7CisKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvbWVtX2Z1bl9jeHg5OC5jcHAgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L21lbV9mdW5fY3h4OTguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyODk3OTEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L21lbV9mdW5fY3h4OTguY3BwCkBAIC0wLDAgKzEsNDUgQEAKKy8vIEZ1bmN0aW9uIGxpYnJhcnkKKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgRG91Z2xhcyBHcmVnb3IKKworLy8gVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSAKKy8vIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IAorLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KSAKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZy8KKworICAgIAorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC9kZXRhaWwvbGlnaHR3ZWlnaHRfdGVzdC5ocHA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworc3RydWN0IFkgeworICAgIFkoaW50IHkgPSAwKSA6IHlfKHkpIHt9CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFkmIHJocykgeyByZXR1cm4geV8gPT0gcmhzLnlfOyB9Citwcml2YXRlOgorICAgIGludCB5XzsKKyAgICB9OworCitzdHJ1Y3QgWCB7CisgIGludCBmb28oaW50KTsKKyAgWSYgZm9vMihZJikgY29uc3Q7Cit9OworaW50IFg6OmZvbyhpbnQgeCkgeyByZXR1cm4gLXg7IH0KK1kmIFg6OmZvbzIoWSYgeCkgY29uc3QgeyByZXR1cm4geDsgfQorCitpbnQgbWFpbigpCit7CisgICAgYm9vc3Q6OmZ1bmN0aW9uPGludCAoWCosIGludCk+IGY7CisgICAgYm9vc3Q6OmZ1bmN0aW9uPFkmIChYKiwgWSYpPiBmMjsKKwlZIHkxOworCQorICAgIGYgPSAmWDo6Zm9vOworICAgIGYyID0gJlg6OmZvbzI7CisKKyAgICBYIHg7CisgICAgQk9PU1RfVEVTVChmKCZ4LCA1KSA9PSAtNSk7CisgICAgQk9PU1RfVEVTVChmMigmeCwgYm9vc3Q6OnJlZih5MSkpID09IHkxKTsKKworICAgIHJldHVybiA6OmJvb3N0OjpyZXBvcnRfZXJyb3JzKCk7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L21lbV9mdW5fcG9ydGFibGUuY3BwIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9tZW1fZnVuX3BvcnRhYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjUxMzM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9tZW1fZnVuX3BvcnRhYmxlLmNwcApAQCAtMCwwICsxLDQ1IEBACisvLyBGdW5jdGlvbiBsaWJyYXJ5CisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIERvdWdsYXMgR3JlZ29yCisKKy8vIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgCisvLyBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCAKKy8vIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkgCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcvCisKKyAgICAKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZGV0YWlsL2xpZ2h0d2VpZ2h0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK3N0cnVjdCBZIHsKKyAgICBZKGludCB5ID0gMCkgOiB5Xyh5KSB7fQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBZJiByaHMpIHsgcmV0dXJuIHlfID09IHJocy55XzsgfQorcHJpdmF0ZToKKyAgICBpbnQgeV87CisgICAgfTsKKworc3RydWN0IFggeworICBpbnQgZm9vKGludCk7CisgIFkmIGZvbzIoWSYpIGNvbnN0OworfTsKK2ludCBYOjpmb28oaW50IHgpIHsgcmV0dXJuIC14OyB9CitZJiBYOjpmb28yKFkmIHgpIGNvbnN0IHsgcmV0dXJuIHg7IH0KKworaW50IG1haW4oKQoreworICAgIGJvb3N0OjpmdW5jdGlvbjI8aW50LCBYKiwgaW50PiBmOworICAgIGJvb3N0OjpmdW5jdGlvbjI8WSYsIFgqLCBZJj4gZjI7CisgICAgWSB5MTsKKyAgICAKKyAgICBmID0gJlg6OmZvbzsKKyAgICBmMiA9ICZYOjpmb28yOworCisgICAgWCB4OworICAgIEJPT1NUX1RFU1QoZigmeCwgNSkgPT0gLTUpOworICAgIEJPT1NUX1RFU1QoZjIoJngsIGJvb3N0OjpyZWYoeTEpKSA9PSB5MSk7CisKKyAgICByZXR1cm4gOjpib29zdDo6cmVwb3J0X2Vycm9ycygpOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9ub3Rocm93X3N3YXAuY3BwIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9ub3Rocm93X3N3YXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNWI3NDAKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L25vdGhyb3dfc3dhcC5jcHAKQEAgLTAsMCArMSw2MCBAQAorLy8gQm9vc3QuRnVuY3Rpb24gbGlicmFyeQorCisvLyAgQ29weXJpZ2h0IERvdWdsYXMgR3JlZ29yIDIwMDguIFVzZSwgbW9kaWZpY2F0aW9uIGFuZAorLy8gIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uCisvLyAgMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L21pbmltYWwuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKworc3RydWN0IHRyaWVkX3RvX2NvcHkgeyB9OworCitzdHJ1Y3QgTWF5YmVUaHJvd09uQ29weSB7CisgIE1heWJlVGhyb3dPbkNvcHkoaW50IHZhbHVlID0gMCkgOiB2YWx1ZSh2YWx1ZSkgeyB9CisKKyAgTWF5YmVUaHJvd09uQ29weShjb25zdCBNYXliZVRocm93T25Db3B5JiBvdGhlcikgOiB2YWx1ZShvdGhlci52YWx1ZSkgeworICAgIGlmICh0aHJvd09uQ29weSkKKyAgICAgIHRocm93IHRyaWVkX3RvX2NvcHkoKTsKKyAgfQorCisgIE1heWJlVGhyb3dPbkNvcHkmIG9wZXJhdG9yPShjb25zdCBNYXliZVRocm93T25Db3B5JiBvdGhlcikgeworICAgIGlmICh0aHJvd09uQ29weSkKKyAgICAgIHRocm93IHRyaWVkX3RvX2NvcHkoKTsKKyAgICB2YWx1ZSA9IG90aGVyLnZhbHVlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGludCBvcGVyYXRvcigpKCkgeyByZXR1cm4gdmFsdWU7IH0KKworICBpbnQgdmFsdWU7CisKKyAgLy8gTWFrZSBzdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiBvYmplY3QgZG9lc24ndCB0cmlnZ2VyIHRoZQorICAvLyBzbWFsbC1vYmplY3Qgb3B0aW1pemF0aW9uIGluIEZ1bmN0aW9uLgorICBmbG9hdCBwYWRkaW5nWzEwMF07CisKKyAgc3RhdGljIGJvb2wgdGhyb3dPbkNvcHk7Cit9OworCitib29sIE1heWJlVGhyb3dPbkNvcHk6OnRocm93T25Db3B5ID0gZmFsc2U7CisKK2ludCB0ZXN0X21haW4oaW50LCBjaGFyKiBbXSkKK3sKKyAgYm9vc3Q6OmZ1bmN0aW9uMDxpbnQ+IGY7CisgIGJvb3N0OjpmdW5jdGlvbjA8aW50PiBnOworCisgIE1heWJlVGhyb3dPbkNvcHk6OnRocm93T25Db3B5ID0gZmFsc2U7CisgIGYgPSBNYXliZVRocm93T25Db3B5KDEpOworICBnID0gTWF5YmVUaHJvd09uQ29weSgyKTsKKyAgQk9PU1RfQ0hFQ0soZigpID09IDEpOworICBCT09TVF9DSEVDSyhnKCkgPT0gMik7CisKKyAgTWF5YmVUaHJvd09uQ29weTo6dGhyb3dPbkNvcHkgPSB0cnVlOworICBmLnN3YXAoZyk7CisgIEJPT1NUX0NIRUNLKGYoKSA9PSAyKTsKKyAgQk9PU1RfQ0hFQ0soZygpID09IDEpOworICAKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L3JlZ3Jlc3Npb24uY2ZnIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9yZWdyZXNzaW9uLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTQ0MjUzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9yZWdyZXNzaW9uLmNmZwpAQCAtMCwwICsxLDE0IEBACisvLyBCb29zdC5GdW5jdGlvbiByZWdyZXNzaW9uIHRlc3QgY29uZmlndXJhdGlvbiBmaWxlCisKKy8vIEZyb20gdGhlIGJvb3N0L3N0YXR1cyBkaXJlY3RvcnksIHJ1bgorLy8gLi9yZWdyZXNzaW9uIC0tdGVzdHMgLi4vbGlicy9mdW5jdGlvbi90ZXN0L3JlZ3Jlc3Npb24uY2ZnIC1vIGZ1bmN0aW9uLmh0bWwKKworCitydW4gbGlicy9mdW5jdGlvbi90ZXN0L2FsbG9jYXRvcl90ZXN0LmNwcAorcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9mdW5jdGlvbl9uX3Rlc3QuY3BwCitydW4gbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3Rlc3QuY3BwCitjb21waWxlLWZhaWwgbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3Rlc3RfZmFpbDEuY3BwCitjb21waWxlLWZhaWwgbGlicy9mdW5jdGlvbi90ZXN0L2Z1bmN0aW9uX3Rlc3RfZmFpbDIuY3BwCitydW4gbGlicy9mdW5jdGlvbi90ZXN0L21peGluX3Rlc3QuY3BwCitydW4gbGlicy9mdW5jdGlvbi90ZXN0L3BvbGljeV90ZXN0LmNwcAorcnVuIGxpYnMvZnVuY3Rpb24vdGVzdC9zdGF0ZWxlc3NfdGVzdC5jcHAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvcmVzdWx0X2FyZ190eXBlc190ZXN0LmNwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvcmVzdWx0X2FyZ190eXBlc190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2NjZGRjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9yZXN1bHRfYXJnX3R5cGVzX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8vIEJvb3N0LkZ1bmN0aW9uIGxpYnJhcnkKKworLy8gIENvcHlyaWdodCAyMDE2IFBldGVyIERpbW92CisKKy8vICBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8KKy8vICB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisvLyAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC9jb3JlL2lzX3NhbWUuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2NvcmUvbGlnaHR3ZWlnaHRfdGVzdF90cmFpdC5ocHA+CisKK3N0cnVjdCBYCit7Cit9OworCitzdHJ1Y3QgWQoreworfTsKKworc3RydWN0IFoKK3sKK307CisKK2ludCBtYWluKCkKK3sKKyAgICB0eXBlZGVmIGJvb3N0OjpmdW5jdGlvbjxYKFkpPiBGMTsKKworICAgIEJPT1NUX1RFU1RfVFJBSVRfVFJVRSgoIGJvb3N0Ojpjb3JlOjppc19zYW1lPEYxOjpyZXN1bHRfdHlwZSwgWD4gKSk7CisgICAgQk9PU1RfVEVTVF9UUkFJVF9UUlVFKCggYm9vc3Q6OmNvcmU6OmlzX3NhbWU8RjE6OmFyZ3VtZW50X3R5cGUsIFk+ICkpOworCisgICAgdHlwZWRlZiBib29zdDo6ZnVuY3Rpb248WChZLCBaKT4gRjI7CisKKyAgICBCT09TVF9URVNUX1RSQUlUX1RSVUUoKCBib29zdDo6Y29yZTo6aXNfc2FtZTxGMjo6cmVzdWx0X3R5cGUsIFg+ICkpOworICAgIEJPT1NUX1RFU1RfVFJBSVRfVFJVRSgoIGJvb3N0Ojpjb3JlOjppc19zYW1lPEYyOjpmaXJzdF9hcmd1bWVudF90eXBlLCBZPiApKTsKKyAgICBCT09TVF9URVNUX1RSQUlUX1RSVUUoKCBib29zdDo6Y29yZTo6aXNfc2FtZTxGMjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUsIFo+ICkpOworCisgICAgcmV0dXJuIGJvb3N0OjpyZXBvcnRfZXJyb3JzKCk7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L3J2YWx1ZXNfdGVzdC5jcHAgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L3J2YWx1ZXNfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc3ZjRiYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3QvcnZhbHVlc190ZXN0LmNwcApAQCAtMCwwICsxLDEwNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgQW50b255IFBvbHVraGluLgorLy8KKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKy8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0CisvLyBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvbWluaW1hbC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorI2luY2x1ZGUgPGJvb3N0L21vdmUvbW92ZS5ocHA+CisKK2NsYXNzIG9ubHlfbW92YWJsZSB7Citwcml2YXRlOgorICAgIEJPT1NUX01PVkFCTEVfQlVUX05PVF9DT1BZQUJMRShvbmx5X21vdmFibGUpCisgICAgaW50IHZhbHVlXzsKKyAgICBib29sIG1vdmVkXzsKKworcHVibGljOgorICAgIG9ubHlfbW92YWJsZShCT09TVF9SVl9SRUYob25seV9tb3ZhYmxlKSB4KQorICAgICAgICA6IHZhbHVlXyh4LnZhbHVlXykKKyAgICAgICAgLCBtb3ZlZF8oZmFsc2UpCisgICAgeworICAgICAgICB4Lm1vdmVkXyA9IHRydWU7CisgICAgfQorCisgICBvbmx5X21vdmFibGUmIG9wZXJhdG9yPShCT09TVF9SVl9SRUYob25seV9tb3ZhYmxlKSB4KSB7CisgICAgICAgIHZhbHVlXyA9IHgudmFsdWVfOworICAgICAgICB4Lm1vdmVkXyA9IHRydWU7CisgICAgICAgIG1vdmVkXyA9IGZhbHNlOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICB9CisKKyAgICBleHBsaWNpdCBvbmx5X21vdmFibGUoaW50IHZhbHVlID0gMCkgOiB2YWx1ZV8odmFsdWUpLCBtb3ZlZF8oZmFsc2UpIHt9CisgICAgaW50IGdldF92YWx1ZSgpIGNvbnN0IHsgIHJldHVybiB2YWx1ZV87ICB9CisgICAgYm9vbCBpc19tb3ZlZCgpIGNvbnN0IHsgcmV0dXJuIG1vdmVkXzsgfQorfTsKKworCitpbnQgb25lKEJPT1NUX1JWX1JFRihvbmx5X21vdmFibGUpIHYpIHsgcmV0dXJuIHYuZ2V0X3ZhbHVlKCk7IH0KK29ubHlfbW92YWJsZSB0d28oQk9PU1RfUlZfUkVGKG9ubHlfbW92YWJsZSkgdCkgeworICAgIG9ubHlfbW92YWJsZSB0MSA9IGJvb3N0Ojptb3ZlKHQpOworICAgIHJldHVybiBCT09TVF9NT1ZFX1JFVChvbmx5X21vdmFibGUsIHQxKTsKK30KKworb25seV9tb3ZhYmxlIHR3b19zdW0oQk9PU1RfUlZfUkVGKG9ubHlfbW92YWJsZSkgdDEsIEJPT1NUX1JWX1JFRihvbmx5X21vdmFibGUpIHQyKSB7CisgICAgb25seV9tb3ZhYmxlIHJldCh0MS5nZXRfdmFsdWUoKSArIHQyLmdldF92YWx1ZSgpKTsKKyAgICByZXR1cm4gQk9PU1RfTU9WRV9SRVQob25seV9tb3ZhYmxlLCByZXQpOworfQorCitzdHJ1Y3Qgc3VtX3N0cnVjdCB7CisgICAgb25seV9tb3ZhYmxlIG9wZXJhdG9yKCkoQk9PU1RfUlZfUkVGKG9ubHlfbW92YWJsZSkgdDEsIEJPT1NUX1JWX1JFRihvbmx5X21vdmFibGUpIHQyKSBjb25zdCB7CisgICAgICAgIG9ubHlfbW92YWJsZSByZXQodDEuZ2V0X3ZhbHVlKCkgKyB0Mi5nZXRfdmFsdWUoKSk7CisgICAgICAgIHJldHVybiBCT09TVF9NT1ZFX1JFVChvbmx5X21vdmFibGUsIHJldCk7CisgICAgfQorfTsKKworI2lmbmRlZiBCT09TVF9OT19DWFgxMV9SVkFMVUVfUkVGRVJFTkNFUworaW50IHRocmVlKHN0ZDo6c3RyaW5nJiYpIHsgcmV0dXJuIDE7IH0KK3N0ZDo6c3RyaW5nJiYgZm91cihzdGQ6OnN0cmluZyYmIHMpIHsgcmV0dXJuIGJvb3N0Ojptb3ZlKHMpOyB9CisjZW5kaWYKKworaW50IHRlc3RfbWFpbihpbnQsIGNoYXIqW10pCit7CisgICAgdXNpbmcgYm9vc3Q6OmZ1bmN0aW9uOworCisgICAgZnVuY3Rpb24gPGludChCT09TVF9SVl9SRUYob25seV9tb3ZhYmxlKSk+ICBmMSA9IG9uZTsKKworICAgIG9ubHlfbW92YWJsZSBvbTEoMSk7CisgICAgQk9PU1RfQ0hFQ0soZjEoYm9vc3Q6Om1vdmUob20xKSkgPT0gMSk7CisKKyAgICBmdW5jdGlvbiA8b25seV9tb3ZhYmxlKEJPT1NUX1JWX1JFRihvbmx5X21vdmFibGUpKT4gIGYyID0gdHdvOworCisgICAgb25seV9tb3ZhYmxlIG9tMigyKTsKKyAgICBvbmx5X21vdmFibGUgb20yXzIgPSBmMihib29zdDo6bW92ZShvbTIpKTsKKyAgICBCT09TVF9DSEVDSyhvbTJfMi5nZXRfdmFsdWUoKSA9PSAyKTsKKyAgICBCT09TVF9DSEVDSyhvbTIuaXNfbW92ZWQoKSk7CisKKyAgICB7CisgICAgICAgIGZ1bmN0aW9uIDxvbmx5X21vdmFibGUoQk9PU1RfUlZfUkVGKG9ubHlfbW92YWJsZSksIEJPT1NUX1JWX1JFRihvbmx5X21vdmFibGUpKT4gIGYyX3N1bSA9IHR3b19zdW07CisgICAgICAgIG9ubHlfbW92YWJsZSBvbTFfc3VtKDEpLCBvbTJfc3VtKDIpOworICAgICAgICBvbmx5X21vdmFibGUgb20yX3N1bV8yID0gZjJfc3VtKGJvb3N0Ojptb3ZlKG9tMV9zdW0pLCBib29zdDo6bW92ZShvbTJfc3VtKSk7CisgICAgICAgIEJPT1NUX0NIRUNLKG9tMl9zdW1fMi5nZXRfdmFsdWUoKSA9PSAzKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHN1bV9zdHJ1Y3QgczsKKyAgICAgICAgZnVuY3Rpb24gPG9ubHlfbW92YWJsZShCT09TVF9SVl9SRUYob25seV9tb3ZhYmxlKSwgQk9PU1RfUlZfUkVGKG9ubHlfbW92YWJsZSkpPiAgZjJfc3VtID0gczsKKyAgICAgICAgb25seV9tb3ZhYmxlIG9tMV9zdW0oMSksIG9tMl9zdW0oMik7CisgICAgICAgIG9ubHlfbW92YWJsZSBvbTJfc3VtXzIgPSBmMl9zdW0oYm9vc3Q6Om1vdmUob20xX3N1bSksIGJvb3N0Ojptb3ZlKG9tMl9zdW0pKTsKKyAgICAgICAgQk9PU1RfQ0hFQ0sob20yX3N1bV8yLmdldF92YWx1ZSgpID09IDMpOworICAgIH0KKworI2lmbmRlZiBCT09TVF9OT19DWFgxMV9SVkFMVUVfUkVGRVJFTkNFUworICAgIGZ1bmN0aW9uIDxpbnQoc3RkOjpzdHJpbmcmJik+ICAgICAgICAgICAgICAgZjMgPSB0aHJlZTsKKyAgICBmdW5jdGlvbiA8c3RkOjpzdHJpbmcmJiAoc3RkOjpzdHJpbmcmJiBzKT4gIGY0ID0gZm91cjsKKworICAgIGYzKHN0ZDo6c3RyaW5nKCJIZWxsbyIpKTsKKyAgICBCT09TVF9DSEVDSyhmNChzdGQ6OnN0cmluZygid29ybGQiKSkgPT0gIndvcmxkIik7CisjZW5kaWYKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9zdGF0ZWxlc3NfdGVzdC5jcHAgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L3N0YXRlbGVzc190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmM5ZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9zdGF0ZWxlc3NfdGVzdC5jcHAKQEAgLTAsMCArMSwzOCBAQAorLy8gQm9vc3QuRnVuY3Rpb24gbGlicmFyeQorCisvLyAgQ29weXJpZ2h0IERvdWdsYXMgR3JlZ29yIDIwMDEtMjAwMy4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvbWluaW1hbC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworc3RydWN0IHN0YXRlbGVzc19pbnRlZ2VyX2FkZCB7CisgIGludCBvcGVyYXRvcigpKGludCB4LCBpbnQgeSkgY29uc3QgeyByZXR1cm4geCt5OyB9CisKKyAgdm9pZCogb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90KQorICB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJDYW5ub3QgYWxsb2NhdGUgYSBzdGF0ZWxlc3NfaW50ZWdlcl9hZGQiKTsKKyAgfQorCisgIHZvaWQqIG9wZXJhdG9yIG5ldyhzdGQ6OnNpemVfdCwgdm9pZCogcCkKKyAgeworICAgIHJldHVybiBwOworICB9CisKKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCopIHRocm93KCkKKyAgeworICB9Cit9OworCitpbnQgdGVzdF9tYWluKGludCwgY2hhcipbXSkKK3sKKyAgYm9vc3Q6OmZ1bmN0aW9uMjxpbnQsIGludCwgaW50PiBmOworICBmID0gc3RhdGVsZXNzX2ludGVnZXJfYWRkKCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L3N0ZF9iaW5kX2N4eDk4LmNwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3Qvc3RkX2JpbmRfY3h4OTguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyM2ZhYjEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L3N0ZF9iaW5kX2N4eDk4LmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBGdW5jdGlvbiBsaWJyYXJ5CisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIERvdWdsYXMgR3JlZ29yCisKKy8vIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgCisvLyBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCAKKy8vIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkgCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcvCisKKyAgICAKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworc3RydWN0IFggeworICBpbnQgZm9vKGludCk7Cit9OworaW50IFg6OmZvbyhpbnQgeCkgeyByZXR1cm4gLXg7IH0KKworaW50IG1haW4oKQoreworI2lmbmRlZiBCT09TVF9OT19DWFg5OF9CSU5ERVJTCisgICAgICBib29zdDo6ZnVuY3Rpb248aW50IChpbnQpPiBmOworICBYIHg7CisgIGYgPSBzdGQ6OmJpbmQxc3QoCisgICAgICAgIHN0ZDo6bWVtX2Z1bigmWDo6Zm9vKSwgJngpOworICBmKDUpOyAvLyBDYWxsIHguZm9vKDUpCisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3Qvc3RkX2JpbmRfcG9ydGFibGUuY3BwIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9zdGRfYmluZF9wb3J0YWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmZGJjMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3Qvc3RkX2JpbmRfcG9ydGFibGUuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIEZ1bmN0aW9uIGxpYnJhcnkKKworLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgRG91Z2xhcyBHcmVnb3IKKworLy8gVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSAKKy8vIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IAorLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KSAKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZy8KKworICAgIAorI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCitzdHJ1Y3QgWCB7CisgIGludCBmb28oaW50KTsKK307CitpbnQgWDo6Zm9vKGludCB4KSB7IHJldHVybiAteDsgfQorCitpbnQgbWFpbigpCit7CisjaWZuZGVmIEJPT1NUX05PX0NYWDk4X0JJTkRFUlMKKyAgICAgIGJvb3N0OjpmdW5jdGlvbjE8aW50LCBpbnQ+IGY7CisgIFggeDsKKyAgZiA9IHN0ZDo6YmluZDFzdCgKKyAgICAgICAgc3RkOjptZW1fZnVuKCZYOjpmb28pLCAmeCk7CisgIGYoNSk7IC8vIENhbGwgeC5mb28oNSkKKyNlbmRpZgorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9zdW1fYXZnX2N4eDk4LmNwcCBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3Qvc3VtX2F2Z19jeHg5OC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmMmRjYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jvb3N0b3JnL2Z1bmN0aW9uL3Rlc3Qvc3VtX2F2Z19jeHg5OC5jcHAKQEAgLTAsMCArMSwyOCBAQAorLy8gRnVuY3Rpb24gbGlicmFyeQorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBEb3VnbGFzIEdyZWdvcgorCisvLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIAorLy8gTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgCisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpIAorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnLworCisgICAgCisjaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit2b2lkIGRvX3N1bV9hdmcoaW50IHZhbHVlc1tdLCBpbnQgbiwgaW50JiBzdW0sIGZsb2F0JiBhdmcpCit7CisgIHN1bSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHN1bSArPSB2YWx1ZXNbaV07CisgIGF2ZyA9IChmbG9hdClzdW0gLyBuOworfQoraW50IG1haW4oKQoreworICAgIGJvb3N0OjpmdW5jdGlvbjx2b2lkIChpbnQgdmFsdWVzW10sIGludCBuLCBpbnQmIHN1bSwgZmxvYXQmIGF2Zyk+IHN1bV9hdmc7CisgICAgc3VtX2F2ZyA9ICZkb19zdW1fYXZnOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ib29zdG9yZy9mdW5jdGlvbi90ZXN0L3N1bV9hdmdfcG9ydGFibGUuY3BwIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9zdW1fYXZnX3BvcnRhYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTY4N2UzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYm9vc3RvcmcvZnVuY3Rpb24vdGVzdC9zdW1fYXZnX3BvcnRhYmxlLmNwcApAQCAtMCwwICsxLDI4IEBACisvLyBGdW5jdGlvbiBsaWJyYXJ5CisKKy8vIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIERvdWdsYXMgR3JlZ29yCisKKy8vIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgCisvLyBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCAKKy8vIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkgCisKKy8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcvCisKKyAgICAKKyNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3ZvaWQgZG9fc3VtX2F2ZyhpbnQgdmFsdWVzW10sIGludCBuLCBpbnQmIHN1bSwgZmxvYXQmIGF2ZykKK3sKKyAgc3VtID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgc3VtICs9IHZhbHVlc1tpXTsKKyAgYXZnID0gKGZsb2F0KXN1bSAvIG47Cit9CitpbnQgbWFpbigpCit7CisgICAgYm9vc3Q6OmZ1bmN0aW9uNDx2b2lkLCBpbnQqLCBpbnQsIGludCYsIGZsb2F0Jj4gc3VtX2F2ZzsKKyAgICBzdW1fYXZnID0gJmRvX3N1bV9hdmc7CisKKyAgICByZXR1cm4gMDsKK30K