Introduction

In recent years, consumer preferences in the packaged bread market have shifted significantly toward healthier, more sustainable, and higher-quality product offerings. Beyond basic functional needs, attributes such as bread type, packaging, slicing format, and price increasingly influence consumers’ purchase decisions and brand evaluations.

UNO is one of the leading packaged bread brands in the market and offers a wide portfolio ranging from traditional white bread to whole grain and premium variants. Understanding how consumers trade off different product attributes is critical for designing successful new product concepts and pricing strategies.

The objective of this project is to analyze consumer preferences for packaged bread products, with a specific focus on UNO, by combining survey-based insights and conjoint analysis. Through this approach, we aim to identify which product attributes drive consumer ratings the most and how sensitive consumers are to price and packaging decisions.

This report presents the results of a consumer survey conducted via Google Forms and applies a rating-based conjoint model to estimate the relative impact of key bread attributes on overall product evaluations. The findings are translated into managerial insights to support product design, packaging, and pricing decisions for UNO’s future bread offerings.

Research Objectives

The main objectives of this study are:

  • To understand consumer preferences for different packaged bread attributes.
  • To estimate the relative importance of bread type, slice type, packaging type, and price on overall product ratings.
  • To evaluate consumer price sensitivity within the packaged bread category.
  • To derive actionable managerial insights for UNO’s product development and positioning strategy.

Data and Methodology Overview

Data for this study were collected through an online consumer survey administered via Google Forms. The survey included questions on bread consumption habits, brand perceptions, purchase intentions, and a conjoint experiment designed to evaluate trade-offs between different bread attributes.

The conjoint data were reshaped into a long format suitable for analysis and analyzed using a linear regression model (rating-based conjoint analysis). The dependent variable is the overall product rating, while the independent variables include bread type, slice type, packaging type, and price.

Additional survey questions were organized into thematic sections and analyzed descriptively to complement the conjoint findings.

1 Conjoint Analysis (Rating-Based)

1.1 Purpose of the conjoint analysis

To understand how consumers trade off different bread attributes, we used a rating-based conjoint approach. Each respondent evaluated multiple product profiles that differed in Bread Type, Slice Type, Package Type, and Price. We then estimated the average impact (part-worth utility) of each attribute level on overall product ratings.

1.2 Model specification

We estimated the following linear regression model:

2 Conjoint Analysis (Rating-Based)

2.1 Purpose of the conjoint analysis

To understand how consumers trade off different bread attributes, we used a rating-based conjoint approach. Each respondent evaluated multiple product profiles that differed in Bread Type, Slice Type, Package Type, and Price. We then estimated the average impact (part-worth utility) of each attribute level on overall product ratings.

2.2 Model specification

We estimated the following linear regression model:

\[ Rating = \beta_0 + \beta_1(Bread\ Type) + \beta_2(Slice\ Type) + \beta_3(Price) + \beta_4(Package\ Type) + \varepsilon \]

2.3 Regression results (part-worth utilities)

The model is statistically significant overall (F-test p < 0.001), suggesting that the included attributes collectively explain variation in consumer ratings. The adjusted R-squared is approximately 0.084, which is acceptable for preference/consumer rating data and indicates that the model captures meaningful directional effects.

Key coefficients and interpretation:

  • Bread Type
    • Whole grain has a positive and significant effect on ratings (+0.389, p = 0.001).
      This indicates consumers value whole grain options and perceive them as more attractive than the baseline bread type.
    • Traditional is not statistically different from the baseline (p = 0.875), suggesting it does not meaningfully increase preference relative to the reference level.
  • Slice Type
    • Both Thick (-0.295, p = 0.016) and Thin (-0.372, p = 0.004) have negative and significant effects.
      This implies the reference slice type (likely “standard/medium”) is preferred; deviating to very thin or thick slices reduces ratings.
  • Price
    • Higher prices reduce ratings, especially at extreme levels.
    • 150 TL shows a strong negative effect (-0.788, p < 0.001), indicating a clear penalty when the price reaches very high levels.
    • 50 TL also reduces ratings (-0.350, p = 0.026), suggesting consumers are sensitive once price crosses a certain threshold.
    • 25 TL and 35 TL are not significant (p > 0.10), implying small increases at lower price points do not strongly change ratings compared to the reference price level.
  • Package Type
    • Plastic bag has the largest negative and significant effect (-0.892, p < 0.001).
      Packaging choice appears to be a dominant driver of preference: plastic packaging substantially decreases consumer evaluations relative to the reference package type.

2.4 Managerial insights from conjoint results

Based on the conjoint model, the strongest drivers of consumer ratings are packaging and price, followed by bread type, while slice type appears to be a lower-impact (hygiene) attribute.

From a product strategy perspective: - Favor whole grain variants for stronger perceived value. - Use a standard slice option rather than extreme thin/thick slicing. - Avoid plastic bag packaging; consider packaging formats that signal quality, freshness, or sustainability. - Maintain pricing within acceptable ranges; very high prices generate a sharp drop in preference unless justified by strong premium cues.

2.5 Suggested visuals for the presentation

To communicate conjoint findings clearly, the following visuals are recommended: - A coefficient plot (part-worth utilities with confidence intervals) - A price sensitivity chart (average rating by price level) - A packaging impact chart (average rating by package type)

library(readxl)      # # read Excel
library(broom)       # # tidy model outputs
library(knitr)       # # kable tables
library(kableExtra)  # # nicer tables
library(broom)
library(ggplot2)

breadRatingData <- read_excel("ConjointData.xlsx")
ratingRegression <- lm(breadRatingData$Rating ~ breadRatingData$`Bread Type` 
                            + breadRatingData$`Slice Type` 
                            + breadRatingData$Price
                            + breadRatingData$`Package Type`)

summary(ratingRegression)
## 
## Call:
## lm(formula = breadRatingData$Rating ~ breadRatingData$`Bread Type` + 
##     breadRatingData$`Slice Type` + breadRatingData$Price + breadRatingData$`Package Type`)
## 
## 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
## breadRatingData$`Bread Type`Traditional   -0.01912    0.12146  -0.157  0.87496
## breadRatingData$`Bread Type`Whole grain    0.38851    0.12146   3.199  0.00141
## breadRatingData$`Slice Type`Thick         -0.29523    0.12207  -2.419  0.01570
## breadRatingData$`Slice Type`Thin          -0.37151    0.12740  -2.916  0.00360
## breadRatingData$Price150 TL               -0.78767    0.15431  -5.105 3.74e-07
## breadRatingData$Price25 TL                -0.10233    0.17102  -0.598  0.54969
## breadRatingData$Price35 TL                -0.17494    0.14914  -1.173  0.24098
## breadRatingData$Price50 TL                -0.35000    0.15710  -2.228  0.02604
## breadRatingData$`Package Type`Plastic Bag -0.89179    0.10087  -8.841  < 2e-16
##                                              
## (Intercept)                               ***
## breadRatingData$`Bread Type`Traditional      
## breadRatingData$`Bread Type`Whole grain   ** 
## breadRatingData$`Slice Type`Thick         *  
## breadRatingData$`Slice Type`Thin          ** 
## breadRatingData$Price150 TL               ***
## breadRatingData$Price25 TL                   
## breadRatingData$Price35 TL                   
## breadRatingData$Price50 TL                *  
## breadRatingData$`Package Type`Plastic Bag ***
## ---
## 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
coef_df <- tidy(ratingRegression)

ggplot(coef_df[coef_df$term != "(Intercept)", ], 
       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 (Regression Coefficients)",
       x = "Utility (Impact on Rating)",
       y = "Attribute Level") +
  theme_minimal()

2.6 Price sensitivity

library(dplyr)

breadRatingData %>%
  group_by(Price) %>%
  summarise(mean_rating = mean(Rating), .groups = "drop") %>%
  ggplot(aes(x = Price, y = mean_rating)) +
  geom_line() +
  geom_point(size = 2) +
  labs(title = "Price Sensitivity: Average Rating by Price",
       x = "Price Level",
       y = "Average Rating") +
  theme_minimal()

2.7 3) Packaging impact (plastik etkisini vurgular)

breadRatingData %>%
  group_by(`Package Type`) %>%
  summarise(mean_rating = mean(Rating), .groups = "drop") %>%
  ggplot(aes(x = `Package Type`, y = mean_rating)) +
  geom_col() +
  labs(title = "Packaging Impact: Average Rating by Package Type",
       x = "Package Type",
       y = "Average Rating") +
  theme_minimal()

summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

3 Including Plots

You can also embed plots, for example:

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.

LS0tCnRpdGxlOiAiRGF0YSBJbnNpZ2h0cyBmb3IgTWFya2V0aW5nIChNaU04MTApIC0gR3JvdXA0IgpzdWJ0aXRsZTogIlVOTyBCcmVhZCBDb25zdW1lciBTdXJ2ZXkgJiBDb25qb2ludCBBbmFseXNpcyBSZXN1bHRzIgphdXRob3I6ICJHcm91cCA0IgpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6IGZsYXRseQogICAgaGlnaGxpZ2h0OiBweWdtZW50cwogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDMKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB0cnVlCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBkZl9wcmludDogcGFnZWQKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICBtYXRoamF4OiBkZWZhdWx0Ci0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgoqKkludHJvZHVjdGlvbioqCgpJbiByZWNlbnQgeWVhcnMsIGNvbnN1bWVyIHByZWZlcmVuY2VzIGluIHRoZSBwYWNrYWdlZCBicmVhZCBtYXJrZXQgaGF2ZSBzaGlmdGVkIHNpZ25pZmljYW50bHkgdG93YXJkIGhlYWx0aGllciwgbW9yZSBzdXN0YWluYWJsZSwgYW5kIGhpZ2hlci1xdWFsaXR5IHByb2R1Y3Qgb2ZmZXJpbmdzLiBCZXlvbmQgYmFzaWMgZnVuY3Rpb25hbCBuZWVkcywgYXR0cmlidXRlcyBzdWNoIGFzIGJyZWFkIHR5cGUsIHBhY2thZ2luZywgc2xpY2luZyBmb3JtYXQsIGFuZCBwcmljZSBpbmNyZWFzaW5nbHkgaW5mbHVlbmNlIGNvbnN1bWVyc+KAmSBwdXJjaGFzZSBkZWNpc2lvbnMgYW5kIGJyYW5kIGV2YWx1YXRpb25zLgoKVU5PIGlzIG9uZSBvZiB0aGUgbGVhZGluZyBwYWNrYWdlZCBicmVhZCBicmFuZHMgaW4gdGhlIG1hcmtldCBhbmQgb2ZmZXJzIGEgd2lkZSBwb3J0Zm9saW8gcmFuZ2luZyBmcm9tIHRyYWRpdGlvbmFsIHdoaXRlIGJyZWFkIHRvIHdob2xlIGdyYWluIGFuZCBwcmVtaXVtIHZhcmlhbnRzLiBVbmRlcnN0YW5kaW5nIGhvdyBjb25zdW1lcnMgdHJhZGUgb2ZmIGRpZmZlcmVudCBwcm9kdWN0IGF0dHJpYnV0ZXMgaXMgY3JpdGljYWwgZm9yIGRlc2lnbmluZyBzdWNjZXNzZnVsIG5ldyBwcm9kdWN0IGNvbmNlcHRzIGFuZCBwcmljaW5nIHN0cmF0ZWdpZXMuCgpUaGUgb2JqZWN0aXZlIG9mIHRoaXMgcHJvamVjdCBpcyB0byBhbmFseXplIGNvbnN1bWVyIHByZWZlcmVuY2VzIGZvciBwYWNrYWdlZCBicmVhZCBwcm9kdWN0cywgd2l0aCBhIHNwZWNpZmljIGZvY3VzIG9uIFVOTywgYnkgY29tYmluaW5nIHN1cnZleS1iYXNlZCBpbnNpZ2h0cyBhbmQgY29uam9pbnQgYW5hbHlzaXMuIFRocm91Z2ggdGhpcyBhcHByb2FjaCwgd2UgYWltIHRvIGlkZW50aWZ5IHdoaWNoIHByb2R1Y3QgYXR0cmlidXRlcyBkcml2ZSBjb25zdW1lciByYXRpbmdzIHRoZSBtb3N0IGFuZCBob3cgc2Vuc2l0aXZlIGNvbnN1bWVycyBhcmUgdG8gcHJpY2UgYW5kIHBhY2thZ2luZyBkZWNpc2lvbnMuCgpUaGlzIHJlcG9ydCBwcmVzZW50cyB0aGUgcmVzdWx0cyBvZiBhIGNvbnN1bWVyIHN1cnZleSBjb25kdWN0ZWQgdmlhIEdvb2dsZSBGb3JtcyBhbmQgYXBwbGllcyBhIHJhdGluZy1iYXNlZCBjb25qb2ludCBtb2RlbCB0byBlc3RpbWF0ZSB0aGUgcmVsYXRpdmUgaW1wYWN0IG9mIGtleSBicmVhZCBhdHRyaWJ1dGVzIG9uIG92ZXJhbGwgcHJvZHVjdCBldmFsdWF0aW9ucy4gVGhlIGZpbmRpbmdzIGFyZSB0cmFuc2xhdGVkIGludG8gbWFuYWdlcmlhbCBpbnNpZ2h0cyB0byBzdXBwb3J0IHByb2R1Y3QgZGVzaWduLCBwYWNrYWdpbmcsIGFuZCBwcmljaW5nIGRlY2lzaW9ucyBmb3IgVU5P4oCZcyBmdXR1cmUgYnJlYWQgb2ZmZXJpbmdzLgoKKipSZXNlYXJjaCBPYmplY3RpdmVzKioKClRoZSBtYWluIG9iamVjdGl2ZXMgb2YgdGhpcyBzdHVkeSBhcmU6CgotIFRvIHVuZGVyc3RhbmQgY29uc3VtZXIgcHJlZmVyZW5jZXMgZm9yIGRpZmZlcmVudCBwYWNrYWdlZCBicmVhZCBhdHRyaWJ1dGVzLgotIFRvIGVzdGltYXRlIHRoZSByZWxhdGl2ZSBpbXBvcnRhbmNlIG9mIGJyZWFkIHR5cGUsIHNsaWNlIHR5cGUsIHBhY2thZ2luZyB0eXBlLCBhbmQgcHJpY2Ugb24gb3ZlcmFsbCBwcm9kdWN0IHJhdGluZ3MuCi0gVG8gZXZhbHVhdGUgY29uc3VtZXIgcHJpY2Ugc2Vuc2l0aXZpdHkgd2l0aGluIHRoZSBwYWNrYWdlZCBicmVhZCBjYXRlZ29yeS4KLSBUbyBkZXJpdmUgYWN0aW9uYWJsZSBtYW5hZ2VyaWFsIGluc2lnaHRzIGZvciBVTk/igJlzIHByb2R1Y3QgZGV2ZWxvcG1lbnQgYW5kIHBvc2l0aW9uaW5nIHN0cmF0ZWd5LgoKKipEYXRhIGFuZCBNZXRob2RvbG9neSBPdmVydmlldyoqCgpEYXRhIGZvciB0aGlzIHN0dWR5IHdlcmUgY29sbGVjdGVkIHRocm91Z2ggYW4gb25saW5lIGNvbnN1bWVyIHN1cnZleSBhZG1pbmlzdGVyZWQgdmlhIEdvb2dsZSBGb3Jtcy4gVGhlIHN1cnZleSBpbmNsdWRlZCBxdWVzdGlvbnMgb24gYnJlYWQgY29uc3VtcHRpb24gaGFiaXRzLCBicmFuZCBwZXJjZXB0aW9ucywgcHVyY2hhc2UgaW50ZW50aW9ucywgYW5kIGEgY29uam9pbnQgZXhwZXJpbWVudCBkZXNpZ25lZCB0byBldmFsdWF0ZSB0cmFkZS1vZmZzIGJldHdlZW4gZGlmZmVyZW50IGJyZWFkIGF0dHJpYnV0ZXMuCgpUaGUgY29uam9pbnQgZGF0YSB3ZXJlIHJlc2hhcGVkIGludG8gYSBsb25nIGZvcm1hdCBzdWl0YWJsZSBmb3IgYW5hbHlzaXMgYW5kIGFuYWx5emVkIHVzaW5nIGEgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgKHJhdGluZy1iYXNlZCBjb25qb2ludCBhbmFseXNpcykuIFRoZSBkZXBlbmRlbnQgdmFyaWFibGUgaXMgdGhlIG92ZXJhbGwgcHJvZHVjdCByYXRpbmcsIHdoaWxlIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgaW5jbHVkZSBicmVhZCB0eXBlLCBzbGljZSB0eXBlLCBwYWNrYWdpbmcgdHlwZSwgYW5kIHByaWNlLgoKQWRkaXRpb25hbCBzdXJ2ZXkgcXVlc3Rpb25zIHdlcmUgb3JnYW5pemVkIGludG8gdGhlbWF0aWMgc2VjdGlvbnMgYW5kIGFuYWx5emVkIGRlc2NyaXB0aXZlbHkgdG8gY29tcGxlbWVudCB0aGUgY29uam9pbnQgZmluZGluZ3MuCgojIyBDb25qb2ludCBBbmFseXNpcyAoUmF0aW5nLUJhc2VkKQoKIyMjIFB1cnBvc2Ugb2YgdGhlIGNvbmpvaW50IGFuYWx5c2lzClRvIHVuZGVyc3RhbmQgaG93IGNvbnN1bWVycyB0cmFkZSBvZmYgZGlmZmVyZW50IGJyZWFkIGF0dHJpYnV0ZXMsIHdlIHVzZWQgYSByYXRpbmctYmFzZWQgY29uam9pbnQgYXBwcm9hY2guIEVhY2ggcmVzcG9uZGVudCBldmFsdWF0ZWQgbXVsdGlwbGUgcHJvZHVjdCBwcm9maWxlcyB0aGF0IGRpZmZlcmVkIGluICoqQnJlYWQgVHlwZSoqLCAqKlNsaWNlIFR5cGUqKiwgKipQYWNrYWdlIFR5cGUqKiwgYW5kICoqUHJpY2UqKi4gV2UgdGhlbiBlc3RpbWF0ZWQgdGhlIGF2ZXJhZ2UgaW1wYWN0IChwYXJ0LXdvcnRoIHV0aWxpdHkpIG9mIGVhY2ggYXR0cmlidXRlIGxldmVsIG9uIG92ZXJhbGwgcHJvZHVjdCByYXRpbmdzLgoKIyMjIE1vZGVsIHNwZWNpZmljYXRpb24KV2UgZXN0aW1hdGVkIHRoZSBmb2xsb3dpbmcgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWw6CgojIyBDb25qb2ludCBBbmFseXNpcyAoUmF0aW5nLUJhc2VkKQoKIyMjIFB1cnBvc2Ugb2YgdGhlIGNvbmpvaW50IGFuYWx5c2lzClRvIHVuZGVyc3RhbmQgaG93IGNvbnN1bWVycyB0cmFkZSBvZmYgZGlmZmVyZW50IGJyZWFkIGF0dHJpYnV0ZXMsIHdlIHVzZWQgYSByYXRpbmctYmFzZWQgY29uam9pbnQgYXBwcm9hY2guIEVhY2ggcmVzcG9uZGVudCBldmFsdWF0ZWQgbXVsdGlwbGUgcHJvZHVjdCBwcm9maWxlcyB0aGF0IGRpZmZlcmVkIGluICoqQnJlYWQgVHlwZSoqLCAqKlNsaWNlIFR5cGUqKiwgKipQYWNrYWdlIFR5cGUqKiwgYW5kICoqUHJpY2UqKi4gV2UgdGhlbiBlc3RpbWF0ZWQgdGhlIGF2ZXJhZ2UgaW1wYWN0IChwYXJ0LXdvcnRoIHV0aWxpdHkpIG9mIGVhY2ggYXR0cmlidXRlIGxldmVsIG9uIG92ZXJhbGwgcHJvZHVjdCByYXRpbmdzLgoKIyMjIE1vZGVsIHNwZWNpZmljYXRpb24KV2UgZXN0aW1hdGVkIHRoZSBmb2xsb3dpbmcgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWw6CgpcWwpSYXRpbmcgPSBcYmV0YV8wICsgXGJldGFfMShCcmVhZFwgVHlwZSkgKyBcYmV0YV8yKFNsaWNlXCBUeXBlKSArIFxiZXRhXzMoUHJpY2UpICsgXGJldGFfNChQYWNrYWdlXCBUeXBlKSArIFx2YXJlcHNpbG9uClxdCgojIyMgUmVncmVzc2lvbiByZXN1bHRzIChwYXJ0LXdvcnRoIHV0aWxpdGllcykKVGhlIG1vZGVsIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgb3ZlcmFsbCAoRi10ZXN0IHAgPCAwLjAwMSksIHN1Z2dlc3RpbmcgdGhhdCB0aGUgaW5jbHVkZWQgYXR0cmlidXRlcyBjb2xsZWN0aXZlbHkgZXhwbGFpbiB2YXJpYXRpb24gaW4gY29uc3VtZXIgcmF0aW5ncy4gVGhlIGFkanVzdGVkIFItc3F1YXJlZCBpcyBhcHByb3hpbWF0ZWx5IDAuMDg0LCB3aGljaCBpcyBhY2NlcHRhYmxlIGZvciBwcmVmZXJlbmNlL2NvbnN1bWVyIHJhdGluZyBkYXRhIGFuZCBpbmRpY2F0ZXMgdGhhdCB0aGUgbW9kZWwgY2FwdHVyZXMgbWVhbmluZ2Z1bCBkaXJlY3Rpb25hbCBlZmZlY3RzLgoKKipLZXkgY29lZmZpY2llbnRzIGFuZCBpbnRlcnByZXRhdGlvbjoqKgoKLSAqKkJyZWFkIFR5cGUqKgogIC0gKipXaG9sZSBncmFpbioqIGhhcyBhICoqcG9zaXRpdmUgYW5kIHNpZ25pZmljYW50KiogZWZmZWN0IG9uIHJhdGluZ3MgKCswLjM4OSwgcCA9IDAuMDAxKS4gIAogICAgVGhpcyBpbmRpY2F0ZXMgY29uc3VtZXJzIHZhbHVlIHdob2xlIGdyYWluIG9wdGlvbnMgYW5kIHBlcmNlaXZlIHRoZW0gYXMgbW9yZSBhdHRyYWN0aXZlIHRoYW4gdGhlIGJhc2VsaW5lIGJyZWFkIHR5cGUuCiAgLSAqKlRyYWRpdGlvbmFsKiogaXMgbm90IHN0YXRpc3RpY2FsbHkgZGlmZmVyZW50IGZyb20gdGhlIGJhc2VsaW5lIChwID0gMC44NzUpLCBzdWdnZXN0aW5nIGl0IGRvZXMgbm90IG1lYW5pbmdmdWxseSBpbmNyZWFzZSBwcmVmZXJlbmNlIHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2UgbGV2ZWwuCgotICoqU2xpY2UgVHlwZSoqCiAgLSBCb3RoICoqVGhpY2sqKiAoLTAuMjk1LCBwID0gMC4wMTYpIGFuZCAqKlRoaW4qKiAoLTAuMzcyLCBwID0gMC4wMDQpIGhhdmUgKipuZWdhdGl2ZSBhbmQgc2lnbmlmaWNhbnQqKiBlZmZlY3RzLiAgCiAgICBUaGlzIGltcGxpZXMgdGhlIHJlZmVyZW5jZSBzbGljZSB0eXBlIChsaWtlbHkg4oCcc3RhbmRhcmQvbWVkaXVt4oCdKSBpcyBwcmVmZXJyZWQ7IGRldmlhdGluZyB0byB2ZXJ5IHRoaW4gb3IgdGhpY2sgc2xpY2VzIHJlZHVjZXMgcmF0aW5ncy4KCi0gKipQcmljZSoqCiAgLSBIaWdoZXIgcHJpY2VzIHJlZHVjZSByYXRpbmdzLCBlc3BlY2lhbGx5IGF0IGV4dHJlbWUgbGV2ZWxzLgogIC0gKioxNTAgVEwqKiBzaG93cyBhIHN0cm9uZyBuZWdhdGl2ZSBlZmZlY3QgKC0wLjc4OCwgcCA8IDAuMDAxKSwgaW5kaWNhdGluZyBhIGNsZWFyIHBlbmFsdHkgd2hlbiB0aGUgcHJpY2UgcmVhY2hlcyB2ZXJ5IGhpZ2ggbGV2ZWxzLgogIC0gKio1MCBUTCoqIGFsc28gcmVkdWNlcyByYXRpbmdzICgtMC4zNTAsIHAgPSAwLjAyNiksIHN1Z2dlc3RpbmcgY29uc3VtZXJzIGFyZSBzZW5zaXRpdmUgb25jZSBwcmljZSBjcm9zc2VzIGEgY2VydGFpbiB0aHJlc2hvbGQuCiAgLSAqKjI1IFRMKiogYW5kICoqMzUgVEwqKiBhcmUgbm90IHNpZ25pZmljYW50IChwID4gMC4xMCksIGltcGx5aW5nIHNtYWxsIGluY3JlYXNlcyBhdCBsb3dlciBwcmljZSBwb2ludHMgZG8gbm90IHN0cm9uZ2x5IGNoYW5nZSByYXRpbmdzIGNvbXBhcmVkIHRvIHRoZSByZWZlcmVuY2UgcHJpY2UgbGV2ZWwuCgotICoqUGFja2FnZSBUeXBlKioKICAtICoqUGxhc3RpYyBiYWcqKiBoYXMgdGhlICoqbGFyZ2VzdCBuZWdhdGl2ZSBhbmQgc2lnbmlmaWNhbnQqKiBlZmZlY3QgKC0wLjg5MiwgcCA8IDAuMDAxKS4gIAogICAgUGFja2FnaW5nIGNob2ljZSBhcHBlYXJzIHRvIGJlIGEgZG9taW5hbnQgZHJpdmVyIG9mIHByZWZlcmVuY2U6IHBsYXN0aWMgcGFja2FnaW5nIHN1YnN0YW50aWFsbHkgZGVjcmVhc2VzIGNvbnN1bWVyIGV2YWx1YXRpb25zIHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2UgcGFja2FnZSB0eXBlLgoKIyMjIE1hbmFnZXJpYWwgaW5zaWdodHMgZnJvbSBjb25qb2ludCByZXN1bHRzCkJhc2VkIG9uIHRoZSBjb25qb2ludCBtb2RlbCwgdGhlIHN0cm9uZ2VzdCBkcml2ZXJzIG9mIGNvbnN1bWVyIHJhdGluZ3MgYXJlICoqcGFja2FnaW5nKiogYW5kICoqcHJpY2UqKiwgZm9sbG93ZWQgYnkgKipicmVhZCB0eXBlKiosIHdoaWxlICoqc2xpY2UgdHlwZSoqIGFwcGVhcnMgdG8gYmUgYSBsb3dlci1pbXBhY3QgKGh5Z2llbmUpIGF0dHJpYnV0ZS4KCkZyb20gYSBwcm9kdWN0IHN0cmF0ZWd5IHBlcnNwZWN0aXZlOgotIEZhdm9yICoqd2hvbGUgZ3JhaW4qKiB2YXJpYW50cyBmb3Igc3Ryb25nZXIgcGVyY2VpdmVkIHZhbHVlLgotIFVzZSBhICoqc3RhbmRhcmQgc2xpY2UqKiBvcHRpb24gcmF0aGVyIHRoYW4gZXh0cmVtZSB0aGluL3RoaWNrIHNsaWNpbmcuCi0gQXZvaWQgKipwbGFzdGljIGJhZyBwYWNrYWdpbmcqKjsgY29uc2lkZXIgcGFja2FnaW5nIGZvcm1hdHMgdGhhdCBzaWduYWwgcXVhbGl0eSwgZnJlc2huZXNzLCBvciBzdXN0YWluYWJpbGl0eS4KLSBNYWludGFpbiBwcmljaW5nIHdpdGhpbiBhY2NlcHRhYmxlIHJhbmdlczsgdmVyeSBoaWdoIHByaWNlcyBnZW5lcmF0ZSBhIHNoYXJwIGRyb3AgaW4gcHJlZmVyZW5jZSB1bmxlc3MganVzdGlmaWVkIGJ5IHN0cm9uZyBwcmVtaXVtIGN1ZXMuCgojIyMgU3VnZ2VzdGVkIHZpc3VhbHMgZm9yIHRoZSBwcmVzZW50YXRpb24KVG8gY29tbXVuaWNhdGUgY29uam9pbnQgZmluZGluZ3MgY2xlYXJseSwgdGhlIGZvbGxvd2luZyB2aXN1YWxzIGFyZSByZWNvbW1lbmRlZDoKLSBBICoqY29lZmZpY2llbnQgcGxvdCoqIChwYXJ0LXdvcnRoIHV0aWxpdGllcyB3aXRoIGNvbmZpZGVuY2UgaW50ZXJ2YWxzKQotIEEgKipwcmljZSBzZW5zaXRpdml0eSBjaGFydCoqIChhdmVyYWdlIHJhdGluZyBieSBwcmljZSBsZXZlbCkKLSBBICoqcGFja2FnaW5nIGltcGFjdCBjaGFydCoqIChhdmVyYWdlIHJhdGluZyBieSBwYWNrYWdlIHR5cGUpCgpgYGB7ciBwYWNrYWdlX2luc3RhbGwgfQoKbGlicmFyeShyZWFkeGwpICAgICAgIyAjIHJlYWQgRXhjZWwKbGlicmFyeShicm9vbSkgICAgICAgIyAjIHRpZHkgbW9kZWwgb3V0cHV0cwpsaWJyYXJ5KGtuaXRyKSAgICAgICAjICMga2FibGUgdGFibGVzCmxpYnJhcnkoa2FibGVFeHRyYSkgICMgIyBuaWNlciB0YWJsZXMKCmBgYAoKYGBge3IgcmVncmVzc2lvbiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShicm9vbSkKbGlicmFyeShnZ3Bsb3QyKQoKYnJlYWRSYXRpbmdEYXRhIDwtIHJlYWRfZXhjZWwoIkNvbmpvaW50RGF0YS54bHN4IikKcmF0aW5nUmVncmVzc2lvbiA8LSBsbShicmVhZFJhdGluZ0RhdGEkUmF0aW5nIH4gYnJlYWRSYXRpbmdEYXRhJGBCcmVhZCBUeXBlYCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYnJlYWRSYXRpbmdEYXRhJGBTbGljZSBUeXBlYCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYnJlYWRSYXRpbmdEYXRhJFByaWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJyZWFkUmF0aW5nRGF0YSRgUGFja2FnZSBUeXBlYCkKCnN1bW1hcnkocmF0aW5nUmVncmVzc2lvbikKYGBgCgpgYGB7ciBjb2VmLXBsb3QsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cgpjb2VmX2RmIDwtIHRpZHkocmF0aW5nUmVncmVzc2lvbikKCmdncGxvdChjb2VmX2RmW2NvZWZfZGYkdGVybSAhPSAiKEludGVyY2VwdCkiLCBdLCAKICAgICAgIGFlcyh4ID0gZXN0aW1hdGUsIHkgPSByZW9yZGVyKHRlcm0sIGVzdGltYXRlKSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBlc3RpbWF0ZSAtIDEuOTYqc3RkLmVycm9yLAogICAgICAgICAgICAgICAgICAgICB4bWF4ID0gZXN0aW1hdGUgKyAxLjk2KnN0ZC5lcnJvciksCiAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gMC4yKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGxhYnModGl0bGUgPSAiQ29uam9pbnQgUGFydC1Xb3J0aCBVdGlsaXRpZXMgKFJlZ3Jlc3Npb24gQ29lZmZpY2llbnRzKSIsCiAgICAgICB4ID0gIlV0aWxpdHkgKEltcGFjdCBvbiBSYXRpbmcpIiwKICAgICAgIHkgPSAiQXR0cmlidXRlIExldmVsIikgKwogIHRoZW1lX21pbmltYWwoKQoKYGBgCgoKIyMjIFByaWNlIHNlbnNpdGl2aXR5CgpgYGB7ciBwcmljZS1zZW5zaXRpdml0eSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShkcGx5cikKCmJyZWFkUmF0aW5nRGF0YSAlPiUKICBncm91cF9ieShQcmljZSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fcmF0aW5nID0gbWVhbihSYXRpbmcpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBQcmljZSwgeSA9IG1lYW5fcmF0aW5nKSkgKwogIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KHNpemUgPSAyKSArCiAgbGFicyh0aXRsZSA9ICJQcmljZSBTZW5zaXRpdml0eTogQXZlcmFnZSBSYXRpbmcgYnkgUHJpY2UiLAogICAgICAgeCA9ICJQcmljZSBMZXZlbCIsCiAgICAgICB5ID0gIkF2ZXJhZ2UgUmF0aW5nIikgKwogIHRoZW1lX21pbmltYWwoKQoKYGBgCgoKIyMjIDMpIFBhY2thZ2luZyBpbXBhY3QgKHBsYXN0aWsgZXRraXNpbmkgdnVyZ3VsYXIpCgpgYGB7ciBwYWNrYWdpbmctaW1wYWN0LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpicmVhZFJhdGluZ0RhdGEgJT4lCiAgZ3JvdXBfYnkoYFBhY2thZ2UgVHlwZWApICU+JQogIHN1bW1hcmlzZShtZWFuX3JhdGluZyA9IG1lYW4oUmF0aW5nKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYFBhY2thZ2UgVHlwZWAsIHkgPSBtZWFuX3JhdGluZykpICsKICBnZW9tX2NvbCgpICsKICBsYWJzKHRpdGxlID0gIlBhY2thZ2luZyBJbXBhY3Q6IEF2ZXJhZ2UgUmF0aW5nIGJ5IFBhY2thZ2UgVHlwZSIsCiAgICAgICB4ID0gIlBhY2thZ2UgVHlwZSIsCiAgICAgICB5ID0gIkF2ZXJhZ2UgUmF0aW5nIikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCmBgYHtyIGNhcnN9CnN1bW1hcnkoY2FycykKYGBgCgojIyBJbmNsdWRpbmcgUGxvdHMKCllvdSBjYW4gYWxzbyBlbWJlZCBwbG90cywgZm9yIGV4YW1wbGU6CgpgYGB7ciBwcmVzc3VyZSwgZWNobz1GQUxTRX0KcGxvdChwcmVzc3VyZSkKYGBgCgpOb3RlIHRoYXQgdGhlIGBlY2hvID0gRkFMU0VgIHBhcmFtZXRlciB3YXMgYWRkZWQgdG8gdGhlIGNvZGUgY2h1bmsgdG8gcHJldmVudCBwcmludGluZyBvZiB0aGUgUiBjb2RlIHRoYXQgZ2VuZXJhdGVkIHRoZSBwbG90Lgo=