Sample characteristics

Data collection began on 5/10 and ended on 5/22. A total of N = 454 subjects participated in the study. Sixty-nine subjects missed attention check questions and 8 subjects took longer than 60 minutes to complete the study (median completion time was under 25 minutes). In the final sample, N=297 subjects were fasting while taking they survey and 157 were not fasting.



Age


Country of birth (%)
%
United Kingdom 39.30
United States 11.65
Pakistan 9.21
Bangladesh 3.25


Current country of residence (%)
%
United Kingdom 52.57
United States 14.09
Canada 6.23
France 3.52


Nationality (%)
%
United Kingdom 45.80
United States 11.11
Pakistan 6.23
Canada 4.88


Sex
%
Male 225
Female 229


Education (%)
%
undergraduate 40.65
masters 17.62
some college 14.63
high school graduate 13.01


Living area (%)
%
Large city (population over 1 million) 42.82
Small city (population under 1 million) 37.13
Suburban 18.70
Rural 1.36



Social Dilemma

All subjects responded to the following task, designed to measure demand on common pools of varying size:


In this first task, you are randomly grouped with 4 other participants in this study. Your group is given some bonus points to share. You each privately request some of these points. You will not know how much the others are requesting and you cannot communicate with each other.

There are 500 points available.

We will add up the requests from all of you. If the total is less than the number of bonus points available, then you each receive the bonus points you requested. But if the sum of requests is more than the available points, none of you gets anything.

So larger requests could get you more bonus points, but you might also end up with nothing if everyone makes large requests. How many points do you request?",

The number of points were only fixed in the first round. In the follow up rounds, they pool size becasme increasingly uncertain but the mean stays the same ($500):

  • $425-$575
  • $350-$650
  • $275-$775
  • $200-$850
  • $125-$925


As expected, demanded amounts increase as uncertainty about the pool size increases. The six values obtained from each participant showed high reliability (\(\alpha\) = 0.96) and were averaged into one scores (M = 177.5, SD = 147.54).


Previous work shows tow mdoerators of the amount s demanded on tihs task:

  1. risk taking: risk takers demand larger amount on this task whereas risk-averse people demand smaller amounts. In owrds of Budescu, Rappaport & Sulaiman, 1990:

“When subjects were classified according to their attitude towards risk, we found a consistent pattern of overdemand by risk-seekers and more modest requests by risk-avoiders. This is an impressive result if one recalls that the classification in terms of risk was independent of the dilemma task.”

  1. social value orientation: people higher in social value orientation have been shown to demand


Risk taking

We used three items to measure risk-taking:

  1. Single item on financial risk taking (we used this in previous studies):

How much financial risk you are willing to take when you make a financial investment?

  1. Five items from Falk et al on risk taking in different domains of life (not at all (0) - very much (11)). These items were relliably correated (\(\alpha\) = 0.96) and combined into a single item (M = 4.52, SD = 1.75).
  1. Do you see yourself generally as a person who is fully prepared to take risks or do you try to avoid taking risks?
  2. When driving a car, are you a person who takes risks or do you try to avoid taking risks as a driver?
  3. In financial matters, are you a person who takes risks with money (for example, investing in speculative stocks)?
  4. How about in sports/leisure choices, are you a person who participates in risky sports and activities (for example skiing, skydiving, camping in the wilderness, etc.)?
  5. In your career and social life, are you a person who takes risks (for example, switching jobs mid-career, disagreeing with your boss, moving to a city far from your family, etc.)?
  6. Are you a person who takes risks with their safety and health (Walk alone at night in an unsafe part of town, not wear a seatbelt in a car or a helmet on a bike, etc.)?
  1. All subjects compeleted 25 round of the BART (Balloon Analogue Risk Task). The number of pumps in the rounds that they cashed in their points indicates their risk tolerance. Lower number mean the subject swas more risk-averse and on average chose to cash in their points earlier. Table below shows Spearman correlations of these three measures of risk.
single.item falk.avg
single.item
falk.avg 0.43****
pump.cashed -0.17*** -0.11*

The combined reliability of these three items is acceptable (\(\alpha\) = 0.75) and they are average into a single composite score ((M = 5.75, SD = 1.39).


Social Value Orientation (SVO)

SVO is a 9 item task where subjects indicate their preferred choice among three possible distributions. In each set of three chocies, one is prosocial, another is self-focused, and one competiative. In words of Mill & Theelen:

Within this construct, people can be categorized into prosocials (individuals who are concerned with their own and others’ welfare or solely others welfare) and proselfs (individuals who try to solely maximize their own welfare or maximize differences). In the past few decades, SVO has shown to be a valuable construct for understanding and predicting people’s decision-making in social dilemmas across different disciplines like psychology."

The instruction and the choices of the task are as follows:

So the next task is another point allocation task. You get to decide how to split some money between yourself and another person. This person will be randomly selected from other participants in this experiment.

Your shares will be converted to bonus points that determine your chances in a $50 raffle. So, every choice has value: the more points you receive, the better for you, and the more points the ‘Other’ receives, the better for him/her.

There are no right or wrong answers – choose the option that you, for whatever reason, prefer most. You’ll play 9 rounds. Press ‘Next’ to begin."

choice a b c
1 $480 for me, $80 for Other $540 for me, $280 for Other $480 for me, $480 for Other
2 $560 for me, $300 for Other $500 for me, $500 for Other $500 for me, $100 for Other
3 $520 for me, $520 for Other $520 for me, $120 for Other $580 for me, $320 for Other
4 $500 for me, $100 for Other $560 for me, $300 for Other $490 for me, $490 for Other
5 $560 for me, $300 for Other $500 for me, $500 for Other $490 for me, $90 for Other
6 $500 for me, $500 for Other $500 for me, $100 for Other $570 for me, $300 for Other
7 $510 for me, $510 for Other $560 for me, $300 for Other $510 for me, $110 for Other
8 $550 for me, $300 for Other $500 for me, $100 for Other $500 for me, $500 for Other
9 $480 for me, $100 for Other $490 for me, $490 for Other $540 for me, $300 for Other


In the table above, choices are categorized as follows:

  • prosocial choices: 1c 2b 3a 4c 5b 6a 7a 8c 9b
  • individualistic choices: 1b 2a 3c 4b 5a 6c 7b 8a 9c
  • competitive choices: 1a 2c 3b 4a 5c 6b 7c 8b 9a


People belong to categories that they score 5 or above on. Sometimes, the individiualistic and competitive items are added up to create a sproself category. The table below shows the distribution of responses in percentages. Becasue the sample is skedwed toward prosociality, I tried two way of coding: One simply based on numebr of prosocial choice people made (1-9), and another where I dichotmized 9 vs. <9 on prosocial choices.

count prosocial individualistic competitive
0 0.1497797 0.5660793 0.8325991
1 0.0330396 0.0770925 0.0440529
2 0.0418502 0.0859031 0.0352423
3 0.0242291 0.0484581 0.0132159
4 0.0286344 0.0418502 0.0110132
5 0.0352423 0.0264317 0.0176211
6 0.0286344 0.0198238 0.0022026
7 0.0572687 0.0242291 0.0110132
8 0.0704846 0.0308370 0.0110132
9 0.5308370 0.0792952 0.0220264

The table below shows the Spearman correlations between social dilemma demand, risk taking, and prosocial sovial value orientation. In sum, higher risk seeking is associated with increase demands on common pool, wheras higher social value oreinetation is associate with smaller dmands on the commond pools.

$500 $425-$575 $350-$650 $275-$775 $200-$850 $125-$925 svo.prosocial social.dilemma.avg
social.dilemma.1
social.dilemma.2 0.64****
social.dilemma.3 0.59**** 0.85****
social.dilemma.4 0.57**** 0.76**** 0.85****
social.dilemma.5 0.56**** 0.75**** 0.82**** 0.89****
social.dilemma.6 0.57**** 0.72**** 0.78**** 0.84**** 0.92****
svo.prosocial -0.10* -0.10* -0.12** -0.14** -0.17*** -0.17***
social.dilemma.avg 0.66**** 0.86**** 0.91**** 0.92**** 0.95**** 0.93**** -0.16***
risk.all 0.13** 0.17*** 0.19**** 0.14** 0.17*** 0.15** -0.03 0.18***


Models


I then tested the following models. First, a basic model looking at centered means.

\(\ Mean.Demanded.Amount.Social.Dilemma\) ~ \(\ svo.prosocial + risk.all\)

Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.001 0.052 0.013 0.990
scale(svo.prosocial) -0.155 0.052 -2.998 0.003
scale(risk.all) 0.117 0.052 2.253 0.025


Then I tested a model using dichotomized SVO and using the six dilemmas as repeated measures:

\(\ Demanded.Amount.Social.Dilemma\) ~ \(\ svo.prosocial.dichotmous * risk.all * dilemma.type\)

Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
dilemma.type 18708.70 3741.74 5 1784.027 0.598 0.702
risk.all 30765.67 30765.67 1 357.003 4.914 0.027
svo.prosocial.dic 39638.54 39638.54 1 357.016 6.331 0.012
dilemma.type:risk.all 54746.36 10949.27 5 1784.023 1.749 0.120
dilemma.type:svo.prosocial.dic 173337.00 34667.40 5 1784.036 5.537 0.000


Then I seperately looked at how fasting influences the extent to which demands on each common pool is related to SVO and risk:


\(\ Demanded.Amount.Social.Dilemma\) ~ \(\ svo.prosocial * dilemma.type * fasting\)

Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
fasting 9041.74 9041.740 1 355.000 1.450 0.229
dilemma.type 500288.14 100057.628 5 1779.020 16.043 0.000
svo.prosocial 32905.77 32905.767 1 355.005 5.276 0.022
risk.all 30898.35 30898.347 1 355.004 4.954 0.027
fasting:dilemma.type 40591.80 8118.361 5 1779.020 1.302 0.260
fasting:svo.prosocial 27092.79 27092.786 1 355.005 4.344 0.038
dilemma.type:svo.prosocial 198704.34 39740.868 5 1779.025 6.372 0.000
fasting:dilemma.type:svo.prosocial 63781.74 12756.348 5 1779.025 2.045 0.070


\(\ Demanded.Amount.Social.Dilemma\) ~ \(\ risk.all * dilemma.type * fasting\)

Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
fasting 448.534 448.534 1 355.002 0.071 0.791
dilemma.type 25807.199 5161.440 5 1779.023 0.812 0.541
risk.all 25627.343 25627.343 1 355.001 4.031 0.045
svo.prosocial 51018.700 51018.700 1 355.008 8.025 0.005
fasting:dilemma.type 22868.484 4573.697 5 1779.023 0.719 0.609
fasting:risk.all 1.652 1.652 1 355.001 0.000 0.987
dilemma.type:risk.all 54581.166 10916.233 5 1779.021 1.717 0.127
fasting:dilemma.type:risk.all 23485.380 4697.076 5 1779.021 0.739 0.594


In sum, svo and risk taking both predict demands on common pools. Fasting influence the relationship between svo and demands, but not the relationship between risk adn demand. The plot below demostrate the moderatin grole of fasting on the relationship between svo and demands:

Looking at post hoc contrasts with bonferroni correction, we find that fasters high in social value orientation to demnad significantly less amounts form the common po0ls thantthe fasters who are not always prosocial in the decisions:

contrast fasting estimate SE df t.ratio p.value
always - sometimes Yes -56.52223 18.81999 355.0023 -3.0033079 0.0028601
always - sometimes No 2.64118 26.82282 354.9805 0.0984677 0.9216165


Trust

We also measured trust using multiple sclaes and tasks:

  1. Yamagishi et al (strongly disagree (1) - strongly agree (7)):

Using the following scale, please indicate how much you agree or disagree with the following statements:

  1. Most people tell a lie when they can benefit by doing so.
  2. Those devoted to unselfish causes are often exploited by others.
  3. Some people do not cooperate because they pursue only their own short-term self-interest. Thus, things that can be done well if people cooperate often fail because of these people.
  4. Most people are basically honest (R).
  5. There will be more people who will not work if the social security system is developed further.
  1. Fehr et al (never (1) - always (5)):
  1. How often do you lend personal possessions to your friends (books, your car, bicycle etc.)?
  2. How often do you lend money to your friends?
  3. How often do you leave your door unlocked?
  1. Falk et al. (strongly disagree (1) - strongly agree (7)):

I assume that people have only the best intentions.

  1. Trust game ($0 - $1000):

In this task, we are giving you 1000 bonus points. They are yours to keep.

We are also giving you a choice: Give some or all of these points back, we multiply it by 3, and give it to another participant in this study. They can then decide to return some or all of the points back to you (They know we gave you 1000 points and you decided to send some points over to them).

It’s entirely up to them to return anything. But it’s entirely up to you to take this chance and send some bonus points over. You can keep all the points, give some, or all. What they return will be added to the points you decided to keep.

How much would you like to send?

Reliability of both Yamigishi General Trust scale (\(\alpha\) = 0.54) and Fehr’s three item scale (\(\alpha\) = 0.54) are both low. The first two items are correlated in the Fehr scale (\(\rho\) = 0.47), but not with the third item (\(\rho\)s = 0.16 - 0.19).

All items on the Yamagishi scale and the first two of Fehr items (\(\alpha\) = 0.65) were combined into single composite scores. Table below shows Spearman correlation between these and other measures of trust (Falk’s single item trust measure and the amounts sent on the trust game), as well as risk-taking, social value orientation (svo), and mean amounts demnanded on social dilemmas.

trust.game svo.prosocial trust.fehr.avg trust.yamagishi.avg trust.falk social.dilemma.avg
trust.game
svo.prosocial 0.22****
trust.fehr.avg 0.19**** 0.17***
trust.yamagishi.avg -0.12* 0.00 -0.01
trust.falk 0.20**** 0.12* 0.19**** -0.29****
social.dilemma.avg 0.05 -0.16*** 0.01 -0.01 0.04
risk.all 0.11* -0.03 0.23**** 0.07 -0.03 0.18***


Interestingly, none of the trust measures are related to responses on social dilemma questions. Some measures of trust are correlated with risk-taking and social value orientation.

I tested the model below to comapre fasters and non-fasters on the four indices of trust:

\(\ trust.score\) ~ \(\ trust.type * fasting\)

Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
trust.type 0.286 0.095 3 1353.304 0.097 0.962
fasting 0.347 0.347 1 451.932 0.353 0.553
trust.type:fasting 3.003 1.001 3 1353.304 1.017 0.384

Post hoc test with Bonferroni correction showed no significant difference between fasters and non-fasters on any of the trust items:

contrast trust.type estimate SE df t.ratio p.value
Yes - No trust.game 0.0487810 0.0986906 1801.550 0.4942823 0.6211671
Yes - No trust.fehr.avg 0.0315970 0.0986906 1801.550 0.3201623 0.7488825
Yes - No trust.yamagishi.avg -0.1001536 0.0988976 1801.573 -1.0126993 0.3113398
Yes - No trust.falk 0.1400259 0.0990715 1801.593 1.4133827 0.1577160


# fasting -(+)-> svo.prosocial -(-)-> social.dilemma <-(+)- risk:

                                                        # Estimate Std. Error t value Pr(>|t|)    
# fasting -(+)-> svo.prosocial:           #fastingNo       -0.837      0.388  -2.154  0.0319 *  
# svo.prosociality -(-)-> social.dilemma: #svo.prosocial   -7.060      2.156  -3.274  0.00116 ** 
# social.dilemma <-(+)- risk:             #risk.all        12.147      5.561   2.184  0.02959 * 

Fasting

summary(with(ramadan2020.time1[ramadan2020.time1$PROLIFIC_PID %in% checked.ID.1.5,], lm(scale(social.dilemma.avg)~fasting)))

Call:
lm(formula = scale(social.dilemma.avg) ~ fasting)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.1541 -0.6526 -0.4266  0.2999  3.3724 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.04211    0.06373  -0.661    0.509
fastingNo    0.12633    0.11039   1.144    0.253

Residual standard error: 0.9996 on 367 degrees of freedom
Multiple R-squared:  0.003556,  Adjusted R-squared:  0.0008411 
F-statistic:  1.31 on 1 and 367 DF,  p-value: 0.2532
summary(with(ramadan2020.time1[ramadan2020.time1$PROLIFIC_PID %in% checked.ID.1.5,], lm(scale(svo.prosocial)~fasting)))

Call:
lm(formula = scale(svo.prosocial) ~ fasting)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.8866 -0.7560  0.6572  0.6572  0.8939 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)  0.07890    0.06344   1.244   0.2145  
fastingNo   -0.23669    0.10989  -2.154   0.0319 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9951 on 367 degrees of freedom
Multiple R-squared:  0.01248,   Adjusted R-squared:  0.009793 
F-statistic: 4.639 on 1 and 367 DF,  p-value: 0.0319
summary(with(ramadan2020.time1[ramadan2020.time1$PROLIFIC_PID %in% checked.ID.1.5,], lm(scale(risk.all)~fasting)))

Call:
lm(formula = scale(risk.all) ~ fasting)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.0064 -0.6609 -0.1161  0.6879  2.8374 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  0.03374    0.06430   0.525     0.60
fastingNo   -0.10292    0.11231  -0.916     0.36

Residual standard error: 1 on 358 degrees of freedom
  (9 observations deleted due to missingness)
Multiple R-squared:  0.002341,  Adjusted R-squared:  -0.0004462 
F-statistic: 0.8399 on 1 and 358 DF,  p-value: 0.36


Last meal

summary(with(ramadan2020.time1[ramadan2020.time1$PROLIFIC_PID %in% checked.ID.1.5,], lm(scale(social.dilemma.avg)~fasting*as.numeric(food.reminder.time))))

Call:
lm(formula = scale(social.dilemma.avg) ~ fasting * as.numeric(food.reminder.time))

Residuals:
    Min      1Q  Median      3Q     Max 
-1.2315 -0.6493 -0.4007  0.2992  3.3309 

Coefficients:
                                         Estimate Std. Error t value Pr(>|t|)  
(Intercept)                               0.26986    0.18801   1.435   0.1521  
fastingNo                                -0.23491    0.24618  -0.954   0.3406  
as.numeric(food.reminder.time)           -0.05635    0.03195  -1.763   0.0787 .
fastingNo:as.numeric(food.reminder.time)  0.07904    0.06829   1.158   0.2478  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9979 on 365 degrees of freedom
Multiple R-squared:  0.01235,   Adjusted R-squared:  0.004235 
F-statistic: 1.522 on 3 and 365 DF,  p-value: 0.2085
summary(with(ramadan2020.time1[ramadan2020.time1$PROLIFIC_PID %in% checked.ID.1.5,], lm(scale(svo.prosocial)~fasting*as.numeric(food.reminder.time))))

Call:
lm(formula = scale(svo.prosocial) ~ fasting * as.numeric(food.reminder.time))

Residuals:
    Min      1Q  Median      3Q     Max 
-2.0280 -0.7826  0.5159  0.7454  0.9175 

Coefficients:
                                         Estimate Std. Error t value Pr(>|t|)  
(Intercept)                              -0.23873    0.18717  -1.275   0.2029  
fastingNo                                 0.09122    0.24507   0.372   0.7099  
as.numeric(food.reminder.time)            0.05737    0.03181   1.803   0.0721 .
fastingNo:as.numeric(food.reminder.time) -0.06211    0.06798  -0.914   0.3615  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9934 on 365 degrees of freedom
Multiple R-squared:  0.02122,   Adjusted R-squared:  0.01318 
F-statistic: 2.638 on 3 and 365 DF,  p-value: 0.04944
summary(with(ramadan2020.time1[ramadan2020.time1$PROLIFIC_PID %in% checked.ID.1.5,], lm(scale(risk.all)~fasting*as.numeric(food.reminder.time))))

Call:
lm(formula = scale(risk.all) ~ fasting * as.numeric(food.reminder.time))

Residuals:
     Min       1Q   Median       3Q      Max 
-2.14067 -0.68008 -0.09159  0.71920  2.90632 

Coefficients:
                                         Estimate Std. Error t value Pr(>|t|)  
(Intercept)                               0.38528    0.18849   2.044   0.0417 *
fastingNo                                -0.23788    0.24811  -0.959   0.3383  
as.numeric(food.reminder.time)           -0.06377    0.03217  -1.982   0.0482 *
fastingNo:as.numeric(food.reminder.time) -0.03805    0.07027  -0.541   0.5885  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9939 on 356 degrees of freedom
  (9 observations deleted due to missingness)
Multiple R-squared:  0.02046,   Adjusted R-squared:  0.01221 
F-statistic: 2.479 on 3 and 356 DF,  p-value: 0.06097

Perceived control

Reciprocity (Negative)

Reciprocity (Positive)

Altruism

Correlations

with(ramadan2020.time1[ramadan2020.time1$PROLIFIC_PID %in% checked.ID.1.5,], corstarsl(data.frame("fasting"=as.numeric(fasting), "soc.dil.avg"=social.dilemma.avg, risk.all, svo.prosocial, trust.falk, trust.fehr.avg, trust.game, hunger, "last.meal"=as.numeric(food.reminder.time),  "control"=control.self-control.outside, neg.recip.avg, pos.recip, altruism), "pearson"))
NA
LS0tCnRpdGxlOiAiUmFtYWRhbjIwMjAiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdGhlbWU6IHVuaXRlZAogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgICB0b2NfZGVwdGg6IDYgIAogICAgICAKLS0tClwKCiMjIyMgKipTYW1wbGUgY2hhcmFjdGVyaXN0aWNzKioKRGF0YSBjb2xsZWN0aW9uIGJlZ2FuIG9uIDUvMTAgYW5kIGVuZGVkIG9uIDUvMjIuIEEgdG90YWwgb2YgTiA9IDQ1NCBzdWJqZWN0cyBwYXJ0aWNpcGF0ZWQgaW4gdGhlIHN0dWR5LiBTaXh0eS1uaW5lIHN1YmplY3RzIG1pc3NlZCBhdHRlbnRpb24gY2hlY2sgcXVlc3Rpb25zIGFuZCA4IHN1YmplY3RzIHRvb2sgbG9uZ2VyIHRoYW4gNjAgbWludXRlcyB0byBjb21wbGV0ZSB0aGUgc3R1ZHkgKG1lZGlhbiBjb21wbGV0aW9uIHRpbWUgd2FzIHVuZGVyIDI1IG1pbnV0ZXMpLiBJbiB0aGUgZmluYWwgc2FtcGxlLCBOPTI5NyBzdWJqZWN0cyB3ZXJlIGZhc3Rpbmcgd2hpbGUgdGFraW5nIHRoZXkgc3VydmV5IGFuZCAxNTcgd2VyZSBub3QgZmFzdGluZy4gCgpcCgpgYGB7ciwgZWNobz1GfQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KHh0YWJsZSkKbGlicmFyeShyZXNoYXBlMikKbGlicmFyeShsc21lYW5zKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkobmxtZSkKbGlicmFyeShsbWVyVGVzdCkKbGlicmFyeShmb3JtYXRSKQoKYGBgClwKCiMjIyMjIEFnZSAKYGBge3IsIGVjaG89Rn0KcXBsb3QocmFtYWRhbjIwMjAudGltZTEkYWdlLngsIGdlb20gPSAiZGVuc2l0eSIpICsgdGhlbWVfbWluaW1hbCgpCmBgYApcCgojIyMjIyBDb3VudHJ5IG9mIGJpcnRoICAoJSkKYGBge3IsIGVjaG89RiwgdGlkeSA9IFRSVUV9CmthYmxlKHJvdW5kKDEwMCpwcm9wLnRhYmxlKHNvcnQodGFibGUocmFtYWRhbjIwMjAudGltZTEkQ291bnRyeS5vZi5CaXJ0aFtyYW1hZGFuMjAyMC50aW1lMSRQUk9MSUZJQ19QSUQgJWluJSBjaGVja2VkLklELjEuNV0pLCBkZWNyZWFzaW5nID0gVCkpWzE6NF0sIDIpLCBjb2wubmFtZXMgPSBjKCIiLCAiJSIpKQpgYGAKXAoKIyMjIyMgQ3VycmVudCBjb3VudHJ5IG9mIHJlc2lkZW5jZSAoJSkKYGBge3IsIGVjaG89RkFMU0V9CmthYmxlKHJvdW5kKDEwMCpwcm9wLnRhYmxlKHNvcnQodGFibGUocmFtYWRhbjIwMjAudGltZTEkQ3VycmVudC5Db3VudHJ5Lm9mLlJlc2lkZW5jZVtyYW1hZGFuMjAyMC50aW1lMSRQUk9MSUZJQ19QSUQgJWluJSBjaGVja2VkLklELjEuNV0pLCBkZWNyZWFzaW5nID0gVCkpWzE6NF0sIDIpLCBjb2wubmFtZXMgPSBjKCIiLCAiJSIpKQoKYGBgClwKCiMjIyMjIE5hdGlvbmFsaXR5ICglKQpgYGB7ciwgZWNobz1GQUxTRX0Ka2FibGUocm91bmQoMTAwKnByb3AudGFibGUoc29ydCh0YWJsZShyYW1hZGFuMjAyMC50aW1lMSROYXRpb25hbGl0eVtyYW1hZGFuMjAyMC50aW1lMSRQUk9MSUZJQ19QSUQgJWluJSBjaGVja2VkLklELjEuNV0pLCBkZWNyZWFzaW5nID0gVCkpWzE6NF0sIDIpLCBjb2wubmFtZXMgPSBjKCIiLCAiJSIpKQpgYGAKXAoKIyMjIyMgU2V4CmBgYHtyLCBlY2hvPUZBTFNFfQprYWJsZSh0YWJsZShyYW1hZGFuMjAyMC50aW1lMSRzZXgpLCBjb2wubmFtZXMgPSBjKCIiLCAiJSIpKQpgYGAKXAoKIyMjIyMgRWR1Y2F0aW9uICglKQpgYGB7ciwgZWNobz1GQUxTRX0Ka2FibGUocm91bmQoMTAwKnByb3AudGFibGUoc29ydCh0YWJsZShyYW1hZGFuMjAyMC50aW1lMSRlZHVjYXRpb25bcmFtYWRhbjIwMjAudGltZTEkUFJPTElGSUNfUElEICVpbiUgY2hlY2tlZC5JRC4xLjVdKSwgZGVjcmVhc2luZyA9IFQpKVsxOjRdLCAyKSwgY29sLm5hbWVzID0gYygiIiwgIiUiKSkKYGBgClwKCiMjIyMjIExpdmluZyBhcmVhICglKQpgYGB7ciwgZWNobz1GQUxTRX0Ka2FibGUocm91bmQoMTAwKnByb3AudGFibGUoc29ydCh0YWJsZShyYW1hZGFuMjAyMC50aW1lMSRsaXZpbmdbcmFtYWRhbjIwMjAudGltZTEkUFJPTElGSUNfUElEICVpbiUgY2hlY2tlZC5JRC4xLjVdKSwgZGVjcmVhc2luZyA9IFQpKSwgMiksIGNvbC5uYW1lcyA9IGMoIiIsICIlIikpCmBgYApcCgpcCgojIyMjICoqU29jaWFsIERpbGVtbWEqKgpBbGwgc3ViamVjdHMgcmVzcG9uZGVkIHRvIHRoZSBmb2xsb3dpbmcgdGFzaywgZGVzaWduZWQgdG8gbWVhc3VyZSBkZW1hbmQgb24gY29tbW9uIHBvb2xzIG9mIHZhcnlpbmcgc2l6ZToKClwKCj4gSW4gdGhpcyBmaXJzdCB0YXNrLCB5b3UgYXJlIHJhbmRvbWx5IGdyb3VwZWQgd2l0aCAqKjQqKiBvdGhlciBwYXJ0aWNpcGFudHMgaW4gdGhpcyBzdHVkeS4gWW91ciBncm91cCBpcyBnaXZlbiBzb21lIGJvbnVzIHBvaW50cyB0byBzaGFyZS4gWW91IGVhY2ggcHJpdmF0ZWx5IHJlcXVlc3Qgc29tZSBvZiB0aGVzZSBwb2ludHMuIFlvdSB3aWxsIG5vdCBrbm93IGhvdyBtdWNoIHRoZSBvdGhlcnMgYXJlIHJlcXVlc3RpbmcgYW5kIHlvdSBjYW5ub3QgY29tbXVuaWNhdGUgd2l0aCBlYWNoIG90aGVyLjxiciAvPjxiciAvPiBUaGVyZSBhcmUgKio1MDAgcG9pbnRzKiogYXZhaWxhYmxlLiA8YnIgLz48YnIgLz5XZSB3aWxsIGFkZCB1cCB0aGUgcmVxdWVzdHMgZnJvbSBhbGwgb2YgeW91LiBJZiB0aGUgdG90YWwgaXMgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgYm9udXMgcG9pbnRzIGF2YWlsYWJsZSwgdGhlbiB5b3UgZWFjaCByZWNlaXZlIHRoZSBib251cyBwb2ludHMgeW91IHJlcXVlc3RlZC4gQnV0IGlmIHRoZSBzdW0gb2YgcmVxdWVzdHMgaXMgbW9yZSB0aGFuIHRoZSBhdmFpbGFibGUgcG9pbnRzLCBub25lIG9mIHlvdSBnZXRzIGFueXRoaW5nLjxiciAvPjxiciAvPlNvIGxhcmdlciByZXF1ZXN0cyBjb3VsZCBnZXQgeW91IG1vcmUgYm9udXMgcG9pbnRzLCBidXQgeW91IG1pZ2h0IGFsc28gZW5kIHVwIHdpdGggbm90aGluZyBpZiBldmVyeW9uZSBtYWtlcyBsYXJnZSByZXF1ZXN0cy4gSG93IG1hbnkgcG9pbnRzIGRvIHlvdSByZXF1ZXN0PyIsCgoKVGhlIG51bWJlciBvZiBwb2ludHMgd2VyZSBvbmx5IGZpeGVkIGluIHRoZSBmaXJzdCByb3VuZC4gSW4gdGhlIGZvbGxvdyB1cCByb3VuZHMsIHRoZXkgcG9vbCBzaXplIGJlY2FzbWUgaW5jcmVhc2luZ2x5IHVuY2VydGFpbiAgYnV0IHRoZSBtZWFuIHN0YXlzIHRoZSBzYW1lICgkNTAwKTogCiAgCiAgLSAqKiQ0MjUtJDU3NSoqCiAgLSAqKiQzNTAtJDY1MCoqCiAgLSAqKiQyNzUtJDc3NSoqCiAgLSAqKiQyMDAtJDg1MCoqCiAgLSAqKiQxMjUtJDkyNSoqCgpgYGB7ciwgZWNobz1GLCBtZXNzYWdlPUZ9CmRlbGV0ZS5tZTwtbWVsdChyYW1hZGFuMjAyMC50aW1lMVtyYW1hZGFuMjAyMC50aW1lMSRQUk9MSUZJQ19QSUQgJWluJSBjaGVja2VkLklELjEuNSwgZ3JlcCgic29jaWFsLmRpbGVtbWEiLCBuYW1lcyhyYW1hZGFuMjAyMC50aW1lMSkpWzE6Nl1dLCB2YXJpYWJsZS5uYW1lID0gImRpbGVtbWEudHlwZSIpCgpkZWxldGUubWUkZGlsZW1tYS50eXBlPC1jKCIkNTAwIiwgIiQ0MjUtJDU3NSIsICIkMzUwLSQ2NTAiLCAiJDI3NS0kNzc1IiwgIiQyMDAtJDg1MCIsICIkMTI1LSQ5MjUiKQoKZ2dwbG90KGRlbGV0ZS5tZSwgYWVzKHNvcnQoZGlsZW1tYS50eXBlKSwgeSA9IHZhbHVlKSkgKyBnZW9tX2JveHBsb3QoKSArIHlsYWIoImFtb3VudCBkZW1hbmRlZCAoJCkiKSArIHRoZW1lX21pbmltYWwoKSArIHhsYWIoIlxuZGlsZW1tYSB0eXBlIikKCmBgYAoKXAoKQXMgZXhwZWN0ZWQsIGRlbWFuZGVkIGFtb3VudHMgaW5jcmVhc2UgYXMgdW5jZXJ0YWludHkgYWJvdXQgdGhlIHBvb2wgc2l6ZSBpbmNyZWFzZXMuIFRoZSBzaXggdmFsdWVzIG9idGFpbmVkIGZyb20gZWFjaCBwYXJ0aWNpcGFudCBzaG93ZWQgaGlnaCByZWxpYWJpbGl0eSAoJFxhbHBoYSQgPSAwLjk2KSBhbmQgd2VyZSBhdmVyYWdlZCBpbnRvIG9uZSBzY29yZXMgKE0gPSBgciByb3VuZChtZWFuKHJhbWFkYW4yMDIwLnRpbWUxJHNvY2lhbC5kaWxlbW1hLmF2Z1tyYW1hZGFuMjAyMC50aW1lMSRQUk9MSUZJQ19QSUQgJWluJSBjaGVja2VkLklELjEuNV0sIG5hLnJtPUYpLCAyKWAsIFNEID0gYHIgcm91bmQoc2QocmFtYWRhbjIwMjAudGltZTEkc29jaWFsLmRpbGVtbWEuYXZnW3JhbWFkYW4yMDIwLnRpbWUxJFBST0xJRklDX1BJRCAlaW4lIGNoZWNrZWQuSUQuMS41XSwgbmEucm09RiksMilgKS4KClwKClByZXZpb3VzIHdvcmsgc2hvd3MgdG93IG1kb2VyYXRvcnMgb2YgdGhlIGFtb3VudCBzIGRlbWFuZGVkIG9uIHRpaHMgdGFzazoKCiAgMS4gKipyaXNrIHRha2luZyoqOiByaXNrIHRha2VycyBkZW1hbmQgbGFyZ2VyIGFtb3VudCBvbiB0aGlzIHRhc2sgd2hlcmVhcyByaXNrLWF2ZXJzZSBwZW9wbGUgZGVtYW5kIHNtYWxsZXIgYW1vdW50cy4gSW4gb3dyZHMgb2YgQnVkZXNjdSwgUmFwcGFwb3J0ICYgU3VsYWltYW4sIDE5OTA6IAogIAo+IF8iV2hlbiBzdWJqZWN0cyB3ZXJlIGNsYXNzaWZpZWQgYWNjb3JkaW5nIHRvIHRoZWlyIGF0dGl0dWRlIHRvd2FyZHMgcmlzaywgd2UgZm91bmQgYSBjb25zaXN0ZW50IHBhdHRlcm4gb2Ygb3ZlcmRlbWFuZCBieSByaXNrLXNlZWtlcnMgYW5kIG1vcmUgbW9kZXN0IHJlcXVlc3RzIGJ5IHJpc2stYXZvaWRlcnMuIFRoaXMgaXMgYW4gaW1wcmVzc2l2ZSByZXN1bHQgaWYgb25lIHJlY2FsbHMgdGhhdCB0aGUgY2xhc3NpZmljYXRpb24gaW4gdGVybXMgb2YgcmlzayB3YXMgaW5kZXBlbmRlbnQgb2YgdGhlIGRpbGVtbWEgdGFzay4iXwoKICAyLiAqKnNvY2lhbCB2YWx1ZSBvcmllbnRhdGlvbioqOiBwZW9wbGUgaGlnaGVyIGluIHNvY2lhbCB2YWx1ZSBvcmllbnRhdGlvbiBoYXZlIGJlZW4gc2hvd24gdG8gZGVtYW5kIAogIApcCgojIyMjICoqUmlzayB0YWtpbmcqKgpXZSB1c2VkIHRocmVlIGl0ZW1zIHRvIG1lYXN1cmUgcmlzay10YWtpbmc6CgooMSkgU2luZ2xlIGl0ZW0gb24gZmluYW5jaWFsIHJpc2sgdGFraW5nICh3ZSB1c2VkIHRoaXMgaW4gcHJldmlvdXMgc3R1ZGllcyk6IAoKPiBIb3cgbXVjaCBmaW5hbmNpYWwgcmlzayB5b3UgYXJlIHdpbGxpbmcgdG8gdGFrZSB3aGVuIHlvdSBtYWtlIGEgZmluYW5jaWFsIGludmVzdG1lbnQ/CgooMikgRml2ZSBpdGVtcyBmcm9tIEZhbGsgZXQgYWwgb24gcmlzayB0YWtpbmcgaW4gZGlmZmVyZW50IGRvbWFpbnMgb2YgbGlmZSAoX25vdCBhdCBhbGxfICgwKSAtIF92ZXJ5IG11Y2hfICgxMSkpLiBUaGVzZSBpdGVtcyB3ZXJlIHJlbGxpYWJseSBjb3JyZWF0ZWQgKCRcYWxwaGEkID0gMC45NikgYW5kIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgaXRlbSAoTSA9IGByIHJvdW5kKG1lYW4ocmFtYWRhbjIwMjAudGltZTEkcmlzay5mYWxrLmF2Z1tyYW1hZGFuMjAyMC50aW1lMSRQUk9MSUZJQ19QSUQgJWluJSBjaGVja2VkLklELjEuNV0sIG5hLnJtPVQpLCAyKWAsIFNEID0gYHIgcm91bmQoc2QocmFtYWRhbjIwMjAudGltZTEkcmlzay5mYWxrLmF2Z1tyYW1hZGFuMjAyMC50aW1lMSRQUk9MSUZJQ19QSUQgJWluJSBjaGVja2VkLklELjEuNV0sIG5hLnJtPVQpLDIpYCkuCgo+IDEuIERvIHlvdSBzZWUgeW91cnNlbGYgZ2VuZXJhbGx5IGFzIGEgcGVyc29uIHdobyBpcyBmdWxseSBwcmVwYXJlZCB0byB0YWtlIHJpc2tzIG9yIGRvIHlvdSB0cnkgdG8gYXZvaWQgdGFraW5nIHJpc2tzPwo+IDIuIFdoZW4gZHJpdmluZyBhIGNhciwgYXJlIHlvdSBhIHBlcnNvbiB3aG8gdGFrZXMgcmlza3Mgb3IgZG8geW91IHRyeSB0byBhdm9pZCB0YWtpbmcgcmlza3MgYXMgYSBkcml2ZXI/Cj4gMy4gSW4gZmluYW5jaWFsIG1hdHRlcnMsIGFyZSB5b3UgYSBwZXJzb24gd2hvIHRha2VzIHJpc2tzIHdpdGggbW9uZXkgKGZvciBleGFtcGxlLCBpbnZlc3RpbmcgaW4gc3BlY3VsYXRpdmUgc3RvY2tzKT8KPiA0LiBIb3cgYWJvdXQgaW4gc3BvcnRzL2xlaXN1cmUgY2hvaWNlcywgYXJlIHlvdSBhIHBlcnNvbiB3aG8gcGFydGljaXBhdGVzIGluIHJpc2t5IHNwb3J0cyBhbmQgYWN0aXZpdGllcyAoZm9yIGV4YW1wbGUgc2tpaW5nLCBza3lkaXZpbmcsIGNhbXBpbmcgaW4gdGhlIHdpbGRlcm5lc3MsIGV0Yy4pPwo+IDUuIEluIHlvdXIgY2FyZWVyIGFuZCBzb2NpYWwgbGlmZSwgYXJlIHlvdSBhIHBlcnNvbiB3aG8gdGFrZXMgcmlza3MgKGZvciBleGFtcGxlLCBzd2l0Y2hpbmcgam9icyBtaWQtY2FyZWVyLCBkaXNhZ3JlZWluZyB3aXRoIHlvdXIgYm9zcywgbW92aW5nIHRvIGEgY2l0eSBmYXIgZnJvbSB5b3VyIGZhbWlseSwgZXRjLik/Cj4gNi4gQXJlIHlvdSBhIHBlcnNvbiB3aG8gdGFrZXMgcmlza3Mgd2l0aCB0aGVpciBzYWZldHkgYW5kIGhlYWx0aCAoV2FsayBhbG9uZSBhdCBuaWdodCBpbiBhbiB1bnNhZmUgcGFydCBvZiB0b3duLCBub3Qgd2VhciBhIHNlYXRiZWx0IGluIGEgY2FyIG9yIGEgaGVsbWV0IG9uIGEgYmlrZSwgZXRjLik/CgozLiBBbGwgc3ViamVjdHMgY29tcGVsZXRlZCAyNSByb3VuZCBvZiB0aGUgQkFSVCAoQmFsbG9vbiBBbmFsb2d1ZSBSaXNrIFRhc2spLiBUaGUgbnVtYmVyIG9mIHB1bXBzIGluIHRoZSByb3VuZHMgdGhhdCB0aGV5IGNhc2hlZCBpbiB0aGVpciBwb2ludHMgaW5kaWNhdGVzIHRoZWlyIHJpc2sgdG9sZXJhbmNlLiBMb3dlciBudW1iZXIgbWVhbiB0aGUgc3ViamVjdCBzd2FzIG1vcmUgcmlzay1hdmVyc2UgYW5kIG9uIGF2ZXJhZ2UgY2hvc2UgdG8gY2FzaCBpbiB0aGVpciBwb2ludHMgZWFybGllci4gVGFibGUgYmVsb3cgc2hvd3MgU3BlYXJtYW4gY29ycmVsYXRpb25zIG9mIHRoZXNlIHRocmVlIG1lYXN1cmVzIG9mIHJpc2suIApcCgpgYGB7ciwgcmVzdWx0cz0nYXNpcycsIGVjaG89Riwgd2FybmluZz1GQUxTRSwgY29tbWVudD1GfQprYWJsZShjb3JzdGFycyh3aXRoKHJhbWFkYW4yMDIwLnRpbWUxW3JhbWFkYW4yMDIwLnRpbWUxJFBST0xJRklDX1BJRCAlaW4lIHJhbWFkYW4yMDIwLnRpbWUxJFBST0xJRklDX1BJRCwgXSwgZGF0YS5mcmFtZSgic2luZ2xlLml0ZW0iPWFzLm51bWVyaWMocmlzay5xdWFsKSwgImZhbGsuYXZnIj1yaXNrLmZhbGsuYXZnLCAicHVtcC5jYXNoZWQiID0gYmFydC5jb3VudC5wdW1wKSksICJzcGVhcm1hbiIpKQpgYGAKCgpUaGUgY29tYmluZWQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgdGhyZWUgaXRlbXMgaXMgYWNjZXB0YWJsZSAoJFxhbHBoYSQgPSAwLjc1KSBhbmQgdGhleSBhcmUgYXZlcmFnZSBpbnRvIGEgc2luZ2xlIGNvbXBvc2l0ZSBzY29yZSAoKE0gPSBgciByb3VuZChtZWFuKHJhbWFkYW4yMDIwLnRpbWUxJHJpc2suYWxsW3JhbWFkYW4yMDIwLnRpbWUxJFBST0xJRklDX1BJRCAlaW4lIGNoZWNrZWQuSUQuMS41XSwgbmEucm09VCksIDIpYCwgU0QgPSBgciByb3VuZChzZChyYW1hZGFuMjAyMC50aW1lMSRyaXNrLmFsbFtyYW1hZGFuMjAyMC50aW1lMSRQUk9MSUZJQ19QSUQgJWluJSBjaGVja2VkLklELjEuNV0sIG5hLnJtPVQpLDIpYCkuCgoKXAoKCiMjIyMgKipTb2NpYWwgVmFsdWUgT3JpZW50YXRpb24gKFNWTykqKgpTVk8gaXMgYSA5IGl0ZW0gdGFzayB3aGVyZSBzdWJqZWN0cyBpbmRpY2F0ZSB0aGVpciBwcmVmZXJyZWQgY2hvaWNlIGFtb25nIHRocmVlIHBvc3NpYmxlIGRpc3RyaWJ1dGlvbnMuIEluIGVhY2ggc2V0IG9mIHRocmVlIGNob2NpZXMsIG9uZSBpcyBwcm9zb2NpYWwsIGFub3RoZXIgaXMgc2VsZi1mb2N1c2VkLCBhbmQgb25lIGNvbXBldGlhdGl2ZS4gSW4gd29yZHMgb2YgTWlsbCAmIFRoZWVsZW46IAoKPiBfV2l0aGluIHRoaXMgY29uc3RydWN0LCBwZW9wbGUgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gcHJvc29jaWFscyAoaW5kaXZpZHVhbHMgd2hvIGFyZSBjb25jZXJuZWQgd2l0aCB0aGVpciBvd24gYW5kIG90aGVyc+KAmSB3ZWxmYXJlIG9yIHNvbGVseSBvdGhlcnMgd2VsZmFyZSkgYW5kIHByb3NlbGZzIChpbmRpdmlkdWFscyB3aG8gdHJ5IHRvIHNvbGVseSBtYXhpbWl6ZSB0aGVpciBvd24gd2VsZmFyZSBvciBtYXhpbWl6ZSBkaWZmZXJlbmNlcykuIEluIHRoZSBwYXN0IGZldyBkZWNhZGVzLCBTVk8gaGFzIHNob3duIHRvIGJlIGEgdmFsdWFibGUgY29uc3RydWN0IGZvciB1bmRlcnN0YW5kaW5nIGFuZCBwcmVkaWN0aW5nIHBlb3BsZeKAmXMgZGVjaXNpb24tbWFraW5nIGluIHNvY2lhbCBkaWxlbW1hcyBhY3Jvc3MgZGlmZmVyZW50IGRpc2NpcGxpbmVzIGxpa2UgcHN5Y2hvbG9neS4iXwoKClRoZSBpbnN0cnVjdGlvbiBhbmQgdGhlIGNob2ljZXMgb2YgdGhlIHRhc2sgYXJlIGFzIGZvbGxvd3M6CgoKPiBTbyB0aGUgbmV4dCB0YXNrIGlzIGFub3RoZXIgcG9pbnQgYWxsb2NhdGlvbiB0YXNrLiBZb3UgZ2V0IHRvIGRlY2lkZSBob3cgdG8gc3BsaXQgc29tZSBtb25leSBiZXR3ZWVuIHlvdXJzZWxmIGFuZCBhbm90aGVyIHBlcnNvbi4gVGhpcyBwZXJzb24gd2lsbCBiZSByYW5kb21seSBzZWxlY3RlZCBmcm9tIG90aGVyIHBhcnRpY2lwYW50cyBpbiB0aGlzIGV4cGVyaW1lbnQuPGJyIC8+PGJyIC8+KipZb3VyIHNoYXJlcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBib251cyBwb2ludHMgdGhhdCBkZXRlcm1pbmUgeW91ciBjaGFuY2VzIGluIGEgJDUwIHJhZmZsZSoqLiBTbywgZXZlcnkgY2hvaWNlIGhhcyB2YWx1ZTogdGhlIG1vcmUgcG9pbnRzIHlvdSByZWNlaXZlLCB0aGUgYmV0dGVyIGZvciB5b3UsIGFuZCB0aGUgbW9yZSBwb2ludHMgdGhlICdPdGhlcicgcmVjZWl2ZXMsIHRoZSBiZXR0ZXIgZm9yIGhpbS9oZXIuPGJyIC8+PGJyIC8+VGhlcmUgYXJlIG5vIHJpZ2h0IG9yIHdyb25nIGFuc3dlcnMgLS0gY2hvb3NlIHRoZSBvcHRpb24gdGhhdCB5b3UsIGZvciB3aGF0ZXZlciByZWFzb24sIHByZWZlciBtb3N0LiBZb3UnbGwgcGxheSA5IHJvdW5kcy4gUHJlc3MgJ05leHQnIHRvIGJlZ2luLiIKCgp8Y2hvaWNlfGF8YnxjfAp8LS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwKfDF8XCQ0ODAgZm9yIG1lLCAkODAgZm9yIE90aGVyfFwkNTQwIGZvciBtZSwgXCQyODAgZm9yIE90aGVyfFwkNDgwIGZvciBtZSwgXCQ0ODAgZm9yIE90aGVyfAp8MnxcJDU2MCBmb3IgbWUsICQzMDAgZm9yIE90aGVyfFwkNTAwIGZvciBtZSwgXCQ1MDAgZm9yIE90aGVyfFwkNTAwIGZvciBtZSwgXCQxMDAgZm9yIE90aGVyfAp8M3xcJDUyMCBmb3IgbWUsICQ1MjAgZm9yIE90aGVyfFwkNTIwIGZvciBtZSwgXCQxMjAgZm9yIE90aGVyfFwkNTgwIGZvciBtZSwgXCQzMjAgZm9yIE90aGVyfAp8NHxcJDUwMCBmb3IgbWUsICQxMDAgZm9yIE90aGVyfFwkNTYwIGZvciBtZSwgXCQzMDAgZm9yIE90aGVyfFwkNDkwIGZvciBtZSwgXCQ0OTAgZm9yIE90aGVyfAp8NXxcJDU2MCBmb3IgbWUsICQzMDAgZm9yIE90aGVyfFwkNTAwIGZvciBtZSwgXCQ1MDAgZm9yIE90aGVyfFwkNDkwIGZvciBtZSwgXCQ5MCBmb3IgT3RoZXJ8Cnw2fFwkNTAwIGZvciBtZSwgJDUwMCBmb3IgT3RoZXJ8XCQ1MDAgZm9yIG1lLCBcJDEwMCBmb3IgT3RoZXJ8XCQ1NzAgZm9yIG1lLCBcJDMwMCBmb3IgT3RoZXJ8Cnw3fFwkNTEwIGZvciBtZSwgJDUxMCBmb3IgT3RoZXJ8XCQ1NjAgZm9yIG1lLCBcJDMwMCBmb3IgT3RoZXJ8XCQ1MTAgZm9yIG1lLCBcJDExMCBmb3IgT3RoZXJ8Cnw4fFwkNTUwIGZvciBtZSwgJDMwMCBmb3IgT3RoZXJ8XCQ1MDAgZm9yIG1lLCBcJDEwMCBmb3IgT3RoZXJ8XCQ1MDAgZm9yIG1lLCBcJDUwMCBmb3IgT3RoZXJ8Cnw5fFwkNDgwIGZvciBtZSwgJDEwMCBmb3IgT3RoZXJ8XCQ0OTAgZm9yIG1lLCBcJDQ5MCBmb3IgT3RoZXJ8XCQ1NDAgZm9yIG1lLCBcJDMwMCBmb3IgT3RoZXJ8CgpcCgpJbiB0aGUgdGFibGUgYWJvdmUsIGNob2ljZXMgYXJlIGNhdGVnb3JpemVkIGFzIGZvbGxvd3M6CgogLSAqKnByb3NvY2lhbCBjaG9pY2VzKio6ICAgICAgIDFjIDJiIDNhIDRjIDViIDZhIDdhIDhjIDliIAogLSAqKmluZGl2aWR1YWxpc3RpYyBjaG9pY2VzKio6IDFiIDJhIDNjIDRiIDVhIDZjIDdiIDhhIDljCiAtICoqY29tcGV0aXRpdmUgY2hvaWNlcyoqOiAgICAgMWEgMmMgM2IgNGEgNWMgNmIgN2MgOGIgOWEKClwKClBlb3BsZSBiZWxvbmcgdG8gY2F0ZWdvcmllcyB0aGF0IHRoZXkgc2NvcmUgNSBvciBhYm92ZSBvbi4gU29tZXRpbWVzLCB0aGUgaW5kaXZpZGl1YWxpc3RpYyBhbmQgY29tcGV0aXRpdmUgaXRlbXMgYXJlIGFkZGVkIHVwIHRvIGNyZWF0ZSBhIF9zcHJvc2VsZl8gY2F0ZWdvcnkuIFRoZSB0YWJsZSBiZWxvdyBzaG93cyB0aGUgZGlzdHJpYnV0aW9uIG9mIHJlc3BvbnNlcyBpbiBwZXJjZW50YWdlcy4gQmVjYXN1ZSB0aGUgc2FtcGxlIGlzIHNrZWR3ZWQgdG93YXJkIHByb3NvY2lhbGl0eSwgSSB0cmllZCB0d28gd2F5IG9mIGNvZGluZzogT25lIHNpbXBseSBiYXNlZCBvbiBudW1lYnIgb2YgcHJvc29jaWFsIGNob2ljZSBwZW9wbGUgbWFkZSAoMS05KSwgYW5kIGFub3RoZXIgd2hlcmUgSSBkaWNob3RtaXplZCA5IHZzLiA8OSBvbiBwcm9zb2NpYWwgY2hvaWNlcy4gCgpgYGB7ciwgZWNobz1GfQprYWJsZShjYmluZChkYXRhLmZyYW1lKHByb3AudGFibGUodGFibGUocmFtYWRhbjIwMjAudGltZTEkc3ZvLnByb3NvY2lhbCkpKSwgZGF0YS5mcmFtZShwcm9wLnRhYmxlKHRhYmxlKHJhbWFkYW4yMDIwLnRpbWUxJHN2by5pbmRpdmlkdWFsaXN0aWMpKSksIGRhdGEuZnJhbWUocHJvcC50YWJsZSh0YWJsZShyYW1hZGFuMjAyMC50aW1lMSRzdm8uY29tcGV0aXRpdmUpKSkpWy1jKDUsMyldLCBjb2wubmFtZXMgPSBjKCJjb3VudCIsICJwcm9zb2NpYWwiLCAiaW5kaXZpZHVhbGlzdGljIiwgImNvbXBldGl0aXZlIikpCmBgYAoKClRoZSB0YWJsZSBiZWxvdyBzaG93cyB0aGUgU3BlYXJtYW4gY29ycmVsYXRpb25zIGJldHdlZW4gc29jaWFsIGRpbGVtbWEgZGVtYW5kLCByaXNrIHRha2luZywgYW5kIHByb3NvY2lhbCBzb3ZpYWwgdmFsdWUgb3JpZW50YXRpb24uIEluIHN1bSwgaGlnaGVyIHJpc2sgc2Vla2luZyBpcyBhc3NvY2lhdGVkIHdpdGggaW5jcmVhc2UgZGVtYW5kcyBvbiBjb21tb24gcG9vbCwgd2hlcmFzIGhpZ2hlciBzb2NpYWwgdmFsdWUgb3JlaW5ldGF0aW9uIGlzIGFzc29jaWF0ZSB3aXRoIHNtYWxsZXIgZG1hbmRzIG9uIHRoZSBjb21tb25kIHBvb2xzLiAKCmBgYHtyLCByZXN1bHRzPSdhc2lzJywgZWNobz1GfQprYWJsZShjb3JzdGFycyhyYW1hZGFuMjAyMC50aW1lMVtyYW1hZGFuMjAyMC50aW1lMSRQUk9MSUZJQ19QSUQgJWluJSByYW1hZGFuMjAyMC50aW1lMSRQUk9MSUZJQ19QSUQsIG5hbWVzKHJhbWFkYW4yMDIwLnRpbWUxKSAlaW4lIGMoInJpc2suYWxsIiwgInNvY2lhbC5kaWxlbW1hLmF2ZyIsICJzdm8ucHJvc29jaWFsIiwgcGFzdGUwKCJzb2NpYWwuZGlsZW1tYS4iLCAxOjYpKV0sICJzcGVhcm1hbiIpLCBjb2wubmFtZXMgPSBjKCIkNTAwIiwgIiQ0MjUtJDU3NSIsICIkMzUwLSQ2NTAiLCAiJDI3NS0kNzc1IiwgIiQyMDAtJDg1MCIsICIkMTI1LSQ5MjUiLCAic3ZvLnByb3NvY2lhbCIsICJzb2NpYWwuZGlsZW1tYS5hdmciKSkKYGBgCgpcCgojIyMjICoqTW9kZWxzKioKXAoKSSB0aGVuIHRlc3RlZCB0aGUgZm9sbG93aW5nIG1vZGVscy4gRmlyc3QsIGEgYmFzaWMgbW9kZWwgbG9va2luZyBhdCBjZW50ZXJlZCBtZWFucy4KXAoKJFwgTWVhbi5EZW1hbmRlZC5BbW91bnQuU29jaWFsLkRpbGVtbWEkIH4gJFwgc3ZvLnByb3NvY2lhbCArIHJpc2suYWxsJFwKCmBgYHtyLCBlY2hvPUZ9CmthYmxlKHN1bW1hcnkod2l0aChkYXRhID0gcmFtYWRhbjIwMjAudGltZTFbcmFtYWRhbjIwMjAudGltZTEkUFJPTElGSUNfUElEICVpbiUgY2hlY2tlZC5JRC4xLjUsXSwgbG0oc2NhbGUoc29jaWFsLmRpbGVtbWEuYXZnKSB+IHNjYWxlKHN2by5wcm9zb2NpYWwpICsgc2NhbGUocmlzay5hbGwpKSkpJGNvZWZmaWNpZW50cywgZGlnaXRzID0gMykKYGBgCgpcCgpUaGVuIEkgdGVzdGVkIGEgbW9kZWwgdXNpbmcgZGljaG90b21pemVkIFNWTyBhbmQgdXNpbmcgdGhlIHNpeCBkaWxlbW1hcyBhcyByZXBlYXRlZCBtZWFzdXJlczoKXAoKJFwgRGVtYW5kZWQuQW1vdW50LlNvY2lhbC5EaWxlbW1hJCB+ICRcIHN2by5wcm9zb2NpYWwuZGljaG90bW91cyAqIHJpc2suYWxsICogZGlsZW1tYS50eXBlJFwKCmBgYHtyLCBlY2hvPUYsIHdhcm5pbmc9Rn0Ka2FibGUoYW5vdmEod2l0aChtZWx0KHJhbWFkYW4yMDIwLnRpbWUxW3JhbWFkYW4yMDIwLnRpbWUxJFBST0xJRklDX1BJRCAlaW4lIGNoZWNrZWQuSUQuMS41LCB3aGljaChuYW1lcyhyYW1hZGFuMjAyMC50aW1lMSkgJWluJSBjKCJQUk9MSUZJQ19QSUQiLCJmYXN0aW5nIiwic3ZvLnByb3NvY2lhbC5kaWMiLCAicmlzay5hbGwiLCBwYXN0ZTAoInNvY2lhbC5kaWxlbW1hLiIsIDE6NikpKV0sIHZhcmlhYmxlLm5hbWUgPSAiZGlsZW1tYS50eXBlIiwgaWQudmFycyA9IGMoIlBST0xJRklDX1BJRCIsICJyaXNrLmFsbCIsICJzdm8ucHJvc29jaWFsLmRpYyIpKSwgbG1lcihhcy5udW1lcmljKHZhbHVlKX5kaWxlbW1hLnR5cGUqcmlzay5hbGwgKyBkaWxlbW1hLnR5cGUqc3ZvLnByb3NvY2lhbC5kaWMgKyAoMXxQUk9MSUZJQ19QSUQpKSkpLCBkaWdpdHMgPSAzKQpgYGAKClwKClRoZW4gSSBzZXBlcmF0ZWx5IGxvb2tlZCBhdCBob3cgZmFzdGluZyBpbmZsdWVuY2VzIHRoZSBleHRlbnQgdG8gd2hpY2ggZGVtYW5kcyBvbiBlYWNoIGNvbW1vbiBwb29sIGlzIHJlbGF0ZWQgdG8gU1ZPIGFuZCByaXNrOgoKXAoKJFwgRGVtYW5kZWQuQW1vdW50LlNvY2lhbC5EaWxlbW1hJCB+ICRcIHN2by5wcm9zb2NpYWwgKiBkaWxlbW1hLnR5cGUgKiBmYXN0aW5nJFwKCgpgYGB7ciwgdGlkeT1ULCBlY2hvPUZ9CmthYmxlKGFub3ZhKHdpdGgobWVsdChyYW1hZGFuMjAyMC50aW1lMVtyYW1hZGFuMjAyMC50aW1lMSRQUk9MSUZJQ19QSUQgJWluJSBjaGVja2VkLklELjEuNSwgd2hpY2gobmFtZXMocmFtYWRhbjIwMjAudGltZTEpICVpbiUgYygiUFJPTElGSUNfUElEIiwiZmFzdGluZyIsInN2by5wcm9zb2NpYWwiLCAicmlzay5hbGwiLCJmYXN0aW5nIiwgcGFzdGUwKCJzb2NpYWwuZGlsZW1tYS4iLCAxOjYpKSldLCB2YXJpYWJsZS5uYW1lID0gImRpbGVtbWEudHlwZSIsIGlkLnZhcnMgPSBjKCJQUk9MSUZJQ19QSUQiLCAicmlzay5hbGwiLCAic3ZvLnByb3NvY2lhbCIsICJmYXN0aW5nIikpLCBsbWVyKGFzLm51bWVyaWModmFsdWUpfmZhc3RpbmcqZGlsZW1tYS50eXBlKnN2by5wcm9zb2NpYWwgKyByaXNrLmFsbCArICgxfFBST0xJRklDX1BJRCkpKSksIGRpZ2l0cyA9IDMpCmBgYAoKXAoKJFwgRGVtYW5kZWQuQW1vdW50LlNvY2lhbC5EaWxlbW1hJCB+ICRcIHJpc2suYWxsICogZGlsZW1tYS50eXBlICogZmFzdGluZyRcCgoKYGBge3IsIGVjaG89Rn0Ka2FibGUoYW5vdmEod2l0aChtZWx0KHJhbWFkYW4yMDIwLnRpbWUxW3JhbWFkYW4yMDIwLnRpbWUxJFBST0xJRklDX1BJRCAlaW4lIGNoZWNrZWQuSUQuMS41LCB3aGljaChuYW1lcyhyYW1hZGFuMjAyMC50aW1lMSkgJWluJSBjKCJQUk9MSUZJQ19QSUQiLCJmYXN0aW5nIiwic3ZvLnByb3NvY2lhbCIsICJyaXNrLmFsbCIsImZhc3RpbmciLCBwYXN0ZTAoInNvY2lhbC5kaWxlbW1hLiIsIDE6NikpKV0sIHZhcmlhYmxlLm5hbWUgPSAiZGlsZW1tYS50eXBlIiwgaWQudmFycyA9IGMoIlBST0xJRklDX1BJRCIsICJyaXNrLmFsbCIsICJzdm8ucHJvc29jaWFsIiwgImZhc3RpbmciKSksIGxtZXIoYXMubnVtZXJpYyh2YWx1ZSl+ZmFzdGluZypkaWxlbW1hLnR5cGUqcmlzay5hbGwgKyBzdm8ucHJvc29jaWFsICsgKDF8UFJPTElGSUNfUElEKSkpKSwgZGlnaXRzID0gMykKYGBgCgpcCgpJbiBzdW0sIHN2byBhbmQgcmlzayB0YWtpbmcgYm90aCBwcmVkaWN0IGRlbWFuZHMgb24gY29tbW9uIHBvb2xzLiBGYXN0aW5nIGluZmx1ZW5jZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc3ZvIGFuZCBkZW1hbmRzLCBidXQgbm90IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiByaXNrIGFkbiBkZW1hbmQuIFRoZSBwbG90IGJlbG93IGRlbW9zdHJhdGUgdGhlIG1vZGVyYXRpbiBncm9sZSBvZiBmYXN0aW5nIG9uIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzdm8gYW5kIGRlbWFuZHM6CgpgYGB7ciwgZWNobz1GLCBtZXNzYWdlPUYsIGNvbW1lbnQ9Rn0Kc29jaWFsLmRpbGVtbWEuc3ZvLmRpYy5mYXN0aW5nLm1vZGVsPC0od2l0aChtZWx0KHJhbWFkYW4yMDIwLnRpbWUxW3JhbWFkYW4yMDIwLnRpbWUxJFBST0xJRklDX1BJRCAlaW4lIGNoZWNrZWQuSUQuMS41LCB3aGljaChuYW1lcyhyYW1hZGFuMjAyMC50aW1lMSkgJWluJSBjKCJQUk9MSUZJQ19QSUQiLCJmYXN0aW5nIiwic3ZvLnByb3NvY2lhbC5kaWMiLCAicmlzay5hbGwiLCJmYXN0aW5nIiwgcGFzdGUwKCJzb2NpYWwuZGlsZW1tYS4iLCAxOjYpKSldLCB2YXJpYWJsZS5uYW1lID0gImRpbGVtbWEudHlwZSIsIGlkLnZhcnMgPSBjKCJQUk9MSUZJQ19QSUQiLCAicmlzay5hbGwiLCAic3ZvLnByb3NvY2lhbC5kaWMiLCAiZmFzdGluZyIpKSwgbG1lcihhcy5udW1lcmljKHZhbHVlKX5mYXN0aW5nKmRpbGVtbWEudHlwZSpzdm8ucHJvc29jaWFsLmRpYyArIHJpc2suYWxsICsgKDF8UFJPTElGSUNfUElEKSkpKSAKCnNvY2lhbC5kaWxlbW1hLnN2by5kaWMuZmFzdGluZy5tb2RlbC5scy5kZjwtZGF0YS5mcmFtZShsc21lYW5zKHNvY2lhbC5kaWxlbW1hLnN2by5kaWMuZmFzdGluZy5tb2RlbCwgcGFpcndpc2V+ZGlsZW1tYS50eXBlfGZhc3Rpbmd8c3ZvLnByb3NvY2lhbC5kaWMsIGFkanVzdD0iYm9uZmVycm9uaSIpJGxzbWVhbikKCmxldmVscyhzb2NpYWwuZGlsZW1tYS5zdm8uZGljLmZhc3RpbmcubW9kZWwubHMuZGYkZGlsZW1tYS50eXBlKTwtYygiJDUwMCIsICIkNDI1LSQ1NzUiLCAiJDM1MC0kNjUwIiwgIiQyNzUtJDc3NSIsICIkMjAwLSQ4NTAiLCAiJDEyNS0kOTI1IikKbGV2ZWxzKHNvY2lhbC5kaWxlbW1hLnN2by5kaWMuZmFzdGluZy5tb2RlbC5scy5kZiRmYXN0aW5nKTwtYygiZmFzdGluZyIsICJub3QgZmFzdGluZyIpCmBgYAoKCmBgYHtyLCBlY2hvPUYsIHdhcm5pbmc9RiwgbWVzc2FnZT1GfQpnZ3Bsb3Qoc29jaWFsLmRpbGVtbWEuc3ZvLmRpYy5mYXN0aW5nLm1vZGVsLmxzLmRmLCBhZXMoZGlsZW1tYS50eXBlLCBsc21lYW4sIGNvbD1zdm8ucHJvc29jaWFsLmRpYykpICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1sc21lYW4tU0UsIHltYXg9bHNtZWFuK1NFKSwgd2lkdGg9MC4zLCBwb3NpdGlvbiA9ICJkb2RnZTIiKSArIGZhY2V0X2dyaWQoLn5mYXN0aW5nKSArIHhsYWIobGFiZWwgPSAicG9vbCBzaXplIikgKyB5bGFiKCJhbW91bnQgZGVtYW5kZWQiKSArIHRoZW1lX21pbmltYWwoKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIGNvbG9yID0gIiM5OTMzMzMiLCBzaXplID0gMTIsIGFuZ2xlID0gNDUpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBjb2xvciA9ICJibHVlIiwgc2l6ZSA9IDEyLCBhbmdsZSA9IDQ1KSkKYGBgCgpMb29raW5nIGF0IHBvc3QgaG9jIGNvbnRyYXN0cyB3aXRoIGJvbmZlcnJvbmkgY29ycmVjdGlvbiwgd2UgZmluZCB0aGF0IGZhc3RlcnMgaGlnaCBpbiBzb2NpYWwgdmFsdWUgb3JpZW50YXRpb24gdG8gZGVtbmFkIHNpZ25pZmljYW50bHkgbGVzcyBhbW91bnRzIGZvcm0gdGhlIGNvbW1vbiBwbzBscyB0aGFudHRoZSBmYXN0ZXJzIHdobyBhcmUgbm90IGFsd2F5cyBwcm9zb2NpYWwgaW4gdGhlIGRlY2lzaW9uczoKCmBgYHtyLCB3YXJuaW5nPUYsIG1lc3NhZ2U9RiwgZWNobz1GfQprYWJsZShsc21lYW5zKHNvY2lhbC5kaWxlbW1hLnN2by5kaWMuZmFzdGluZy5tb2RlbCxwYWlyd2lzZX5zdm8ucHJvc29jaWFsLmRpY3xmYXN0aW5nLCBhZGp1c3Q9ImJvbmZlcnJvbmkiKSRjb250cmFzdHMpCmBgYAoKXAoKIyMjIyAqKlRydXN0KioKV2UgYWxzbyBtZWFzdXJlZCB0cnVzdCB1c2luZyBtdWx0aXBsZSBzY2xhZXMgYW5kIHRhc2tzOgoKICAoMSkgWWFtYWdpc2hpIGV0IGFsIChfc3Ryb25nbHkgZGlzYWdyZWVfICgxKSAtIF9zdHJvbmdseSBhZ3JlZV8gKDcpKTogCiAgCj4gVXNpbmcgdGhlIGZvbGxvd2luZyBzY2FsZSwgcGxlYXNlIGluZGljYXRlIGhvdyBtdWNoIHlvdSBhZ3JlZSBvciBkaXNhZ3JlZSB3aXRoIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50czoKCj4gMS4gTW9zdCBwZW9wbGUgdGVsbCBhIGxpZSB3aGVuIHRoZXkgY2FuIGJlbmVmaXQgYnkgZG9pbmcgc28uICAKPiAyLiBUaG9zZSBkZXZvdGVkIHRvIHVuc2VsZmlzaCBjYXVzZXMgYXJlIG9mdGVuIGV4cGxvaXRlZCBieSBvdGhlcnMuICAKPiAzLiBTb21lIHBlb3BsZSBkbyBub3QgY29vcGVyYXRlIGJlY2F1c2UgdGhleSBwdXJzdWUgb25seSB0aGVpciBvd24gc2hvcnQtdGVybSBzZWxmLWludGVyZXN0LiBUaHVzLCB0aGluZ3MgdGhhdCBjYW4gYmUgZG9uZSB3ZWxsIGlmIHBlb3BsZSBjb29wZXJhdGUgb2Z0ZW4gZmFpbCBiZWNhdXNlIG9mIHRoZXNlIHBlb3BsZS4gIAo+IDQuIE1vc3QgcGVvcGxlIGFyZSBiYXNpY2FsbHkgaG9uZXN0IChSKS4gIAo+IDUuIFRoZXJlIHdpbGwgYmUgbW9yZSBwZW9wbGUgd2hvIHdpbGwgbm90IHdvcmsgaWYgdGhlIHNvY2lhbCBzZWN1cml0eSBzeXN0ZW0gaXMgZGV2ZWxvcGVkIGZ1cnRoZXIuICAKCiAgKDIpIEZlaHIgZXQgYWwgKF9uZXZlcl8gKDEpIC0gX2Fsd2F5c18gKDUpKToKICAKPiAxLiBIb3cgb2Z0ZW4gZG8geW91IGxlbmQgcGVyc29uYWwgcG9zc2Vzc2lvbnMgdG8geW91ciBmcmllbmRzIChib29rcywgeW91ciBjYXIsIGJpY3ljbGUgZXRjLik/Cj4gMi4gSG93IG9mdGVuIGRvIHlvdSBsZW5kIG1vbmV5IHRvIHlvdXIgZnJpZW5kcz8KPiAzLiBIb3cgb2Z0ZW4gZG8geW91IGxlYXZlIHlvdXIgZG9vciB1bmxvY2tlZD8KCiAgCiAgKDMpIEZhbGsgZXQgYWwuIChfc3Ryb25nbHkgZGlzYWdyZWVfICgxKSAtIF9zdHJvbmdseSBhZ3JlZV8gKDcpKTogCiAgCiAgPkkgYXNzdW1lIHRoYXQgcGVvcGxlIGhhdmUgb25seSB0aGUgYmVzdCBpbnRlbnRpb25zLgoKICAKICAoNCkgVHJ1c3QgZ2FtZSAoXCQwIC0gXCQxMDAwKToKICAKPiBJbiB0aGlzIHRhc2ssIHdlIGFyZSBnaXZpbmcgeW91IDEwMDAgYm9udXMgcG9pbnRzLiBUaGV5IGFyZSB5b3VycyB0byBrZWVwLjxiciAvPjxiciAvPldlIGFyZSBhbHNvIGdpdmluZyB5b3UgYSBjaG9pY2U6IEdpdmUgc29tZSBvciBhbGwgb2YgdGhlc2UgcG9pbnRzIGJhY2ssIHdlIG11bHRpcGx5IGl0IGJ5ICoqMyoqLCBhbmQgZ2l2ZSBpdCB0byBhbm90aGVyIHBhcnRpY2lwYW50IGluIHRoaXMgc3R1ZHkuIFRoZXkgY2FuIHRoZW4gZGVjaWRlIHRvIHJldHVybiBzb21lIG9yIGFsbCBvZiB0aGUgcG9pbnRzIGJhY2sgdG8geW91IChUaGV5IGtub3cgd2UgZ2F2ZSB5b3UgMTAwMCBwb2ludHMgYW5kIHlvdSBkZWNpZGVkIHRvIHNlbmQgc29tZSBwb2ludHMgb3ZlciB0byB0aGVtKS48YnIgLz48YnIgLz5JdCdzIGVudGlyZWx5IHVwIHRvIHRoZW0gdG8gcmV0dXJuIGFueXRoaW5nLiBCdXQgaXQncyBlbnRpcmVseSB1cCB0byB5b3UgdG8gdGFrZSB0aGlzIGNoYW5jZSBhbmQgc2VuZCBzb21lIGJvbnVzIHBvaW50cyBvdmVyLiBZb3UgY2FuIGtlZXAgYWxsIHRoZSBwb2ludHMsIGdpdmUgc29tZSwgb3IgYWxsLiBXaGF0IHRoZXkgcmV0dXJuIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHBvaW50cyB5b3UgZGVjaWRlZCB0byBrZWVwLjxiciAvPjxiciAvPkhvdyBtdWNoIHdvdWxkIHlvdSBsaWtlIHRvIHNlbmQ/CgogIApSZWxpYWJpbGl0eSBvZiBib3RoIFlhbWlnaXNoaSBHZW5lcmFsIFRydXN0IHNjYWxlICgkXGFscGhhJCA9IDAuNTQpIGFuZCBGZWhyJ3MgdGhyZWUgaXRlbSBzY2FsZSAoJFxhbHBoYSQgPSAwLjU0KSBhcmUgYm90aCBsb3cuIFRoZSBmaXJzdCB0d28gaXRlbXMgYXJlIGNvcnJlbGF0ZWQgaW4gdGhlIEZlaHIgc2NhbGUgKCRccmhvJCA9IDAuNDcpLCBidXQgbm90IHdpdGggdGhlIHRoaXJkIGl0ZW0gKCRccmhvJHMgPSAwLjE2IC0gMC4xOSkuCgpgYGB7ciwgaW5jbHVkZT1GLCB0aWR5PVQsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNvbW1lbnQ9Rn0KcHN5Y2g6OmFscGhhKHQoZGF0YS5mcmFtZShyYW1hZGFuMjAyMC50aW1lMSR0cnVzdC5mZWhyKSkpICNsb3cgYWxwaGEgKDAuNTQpCnJhbWFkYW4yMDIwLnRpbWUxJHRydXN0LmZlaHIuYXZnPC1zY2FsZShyb3dNZWFucyh0KGRhdGEuZnJhbWUocmFtYWRhbjIwMjAudGltZTEkdHJ1c3QuZmVocikpWywxOjJdKSkgIyBkcm9wIGl0ZW0gMyBsb3cgYWxwaGEgKDAuNTQpCgpwc3ljaDo6YWxwaGEodChkYXRhLmZyYW1lKHJhbWFkYW4yMDIwLnRpbWUxJHRydXN0KSlbLC02XSwgY2hlY2sua2V5cyA9IFQpCnJhbWFkYW4yMDIwLnRpbWUxJHRydXN0LnlhbWFnaXNoaS5hdmc8LXNjYWxlKHJvd01lYW5zKHJldmVyc2UuY29kZSh0KGRhdGEuZnJhbWUocmFtYWRhbjIwMjAudGltZTEkdHJ1c3QpKVssLTZdLCBrZXlzID0gYWxwaGEodChkYXRhLmZyYW1lKHJhbWFkYW4yMDIwLnRpbWUxJHRydXN0KSlbLC02XSwgY2hlY2sua2V5cyA9IFQpJGtleXMpKSkgI2xvdyBhbHBoYSAoMC41NCkKCnJhbWFkYW4yMDIwLnRpbWUxJHRydXN0LmZhbGs8LXNjYWxlKHQoZGF0YS5mcmFtZShyYW1hZGFuMjAyMC50aW1lMSR0cnVzdCkpWyw2XSkKcmFtYWRhbjIwMjAudGltZTEkdHJ1c3QuZ2FtZTwtc2NhbGUocmFtYWRhbjIwMjAudGltZTEkdHJ1c3QuZ2FtZSkKCmBgYAoKCkFsbCBpdGVtcyBvbiB0aGUgWWFtYWdpc2hpIHNjYWxlIGFuZCB0aGUgZmlyc3QgdHdvIG9mIEZlaHIgaXRlbXMgKCRcYWxwaGEkID0gMC42NSkgd2VyZSBjb21iaW5lZCBpbnRvIHNpbmdsZSBjb21wb3NpdGUgc2NvcmVzLiBUYWJsZSBiZWxvdyBzaG93cyBTcGVhcm1hbiBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZXNlIGFuZCBvdGhlciBtZWFzdXJlcyBvZiB0cnVzdCAoRmFsaydzIHNpbmdsZSBpdGVtIHRydXN0IG1lYXN1cmUgYW5kIHRoZSBhbW91bnRzIHNlbnQgb24gdGhlIHRydXN0IGdhbWUpLCBhcyB3ZWxsIGFzIHJpc2stdGFraW5nLCBzb2NpYWwgdmFsdWUgb3JpZW50YXRpb24gKHN2byksIGFuZCBtZWFuIGFtb3VudHMgZGVtbmFuZGVkIG9uIHNvY2lhbCBkaWxlbW1hcy4gCgpgYGB7ciwgZWNobz1GLCBjb21tZW50PUYsIHRpZHk9VCwgd2FybmluZz1GQUxTRSwgY29tbWVudD1GfQprYWJsZShjb3JzdGFycyhyYW1hZGFuMjAyMC50aW1lMVtyYW1hZGFuMjAyMC50aW1lMSRQUk9MSUZJQ19QSUQgJWluJSByYW1hZGFuMjAyMC50aW1lMSRQUk9MSUZJQ19QSUQsIG5hbWVzKHJhbWFkYW4yMDIwLnRpbWUxKSAlaW4lIGMoInN2by5wcm9zb2NpYWwiLCAidHJ1c3QuZmFsayIsICJ0cnVzdC5nYW1lIiwgInRydXN0LnlhbWFnaXNoaS5hdmciLCAidHJ1c3QuZmVoci5hdmciLCAicmlzay5hbGwiLCAic29jaWFsLmRpbGVtbWEuYXZnIildLCAic3BlYXJtYW4iKSkKYGBgCgpcCgpJbnRlcmVzdGluZ2x5LCBub25lIG9mIHRoZSB0cnVzdCBtZWFzdXJlcyBhcmUgcmVsYXRlZCB0byByZXNwb25zZXMgb24gc29jaWFsIGRpbGVtbWEgcXVlc3Rpb25zLiBTb21lIG1lYXN1cmVzIG9mIHRydXN0IGFyZSBjb3JyZWxhdGVkIHdpdGggcmlzay10YWtpbmcgYW5kIHNvY2lhbCB2YWx1ZSBvcmllbnRhdGlvbi4gCgpJIHRlc3RlZCB0aGUgbW9kZWwgYmVsb3cgdG8gY29tYXByZSBmYXN0ZXJzIGFuZCBub24tZmFzdGVycyBvbiB0aGUgZm91ciBpbmRpY2VzIG9mIHRydXN0OgoKJFwgdHJ1c3Quc2NvcmUkIH4gJFwgdHJ1c3QudHlwZSAqIGZhc3RpbmckXAoKYGBge3IsIHRpZHk9VCwgZWNobz1GLCB3YXJuaW5nPUZBTFNFLCBjb21tZW50PUYsIG1lc3NhZ2U9Rn0Ka2FibGUoYW5vdmEod2l0aChtZWx0KHJhbWFkYW4yMDIwLnRpbWUxWyxncmVwKCJQUk9MSUZJQ19QSUR8dHJ1c3QuZ2FtZXx0cnVzdC5mZWhyLmF2Z3x0cnVzdC55YW1hZ2lzaGkuYXZnfHRydXN0LmZhbGt8ZmFzdGluZyIsIG5hbWVzKHJhbWFkYW4yMDIwLnRpbWUxKSldLCB2YXJpYWJsZS5uYW1lPSJ0cnVzdC50eXBlIiksIGxtZXIodmFsdWV+dHJ1c3QudHlwZSpmYXN0aW5nICsgKDF8UFJPTElGSUNfUElEKSkpKSwgZGlnaXRzID0gMykKYGBgCgpQb3N0IGhvYyB0ZXN0IHdpdGggQm9uZmVycm9uaSBjb3JyZWN0aW9uIHNob3dlZCBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gZmFzdGVycyBhbmQgbm9uLWZhc3RlcnMgb24gYW55IG9mIHRoZSB0cnVzdCBpdGVtczoKCmBgYHtyLCB0aWR5PVQsd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRSwgY29tbWVudD1GLCBtZXNzYWdlPUZ9CmthYmxlKGxzbWVhbnMod2l0aChtZWx0KHJhbWFkYW4yMDIwLnRpbWUxWyxncmVwKCJQUk9MSUZJQ19QSUR8dHJ1c3QuZ2FtZXx0cnVzdC5mZWhyLmF2Z3x0cnVzdC55YW1hZ2lzaGkuYXZnfHRydXN0LmZhbGt8ZmFzdGluZyIsIG5hbWVzKHJhbWFkYW4yMDIwLnRpbWUxKSldLCB2YXJpYWJsZS5uYW1lPSJ0cnVzdC50eXBlIiksIGxtZXIodmFsdWV+dHJ1c3QudHlwZSpmYXN0aW5nICsgKDF8UFJPTElGSUNfUElEKSkpLCBwYWlyd2lzZX5mYXN0aW5nfHRydXN0LnR5cGUsIGFkanVzdD0iYm9uZmVycm9uaSIpJGNvbnRyYXN0cykKYGBgCgpcCgpgYGB7cn0KIyBmYXN0aW5nIC0oKyktPiBzdm8ucHJvc29jaWFsIC0oLSktPiBzb2NpYWwuZGlsZW1tYSA8LSgrKS0gcmlzazoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFc3RpbWF0ZSBTdGQuIEVycm9yIHQgdmFsdWUgUHIoPnx0fCkgICAgCiMgZmFzdGluZyAtKCspLT4gc3ZvLnByb3NvY2lhbDogICAgICAgICAgICNmYXN0aW5nTm8gICAgICAgLTAuODM3ICAgICAgMC4zODggIC0yLjE1NCAgMC4wMzE5ICogIAojIHN2by5wcm9zb2NpYWxpdHkgLSgtKS0+IHNvY2lhbC5kaWxlbW1hOiAjc3ZvLnByb3NvY2lhbCAgIC03LjA2MCAgICAgIDIuMTU2ICAtMy4yNzQgIDAuMDAxMTYgKiogCiMgc29jaWFsLmRpbGVtbWEgPC0oKyktIHJpc2s6ICAgICAgICAgICAgICNyaXNrLmFsbCAgICAgICAgMTIuMTQ3ICAgICAgNS41NjEgICAyLjE4NCAgMC4wMjk1OSAqIAoKYGBgCgoKIyMjIyBGYXN0aW5nCmBgYHtyfQpzdW1tYXJ5KHdpdGgocmFtYWRhbjIwMjAudGltZTFbcmFtYWRhbjIwMjAudGltZTEkUFJPTElGSUNfUElEICVpbiUgY2hlY2tlZC5JRC4xLjUsXSwgbG0oc2NhbGUoc29jaWFsLmRpbGVtbWEuYXZnKX5mYXN0aW5nKSkpCmBgYAoKCmBgYHtyfQpzdW1tYXJ5KHdpdGgocmFtYWRhbjIwMjAudGltZTFbcmFtYWRhbjIwMjAudGltZTEkUFJPTElGSUNfUElEICVpbiUgY2hlY2tlZC5JRC4xLjUsXSwgbG0oc2NhbGUoc3ZvLnByb3NvY2lhbCl+ZmFzdGluZykpKQpgYGAKCgpgYGB7cn0Kc3VtbWFyeSh3aXRoKHJhbWFkYW4yMDIwLnRpbWUxW3JhbWFkYW4yMDIwLnRpbWUxJFBST0xJRklDX1BJRCAlaW4lIGNoZWNrZWQuSUQuMS41LF0sIGxtKHNjYWxlKHJpc2suYWxsKX5mYXN0aW5nKSkpCmBgYAoKXAoKIyMjIyBMYXN0IG1lYWwKYGBge3J9CnN1bW1hcnkod2l0aChyYW1hZGFuMjAyMC50aW1lMVtyYW1hZGFuMjAyMC50aW1lMSRQUk9MSUZJQ19QSUQgJWluJSBjaGVja2VkLklELjEuNSxdLCBsbShzY2FsZShzb2NpYWwuZGlsZW1tYS5hdmcpfmZhc3RpbmcqYXMubnVtZXJpYyhmb29kLnJlbWluZGVyLnRpbWUpKSkpCgpzdW1tYXJ5KHdpdGgocmFtYWRhbjIwMjAudGltZTFbcmFtYWRhbjIwMjAudGltZTEkUFJPTElGSUNfUElEICVpbiUgY2hlY2tlZC5JRC4xLjUsXSwgbG0oc2NhbGUoc3ZvLnByb3NvY2lhbCl+ZmFzdGluZyphcy5udW1lcmljKGZvb2QucmVtaW5kZXIudGltZSkpKSkKCnN1bW1hcnkod2l0aChyYW1hZGFuMjAyMC50aW1lMVtyYW1hZGFuMjAyMC50aW1lMSRQUk9MSUZJQ19QSUQgJWluJSBjaGVja2VkLklELjEuNSxdLCBsbShzY2FsZShyaXNrLmFsbCl+ZmFzdGluZyphcy5udW1lcmljKGZvb2QucmVtaW5kZXIudGltZSkpKSkKCmBgYAoKCgoKIyMjIyBQZXJjZWl2ZWQgY29udHJvbAojIyMjIFJlY2lwcm9jaXR5IChOZWdhdGl2ZSkKIyMjIyBSZWNpcHJvY2l0eSAoUG9zaXRpdmUpCiMjIyMgQWx0cnVpc20KIyMjIyBDb3JyZWxhdGlvbnMKYGBge3J9CndpdGgocmFtYWRhbjIwMjAudGltZTFbcmFtYWRhbjIwMjAudGltZTEkUFJPTElGSUNfUElEICVpbiUgY2hlY2tlZC5JRC4xLjUsXSwgY29yc3RhcnNsKGRhdGEuZnJhbWUoImZhc3RpbmciPWFzLm51bWVyaWMoZmFzdGluZyksICJzb2MuZGlsLmF2ZyI9c29jaWFsLmRpbGVtbWEuYXZnLCByaXNrLmFsbCwgc3ZvLnByb3NvY2lhbCwgdHJ1c3QuZmFsaywgdHJ1c3QuZmVoci5hdmcsIHRydXN0LmdhbWUsIGh1bmdlciwgImxhc3QubWVhbCI9YXMubnVtZXJpYyhmb29kLnJlbWluZGVyLnRpbWUpLCAgImNvbnRyb2wiPWNvbnRyb2wuc2VsZi1jb250cm9sLm91dHNpZGUsIG5lZy5yZWNpcC5hdmcsIHBvcy5yZWNpcCwgYWx0cnVpc20pLCAicGVhcnNvbiIpKQoKYGBgCg==