- Introduction
- Research Objectives
- Data & Method Overview
- Conjoint Analysis
- Brand Perceptions & Attitudes toward UNO
- Purchase Intent & Willingness to Pay
- Consumer Segmentation (Demographics)
- Managerial Implications
- Limitations & Conclusion
library(readxl)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)
library(ggplot2)
library(broom)
library(forcats)
excel_path <- "UNO Survey Responses v4.xlsx"
Data Import (from
scratch, explicit)
# Conjoint (individual-level)
conjointData <- read_excel(excel_path, sheet = "Conjoint_Long")
# UNO Brand & Attitudes (aggregated)
uno_q1 <- read_excel(excel_path, sheet = "UNO Question1")
uno_q2 <- read_excel(excel_path, sheet = "UNO Question2")
uno_q3 <- read_excel(excel_path, sheet = "UNO Question3")
# Demographics (aggregated)
ageData <- read_excel(excel_path, sheet = "Age")
incomeData <- read_excel(excel_path, sheet = "Income")
genderData <- read_excel(excel_path, sheet = "Gender")
educationData <- read_excel(excel_path, sheet = "Education")
Rule:
- conjointData → modeling
- everything else → visualization & interpretation
1. Introduction
The packaged bread market has evolved beyond basic functional needs,
with consumers increasingly valuing health, quality, sustainability, and
premium cues. UNO is a leading brand in this category and is well
positioned to explore premium product extensions.
The objective of this study is to analyze consumer perceptions,
behavioral intentions, and product attribute trade-offs related to
packaged bread, with a specific focus on UNO. The analysis combines
survey-based descriptive insights with a rating-based conjoint model to
derive actionable managerial implications.
2. Conjoint
Analysis
rating_model <- lm(
Rating ~ Bread_Type + Slice_Type + Package_Type + Price,
data = conjointData
)
summary(rating_model)
##
## Call:
## lm(formula = Rating ~ Bread_Type + Slice_Type + Package_Type +
## Price, data = conjointData)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.3940 -1.4284 -0.2546 1.3089 4.8860
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.10782 0.17067 24.069 < 2e-16 ***
## Bread_TypeTraditional -0.01912 0.12146 -0.157 0.87496
## Bread_TypeWhole grain 0.38851 0.12146 3.199 0.00141 **
## Slice_TypeThick -0.29523 0.12207 -2.419 0.01570 *
## Slice_TypeThin -0.37151 0.12740 -2.916 0.00360 **
## Package_TypePlastic Bag -0.89179 0.10087 -8.841 < 2e-16 ***
## Price150 TL -0.78767 0.15431 -5.105 3.74e-07 ***
## Price25 TL -0.10233 0.17102 -0.598 0.54969
## Price35 TL -0.17494 0.14914 -1.173 0.24098
## Price50 TL -0.35000 0.15710 -2.228 0.02604 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.876 on 1484 degrees of freedom
## Multiple R-squared: 0.08997, Adjusted R-squared: 0.08446
## F-statistic: 16.3 on 9 and 1484 DF, p-value: < 2.2e-16
📌 This is your only regression model in the
project.
Coefficient plot
(MANDATORY visual)
coef_df <- tidy(rating_model) %>%
filter(term != "(Intercept)")
ggplot(coef_df, aes(x = estimate, y = reorder(term, estimate))) +
geom_point(size = 3) +
geom_errorbarh(
aes(xmin = estimate - 1.96 * std.error,
xmax = estimate + 1.96 * std.error),
height = 0.2
) +
geom_vline(xintercept = 0, linetype = "dashed") +
labs(
title = "Conjoint Part-Worth Utilities",
x = "Impact on Rating",
y = "Attribute Level"
) +
theme_minimal()
## Warning: `geom_errorbarh()` was deprecated in ggplot2 4.0.0.
## ℹ Please use the `orientation` argument of `geom_errorbar()` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `height` was translated to `width`.

Price sensitivity
(derived from conjoint)
conjointData %>%
group_by(Price) %>%
summarise(MeanRating = mean(Rating), .groups = "drop") %>%
ggplot(aes(x = Price, y = MeanRating)) +
geom_line() +
geom_point(size = 2) +
labs(
title = "Price Sensitivity of Bread Ratings",
x = "Price Level",
y = "Average Rating"
) +
theme_minimal()
## `geom_line()`: Each group consists of only one observation.
## ℹ Do you need to adjust the group aesthetic?

Demographic Profile
(DESCRIPTIVE)
Demographic Profile
of Respondents
ggplot(ageData, aes(x = Age_Range, y = Count)) +
geom_col() +
labs(
title = "Age Distribution of Respondents",
x = "Age Range",
y = "Number of Respondents"
) +
theme_minimal()

(Same logic for Income, Gender, Education → all
geom_col())
UNO Question 1 – Brand
Perceptions
Brand Perceptions of
UNO
library(dplyr)
library(tidyr)
library(ggplot2)
library(stringr)
uno_q1_long <- uno_q1 %>%
pivot_longer(
cols = c("1","2","3","4","5"),
names_to = "Level",
values_to = "Count"
) %>%
mutate(
Level = factor(Level, levels = c("1","2","3","4","5")),
Statement = UNO_Agreement_Level
)
ggplot(uno_q1_long, aes(x = Level, y = Count)) +
geom_col() +
facet_wrap(~ Statement, ncol = 2, labeller = label_wrap_gen(width = 35)) +
labs(
title = "UNO Q1 – Agreement Distribution by Statement",
x = "Agreement Level (1–5)",
y = "Number of Respondents"
) +
theme_minimal() +
theme(
legend.position = "none",
strip.text = element_text(size = 10),
axis.text.x = element_text(size = 9)
)

Interpretation of Agreement Distributions
Figure X presents the distribution of agreement levels (1–5) for each
brand statement related to UNO.
Across all statements, responses are concentrated around agreement
levels 3 and 4, indicating a generally positive but
moderate brand perception.
Statements related to quality, taste, and trust show
low frequencies at the extreme negative end (level 1), suggesting that
strong dissatisfaction is rare.
However, the relatively limited number of responses at level 5 indicates
that very strong agreement is also uncommon.
Overall, these distributions suggest that UNO is perceived as a
reliable, good-quality, and good-value everyday bread
brand, rather than a strongly differentiated premium or
innovative brand.
This moderate perception highlights both stability in current brand
equity and potential room for improvement through targeted positioning
and communication strategies.
UNO Question 2 – Action
Likelihood (FUNNEL)
Behavioral Intentions
toward UNO Premium Bread
library(dplyr)
library(tidyr)
library(ggplot2)
uno_q2_long <- uno_q2 %>%
pivot_longer(
cols = c("1","2","3","4","5","6","7"),
names_to = "Likelihood_Level",
values_to = "Count"
) %>%
mutate(
Likelihood_Level = factor(Likelihood_Level, levels = c("1","2","3","4","5","6","7")),
Action = UNO_Premium_Bread_Action_Likelihood
)
ggplot(uno_q2_long, aes(x = Likelihood_Level, y = Count)) +
geom_col() +
facet_wrap(~ Action, ncol = 2, labeller = label_wrap_gen(width = 35)) +
labs(
title = "UNO Q2 – Likelihood of Actions for Premium Bread",
x = "Likelihood Level (1–7)",
y = "Number of Respondents"
) +
theme_minimal() +
theme(
legend.position = "none",
strip.text = element_text(size = 10),
axis.text.x = element_text(size = 9)
)

Interpretation of Likelihood Distributions
Figure Y shows the distribution of likelihood levels (1–7) for
different consumer actions related to a potential UNO premium bread
line.
Across actions, responses tend to cluster around the mid-to-upper range
(roughly levels 4–6), indicating generally positive but not extreme
intentions.
Lower-commitment actions (e.g., trying at least once or buying on
promotion) typically receive higher likelihood responses than
higher-commitment actions (e.g., switching brands or purchasing
weekly).
Overall, this suggests consumers are open to engaging with UNO’s premium
offering, but stronger commitment may require clearer differentiation
and a compelling value proposition.
LS0tCnRpdGxlOiAiRGF0YSBJbnNpZ2h0cyBmb3IgTWFya2V0aW5nIChNaU04MTApIC0gR3JvdXA0IgpzdWJ0aXRsZTogIlVOTyBCcmVhZCBDb25zdW1lciBTdXJ2ZXkgJiBDb25qb2ludCBBbmFseXNpcyBSZXN1bHRzIgphdXRob3I6ICJHcm91cCA0IgpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6IGZsYXRseQogICAgaGlnaGxpZ2h0OiBweWdtZW50cwogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDMKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB0cnVlCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBkZl9wcmludDogcGFnZWQKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICBtYXRoamF4OiBkZWZhdWx0Ci0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgoxLiBJbnRyb2R1Y3Rpb24KMi4gUmVzZWFyY2ggT2JqZWN0aXZlcwozLiBEYXRhICYgTWV0aG9kIE92ZXJ2aWV3CjQuIENvbmpvaW50IEFuYWx5c2lzCjUuIEJyYW5kIFBlcmNlcHRpb25zICYgQXR0aXR1ZGVzIHRvd2FyZCBVTk8KNi4gUHVyY2hhc2UgSW50ZW50ICYgV2lsbGluZ25lc3MgdG8gUGF5CjcuIENvbnN1bWVyIFNlZ21lbnRhdGlvbiAoRGVtb2dyYXBoaWNzKQo4LiBNYW5hZ2VyaWFsIEltcGxpY2F0aW9ucwo5LiBMaW1pdGF0aW9ucyAmIENvbmNsdXNpb24KCgpgYGB7ciBwYWNrYWdlX2luc3RhbGwgfQoKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShicm9vbSkKbGlicmFyeShmb3JjYXRzKQoKZXhjZWxfcGF0aCA8LSAiVU5PIFN1cnZleSBSZXNwb25zZXMgdjQueGxzeCIKCmBgYAoKCiMgRGF0YSBJbXBvcnQgKGZyb20gc2NyYXRjaCwgZXhwbGljaXQpCgpgYGB7ciBkYXRhLWltcG9ydH0KIyBDb25qb2ludCAoaW5kaXZpZHVhbC1sZXZlbCkKY29uam9pbnREYXRhIDwtIHJlYWRfZXhjZWwoZXhjZWxfcGF0aCwgc2hlZXQgPSAiQ29uam9pbnRfTG9uZyIpCgojIFVOTyBCcmFuZCAmIEF0dGl0dWRlcyAoYWdncmVnYXRlZCkKdW5vX3ExIDwtIHJlYWRfZXhjZWwoZXhjZWxfcGF0aCwgc2hlZXQgPSAiVU5PIFF1ZXN0aW9uMSIpCnVub19xMiA8LSByZWFkX2V4Y2VsKGV4Y2VsX3BhdGgsIHNoZWV0ID0gIlVOTyBRdWVzdGlvbjIiKQp1bm9fcTMgPC0gcmVhZF9leGNlbChleGNlbF9wYXRoLCBzaGVldCA9ICJVTk8gUXVlc3Rpb24zIikKCiMgRGVtb2dyYXBoaWNzIChhZ2dyZWdhdGVkKQphZ2VEYXRhIDwtIHJlYWRfZXhjZWwoZXhjZWxfcGF0aCwgc2hlZXQgPSAiQWdlIikKaW5jb21lRGF0YSA8LSByZWFkX2V4Y2VsKGV4Y2VsX3BhdGgsIHNoZWV0ID0gIkluY29tZSIpCmdlbmRlckRhdGEgPC0gcmVhZF9leGNlbChleGNlbF9wYXRoLCBzaGVldCA9ICJHZW5kZXIiKQplZHVjYXRpb25EYXRhIDwtIHJlYWRfZXhjZWwoZXhjZWxfcGF0aCwgc2hlZXQgPSAiRWR1Y2F0aW9uIikKCmBgYAoKCioqUnVsZToqKiAgCi0gYGNvbmpvaW50RGF0YWAg4oaSIG1vZGVsaW5nICAKLSBldmVyeXRoaW5nIGVsc2Ug4oaSIHZpc3VhbGl6YXRpb24gJiBpbnRlcnByZXRhdGlvbgoKLS0tCgojIDEuIEludHJvZHVjdGlvbgoKVGhlIHBhY2thZ2VkIGJyZWFkIG1hcmtldCBoYXMgZXZvbHZlZCBiZXlvbmQgYmFzaWMgZnVuY3Rpb25hbCBuZWVkcywgd2l0aCBjb25zdW1lcnMgaW5jcmVhc2luZ2x5IHZhbHVpbmcgaGVhbHRoLCBxdWFsaXR5LCBzdXN0YWluYWJpbGl0eSwgYW5kIHByZW1pdW0gY3Vlcy4gVU5PIGlzIGEgbGVhZGluZyBicmFuZCBpbiB0aGlzIGNhdGVnb3J5IGFuZCBpcyB3ZWxsIHBvc2l0aW9uZWQgdG8gZXhwbG9yZSBwcmVtaXVtIHByb2R1Y3QgZXh0ZW5zaW9ucy4KClRoZSBvYmplY3RpdmUgb2YgdGhpcyBzdHVkeSBpcyB0byBhbmFseXplIGNvbnN1bWVyIHBlcmNlcHRpb25zLCBiZWhhdmlvcmFsIGludGVudGlvbnMsIGFuZCBwcm9kdWN0IGF0dHJpYnV0ZSB0cmFkZS1vZmZzIHJlbGF0ZWQgdG8gcGFja2FnZWQgYnJlYWQsIHdpdGggYSBzcGVjaWZpYyBmb2N1cyBvbiBVTk8uIFRoZSBhbmFseXNpcyBjb21iaW5lcyBzdXJ2ZXktYmFzZWQgZGVzY3JpcHRpdmUgaW5zaWdodHMgd2l0aCBhIHJhdGluZy1iYXNlZCBjb25qb2ludCBtb2RlbCB0byBkZXJpdmUgYWN0aW9uYWJsZSBtYW5hZ2VyaWFsIGltcGxpY2F0aW9ucy4KCiMgMi4gQ29uam9pbnQgQW5hbHlzaXMKCmBgYHtyIGNvbmpvaW50LW1vZGVsfQpyYXRpbmdfbW9kZWwgPC0gbG0oCiAgUmF0aW5nIH4gQnJlYWRfVHlwZSArIFNsaWNlX1R5cGUgKyBQYWNrYWdlX1R5cGUgKyBQcmljZSwKICBkYXRhID0gY29uam9pbnREYXRhCikKCnN1bW1hcnkocmF0aW5nX21vZGVsKQoKYGBgCgoK8J+TjCBUaGlzIGlzIHlvdXIgKipvbmx5IHJlZ3Jlc3Npb24gbW9kZWwqKiBpbiB0aGUgcHJvamVjdC4KCi0tLQoKIyMgQ29lZmZpY2llbnQgcGxvdCAoTUFOREFUT1JZIHZpc3VhbCkKCmBgYHtyIGNvbmpvaW50LWNvZWYtcGxvdH0KY29lZl9kZiA8LSB0aWR5KHJhdGluZ19tb2RlbCkgJT4lCiAgZmlsdGVyKHRlcm0gIT0gIihJbnRlcmNlcHQpIikKCmdncGxvdChjb2VmX2RmLCBhZXMoeCA9IGVzdGltYXRlLCB5ID0gcmVvcmRlcih0ZXJtLCBlc3RpbWF0ZSkpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBlc3RpbWF0ZSAtIDEuOTYgKiBzdGQuZXJyb3IsCiAgICAgICAgeG1heCA9IGVzdGltYXRlICsgMS45NiAqIHN0ZC5lcnJvciksCiAgICBoZWlnaHQgPSAwLjIKICApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgbGFicygKICAgIHRpdGxlID0gIkNvbmpvaW50IFBhcnQtV29ydGggVXRpbGl0aWVzIiwKICAgIHggPSAiSW1wYWN0IG9uIFJhdGluZyIsCiAgICB5ID0gIkF0dHJpYnV0ZSBMZXZlbCIKICApICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKLS0tCgojIyBQcmljZSBzZW5zaXRpdml0eSAoZGVyaXZlZCBmcm9tIGNvbmpvaW50KQoKCmBgYHtyIGNvbmpvaW50LXByaWNlfQpjb25qb2ludERhdGEgJT4lCiAgZ3JvdXBfYnkoUHJpY2UpICU+JQogIHN1bW1hcmlzZShNZWFuUmF0aW5nID0gbWVhbihSYXRpbmcpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBQcmljZSwgeSA9IE1lYW5SYXRpbmcpKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiUHJpY2UgU2Vuc2l0aXZpdHkgb2YgQnJlYWQgUmF0aW5ncyIsCiAgICB4ID0gIlByaWNlIExldmVsIiwKICAgIHkgPSAiQXZlcmFnZSBSYXRpbmciCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKCgotLS0KCiMgRGVtb2dyYXBoaWMgUHJvZmlsZSAoREVTQ1JJUFRJVkUpCgojIyBEZW1vZ3JhcGhpYyBQcm9maWxlIG9mIFJlc3BvbmRlbnRzCgpgYGB7ciBhZ2UtcGxvdH0KZ2dwbG90KGFnZURhdGEsIGFlcyh4ID0gQWdlX1JhbmdlLCB5ID0gQ291bnQpKSArCiAgZ2VvbV9jb2woKSArCiAgbGFicygKICAgIHRpdGxlID0gIkFnZSBEaXN0cmlidXRpb24gb2YgUmVzcG9uZGVudHMiLAogICAgeCA9ICJBZ2UgUmFuZ2UiLAogICAgeSA9ICJOdW1iZXIgb2YgUmVzcG9uZGVudHMiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpCgpgYGAKCgooU2FtZSBsb2dpYyBmb3IgSW5jb21lLCBHZW5kZXIsIEVkdWNhdGlvbiDihpIgYWxsIGBnZW9tX2NvbCgpYCkKCi0tLQoKIyBVTk8gUXVlc3Rpb24gMSDigJMgQnJhbmQgUGVyY2VwdGlvbnMKCiMjIEJyYW5kIFBlcmNlcHRpb25zIG9mIFVOTwoKYGBge3IgdW5vLXExfQoKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHN0cmluZ3IpCgp1bm9fcTFfbG9uZyA8LSB1bm9fcTEgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiksCiAgICBuYW1lc190byA9ICJMZXZlbCIsCiAgICB2YWx1ZXNfdG8gPSAiQ291bnQiCiAgKSAlPiUKICBtdXRhdGUoCiAgICBMZXZlbCA9IGZhY3RvcihMZXZlbCwgbGV2ZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiKSksCiAgICBTdGF0ZW1lbnQgPSBVTk9fQWdyZWVtZW50X0xldmVsCiAgKQoKZ2dwbG90KHVub19xMV9sb25nLCBhZXMoeCA9IExldmVsLCB5ID0gQ291bnQpKSArCiAgZ2VvbV9jb2woKSArCiAgZmFjZXRfd3JhcCh+IFN0YXRlbWVudCwgbmNvbCA9IDIsIGxhYmVsbGVyID0gbGFiZWxfd3JhcF9nZW4od2lkdGggPSAzNSkpICsKICBsYWJzKAogICAgdGl0bGUgPSAiVU5PIFExIOKAkyBBZ3JlZW1lbnQgRGlzdHJpYnV0aW9uIGJ5IFN0YXRlbWVudCIsCiAgICB4ID0gIkFncmVlbWVudCBMZXZlbCAoMeKAkzUpIiwKICAgIHkgPSAiTnVtYmVyIG9mIFJlc3BvbmRlbnRzIgogICkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSkKICApCgoKCmBgYAoKIyMgKipJbnRlcnByZXRhdGlvbiBvZiBBZ3JlZW1lbnQgRGlzdHJpYnV0aW9ucyoqCgpGaWd1cmUgWCBwcmVzZW50cyB0aGUgZGlzdHJpYnV0aW9uIG9mIGFncmVlbWVudCBsZXZlbHMgKDHigJM1KSBmb3IgZWFjaCBicmFuZCBzdGF0ZW1lbnQgcmVsYXRlZCB0byBVTk8uICAKQWNyb3NzIGFsbCBzdGF0ZW1lbnRzLCByZXNwb25zZXMgYXJlIGNvbmNlbnRyYXRlZCBhcm91bmQgYWdyZWVtZW50IGxldmVscyAqKjMgYW5kIDQqKiwgaW5kaWNhdGluZyBhIGdlbmVyYWxseSBwb3NpdGl2ZSBidXQgbW9kZXJhdGUgYnJhbmQgcGVyY2VwdGlvbi4KClN0YXRlbWVudHMgcmVsYXRlZCB0byAqKnF1YWxpdHksIHRhc3RlLCBhbmQgdHJ1c3QqKiBzaG93IGxvdyBmcmVxdWVuY2llcyBhdCB0aGUgZXh0cmVtZSBuZWdhdGl2ZSBlbmQgKGxldmVsIDEpLCBzdWdnZXN0aW5nIHRoYXQgc3Ryb25nIGRpc3NhdGlzZmFjdGlvbiBpcyByYXJlLiAgCkhvd2V2ZXIsIHRoZSByZWxhdGl2ZWx5IGxpbWl0ZWQgbnVtYmVyIG9mIHJlc3BvbnNlcyBhdCBsZXZlbCA1IGluZGljYXRlcyB0aGF0IHZlcnkgc3Ryb25nIGFncmVlbWVudCBpcyBhbHNvIHVuY29tbW9uLgoKT3ZlcmFsbCwgdGhlc2UgZGlzdHJpYnV0aW9ucyBzdWdnZXN0IHRoYXQgVU5PIGlzIHBlcmNlaXZlZCBhcyBhICoqcmVsaWFibGUsIGdvb2QtcXVhbGl0eSwgYW5kIGdvb2QtdmFsdWUgZXZlcnlkYXkgYnJlYWQgYnJhbmQqKiwgcmF0aGVyIHRoYW4gYSBzdHJvbmdseSBkaWZmZXJlbnRpYXRlZCBwcmVtaXVtIG9yIGlubm92YXRpdmUgYnJhbmQuICAKVGhpcyBtb2RlcmF0ZSBwZXJjZXB0aW9uIGhpZ2hsaWdodHMgYm90aCBzdGFiaWxpdHkgaW4gY3VycmVudCBicmFuZCBlcXVpdHkgYW5kIHBvdGVudGlhbCByb29tIGZvciBpbXByb3ZlbWVudCB0aHJvdWdoIHRhcmdldGVkIHBvc2l0aW9uaW5nIGFuZCBjb21tdW5pY2F0aW9uIHN0cmF0ZWdpZXMuCgotLS0KCiMgVU5PIFF1ZXN0aW9uIDIg4oCTIEFjdGlvbiBMaWtlbGlob29kIChGVU5ORUwpCgojIyBCZWhhdmlvcmFsIEludGVudGlvbnMgdG93YXJkIFVOTyBQcmVtaXVtIEJyZWFkCgpgYGB7ciB1bm8tcTJ9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZ2dwbG90MikKCnVub19xMl9sb25nIDwtIHVub19xMiAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpLAogICAgbmFtZXNfdG8gPSAiTGlrZWxpaG9vZF9MZXZlbCIsCiAgICB2YWx1ZXNfdG8gPSAiQ291bnQiCiAgKSAlPiUKICBtdXRhdGUoCiAgICBMaWtlbGlob29kX0xldmVsID0gZmFjdG9yKExpa2VsaWhvb2RfTGV2ZWwsIGxldmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSksCiAgICBBY3Rpb24gPSBVTk9fUHJlbWl1bV9CcmVhZF9BY3Rpb25fTGlrZWxpaG9vZAogICkKCmdncGxvdCh1bm9fcTJfbG9uZywgYWVzKHggPSBMaWtlbGlob29kX0xldmVsLCB5ID0gQ291bnQpKSArCiAgZ2VvbV9jb2woKSArCiAgZmFjZXRfd3JhcCh+IEFjdGlvbiwgbmNvbCA9IDIsIGxhYmVsbGVyID0gbGFiZWxfd3JhcF9nZW4od2lkdGggPSAzNSkpICsKICBsYWJzKAogICAgdGl0bGUgPSAiVU5PIFEyIOKAkyBMaWtlbGlob29kIG9mIEFjdGlvbnMgZm9yIFByZW1pdW0gQnJlYWQiLAogICAgeCA9ICJMaWtlbGlob29kIExldmVsICgx4oCTNykiLAogICAgeSA9ICJOdW1iZXIgb2YgUmVzcG9uZGVudHMiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KQogICkKCmBgYAoKCiMjICoqSW50ZXJwcmV0YXRpb24gb2YgTGlrZWxpaG9vZCBEaXN0cmlidXRpb25zKioKCkZpZ3VyZSBZIHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2YgbGlrZWxpaG9vZCBsZXZlbHMgKDHigJM3KSBmb3IgZGlmZmVyZW50IGNvbnN1bWVyIGFjdGlvbnMgcmVsYXRlZCB0byBhIHBvdGVudGlhbCBVTk8gcHJlbWl1bSBicmVhZCBsaW5lLiAgCkFjcm9zcyBhY3Rpb25zLCByZXNwb25zZXMgdGVuZCB0byBjbHVzdGVyIGFyb3VuZCB0aGUgbWlkLXRvLXVwcGVyIHJhbmdlIChyb3VnaGx5IGxldmVscyA04oCTNiksIGluZGljYXRpbmcgZ2VuZXJhbGx5IHBvc2l0aXZlIGJ1dCBub3QgZXh0cmVtZSBpbnRlbnRpb25zLgoKTG93ZXItY29tbWl0bWVudCBhY3Rpb25zIChlLmcuLCB0cnlpbmcgYXQgbGVhc3Qgb25jZSBvciBidXlpbmcgb24gcHJvbW90aW9uKSB0eXBpY2FsbHkgcmVjZWl2ZSBoaWdoZXIgbGlrZWxpaG9vZCByZXNwb25zZXMgdGhhbiBoaWdoZXItY29tbWl0bWVudCBhY3Rpb25zIChlLmcuLCBzd2l0Y2hpbmcgYnJhbmRzIG9yIHB1cmNoYXNpbmcgd2Vla2x5KS4gIApPdmVyYWxsLCB0aGlzIHN1Z2dlc3RzIGNvbnN1bWVycyBhcmUgb3BlbiB0byBlbmdhZ2luZyB3aXRoIFVOT+KAmXMgcHJlbWl1bSBvZmZlcmluZywgYnV0IHN0cm9uZ2VyIGNvbW1pdG1lbnQgbWF5IHJlcXVpcmUgY2xlYXJlciBkaWZmZXJlbnRpYXRpb24gYW5kIGEgY29tcGVsbGluZyB2YWx1ZSBwcm9wb3NpdGlvbi4KCgo=