Quantiles

Any real-valued random variable \(X\) can be characterized by its distributuion function \(F(x) = \mathbb{P}(X \leq x)\). Then we call, for any \(\tau \in (0, 1)\), \(F^{-1}(\tau) = \inf\{ x: F(x) \geq \tau \}\) the \(\tau\)-th quantile of \(X\). For example, \(F^{-1}(1/2)\) stands for the median. In another word, \(\mathbb{P}(X \leq F^{-1}(\tau)) = \tau\), that is, the chance the random variable is less than \(F^{-1}(\tau)\) is \(\tau\).

Median and absolute deviation loss

In order to get the median of a random variable \(X\), we can minimize the expected absolute deviation \[\min_{\lambda} \mathbb{E} \left[ \frac{1}{2}|X - \lambda|\right].\] It is more intuitive to look at the first order condition: \[ \mathbb{E} \left[ \frac{1}{2}\operatorname{sign}(\lambda - X)\right] = 0. \] The sign function means \(\operatorname{sign}(a) = 1\) if \(a > 0\), \(\operatorname{sign}(a) = -1\) if \(a < 0\) and \(\operatorname{sign}(a) = 0\) if \(a = 0\). Therefore, we can rewrite the above equation as: \[\mathbb{P}(X \leq \lambda) - \mathbb{P}(X > \lambda) = 0.\] It is clear that the minimizer \(\lambda\) is the median of \(X\). Now suppose we have \(n\) observations \(\{X_1, \cdots, X_n\}\), then we can find the sample median by minimizing the empirical expectation \[ \min_{\lambda} \frac{1}{n} \sum_{i=1}^n |X_i - \lambda|.\] Similarly, the first order condition (estimating equation) is: \[ \frac{1}{n} \sum_{i=1}^n \operatorname{sign}(\lambda - X_i) = 0.\] This agrees with the way we learned to calculate median before. The above equation means there should be equal number of observations on each side of \(\lambda\).

Take-away message: we can transfer the problem of finding the median to a regression problem.

x <- seq(-5,5,length.out = 1000)
plot(x, 0.5*abs(x), type = "l", ylab = "absolute deviation loss")

Quantiles and quantile regression

Similarly, we an find all quantile information by minimizing another empirical quantity. If we think about the first order equation for the median \[ \mathbb{E} \left[ \frac{1}{2}\operatorname{sign}(\lambda - X)\right] = 0, \] it means when \(X > \lambda\), the contribution of \(X\) is \(-1/2\), and when \(X < \lambda\), the contribution of \(X\) is \(1/2\). Because of this equal contribution, we want to find a \(\lambda\) with \(X\) distributed symmetrically around it. In another word, \[\frac{1}{2}\mathbb{P}(X \leq \lambda) - \frac{1}{2}\mathbb{P}(X > \lambda) = 0.\]

So if we want to find a general \(\tau\)-th quantile instead, we basically want to find a \(\lambda\) such that \(\mathbb{P}(X \leq \lambda) = \tau\). Then \(\mathbb{P}(X > \lambda) = 1 - \tau\), and \[(1-\tau)\mathbb{P}(X \leq \lambda) - \tau\mathbb{P}(X > \lambda) = 0.\]

Integrating this equation, we get the minimization problem \[\min_{\lambda} \mathbb{E} \rho_{\tau}(X - \lambda),\] where \[\rho_{\tau}(a) = \begin{cases} a \tau & \text{if} a > 0 \\ a (\tau - 1) & \text{if} a \leq 0. \end{cases}\] We call \(\rho_{\tau}(a)\) the \(\tau\)-th quantile loss function.

x <- seq(-5,5,length.out = 1000)
quantile_loss <- function(x, tau) {
  ind <- 1*(x < 0)
  return (x*(tau - ind))
}
plot(x, quantile_loss(x, 0.2), type = "l", lty = 1, col = 1, ylab = "quantile loss")
lines(x, quantile_loss(x, 0.4), lty = 2, col = 2)
lines(x, quantile_loss(x, 0.5), lty = 3, col = 3, lwd = 5)
lines(x, quantile_loss(x, 0.6), lty = 4, col = 4)
lines(x, quantile_loss(x, 0.8), lty = 5, col = 5)
legend(x = 0, y = 4, legend = c(expression(paste(rho, "=", 0.2)),
                                expression(paste(rho, "=", 0.4)),
                                expression(paste(rho, "=", 0.5)),
                                expression(paste(rho, "=", 0.6)),
                                expression(paste(rho, "=", 0.8))),
       lty = c(1,2,3,4,5), lwd = c(1,1,5,1,1), col = c(1,2,3,4,5))

Quantile model

In the previous section, we have learned how to calculate quantiles of a sample by minimizing the empirical quantile risk. Sometimes we do not only care about the quantile for the whole data set, but also want to know the quantiles at each location. Therefore, we model the \(\tau\)-th quantiles as: \[Q(\tau|X_i) = X_i^\top \beta(\tau),\] that is, at different location \(X_i\), we have different quantile for the response \(Y_i\). You can compare this model with the linear regression model \[\mathbb{E}[Y_i|X_i] = X_i^{\top} \beta,\] where we assume the conditional mean is a linear function of location \(X_i\). Recall the linear regression \[\min_{\beta} \frac{1}{n} \sum_{i=1}^n (Y_i - X_i^\top \beta)^2.\] Similarly, we have the quantile regression \[\min_{\beta} \frac{1}{n} \sum_{i=1}^n \rho_{\tau}(Y_i - X_i^\top \beta).\]

R functions

Sample quantiles

x <- rnorm(100)
quantile(x, probs = seq(0.1, 0.9, by = 0.2))
        10%         30%         50%         70%         90% 
-1.30008362 -0.61458793  0.01792732  0.61799308  1.34464439 

Quantile regression

install.packages("quantreg")
library(quantreg)
x <- seq(2,10,length.out = 1000)
y <- x + x*rnorm(1000)
plot(x, y, pch = ".", ylim = c(-20, 40))
# median
fit1 <- rq(y ~ x, tau = 0.5)
abline(fit1, col = 2)
# true median
true1 <- x
lines(x, true1, col = 2, lty = 3)
# 0.2 quantile
fit2 <- rq(y ~ x, tau = 0.2)
abline(fit2, col = 3)
# true 0.2 quantile
true2 <- qnorm(p = 0.2, mean = x, sd = x)
lines(x, true2, col = 3, lty = 3)
# 0.7 quantile
fit3 <- rq(y ~ x, tau = 0.7)
abline(fit3, col = 4)
# true 0.7 quantile
true3 <- qnorm(p = 0.7, mean = x, sd = x)
lines(x, true3, col = 4, lty = 3)
legend(x = 2, y = 40, legend = c(expression(paste("estimated", rho, "=", 0.2)),
                                expression(paste("estimated", rho, "=", 0.5)),
                                expression(paste("estimated", rho, "=", 0.7)),
                                expression(paste("true", rho, "=", 0.2)),
                                expression(paste("true", rho, "=", 0.5)),
                                expression(paste("true", rho, "=", 0.7))),
       lty = c(1,1,1,3,3,3), col = c(3,2,4,3,2,4))

LS0tCnRpdGxlOiAiTWF0aCAxODkvMjg5IExhYiA4IgphdXRob3I6ICJBbGV4IEhhbmJvIExpIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAotLS0KClxEZWNsYXJlTWF0aE9wZXJhdG9ye1xzaWdufXtzaWdufQoKCiMgUXVhbnRpbGVzCkFueSByZWFsLXZhbHVlZCByYW5kb20gdmFyaWFibGUgJFgkIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGJ5IGl0cyBkaXN0cmlidXR1aW9uIGZ1bmN0aW9uCiRGKHgpID0gXG1hdGhiYntQfShYIFxsZXEgeCkkLiBUaGVuIHdlIGNhbGwsIGZvciBhbnkgJFx0YXUgXGluICgwLCAxKSQsIAokRl57LTF9KFx0YXUpID0gXGluZlx7IHg6IEYoeCkgXGdlcSBcdGF1IFx9JCB0aGUgJFx0YXUkLXRoIHF1YW50aWxlIG9mICRYJC4KRm9yIGV4YW1wbGUsICRGXnstMX0oMS8yKSQgc3RhbmRzIGZvciB0aGUgbWVkaWFuLiBJbiBhbm90aGVyIHdvcmQsCiRcbWF0aGJie1B9KFggXGxlcSBGXnstMX0oXHRhdSkpID0gXHRhdSQsIHRoYXQgaXMsIHRoZSBjaGFuY2UgdGhlIHJhbmRvbSB2YXJpYWJsZSBpcyBsZXNzIHRoYW4gJEZeey0xfShcdGF1KSQgaXMgJFx0YXUkLgoKIyMgTWVkaWFuIGFuZCBhYnNvbHV0ZSBkZXZpYXRpb24gbG9zcwpJbiBvcmRlciB0byBnZXQgdGhlIG1lZGlhbiBvZiBhIHJhbmRvbSB2YXJpYWJsZSAkWCQsIHdlIGNhbiBtaW5pbWl6ZSB0aGUgZXhwZWN0ZWQgYWJzb2x1dGUgZGV2aWF0aW9uCiQkXG1pbl97XGxhbWJkYX0gXG1hdGhiYntFfSBcbGVmdFsgXGZyYWN7MX17Mn18WCAtIFxsYW1iZGF8XHJpZ2h0XS4kJApJdCBpcyBtb3JlIGludHVpdGl2ZSB0byBsb29rIGF0IHRoZSBmaXJzdCBvcmRlciBjb25kaXRpb246CiQkClxtYXRoYmJ7RX0gXGxlZnRbIFxmcmFjezF9ezJ9XHNpZ24oXGxhbWJkYSAtIFgpXHJpZ2h0XSA9IDAuCiQkClRoZSBzaWduIGZ1bmN0aW9uIG1lYW5zICRcc2lnbihhKSA9IDEkIGlmICRhID4gMCQsICRcc2lnbihhKSA9IC0xJCBpZiAkYSA8IDAkIGFuZAokXHNpZ24oYSkgPSAwJCBpZiAkYSA9IDAkLgpUaGVyZWZvcmUsIHdlIGNhbiByZXdyaXRlIHRoZSBhYm92ZSBlcXVhdGlvbiBhczoKJCRcbWF0aGJie1B9KFggXGxlcSBcbGFtYmRhKSAtIFxtYXRoYmJ7UH0oWCA+IFxsYW1iZGEpID0gMC4kJApJdCBpcyBjbGVhciB0aGF0IHRoZSBtaW5pbWl6ZXIgJFxsYW1iZGEkIGlzIHRoZSBtZWRpYW4gb2YgJFgkLgpOb3cgc3VwcG9zZSB3ZSBoYXZlICRuJCBvYnNlcnZhdGlvbnMgJFx7WF8xLCBcY2RvdHMsIFhfblx9JCwgdGhlbiB3ZSBjYW4gZmluZCB0aGUgc2FtcGxlIG1lZGlhbiBieQptaW5pbWl6aW5nIHRoZSBlbXBpcmljYWwgZXhwZWN0YXRpb24KJCQgXG1pbl97XGxhbWJkYX0gXGZyYWN7MX17bn0gXHN1bV97aT0xfV5uICB8WF9pIC0gXGxhbWJkYXwuJCQKU2ltaWxhcmx5LCB0aGUgZmlyc3Qgb3JkZXIgY29uZGl0aW9uIChlc3RpbWF0aW5nIGVxdWF0aW9uKSBpczoKJCQgXGZyYWN7MX17bn0gXHN1bV97aT0xfV5uIFxzaWduKFxsYW1iZGEgLSBYX2kpID0gMC4kJApUaGlzIGFncmVlcyB3aXRoIHRoZSB3YXkgd2UgbGVhcm5lZCB0byBjYWxjdWxhdGUgbWVkaWFuIGJlZm9yZS4gVGhlIGFib3ZlIGVxdWF0aW9uIG1lYW5zIHRoZXJlIHNob3VsZCBiZSBlcXVhbCBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIG9uIGVhY2ggc2lkZSBvZiAkXGxhbWJkYSQuCgoqKlRha2UtYXdheSBtZXNzYWdlKio6IHdlIGNhbiB0cmFuc2ZlciB0aGUgcHJvYmxlbSBvZiBmaW5kaW5nIHRoZSBtZWRpYW4gdG8gYSByZWdyZXNzaW9uIHByb2JsZW0uCgpgYGB7cn0KeCA8LSBzZXEoLTUsNSxsZW5ndGgub3V0ID0gMTAwMCkKcGxvdCh4LCAwLjUqYWJzKHgpLCB0eXBlID0gImwiLCB5bGFiID0gImFic29sdXRlIGRldmlhdGlvbiBsb3NzIikKYGBgCgojIyBRdWFudGlsZXMgYW5kIHF1YW50aWxlIHJlZ3Jlc3Npb24KU2ltaWxhcmx5LCB3ZSBhbiBmaW5kIGFsbCBxdWFudGlsZSBpbmZvcm1hdGlvbiBieSBtaW5pbWl6aW5nIGFub3RoZXIgZW1waXJpY2FsIHF1YW50aXR5LiBJZiB3ZSB0aGluayBhYm91dCB0aGUgZmlyc3Qgb3JkZXIgZXF1YXRpb24gZm9yIHRoZSBtZWRpYW4KJCQKXG1hdGhiYntFfSBcbGVmdFsgXGZyYWN7MX17Mn1cc2lnbihcbGFtYmRhIC0gWClccmlnaHRdID0gMCwKJCQKaXQgbWVhbnMgd2hlbiAkWCA+IFxsYW1iZGEkLCB0aGUgY29udHJpYnV0aW9uIG9mICRYJCBpcyAkLTEvMiQsIGFuZCB3aGVuICRYIDwgXGxhbWJkYSQsIHRoZSBjb250cmlidXRpb24gb2YgJFgkIGlzICQxLzIkLiBCZWNhdXNlIG9mIHRoaXMgZXF1YWwgY29udHJpYnV0aW9uLCB3ZSB3YW50IHRvIGZpbmQgYSAkXGxhbWJkYSQgd2l0aCAkWCQgZGlzdHJpYnV0ZWQgc3ltbWV0cmljYWxseSBhcm91bmQgaXQuIEluIGFub3RoZXIgd29yZCwgCiQkXGZyYWN7MX17Mn1cbWF0aGJie1B9KFggXGxlcSBcbGFtYmRhKSAtIFxmcmFjezF9ezJ9XG1hdGhiYntQfShYID4gXGxhbWJkYSkgPSAwLiQkCgpTbyBpZiB3ZSB3YW50IHRvIGZpbmQgYSBnZW5lcmFsICRcdGF1JC10aCBxdWFudGlsZSBpbnN0ZWFkLCB3ZSBiYXNpY2FsbHkgd2FudCB0byBmaW5kIGEgJFxsYW1iZGEkIHN1Y2ggdGhhdCAkXG1hdGhiYntQfShYIFxsZXEgXGxhbWJkYSkgPSBcdGF1JC4gVGhlbiAkXG1hdGhiYntQfShYID4gXGxhbWJkYSkgPSAxIC0gXHRhdSQsIGFuZAokJCgxLVx0YXUpXG1hdGhiYntQfShYIFxsZXEgXGxhbWJkYSkgLSBcdGF1XG1hdGhiYntQfShYID4gXGxhbWJkYSkgPSAwLiQkCgpJbnRlZ3JhdGluZyB0aGlzIGVxdWF0aW9uLCB3ZSBnZXQgdGhlIG1pbmltaXphdGlvbiBwcm9ibGVtCiQkXG1pbl97XGxhbWJkYX0gXG1hdGhiYntFfSBccmhvX3tcdGF1fShYIC0gXGxhbWJkYSksJCQKd2hlcmUKJCRccmhvX3tcdGF1fShhKSA9ClxiZWdpbntjYXNlc30KYSBcdGF1ICYgXHRleHR7aWZ9IGEgPiAwIFxcCmEgKFx0YXUgLSAxKSAmIFx0ZXh0e2lmfSBhIFxsZXEgMC4KXGVuZHtjYXNlc30kJApXZSBjYWxsICRccmhvX3tcdGF1fShhKSQgdGhlICRcdGF1JC10aCBxdWFudGlsZSBsb3NzIGZ1bmN0aW9uLgoKYGBge3J9CnggPC0gc2VxKC01LDUsbGVuZ3RoLm91dCA9IDEwMDApCnF1YW50aWxlX2xvc3MgPC0gZnVuY3Rpb24oeCwgdGF1KSB7CiAgaW5kIDwtIDEqKHggPCAwKQogIHJldHVybiAoeCoodGF1IC0gaW5kKSkKfQpwbG90KHgsIHF1YW50aWxlX2xvc3MoeCwgMC4yKSwgdHlwZSA9ICJsIiwgbHR5ID0gMSwgY29sID0gMSwgeWxhYiA9ICJxdWFudGlsZSBsb3NzIikKbGluZXMoeCwgcXVhbnRpbGVfbG9zcyh4LCAwLjQpLCBsdHkgPSAyLCBjb2wgPSAyKQpsaW5lcyh4LCBxdWFudGlsZV9sb3NzKHgsIDAuNSksIGx0eSA9IDMsIGNvbCA9IDMsIGx3ZCA9IDUpCmxpbmVzKHgsIHF1YW50aWxlX2xvc3MoeCwgMC42KSwgbHR5ID0gNCwgY29sID0gNCkKbGluZXMoeCwgcXVhbnRpbGVfbG9zcyh4LCAwLjgpLCBsdHkgPSA1LCBjb2wgPSA1KQpsZWdlbmQoeCA9IDAsIHkgPSA0LCBsZWdlbmQgPSBjKGV4cHJlc3Npb24ocGFzdGUocmhvLCAiPSIsIDAuMikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24ocGFzdGUocmhvLCAiPSIsIDAuNCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24ocGFzdGUocmhvLCAiPSIsIDAuNSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24ocGFzdGUocmhvLCAiPSIsIDAuNikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24ocGFzdGUocmhvLCAiPSIsIDAuOCkpKSwKICAgICAgIGx0eSA9IGMoMSwyLDMsNCw1KSwgbHdkID0gYygxLDEsNSwxLDEpLCBjb2wgPSBjKDEsMiwzLDQsNSkpCmBgYAojIyBRdWFudGlsZSBtb2RlbApJbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgd2UgaGF2ZSBsZWFybmVkIGhvdyB0byBjYWxjdWxhdGUgcXVhbnRpbGVzIG9mIGEgc2FtcGxlIGJ5IG1pbmltaXppbmcgdGhlIGVtcGlyaWNhbCBxdWFudGlsZSByaXNrLiBTb21ldGltZXMgd2UgZG8gbm90IG9ubHkgY2FyZSBhYm91dCB0aGUgcXVhbnRpbGUgZm9yIHRoZSB3aG9sZSBkYXRhIHNldCwgYnV0IGFsc28gd2FudCB0byBrbm93IHRoZSBxdWFudGlsZXMgYXQgZWFjaCBsb2NhdGlvbi4gVGhlcmVmb3JlLCB3ZSBtb2RlbCB0aGUgJFx0YXUkLXRoIHF1YW50aWxlcyBhczoKJCRRKFx0YXV8WF9pKSA9IFhfaV5cdG9wIFxiZXRhKFx0YXUpLCQkCnRoYXQgaXMsIGF0IGRpZmZlcmVudCBsb2NhdGlvbiAkWF9pJCwgd2UgaGF2ZSBkaWZmZXJlbnQgcXVhbnRpbGUgZm9yIHRoZSByZXNwb25zZSAkWV9pJC4KWW91IGNhbiBjb21wYXJlIHRoaXMgbW9kZWwgd2l0aCB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwKJCRcbWF0aGJie0V9W1lfaXxYX2ldID0gWF9pXntcdG9wfSBcYmV0YSwkJAp3aGVyZSB3ZSBhc3N1bWUgdGhlIGNvbmRpdGlvbmFsIG1lYW4gaXMgYSBsaW5lYXIgZnVuY3Rpb24gb2YgbG9jYXRpb24gJFhfaSQuIFJlY2FsbCB0aGUgbGluZWFyIHJlZ3Jlc3Npb24KJCRcbWluX3tcYmV0YX0gXGZyYWN7MX17bn0gXHN1bV97aT0xfV5uIChZX2kgLSBYX2leXHRvcCBcYmV0YSleMi4kJCBTaW1pbGFybHksIHdlIGhhdmUgdGhlIHF1YW50aWxlIHJlZ3Jlc3Npb24KJCRcbWluX3tcYmV0YX0gXGZyYWN7MX17bn0gXHN1bV97aT0xfV5uIFxyaG9fe1x0YXV9KFlfaSAtIFhfaV5cdG9wIFxiZXRhKS4kJAoKIyMgUiBmdW5jdGlvbnMKIyMjIFNhbXBsZSBxdWFudGlsZXMKYGBge3J9CnggPC0gcm5vcm0oMTAwKQpxdWFudGlsZSh4LCBwcm9icyA9IHNlcSgwLjEsIDAuOSwgYnkgPSAwLjIpKQpgYGAKCiMjIyBRdWFudGlsZSByZWdyZXNzaW9uCmBgYHtyfQppbnN0YWxsLnBhY2thZ2VzKCJxdWFudHJlZyIpCmxpYnJhcnkocXVhbnRyZWcpCmBgYAoKYGBge3J9CnggPC0gc2VxKDIsMTAsbGVuZ3RoLm91dCA9IDEwMDApCnkgPC0geCArIHgqcm5vcm0oMTAwMCkKcGxvdCh4LCB5LCBwY2ggPSAiLiIsIHlsaW0gPSBjKC0yMCwgNDApKQoKIyBtZWRpYW4KZml0MSA8LSBycSh5IH4geCwgdGF1ID0gMC41KQphYmxpbmUoZml0MSwgY29sID0gMikKCiMgdHJ1ZSBtZWRpYW4KdHJ1ZTEgPC0geApsaW5lcyh4LCB0cnVlMSwgY29sID0gMiwgbHR5ID0gMykKCiMgMC4yIHF1YW50aWxlCmZpdDIgPC0gcnEoeSB+IHgsIHRhdSA9IDAuMikKYWJsaW5lKGZpdDIsIGNvbCA9IDMpCgojIHRydWUgMC4yIHF1YW50aWxlCnRydWUyIDwtIHFub3JtKHAgPSAwLjIsIG1lYW4gPSB4LCBzZCA9IHgpCmxpbmVzKHgsIHRydWUyLCBjb2wgPSAzLCBsdHkgPSAzKQoKIyAwLjcgcXVhbnRpbGUKZml0MyA8LSBycSh5IH4geCwgdGF1ID0gMC43KQphYmxpbmUoZml0MywgY29sID0gNCkKCiMgdHJ1ZSAwLjcgcXVhbnRpbGUKdHJ1ZTMgPC0gcW5vcm0ocCA9IDAuNywgbWVhbiA9IHgsIHNkID0geCkKbGluZXMoeCwgdHJ1ZTMsIGNvbCA9IDQsIGx0eSA9IDMpCgpsZWdlbmQoeCA9IDIsIHkgPSA0MCwgbGVnZW5kID0gYyhleHByZXNzaW9uKHBhc3RlKCJlc3RpbWF0ZWQiLCByaG8sICI9IiwgMC4yKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbihwYXN0ZSgiZXN0aW1hdGVkIiwgcmhvLCAiPSIsIDAuNSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24ocGFzdGUoImVzdGltYXRlZCIsIHJobywgIj0iLCAwLjcpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uKHBhc3RlKCJ0cnVlIiwgcmhvLCAiPSIsIDAuMikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24ocGFzdGUoInRydWUiLCByaG8sICI9IiwgMC41KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbihwYXN0ZSgidHJ1ZSIsIHJobywgIj0iLCAwLjcpKSksCiAgICAgICBsdHkgPSBjKDEsMSwxLDMsMywzKSwgY29sID0gYygzLDIsNCwzLDIsNCkpCmBgYAo=