Updated 13/03/2018
See end for effect use of different historic period for setting CPI expectations.
Original
You can find the repo for this markdown here. Please feel free to fork and PR.
Richard Wilkinson has done a rough and ready calculation of what the
proposed USS pension deal of 12/03/2018 would mean in terms of the
absolute maximum possible pension. His calculations can be found here.
The long and the short of it is that he finds that if someone were to
come in at the max pensionable salary and stay there for 40 years the
max pension they could get would be:
[1] 19764.71
Now this ignores that fact that many of us don’t get pensionable job
until 30 years before retirement, and we don’t generally start on £42k
(the max DB salary), but still, we are talking upper bounds here.
So this number does not look like the end of the world. But the
problem is inflation - while £19,765 might sound okay now, what will it
be worth in 40 years time? The new proposal suggests that inflation link
revaluation will be capped at 2.5%. Rich Wilkinson calculation what
this would mean for pensions if CPI did the same for the next 40 years
as it has done for the last.
cpi <- read.table("british_cpi.tsv.csv", header=T, stringsAsFactors = F)
cpi$CPI = as.numeric(sub("%","",cpi$CPI))
truncated_cpi <- sapply(cpi$CPI,function(x)min(x,2.5))
actual_pension_new_scheme <- base*prod(truncated_cpi/100+1)
inflation_adjusted_pension <- base*prod(cpi$CPI/100+1)
(real_terms_pension_new_scheme <- actual_pension_new_scheme/prod(cpi$CPI/100+1))
[1] 9920.738
You can download the CPI figures here. As with Richard Wilkinson’s nubmers they come from here, via some excel wrangling.
So adjusting for inflation, the maximum possible defined benefit is
£%#4.0-1e. This is much less good!! But how does it compare to the
current scheme?
Well in the current scheme, the pension is re-evaluated at the
“official pension re-evaluation rate” used by government schemes. This
boils down to CPI matching up to 5%, then half the increase up to 10%,
then fixed. How does this play out? First lets calculate the effective
CPIs under this scheme:
revalue <- function(cpi) {
if (cpi < 5) return (cpi)
if (cpi < 15) {
return (5 + 0.5*(cpi-5))}
else {
return (10)
}
}
(effective_cpi_offical <- sapply(cpi$CPI, revalue))
These are very nearly the the real CPI values. Only in a few years
did the CPI exceed 5%. Okay, lets assume our very luck new starter
starts on 42k, but then never gets a pay increase. This seems like the
fairest way to match the estimate above. What would their final defined
benefit be worth in today’s terms?
Now under the old scheme, we accrued 75ths rather than 85ths. So the base pension is slightly different:
(old_base <- 42000 * 40/75)
[1] 22400
That’s a difference from £19,765 under the proposed system, but not a
ruinous one. The real kicker is when we calculate the effective value
in today’s money:
actual_pension_old_scheme <- old_base*prod(effective_cpi_offical/100+1)
inflation_adjusted_pension <- old_base*prod(cpi$CPI/100+1)
(real_terms_pension_old <- actual_pension_old_scheme/prod(cpi$CPI/100+1))
[1] 18638.72
So under the old inflation adjustment scheme the real terms value of
this person would have been £18,639 rather than £9,921 under the new
scheme.
This of course isn’t fair because no one comes in with a salary of
£42,000 and then stays there for a whole 40 years. And over the 42k cap
they’d be contributing to a DC pot, but it does show you how big an
effect this 2.5% CPI cap has. Stay tuned for an update modelling a more
realistic spine progression and including the DC pot.
Was the last 40 years an unfair period?
It has been pointed out to me that using the last 40 years to model
the effects of inflation might be an unfair period to use becuase of 1)
out of the ordinary spikes in inflation in the late 70s and early 80s
that are unlikely to be repeated, not least because 2) in 1992 we
adopted a 2% inflation target.
Okay, what does this mean? What has CPI done in the last 40 years?
library(ggplot2)
ggplot(cpi, aes(Year, CPI)) + geom_point() + geom_smooth() + theme_bw()
Okay, so the late 70s and early 80s really do look like a different
world, and since ’92, the 2% target has quite a good job of limiting
inflation, with the exception of the time immediataely after the ’08
crash. The realy question is whether the blip around ’90 is part of the
old regieme or the new. The peak might look big, but once the trend is removed, is it really much bigger than the the 2011 peak?
What would make a more reasonable estimation of the effect of CPI. In
the following I am going to use the following plan. I will build a
predicted future inflation by randomly sampling inflation from the
post-92 years 40 times (lets remember that 95-2008 was a period of
almost unrivaled prosperity, so this is pretty generous). I’ll do this
100 times and build up a picture of the possible futures. we can also
include 88-92 to see what difference that makes.
The UUK side seem to be valuing their risk based on a 67% confidence. What happens if we do the same?
library(dplyr)
simulated_futures %>%
group_by(scheme, historic_period) %>%
summarise(Prudence_estimate=quantile(samples, 0.33)) %>%
mutate(Prudence_estimate=scales::dollar_format(prefix="£")(Prudence_estimate))
| | | | |
---|
proposed | '92 and after | £17,670.44 | | |
proposed | '89 and after | £14,875.70 | | |
proposed | '08 and after | £16,352.04 | | |
current | '92 and after | £22,400.00 | | |
current | '89 and after | £21,618.71 | | |
current | '08 and after | £22,400.00 | | |
The first thing to say is that this definately looks better than the
above estimate using data from the last 40 years. But we are still
looking at a £4.7-£6.7k per year loss. The second thing to say is that
what inflation does really matters. Was 89-92 part of the old world
order or was 1995-2008 a never to be repeated golden period? Is the post
crash world the new normal? Or does the fact its “post-crash” make it
an abnormal anomoly to be ignored?
I suppose this is what we mean by “risk”. This is a proposal to
“share” risk between the employers and USS memebers. How much risk is
transferred from employers to members under this scheme? I have no idea
how to calculate this properly, but I’m going to have a go a reasoning
this through a bit. Please someone tell me I’m wrong.
USS claim to have a £7.5bn deficit under the “de-risked” current
scheme, with 350,000 members, thats a per-member deficit of £21,429. If
you only include the 190,000 actively contriubting members, thats
£39,473 each. They calculate this using a 67% prudence, and if we do the
same with the new scheme, we find a range of losses, from £4.7k-£6.7k.
Let us take the lowest figure, £4.7k. Someone with 40 years still to
constribute would be 28 now, would retire at 68, and would expect to
live another 19 years. So the loss to that person over those 19 years
would be £89,300 (real terms), far more than the £21,429 deficit, and
more than twice £39,473.
Same caveats apply: this is only considering the DB part of the
scheme, and not what additional DC contributions might bring - its not a
full pension modeller, although it would be nice to see these CPI
simulations added to the existing pension modeller. Real people also
start on less than £42k. Oh, and I could be getting it all wrong!
LS0tCnRpdGxlOiAiQ29tcGFyaXNvbiBvZiBvbGQgVVNTIHBlbnNpb25zIHRvIG5ldyBwcm9wb3NhbCIKb3V0cHV0OiBodG1sX25vdGVib29rCmF1dGhvcjogSWFuIFN1ZGJlcnkKZGF0ZTogMTIvMDMvMjAxOAotLS0KCiMjIFVwZGF0ZWQgMTMvMDMvMjAxOAoKU2VlIGVuZCBmb3IgZWZmZWN0IHVzZSBvZiBkaWZmZXJlbnQgaGlzdG9yaWMgcGVyaW9kIGZvciBzZXR0aW5nIENQSSBleHBlY3RhdGlvbnMuCgojIyBPcmlnaW5hbAoKWW91IGNhbiBmaW5kIHRoZSByZXBvIGZvciB0aGlzIG1hcmtkb3duIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vSWFuU3VkYmVyeS91c3MtcGVuc2lvbnMtcHJvcG9zYWwpLiBQbGVhc2UgZmVlbCBmcmVlIHRvIGZvcmsgYW5kIFBSLgoKUmljaGFyZCBXaWxraW5zb24gaGFzIGRvbmUgYSByb3VnaCBhbmQgcmVhZHkgY2FsY3VsYXRpb24gb2Ygd2hhdCB0aGUgcHJvcG9zZWQgVVNTIHBlbnNpb24gZGVhbCBvZiAxMi8wMy8yMDE4ICB3b3VsZCBtZWFuIGluIHRlcm1zIG9mIHRoZSBhYnNvbHV0ZSBtYXhpbXVtIHBvc3NpYmxlIHBlbnNpb24uIEhpcyBjYWxjdWxhdGlvbnMgY2FuIGJlIGZvdW5kIFtoZXJlXShodHRwOi8vcmljaC1kLXdpbGtpbnNvbi5naXRodWIuaW8vUGVuc2lvbkNhcC5odG1sKS4gVGhlIGxvbmcgYW5kIHRoZSBzaG9ydCBvZiBpdCBpcyB0aGF0IGhlIGZpbmRzIHRoYXQgaWYgc29tZW9uZSB3ZXJlIHRvIGNvbWUgaW4gYXQgdGhlIG1heCBwZW5zaW9uYWJsZSBzYWxhcnkgYW5kIHN0YXkgdGhlcmUgZm9yIDQwIHllYXJzIHRoZSBtYXggcGVuc2lvbiB0aGV5IGNvdWxkIGdldCB3b3VsZCBiZToKCmBgYHtyfQooYmFzZSA8LSA0MjAwMCAqIDQwLzg1KQpgYGAKCk5vdyB0aGlzIGlnbm9yZXMgdGhhdCBmYWN0IHRoYXQgbWFueSBvZiB1cyBkb24ndCBnZXQgcGVuc2lvbmFibGUgam9iIHVudGlsIDMwIHllYXJzIGJlZm9yZSByZXRpcmVtZW50LCBhbmQgd2UgZG9uJ3QgZ2VuZXJhbGx5IHN0YXJ0IG9uIMKjNDJrICh0aGUgbWF4IERCIHNhbGFyeSksIGJ1dCBzdGlsbCwgd2UgYXJlIHRhbGtpbmcgdXBwZXIgYm91bmRzIGhlcmUuCgpTbyB0aGlzIG51bWJlciBkb2VzIG5vdCBsb29rIGxpa2UgdGhlIGVuZCBvZiB0aGUgd29ybGQuIEJ1dCB0aGUgcHJvYmxlbSBpcyBpbmZsYXRpb24gLSB3aGlsZSDCo2ByIGZvcm1hdChiYXNlLCBkaWdpdHM9MSwgYmlnLm1hcms9IiwiKWAgbWlnaHQgc291bmQgb2theSBub3csIHdoYXQgd2lsbCBpdCBiZSB3b3J0aCBpbiA0MCB5ZWFycyB0aW1lPyBUaGUgbmV3IHByb3Bvc2FsIHN1Z2dlc3RzIHRoYXQgaW5mbGF0aW9uIGxpbmsgcmV2YWx1YXRpb24gd2lsbCBiZSBjYXBwZWQgYXQgMi41JS4gUmljaCBXaWxraW5zb24gY2FsY3VsYXRpb24gd2hhdCB0aGlzIHdvdWxkIG1lYW4gZm9yIHBlbnNpb25zIGlmIENQSSBkaWQgdGhlIHNhbWUgZm9yIHRoZSBuZXh0IDQwIHllYXJzIGFzIGl0IGhhcyBkb25lIGZvciB0aGUgbGFzdC4gCgpgYGB7cn0KY3BpIDwtIHJlYWQudGFibGUoImJyaXRpc2hfY3BpLnRzdiIsIGhlYWRlcj1ULCBzdHJpbmdzQXNGYWN0b3JzID0gRikKY3BpJENQSSA9IGFzLm51bWVyaWMoc3ViKCIlIiwiIixjcGkkQ1BJKSkKdHJ1bmNhdGVkX2NwaSA8LSBzYXBwbHkoY3BpJENQSSxmdW5jdGlvbih4KW1pbih4LDIuNSkpCmFjdHVhbF9wZW5zaW9uX25ld19zY2hlbWUgPC0gYmFzZSpwcm9kKHRydW5jYXRlZF9jcGkvMTAwKzEpCmluZmxhdGlvbl9hZGp1c3RlZF9wZW5zaW9uIDwtIGJhc2UqcHJvZChjcGkkQ1BJLzEwMCsxKQoocmVhbF90ZXJtc19wZW5zaW9uX25ld19zY2hlbWUgPC0gYWN0dWFsX3BlbnNpb25fbmV3X3NjaGVtZS9wcm9kKGNwaSRDUEkvMTAwKzEpKQoKYGBgCllvdSBjYW4gZG93bmxvYWQgdGhlIENQSSBmaWd1cmVzIFtoZXJlXShicml0aXNoX2NwaS50c3YpLiBBcyB3aXRoIFJpY2hhcmQgV2lsa2luc29uJ3MgbnVibWVycyB0aGV5IGNvbWUgZnJvbSBbaGVyZV0oaHR0cDovL3d3dy5pbmZsYXRpb24uZXUvaW5mbGF0aW9uLXJhdGVzL2dyZWF0LWJyaXRhaW4vaGlzdG9yaWMtaW5mbGF0aW9uL2NwaS1pbmZsYXRpb24tZ3JlYXQtYnJpdGFpbi5hc3B4KSwgdmlhIHNvbWUgZXhjZWwgd3JhbmdsaW5nLiAKClNvIGFkanVzdGluZyBmb3IgaW5mbGF0aW9uLCB0aGUgbWF4aW11bSBwb3NzaWJsZSBkZWZpbmVkIGJlbmVmaXQgaXMgwqNgciBmb3JtYXQocmVhbF90ZXJtc19wZW5zaW9uX25ld19zY2hlbWUsIGRpZ2l0cz0wLCBiaWcubWFyaz0iLCIpYC4gVGhpcyBpcyBtdWNoIGxlc3MgZ29vZCEhIEJ1dCBob3cgZG9lcyBpdCBjb21wYXJlIHRvIHRoZSBjdXJyZW50IHNjaGVtZT8gCgpXZWxsIGluIHRoZSBjdXJyZW50IHNjaGVtZSwgdGhlIHBlbnNpb24gaXMgcmUtZXZhbHVhdGVkIGF0IHRoZSAib2ZmaWNpYWwgcGVuc2lvbiByZS1ldmFsdWF0aW9uIHJhdGUiIHVzZWQgYnkgZ292ZXJubWVudCBzY2hlbWVzLiBUaGlzIGJvaWxzIGRvd24gdG8gQ1BJIG1hdGNoaW5nIHVwIHRvIDUlLCB0aGVuIGhhbGYgdGhlIGluY3JlYXNlIHVwIHRvIDEwJSwgdGhlbiBmaXhlZC4gSG93IGRvZXMgdGhpcyBwbGF5IG91dD8gRmlyc3QgbGV0cyBjYWxjdWxhdGUgdGhlIGVmZmVjdGl2ZSBDUElzIHVuZGVyIHRoaXMgc2NoZW1lOgoKYGBge3J9CnJldmFsdWUgPC0gZnVuY3Rpb24oY3BpKSB7CiAgaWYgKGNwaSA8IDUpIHJldHVybiAoY3BpKQogIGlmIChjcGkgPCAxNSkgewogICAgcmV0dXJuICg1ICsgMC41KihjcGktNSkpfQogIGVsc2UgewogICAgcmV0dXJuICgxMCkKICB9Cn0KCihlZmZlY3RpdmVfY3BpX29mZmljYWwgPC0gc2FwcGx5KGNwaSRDUEksIHJldmFsdWUpKQpgYGAKClRoZXNlIGFyZSB2ZXJ5IG5lYXJseSB0aGUgdGhlIHJlYWwgQ1BJIHZhbHVlcy4gT25seSBpbiBhIGZldyB5ZWFycyBkaWQgdGhlIENQSSBleGNlZWQgNSUuIE9rYXksIGxldHMgYXNzdW1lIG91ciB2ZXJ5IGx1Y2sgbmV3IHN0YXJ0ZXIgc3RhcnRzIG9uIDQyaywgYnV0IHRoZW4gbmV2ZXIgZ2V0cyBhIHBheSBpbmNyZWFzZS4gVGhpcyBzZWVtcyBsaWtlIHRoZSBmYWlyZXN0IHdheSB0byBtYXRjaCB0aGUgZXN0aW1hdGUgYWJvdmUuIFdoYXQgd291bGQgdGhlaXIgZmluYWwgZGVmaW5lZCBiZW5lZml0IGJlIHdvcnRoIGluIHRvZGF5J3MgdGVybXM/CgpOb3cgdW5kZXIgdGhlIG9sZCBzY2hlbWUsIHdlIGFjY3J1ZWQgNzV0aHMgcmF0aGVyIHRoYW4gODV0aHMuIFNvIHRoZSBiYXNlIHBlbnNpb24gaXMgc2xpZ2h0bHkgZGlmZmVyZW50OgoKYGBge3J9CihvbGRfYmFzZSA8LSA0MjAwMCAqIDQwLzc1KQoKYGBgCgpUaGF0J3MgYSBkaWZmZXJlbmNlIGZyb20gwqNgciBmb3JtYXQoYmFzZSwgZGlnaXRzPTEsIGJpZy5tYXJrPSIsIilgIHVuZGVyIHRoZSBwcm9wb3NlZCBzeXN0ZW0sIGJ1dCBub3QgYSBydWlub3VzIG9uZS4gVGhlIHJlYWwga2lja2VyIGlzIHdoZW4gd2UgY2FsY3VsYXRlIHRoZSBlZmZlY3RpdmUgdmFsdWUgaW4gdG9kYXkncyBtb25leToKCmBgYHtyfQphY3R1YWxfcGVuc2lvbl9vbGRfc2NoZW1lIDwtIG9sZF9iYXNlKnByb2QoZWZmZWN0aXZlX2NwaV9vZmZpY2FsLzEwMCsxKQppbmZsYXRpb25fYWRqdXN0ZWRfcGVuc2lvbiA8LSBvbGRfYmFzZSpwcm9kKGNwaSRDUEkvMTAwKzEpCihyZWFsX3Rlcm1zX3BlbnNpb25fb2xkIDwtIGFjdHVhbF9wZW5zaW9uX29sZF9zY2hlbWUvcHJvZChjcGkkQ1BJLzEwMCsxKSkKYGBgCgpTbyB1bmRlciB0aGUgb2xkIGluZmxhdGlvbiBhZGp1c3RtZW50IHNjaGVtZSB0aGUgcmVhbCB0ZXJtcyB2YWx1ZSBvZiB0aGlzIHBlcnNvbiB3b3VsZCBoYXZlIGJlZW4gwqNgciBmb3JtYXQocmVhbF90ZXJtc19wZW5zaW9uX29sZCwgZGlnaXRzPTEsIGJpZy5tYXJrPSIsIilgIHJhdGhlciB0aGFuIMKjYHIgZm9ybWF0KHJlYWxfdGVybXNfcGVuc2lvbiwgZGlnaXRzPTEsIGJpZy5tYXJrPSIsIilgIHVuZGVyIHRoZSBuZXcgc2NoZW1lLgoKVGhpcyBvZiBjb3Vyc2UgaXNuJ3QgZmFpciBiZWNhdXNlIG5vIG9uZSBjb21lcyBpbiB3aXRoIGEgc2FsYXJ5IG9mIMKjNDIsMDAwIGFuZCB0aGVuIHN0YXlzIHRoZXJlIGZvciBhIHdob2xlIDQwIHllYXJzLiBBbmQgb3ZlciB0aGUgNDJrIGNhcCB0aGV5J2QgYmUgY29udHJpYnV0aW5nIHRvIGEgREMgcG90LCAgYnV0IGl0IGRvZXMgc2hvdyB5b3UgaG93IGJpZyBhbiBlZmZlY3QgdGhpcyAyLjUlIENQSSBjYXAgaGFzLiBTdGF5IHR1bmVkIGZvciBhbiB1cGRhdGUgbW9kZWxsaW5nIGEgbW9yZSByZWFsaXN0aWMgc3BpbmUgcHJvZ3Jlc3Npb24gYW5kIGluY2x1ZGluZyB0aGUgREMgcG90LiAKCiMjIFdhcyB0aGUgbGFzdCA0MCB5ZWFycyBhbiB1bmZhaXIgcGVyaW9kPwoKSXQgaGFzIGJlZW4gcG9pbnRlZCBvdXQgdG8gbWUgdGhhdCB1c2luZyB0aGUgbGFzdCA0MCB5ZWFycyB0byBtb2RlbCB0aGUgZWZmZWN0cyBvZiBpbmZsYXRpb24gbWlnaHQgYmUgYW4gdW5mYWlyIHBlcmlvZCB0byB1c2UgYmVjdWFzZSBvZiAxKSBvdXQgb2YgdGhlIG9yZGluYXJ5IHNwaWtlcyBpbiBpbmZsYXRpb24gaW4gdGhlIGxhdGUgNzBzIGFuZCBlYXJseSA4MHMgdGhhdCBhcmUgdW5saWtlbHkgdG8gYmUgcmVwZWF0ZWQsIG5vdCBsZWFzdCBiZWNhdXNlIDIpIGluIDE5OTIgd2UgYWRvcHRlZCBhIDIlIGluZmxhdGlvbiB0YXJnZXQuIAoKT2theSwgd2hhdCBkb2VzIHRoaXMgbWVhbj8gV2hhdCBoYXMgQ1BJIGRvbmUgaW4gdGhlIGxhc3QgNDAgeWVhcnM/CgpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpnZ3Bsb3QoY3BpLCBhZXMoWWVhciwgQ1BJKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aCgpICsgdGhlbWVfYncoKQpgYGAKIE9rYXksIHNvIHRoZSBsYXRlIDcwcyBhbmQgZWFybHkgODBzIHJlYWxseSBkbyBsb29rIGxpa2UgYSBkaWZmZXJlbnQgd29ybGQsIGFuZCBzaW5jZSAnOTIsIHRoZSAyJSB0YXJnZXQgaGFzIHF1aXRlIGEgZ29vZCBqb2Igb2YgbGltaXRpbmcgaW5mbGF0aW9uLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHRpbWUgaW1tZWRpYXRhZWx5IGFmdGVyIHRoZSAnMDggY3Jhc2guIFRoZSByZWFseSBxdWVzdGlvbiBpcyB3aGV0aGVyIHRoZSBibGlwIGFyb3VuZCAnOTAgaXMgcGFydCBvZiB0aGUgb2xkIHJlZ2llbWUgb3IgdGhlIG5ldy4gVGhlIHBlYWsgbWlnaHQgKmxvb2sqIGJpZywgYnV0IG9uY2UgdGhlIHRyZW5kIGlzIHJlbW92ZWQsIGlzIGl0IHJlYWxseSBtdWNoIGJpZ2dlciB0aGFuIHRoZSB0aGUgMjAxMSBwZWFrPyAKIAogV2hhdCB3b3VsZCBtYWtlIGEgbW9yZSByZWFzb25hYmxlIGVzdGltYXRpb24gb2YgdGhlIGVmZmVjdCBvZiBDUEkuIEluIHRoZSBmb2xsb3dpbmcgSSBhbSBnb2luZyB0byB1c2UgdGhlIGZvbGxvd2luZyBwbGFuLiBJIHdpbGwgYnVpbGQgYSBwcmVkaWN0ZWQgZnV0dXJlIGluZmxhdGlvbiBieSByYW5kb21seSBzYW1wbGluZyBpbmZsYXRpb24gZnJvbSB0aGUgcG9zdC05MiB5ZWFycyA0MCB0aW1lcyAobGV0cyByZW1lbWJlciB0aGF0IDk1LTIwMDggd2FzIGEgcGVyaW9kIG9mIGFsbW9zdCB1bnJpdmFsZWQgcHJvc3Blcml0eSwgc28gdGhpcyBpcyBwcmV0dHkgZ2VuZXJvdXMpLiBJJ2xsIGRvIHRoaXMgMTAwIHRpbWVzIGFuZCBidWlsZCB1cCBhIHBpY3R1cmUgb2YgdGhlIHBvc3NpYmxlIGZ1dHVyZXMuIHdlIGNhbiBhbHNvIGluY2x1ZGUgODgtOTIgdG8gc2VlIHdoYXQgZGlmZmVyZW5jZSB0aGF0IG1ha2VzLgogCmBgYHtyfQpzYW1wbGVfZnV0dXJlX3BlbnNpb24gPC0gZnVuY3Rpb24oYmFzZSwgc2FtcGxlX2NwaXMsIGNwaV9saW1pdF9mdW5jdGlvbikgewogIGNwaXMgPSBzYW1wbGUoc2FtcGxlX2NwaXMsIDQwLCByZXBsYWNlID0gVCkKICB0cnVuY2F0ZWRfY3BpcyA9IHNhcHBseShjcGlzLCBjcGlfbGltaXRfZnVuY3Rpb24pCiAgYWN0dWFsX3BlbnNpb24gPC0gYmFzZSpwcm9kKHRydW5jYXRlZF9jcGlzLzEwMCsxKQogIHJlYWxfdGVybXNfcGVuc2lvbiA8LSBhY3R1YWxfcGVuc2lvbi9wcm9kKGNwaXMvMTAwKzEpCiAgcmV0dXJuKHJlYWxfdGVybXNfcGVuc2lvbikKfQoKcHJvcG9zZWRfY3BpX2xpbWl0ID0gZnVuY3Rpb24oeCkgbWluKHgsIDIuNSkKCnNpbXVsYXRlZF9mdXR1cmVzIDwtIGRhdGEuZnJhbWUoc2NoZW1lID0gInByb3Bvc2VkIiwgaGlzdG9yaWNfcGVyaW9kPSInOTIgYW5kIGFmdGVyIiwKICAgICBzYW1wbGVzID0gcmVwbGljYXRlKDEwMDAsIHNhbXBsZV9mdXR1cmVfcGVuc2lvbihiYXNlLCBjcGkkQ1BJW2NwaSRZZWFyID49IDE5OTJdLCBwcm9wb3NlZF9jcGlfbGltaXQpKSkKc2ltdWxhdGVkX2Z1dHVyZXMgPC0gcmJpbmQoc2ltdWxhdGVkX2Z1dHVyZXMsIGRhdGEuZnJhbWUoc2NoZW1lPSJwcm9wb3NlZCIsIGhpc3RvcmljX3BlcmlvZD0iJzg5IGFuZCBhZnRlciIsCiAgICBzYW1wbGVzID0gcmVwbGljYXRlKDEwMDAsIHNhbXBsZV9mdXR1cmVfcGVuc2lvbihiYXNlLCBjcGkkQ1BJW2NwaSRZZWFyID49IDE5ODhdLCBwcm9wb3NlZF9jcGlfbGltaXQpKSkpCnNpbXVsYXRlZF9mdXR1cmVzIDwtIHJiaW5kKHNpbXVsYXRlZF9mdXR1cmVzLCBkYXRhLmZyYW1lKHNjaGVtZT0icHJvcG9zZWQiLCBoaXN0b3JpY19wZXJpb2Q9IicwOCBhbmQgYWZ0ZXIiLAogICAgIHNhbXBsZXMgPSByZXBsaWNhdGUoMTAwMCwgc2FtcGxlX2Z1dHVyZV9wZW5zaW9uKGJhc2UsIGNwaSRDUElbY3BpJFllYXIgPj0gMjAwOF0sIHByb3Bvc2VkX2NwaV9saW1pdCkpKSkKc2ltdWxhdGVkX2Z1dHVyZXMgPC0gcmJpbmQoc2ltdWxhdGVkX2Z1dHVyZXMsIGRhdGEuZnJhbWUoc2NoZW1lPSJjdXJyZW50IiwgaGlzdG9yaWNfcGVyaW9kPSInOTIgYW5kIGFmdGVyIiwgCiAgICAgc2FtcGxlcyA9IHJlcGxpY2F0ZSgxMDAwLCBzYW1wbGVfZnV0dXJlX3BlbnNpb24ob2xkX2Jhc2UsIGNwaSRDUElbY3BpJFllYXIgPj0gMTk5Ml0sIHJldmFsdWUpKSkpCnNpbXVsYXRlZF9mdXR1cmVzIDwtIHJiaW5kKHNpbXVsYXRlZF9mdXR1cmVzLCBkYXRhLmZyYW1lKHNjaGVtZT0iY3VycmVudCIsIGhpc3RvcmljX3BlcmlvZD0iJzg5IGFuZCBhZnRlciIsIAogICAgIHNhbXBsZXMgPSByZXBsaWNhdGUoMTAwMCwgc2FtcGxlX2Z1dHVyZV9wZW5zaW9uKG9sZF9iYXNlLCBjcGkkQ1BJW2NwaSRZZWFyID49IDE5ODldLCByZXZhbHVlKSkpKQpzaW11bGF0ZWRfZnV0dXJlcyA8LSByYmluZChzaW11bGF0ZWRfZnV0dXJlcywgZGF0YS5mcmFtZShzY2hlbWU9ImN1cnJlbnQiLCBoaXN0b3JpY19wZXJpb2Q9IicwOCBhbmQgYWZ0ZXIiLCAKICAgICBzYW1wbGVzID0gcmVwbGljYXRlKDEwMDAsIHNhbXBsZV9mdXR1cmVfcGVuc2lvbihvbGRfYmFzZSwgY3BpJENQSVtjcGkkWWVhciA+PSAyMDA4XSwgcmV2YWx1ZSkpKSkKCmdncGxvdChzaW11bGF0ZWRfZnV0dXJlcykgKyAKICBhZXMoc2FtcGxlcywgZmlsbCA9IHNjaGVtZSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW5zPTMwKSArIAogIGZhY2V0X2dyaWQoaGlzdG9yaWNfcGVyaW9kfi4pICsKICB0aGVtZV9idygpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJkYXJrYmx1ZSIsICJncmV5NTAiKSwgbmFtZSA9ICJTY2hlbWUiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OmRvbGxhcl9mb3JtYXQocHJlZml4PSLCoyIpKSArCiAgZ2d0aXRsZSgiUHJlZGljdGVkIHJlYWwtdGVybXMgREIgYWZ0ZXIgNDAgeWVhcnMgb24gYSA0Mmsgc2FsYXJ5IiwKICAgICAgICAgIHN1Yj0iRXN0aW1hdGVzIGZyb20gMTAwMCBib290c3RyYXBzIG9mIENQSSBmcm9tIHZhcmlvdXMgaGlzdG9yaWMgcGVyaW9kcyIpICsKICB4bGFiKCJEZWZpbmVkIEJlbmVmaXQgcGVuc2lvbiB2YWx1ZSBpbiByZWFsIHRlcm1zIikKYGBgCiAKIFRoZSBVVUsgc2lkZSBzZWVtIHRvIGJlIHZhbHVpbmcgdGhlaXIgcmlzayBiYXNlZCBvbiBhIDY3JSBjb25maWRlbmNlLiBXaGF0IGhhcHBlbnMgaWYgd2UgZG8gdGhlIHNhbWU/CiAKYGBge3J9CmxpYnJhcnkoZHBseXIpCnNpbXVsYXRlZF9mdXR1cmVzICU+JQogIGdyb3VwX2J5KHNjaGVtZSwgaGlzdG9yaWNfcGVyaW9kKSAlPiUKICBzdW1tYXJpc2UoUHJ1ZGVuY2VfZXN0aW1hdGU9cXVhbnRpbGUoc2FtcGxlcywgMC4zMykpICU+JQogIG11dGF0ZShQcnVkZW5jZV9lc3RpbWF0ZT1zY2FsZXM6OmRvbGxhcl9mb3JtYXQocHJlZml4PSLCoyIpKFBydWRlbmNlX2VzdGltYXRlKSkKYGBgCiBUaGUgZmlyc3QgdGhpbmcgdG8gc2F5IGlzIHRoYXQgdGhpcyBkZWZpbmF0ZWx5IGxvb2tzIGJldHRlciB0aGFuIHRoZSBhYm92ZSBlc3RpbWF0ZSB1c2luZyBkYXRhIGZyb20gdGhlIGxhc3QgNDAgeWVhcnMuIEJ1dCB3ZSBhcmUgc3RpbGwgbG9va2luZyBhdCBhIMKjNC43LcKjNi43ayBwZXIgeWVhciBsb3NzLiBUaGUgc2Vjb25kIHRoaW5nIHRvIHNheSBpcyB0aGF0IHdoYXQgaW5mbGF0aW9uIGRvZXMgcmVhbGx5IG1hdHRlcnMuIFdhcyA4OS05MiBwYXJ0IG9mIHRoZSBvbGQgd29ybGQgb3JkZXIgb3Igd2FzIDE5OTUtMjAwOCBhIG5ldmVyIHRvIGJlIHJlcGVhdGVkIGdvbGRlbiBwZXJpb2Q/IElzIHRoZSBwb3N0IGNyYXNoIHdvcmxkIHRoZSBuZXcgbm9ybWFsPyBPciBkb2VzIHRoZSBmYWN0IGl0cyAicG9zdC1jcmFzaCIgbWFrZSBpdCBhbiBhYm5vcm1hbCBhbm9tb2x5IHRvIGJlIGlnbm9yZWQ/CiAKSSBzdXBwb3NlIHRoaXMgaXMgd2hhdCB3ZSBtZWFuIGJ5ICJyaXNrIi4gVGhpcyBpcyBhIHByb3Bvc2FsIHRvICJzaGFyZSIgcmlzayBiZXR3ZWVuIHRoZSBlbXBsb3llcnMgYW5kIFVTUyBtZW1lYmVycy4gSG93IG11Y2ggcmlzayBpcyB0cmFuc2ZlcnJlZCBmcm9tIGVtcGxveWVycyB0byBtZW1iZXJzIHVuZGVyIHRoaXMgc2NoZW1lPyBJIGhhdmUgbm8gaWRlYSBob3cgdG8gY2FsY3VsYXRlIHRoaXMgcHJvcGVybHksIGJ1dCBJJ20gZ29pbmcgdG8gaGF2ZSBhIGdvIGEgcmVhc29uaW5nIHRoaXMgdGhyb3VnaCBhIGJpdC4gUGxlYXNlIHNvbWVvbmUgdGVsbCBtZSBJJ20gd3JvbmcuIAoKVVNTIGNsYWltIHRvIGhhdmUgYSDCozcuNWJuIGRlZmljaXQgdW5kZXIgdGhlICJkZS1yaXNrZWQiIGN1cnJlbnQgc2NoZW1lLCB3aXRoIDM1MCwwMDAgbWVtYmVycywgdGhhdHMgYSBwZXItbWVtYmVyIGRlZmljaXQgb2YgwqMyMSw0MjkuIElmIHlvdSBvbmx5IGluY2x1ZGUgdGhlIDE5MCwwMDAgYWN0aXZlbHkgY29udHJpdWJ0aW5nIG1lbWJlcnMsIHRoYXRzIMKjMzksNDczIGVhY2guIFRoZXkgY2FsY3VsYXRlIHRoaXMgdXNpbmcgYSA2NyUgcHJ1ZGVuY2UsIGFuZCBpZiB3ZSBkbyB0aGUgc2FtZSB3aXRoIHRoZSBuZXcgc2NoZW1lLCB3ZSBmaW5kIGEgcmFuZ2Ugb2YgbG9zc2VzLCBmcm9tIMKjNC43ay3CozYuN2suIExldCB1cyB0YWtlIHRoZSBsb3dlc3QgZmlndXJlLCDCozQuN2suIFNvbWVvbmUgd2l0aCA0MCB5ZWFycyBzdGlsbCB0byBjb25zdHJpYnV0ZSB3b3VsZCBiZSAyOCBub3csIHdvdWxkIHJldGlyZSBhdCA2OCwgYW5kIHdvdWxkIGV4cGVjdCB0byBsaXZlIGFub3RoZXIgMTkgeWVhcnMuIFNvIHRoZSBsb3NzIHRvIHRoYXQgcGVyc29uIG92ZXIgdGhvc2UgMTkgeWVhcnMgd291bGQgYmUgwqM4OSwzMDAgKHJlYWwgdGVybXMpLCBmYXIgbW9yZSB0aGFuIHRoZSDCozIxLDQyOSBkZWZpY2l0LCBhbmQgbW9yZSB0aGFuIHR3aWNlIMKjMzksNDczLiAKClNhbWUgY2F2ZWF0cyBhcHBseTogdGhpcyBpcyBvbmx5IGNvbnNpZGVyaW5nIHRoZSBEQiBwYXJ0IG9mIHRoZSBzY2hlbWUsIGFuZCBub3Qgd2hhdCBhZGRpdGlvbmFsIERDIGNvbnRyaWJ1dGlvbnMgbWlnaHQgYnJpbmcgLSBpdHMgbm90IGEgZnVsbCBwZW5zaW9uIG1vZGVsbGVyLCBhbHRob3VnaCBpdCB3b3VsZCBiZSBuaWNlIHRvIHNlZSB0aGVzZSBDUEkgc2ltdWxhdGlvbnMgYWRkZWQgdG8gdGhlIGV4aXN0aW5nIHBlbnNpb24gbW9kZWxsZXIuIFJlYWwgcGVvcGxlIGFsc28gc3RhcnQgb24gbGVzcyB0aGFuIMKjNDJrLiBPaCwgYW5kIEkgY291bGQgYmUgZ2V0dGluZyBpdCBhbGwgd3JvbmchCg==