Last Updated: 2024-08-03

Print Date: 2025-07-12

TABLE OF CONTENTS

Utilize the Table of Contents (TOC) menu on the left to scroll through the different sections and help navigate this report. You can click on the title to go directly to the section.

Considerations:

Terminology - The terms activity, workout, and exercise may be used interchangeably in this context, even though they have distinct meanings.

Data Assumptions - The data used for analyses assumes each set of exercise is performed to Rep Max (RM), which isn’t always the case, particularly if the individual isn’t aiming to perform the set to RM. Assuming each set of exercise is performed to Rep Max helps standardize data and provide clear insights into maximal strength, which is beneficial for benchmarking and tracking progress. However, it can also lead to inaccuracies, potential overtraining, and misleading data if not all exercises are performed to failure. Balancing the use of 1RM assumptions with realistic training practices is essential for accurate performance assessment and effective training programming.

STATS TO STANDARDS

Integrating Performance Metrics with Mark Rippetoe Strength Standards

Performance measures are evaluated to match standards. This section combines practical workout data analysis with Mark Rippetoe’s Strength Standards (see TOC Menu). The standards are essential for evaluating and contextualizing individual fitness achievements against standardized criteria.

For a higher quality of personal performance comparison, we define specific criteria to match the standards presented by Mark. Should we choose, we can specify our criteria for Flat Bench Dumbbell Chest Press or Incline Bench Dumbbell Chest Press, each likely requiring different weights and numbers of reps for execution. To note Mark Rippetoe’s training utilizes the barbell as the instrument for growth. By explaining in detail the Bench Press in his Starting Strength book 1, we know the strength standard is measured via the flat bench. Therefore, we specify Flat Bench Barbell Chest Press in our criteria to compare with Mark Rippetoe’s 1RM Male Bench Press Standards.

1RM Table - Avg L2W & ATH

  • The following table reports the average one-repetition maximum (1RM) for each individual across each specified exercise (“Selected Criteria”) over the last two weeks (L2W). The data for the last two weeks serves as a benchmark for the next workout. As the saying goes, “You’re only as good as your last.”

  • The table also reports highest 1RM over all time (ATH) for each selected criterion, accompanied by the last date the highest 1RM was achieved.

  • The 1RM is calculated based on weight executed per set and the number of reps, using the 1RM Conversion Table2.

  • Data is derived from measures entered in the “Ken Does Fitness.xlsm Workbook3.”

  • All calculations assume the standard barbell (Olympic barbell) weight of 45 pounds (20.4 kg).

Keep in mind there are many variables affecting performance. One of these variables includes grip (wide, alternating, overhand, etc.). One individual may use alternating grips (left underhand/right overhand, or vice-versa) when performing deadlifts to maximize weight execution. Another individual might utilize an overhand grip. Someone else may perform a combination of alternating grip and overhand grip. The following datasets and figures do not account for these differences.

Individual Performance Tables

Alex - 1RM Performance

Selected Criteria Index Average 1RM (lbs) Date Range (Last 2 Weeks) Highest 1RM All Time (lbs) Last Date Highest 1RM All Time
Flat Bench Barbell Chest Press 1 185.83 2024-07-18 to 2024-07-31 228.40 2024-01-13
Barbell Deadlift 2 224.51 2024-07-18 to 2024-07-31 261.63 2023-12-17
Barbell Overhead Shoulder Press 3 106.09 2024-06-29 to 2024-07-12 110.47 2024-07-12
Barbell Squat 4 185.75 2024-07-02 to 2024-07-15 191.86 2024-07-15

Josh - 1RM Performance

Selected Criteria Index Average 1RM (lbs) Date Range (Last 2 Weeks) Highest 1RM All Time (lbs) Last Date Highest 1RM All Time
Flat Bench Barbell Chest Press 1 213.15 2024-04-25 to 2024-05-08 253.09 2023-09-13
Barbell Deadlift 2 236.38 2023-10-27 to 2023-11-09 275.28 2023-10-18

Kendrick - 1RM Performance

Selected Criteria Index Average 1RM (lbs) Date Range (Last 2 Weeks) Highest 1RM All Time (lbs) Last Date Highest 1RM All Time
Flat Bench Barbell Chest Press 1 152.71 2024-07-18 to 2024-07-31 174.70 2024-02-07
Barbell Deadlift 2 219.21 2024-07-18 to 2024-07-31 267.44 2024-02-14
Barbell Overhead Shoulder Press 3 72.33 2024-07-13 to 2024-07-26 87.21 2024-01-02
Barbell Squat 4 173.99 2024-07-13 to 2024-07-26 207.87 2024-02-12

1RM Plots - Performance Over Standards

Performance is plotted over Mark Rippetoe’s Strength Standards.

Some considerations for the following plots:

  • Average 1RM for each individual is based on data from the last 2 weeks (L2W). As presented in the 1RM Table above, date ranges between each individual differ, ranging from a few weeks to several months or even years. Despite these differences, this plot is still beneficial for comparing performance among individuals, fostering friendly competition, and motivating action toward higher performance.

  • Highest 1RM (ATH - All Time Highs) for each individual is based on data from all entries.

  • Average Bodyweight represents data from the last 2 weeks of entries for each individual. The following plots and Category Levels use Average Bodyweight for both Average 1RM L2W and ATH executions. Separate calculations are required to obtain Bodyweight at the time when Average 1RM L2W was executed and Bodyweight when ATH 1RM was executed.

  • The date and date ranges for Average Bodyweight (lbs) and 1RM statistics may not align. For example:

    • Date Range for Average 1RM L2W: 2023-10-27 to 2023-11-09
    • Date for ATH 1RM: 2023-10-18
    • Date Range for Average Bodyweight L2W: 2024-05-24 to 2024-06-06
    • Further calculations are required to align the date ranges between bodyweight and performance, allowing greater reliability in the 1RM weight execution-to-bodyweight ratio.

L2W & ATH - Side By Side

Performance measures for Average 1RM Last 2 Weeks (L2W) and Highest 1RM All Time (ATH) are merged into one plot for side-by-side comparison. This visualization helps reach higher performance by highlighting recent performance and identifying personal bests, thereby fostering healthy competition and motivating consistent progress.

This combined plot allows for an easy comparison of recent performance and all-time bests, providing a clear visual representation of each individual’s progress and potential. Understanding these metrics can help identify areas for improvement and set goals to surpass their personal bests, ultimately leveling up performance.

Using Average 1RM Last 2 Weeks (L2W) for training purposes is more effective than comparing Highest 1RM Last 2 Weeks to 1RM All Time High (ATH). This is because the average 1RM over the last two weeks provides a more consistent and realistic measure of current strength levels, which can be influenced by various factors such as fatigue, recovery, and daily performance variability. Relying solely on the highest 1RM may not accurately reflect true performance capability and can lead to unrealistic training loads and potential overtraining.

Male Bench Press Standards, Avg 1RM L2W & 1RM ATH

Name Average 1RM (lbs) Date Range L2W Category Level L2W 1RM ATH (lbs) Date ATH Category Level ATH Avg BW L2W (lbs) Date Range
Alex 185.83 2024-07-18 to 2024-07-31 Cat. II 228.40 2024-01-13 Cat. III 175.00 2024-07-18 to 2024-07-31
Josh 213.15 2024-04-25 to 2024-05-08 Cat. III 253.09 2023-09-13 Cat. III 190.00 2024-05-24 to 2024-06-06
Kendrick 152.71 2024-07-18 to 2024-07-31 Cat. II 174.70 2024-02-07 Cat. III 133.46 2024-07-18 to 2024-07-31

Male Deadlift Standards, Avg 1RM L2W & 1RM ATH

Name Average 1RM (lbs) Date Range L2W Category Level L2W 1RM ATH (lbs) Date ATH Category Level ATH Avg BW L2W (lbs) Date Range
Alex 224.51 2024-07-18 to 2024-07-31 Cat. I 261.63 2023-12-17 Cat. I 175.00 2024-07-18 to 2024-07-31
Josh 236.38 2023-10-27 to 2023-11-09 Cat. I 275.28 2023-10-18 Cat. I 190.00 2024-05-24 to 2024-06-06
Kendrick 219.21 2024-07-18 to 2024-07-31 Cat. I 267.44 2024-02-14 Cat. II 133.46 2024-07-18 to 2024-07-31

Male Press Standards, Avg 1RM L2W & 1RM ATH

Name Average 1RM (lbs) Date Range L2W Category Level L2W 1RM ATH (lbs) Date ATH Category Level ATH Avg BW L2W (lbs) Date Range
Alex 106.09 2024-06-29 to 2024-07-12 Cat. I 110.47 2024-07-12 Cat. II 175.00 2024-07-18 to 2024-07-31
Kendrick 72.33 2024-07-13 to 2024-07-26 Cat. I 87.21 2024-01-02 Cat. I 133.46 2024-07-18 to 2024-07-31

Male Squat Standards, Avg 1RM L2W & 1RM ATH

Name Average 1RM (lbs) Date Range L2W Category Level L2W 1RM ATH (lbs) Date ATH Category Level ATH Avg BW L2W (lbs) Date Range
Alex 185.75 2024-07-02 to 2024-07-15 Cat. I 191.86 2024-07-15 Cat. I 175.00 2024-07-18 to 2024-07-31
Kendrick 173.99 2024-07-13 to 2024-07-26 Cat. I 207.87 2024-02-12 Cat. II 133.46 2024-07-18 to 2024-07-31

STRENGTH STANDARDS

Strength Standards provide valuable benchmarks for assessing an individual’s performance in key strength exercises that are widely practiced in fitness and strength training. These standards categorize performance levels based on either amount of weight executed relative to bodyweight, or repetitions executed, and are segmented by gender and experience levels. By comparing an individual’s performance against these established standards, trainers and athletes can identify strengths and weaknesses in their training regimens, set realistic goals, and measure progress in a structured manner.

Strength Standards Overview

Several strength standards are readily available online:

Finding accurate strength standards depends on the demographic, exercise type, and required accuracy. Each has its pros and cons: some cater to specific demographics, others focus on certain exercises, and their credibility affects reliability. Usability and comprehensive data for benchmarking are crucial, as are regular updates to reflect current trends. Considering these factors helps trainers and athletes choose the best standards for assessing and improving performance.

Standards Categories

The standards compiled are separated into categories, as shown in the following table, making it easy to determine which exercise to use as a benchmark.

Categories Categories
Push Ups Romanian Deadlift
Bench Press T Bar Row
Incline Bench Press Press
Pull Ups Barbell Shoulder Press
Lat Pulldown Dumbbell Shoulder Press
Deadlift Military Press

MARK RIPPETOE’S STANDARDS

Mark Rippetoe’s Strength Standard: 1 Rep Max By Bodyweight.

Here we present Mark Rippetoe’s Strength Standards4 to benchmark individual performance against established criteria for primary strength exercises. These standards are instrumental in evaluating an individual’s lifting capabilities in relation to their bodyweight and training experience. By doing so, we can effectively gauge progress, pinpoint areas that need improvement, and tailor training programs to better meet the specific strength goals of each individual.

The exercises use the technique described in “Starting Strength: Basic Barbell Training, 3rd ed.” The Bluebook may be purchased through The Aasgaard Company online store5 and on Amazon in various mediums (paperback, Kindle, audio). All lifts are performed with the barbell, as indicated by the book title.

To properly utilize these standards, it is recommended to review “Starting Strength: Basic Barbell Training”6 and “Practical Programming for Strength Training.”7 The most recent and relevant 3rd editions (2012) are available on their website, as well as in different mediums on Amazon. You can download online book samples to determine if Starting Strength suits your needs.

Strength Standard Category
Male Bench Press Std 1RM By Bodyweight Mark Rippetoe Bench Press
Male Deadlift Std 1RM By Bodyweight Mark Rippetoe Deadlift
Male Press Std 1RM By Bodyweight Mark Rippetoe Press
Male Squat Std 1RM By Bodyweight Mark Rippetoe Squat

There are five Starting Strength Standards, with the Power Clean excluded in this report. Each of the four remaining Standards is presented below, followed by a plot to visualize performances for comparison and motivation.

Male Bench Press Standards

Bodyweight (lb) Cat. I Cat. II Cat. III Cat. IV Cat. V
114 84 107 130 179 222
123 91 116 142 194 242
132 98 125 153 208 260
148 109 140 172 234 291
165 119 152 187 255 319
181 128 164 201 275 343
198 135 173 213 289 362
220 142 183 225 306 381
242 149 190 232 316 395
275 153 196 239 325 407
319 156 199 244 333 416
320+ 159 204 248 340 425

Male Deadlift Standards

Bodyweight (lb) Cat. I Cat. II Cat. III Cat. IV Cat. V
114 97 179 204 299 387
123 105 194 222 320 414
132 113 209 239 342 438
148 126 234 269 380 482
165 137 254 293 411 518
181 148 274 315 438 548
198 156 289 333 457 567
220 164 305 351 479 586
242 172 318 363 490 596
275 176 326 373 499 602
319 180 333 381 506 608
320+ 183 340 388 512 617

Male Press Standards

Bodyweight (lb) Cat. I Cat. II Cat. III Cat. IV Cat. V
114 53 72 90 107 129
123 57 78 98 116 141
132 61 84 105 125 151
148 69 94 119 140 169
165 75 102 129 153 186
181 81 110 138 164 218
198 85 116 146 173 234
220 89 122 155 183 255
242 93 127 159 189 264
275 96 131 164 194 272
319 98 133 167 199 278
320+ 100 136 171 203 284

Male Squat Standards

Bodyweight (lb) Cat. I Cat. II Cat. III Cat. IV Cat. V
114 78 144 174 240 320
123 84 155 190 259 346
132 91 168 205 278 369
148 101 188 230 313 410
165 110 204 250 342 445
181 119 220 269 367 479
198 125 232 285 387 504
220 132 244 301 409 532
242 137 255 311 423 551
275 141 261 319 435 567
319 144 267 326 445 580
320+ 147 272 332 454 593

REFERENCES


  1. Rippetoe, M. (2017). Starting Strength: Basic Barbell Training (3rd ed.). The Aasgaard Company. Retrieved from https://aasgaardco.com/store/books-posters-dvd/books/starting-strength-basic-barbell-training/.↩︎

  2. Strength Level. (n.d.). One Rep Max Calculator. Retrieved from https://strengthlevel.com/one-rep-max-calculator.↩︎

  3. Tham, K. (2024). Ken Does Fitness Final.xlsm. Retrieved from https://1drv.ms/x/s!AsYYZA9nL8lf8ybTNxlW-2c6sDXB?e=KLfhT4.↩︎

  4. Rippetoe, M. (2012). Strength Standards. Starting Strength. Retrieved from https://startingstrength.com/files/standards.pdf.↩︎

  5. Rippetoe, M. (2017). Starting Strength: Basic Barbell Training (3rd ed.). The Aasgaard Company. Retrieved from https://aasgaardco.com/store/books-posters-dvd/books/starting-strength-basic-barbell-training/.↩︎

  6. Rippetoe, M. Practical Programming for Strength Training, 3rd Edition by Mark Rippetoe. Available at https://www.amazon.com/Practical-Programming-Strength-Training-Rippetoe-ebook/dp/B00IU8YETW/ref=sr_1_2?crid=21521YXBKX4AI&dib=eyJ2IjoiMSJ9.1qTeh_8DJhqDmxrrajmjTbLiQz-wPaKOifgi787M7WurNxwUwKVbhQadJEw8Wdu2ygDP8X0D23Y5xGqEZAJ2L5luEw0gvCIIyuTmugYZ_bRmG35hqLRPlbOyQx4e5pRf2wVoGnsQPzFQEfEOlrhiHKp8BSWCuQkf2RELFKSOLQO49Fq8Y57PU_MuPm9ge91UcC3ebmCZ8pCWHmqbUURN6tyocDT-CR3ZaQAKPJXnmYPsocCP4jz4Y_QTLE1hecsk8Vuugf3HIBjBWkOVMZFmSDlS9ujVxqF4vRqC7GsVJlw._9jNplpd9L6PPFzk7WMC-nSDfWXPhmckFiiaMSwaCyo.↩︎

  7. Rippetoe, M. Practical Programming for Strength Training, 3rd Edition by Mark Rippetoe. Available at https://www.amazon.com/Practical-Programming-Strength-Training-Rippetoe-ebook/dp/B00IU8YETW/ref=sr_1_2?crid=21521YXBKX4AI&dib=eyJ2IjoiMSJ9.1qTeh_8DJhqDmxrrajmjTbLiQz-wPaKOifgi787M7WurNxwUwKVbhQadJEw8Wdu2ygDP8X0D23Y5xGqEZAJ2L5luEw0gvCIIyuTmugYZ_bRmG35hqLRPlbOyQx4e5pRf2wVoGnsQPzFQEfEOlrhiHKp8BSWCuQkf2RELFKSOLQO49Fq8Y57PU_MuPm9ge91UcC3ebmCZ8pCWHmqbUURN6tyocDT-CR3ZaQAKPJXnmYPsocCP4jz4Y_QTLE1hecsk8Vuugf3HIBjBWkOVMZFmSDlS9ujVxqF4vRqC7GsVJlw._9jNplpd9L6PPFzk7WMC-nSDfWXPhmckFiiaMSwaCyo.↩︎

LS0tDQp0aXRsZTogIkZpdG5lc3MgU3RhdHMgVXBkYXRlIg0KYXV0aG9yOiAnQXV0aG9yOiBLZW5kcmljayBUaGFtJw0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgIyBjb2xsYXBzZWQ6IG5vDQogICAgICBjb2xsYXBzZWQ6IHllcyAgIyBUaGlzIG1ha2VzIHRoZSBzdWItc2VjdGlvbnMgYXBwZWFyIG9ubHkgd2hlbiB0aGUgcHJpbWFyeSBzZWN0aW9uIGlzIGV4cGFuZGVkDQogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICAgIHBsYWNlbWVudDogdG9wDQogICAgICB0b2Nfc3VidHJlZTogeWVzICAjIEVuc3VyZXMgdGhhdCBzdWItc2VjdGlvbnMgYXJlIGhpZGRlbiB1bnRpbCB0aGUgcHJpbWFyeSBzZWN0aW9uIGlzIGNsaWNrZWQNCiAgICAjIGNvZGVfZm9sZGluZzogaGlkZSAgICMgSGlkZSB0aGUgY29kZSBieSBkZWZhdWx0DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZSAgIyBBZGQgYSBidXR0b24gdG8gZG93bmxvYWQgdGhlIFIgY29kZQ0KLS0tDQoNCkxhc3QgVXBkYXRlZDogMjAyNC0wOC0wMw0KDQpQcmludCBEYXRlOiBgciBTeXMuRGF0ZSgpYA0KDQo8IS0tICMgUk1EIFNldHVwIC0tPg0KDQo8c3R5bGU+DQoNCi8qIFJlZHVjZSB0aGUgZm9udCBzaXplIG9mIHRoZSBUT0MgKi8NCnsNCiAgZm9udC1zaXplOiAwLjkwZW07IC8qIEFkanVzdCB0aGUgc2l6ZSBhcyBuZWVkZWQgKi8NCn0NCg0KLyogQWRkIGJvcmRlcnMgYW5kIHNwYWNpbmcgdG8gYWxsIGZpZ3VyZXMgKi8NCmltZyB7DQogIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IC8qIFNwZWNpZnkgYm9yZGVyIHN0eWxlICovDQogIHBhZGRpbmc6IDVweDsgLyogQWRkIHBhZGRpbmcgYXJvdW5kIHRoZSBmaWd1cmVzICovDQogIGJvcmRlci1yYWRpdXM6IDVweDsgLyogQWRkIHJvdW5kZWQgY29ybmVycyB0byB0aGUgYm9yZGVyICovDQogIGRpc3BsYXk6IGJsb2NrOyAvKiBFbnN1cmUgdGhlIGltYWdlIGlzIHRyZWF0ZWQgYXMgYSBibG9jayBlbGVtZW50IHRvIHJlc3BlY3QgbWFyZ2luICovDQogIG1hcmdpbi1ib3R0b206IDIwcHg7IC8qIEFkZCBib3R0b20gbWFyZ2luIHRvIGVhY2ggaW1hZ2UgZm9yIHNwYWNpbmcgKi8NCn0NCg0KLyogQWRkIGJvcmRlcnMgdG8gYWxsIHRhYmxlcyAqLw0KdGFibGUgew0KICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyAvKiBDb2xsYXBzZSBib3JkZXJzIGludG8gYSBzaW5nbGUgYm9yZGVyICovDQogIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IC8qIFNwZWNpZnkgYm9yZGVyIHN0eWxlICovDQogIG1hcmdpbi1ib3R0b206IDIwcHg7IC8qIEFkZCBib3R0b20gbWFyZ2luIHRvIGVhY2ggdGFibGUgZm9yIHNwYWNpbmcgKi8NCn0NCg0KLyogQWRkIGJvcmRlcnMgdG8gdGFibGUgY2VsbHMgKi8NCnRoLCB0ZCB7DQogIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IC8qIFNwZWNpZnkgYm9yZGVyIHN0eWxlIGZvciB0YWJsZSBjZWxscyAqLw0KICBwYWRkaW5nOiA4cHg7IC8qIEFkZCBwYWRkaW5nIGluc2lkZSB0aGUgdGFibGUgY2VsbHMgKi8NCiAgdGV4dC1hbGlnbjogbGVmdDsgLyogQWxpZ24gdGV4dCB0byB0aGUgbGVmdCB3aXRoaW4gdGFibGUgY2VsbHMgKi8NCn0NCg0KDQovKiBFbnN1cmluZyBhbGwgY29sdW1uIGhlYWRlcnMgYXJlIGFsaWduZWQgdG8gdGhlIGxlZnQgKi8NCnRhYmxlLmthYmxlLXRhYmxlIHRoLCB0YWJsZS5rYWJsZS10YWJsZSB0ZCB7DQogICB0ZXh0LWFsaWduOiBsZWZ0ICFpbXBvcnRhbnQ7DQp9DQoNCg0KLyogQXBwbHkgc3R5bGVzIHRvIGFsbCBoZWFkZXJzICovDQp0aCB7DQogIHBvc2l0aW9uOiBzdGlja3k7IC8qIEVuc3VyZSBoZWFkZXJzIHN0aWNrIHdoZW4gc2Nyb2xsaW5nICovDQogIHRvcDogMDsgLyogUG9zaXRpb24gaGVhZGVycyBhdCB0aGUgdG9wICovDQogIGJhY2tncm91bmQtY29sb3I6ICNmMmYyZjI7IC8qIEJhY2tncm91bmQgY29sb3IgZm9yIGhlYWRlcnMgKi8NCiAgei1pbmRleDogOTk5OyAvKiBFbnN1cmUgaGVhZGVycyBzdGF5IG9uIHRvcCBvZiBvdGhlciBlbGVtZW50cyAqLw0KfQ0KDQovKiBBcHBseSBzdHlsZXMgdG8gYWxsIHRhYmxlcyAqLw0KdGFibGUgew0KICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyAvKiBDb2xsYXBzZSBib3JkZXJzIGludG8gYSBzaW5nbGUgYm9yZGVyICovDQogIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IC8qIFNwZWNpZnkgYm9yZGVyIHN0eWxlICovDQp9DQoNCi8qIEFwcGx5IHN0eWxlcyB0byB0YWJsZSBjZWxscyAqLw0KdGgsIHRkIHsNCiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDsgLyogU3BlY2lmeSBib3JkZXIgc3R5bGUgZm9yIHRhYmxlIGNlbGxzICovDQogIHBhZGRpbmc6IDhweDsgLyogQWRkIHBhZGRpbmcgaW5zaWRlIHRoZSB0YWJsZSBjZWxscyAqLw0KICB0ZXh0LWFsaWduOiBsZWZ0OyAvKiBBbGlnbiB0ZXh0IHRvIHRoZSBsZWZ0IHdpdGhpbiB0YWJsZSBjZWxscyAqLw0KfQ0KDQovKiBTdHlsZSB0YWJsZXMgd2l0aCBhbHRlcm5hdGluZyBzdHJpcGVkIHJvd3MgKi8NCnRhYmxlIHsNCiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsNCiAgd2lkdGg6IDEwMCU7DQp9DQoNCnRoLCB0ZCB7DQogIGJvcmRlcjogMXB4IHNvbGlkICNkZGRkZGQ7DQogIHRleHQtYWxpZ246IGxlZnQ7DQogIHBhZGRpbmc6IDhweDsNCn0NCg0KLyogQWRkIGFsdGVybmF0aW5nIGJhY2tncm91bmQgY29sb3JzIHRvIHRhYmxlIHJvd3MgKi8NCnRyOm50aC1jaGlsZChldmVuKSB7DQogIGJhY2tncm91bmQtY29sb3I6ICNmMmYyZjI7DQp9DQoNCnRyOm50aC1jaGlsZChvZGQpIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsgLyogV2hpdGUgYmFja2dyb3VuZCBmb3Igb2RkIHJvd3MgKi8NCn0NCg0KPC9zdHlsZT4NCg0KYGBge3IgZGVmYXVsdF9jaHVua19vcHRpb25zLCBpbmNsdWRlPUZBTFNFfQ0KIyBTZXQgcmVwb3NpdG9yeSBhbmQgZGVmYXVsdCBjaHVuayBvcHRpb25zDQpvcHRpb25zKHJlcG9zID0gYyhDUkFOID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89RkFMU0UsIGV2YWw9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFKQ0KYGBgDQoNCjwhLS0gDQpPcHRpb25zIHN1Y2ggYXMgZWNobywgbWVzc2FnZSwgd2FybmluZywgcmVzdWx0cywgaW5jbHVkZSwgZXZhbCwgY2FjaGUsIGFuZCBtb3JlLiANCg0KLSBlY2hvOiBTaG93IG9yIGhpZGUgY29kZSBpbiB0aGUgb3V0cHV0IChlY2hvID0gRkFMU0UgaGlkZXMgdGhlIGNvZGUpLg0KLSBtZXNzYWdlOiBTaG93IG9yIGhpZGUgbWVzc2FnZXMgaW4gdGhlIG91dHB1dCAobWVzc2FnZSA9IEZBTFNFIHN1cHByZXNzZXMgbWVzc2FnZXMpLg0KLSB3YXJuaW5nOiBTaG93IG9yIGhpZGUgd2FybmluZ3MgaW4gdGhlIG91dHB1dCAod2FybmluZyA9IEZBTFNFIHN1cHByZXNzZXMgd2FybmluZ3MpLg0KLSByZXN1bHRzOiBDb250cm9sIGhvdyByZXN1bHRzIGFyZSBzaG93bjoNCiAgLSAnbWFya3VwJzogRGlzcGxheSByZXN1bHRzIGFzIHRoZXkgYXJlLg0KICAtICdhc2lzJzogSW5jbHVkZSByZXN1bHRzIGFzIHJhdyBIVE1MIG9yIExhVGVYLg0KICAtICdoaWRlJzogSGlkZSByZXN1bHRzIGZyb20gb3V0cHV0Lg0KLSBpbmNsdWRlOiBJbmNsdWRlIG9yIGV4Y2x1ZGUgYm90aCBjb2RlIGFuZCByZXN1bHRzIGZyb20gdGhlIG91dHB1dCAoaW5jbHVkZSA9IEZBTFNFIGV4Y2x1ZGVzIGV2ZXJ5dGhpbmcpLg0KLSBldmFsOiBFdmFsdWF0ZSB0aGUgY29kZSBjaHVuayBvciBub3QgKGV2YWwgPSBGQUxTRSBwcmV2ZW50cyBjb2RlIGV4ZWN1dGlvbikuDQotIGNhY2hlOiBDYWNoZSB0aGUgcmVzdWx0cyBvZiB0aGUgY2h1bmsgdG8gc3BlZWQgdXAgcmVuZGVyaW5nIChjYWNoZSA9IFRSVUUgZW5hYmxlcyBjYWNoaW5nKS4NCi0gZmlnLmNhcDogQWRkIGEgY2FwdGlvbiB0byBncmFwaGljYWwgb3V0cHV0cy4NCi0gb3V0LndpZHRoL291dC5oZWlnaHQ6IFNldCB0aGUgb3V0cHV0IHNpemUgb2YgcGxvdHMuDQotIGNvbGxhcHNlOiBDb25jYXRlbmF0ZSB0ZXh0dWFsIG91dHB1dCBpbnRvIGEgc2luZ2xlIGJsb2NrLg0KLSB0aWR5OiBUaWR5IHVwIHRoZSBkaXNwbGF5IG9mIGNvZGUgb3IgcmVzdWx0cyAodGlkeSA9IFRSVUUgdGlkaWVzIHRoZSBvdXRwdXQpLg0KLS0+DQoNCmBgYHtyIHBhY2thZ2VzX2FuZF9saWJyYXJpZXMsIGV2YWw9VFJVRX0NCg0KIyBMaXN0IG9mIGFsbCByZXF1aXJlZCBsaWJyYXJpZXMNCnJlcXVpcmVkX2xpYnJhcmllcyA8LSBjKCJnZ3Bsb3QyIiwgInN0cmluZ3IiLCAicmVhZHhsIiwgImRwbHlyIiwgImx1YnJpZGF0ZSIsICJobXMiLCAib3Blbnhsc3giLCAid3JpdGV4bCIsICJybWFya2Rvd24iLCAia25pdHIiLCAia2FibGVFeHRyYSIsICJnZ25ld3NjYWxlIiwgImdyaWRFeHRyYSIpDQoNCiMgZ2dwbG90MiAgICAgZm9yICdkZWNsYXJhdGl2ZWx5JyBjcmVhdGluZyBncmFwaGljcywgYmFzZWQgb24gIlRoZSBHcmFtbWFyIG9mIEdyYXBoaWNzIi4gDQojIHN0cmluZ3IgICAgIGZvciB3b3JraW5nIHdpdGggc3RyaW5ncywgaS5lLiwgY2hhcmFjdGVyIGRhdGEuDQojIHJlYWR4bCAgICAgIGZvciByZWFkaW5nIEV4Y2VsIGZpbGVzIGJ5IHByb3ZpZGluZyBhIHdheSB0byByZWFkIHhscyBhbmQgeGxzeCBmaWxlcyBpbnRvIFIgd2l0aG91dCBkZXBlbmRlbmNpZXMgb24gZXh0ZXJuYWwgc29mdHdhcmUuDQojIGRwbHlyICAgICAgIGZvciBkYXRhIG1hbmlwdWxhdGlvbiwgcHJvdmlkaW5nIGEgY29uc2lzdGVudCBzZXQgb2YgdmVyYnMgdGhhdCBoZWxwIHlvdSBzb2x2ZSB0aGUgbW9zdCBjb21tb24gZGF0YSBtYW5pcHVsYXRpb24gY2hhbGxlbmdlcy4NCiMgbHVicmlkYXRlICAgZm9yIHdvcmtpbmcgd2l0aCBkYXRlcyBhbmQgdGltZXMgaW4gUi4NCiMgaG1zICAgICAgICAgZm9yIHN0b3JpbmcgdGltZS1vZi1kYXkgdmFsdWVzIGFuZCBpbnRlcmZhY2luZyB0aGVzZSB2YWx1ZXMgd2l0aCBiYXNlIFIncyBkYXRlLXRpbWUgY2xhc3Nlcy4NCiMgb3Blbnhsc3ggICAgZm9yIHJlYWRpbmcgZnJvbSBhbmQgd3JpdGluZyB0byBNaWNyb3NvZnQgRXhjZWwgLnhsc3ggZmlsZXMuIEl0IHByb3ZpZGVzIG1vcmUgZnVuY3Rpb25hbGl0eSB0aGFuIGp1c3QgaGFuZGxpbmcgZGF0YTsgaXQgYWxzbyBhbGxvd3MgeW91IHRvIG1vZGlmeSB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIEV4Y2VsIGZpbGUgaXRzZWxmLg0KIyB3cml0ZXhsICAgICBmb3IgYSBmYXN0IGFuZCBwb3J0YWJsZSB3YXkgdG8gd3JpdGUgZGF0YSBmcmFtZXMgdG8gRXhjZWwgLnhsc3ggZmlsZXMsIGZvY3VzaW5nIHNvbGVseSBvbiB3cml0aW5nIGRhdGEgd2l0aG91dCBhbnkgZGVwZW5kZW5jaWVzLg0KIyBybWFya2Rvd24gICBmb3IgZHluYW1pYyByZXBvcnQgZ2VuZXJhdGlvbiBmcm9tIFIuIEl0IGludGVncmF0ZXMgdGhlIGNvcmUgc3ludGF4IG9mIG1hcmtkb3duIChhIHNpbXBsZSBtYXJrdXAgbGFuZ3VhZ2UpIHdpdGggUiBjb2RlLCBhbGxvd2luZyBmb3IgdGhlIGF1dG9tYXRpYyB1cGRhdGUgb2YgcmVwb3J0cyB0byByZWZsZWN0IGRhdGEgY2hhbmdlcyBhbmQgYW5hbHlzaXMgdXBkYXRlcy4NCiMga25pdHIgICAgICAgZm9yIHVzaW5nIGZ1bmN0aW9ucyBzdWNoIGFzIGthYmxlKCkgdG8gZm9ybWF0IGRhdGFmcmFtZXMgYXMgbWFya2Rvd24gdGFibGVzLiANCiMga2FibGVFeHRyYSAgZm9yIGVuaGFuY2VkIGZ1bmN0aW9uYWxpdHkgZm9yIHN0eWxpbmcgdGFibGVzIHN1Y2ggYXMgZGlzcGxheWluZyBjb2x1bW5zIGV2ZW5seQ0KIyBnZ25ld3NjYWxlICBmb3IgY3JlYXRpbmcgbmV3IGNvbG9yIHBhbGV0dGVzIGFuZCBtb3JlDQojIGdyaWRFeHRyYQ0KDQojIENoZWNrIHdoaWNoIGxpYnJhcmllcyBhcmUgbm90IGluc3RhbGxlZA0KaW5zdGFsbGVkX2xpYnMgPC0gcm93bmFtZXMoaW5zdGFsbGVkLnBhY2thZ2VzKCkpDQpsaWJyYXJpZXNfdG9faW5zdGFsbCA8LSByZXF1aXJlZF9saWJyYXJpZXNbIXJlcXVpcmVkX2xpYnJhcmllcyAlaW4lIGluc3RhbGxlZF9saWJzXQ0KDQojIEluc3RhbGwgbWlzc2luZyBsaWJyYXJpZXMNCmlmKGxlbmd0aChsaWJyYXJpZXNfdG9faW5zdGFsbCkgPiAwKSB7DQogIGluc3RhbGwucGFja2FnZXMobGlicmFyaWVzX3RvX2luc3RhbGwpDQp9DQoNCiMgTG9hZCBhbGwgcmVxdWlyZWQgbGlicmFyaWVzDQpsYXBwbHkocmVxdWlyZWRfbGlicmFyaWVzLCBsaWJyYXJ5LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpDQpgYGANCg0KYGBge3IgbG9hZCBLREZfUl9NYXJrZG93biwgZXZhbD1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0KIyBMb2FkIHRoZSBzYXZlZCB3b3Jrc3BhY2UNCndvcmtzcGFjZV9maWxlIDwtICJDOi9Vc2Vycy9rZW5kci9PbmVEcml2ZS9Eb2N1bWVudHMvRGF0YSBBbmFseXRpY3MvS2VuRG9lc0ZpdG5lc3MvV29ya3NwYWNlL0tERiBXb3Jrc3BhY2UuUkRhdGEiDQppZiAoZmlsZS5leGlzdHMod29ya3NwYWNlX2ZpbGUpKSB7DQogIGxvYWQod29ya3NwYWNlX2ZpbGUpDQogIGNhdCgiV29ya3NwYWNlIGxvYWRlZCBzdWNjZXNzZnVsbHkuXG4iKQ0KICAjIENoZWNrIGlmIGEgc3BlY2lmaWMgb2JqZWN0IGV4aXN0cyBpbiB0aGUgbG9hZGVkIHdvcmtzcGFjZQ0KICBpZiAoZXhpc3RzKCJuYW1lc19zdWJzZXRfc3RyZW5ndGhfc3RhbmRhcmRzX2dzdWJfZGYiKSkgew0KICAgIGNhdCgiT2JqZWN0ICduYW1lc19zdWJzZXRfc3RyZW5ndGhfc3RhbmRhcmRzX2dzdWJfZGYnIGxvYWRlZCBzdWNjZXNzZnVsbHkuXG4iKQ0KICB9IGVsc2Ugew0KICAgIGNhdCgiT2JqZWN0ICduYW1lc19zdWJzZXRfc3RyZW5ndGhfc3RhbmRhcmRzX2dzdWJfZGYnIGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuXG4iKQ0KICB9DQp9IGVsc2Ugew0KICBjYXQoIldvcmtzcGFjZSBmaWxlIGRvZXMgbm90IGV4aXN0IGF0IHRoZSBzcGVjaWZpZWQgcGF0aDogIiwgd29ya3NwYWNlX2ZpbGUsICJcbiIpDQp9DQoNCmBgYA0KDQojIFRBQkxFIE9GIENPTlRFTlRTIA0KVXRpbGl6ZSB0aGUgVGFibGUgb2YgQ29udGVudHMgKFRPQykgbWVudSBvbiB0aGUgbGVmdCB0byBzY3JvbGwgdGhyb3VnaCB0aGUgZGlmZmVyZW50IHNlY3Rpb25zIGFuZCBoZWxwIG5hdmlnYXRlIHRoaXMgcmVwb3J0LiBZb3UgY2FuIGNsaWNrIG9uIHRoZSB0aXRsZSB0byBnbyBkaXJlY3RseSB0byB0aGUgc2VjdGlvbi4NCg0KKipDb25zaWRlcmF0aW9uczoqKiANCg0KVGVybWlub2xvZ3kgLSBUaGUgdGVybXMgYWN0aXZpdHksIHdvcmtvdXQsIGFuZCBleGVyY2lzZSBtYXkgYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgaW4gdGhpcyBjb250ZXh0LCBldmVuIHRob3VnaCB0aGV5IGhhdmUgZGlzdGluY3QgbWVhbmluZ3MuDQoNCkRhdGEgQXNzdW1wdGlvbnMgLSBUaGUgZGF0YSB1c2VkIGZvciBhbmFseXNlcyBhc3N1bWVzIGVhY2ggc2V0IG9mIGV4ZXJjaXNlIGlzIHBlcmZvcm1lZCB0byBSZXAgTWF4IChSTSksIHdoaWNoIGlzbid0IGFsd2F5cyB0aGUgY2FzZSwgcGFydGljdWxhcmx5IGlmIHRoZSBpbmRpdmlkdWFsIGlzbid0IGFpbWluZyB0byBwZXJmb3JtIHRoZSBzZXQgdG8gUk0uIEFzc3VtaW5nIGVhY2ggc2V0IG9mIGV4ZXJjaXNlIGlzIHBlcmZvcm1lZCB0byBSZXAgTWF4IGhlbHBzIHN0YW5kYXJkaXplIGRhdGEgYW5kIHByb3ZpZGUgY2xlYXIgaW5zaWdodHMgaW50byBtYXhpbWFsIHN0cmVuZ3RoLCB3aGljaCBpcyBiZW5lZmljaWFsIGZvciBiZW5jaG1hcmtpbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzLiBIb3dldmVyLCBpdCBjYW4gYWxzbyBsZWFkIHRvIGluYWNjdXJhY2llcywgcG90ZW50aWFsIG92ZXJ0cmFpbmluZywgYW5kIG1pc2xlYWRpbmcgZGF0YSBpZiBub3QgYWxsIGV4ZXJjaXNlcyBhcmUgcGVyZm9ybWVkIHRvIGZhaWx1cmUuIEJhbGFuY2luZyB0aGUgdXNlIG9mIDFSTSBhc3N1bXB0aW9ucyB3aXRoIHJlYWxpc3RpYyB0cmFpbmluZyBwcmFjdGljZXMgaXMgZXNzZW50aWFsIGZvciBhY2N1cmF0ZSBwZXJmb3JtYW5jZSBhc3Nlc3NtZW50IGFuZCBlZmZlY3RpdmUgdHJhaW5pbmcgcHJvZ3JhbW1pbmcuDQoNCiMgU1RBVFMgVE8gU1RBTkRBUkRTDQoNCioqSW50ZWdyYXRpbmcgUGVyZm9ybWFuY2UgTWV0cmljcyB3aXRoIE1hcmsgUmlwcGV0b2UgU3RyZW5ndGggU3RhbmRhcmRzKiogDQoNClBlcmZvcm1hbmNlIG1lYXN1cmVzIGFyZSBldmFsdWF0ZWQgdG8gbWF0Y2ggc3RhbmRhcmRzLiBUaGlzIHNlY3Rpb24gY29tYmluZXMgcHJhY3RpY2FsIHdvcmtvdXQgZGF0YSBhbmFseXNpcyB3aXRoIE1hcmsgUmlwcGV0b2UncyBTdHJlbmd0aCBTdGFuZGFyZHMgKHNlZSBUT0MgTWVudSkuIFRoZSBzdGFuZGFyZHMgYXJlIGVzc2VudGlhbCBmb3IgZXZhbHVhdGluZyBhbmQgY29udGV4dHVhbGl6aW5nIGluZGl2aWR1YWwgZml0bmVzcyBhY2hpZXZlbWVudHMgYWdhaW5zdCBzdGFuZGFyZGl6ZWQgY3JpdGVyaWEuDQoNCkZvciBhIGhpZ2hlciBxdWFsaXR5IG9mIHBlcnNvbmFsIHBlcmZvcm1hbmNlIGNvbXBhcmlzb24sIHdlIGRlZmluZSBzcGVjaWZpYyBjcml0ZXJpYSB0byBtYXRjaCB0aGUgc3RhbmRhcmRzIHByZXNlbnRlZCBieSBNYXJrLiBTaG91bGQgd2UgY2hvb3NlLCB3ZSBjYW4gc3BlY2lmeSBvdXIgY3JpdGVyaWEgZm9yIEZsYXQgQmVuY2ggRHVtYmJlbGwgQ2hlc3QgUHJlc3Mgb3IgSW5jbGluZSBCZW5jaCBEdW1iYmVsbCBDaGVzdCBQcmVzcywgZWFjaCBsaWtlbHkgcmVxdWlyaW5nIGRpZmZlcmVudCB3ZWlnaHRzIGFuZCBudW1iZXJzIG9mIHJlcHMgZm9yIGV4ZWN1dGlvbi4gVG8gbm90ZSBNYXJrIFJpcHBldG9lJ3MgdHJhaW5pbmcgdXRpbGl6ZXMgdGhlIGJhcmJlbGwgYXMgdGhlIGluc3RydW1lbnQgZm9yIGdyb3d0aC4gQnkgZXhwbGFpbmluZyBpbiBkZXRhaWwgdGhlIEJlbmNoIFByZXNzIGluIGhpcyBTdGFydGluZyBTdHJlbmd0aCBib29rIFteMV0sIHdlIGtub3cgdGhlIHN0cmVuZ3RoIHN0YW5kYXJkIGlzIG1lYXN1cmVkIHZpYSB0aGUgZmxhdCBiZW5jaC4gVGhlcmVmb3JlLCB3ZSBzcGVjaWZ5IEZsYXQgQmVuY2ggQmFyYmVsbCBDaGVzdCBQcmVzcyBpbiBvdXIgY3JpdGVyaWEgdG8gY29tcGFyZSB3aXRoIE1hcmsgUmlwcGV0b2UncyAxUk0gTWFsZSBCZW5jaCBQcmVzcyBTdGFuZGFyZHMuDQoNCiMjIDFSTSBUYWJsZSAtIEF2ZyBMMlcgJiBBVEggDQoNCi0gVGhlIGZvbGxvd2luZyB0YWJsZSByZXBvcnRzIHRoZSBhdmVyYWdlIG9uZS1yZXBldGl0aW9uIG1heGltdW0gKDFSTSkgZm9yIGVhY2ggaW5kaXZpZHVhbCBhY3Jvc3MgZWFjaCBzcGVjaWZpZWQgZXhlcmNpc2UgKCJTZWxlY3RlZCBDcml0ZXJpYSIpIG92ZXIgdGhlIGxhc3QgdHdvIHdlZWtzIChMMlcpLiBUaGUgZGF0YSBmb3IgdGhlIGxhc3QgdHdvIHdlZWtzIHNlcnZlcyBhcyBhIGJlbmNobWFyayBmb3IgdGhlIG5leHQgd29ya291dC4gQXMgdGhlIHNheWluZyBnb2VzLCAiWW91J3JlIG9ubHkgYXMgZ29vZCBhcyB5b3VyIGxhc3QuIg0KDQotIFRoZSB0YWJsZSBhbHNvIHJlcG9ydHMgaGlnaGVzdCAxUk0gb3ZlciBhbGwgdGltZSAoQVRIKSBmb3IgZWFjaCBzZWxlY3RlZCBjcml0ZXJpb24sIGFjY29tcGFuaWVkIGJ5IHRoZSBsYXN0IGRhdGUgdGhlIGhpZ2hlc3QgMVJNIHdhcyBhY2hpZXZlZC4NCg0KLSBUaGUgMVJNIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gd2VpZ2h0IGV4ZWN1dGVkIHBlciBzZXQgYW5kIHRoZSBudW1iZXIgb2YgcmVwcywgdXNpbmcgdGhlIDFSTSBDb252ZXJzaW9uIFRhYmxlW14yXS4NCg0KLSBEYXRhIGlzIGRlcml2ZWQgZnJvbSBtZWFzdXJlcyBlbnRlcmVkIGluIHRoZSAiS2VuIERvZXMgRml0bmVzcy54bHNtIFdvcmtib29rW14zXS4iDQoNCi0gQWxsIGNhbGN1bGF0aW9ucyBhc3N1bWUgdGhlIHN0YW5kYXJkIGJhcmJlbGwgKE9seW1waWMgYmFyYmVsbCkgd2VpZ2h0IG9mIDQ1IHBvdW5kcyAoMjAuNCBrZykuDQoNCktlZXAgaW4gbWluZCB0aGVyZSBhcmUgbWFueSB2YXJpYWJsZXMgYWZmZWN0aW5nIHBlcmZvcm1hbmNlLiBPbmUgb2YgdGhlc2UgdmFyaWFibGVzIGluY2x1ZGVzIGdyaXAgKHdpZGUsIGFsdGVybmF0aW5nLCBvdmVyaGFuZCwgZXRjLikuIE9uZSBpbmRpdmlkdWFsIG1heSB1c2UgYWx0ZXJuYXRpbmcgZ3JpcHMgKGxlZnQgdW5kZXJoYW5kL3JpZ2h0IG92ZXJoYW5kLCBvciB2aWNlLXZlcnNhKSB3aGVuIHBlcmZvcm1pbmcgZGVhZGxpZnRzIHRvIG1heGltaXplIHdlaWdodCBleGVjdXRpb24uIEFub3RoZXIgaW5kaXZpZHVhbCBtaWdodCB1dGlsaXplIGFuIG92ZXJoYW5kIGdyaXAuIFNvbWVvbmUgZWxzZSBtYXkgcGVyZm9ybSBhIGNvbWJpbmF0aW9uIG9mIGFsdGVybmF0aW5nIGdyaXAgYW5kIG92ZXJoYW5kIGdyaXAuIFRoZSBmb2xsb3dpbmcgZGF0YXNldHMgYW5kIGZpZ3VyZXMgZG8gbm90IGFjY291bnQgZm9yIHRoZXNlIGRpZmZlcmVuY2VzLg0KDQojIyBJbmRpdmlkdWFsIFBlcmZvcm1hbmNlIFRhYmxlcw0KDQpgYGB7ciBpbmRpdmlkdWFsX3RhYmxlX3BlcmZvcm1hbmNlX3RvX21hcmtfcmlwcGV0b2Vfc3RhbmRhcmRzLCBldmFsPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggdW5pcXVlIG5hbWUgYW5kIGdlbmVyYXRlIGEgdGFibGUgZm9yIGVhY2gNCmZvciAoaSBpbiBzZXFfYWxvbmcodW5pcXVlKGRpc3BsYXlfcGVyZm9ybWFuY2Vfb25fbWFya19yaXBwZXRvZV9zdGFuZGFyZHMkTmFtZSkpKSB7DQogIA0KICBuYW1lIDwtIHVuaXF1ZShkaXNwbGF5X3BlcmZvcm1hbmNlX29uX21hcmtfcmlwcGV0b2Vfc3RhbmRhcmRzJE5hbWUpW2ldDQogIA0KICAjIEFkZCB0aGlzIGNvbmRpdGlvbmFsIGNoZWNrIHRvIHByb2Nlc3Mgb25seSAiQWxleCIsICJLZW5kcmljayIsIG9yICJKb3NoIg0KICAgaWYgKG5hbWUgJWluJSBjKCJBbGV4IiwgIktlbmRyaWNrIiwgIkpvc2giKSkgew0KICANCiAgIyBBZGQgdGhpcyBjb25kaXRpb25hbCBjaGVjayB0byBwcm9jZXNzIG9ubHkgIkFsZXgiIG9yIG90aGVyLg0KICAjIGlmIChuYW1lID09ICJBbGV4Iikgew0KICANCiAgICAjIEZpbHRlciB0aGUgcmVzdWx0cyBmb3IgdGhlIGN1cnJlbnQgbmFtZQ0KICAgIGluZGl2aWR1YWxfcGVyZm9ybWFuY2UgPC0gZGlzcGxheV9wZXJmb3JtYW5jZV9vbl9tYXJrX3JpcHBldG9lX3N0YW5kYXJkcyAlPiUNCiAgICAgIGZpbHRlcihOYW1lID09IG5hbWUpICU+JQ0KICAgICAgc2VsZWN0KC1OYW1lKSAgIyBSZW1vdmUgdGhlICJOYW1lIiBjb2x1bW4gZm9yIHRoZSB0YWJsZQ0KICAgIA0KICAgICMgUHJpbnQgdGhlIHNlY3Rpb24gaGVhZGVyDQogICAgY2F0KHBhc3RlMCgiXG5cbjxoND4iLCBuYW1lLCAiIC0gMVJNIFBlcmZvcm1hbmNlIDwvaDQ+XG5cbiIpKQ0KICAgIA0KICAgICMgVXNlIGthYmxlIGFuZCBrYWJsZUV4dHJhIGZvciBmb3JtYXR0aW5nIG9mIHRhYmxlIG91dHB1dA0KICAgIGthYmxlKGluZGl2aWR1YWxfcGVyZm9ybWFuY2UsICJodG1sIiwgYWxpZ24gPSAnbCcpICU+JSANCiAgICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUsIA0KICAgICAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFRSVUUpICU+JQ0KICAgICAgY29sdW1uX3NwZWMoMTpuY29sKGluZGl2aWR1YWxfcGVyZm9ybWFuY2UpLCB3aWR0aCA9ICJhdXRvIikgJT4lDQogICAgICBwcmludCgpICAjIFByaW50IGVhY2ggdGFibGUNCiAgICANCiAgICBjYXQoIlxuXG4iKQ0KICB9DQp9DQoNCmBgYA0KDQojIyAxUk0gUGxvdHMgLSBQZXJmb3JtYW5jZSBPdmVyIFN0YW5kYXJkcyANClBlcmZvcm1hbmNlIGlzIHBsb3R0ZWQgb3ZlciBNYXJrIFJpcHBldG9lJ3MgU3RyZW5ndGggU3RhbmRhcmRzLg0KDQpTb21lIGNvbnNpZGVyYXRpb25zIGZvciB0aGUgZm9sbG93aW5nIHBsb3RzOg0KDQotIEF2ZXJhZ2UgMVJNIGZvciBlYWNoIGluZGl2aWR1YWwgaXMgYmFzZWQgb24gZGF0YSBmcm9tIHRoZSBsYXN0IDIgd2Vla3MgKEwyVykuIEFzIHByZXNlbnRlZCBpbiB0aGUgMVJNIFRhYmxlIGFib3ZlLCBkYXRlIHJhbmdlcyBiZXR3ZWVuIGVhY2ggaW5kaXZpZHVhbCBkaWZmZXIsIHJhbmdpbmcgZnJvbSBhIGZldyB3ZWVrcyB0byBzZXZlcmFsIG1vbnRocyBvciBldmVuIHllYXJzLiBEZXNwaXRlIHRoZXNlIGRpZmZlcmVuY2VzLCB0aGlzIHBsb3QgaXMgc3RpbGwgYmVuZWZpY2lhbCBmb3IgY29tcGFyaW5nIHBlcmZvcm1hbmNlIGFtb25nIGluZGl2aWR1YWxzLCBmb3N0ZXJpbmcgZnJpZW5kbHkgY29tcGV0aXRpb24sIGFuZCBtb3RpdmF0aW5nIGFjdGlvbiB0b3dhcmQgaGlnaGVyIHBlcmZvcm1hbmNlLg0KDQotIEhpZ2hlc3QgMVJNIChBVEggLSBBbGwgVGltZSBIaWdocykgZm9yIGVhY2ggaW5kaXZpZHVhbCBpcyBiYXNlZCBvbiBkYXRhIGZyb20gYWxsIGVudHJpZXMuDQoNCi0gQXZlcmFnZSBCb2R5d2VpZ2h0IHJlcHJlc2VudHMgZGF0YSBmcm9tIHRoZSBsYXN0IDIgd2Vla3Mgb2YgZW50cmllcyBmb3IgZWFjaCBpbmRpdmlkdWFsLiBUaGUgZm9sbG93aW5nIHBsb3RzIGFuZCBDYXRlZ29yeSBMZXZlbHMgdXNlIEF2ZXJhZ2UgQm9keXdlaWdodCBmb3IgYm90aCBBdmVyYWdlIDFSTSBMMlcgYW5kIEFUSCBleGVjdXRpb25zLiBTZXBhcmF0ZSBjYWxjdWxhdGlvbnMgYXJlIHJlcXVpcmVkIHRvIG9idGFpbiBCb2R5d2VpZ2h0IGF0IHRoZSB0aW1lIHdoZW4gQXZlcmFnZSAxUk0gTDJXIHdhcyBleGVjdXRlZCBhbmQgQm9keXdlaWdodCB3aGVuIEFUSCAxUk0gd2FzIGV4ZWN1dGVkLg0KDQotIFRoZSBkYXRlIGFuZCBkYXRlIHJhbmdlcyBmb3IgQXZlcmFnZSBCb2R5d2VpZ2h0IChsYnMpIGFuZCAxUk0gc3RhdGlzdGljcyBtYXkgbm90IGFsaWduLiBGb3IgZXhhbXBsZTogDQogICAgLSBEYXRlIFJhbmdlIGZvciBBdmVyYWdlIDFSTSBMMlc6IDIwMjMtMTAtMjcgdG8gMjAyMy0xMS0wOQkJDQogICAgLSBEYXRlIGZvciBBVEggMVJNOiAyMDIzLTEwLTE4CQ0KICAgIC0gRGF0ZSBSYW5nZSBmb3IgQXZlcmFnZSBCb2R5d2VpZ2h0IEwyVzogMjAyNC0wNS0yNCB0byAyMDI0LTA2LTA2DQogICAgLSBGdXJ0aGVyIGNhbGN1bGF0aW9ucyBhcmUgcmVxdWlyZWQgdG8gYWxpZ24gdGhlIGRhdGUgcmFuZ2VzIGJldHdlZW4gYm9keXdlaWdodCBhbmQgcGVyZm9ybWFuY2UsIGFsbG93aW5nIGdyZWF0ZXIgcmVsaWFiaWxpdHkgaW4gdGhlIDFSTSB3ZWlnaHQgZXhlY3V0aW9uLXRvLWJvZHl3ZWlnaHQgcmF0aW8uDQoNCiMjIEwyVyAmIEFUSCAtIFNpZGUgQnkgU2lkZSANClBlcmZvcm1hbmNlIG1lYXN1cmVzIGZvciBBdmVyYWdlIDFSTSBMYXN0IDIgV2Vla3MgKEwyVykgYW5kIEhpZ2hlc3QgMVJNIEFsbCBUaW1lIChBVEgpIGFyZSBtZXJnZWQgaW50byBvbmUgcGxvdCBmb3Igc2lkZS1ieS1zaWRlIGNvbXBhcmlzb24uIFRoaXMgdmlzdWFsaXphdGlvbiBoZWxwcyByZWFjaCBoaWdoZXIgcGVyZm9ybWFuY2UgYnkgaGlnaGxpZ2h0aW5nIHJlY2VudCBwZXJmb3JtYW5jZSBhbmQgaWRlbnRpZnlpbmcgcGVyc29uYWwgYmVzdHMsIHRoZXJlYnkgZm9zdGVyaW5nIGhlYWx0aHkgY29tcGV0aXRpb24gYW5kIG1vdGl2YXRpbmcgY29uc2lzdGVudCBwcm9ncmVzcy4NCg0KVGhpcyBjb21iaW5lZCBwbG90IGFsbG93cyBmb3IgYW4gZWFzeSBjb21wYXJpc29uIG9mIHJlY2VudCBwZXJmb3JtYW5jZSBhbmQgYWxsLXRpbWUgYmVzdHMsIHByb3ZpZGluZyBhIGNsZWFyIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiBlYWNoIGluZGl2aWR1YWwncyBwcm9ncmVzcyBhbmQgcG90ZW50aWFsLiBVbmRlcnN0YW5kaW5nIHRoZXNlIG1ldHJpY3MgY2FuIGhlbHAgaWRlbnRpZnkgYXJlYXMgZm9yIGltcHJvdmVtZW50IGFuZCBzZXQgZ29hbHMgdG8gc3VycGFzcyB0aGVpciBwZXJzb25hbCBiZXN0cywgdWx0aW1hdGVseSBsZXZlbGluZyB1cCBwZXJmb3JtYW5jZS4NCg0KVXNpbmcgQXZlcmFnZSAxUk0gTGFzdCAyIFdlZWtzIChMMlcpIGZvciB0cmFpbmluZyBwdXJwb3NlcyBpcyBtb3JlIGVmZmVjdGl2ZSB0aGFuIGNvbXBhcmluZyBIaWdoZXN0IDFSTSBMYXN0IDIgV2Vla3MgdG8gMVJNIEFsbCBUaW1lIEhpZ2ggKEFUSCkuIFRoaXMgaXMgYmVjYXVzZSB0aGUgYXZlcmFnZSAxUk0gb3ZlciB0aGUgbGFzdCB0d28gd2Vla3MgcHJvdmlkZXMgYSBtb3JlIGNvbnNpc3RlbnQgYW5kIHJlYWxpc3RpYyBtZWFzdXJlIG9mIGN1cnJlbnQgc3RyZW5ndGggbGV2ZWxzLCB3aGljaCBjYW4gYmUgaW5mbHVlbmNlZCBieSB2YXJpb3VzIGZhY3RvcnMgc3VjaCBhcyBmYXRpZ3VlLCByZWNvdmVyeSwgYW5kIGRhaWx5IHBlcmZvcm1hbmNlIHZhcmlhYmlsaXR5LiBSZWx5aW5nIHNvbGVseSBvbiB0aGUgaGlnaGVzdCAxUk0gbWF5IG5vdCBhY2N1cmF0ZWx5IHJlZmxlY3QgdHJ1ZSBwZXJmb3JtYW5jZSBjYXBhYmlsaXR5IGFuZCBjYW4gbGVhZCB0byB1bnJlYWxpc3RpYyB0cmFpbmluZyBsb2FkcyBhbmQgcG90ZW50aWFsIG92ZXJ0cmFpbmluZy4gDQoNCmBgYHtyIGF2Z18xcm1fX2wyd19hbmRfYXRoXzFybV9vbl9zdGFuZGFyZHMsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQ0KDQojIEVuc3VyZSB0aGUgbmVjZXNzYXJ5IGxpYnJhcmllcyBhcmUgbG9hZGVkDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIERlZmluZSBjb2xvciBwYWxldHRlcw0KY29sb3JfcGFsZXR0ZV9sMncgPC0gYygiQWxleCAtIEF2ZyBMMlciID0gIiMxZjc3YjQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIktlbmRyaWNrIC0gQXZnIEwyVyIgPSAiI2ZmN2YwZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiTHVjaWVuIC0gQXZnIEwyVyIgPSAiIzk0NjdiZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiSm9zaCAtIEF2ZyBMMlciID0gIiM4YzU2NGIiKQ0KY29sb3JfcGFsZXR0ZV9hdGggPC0gYygiQWxleCAtIEFUSCIgPSAiIzJjYTAyYyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiS2VuZHJpY2sgLSBBVEgiID0gIiNkNjI3MjgiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkx1Y2llbiAtIEFUSCIgPSAiI2UzNzdjMiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiSm9zaCAtIEFUSCIgPSAiIzdmN2Y3ZiIpDQoNCiMgTG9hZCB0aGUgc3RhbmRhcmRzIHRhYmxlcyBhbmQgc3RvcmUgdGhlbSBpbiBhIGxpc3QNCnN0YW5kYXJkc190YWJsZXMgPC0gbGlzdCgNCiAgIm1hbGVfYmVuY2hfcHJlc3Nfc3RkXzFybV9ieV9ib2R5d2VpZ2h0X21hcmtfcmlwcGV0b2UiID0gbWFsZV9iZW5jaF9wcmVzc19zdGRfMXJtX2J5X2JvZHl3ZWlnaHRfbWFya19yaXBwZXRvZSwNCiAgIm1hbGVfZGVhZGxpZnRfc3RkXzFybV9ieV9ib2R5d2VpZ2h0X21hcmtfcmlwcGV0b2UiID0gbWFsZV9kZWFkbGlmdF9zdGRfMXJtX2J5X2JvZHl3ZWlnaHRfbWFya19yaXBwZXRvZSwNCiAgIm1hbGVfcHJlc3Nfc3RkXzFybV9ieV9ib2R5d2VpZ2h0X21hcmtfcmlwcGV0b2UiID0gbWFsZV9wcmVzc19zdGRfMXJtX2J5X2JvZHl3ZWlnaHRfbWFya19yaXBwZXRvZSwNCiAgIm1hbGVfc3F1YXRfc3RkXzFybV9ieV9ib2R5d2VpZ2h0X21hcmtfcmlwcGV0b2UiID0gbWFsZV9zcXVhdF9zdGRfMXJtX2J5X2JvZHl3ZWlnaHRfbWFya19yaXBwZXRvZQ0KKQ0KDQojIEZ1bmN0aW9uIHRvIGZpbmQgY2F0ZWdvcnkgbGV2ZWwNCmZpbmRfY2F0ZWdvcnlfbGV2ZWwgPC0gZnVuY3Rpb24od2VpZ2h0LCBidywgc3RhbmRhcmRzX3RhYmxlKSB7DQogIHN0YW5kYXJkcyA8LSBzdGFuZGFyZHNfdGFibGVzW1tzdGFuZGFyZHNfdGFibGVdXQ0KICBpZiAoaXMubnVsbChzdGFuZGFyZHMpKSB7DQogICAgc3RvcCgiU3RhbmRhcmRzIHRhYmxlIG5vdCBmb3VuZC4iKQ0KICB9DQogIA0KICByb3VuZGVkX2J3IDwtIHN0YW5kYXJkcyAlPiUgZmlsdGVyKGBCb2R5d2VpZ2h0YCA+PSBidykgJT4lIHNsaWNlKDEpICU+JSBwdWxsKGBCb2R5d2VpZ2h0YCkNCiAgY2F0ZWdvcmllcyA8LSBzdGFuZGFyZHMgJT4lIGZpbHRlcihgQm9keXdlaWdodGAgPT0gcm91bmRlZF9idykNCiAgDQogIGNhdGVnb3J5IDwtIGlmZWxzZSh3ZWlnaHQgPCBjYXRlZ29yaWVzJGBDYXQgIElgLCAiQmVsb3cgQ2F0LiBJIiwNCiAgICAgICAgICAgICAgIGlmZWxzZSh3ZWlnaHQgPCBjYXRlZ29yaWVzJGBDYXQgIElJYCwgIkNhdC4gSSIsDQogICAgICAgICAgICAgICBpZmVsc2Uod2VpZ2h0IDwgY2F0ZWdvcmllcyRgQ2F0ICBJSUlgLCAiQ2F0LiBJSSIsDQogICAgICAgICAgICAgICBpZmVsc2Uod2VpZ2h0IDwgY2F0ZWdvcmllcyRgQ2F0ICBJVmAsICJDYXQuIElJSSIsDQogICAgICAgICAgICAgICBpZmVsc2Uod2VpZ2h0IDwgY2F0ZWdvcmllcyRgQ2F0ICBWYCwgIkNhdC4gSVYiLCAiQ2F0LiBWIikpKSkpDQogIHJldHVybihjYXRlZ29yeSkNCn0NCg0KIyBEZWZpbmUgYSBmdW5jdGlvbiB0byBhZGQgZGF0YSBwb2ludHMgdG8gZXhpc3RpbmcgcGxvdHMNCmFkZF9ib2R5d2VpZ2h0X2FuZF8xcm1fdG9fcGxvdCA8LSBmdW5jdGlvbihleGlzdGluZ19wbG90LCBwZXJmb3JtYW5jZV9kYXRhLCB0YWJsZV9hdmdfYm9keXdlaWdodHNfbGFzdF8yd2ssIHN0YW5kYXJkc190YWJsZSkgew0KICAjIEZpbHRlciBhbmQgam9pbiB0aGUgZGF0YQ0KICBjb21iaW5lZF9kYXRhIDwtIHBlcmZvcm1hbmNlX2RhdGEgJT4lDQogICAgaW5uZXJfam9pbih0YWJsZV9hdmdfYm9keXdlaWdodHNfbGFzdF8yd2ssIGJ5ID0gIk5hbWUiKSAlPiUNCiAgICBtdXRhdGUoYEF2ZXJhZ2UgMVJNIChsYnMpYCA9IGFzLm51bWVyaWMoYEF2ZXJhZ2UgMVJNIChsYnMpYCksDQogICAgICAgICAgIGBIaWdoZXN0IDFSTSBBbGwgVGltZSAobGJzKWAgPSBhcy5udW1lcmljKGBIaWdoZXN0IDFSTSBBbGwgVGltZSAobGJzKWApKSAlPiUNCiAgICBmaWx0ZXIoIWlzLm5hKGBBdmVyYWdlIDFSTSAobGJzKWApICYgYEF2ZXJhZ2UgMVJNIChsYnMpYCAhPSAiTm8gZGF0YSBhdmFpbGFibGUiKSAlPiUNCiAgICBtdXRhdGUoTmFtZV9BdmdfTDJXID0gcGFzdGUoTmFtZSwgIi0gQXZnIEwyVyIpLCANCiAgICAgICAgICAgTmFtZV9BVEggPSBwYXN0ZShOYW1lLCAiLSBBVEgiKSwNCiAgICAgICAgICAgQ2F0ZWdvcnlfTGV2ZWxfTDJXID0gbWFwcGx5KGZpbmRfY2F0ZWdvcnlfbGV2ZWwsIGBBdmVyYWdlIDFSTSAobGJzKWAsIGBBdmVyYWdlX0JvZHl3ZWlnaHRfTGFzdF8yV2tgLCBNb3JlQXJncyA9IGxpc3Qoc3RhbmRhcmRzX3RhYmxlID0gc3RhbmRhcmRzX3RhYmxlKSksDQogICAgICAgICAgIENhdGVnb3J5X0xldmVsX0FUSCA9IG1hcHBseShmaW5kX2NhdGVnb3J5X2xldmVsLCBgSGlnaGVzdCAxUk0gQWxsIFRpbWUgKGxicylgLCBgQXZlcmFnZV9Cb2R5d2VpZ2h0X0xhc3RfMldrYCwgTW9yZUFyZ3MgPSBsaXN0KHN0YW5kYXJkc190YWJsZSA9IHN0YW5kYXJkc190YWJsZSkpKQ0KDQogICMgQWRkIHBvaW50cyB0byB0aGUgZXhpc3RpbmcgcGxvdA0KICB1cGRhdGVkX3Bsb3QgPC0gZXhpc3RpbmdfcGxvdCArDQogICAgZ2VvbV9wb2ludChkYXRhID0gY29tYmluZWRfZGF0YSwgYWVzKHggPSBBdmVyYWdlX0JvZHl3ZWlnaHRfTGFzdF8yV2ssIHkgPSBgQXZlcmFnZSAxUk0gKGxicylgLCBjb2xvciA9IE5hbWVfQXZnX0wyVywgZmlsbCA9IE5hbWVfQXZnX0wyVyksIA0KICAgICAgICAgICAgICAgc2l6ZSA9IDQsIHNoYXBlID0gMjEsIGNvbG9yID0gImJsYWNrIikgKw0KICAgIGdlb21fcG9pbnQoZGF0YSA9IGNvbWJpbmVkX2RhdGEsIGFlcyh4ID0gQXZlcmFnZV9Cb2R5d2VpZ2h0X0xhc3RfMldrLCB5ID0gYEhpZ2hlc3QgMVJNIEFsbCBUaW1lIChsYnMpYCwgY29sb3IgPSBOYW1lX0FUSCwgZmlsbCA9IE5hbWVfQVRIKSwgDQogICAgICAgICAgICAgICBzaXplID0gNCwgc2hhcGUgPSAyNCwgY29sb3IgPSAiYmxhY2siKSArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoY29sb3JfcGFsZXR0ZV9sMncsIGNvbG9yX3BhbGV0dGVfYXRoKSkgKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoY29sb3JfcGFsZXR0ZV9sMncsIGNvbG9yX3BhbGV0dGVfYXRoKSkgKw0KICAgIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvcmRlciA9IDEpLCBmaWxsID0gZ3VpZGVfbGVnZW5kKG9yZGVyID0gMikpICsNCiAgICBsYWJzKGNvbG9yID0gIk5hbWUiLCBmaWxsID0gIk5hbWUiKSArDQogICAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSwgIyBEZWNyZWFzZSBsZWdlbmQgdGV4dCBzaXplDQogICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSksICMgRGVjcmVhc2UgbGVnZW5kIHRpdGxlIHNpemUNCiAgICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNSwgImNtIikpICMgRGVjcmVhc2UgbGVnZW5kIGtleSBzaXplDQoNCiAgIyBDcmVhdGUgYSB0YWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgY29sdW1ucw0KICB0YWJsZV9kYXRhIDwtIGNvbWJpbmVkX2RhdGEgJT4lDQogICAgc2VsZWN0KE5hbWUsIA0KICAgICAgICAgICBgQXZlcmFnZSAxUk0gKGxicylgLCANCiAgICAgICAgICAgYERhdGUgUmFuZ2UgKExhc3QgMiBXZWVrcylgLCANCiAgICAgICAgICAgQ2F0ZWdvcnlfTGV2ZWxfTDJXLA0KICAgICAgICAgICBgSGlnaGVzdCAxUk0gQWxsIFRpbWUgKGxicylgLCANCiAgICAgICAgICAgYExhc3QgRGF0ZSBIaWdoZXN0IDFSTSBBbGwgVGltZWAsIA0KICAgICAgICAgICBDYXRlZ29yeV9MZXZlbF9BVEgsDQogICAgICAgICAgIGBBdmVyYWdlX0JvZHl3ZWlnaHRfTGFzdF8yV2tgLCANCiAgICAgICAgICAgRGF0ZV9SYW5nZSkgJT4lDQogICAgcmVuYW1lKA0KICAgICAgICBgRGF0ZSBSYW5nZSBMMldgID0gYERhdGUgUmFuZ2UgKExhc3QgMiBXZWVrcylgLA0KICAgICAgICBgMVJNIEFUSCAobGJzKWAgPSBgSGlnaGVzdCAxUk0gQWxsIFRpbWUgKGxicylgLA0KICAgICAgICBgRGF0ZSBBVEhgID0gYExhc3QgRGF0ZSBIaWdoZXN0IDFSTSBBbGwgVGltZWAsDQogICAgICAgIGBBdmcgQlcgTDJXIChsYnMpYCA9IGBBdmVyYWdlX0JvZHl3ZWlnaHRfTGFzdF8yV2tgDQogICAgICAgICkNCiAgDQogICMgVXBkYXRlIHRhYmxlIGZ1cnRoZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbHVtbnMNCiAgdGFibGVfZGF0YSA8LSB0YWJsZV9kYXRhICU+JQ0KICAgIHNlbGVjdChOYW1lLCANCiAgICAgICAgICAgYEF2ZXJhZ2UgMVJNIChsYnMpYCwgDQogICAgICAgICAgIGBEYXRlIFJhbmdlIEwyV2AsIA0KICAgICAgICAgICBDYXRlZ29yeV9MZXZlbF9MMlcsDQogICAgICAgICAgIGAxUk0gQVRIIChsYnMpYCwgDQogICAgICAgICAgIGBEYXRlIEFUSGAsIA0KICAgICAgICAgICBDYXRlZ29yeV9MZXZlbF9BVEgsDQogICAgICAgICAgIGBBdmcgQlcgTDJXIChsYnMpYCwgDQogICAgICAgICAgYERhdGVfUmFuZ2VgDQogICAgICAgICAgICkNCg0KICAjIFN1YnN0aXR1dGUgdW5kZXJzY29yZXMgd2l0aCBzcGFjZXMgaW4gY29sdW1uIG5hbWVzDQogIGNvbG5hbWVzKHRhYmxlX2RhdGEpIDwtIGdzdWIoIl8iLCAiICIsIGNvbG5hbWVzKHRhYmxlX2RhdGEpKQ0KDQogICMgUHJpbnQgdGhlIGNvbWJpbmVkIHRhYmxlIHVzaW5nIGtuaXRyOjprYWJsZQ0KICB0YWJsZV9odG1sIDwtIGthYmxlKHRhYmxlX2RhdGEsIGZvcm1hdCA9ICJodG1sIiwgZXNjYXBlID0gRkFMU0UsIGFsaWduID0gJ2wnKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxOm5jb2wodGFibGVfZGF0YSksIGV4dHJhX2NzcyA9ICJ0ZXh0LWFsaWduOiBsZWZ0OyIpDQoNCiAgcmV0dXJuKGxpc3QocGxvdCA9IHVwZGF0ZWRfcGxvdCwgdGFibGUgPSB0YWJsZV9odG1sLCB0YWJsZV9kYXRhID0gdGFibGVfZGF0YSkpDQp9DQoNCiMgUmV0cmlldmUgZXhpc3RpbmcgcGxvdHMgYW5kIHRpdGxlcw0KZXhpc3RpbmdfcGxvdHMgPC0gcGxvdHNfbGlzdF9zdHJlbmd0aF9zdGFuZGFyZHNfbWFya19yaXBwZXRvZQ0KcGxvdF90aXRsZXMgPC0gbmFtZXMoZXhpc3RpbmdfcGxvdHMpDQoNCiMgTWFwIHBsb3QgdGl0bGVzIHRvIHN0YW5kYXJkcyB0YWJsZSBuYW1lcw0KcGxvdF90b19zdGFuZGFyZHNfdGFibGUgPC0gbGlzdCgNCiAgIk1hbGUgQmVuY2ggUHJlc3MgU3RkIDFSTSBCeSBCb2R5d2VpZ2h0IE1hcmsgUmlwcGV0b2UiID0gIm1hbGVfYmVuY2hfcHJlc3Nfc3RkXzFybV9ieV9ib2R5d2VpZ2h0X21hcmtfcmlwcGV0b2UiLA0KICAiTWFsZSBEZWFkbGlmdCBTdGQgMVJNIEJ5IEJvZHl3ZWlnaHQgTWFyayBSaXBwZXRvZSIgPSAibWFsZV9kZWFkbGlmdF9zdGRfMXJtX2J5X2JvZHl3ZWlnaHRfbWFya19yaXBwZXRvZSIsDQogICJNYWxlIFByZXNzIFN0ZCAxUk0gQnkgQm9keXdlaWdodCBNYXJrIFJpcHBldG9lIiA9ICJtYWxlX3ByZXNzX3N0ZF8xcm1fYnlfYm9keXdlaWdodF9tYXJrX3JpcHBldG9lIiwNCiAgIk1hbGUgU3F1YXQgU3RkIDFSTSBCeSBCb2R5d2VpZ2h0IE1hcmsgUmlwcGV0b2UiID0gIm1hbGVfc3F1YXRfc3RkXzFybV9ieV9ib2R5d2VpZ2h0X21hcmtfcmlwcGV0b2UiDQopDQoNCiMgSXRlcmF0ZSB0aHJvdWdoIGVhY2ggc3RhbmRhcmQgYW5kIGFkZCBkYXRhIHBvaW50cyB0byB0aGUgZXhpc3RpbmcgcGxvdHMNCmZvciAocGxvdF90aXRsZSBpbiBwbG90X3RpdGxlcykgew0KICAjIEZpbHRlciBwZXJmb3JtYW5jZSBkYXRhIGZvciB0aGUgY3VycmVudCBzdGFuZGFyZA0KICBwZXJmb3JtYW5jZV9kYXRhIDwtIGZpbHRlcihwZXJmb3JtYW5jZV9vbl9tYXJrX3JpcHBldG9lX3N0YW5kYXJkcywgYFN0cmVuZ3RoIFN0YW5kYXJkYCA9PSBwbG90X3RpdGxlKQ0KICANCiAgIyBHZXQgdGhlIGV4aXN0aW5nIHBsb3QNCiAgZXhpc3RpbmdfcGxvdCA8LSBleGlzdGluZ19wbG90c1tbcGxvdF90aXRsZV1dDQogIA0KICAjIEdldCB0aGUgY29ycmVzcG9uZGluZyBzdGFuZGFyZHMgdGFibGUgbmFtZQ0KICBzdGFuZGFyZHNfdGFibGUgPC0gcGxvdF90b19zdGFuZGFyZHNfdGFibGVbW3Bsb3RfdGl0bGVdXQ0KICANCiAgIyBBZGQgYm9keXdlaWdodCBhbmQgMVJNIGRhdGEgcG9pbnRzIHRvIHRoZSBleGlzdGluZyBwbG90DQogIHJlc3VsdCA8LSBhZGRfYm9keXdlaWdodF9hbmRfMXJtX3RvX3Bsb3QoZXhpc3RpbmdfcGxvdCwgcGVyZm9ybWFuY2VfZGF0YSwgdGFibGVfYXZnX2JvZHl3ZWlnaHRzX2xhc3RfMndrLCBzdGFuZGFyZHNfdGFibGUpDQogIA0KICBjbGVhbl90aXRsZSA8LSAoc3ViKCIgU3RkIDFSTSBCeSBCb2R5d2VpZ2h0IE1hcmsgUmlwcGV0b2UiLCAiIFN0YW5kYXJkcywgQXZnIDFSTSBMMlcgJiAxUk0gQVRIIiwgcGxvdF90aXRsZSkpDQogIGNhdChwYXN0ZTAoIlxuXG48aDQ+IiwgY2xlYW5fdGl0bGUsICI8L2g0PlxuXG4iKSkNCg0KICAjIFByaW50IHRoZSB1cGRhdGVkIHBsb3QNCiAgcHJpbnQocmVzdWx0JHBsb3QpDQogIA0KICAjIFByaW50IHRoZSB0YWJsZQ0KICBwcmludChyZXN1bHQkdGFibGUpDQogIA0KICAjIFNhdmUgdGhlIHBsb3QNCiAgIyBwbG90X2ZpbGVuYW1lIDwtIHBhc3RlMCgicGxvdHMvYXZnXzFybV9sMndfYW5kX2F0aF8xcm1fb25fXyIsIHRvbG93ZXIoZ3N1YigiICIsICJfIiwgcGxvdF90aXRsZSkpLCAiXyIsIFN5cy5EYXRlKCksICIucG5nIikNCiAgIyBnZ3NhdmUocGxvdF9maWxlbmFtZSwgcGxvdCA9IHJlc3VsdCRwbG90LCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA3KQ0KICANCiAgIyBTYXZlIHRoZSB0YWJsZSBkYXRhIHRvIENTVg0KICAjIHRhYmxlX2ZpbGVuYW1lIDwtIHBhc3RlMCgidGFibGVzL2F2Z18xcm1fbDJ3X2FuZF9hdGhfMXJtX29uXyIsIHRvbG93ZXIoZ3N1YigiICIsICJfIiwgcGxvdF90aXRsZSkpLCAiXyIsIFN5cy5EYXRlKCksICIuY3N2IikNCiAgIyB3cml0ZS5jc3YocmVzdWx0JHRhYmxlX2RhdGEsIGZpbGUgPSB0YWJsZV9maWxlbmFtZSwgcm93Lm5hbWVzID0gRkFMU0UpDQp9DQoNCmBgYA0KDQojIFNUUkVOR1RIIFNUQU5EQVJEUw0KDQpTdHJlbmd0aCBTdGFuZGFyZHMgcHJvdmlkZSB2YWx1YWJsZSBiZW5jaG1hcmtzIGZvciBhc3Nlc3NpbmcgYW4gaW5kaXZpZHVhbCdzIHBlcmZvcm1hbmNlIGluIGtleSBzdHJlbmd0aCBleGVyY2lzZXMgdGhhdCBhcmUgd2lkZWx5IHByYWN0aWNlZCBpbiBmaXRuZXNzIGFuZCBzdHJlbmd0aCB0cmFpbmluZy4gVGhlc2Ugc3RhbmRhcmRzIGNhdGVnb3JpemUgcGVyZm9ybWFuY2UgbGV2ZWxzIGJhc2VkIG9uIGVpdGhlciBhbW91bnQgb2Ygd2VpZ2h0IGV4ZWN1dGVkIHJlbGF0aXZlIHRvIGJvZHl3ZWlnaHQsIG9yIHJlcGV0aXRpb25zIGV4ZWN1dGVkLCBhbmQgYXJlIHNlZ21lbnRlZCBieSBnZW5kZXIgYW5kIGV4cGVyaWVuY2UgbGV2ZWxzLiBCeSBjb21wYXJpbmcgYW4gaW5kaXZpZHVhbCdzIHBlcmZvcm1hbmNlIGFnYWluc3QgdGhlc2UgZXN0YWJsaXNoZWQgc3RhbmRhcmRzLCB0cmFpbmVycyBhbmQgYXRobGV0ZXMgY2FuIGlkZW50aWZ5IHN0cmVuZ3RocyBhbmQgd2Vha25lc3NlcyBpbiB0aGVpciB0cmFpbmluZyByZWdpbWVucywgc2V0IHJlYWxpc3RpYyBnb2FscywgYW5kIG1lYXN1cmUgcHJvZ3Jlc3MgaW4gYSBzdHJ1Y3R1cmVkIG1hbm5lci4NCg0KIyMgU3RyZW5ndGggU3RhbmRhcmRzIE92ZXJ2aWV3IA0KDQpTZXZlcmFsIHN0cmVuZ3RoIHN0YW5kYXJkcyBhcmUgcmVhZGlseSBhdmFpbGFibGUgb25saW5lOg0KDQotIEV4UnggU3RyZW5ndGggU3RhbmRhcmRzOiA8aHR0cHM6Ly9leHJ4Lm5ldC9UZXN0aW5nL1dlaWdodExpZnRpbmcvU3RyZW5ndGhTdGFuZGFyZHM+DQotIFN0cmVuZ3RoTGV2ZWwuY29tIFN0cmVuZ3RoIFN0YW5kYXJkczogPGh0dHBzOi8vc3RyZW5ndGhsZXZlbC5jb20vc3RyZW5ndGgtc3RhbmRhcmRzPg0KLSBTeW1tZXRyaWMgU3RyZW5ndGg6IDxodHRwczovL3N5bW1ldHJpY3N0cmVuZ3RoLmNvbS8+DQotIE1hcmsgUmlwcGV0b2UncyBTdHJlbmd0aCBTdGFuZGFyZHM6IDxodHRwczovL3N0YXJ0aW5nc3RyZW5ndGguY29tL2ZpbGVzL3N0YW5kYXJkcy5wZGY+DQoNCkZpbmRpbmcgYWNjdXJhdGUgc3RyZW5ndGggc3RhbmRhcmRzIGRlcGVuZHMgb24gdGhlIGRlbW9ncmFwaGljLCBleGVyY2lzZSB0eXBlLCBhbmQgcmVxdWlyZWQgYWNjdXJhY3kuIEVhY2ggaGFzIGl0cyBwcm9zIGFuZCBjb25zOiBzb21lIGNhdGVyIHRvIHNwZWNpZmljIGRlbW9ncmFwaGljcywgb3RoZXJzIGZvY3VzIG9uIGNlcnRhaW4gZXhlcmNpc2VzLCBhbmQgdGhlaXIgY3JlZGliaWxpdHkgYWZmZWN0cyByZWxpYWJpbGl0eS4gVXNhYmlsaXR5IGFuZCBjb21wcmVoZW5zaXZlIGRhdGEgZm9yIGJlbmNobWFya2luZyBhcmUgY3J1Y2lhbCwgYXMgYXJlIHJlZ3VsYXIgdXBkYXRlcyB0byByZWZsZWN0IGN1cnJlbnQgdHJlbmRzLiBDb25zaWRlcmluZyB0aGVzZSBmYWN0b3JzIGhlbHBzIHRyYWluZXJzIGFuZCBhdGhsZXRlcyBjaG9vc2UgdGhlIGJlc3Qgc3RhbmRhcmRzIGZvciBhc3Nlc3NpbmcgYW5kIGltcHJvdmluZyBwZXJmb3JtYW5jZS4NCg0KIyMgU3RhbmRhcmRzIENhdGVnb3JpZXMgIA0KVGhlIHN0YW5kYXJkcyBjb21waWxlZCBhcmUgc2VwYXJhdGVkIGludG8gY2F0ZWdvcmllcywgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyB0YWJsZSwgbWFraW5nIGl0IGVhc3kgdG8gZGV0ZXJtaW5lIHdoaWNoIGV4ZXJjaXNlIHRvIHVzZSBhcyBhIGJlbmNobWFyay4NCg0KYGBge3Igc3RyZW5ndGhfc3RhbmRhcmRzX3NoZWV0X25hbWVzLCBldmFsPVRSVUUsIHJlc3VsdHM9J21hcmt1cCd9DQoNCiMgUHJpbnQgdGhlIGRhdGEgZnJhbWUgdXNpbmcga25pdHI6OmthYmxlDQprbml0cjo6a2FibGUobmFtZXNfc3Vic2V0X3N0cmVuZ3RoX3N0YW5kYXJkc19nc3ViX2RmLCBmb3JtYXQgPSAibWFya2Rvd24iLCBjb2wubmFtZXMgPSBjKCJDYXRlZ29yaWVzIiwgIkNhdGVnb3JpZXMiKSkgJT4lDQogIGNvbHVtbl9zcGVjKDE6Miwgd2lkdGggPSBjb2xfd2lkdGgsIGV4dHJhX2NzcyA9ICJ0ZXh0LWFsaWduOiBsZWZ0OyIpDQoNCmBgYA0KDQojIE1BUksgUklQUEVUT0UnUyBTVEFOREFSRFMNCg0KTWFyayBSaXBwZXRvZSdzIFN0cmVuZ3RoIFN0YW5kYXJkOiAxIFJlcCBNYXggQnkgQm9keXdlaWdodC4gIA0KDQpIZXJlIHdlIHByZXNlbnQgTWFyayBSaXBwZXRvZSdzIFN0cmVuZ3RoIFN0YW5kYXJkc1teNF0gdG8gYmVuY2htYXJrIGluZGl2aWR1YWwgcGVyZm9ybWFuY2UgYWdhaW5zdCBlc3RhYmxpc2hlZCBjcml0ZXJpYSBmb3IgcHJpbWFyeSBzdHJlbmd0aCBleGVyY2lzZXMuIFRoZXNlIHN0YW5kYXJkcyBhcmUgaW5zdHJ1bWVudGFsIGluIGV2YWx1YXRpbmcgYW4gaW5kaXZpZHVhbCdzIGxpZnRpbmcgY2FwYWJpbGl0aWVzIGluIHJlbGF0aW9uIHRvIHRoZWlyIGJvZHl3ZWlnaHQgYW5kIHRyYWluaW5nIGV4cGVyaWVuY2UuIEJ5IGRvaW5nIHNvLCB3ZSBjYW4gZWZmZWN0aXZlbHkgZ2F1Z2UgcHJvZ3Jlc3MsIHBpbnBvaW50IGFyZWFzIHRoYXQgbmVlZCBpbXByb3ZlbWVudCwgYW5kIHRhaWxvciB0cmFpbmluZyBwcm9ncmFtcyB0byBiZXR0ZXIgbWVldCB0aGUgc3BlY2lmaWMgc3RyZW5ndGggZ29hbHMgb2YgZWFjaCBpbmRpdmlkdWFsLg0KDQpUaGUgZXhlcmNpc2VzIHVzZSB0aGUgdGVjaG5pcXVlIGRlc2NyaWJlZCBpbiAiU3RhcnRpbmcgU3RyZW5ndGg6IEJhc2ljIEJhcmJlbGwgVHJhaW5pbmcsIDNyZCBlZC4iIFRoZSBCbHVlYm9vayBtYXkgYmUgcHVyY2hhc2VkIHRocm91Z2ggVGhlIEFhc2dhYXJkIENvbXBhbnkgb25saW5lIHN0b3JlW141XSBhbmQgb24gQW1hem9uIGluIHZhcmlvdXMgbWVkaXVtcyAocGFwZXJiYWNrLCBLaW5kbGUsIGF1ZGlvKS4gQWxsIGxpZnRzIGFyZSBwZXJmb3JtZWQgd2l0aCB0aGUgYmFyYmVsbCwgYXMgaW5kaWNhdGVkIGJ5IHRoZSBib29rIHRpdGxlLg0KDQpUbyBwcm9wZXJseSB1dGlsaXplIHRoZXNlIHN0YW5kYXJkcywgaXQgaXMgcmVjb21tZW5kZWQgdG8gcmV2aWV3ICJTdGFydGluZyBTdHJlbmd0aDogQmFzaWMgQmFyYmVsbCBUcmFpbmluZyJbXjZdIGFuZCAiUHJhY3RpY2FsIFByb2dyYW1taW5nIGZvciBTdHJlbmd0aCBUcmFpbmluZy4iW142XSBUaGUgbW9zdCByZWNlbnQgYW5kIHJlbGV2YW50IDNyZCBlZGl0aW9ucyAoMjAxMikgYXJlIGF2YWlsYWJsZSBvbiB0aGVpciB3ZWJzaXRlLCBhcyB3ZWxsIGFzIGluIGRpZmZlcmVudCBtZWRpdW1zIG9uIEFtYXpvbi4gWW91IGNhbiBkb3dubG9hZCBvbmxpbmUgYm9vayBzYW1wbGVzIHRvIGRldGVybWluZSBpZiBTdGFydGluZyBTdHJlbmd0aCBzdWl0cyB5b3VyIG5lZWRzLg0KDQpgYGB7ciBtYXJrX3JpcHBldG9lX3N0YW5kYXJkc19saXN0LCBldmFsPVRSVUUsIHJlc3VsdHM9J21hcmt1cCd9DQoNCiMgQ29kZSBleHRyYWN0cyBhbmQgcmVmaW5lcyBhIHN1YnNldCBvZiBkYXRhIHJlbGF0ZWQgdG8gIk1hcmsgUmlwcGV0b2UiIHN0YW5kYXJkcyBmcm9tIGEgYnJvYWRlciBkYXRhc2V0LCBtYWtpbmcgaXQgbW9yZSBhY2Nlc3NpYmxlIGFuZCBlYXNpZXIgdG8gd29yayB3aXRoIGJ5IGNsZWFuaW5nIHVwIHRoZSBjYXRlZ29yeSBuYW1lcyBmb3IgZnVydGhlciBhbmFseXNpcyBvciByZXBvcnRpbmcNCg0KIyBzdWJzZXQoKSBmaWx0ZXJzIHJvd3MgZnJvbSB0aGUgbmFtZWRfcmFuZ2VzIGRhdGFmcmFtZS4NCiMgZ3JlcGwoKSBjaGVja3MgZWFjaCBlbnRyeSBpbiB0aGUgIlN0cmVuZ3RoIFN0YW5kYXJkIiBjb2x1bW4gZm9yIHRoZSBzdWJzdHJpbmcgDQptYXJrX3JpcHBldG9lX3N0YW5kYXJkc19saXN0IDwtIHN1YnNldChuYW1lZF9yYW5nZXMsIGdyZXBsKCJNYXJrX1JpcHBldG9lIiwgYFN0cmVuZ3RoIFN0YW5kYXJkYCkpDQoNCiMgUGlwZSBPcGVyYXRvciAoJT4lKSBpcyB1c2VkIHRvIHBhc3MgdGhlIHJlc3VsdCBvZiBvbmUgZnVuY3Rpb24gdG8gdGhlIG5leHQuIEl0IGhlbHBzIGluIHdyaXRpbmcgY2xlYW5lciBhbmQgbW9yZSByZWFkYWJsZSBjb2RlLCBlc3BlY2lhbGx5IHdoZW4gcGVyZm9ybWluZyBtdWx0aXBsZSBvcGVyYXRpb25zIG9uIGEgZGF0YXNldC4NCiMgZ3N1YigiXyIsICIgIiwgQ2F0ZWdvcnkgU2hlZXQpIHJlcGxhY2VzIHVuZGVyc2NvcmVzIChfKSB3aXRoIHNwYWNlcyBpbiB0aGUgQ2F0ZWdvcnkgU2hlZXQgY29sdW1uLg0KIyBOZXcgY29sdW1uIGlzIGNyZWF0ZWQuIA0KbWFya19yaXBwZXRvZV9zdGFuZGFyZHNfbGlzdCA8LSBtYXJrX3JpcHBldG9lX3N0YW5kYXJkc19saXN0ICU+JQ0KICBtdXRhdGUoYENhdGVnb3J5IE5hbWVgID0gZ3N1YigiXyIsICIgIiwgYENhdGVnb3J5IFNoZWV0YCkpDQoNCiMgRGlzcGxheSB0aGUgbW9kaWZpZWQgJ1N0cmVuZ3RoIFN0YW5kYXJkJyBjb2x1bW4gd2l0aCBzcGFjZXMgaW5zdGVhZCBvZiB1bmRlcnNjb3Jlcw0KZGlzcGxheV9tYXJrX3JpcHBldG9lX3N0YW5kYXJkc19saXN0IDwtIG1hcmtfcmlwcGV0b2Vfc3RhbmRhcmRzX2xpc3QgJT4lDQogIG11dGF0ZShgU3RyZW5ndGggU3RhbmRhcmRgID0gZ3N1YigiXyIsICIgIiwgYFN0cmVuZ3RoIFN0YW5kYXJkYCkpICU+JQ0KICBzZWxlY3QoLWBDYXRlZ29yeSBTaGVldGApICAjIFRoaXMgZXhjbHVkZXMgdGhlICdDYXRlZ29yeSBTaGVldCcgY29sdW1uDQoNCiMgVGhlIFZpZXcgZnVuY3Rpb24gaXMgdXNlZCB0byBvcGVuIHRoZSByYXdfZGF0YSBkYXRhZnJhbWUgaW4gdGhlIFJTdHVkaW8gZGF0YSB2aWV3ZXIgZm9yIGludGVyYWN0aXZlIGV4cGxvcmF0aW9uLg0KVmlldyhtYXJrX3JpcHBldG9lX3N0YW5kYXJkc19saXN0KSAjUnVuIHRoaXMgbGluZSBvZiBjb2RlIHRvIHZpZXcgdGFibGUuIA0KDQojIFByaW50IGZvciByZWZlcmVuY2UuIA0KIyBwcmludChtYXJrX3JpcHBldG9lX3N0YW5kYXJkc19saXN0KQ0KIyBwcmludChkaXNwbGF5X21hcmtfcmlwcGV0b2Vfc3RhbmRhcmRzX2xpc3QpDQoNCiMgRGVmaW5lIHRoZSByYXRpb3MgYW5kIHRvdGFsIHdpZHRoIGZvciBjb2x1bW4gd2lkdGhzDQp0b3RhbF93aWR0aCA8LSAxMDANCnJhdGlvX3N0cmVuZ3RoX3N0YW5kYXJkcyA8LSAyDQpyYXRpb19jYXRlZ29yeSA8LSAxLjI1DQp0b3RhbF9yYXRpbyA8LSByYXRpb19zdHJlbmd0aF9zdGFuZGFyZHMgKyByYXRpb19jYXRlZ29yeQ0KDQojIENhbGN1bGF0ZSB0aGUgY29sdW1uIHdpZHRocw0Kd2lkdGhfc3RyZW5ndGhfc3RhbmRhcmRzIDwtIChyYXRpb19zdHJlbmd0aF9zdGFuZGFyZHMgLyB0b3RhbF9yYXRpbykgKiB0b3RhbF93aWR0aA0Kd2lkdGhfY2F0ZWdvcnkgPC0gKHJhdGlvX2NhdGVnb3J5IC8gdG90YWxfcmF0aW8pICogdG90YWxfd2lkdGgNCg0KIyBQcmludCB0aGUgZGF0YWZyYW1lIHVzaW5nIGthYmxlIGZvciBhIG5pY2VseSBmb3JtYXR0ZWQgbWFya2Rvd24gdGFibGUuDQprYWJsZShkaXNwbGF5X21hcmtfcmlwcGV0b2Vfc3RhbmRhcmRzX2xpc3QsIGZvcm1hdCA9ICJodG1sIiwgY29sLm5hbWVzID0gYygiU3RyZW5ndGggU3RhbmRhcmQiLCAiQ2F0ZWdvcnkiKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9IHBhc3RlMCh3aWR0aF9zdHJlbmd0aF9zdGFuZGFyZHMsICIlIikpICU+JQ0KICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9IHBhc3RlMCh3aWR0aF9jYXRlZ29yeSwgIiUiKSkNCg0KDQpgYGANCg0KVGhlcmUgYXJlIGZpdmUgU3RhcnRpbmcgU3RyZW5ndGggU3RhbmRhcmRzLCB3aXRoIHRoZSBQb3dlciBDbGVhbiBleGNsdWRlZCBpbiB0aGlzIHJlcG9ydC4gRWFjaCBvZiB0aGUgZm91ciByZW1haW5pbmcgU3RhbmRhcmRzIGlzIHByZXNlbnRlZCBiZWxvdywgZm9sbG93ZWQgYnkgYSBwbG90IHRvIHZpc3VhbGl6ZSBwZXJmb3JtYW5jZXMgZm9yIGNvbXBhcmlzb24gYW5kIG1vdGl2YXRpb24uDQoNCmBgYHtyIG1hcmtfcmlwcGV0b2Vfc3RhbmRhcmRzX3RhYmxlc19hbmRfcGxvdHMsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQ0KDQojIEtlZXAgZmlnLndpZHRoPTEwIGZvciBQREYgZGlzcGxheSAodmlhIGJyb3dzZXIgPiBTYXZlIEFzIFBERikuIFdoaWxlIGZpZy53aWR0aD05IChpbnN0ZWFkIG9mIDEwKSBmaXRzIHdpZHRoIG9mIG91dHB1dCwgc2F2aW5nIGFzIFBERiB3aXRoIGZpZy53aWR0aD05IHdpbGwgcmVzdWx0IGluIHNtYWxsIGZpZ3VyZTsgd2lkdGg9MTAgd2lsbCBmaWxsIHRoZSBQREYgcGFnZS4NCg0KIyBMb2FkIHRoZSByZXF1aXJlZCBwYWNrYWdlcyBpZiBub3QgYWxyZWFkeSBpbnN0YWxsZWQNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKSAjIEVuc3VyZSBrYWJsZUV4dHJhIGlzIGxvYWRlZCBmb3Igc3R5bGluZw0KDQojIEZ1bmN0aW9uIHRvIGdlbmVyYXRlIGdncGxvdCBmb3IgZWFjaCBkYXRhIGZyYW1lDQpnZW5lcmF0ZV9nZ3Bsb3QgPC0gZnVuY3Rpb24oZGF0YSwgY2F0ZWdvcnlfbmFtZSwgbWFya19yaXBwZXRvZV9zdHJlbmd0aF9zdGFuZGFyZCkgew0KICBkYXRhX251bWJlciA8LSBkYXRhICU+JQ0KICAgIG11dGF0ZShCb2R5d2VpZ2h0ID0gYXMubnVtZXJpYyhnc3ViKCJbXjAtOV0iLCAiIiwgQm9keXdlaWdodCkpKQ0KDQogICMgUmVuYW1lIGNvbHVtbnMgdG8gcmVtb3ZlIGRvdWJsZSBwZXJpb2RzDQogIGNvbG5hbWVzKGRhdGFfbnVtYmVyKSA8LSBnc3ViKCJcXC5cXC4iLCAiLiAiLCBjb2xuYW1lcyhkYXRhX251bWJlcikpDQoNCiAgIyBQcmludCBjb2x1bW4gbmFtZXMgZm9yIGRlYnVnZ2luZw0KICAjIHByaW50KGNvbG5hbWVzKGRhdGFfbnVtYmVyKSkNCiAgICANCiAgZ2dwbG90KGRhdGFfbnVtYmVyLCBhZXMoeCA9IEJvZHl3ZWlnaHQpKSArDQogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBgQ2F0LiBJYCwgeW1heCA9IGBDYXQuIElJYCksIGZpbGwgPSAiYmx1ZSIsIGFscGhhID0gMC4yKSArDQogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBgQ2F0LiBJSWAsIHltYXggPSBgQ2F0LiBJSUlgKSwgZmlsbCA9ICJncmVlbiIsIGFscGhhID0gMC4yKSArDQogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBgQ2F0LiBJSUlgLCB5bWF4ID0gYENhdC4gSVZgKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMikgKw0KICAgIGdlb21fcmliYm9uKGFlcyh5bWluID0gYENhdC4gSVZgLCB5bWF4ID0gYENhdC4gVmApLCBmaWxsID0gInJlZCIsIGFscGhhID0gMC4yKSArDQogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBgQ2F0LiBWYCwgeW1heCA9IEluZiksIGZpbGwgPSAicHVycGxlIiwgYWxwaGEgPSAwLjIpICsNCiAgICANCiAgICAjIEZpbGwgdGhlIHJlbWFpbmluZyBub24tY29sb3JlZCBwYXJ0DQogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSAtSW5mLCB5bWF4ID0gYENhdC4gSWApLCBmaWxsID0gImdyYXkiLCBhbHBoYSA9IDAuMikgKw0KICAgIA0KICAgICMgQ3JlYXRlIGxpbmVzDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gYENhdC4gSWApLCBjb2xvciA9ICJibHVlIiwgc2l6ZSA9IDEpICsNCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBgQ2F0LiBJSWApLCBjb2xvciA9ICJncmVlbiIsIHNpemUgPSAxKSArDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gYENhdC4gSUlJYCksIGNvbG9yID0gIm9yYW5nZSIsIHNpemUgPSAxKSArDQogICAgZ2VvbV9saW5lKGFlcyh5ID0gYENhdC4gSVZgKSwgY29sb3IgPSAicmVkIiwgc2l6ZSA9IDEpICsNCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBgQ2F0LiBWYCksIGNvbG9yID0gInB1cnBsZSIsIHNpemUgPSAxKSArDQogICAgDQogICAgIyBTZXQgbGFiZWxzDQogICAgbGFicygNCiAgICAgIHggPSAiQm9keXdlaWdodCAobGIpIiwNCiAgICAgIHkgPSAiMVJNIFdlaWdodCBMb2FkIEV4ZWN1dGlvbiIsDQogICAgICB0aXRsZSA9IHBhc3RlKCJNYWxlIiwgY2F0ZWdvcnlfbmFtZSwgIlN0YW5kYXJkcyIpLA0KICAgICAgc3VidGl0bGUgPSAiQ29tcGFyaXNvbiBvZiBTdHJlbmd0aCBTdGFuZGFyZHMgQWNyb3NzIEV4cGVyaWVuY2UgTGV2ZWxzIiwNCiAgICAgIGNhcHRpb24gPSBwYXN0ZSgiU291cmNlOiIsIG1hcmtfcmlwcGV0b2Vfc3RyZW5ndGhfc3RhbmRhcmQpICMgQ2hhbmdlIFNvdXJjZSBpbmZvIFBSTg0KICAgICkgKw0KICAgIA0KICAgICMgQWRkIG1vcmUgbWFya2VycyBvbiB0aGUgeS1heGlzIGF0IGluY3JlbWVudHMgb2YgMjANCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDk5OSwgYnkgPSAyMCkpICsNCiAgICAjIEFkZCBtb3JlIG1hcmtlcnMgb24gdGhlIHgtYXhpcyBhdCBpbmNyZW1lbnRzIG9mIDEwDQogICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA5OTksIGJ5ID0gMTApKSArDQogICAgDQogICAgIyBBZGQgdGV4dCBsYWJlbHMgZm9yIHNraWxsIGxldmVscyB3aXRoIG1hdGNoaW5nIGNvbG9ycw0KICAgIGdlb21fdGV4dChhZXMoeCA9IG1heChCb2R5d2VpZ2h0KSwgeSA9IG1pbihgQ2F0LiBJYCksIGxhYmVsID0gIiIpLCBjb2xvciA9ICJkaW1ncmF5Iiwgdmp1c3QgPSAtMSkgKw0KICAgIGdlb21fdGV4dChhZXMoeCA9IG1heChCb2R5d2VpZ2h0KSwgeSA9IG1heChgQ2F0LiBJYCksIGxhYmVsID0gIkNhdC4gSSIpLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHZqdXN0ID0gLTEpICsNCiAgICBnZW9tX3RleHQoYWVzKHggPSBtYXgoQm9keXdlaWdodCksIHkgPSBtYXgoYENhdC4gSUlgKSwgbGFiZWwgPSAiQ2F0LiBJSSIpLCBjb2xvciA9ICJkYXJrZ3JlZW4iLCB2anVzdCA9IC0xKSArDQogICAgZ2VvbV90ZXh0KGFlcyh4ID0gbWF4KEJvZHl3ZWlnaHQpLCB5ID0gbWF4KGBDYXQuIElJSWApLCBsYWJlbCA9ICJDYXQuIElJSSIpLCBjb2xvciA9ICJkYXJrb3JhbmdlIiwgdmp1c3QgPSAtMSkgKw0KICAgIGdlb21fdGV4dChhZXMoeCA9IG1heChCb2R5d2VpZ2h0KSwgeSA9IG1heChgQ2F0LiBJVmApLCBsYWJlbCA9ICJDYXQuIElWIiksIGNvbG9yID0gImRhcmtyZWQiLCB2anVzdCA9IC0xKSArDQogICAgZ2VvbV90ZXh0KGFlcyh4ID0gbWF4KEJvZHl3ZWlnaHQpLCB5ID0gbWF4KGBDYXQuIFZgKSwgbGFiZWwgPSAiQ2F0LiBWIiksIGNvbG9yID0gInB1cnBsZSIsIHZqdXN0ID0gLTEpICsNCiAgICANCiAgICAjIEN1c3RvbWl6ZSB0aGVtZQ0KICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgdGhlbWUoDQogICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTYpLA0KICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDEyKSwNCiAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksDQogICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLA0KICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMSwgImNtIikNCiAgICApDQp9DQoNCiMgTGlzdHMgdG8gc3RvcmUgdGhlIHBsb3RzIGFuZCB0YWJsZXMNCnBsb3RzX2xpc3Rfc3RyZW5ndGhfc3RhbmRhcmRzX21hcmtfcmlwcGV0b2UgPC0gbGlzdCgpDQp0YWJsZXNfbGlzdF9zdHJlbmd0aF9zdGFuZGFyZHNfbWFya19yaXBwZXRvZSA8LSBsaXN0KCkNCg0KIyBDaGVjayBhbmQgY3JlYXRlIHRoZSAncGxvdHMnIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0DQppZiAoIWRpci5leGlzdHMoInBsb3RzIikpIHsNCiAgZGlyLmNyZWF0ZSgicGxvdHMiKQ0KfQ0KDQojIENoZWNrIGFuZCBjcmVhdGUgdGhlICd0YWJsZXMnIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0DQppZiAoIWRpci5leGlzdHMoInRhYmxlcyIpKSB7DQogIGRpci5jcmVhdGUoInRhYmxlcyIpDQp9DQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggbmFtZWQgcmFuZ2UgZnJvbSB0aGUgZmlsdGVyZWQgbWFya19yaXBwZXRvZV9zdGFuZGFyZHNfbGlzdCBkYXRhZnJhbWUNCmZvciAoaSBpbiAxOm5yb3cobWFya19yaXBwZXRvZV9zdGFuZGFyZHNfbGlzdCkpIHsNCiAgc3RyZW5ndGhfc3RhbmRhcmRfbmFtZWRfcmFuZ2UgPC0gbWFya19yaXBwZXRvZV9zdGFuZGFyZHNfbGlzdCRgU3RyZW5ndGggU3RhbmRhcmRgW2ldDQogIGNhdGVnb3J5X25hbWUgPC0gbWFya19yaXBwZXRvZV9zdGFuZGFyZHNfbGlzdCRgQ2F0ZWdvcnkgTmFtZWBbaV0NCiAgDQogICMgTG9hZCB0aGUgZGF0YSBmcm9tIHRoZSBuYW1lZCByYW5nZQ0KICBkYXRhX2ZyYW1lIDwtIHJlYWRXb3JrYm9vayhzdHJlbmd0aF9zdGFuZGFyZHMsIG5hbWVkUmVnaW9uID0gc3RyZW5ndGhfc3RhbmRhcmRfbmFtZWRfcmFuZ2UpDQogIA0KICAjIENoZWNrIGlmIHRoZSAnQm9keXdlaWdodCcgY29sdW1uIGV4aXN0cyBpbiB0aGUgZGF0YSBmcmFtZQ0KICBpZiAoISJCb2R5d2VpZ2h0IiAlaW4lIGNvbG5hbWVzKGRhdGFfZnJhbWUpKSB7DQogICAgY2F0KHBhc3RlKCJTa2lwcGluZyIsIHN0cmVuZ3RoX3N0YW5kYXJkX25hbWVkX3JhbmdlLCAiLSAnQm9keXdlaWdodCcgY29sdW1uIG1pc3NpbmcuXG4iKSkNCiAgICBuZXh0DQogIH0NCg0KICAjIEVuc3VyZSBjb2x1bW4gbmFtZXMgYXJlIHRyaW1tZWQgb2Ygd2hpdGVzcGFjZQ0KICBjb2xuYW1lcyhkYXRhX2ZyYW1lKSA8LSB0cmltd3MoY29sbmFtZXMoZGF0YV9mcmFtZSkpDQoNCiAgIyBSZW5hbWUgY29sdW1ucyB0byByZW1vdmUgZG91YmxlIHBlcmlvZHMgZm9yIGJvdGggdGFibGUgYW5kIHBsb3QNCiAgY29sbmFtZXMoZGF0YV9mcmFtZSkgPC0gZ3N1YigiXFwuXFwuIiwgIi4gIiwgY29sbmFtZXMoZGF0YV9mcmFtZSkpDQoNCiAgIyBGb3JtYXQgdGhlIHRpdGxlIG9mIHRoZSBwbG90IGFuZCBoZWFkIG9mIHRoZSB0YWJsZSB1c2luZyB0aGUgY2xlYW5lZCBjYXRlZ29yeSBuYW1lDQogIGZvcm1hdHRlZF9oZWFkZXIgPC0gZ3N1YigiXyIsICIgIiwgc3RyZW5ndGhfc3RhbmRhcmRfbmFtZWRfcmFuZ2UpDQogIGZvcm1hdHRlZF9oZWFkZXIgPC0gKHN1YigiIFN0ZCAxUk0gQnkgQm9keXdlaWdodCBNYXJrIFJpcHBldG9lIiwgIiBTdGFuZGFyZHMiLCBmb3JtYXR0ZWRfaGVhZGVyKSkNCiAgDQogICMgR2VuZXJhdGUgdGhlIHBsb3QNCiAgcGxvdCA8LSBnZW5lcmF0ZV9nZ3Bsb3QoZGF0YV9mcmFtZSwgY2F0ZWdvcnlfbmFtZSwgc3RyZW5ndGhfc3RhbmRhcmRfbmFtZWRfcmFuZ2UpDQogIA0KICAjIFByaW50IHRoZSBuYW1lIG9mIHRoZSBuYW1lZCByYW5nZSBhcyBhIG1hcmtkb3duIGhlYWRlcg0KICBjYXQocGFzdGUwKCJcblxuPGgzPiAiLCBmb3JtYXR0ZWRfaGVhZGVyLCAiPC9oMz5cbiIpKQ0KICANCiAgIyBSZW5hbWUgJ0JvZHl3ZWlnaHQnIGNvbHVtbiB0byAnQm9keXdlaWdodCAobGIpJw0KICBuYW1lcyhkYXRhX2ZyYW1lKVtuYW1lcyhkYXRhX2ZyYW1lKSA9PSAiQm9keXdlaWdodCJdIDwtICJCb2R5d2VpZ2h0IChsYikiDQoNCiAgIyBQcmludCB0aGUgcGxvdA0KICBwcmludChwbG90KQ0KDQogICMgU2F2ZSB0aGUgcGxvdCB0byB0aGUgbGlzdA0KICBwbG90c19saXN0X3N0cmVuZ3RoX3N0YW5kYXJkc19tYXJrX3JpcHBldG9lW1tmb3JtYXR0ZWRfaGVhZGVyXV0gPC0gcGxvdA0KDQogICMgT3V0cHV0IHRoZSBkYXRhIGZyYW1lIGFzIGEgbWFya2Rvd24gdGFibGUgd2l0aCBldmVuIGNvbHVtbiB3aWR0aHMNCiAgcHJpbnQoDQogICAgdGFibGVfaHRtbCA8LSBrYWJsZShkYXRhX2ZyYW1lLCBmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gJ2wnKSAlPiUNCiAgICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgICAgY29sdW1uX3NwZWMoMTpuY29sKGRhdGFfZnJhbWUpLCB3aWR0aCA9IHBhc3RlMCgxMDAgLyBuY29sKGRhdGFfZnJhbWUpLCAiJSIpKQ0KICApDQogIA0KICAjIFNhdmUgdGhlIHRhYmxlIHRvIHRoZSBsaXN0DQogIHRhYmxlc19saXN0X3N0cmVuZ3RoX3N0YW5kYXJkc19tYXJrX3JpcHBldG9lW1tmb3JtYXR0ZWRfaGVhZGVyXV0gPC0gdGFibGVfaHRtbA0KDQogICMgT3B0aW9uYWxseSBzYXZlIHRoZSBwbG90IGFuZCB0YWJsZQ0KICBnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAoInBsb3RzLyIsIHRvbG93ZXIoc3RyZW5ndGhfc3RhbmRhcmRfbmFtZWRfcmFuZ2UpLCAiLnBuZyIpLCBwbG90ID0gcGxvdCwgd2lkdGggPSAxMiwgaGVpZ2h0ID0gOCkNCg0KICAjIFNhdmUgdGhlIGRhdGEgZnJhbWUgYXMgYSBDU1YgZmlsZQ0KICB3cml0ZS5jc3YoZGF0YV9mcmFtZSwgZmlsZSA9IHBhc3RlMCgidGFibGVzLyIsIHRvbG93ZXIoc3RyZW5ndGhfc3RhbmRhcmRfbmFtZWRfcmFuZ2UpLCAiLmNzdiIpLCByb3cubmFtZXMgPSBGQUxTRSkNCn0NCg0KIyBFeGFtcGxlIG9mIGhvdyB0byByZWNhbGwgYW5kIHByaW50IGEgc3BlY2lmaWMgcGxvdCBhbmQgdGFibGUgZnJvbSB0aGUgbGlzdHMNCiMgcHJpbnQocGxvdHNfbGlzdF9zdHJlbmd0aF9zdGFuZGFyZHNfbWFya19yaXBwZXRvZVtbIk1hbGUgQmVuY2ggUHJlc3MgU3RkIDFSTSBCeSBCb2R5d2VpZ2h0IE1hcmsgUmlwcGV0b2UiXV0pDQojIHByaW50KHRhYmxlc19saXN0X3N0cmVuZ3RoX3N0YW5kYXJkc19tYXJrX3JpcHBldG9lKQ0KIyBwcmludCh0YWJsZXNfbGlzdF9zdHJlbmd0aF9zdGFuZGFyZHNfbWFya19yaXBwZXRvZVsiTWFsZSBCZW5jaCBQcmVzcyBTdGQgMVJNIEJ5IEJvZHl3ZWlnaHQgTWFyayBSaXBwZXRvZSJdKQ0KIyBjYXQoYXMuY2hhcmFjdGVyKHRhYmxlc19saXN0X3N0cmVuZ3RoX3N0YW5kYXJkc19tYXJrX3JpcHBldG9lW1siTWFsZSBCZW5jaCBQcmVzcyBTdGQgMVJNIEJ5IEJvZHl3ZWlnaHQgTWFyayBSaXBwZXRvZSJdXSkpDQoNCmBgYA0KDQojIFJFRkVSRU5DRVMgDQoNCjwhLS0gDQpUaGVyZSBhcmUgbXVsdGlwbGUgcmVmZXJlbmNlcyBhYm92ZSBmb3IgdGhlIHNhbWUgbm90YXRpb24gYmVsb3cuIFIgaGFzIGRlZmF1bHQgc2V0dGluZ3MgdG8gYXNzaWduIG9uZSBub3RhdGlvbiBwZXIgcmVmZXJlbmNlLCB3aGlsZSBrZWVwaW5nIHRoZSBvcmRlciB5b3UgaGF2ZSBkZXNpZ25lZC4gRm9yIGV4YW1wbGUgaWYgW140XSBpcyB1c2VkIGF0IGxlYXN0IHR3aWNlLCBpdCB3aWxsIGFwcGVhciBhcyBbXjRdIGFuZCBbXjVdIGluIHRoZSBrbml0IHByb2R1Y3QuIFRoZSBmb2xsb3dpbmcgbnVtYmVycyB3aWxsIGJ1bXAgdXAuIFNhbWUgZ29lcyBmb3IgT25lIFJlcCBNYXggQ2FsY3VsYXRvciBbXjEwXSwgd2hpY2ggYXQgdGltZSBvZiByZXZpZXcgcHJpbnRzIGFzIFteMTFdIGFuZCBbXjE0XS4NCi0tPg0KDQpbXjFdOiBSaXBwZXRvZSwgTS4gKDIwMTcpLiAqU3RhcnRpbmcgU3RyZW5ndGg6IEJhc2ljIEJhcmJlbGwgVHJhaW5pbmcgKDNyZCBlZC4pLiogVGhlIEFhc2dhYXJkIENvbXBhbnkuIFJldHJpZXZlZCBmcm9tIDxodHRwczovL2Fhc2dhYXJkY28uY29tL3N0b3JlL2Jvb2tzLXBvc3RlcnMtZHZkL2Jvb2tzL3N0YXJ0aW5nLXN0cmVuZ3RoLWJhc2ljLWJhcmJlbGwtdHJhaW5pbmcvPi4NCg0KW14yXTogU3RyZW5ndGggTGV2ZWwuIChuLmQuKS4gKk9uZSBSZXAgTWF4IENhbGN1bGF0b3IuKiBSZXRyaWV2ZWQgZnJvbSA8aHR0cHM6Ly9zdHJlbmd0aGxldmVsLmNvbS9vbmUtcmVwLW1heC1jYWxjdWxhdG9yPi4NCg0KW14zXTogVGhhbSwgSy4gKDIwMjQpLiAqS2VuIERvZXMgRml0bmVzcyBGaW5hbC54bHNtLiogUmV0cmlldmVkIGZyb20gPGh0dHBzOi8vMWRydi5tcy94L3MhQXNZWVpBOW5MOGxmOHliVE54bFctMmM2c0RYQj9lPUtMZmhUND4uDQoNClteNF06IFJpcHBldG9lLCBNLiAoMjAxMikuICpTdHJlbmd0aCBTdGFuZGFyZHMuKiBTdGFydGluZyBTdHJlbmd0aC4gUmV0cmlldmVkIGZyb20gPGh0dHBzOi8vc3RhcnRpbmdzdHJlbmd0aC5jb20vZmlsZXMvc3RhbmRhcmRzLnBkZj4uDQoNClteNV06IFJpcHBldG9lLCBNLiAoMjAxNykuICpTdGFydGluZyBTdHJlbmd0aDogQmFzaWMgQmFyYmVsbCBUcmFpbmluZyAoM3JkIGVkLikuKiBUaGUgQWFzZ2FhcmQgQ29tcGFueS4gUmV0cmlldmVkIGZyb20gPGh0dHBzOi8vYWFzZ2FhcmRjby5jb20vc3RvcmUvYm9va3MtcG9zdGVycy1kdmQvYm9va3Mvc3RhcnRpbmctc3RyZW5ndGgtYmFzaWMtYmFyYmVsbC10cmFpbmluZy8+Lg0KDQpbXjZdOiBSaXBwZXRvZSwgTS4gKDIwMTcpLiAqU3RhcnRpbmcgU3RyZW5ndGg6IEJhc2ljIEJhcmJlbGwgVHJhaW5pbmcsIDNyZCBFZGl0aW9uKiBieSBNYXJrIFJpcHBldG9lLiBBdmFpbGFibGUgYXQgPGh0dHBzOi8vd3d3LmFtYXpvbi5jb20vU3RhcnRpbmctU3RyZW5ndGgtTWFyay1SaXBwZXRvZS1lYm9vay9kcC9CMDA2WEpSNVpBL3JlZj1zcl8xXzE/Y3JpZD0yMTUyMVlYQktYNEFJJmRpYj1leUoySWpvaU1TSjkuMXFUZWhfOERKaHFEbXhycmFqbWpUYkxpUXotd1BhS09pZmdpNzg3TTdXdXJOeHdVd0tWYmhRYWRKRXc4V2R1MnlnRFA4WDBEMjNZNXhHcUVaQUoyTDVsdUV3MGd2Q0lJeXVUbXVnWVpfYlJtRzM1aHFMUlBsYk95UXg0ZTVwUmYyd1ZvR25zUVB6RlFFZkVPbHJoaUhLcDhCU1dDdVFrZjJSRUxGS1NPTFFPNDlGcThZNTdQVV9NdVBtOWdlOTFVY0MzZWJtQ1o4cENXSG1xYlVVUk42dHlvY0RULUNSM1phUUFLUEpYbm1ZUHNvY0NQNGp6NFlfUVRMRTFoZWNzazhWdXVnZjNISUJqQldrT1ZNWkZtU0RsUzl1alZ4cUY0dlJxQzdHc1ZKbHcuXzlqTnBscGQ5TDZQUEZ6azdXTUMtblNEZldYUGhtY2tGaWlhTVN3YUN5bz4uDQoNClteNl06IFJpcHBldG9lLCBNLiAqUHJhY3RpY2FsIFByb2dyYW1taW5nIGZvciBTdHJlbmd0aCBUcmFpbmluZywgM3JkIEVkaXRpb24qIGJ5IE1hcmsgUmlwcGV0b2UuIEF2YWlsYWJsZSBhdCA8aHR0cHM6Ly93d3cuYW1hem9uLmNvbS9QcmFjdGljYWwtUHJvZ3JhbW1pbmctU3RyZW5ndGgtVHJhaW5pbmctUmlwcGV0b2UtZWJvb2svZHAvQjAwSVU4WUVUVy9yZWY9c3JfMV8yP2NyaWQ9MjE1MjFZWEJLWDRBSSZkaWI9ZXlKMklqb2lNU0o5LjFxVGVoXzhESmhxRG14cnJham1qVGJMaVF6LXdQYUtPaWZnaTc4N003V3VyTnh3VXdLVmJoUWFkSkV3OFdkdTJ5Z0RQOFgwRDIzWTV4R3FFWkFKMkw1bHVFdzBndkNJSXl1VG11Z1laX2JSbUczNWhxTFJQbGJPeVF4NGU1cFJmMndWb0duc1FQekZRRWZFT2xyaGlIS3A4QlNXQ3VRa2YyUkVMRktTT0xRTzQ5RnE4WTU3UFVfTXVQbTlnZTkxVWNDM2VibUNaOHBDV0htcWJVVVJONnR5b2NEVC1DUjNaYVFBS1BKWG5tWVBzb2NDUDRqejRZX1FUTEUxaGVjc2s4VnV1Z2YzSElCakJXa09WTVpGbVNEbFM5dWpWeHFGNHZScUM3R3NWSmx3Ll85ak5wbHBkOUw2UFBGems3V01DLW5TRGZXWFBobWNrRmlpYU1Td2FDeW8+Lg==