load("C:/Users/jessi/Desktop/ML7331_ICA5/titanic2.raw.rdata")


# Number of rows
nrow(titanic.raw)
[1] 2201
# Number of columns
ncol(titanic.raw)
[1] 4
# Or both at once (dimension of the data)
dim(titanic.raw)
[1] 2201    4
# Column names
colnames(titanic.raw)
[1] "Class"    "Sex"      "Age"      "Survived"
# Display the first 6 rows
head(titanic.raw)

summary(titanic.raw)
  Class         Sex          Age       Survived  
 1st :325   Female: 470   Adult:2092   No :1490  
 2nd :285   Male  :1731   Child: 109   Yes: 711  
 3rd :706                                        
 Crew:885                                        
str(titanic.raw)
'data.frame':   2201 obs. of  4 variables:
 $ Class   : Factor w/ 4 levels "1st","2nd","3rd",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ Sex     : Factor w/ 2 levels "Female","Male": 2 2 2 2 2 2 2 2 2 2 ...
 $ Age     : Factor w/ 2 levels "Adult","Child": 2 2 2 2 2 2 2 2 2 2 ...
 $ Survived: Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
# Total missing values per column
colSums(is.na(titanic.raw))
   Class      Sex      Age Survived 
       0        0        0        0 
# Alternatively, check if there are any missing values in the entire dataset
any(is.na(titanic.raw))
[1] FALSE

Q.3:

Based on your outputs, here’s a summary of each step’s results and interpretation:

Step 1: Load the Dataset

The first few rows and structure of the dataset:

   Class   Sex    Age Survived
0   3rd    Male   Child   No
1   3rd    Male   Child   No
2   3rd    Male   Child   No
3   3rd    Male   Child   No
4   3rd    Male   Child   No

Data structure information:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2201 entries, 0 to 2200
Data columns (total 4 columns):
 #   Column    Non-Null Count  Dtype 
---  ------    --------------  ----- 
 0   Class     2201 non-null   object
 1   Sex       2201 non-null   object
 2   Age       2201 non-null   object
 3   Survived  2201 non-null   object
dtypes: object(4)
memory usage: 68.9+ KB

Summary of each column:

       Column   Count Unique    Top      Freq
       Class     2201    4     Crew       885
       Sex       2201    2     Male       1731
       Age       2201    2     Adult      2092
       Survived  2201    2     No         1490

Step 2: Summary of Categorical Distributions

The distribution of values in each categorical column:

Class distribution:
 Crew    885
 3rd     706
 1st     325
 2nd     285

Sex distribution:
 Male      1731
 Female     470

Age distribution:
 Adult    2092
 Child     109

Survived distribution:
 No     1490
 Yes     711

Step 3: Support Count Calculations

This means there are 197 instances in the dataset where the passenger was in 1st class, was an adult, and survived.

Additional Steps: Calculating Support and Confidence

Based on this support count and assuming a total of 2201 records, we can now calculate support and confidence.

  1. Support for \(\{1st, \text{Adult, Yes}\}\): \[ s = \frac{197}{2201} \approx 0.0895 \text{ or } 8.95\% \]

  2. Support count for \(\{1st, \text{Adult, Yes, Female}\}\): Run the code for the count of {1st, Adult, Yes, Female}

  3. Confidence for \(\{1st, \text{Adult, Yes}\} \rightarrow \{\text{Female}\}\): Calculate confidence using: \[ c = \frac{\sigma(\{1st, \text{Adult, Yes, Female}\})}{\sigma(\{1st, \text{Adult, Yes}\})} \]

Q.1 Answer:

Given the dataset size of 2201 records, I calculated the minimum support count for a minsup threshold of 0.25:

# Total dataset size
total_records = 2201

# Minsup threshold and required support count
minsup_threshold = 0.25
minsup_count = int(minsup_threshold * total_records)  # Result is 550

print("Required support count for minsup of 0.25:", minsup_count)

This means an itemset needs a support count of at least 550 to be frequent at this level. Checking this against the support counts we’ve seen:

Since both are below 550, neither itemset meets the minsup threshold of 0.25, so neither is frequent.

Based on this, I conclude: - No 4-itemsets would be frequent or maximal at this minsup level, since even the relevant 3-itemsets fall below the required support count.

Q.2 Answer:

Q.3 Answer:

To calculate the confidence for the rule {1st, Adult, Yes} → {Female}, I use the support counts from previous answers.

Confidence Calculation: \[ \text{Confidence} = \frac{\text{support count of }\{1st, \text{Adult, Yes, Female}\}}{\text{support count of }\{1st, \text{Adult, Yes}\}} = \frac{140}{197} \approx 0.7107 \]

So, the confidence for {1st, Adult, Yes} → {Female} is about 71.07%. This means that if someone in the dataset is from 1st class, an adult, and survived, there’s a 71.07% chance they are female.

Q.4 Answer:

  1. Support Count for minsup Threshold of 0.25:

    • With a minsup threshold of 0.25, an itemset needs a support count of at least 550 (25% of 2201 records) to be considered frequent.
  2. Frequent Itemsets with minsup = 0.25:

    • To be frequent, an itemset must have a support count of 550 or more. Looking at our support counts:
      • {1st, Adult, Yes} has a support count of 197.
      • {1st, Adult, Yes, Female} has a support count of 140.
    • Since both are below 550, neither meets the minsup threshold, so they’re not frequent.

    Based on the dataset, only very broad categories (like all No for Survived or all Male for Sex) are likely to exceed a support count of 550.

  3. Maximal 4-Itemsets:

    • An itemset is maximal if it’s frequent and has no frequent supersets. Since none of the 4-itemsets reach a support count of 550, no 4-itemsets are frequent or maximal at this minsup level.

Q.5 Answer:

  1. Step 1: Identify Frequent 3-Itemsets
    • With a minimum support count of 200, the following 3-itemsets from the bar graph are frequent:
      • {Adult, Female, No} with a support of 1200
      • {Crew, Male, No} with a support of 600
      • {3rd, Male, No} with a support of 300
  2. Step 2: Apply the Apriori Principle
    • To generate candidate 4-itemsets, I use the apriori principle, which states that any subset of a frequent itemset must also be frequent. So, I can only form a 4-itemset if two 3-itemsets share at least two common attributes.
  3. Step 3: Attempt to Generate 4-Itemsets
    • {Adult, Female, No} and {Crew, Male, No} don’t share enough attributes to form a valid 4-itemset.
    • {Crew, Male, No} and {3rd, Male, No} differ in the Class attribute, so they don’t combine into a frequent 4-itemset.
    • {Adult, Female, No} and {3rd, Male, No} also lack shared attributes, preventing a 4-itemset.

Conclusion

Since none of these frequent 3-itemsets overlap enough to meet the apriori principle, no candidate 4-itemsets can be generated that would meet the minsup threshold.

Colab

RPubs

LS0tDQp0aXRsZTogIk1MNzMzMV9JQ0E1XzEzX05vdl8yNDogVGl0YW5pYyBSYXciDQphdXRob3I6ICJKZXNzaWNhIE1jUGhhdWwiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCmVkaXRvcl9vcHRpb25zOiANCiAgbWFya2Rvd246IA0KICAgIHdyYXA6IDcyDQotLS0NCg0KYGBge3J9DQpsb2FkKCJDOi9Vc2Vycy9qZXNzaS9EZXNrdG9wL01MNzMzMV9JQ0E1L3RpdGFuaWMyLnJhdy5yZGF0YSIpDQoNCg0KIyBOdW1iZXIgb2Ygcm93cw0KbnJvdyh0aXRhbmljLnJhdykNCg0KIyBOdW1iZXIgb2YgY29sdW1ucw0KbmNvbCh0aXRhbmljLnJhdykNCg0KIyBPciBib3RoIGF0IG9uY2UgKGRpbWVuc2lvbiBvZiB0aGUgZGF0YSkNCmRpbSh0aXRhbmljLnJhdykNCg0KIyBDb2x1bW4gbmFtZXMNCmNvbG5hbWVzKHRpdGFuaWMucmF3KQ0KDQojIERpc3BsYXkgdGhlIGZpcnN0IDYgcm93cw0KaGVhZCh0aXRhbmljLnJhdykNCg0Kc3VtbWFyeSh0aXRhbmljLnJhdykNCg0Kc3RyKHRpdGFuaWMucmF3KQ0KDQojIFRvdGFsIG1pc3NpbmcgdmFsdWVzIHBlciBjb2x1bW4NCmNvbFN1bXMoaXMubmEodGl0YW5pYy5yYXcpKQ0KDQojIEFsdGVybmF0aXZlbHksIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbWlzc2luZyB2YWx1ZXMgaW4gdGhlIGVudGlyZSBkYXRhc2V0DQphbnkoaXMubmEodGl0YW5pYy5yYXcpKQ0KYGBgDQoNCiMjIyBRLjM6DQoNCkJhc2VkIG9uIHlvdXIgb3V0cHV0cywgaGVyZeKAmXMgYSBzdW1tYXJ5IG9mIGVhY2ggc3RlcCdzIHJlc3VsdHMgYW5kDQppbnRlcnByZXRhdGlvbjoNCg0KIyMjIFN0ZXAgMTogTG9hZCB0aGUgRGF0YXNldA0KDQpUaGUgZmlyc3QgZmV3IHJvd3MgYW5kIHN0cnVjdHVyZSBvZiB0aGUgZGF0YXNldDoNCg0KYGBgIHBsYWludGV4dA0KICAgQ2xhc3MgICBTZXggICAgQWdlIFN1cnZpdmVkDQowICAgM3JkICAgIE1hbGUgICBDaGlsZCAgIE5vDQoxICAgM3JkICAgIE1hbGUgICBDaGlsZCAgIE5vDQoyICAgM3JkICAgIE1hbGUgICBDaGlsZCAgIE5vDQozICAgM3JkICAgIE1hbGUgICBDaGlsZCAgIE5vDQo0ICAgM3JkICAgIE1hbGUgICBDaGlsZCAgIE5vDQpgYGANCg0KRGF0YSBzdHJ1Y3R1cmUgaW5mb3JtYXRpb246DQoNCmBgYCBwbGFpbnRleHQNCjxjbGFzcyAncGFuZGFzLmNvcmUuZnJhbWUuRGF0YUZyYW1lJz4NClJhbmdlSW5kZXg6IDIyMDEgZW50cmllcywgMCB0byAyMjAwDQpEYXRhIGNvbHVtbnMgKHRvdGFsIDQgY29sdW1ucyk6DQogIyAgIENvbHVtbiAgICBOb24tTnVsbCBDb3VudCAgRHR5cGUgDQotLS0gIC0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLSAgLS0tLS0gDQogMCAgIENsYXNzICAgICAyMjAxIG5vbi1udWxsICAgb2JqZWN0DQogMSAgIFNleCAgICAgICAyMjAxIG5vbi1udWxsICAgb2JqZWN0DQogMiAgIEFnZSAgICAgICAyMjAxIG5vbi1udWxsICAgb2JqZWN0DQogMyAgIFN1cnZpdmVkICAyMjAxIG5vbi1udWxsICAgb2JqZWN0DQpkdHlwZXM6IG9iamVjdCg0KQ0KbWVtb3J5IHVzYWdlOiA2OC45KyBLQg0KYGBgDQoNClN1bW1hcnkgb2YgZWFjaCBjb2x1bW46DQoNCmBgYCBwbGFpbnRleHQNCiAgICAgICBDb2x1bW4gICBDb3VudCBVbmlxdWUgICAgVG9wICAgICAgRnJlcQ0KICAgICAgIENsYXNzICAgICAyMjAxICAgIDQgICAgIENyZXcgICAgICAgODg1DQogICAgICAgU2V4ICAgICAgIDIyMDEgICAgMiAgICAgTWFsZSAgICAgICAxNzMxDQogICAgICAgQWdlICAgICAgIDIyMDEgICAgMiAgICAgQWR1bHQgICAgICAyMDkyDQogICAgICAgU3Vydml2ZWQgIDIyMDEgICAgMiAgICAgTm8gICAgICAgICAxNDkwDQpgYGANCg0KIyMjIFN0ZXAgMjogU3VtbWFyeSBvZiBDYXRlZ29yaWNhbCBEaXN0cmlidXRpb25zDQoNClRoZSBkaXN0cmlidXRpb24gb2YgdmFsdWVzIGluIGVhY2ggY2F0ZWdvcmljYWwgY29sdW1uOg0KDQpgYGAgcGxhaW50ZXh0DQpDbGFzcyBkaXN0cmlidXRpb246DQogQ3JldyAgICA4ODUNCiAzcmQgICAgIDcwNg0KIDFzdCAgICAgMzI1DQogMm5kICAgICAyODUNCg0KU2V4IGRpc3RyaWJ1dGlvbjoNCiBNYWxlICAgICAgMTczMQ0KIEZlbWFsZSAgICAgNDcwDQoNCkFnZSBkaXN0cmlidXRpb246DQogQWR1bHQgICAgMjA5Mg0KIENoaWxkICAgICAxMDkNCg0KU3Vydml2ZWQgZGlzdHJpYnV0aW9uOg0KIE5vICAgICAxNDkwDQogWWVzICAgICA3MTENCmBgYA0KDQojIyMgU3RlcCAzOiBTdXBwb3J0IENvdW50IENhbGN1bGF0aW9ucw0KDQotICAgKipTdXBwb3J0IGNvdW50IGZvcioqICRcezFzdCwgXHRleHR7QWR1bHQsIFllc31cfSQ6DQoNCiAgICBgYGAgcGxhaW50ZXh0DQogICAgU3VwcG9ydCBjb3VudCBmb3IgezFzdCwgQWR1bHQsIFllc306ICAxOTcNCiAgICBgYGANCg0KVGhpcyBtZWFucyB0aGVyZSBhcmUgMTk3IGluc3RhbmNlcyBpbiB0aGUgZGF0YXNldCB3aGVyZSB0aGUgcGFzc2VuZ2VyDQp3YXMgaW4gMXN0IGNsYXNzLCB3YXMgYW4gYWR1bHQsIGFuZCBzdXJ2aXZlZC4NCg0KIyMjIEFkZGl0aW9uYWwgU3RlcHM6IENhbGN1bGF0aW5nIFN1cHBvcnQgYW5kIENvbmZpZGVuY2UNCg0KQmFzZWQgb24gdGhpcyBzdXBwb3J0IGNvdW50IGFuZCBhc3N1bWluZyBhIHRvdGFsIG9mIDIyMDEgcmVjb3Jkcywgd2UgY2FuDQpub3cgY2FsY3VsYXRlIHN1cHBvcnQgYW5kIGNvbmZpZGVuY2UuDQoNCjEuICAqKlN1cHBvcnQgZm9yKiogJFx7MXN0LCBcdGV4dHtBZHVsdCwgWWVzfVx9JDogJCQNCiAgICBzID0gXGZyYWN7MTk3fXsyMjAxfSBcYXBwcm94IDAuMDg5NSBcdGV4dHsgb3IgfSA4Ljk1XCUNCiAgICAkJA0KDQoyLiAgKipTdXBwb3J0IGNvdW50IGZvcioqICRcezFzdCwgXHRleHR7QWR1bHQsIFllcywgRmVtYWxlfVx9JDogUnVuIHRoZQ0KICAgIGNvZGUgZm9yIHRoZSBjb3VudCBvZiBgezFzdCwgQWR1bHQsIFllcywgRmVtYWxlfWANCg0KMy4gICoqQ29uZmlkZW5jZSBmb3IqKg0KICAgICRcezFzdCwgXHRleHR7QWR1bHQsIFllc31cfSBccmlnaHRhcnJvdyBce1x0ZXh0e0ZlbWFsZX1cfSQ6DQogICAgQ2FsY3VsYXRlIGNvbmZpZGVuY2UgdXNpbmc6ICQkDQogICAgYyA9IFxmcmFje1xzaWdtYShcezFzdCwgXHRleHR7QWR1bHQsIFllcywgRmVtYWxlfVx9KX17XHNpZ21hKFx7MXN0LCBcdGV4dHtBZHVsdCwgWWVzfVx9KX0NCiAgICAkJA0KDQojIyMgUS4xIEFuc3dlcjoNCg0KR2l2ZW4gdGhlIGRhdGFzZXQgc2l6ZSBvZiAqKjIyMDEgcmVjb3JkcyoqLCBJIGNhbGN1bGF0ZWQgdGhlIG1pbmltdW0NCnN1cHBvcnQgY291bnQgZm9yIGEgbWluc3VwIHRocmVzaG9sZCBvZiAwLjI1Og0KDQpgYGAgcHl0aG9uDQojIFRvdGFsIGRhdGFzZXQgc2l6ZQ0KdG90YWxfcmVjb3JkcyA9IDIyMDENCg0KIyBNaW5zdXAgdGhyZXNob2xkIGFuZCByZXF1aXJlZCBzdXBwb3J0IGNvdW50DQptaW5zdXBfdGhyZXNob2xkID0gMC4yNQ0KbWluc3VwX2NvdW50ID0gaW50KG1pbnN1cF90aHJlc2hvbGQgKiB0b3RhbF9yZWNvcmRzKSAgIyBSZXN1bHQgaXMgNTUwDQoNCnByaW50KCJSZXF1aXJlZCBzdXBwb3J0IGNvdW50IGZvciBtaW5zdXAgb2YgMC4yNToiLCBtaW5zdXBfY291bnQpDQpgYGANCg0KVGhpcyBtZWFucyBhbiBpdGVtc2V0IG5lZWRzIGEgc3VwcG9ydCBjb3VudCBvZiBhdCBsZWFzdCAqKjU1MCoqIHRvIGJlDQpmcmVxdWVudCBhdCB0aGlzIGxldmVsLiBDaGVja2luZyB0aGlzIGFnYWluc3QgdGhlIHN1cHBvcnQgY291bnRzIHdl4oCZdmUNCnNlZW46DQoNCi0gICBgezFzdCwgQWR1bHQsIFllc31gIGhhcyBhIHN1cHBvcnQgY291bnQgb2YgKioxOTcqKi4NCi0gICBgezFzdCwgQWR1bHQsIFllcywgRmVtYWxlfWAgaGFzIGEgc3VwcG9ydCBjb3VudCBvZiAqKjE0MCoqLg0KDQpTaW5jZSBib3RoIGFyZSBiZWxvdyA1NTAsIG5laXRoZXIgaXRlbXNldCBtZWV0cyB0aGUgbWluc3VwIHRocmVzaG9sZCBvZg0KMC4yNSwgc28gKipuZWl0aGVyIGlzIGZyZXF1ZW50KiouDQoNCkJhc2VkIG9uIHRoaXMsIEkgY29uY2x1ZGU6IC0gKipObyA0LWl0ZW1zZXRzIHdvdWxkIGJlIGZyZXF1ZW50IG9yDQptYXhpbWFsKiogYXQgdGhpcyBtaW5zdXAgbGV2ZWwsIHNpbmNlIGV2ZW4gdGhlIHJlbGV2YW50IDMtaXRlbXNldHMgZmFsbA0KYmVsb3cgdGhlIHJlcXVpcmVkIHN1cHBvcnQgY291bnQuDQoNCiMjIyBRLjIgQW5zd2VyOg0KDQotICAgVGhlICoqc3VwcG9ydCBjb3VudCBmb3IgYHsxc3QsIEFkdWx0LCBZZXN9YCoqIGlzIDE5Nywgd2l0aCBhIHN1cHBvcnQNCiAgICBvZiAqKjAuMDg5NSoqIG9yIGFib3V0ICoqOC45NSUqKiBvZiB0aGUgZGF0YXNldC4NCi0gICBUaGUgKipzdXBwb3J0IGNvdW50IGZvciBgezFzdCwgQWR1bHQsIFllcywgRmVtYWxlfWAqKiBpcyAxNDAsIHdpdGggYQ0KICAgIHN1cHBvcnQgb2YgKiowLjA2MzYqKiBvciBhYm91dCAqKjYuMzYlKiouDQoNCiMjIyBRLjMgQW5zd2VyOg0KDQpUbyBjYWxjdWxhdGUgdGhlIGNvbmZpZGVuY2UgZm9yIHRoZSBydWxlIGB7MXN0LCBBZHVsdCwgWWVzfSDihpIge0ZlbWFsZX1gLA0KSSB1c2UgdGhlIHN1cHBvcnQgY291bnRzIGZyb20gcHJldmlvdXMgYW5zd2Vycy4NCg0KKipDb25maWRlbmNlIENhbGN1bGF0aW9uKio6ICQkDQpcdGV4dHtDb25maWRlbmNlfSA9IFxmcmFje1x0ZXh0e3N1cHBvcnQgY291bnQgb2YgfVx7MXN0LCBcdGV4dHtBZHVsdCwgWWVzLCBGZW1hbGV9XH19e1x0ZXh0e3N1cHBvcnQgY291bnQgb2YgfVx7MXN0LCBcdGV4dHtBZHVsdCwgWWVzfVx9fSA9IFxmcmFjezE0MH17MTk3fSBcYXBwcm94IDAuNzEwNw0KJCQNCg0KU28sIHRoZSAqKmNvbmZpZGVuY2UgZm9yIGB7MXN0LCBBZHVsdCwgWWVzfSDihpIge0ZlbWFsZX1gKiogaXMgYWJvdXQNCioqNzEuMDclKiouIFRoaXMgbWVhbnMgdGhhdCBpZiBzb21lb25lIGluIHRoZSBkYXRhc2V0IGlzIGZyb20gMXN0IGNsYXNzLA0KYW4gYWR1bHQsIGFuZCBzdXJ2aXZlZCwgdGhlcmXigJlzIGEgNzEuMDclIGNoYW5jZSB0aGV5IGFyZSBmZW1hbGUuDQoNCiMjIyBRLjQgQW5zd2VyOg0KDQoxLiAgKipTdXBwb3J0IENvdW50IGZvciBtaW5zdXAgVGhyZXNob2xkIG9mIDAuMjUqKjoNCg0KICAgIC0gICBXaXRoIGEgbWluc3VwIHRocmVzaG9sZCBvZiAwLjI1LCBhbiBpdGVtc2V0IG5lZWRzIGEgc3VwcG9ydA0KICAgICAgICBjb3VudCBvZiBhdCBsZWFzdCAqKjU1MCoqICgyNSUgb2YgMjIwMSByZWNvcmRzKSB0byBiZSBjb25zaWRlcmVkDQogICAgICAgIGZyZXF1ZW50Lg0KDQoyLiAgKipGcmVxdWVudCBJdGVtc2V0cyB3aXRoIG1pbnN1cCA9IDAuMjUqKjoNCg0KICAgIC0gICBUbyBiZSBmcmVxdWVudCwgYW4gaXRlbXNldCBtdXN0IGhhdmUgYSBzdXBwb3J0IGNvdW50IG9mIDU1MCBvcg0KICAgICAgICBtb3JlLiBMb29raW5nIGF0IG91ciBzdXBwb3J0IGNvdW50czoNCiAgICAgICAgLSAgIGB7MXN0LCBBZHVsdCwgWWVzfWAgaGFzIGEgc3VwcG9ydCBjb3VudCBvZiAxOTcuDQogICAgICAgIC0gICBgezFzdCwgQWR1bHQsIFllcywgRmVtYWxlfWAgaGFzIGEgc3VwcG9ydCBjb3VudCBvZiAxNDAuDQogICAgLSAgIFNpbmNlIGJvdGggYXJlIGJlbG93IDU1MCwgKipuZWl0aGVyIG1lZXRzIHRoZSBtaW5zdXANCiAgICAgICAgdGhyZXNob2xkKiosIHNvIHRoZXnigJlyZSBub3QgZnJlcXVlbnQuDQoNCiAgICBCYXNlZCBvbiB0aGUgZGF0YXNldCwgb25seSB2ZXJ5IGJyb2FkIGNhdGVnb3JpZXMgKGxpa2UgYWxsIGBOb2AgZm9yDQogICAgYFN1cnZpdmVkYCBvciBhbGwgYE1hbGVgIGZvciBgU2V4YCkgYXJlIGxpa2VseSB0byBleGNlZWQgYSBzdXBwb3J0DQogICAgY291bnQgb2YgNTUwLg0KDQozLiAgKipNYXhpbWFsIDQtSXRlbXNldHMqKjoNCg0KICAgIC0gICBBbiBpdGVtc2V0IGlzICoqbWF4aW1hbCoqIGlmIGl04oCZcyBmcmVxdWVudCBhbmQgaGFzIG5vIGZyZXF1ZW50DQogICAgICAgIHN1cGVyc2V0cy4gU2luY2Ugbm9uZSBvZiB0aGUgNC1pdGVtc2V0cyByZWFjaCBhIHN1cHBvcnQgY291bnQgb2YNCiAgICAgICAgNTUwLCAqKm5vIDQtaXRlbXNldHMgYXJlIGZyZXF1ZW50IG9yIG1heGltYWwqKiBhdCB0aGlzIG1pbnN1cA0KICAgICAgICBsZXZlbC4NCg0KIyMjIFEuNSBBbnN3ZXI6DQoNCjEuICAqKlN0ZXAgMTogSWRlbnRpZnkgRnJlcXVlbnQgMy1JdGVtc2V0cyoqDQogICAgLSAgIFdpdGggYSBtaW5pbXVtIHN1cHBvcnQgY291bnQgb2YgMjAwLCB0aGUgZm9sbG93aW5nIDMtaXRlbXNldHMNCiAgICAgICAgZnJvbSB0aGUgYmFyIGdyYXBoIGFyZSBmcmVxdWVudDoNCiAgICAgICAgLSAgIGB7QWR1bHQsIEZlbWFsZSwgTm99YCB3aXRoIGEgc3VwcG9ydCBvZiAxMjAwDQogICAgICAgIC0gICBge0NyZXcsIE1hbGUsIE5vfWAgd2l0aCBhIHN1cHBvcnQgb2YgNjAwDQogICAgICAgIC0gICBgezNyZCwgTWFsZSwgTm99YCB3aXRoIGEgc3VwcG9ydCBvZiAzMDANCjIuICAqKlN0ZXAgMjogQXBwbHkgdGhlIEFwcmlvcmkgUHJpbmNpcGxlKioNCiAgICAtICAgVG8gZ2VuZXJhdGUgY2FuZGlkYXRlIDQtaXRlbXNldHMsIEkgdXNlIHRoZSBhcHJpb3JpIHByaW5jaXBsZSwNCiAgICAgICAgd2hpY2ggc3RhdGVzIHRoYXQgYW55IHN1YnNldCBvZiBhIGZyZXF1ZW50IGl0ZW1zZXQgbXVzdCBhbHNvIGJlDQogICAgICAgIGZyZXF1ZW50LiBTbywgSSBjYW4gb25seSBmb3JtIGEgNC1pdGVtc2V0IGlmIHR3byAzLWl0ZW1zZXRzDQogICAgICAgIHNoYXJlIGF0IGxlYXN0IHR3byBjb21tb24gYXR0cmlidXRlcy4NCjMuICAqKlN0ZXAgMzogQXR0ZW1wdCB0byBHZW5lcmF0ZSA0LUl0ZW1zZXRzKioNCiAgICAtICAgYHtBZHVsdCwgRmVtYWxlLCBOb31gIGFuZCBge0NyZXcsIE1hbGUsIE5vfWAgZG9u4oCZdCBzaGFyZSBlbm91Z2gNCiAgICAgICAgYXR0cmlidXRlcyB0byBmb3JtIGEgdmFsaWQgNC1pdGVtc2V0Lg0KICAgIC0gICBge0NyZXcsIE1hbGUsIE5vfWAgYW5kIGB7M3JkLCBNYWxlLCBOb31gIGRpZmZlciBpbiB0aGUgYENsYXNzYA0KICAgICAgICBhdHRyaWJ1dGUsIHNvIHRoZXkgZG9u4oCZdCBjb21iaW5lIGludG8gYSBmcmVxdWVudCA0LWl0ZW1zZXQuDQogICAgLSAgIGB7QWR1bHQsIEZlbWFsZSwgTm99YCBhbmQgYHszcmQsIE1hbGUsIE5vfWAgYWxzbyBsYWNrIHNoYXJlZA0KICAgICAgICBhdHRyaWJ1dGVzLCBwcmV2ZW50aW5nIGEgNC1pdGVtc2V0Lg0KDQoqKkNvbmNsdXNpb24qKg0KDQpTaW5jZSBub25lIG9mIHRoZXNlIGZyZXF1ZW50IDMtaXRlbXNldHMgb3ZlcmxhcCBlbm91Z2ggdG8gbWVldCB0aGUNCmFwcmlvcmkgcHJpbmNpcGxlLCAqKm5vIGNhbmRpZGF0ZSA0LWl0ZW1zZXRzIGNhbiBiZSBnZW5lcmF0ZWQqKiB0aGF0DQp3b3VsZCBtZWV0IHRoZSBtaW5zdXAgdGhyZXNob2xkLg0KDQpbQ29sYWJdKGh0dHBzOi8vY29sYWIucmVzZWFyY2guZ29vZ2xlLmNvbS9kcml2ZS8xUFBmSE9Ccy13WGh5RllSeVlsM1ZodHVZNHZGcEh6eVQjc2Nyb2xsVG89V3MyQzJobFJPWlRhKQ0KDQpbUlB1YnNdKGh0dHBzOi8vcnB1YnMuY29tL1RleGFzY2hpa2tpdGEvbWw3MzMxX0lDQTUpDQo=