#include <stdio.h>
// supporting structures
// used as types for members of the two main structures
struct date
{
int month;
int day;
int year;
};
{
int hour;
int minute;
int second;
};
struct name
{
char firstName[20];
char middleInitial; // not always used
char lastName[20];
};
struct stats_record
{
int starts; // total for horse or jockey, not always used
int wins; // total for horse or jockey
int places; // total for horse or jockey
int shows; // total for horse or jockey
};
struct statistics
{
struct name statsName; // name of trainer or jockey
struct stats_record startWinPlaceShow;
};
struct win_place_show
{
char winName[20];
int winNumber;
char placeName[20];
int placeNumber;
char showName[20];
int showNumber;
};
union race_distance
{
char text[20]; // e.g., "Seven Furlongs"
float furlongs; // numeric for calculations
};
struct race_condition
{
float purse; // prize money
char detailedRaceDesc[100];
char restriction [20]; // age restriction/condition
char weightAssignments[10];
char claimingCondition[80];
union race_distance raceDistance;
};
struct track_record_holder
{
char horsesName[20];
int horsesAge;
int weightCarried; // lbs
struct stats_record recordHoldersRaceRecord;
};
enum medication // "med_" prefix prevents name collisions, strip before printing
{
med_B, // bute
med_L, // lasix
med_A, // adjunct medication
med_C, // 1st time bute
med_M // 1st time lasix
};
enum equipment // "equip_" prefix prevents name collisions, strip before printing
{
equip_a, // aluminum pads
equip_b, // blinkers
equip_c, // mud caulks
equip_d, // glued shoes
equip_e, // inner rims
equip_f, // front bandages
equip_g, // goggles
equip_h, // outer rims
equip_i, // inserts
equip_j, // aluminum pad
equip_k, // flipping halter
equip_l, // bar shoes
equip_m, // blocks
equip_n, // no whip
equip_o, // blinker off
equip_p, // pads
equip_q, // nasal strip off
equip_r, // bar shoe
equip_s, // nasal strip
equip_t, // turndowns
equip_u, // spurs
equip_w, // queen's plates
equip_y, // no shoes
equip_z, // tongue tie
equip_1, // running w's
equip_2, // screens
equip_3 // shields
};
struct medication_equipment
{
enum medication medicationCode; // L for Lasix
enum equipment equipmentCode; // g for goggles
};
enum horse_color // "color_" prefix prevents name collisions, strip before printing
{
color_b, // bay
color_bl, // black
color_br, // brown
color_ch, // chestnut
color_gr, // grey
color_ro, // roan
color_wh // white
};
enum horse_gender // "gender_" prefix prevents name collisions, strip before printing
{
gender_g, // gelding
gender_c, // colt
gender_f, // filly
gender_m, // mare
gender_r // rig
};
struct horse_info
{
enum horse_color horseColor; // b for bay, bl for black, etc
enum horse_gender horseGender; // c for colt, m for mare, etc
int horseAge;
char sire[20]; // father
char dam[20]; // mother
};
struct totals
{
char totalsCategory[12]; // 2024, Life, AllWeather, Dirt, etc
struct stats_record totalStats; // starts, wins, place, show
int speedFigure;
int earnings; // whole dollar amounts
};
struct track_and_race
{
char trackCode[3]; // short for name of racetrack
int raceNumber;
};
struct final_position
{
int place;
float lengths; // fractional, lengths behind leader or lengths in front
};
struct finisher
{
char horseName[20];
int weightCarried;
float lengths; // fractional, lengths behind next position when crossing finish
};
enum track_condition // "track_" prefix prevents name collisions, strip before printing
{
track_FT, // fast
track_WF, // wet fast
track_GD, // good
track_SL, // slow
track_MY, // muddy
track_SY, // sloppy
track_FRM, // firm
track_YLD, // yielding
track_SF, // soft
track_HY // heavy
};
enum race_type // "race_" prefix prevents name collisions, strip before printing
{
race_Msw, // maiden special weight
race_Clm, // claiming
race_Alw, // allowance
race_Str, // starter allowance
race_Cst, // claiming stakes
race_Moc, // maiden optional claiming
race_Inv, // invitational
race_Trl, // trials
race_Stk, // stakes
race_Mcl, // maiden claiming
race_Aoc, // allowance optional claiming
race_Hcp, // handicap
race_Shp, // starter handicap
race_Soc, // starter optional claiming
race_Mst, // maiden stakes
race_Dby, // derby
race_Ftr // futurity
};
struct past_race
{
struct date raceDate; // item 16
struct track_and_race trackRace; // item 17
enum track_condition trackCondition; // item 18, GD for Good, FRM for Firm
union race_distance raceDistance; // item 20, in furlongs or miles (sometimes not whole like 1.70)
int daysUnraced; // item 21
struct time fractionalTimes
[2]; // item 22 char ageRestrictionLimit[3]; // item 23, stored as 2 characters for an age, and 1 character to denote R or L
int restrictedToFillies; // item 24, flag
int restrictedToStateBredHorses; // item 25, flag
enum race_type raceType; // item 26, eg: Mst for maiden stakes
int equibasePaceFigures; // item 27
int speedFigure; // item 28
int postPostion; // item 29
float pointCalls[2]; // item 30, fractional
struct final_position finalPosition; // item 31
struct name jockeyName; // item 32
int weightCarried; // item 33
struct medication_equipment medEquip; // item 34
float finalOdds; // item 35
struct finisher topThree[3]; // item 36
char shortFootnotes[30]; // item 37
int numberOfHorses; // item 38
};
struct claiming_information
{
struct name newOwner;
struct name previousOwner;
int claimingPrice; // whole dollars
struct name formerTrainer;
};
struct workout_lines
{
struct date workoutDate;
char racetrackName[3]; // assuming all track names are shortened to 3 chars
union race_distance trackDistance; // in furlongs
enum track_condition trackCondition; // GD for Good, FRM for Firm
int breezing; // 1 if breezing, 0 if handily
char rank[5]; // xx out of yy, seperated by a slash char
};
// main structure to store details on each race
typedef struct race_details
{
struct date raceDate; // A - the date of the race
int raceNumber; // C - the specific race number identifier
char trackName[50]; // E - the name of the track where the race was held
int raceRating; // G - the earning estimate for the race winner
struct win_place_show notes; // H - notes area for the top 3 horses in the race
enum race_type raceType; // I - the type of race (eg: maiden claiming is mcl)
struct race_condition condition; // J - the conditions of the race
struct track_record_holder trackRecord; // K - info about the track record holding horse
} RACE_DETAILS;
// main structure to store details on each horse
typedef struct horse_details_and_past_performance
{
int programNumber; // 1 - the number of the horse being bet on
char saddleClothColor[12]; // 2 - the color of cloth
char morningLineOdds[3]; // 3 - the final assigned odds when the horse leaves the post
int claimingPrice; // 4 - the horses sale price (whole dollars assumed)
char owner[50]; // 5 - the owner of the horse
char silks[50]; // 6 - the jockey jacket color
struct statistics trainer; // 7 - the trainer name and info (starts, wins, places, shows)
char horseName[20]; // 8 - the name of the horse
struct medication_equipment medEquip; // 9 - the medication and equipment used by the horse
struct horse_info horsesInfo; // 10 - the color, gender, age, sire, and dam
int weightCarried; // 11 - the weight carried by the horse (lbs)
struct statistics jockey; // 12 - the jockey name and info (starts, wins, places, shows)
int horseClassFigure; // 13 - the estimate of what the starter will earn
struct totals totalsGeneral[4]; // 14 - basic prior race stats
struct totals totalsEnvironmental[4]; // 15 - basic prior race stats
struct past_race priorRaceStats[5]; // 16-38 - detailed prior race information
struct claiming_information claimInfo; // 39 - new and previous owner info
struct workout_lines workoutLines[4]; // 40 - insight into the horses fitness and readiness
} HORSE_DETAILS;
int main ( )
{
// declare structs to test compile
// typedefs were intentionally made only for structures declared in main
RACE_DETAILS myRaces[10];
HORSE_DETAILS myHorses[20];
return (0);
};
I2luY2x1ZGUgPHN0ZGlvLmg+CgovLyBzdXBwb3J0aW5nIHN0cnVjdHVyZXMKLy8gdXNlZCBhcyB0eXBlcyBmb3IgbWVtYmVycyBvZiB0aGUgdHdvIG1haW4gc3RydWN0dXJlcwoKc3RydWN0IGRhdGUKewogICAgaW50IG1vbnRoOwogICAgaW50IGRheTsKICAgIGludCB5ZWFyOwp9OwoKc3RydWN0IHRpbWUKewogICAgaW50IGhvdXI7CiAgICBpbnQgbWludXRlOwogICAgaW50IHNlY29uZDsKfTsKCnN0cnVjdCBuYW1lCnsKICAgIGNoYXIgZmlyc3ROYW1lWzIwXTsKICAgIGNoYXIgbWlkZGxlSW5pdGlhbDsgLy8gbm90IGFsd2F5cyB1c2VkCiAgICBjaGFyIGxhc3ROYW1lWzIwXTsKfTsKCnN0cnVjdCBzdGF0c19yZWNvcmQKewogICAgaW50IHN0YXJ0czsgLy8gdG90YWwgZm9yIGhvcnNlIG9yIGpvY2tleSwgbm90IGFsd2F5cyB1c2VkCiAgICBpbnQgd2luczsgLy8gdG90YWwgZm9yIGhvcnNlIG9yIGpvY2tleQogICAgaW50IHBsYWNlczsgLy8gdG90YWwgZm9yIGhvcnNlIG9yIGpvY2tleQogICAgaW50IHNob3dzOyAvLyB0b3RhbCBmb3IgaG9yc2Ugb3Igam9ja2V5Cn07CgpzdHJ1Y3Qgc3RhdGlzdGljcwp7CiAgICBzdHJ1Y3QgbmFtZSBzdGF0c05hbWU7IC8vIG5hbWUgb2YgdHJhaW5lciBvciBqb2NrZXkKICAgIHN0cnVjdCBzdGF0c19yZWNvcmQgc3RhcnRXaW5QbGFjZVNob3c7Cn07CgpzdHJ1Y3Qgd2luX3BsYWNlX3Nob3cKewogICAgY2hhciB3aW5OYW1lWzIwXTsKICAgIGludCB3aW5OdW1iZXI7CiAgICBjaGFyIHBsYWNlTmFtZVsyMF07CiAgICBpbnQgcGxhY2VOdW1iZXI7CiAgICBjaGFyIHNob3dOYW1lWzIwXTsKICAgIGludCBzaG93TnVtYmVyOwp9OyAKCnVuaW9uIHJhY2VfZGlzdGFuY2UKewogICAgY2hhciB0ZXh0WzIwXTsgLy8gZS5nLiwgIlNldmVuIEZ1cmxvbmdzIgogICAgZmxvYXQgZnVybG9uZ3M7IC8vIG51bWVyaWMgZm9yIGNhbGN1bGF0aW9ucwp9OwoKc3RydWN0IHJhY2VfY29uZGl0aW9uCnsKICAgIGZsb2F0IHB1cnNlOyAvLyBwcml6ZSBtb25leQogICAgY2hhciBkZXRhaWxlZFJhY2VEZXNjWzEwMF07CiAgICBjaGFyIHJlc3RyaWN0aW9uIFsyMF07IC8vIGFnZSByZXN0cmljdGlvbi9jb25kaXRpb24KICAgIGNoYXIgd2VpZ2h0QXNzaWdubWVudHNbMTBdOwogICAgY2hhciBjbGFpbWluZ0NvbmRpdGlvbls4MF07CiAgICB1bmlvbiByYWNlX2Rpc3RhbmNlIHJhY2VEaXN0YW5jZTsKfTsgCgpzdHJ1Y3QgdHJhY2tfcmVjb3JkX2hvbGRlcgp7CiAgICBjaGFyIGhvcnNlc05hbWVbMjBdOwogICAgaW50IGhvcnNlc0FnZTsKICAgIGludCB3ZWlnaHRDYXJyaWVkOyAvLyBsYnMKICAgIHN0cnVjdCB0aW1lIGhvcnNlc1RpbWU7CiAgICBzdHJ1Y3Qgc3RhdHNfcmVjb3JkIHJlY29yZEhvbGRlcnNSYWNlUmVjb3JkOwp9OyAKCmVudW0gbWVkaWNhdGlvbiAvLyAibWVkXyIgcHJlZml4IHByZXZlbnRzIG5hbWUgY29sbGlzaW9ucywgc3RyaXAgYmVmb3JlIHByaW50aW5nCnsKICAgIG1lZF9CLCAvLyBidXRlCiAgICBtZWRfTCwgLy8gbGFzaXgKICAgIG1lZF9BLCAvLyBhZGp1bmN0IG1lZGljYXRpb24KICAgIG1lZF9DLCAvLyAxc3QgdGltZSBidXRlCiAgICBtZWRfTSAgLy8gMXN0IHRpbWUgbGFzaXgKfTsKCmVudW0gZXF1aXBtZW50IC8vICJlcXVpcF8iIHByZWZpeCBwcmV2ZW50cyBuYW1lIGNvbGxpc2lvbnMsIHN0cmlwIGJlZm9yZSBwcmludGluZwp7CiAgICBlcXVpcF9hLCAvLyBhbHVtaW51bSBwYWRzCiAgICBlcXVpcF9iLCAvLyBibGlua2VycwogICAgZXF1aXBfYywgLy8gbXVkIGNhdWxrcwogICAgZXF1aXBfZCwgLy8gZ2x1ZWQgc2hvZXMKICAgIGVxdWlwX2UsIC8vIGlubmVyIHJpbXMKICAgIGVxdWlwX2YsIC8vIGZyb250IGJhbmRhZ2VzCiAgICBlcXVpcF9nLCAvLyBnb2dnbGVzCiAgICBlcXVpcF9oLCAvLyBvdXRlciByaW1zCiAgICBlcXVpcF9pLCAvLyBpbnNlcnRzCiAgICBlcXVpcF9qLCAvLyBhbHVtaW51bSBwYWQKICAgIGVxdWlwX2ssIC8vIGZsaXBwaW5nIGhhbHRlcgogICAgZXF1aXBfbCwgLy8gYmFyIHNob2VzCiAgICBlcXVpcF9tLCAvLyBibG9ja3MKICAgIGVxdWlwX24sIC8vIG5vIHdoaXAKICAgIGVxdWlwX28sIC8vIGJsaW5rZXIgb2ZmCiAgICBlcXVpcF9wLCAvLyBwYWRzCiAgICBlcXVpcF9xLCAvLyBuYXNhbCBzdHJpcCBvZmYKICAgIGVxdWlwX3IsIC8vIGJhciBzaG9lCiAgICBlcXVpcF9zLCAvLyBuYXNhbCBzdHJpcAogICAgZXF1aXBfdCwgLy8gdHVybmRvd25zCiAgICBlcXVpcF91LCAvLyBzcHVycwogICAgZXF1aXBfdywgLy8gcXVlZW4ncyBwbGF0ZXMKICAgIGVxdWlwX3ksIC8vIG5vIHNob2VzCiAgICBlcXVpcF96LCAvLyB0b25ndWUgdGllCiAgICBlcXVpcF8xLCAvLyBydW5uaW5nIHcncwogICAgZXF1aXBfMiwgLy8gc2NyZWVucwogICAgZXF1aXBfMyAgLy8gc2hpZWxkcwp9OwoKc3RydWN0IG1lZGljYXRpb25fZXF1aXBtZW50CnsKICAgIGVudW0gbWVkaWNhdGlvbiBtZWRpY2F0aW9uQ29kZTsgLy8gTCBmb3IgTGFzaXgKICAgIGVudW0gZXF1aXBtZW50IGVxdWlwbWVudENvZGU7IC8vIGcgZm9yIGdvZ2dsZXMKfTsgCgplbnVtIGhvcnNlX2NvbG9yIC8vICJjb2xvcl8iIHByZWZpeCBwcmV2ZW50cyBuYW1lIGNvbGxpc2lvbnMsIHN0cmlwIGJlZm9yZSBwcmludGluZwp7CiAgICBjb2xvcl9iLCAgLy8gYmF5CiAgICBjb2xvcl9ibCwgLy8gYmxhY2sKICAgIGNvbG9yX2JyLCAvLyBicm93bgogICAgY29sb3JfY2gsIC8vIGNoZXN0bnV0CiAgICBjb2xvcl9nciwgLy8gZ3JleQogICAgY29sb3Jfcm8sIC8vIHJvYW4KICAgIGNvbG9yX3doICAvLyB3aGl0ZQp9OwoKZW51bSBob3JzZV9nZW5kZXIgLy8gImdlbmRlcl8iIHByZWZpeCBwcmV2ZW50cyBuYW1lIGNvbGxpc2lvbnMsIHN0cmlwIGJlZm9yZSBwcmludGluZwp7CiAgICBnZW5kZXJfZywgLy8gZ2VsZGluZwogICAgZ2VuZGVyX2MsIC8vIGNvbHQKICAgIGdlbmRlcl9mLCAvLyBmaWxseQogICAgZ2VuZGVyX20sIC8vIG1hcmUKICAgIGdlbmRlcl9yICAvLyByaWcKfTsKCnN0cnVjdCBob3JzZV9pbmZvCnsKICAgIGVudW0gaG9yc2VfY29sb3IgaG9yc2VDb2xvcjsgLy8gYiBmb3IgYmF5LCBibCBmb3IgYmxhY2ssIGV0YwogICAgZW51bSBob3JzZV9nZW5kZXIgaG9yc2VHZW5kZXI7IC8vIGMgZm9yIGNvbHQsIG0gZm9yIG1hcmUsIGV0YwogICAgaW50IGhvcnNlQWdlOwogICAgY2hhciBzaXJlWzIwXTsgLy8gZmF0aGVyCiAgICBjaGFyIGRhbVsyMF07IC8vIG1vdGhlcgp9OyAKCnN0cnVjdCB0b3RhbHMKewogICAgY2hhciB0b3RhbHNDYXRlZ29yeVsxMl07IC8vIDIwMjQsIExpZmUsIEFsbFdlYXRoZXIsIERpcnQsIGV0YwogICAgc3RydWN0IHN0YXRzX3JlY29yZCB0b3RhbFN0YXRzOyAvLyBzdGFydHMsIHdpbnMsIHBsYWNlLCBzaG93CiAgICBpbnQgc3BlZWRGaWd1cmU7CiAgICBpbnQgZWFybmluZ3M7IC8vIHdob2xlIGRvbGxhciBhbW91bnRzCn07IAoKc3RydWN0IHRyYWNrX2FuZF9yYWNlCnsKICAgIGNoYXIgdHJhY2tDb2RlWzNdOyAvLyBzaG9ydCBmb3IgbmFtZSBvZiByYWNldHJhY2sKICAgIGludCByYWNlTnVtYmVyOwp9OwoKc3RydWN0IGZpbmFsX3Bvc2l0aW9uCnsKICAgIGludCBwbGFjZTsKICAgIGZsb2F0IGxlbmd0aHM7IC8vIGZyYWN0aW9uYWwsIGxlbmd0aHMgYmVoaW5kIGxlYWRlciBvciBsZW5ndGhzIGluIGZyb250Cn07CgpzdHJ1Y3QgZmluaXNoZXIKewogICAgY2hhciBob3JzZU5hbWVbMjBdOwogICAgaW50IHdlaWdodENhcnJpZWQ7CiAgICBmbG9hdCBsZW5ndGhzOyAvLyBmcmFjdGlvbmFsLCBsZW5ndGhzIGJlaGluZCBuZXh0IHBvc2l0aW9uIHdoZW4gY3Jvc3NpbmcgZmluaXNoCn07CgplbnVtIHRyYWNrX2NvbmRpdGlvbiAvLyAidHJhY2tfIiBwcmVmaXggcHJldmVudHMgbmFtZSBjb2xsaXNpb25zLCBzdHJpcCBiZWZvcmUgcHJpbnRpbmcKewogICAgdHJhY2tfRlQsICAvLyBmYXN0CiAgICB0cmFja19XRiwgIC8vIHdldCBmYXN0CiAgICB0cmFja19HRCwgIC8vIGdvb2QKICAgIHRyYWNrX1NMLCAgLy8gc2xvdwogICAgdHJhY2tfTVksICAvLyBtdWRkeQogICAgdHJhY2tfU1ksICAvLyBzbG9wcHkKICAgIHRyYWNrX0ZSTSwgLy8gZmlybQogICAgdHJhY2tfWUxELCAvLyB5aWVsZGluZwogICAgdHJhY2tfU0YsICAvLyBzb2Z0CiAgICB0cmFja19IWSAgIC8vIGhlYXZ5Cn07CgplbnVtIHJhY2VfdHlwZSAvLyAicmFjZV8iIHByZWZpeCBwcmV2ZW50cyBuYW1lIGNvbGxpc2lvbnMsIHN0cmlwIGJlZm9yZSBwcmludGluZwp7CiAgICByYWNlX01zdywgLy8gbWFpZGVuIHNwZWNpYWwgd2VpZ2h0CiAgICByYWNlX0NsbSwgLy8gY2xhaW1pbmcKICAgIHJhY2VfQWx3LCAvLyBhbGxvd2FuY2UKICAgIHJhY2VfU3RyLCAvLyBzdGFydGVyIGFsbG93YW5jZQogICAgcmFjZV9Dc3QsIC8vIGNsYWltaW5nIHN0YWtlcwogICAgcmFjZV9Nb2MsIC8vIG1haWRlbiBvcHRpb25hbCBjbGFpbWluZwogICAgcmFjZV9JbnYsIC8vIGludml0YXRpb25hbAogICAgcmFjZV9UcmwsIC8vIHRyaWFscwogICAgcmFjZV9TdGssIC8vIHN0YWtlcwogICAgcmFjZV9NY2wsIC8vIG1haWRlbiBjbGFpbWluZwogICAgcmFjZV9Bb2MsIC8vIGFsbG93YW5jZSBvcHRpb25hbCBjbGFpbWluZwogICAgcmFjZV9IY3AsIC8vIGhhbmRpY2FwCiAgICByYWNlX1NocCwgLy8gc3RhcnRlciBoYW5kaWNhcAogICAgcmFjZV9Tb2MsIC8vIHN0YXJ0ZXIgb3B0aW9uYWwgY2xhaW1pbmcKICAgIHJhY2VfTXN0LCAvLyBtYWlkZW4gc3Rha2VzCiAgICByYWNlX0RieSwgLy8gZGVyYnkKICAgIHJhY2VfRnRyICAvLyBmdXR1cml0eQp9OwoKc3RydWN0IHBhc3RfcmFjZQp7CiAgICBzdHJ1Y3QgZGF0ZSByYWNlRGF0ZTsgLy8gaXRlbSAxNgogICAgc3RydWN0IHRyYWNrX2FuZF9yYWNlIHRyYWNrUmFjZTsgLy8gaXRlbSAxNwogICAgZW51bSB0cmFja19jb25kaXRpb24gdHJhY2tDb25kaXRpb247IC8vIGl0ZW0gMTgsIEdEIGZvciBHb29kLCBGUk0gZm9yIEZpcm0KICAgIHVuaW9uIHJhY2VfZGlzdGFuY2UgcmFjZURpc3RhbmNlOyAvLyBpdGVtIDIwLCBpbiBmdXJsb25ncyBvciBtaWxlcyAoc29tZXRpbWVzIG5vdCB3aG9sZSBsaWtlIDEuNzApCiAgICBpbnQgZGF5c1VucmFjZWQ7IC8vIGl0ZW0gMjEKICAgIHN0cnVjdCB0aW1lIGZyYWN0aW9uYWxUaW1lc1syXTsgLy8gaXRlbSAyMgogICAgY2hhciBhZ2VSZXN0cmljdGlvbkxpbWl0WzNdOyAvLyBpdGVtIDIzLCBzdG9yZWQgYXMgMiBjaGFyYWN0ZXJzIGZvciBhbiBhZ2UsIGFuZCAxIGNoYXJhY3RlciB0byBkZW5vdGUgUiBvciBMCiAgICBpbnQgcmVzdHJpY3RlZFRvRmlsbGllczsgLy8gaXRlbSAyNCwgZmxhZwogICAgaW50IHJlc3RyaWN0ZWRUb1N0YXRlQnJlZEhvcnNlczsgLy8gaXRlbSAyNSwgZmxhZwogICAgZW51bSByYWNlX3R5cGUgcmFjZVR5cGU7IC8vIGl0ZW0gMjYsIGVnOiBNc3QgZm9yIG1haWRlbiBzdGFrZXMKICAgIGludCBlcXVpYmFzZVBhY2VGaWd1cmVzOyAvLyBpdGVtIDI3CiAgICBpbnQgc3BlZWRGaWd1cmU7IC8vIGl0ZW0gMjgKICAgIGludCBwb3N0UG9zdGlvbjsgLy8gaXRlbSAyOQogICAgZmxvYXQgcG9pbnRDYWxsc1syXTsgLy8gaXRlbSAzMCwgZnJhY3Rpb25hbAogICAgc3RydWN0IGZpbmFsX3Bvc2l0aW9uIGZpbmFsUG9zaXRpb247IC8vIGl0ZW0gMzEKICAgIHN0cnVjdCBuYW1lIGpvY2tleU5hbWU7IC8vIGl0ZW0gMzIKICAgIGludCB3ZWlnaHRDYXJyaWVkOyAvLyBpdGVtIDMzCiAgICBzdHJ1Y3QgbWVkaWNhdGlvbl9lcXVpcG1lbnQgbWVkRXF1aXA7IC8vIGl0ZW0gMzQKICAgIGZsb2F0IGZpbmFsT2RkczsgLy8gaXRlbSAzNQogICAgc3RydWN0IGZpbmlzaGVyIHRvcFRocmVlWzNdOyAvLyBpdGVtIDM2CiAgICBjaGFyIHNob3J0Rm9vdG5vdGVzWzMwXTsgLy8gaXRlbSAzNwogICAgaW50IG51bWJlck9mSG9yc2VzOyAvLyBpdGVtIDM4Cn07IAoKc3RydWN0IGNsYWltaW5nX2luZm9ybWF0aW9uCnsKICAgIHN0cnVjdCBuYW1lIG5ld093bmVyOwogICAgc3RydWN0IG5hbWUgcHJldmlvdXNPd25lcjsKICAgIGludCBjbGFpbWluZ1ByaWNlOyAvLyB3aG9sZSBkb2xsYXJzCiAgICBzdHJ1Y3QgbmFtZSBmb3JtZXJUcmFpbmVyOwp9OwoKc3RydWN0IHdvcmtvdXRfbGluZXMKewogICAgc3RydWN0IGRhdGUgd29ya291dERhdGU7CiAgICBjaGFyIHJhY2V0cmFja05hbWVbM107IC8vIGFzc3VtaW5nIGFsbCB0cmFjayBuYW1lcyBhcmUgc2hvcnRlbmVkIHRvIDMgY2hhcnMKICAgIHVuaW9uIHJhY2VfZGlzdGFuY2UgdHJhY2tEaXN0YW5jZTsgLy8gaW4gZnVybG9uZ3MKICAgIGVudW0gdHJhY2tfY29uZGl0aW9uIHRyYWNrQ29uZGl0aW9uOyAvLyBHRCBmb3IgR29vZCwgRlJNIGZvciBGaXJtCiAgICBzdHJ1Y3QgdGltZSB3b3Jrb3V0VGltZTsKICAgIGludCBicmVlemluZzsgLy8gMSBpZiBicmVlemluZywgMCBpZiBoYW5kaWx5CiAgICBjaGFyIHJhbmtbNV07IC8vIHh4IG91dCBvZiB5eSwgc2VwZXJhdGVkIGJ5IGEgc2xhc2ggY2hhcgp9OwoKLy8gbWFpbiBzdHJ1Y3R1cmUgdG8gc3RvcmUgZGV0YWlscyBvbiBlYWNoIHJhY2UKCnR5cGVkZWYgc3RydWN0IHJhY2VfZGV0YWlscwp7CgogICAgc3RydWN0IGRhdGUgcmFjZURhdGU7ICAgICAgICAgICAgICAgICAgIC8vIEEgLSB0aGUgZGF0ZSBvZiB0aGUgcmFjZQogICAgaW50IHJhY2VOdW1iZXI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEMgLSB0aGUgc3BlY2lmaWMgcmFjZSBudW1iZXIgaWRlbnRpZmllcgogICAgY2hhciB0cmFja05hbWVbNTBdOyAgICAgICAgICAgICAgICAgICAgIC8vIEUgLSB0aGUgbmFtZSBvZiB0aGUgdHJhY2sgd2hlcmUgdGhlIHJhY2Ugd2FzIGhlbGQKICAgIGludCByYWNlUmF0aW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHIC0gdGhlIGVhcm5pbmcgZXN0aW1hdGUgZm9yIHRoZSByYWNlIHdpbm5lcgogICAgc3RydWN0IHdpbl9wbGFjZV9zaG93IG5vdGVzOyAgICAgICAgICAgIC8vIEggLSBub3RlcyBhcmVhIGZvciB0aGUgdG9wIDMgaG9yc2VzIGluIHRoZSByYWNlCiAgICBlbnVtIHJhY2VfdHlwZSByYWNlVHlwZTsgICAgICAgICAgICAgICAgLy8gSSAtIHRoZSB0eXBlIG9mIHJhY2UgKGVnOiBtYWlkZW4gY2xhaW1pbmcgaXMgbWNsKQogICAgc3RydWN0IHJhY2VfY29uZGl0aW9uIGNvbmRpdGlvbjsgICAgICAgIC8vIEogLSB0aGUgY29uZGl0aW9ucyBvZiB0aGUgcmFjZQogICAgc3RydWN0IHRyYWNrX3JlY29yZF9ob2xkZXIgdHJhY2tSZWNvcmQ7IC8vIEsgLSBpbmZvIGFib3V0IHRoZSB0cmFjayByZWNvcmQgaG9sZGluZyBob3JzZQoKfSBSQUNFX0RFVEFJTFM7CgovLyBtYWluIHN0cnVjdHVyZSB0byBzdG9yZSBkZXRhaWxzIG9uIGVhY2ggaG9yc2UKCnR5cGVkZWYgc3RydWN0IGhvcnNlX2RldGFpbHNfYW5kX3Bhc3RfcGVyZm9ybWFuY2UKewoKICAgIGludCBwcm9ncmFtTnVtYmVyOyAgICAgICAgICAgICAgICAgICAgIC8vIDEgLSB0aGUgbnVtYmVyIG9mIHRoZSBob3JzZSBiZWluZyBiZXQgb24KICAgIGNoYXIgc2FkZGxlQ2xvdGhDb2xvclsxMl07ICAgICAgICAgICAgIC8vIDIgLSB0aGUgY29sb3Igb2YgY2xvdGgKICAgIGNoYXIgbW9ybmluZ0xpbmVPZGRzWzNdOyAgICAgICAgICAgICAgIC8vIDMgLSB0aGUgZmluYWwgYXNzaWduZWQgb2RkcyB3aGVuIHRoZSBob3JzZSBsZWF2ZXMgdGhlIHBvc3QKICAgIGludCBjbGFpbWluZ1ByaWNlOyAgICAgICAgICAgICAgICAgICAgIC8vIDQgLSB0aGUgaG9yc2VzIHNhbGUgcHJpY2UgKHdob2xlIGRvbGxhcnMgYXNzdW1lZCkKICAgIGNoYXIgb3duZXJbNTBdOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUgLSB0aGUgb3duZXIgb2YgdGhlIGhvcnNlCiAgICBjaGFyIHNpbGtzWzUwXTsgICAgICAgICAgICAgICAgICAgICAgICAvLyA2IC0gdGhlIGpvY2tleSBqYWNrZXQgY29sb3IKICAgIHN0cnVjdCBzdGF0aXN0aWNzIHRyYWluZXI7ICAgICAgICAgICAgIC8vIDcgLSB0aGUgdHJhaW5lciBuYW1lIGFuZCBpbmZvIChzdGFydHMsIHdpbnMsIHBsYWNlcywgc2hvd3MpCiAgICBjaGFyIGhvcnNlTmFtZVsyMF07ICAgICAgICAgICAgICAgICAgICAvLyA4IC0gdGhlIG5hbWUgb2YgdGhlIGhvcnNlCiAgICBzdHJ1Y3QgbWVkaWNhdGlvbl9lcXVpcG1lbnQgbWVkRXF1aXA7ICAvLyA5IC0gdGhlIG1lZGljYXRpb24gYW5kIGVxdWlwbWVudCB1c2VkIGJ5IHRoZSBob3JzZQogICAgc3RydWN0IGhvcnNlX2luZm8gaG9yc2VzSW5mbzsgICAgICAgICAgLy8gMTAgLSB0aGUgY29sb3IsIGdlbmRlciwgYWdlLCBzaXJlLCBhbmQgZGFtCiAgICBpbnQgd2VpZ2h0Q2FycmllZDsgICAgICAgICAgICAgICAgICAgICAvLyAxMSAtIHRoZSB3ZWlnaHQgY2FycmllZCBieSB0aGUgaG9yc2UgKGxicykKICAgIHN0cnVjdCBzdGF0aXN0aWNzIGpvY2tleTsgICAgICAgICAgICAgIC8vIDEyIC0gdGhlIGpvY2tleSBuYW1lIGFuZCBpbmZvIChzdGFydHMsIHdpbnMsIHBsYWNlcywgc2hvd3MpCiAgICBpbnQgaG9yc2VDbGFzc0ZpZ3VyZTsgICAgICAgICAgICAgICAgICAvLyAxMyAtIHRoZSBlc3RpbWF0ZSBvZiB3aGF0IHRoZSBzdGFydGVyIHdpbGwgZWFybgogICAgc3RydWN0IHRvdGFscyB0b3RhbHNHZW5lcmFsWzRdOyAgICAgICAgLy8gMTQgLSBiYXNpYyBwcmlvciByYWNlIHN0YXRzCiAgICBzdHJ1Y3QgdG90YWxzIHRvdGFsc0Vudmlyb25tZW50YWxbNF07ICAvLyAxNSAtIGJhc2ljIHByaW9yIHJhY2Ugc3RhdHMKICAgIHN0cnVjdCBwYXN0X3JhY2UgcHJpb3JSYWNlU3RhdHNbNV07ICAgIC8vIDE2LTM4IC0gZGV0YWlsZWQgcHJpb3IgcmFjZSBpbmZvcm1hdGlvbgogICAgc3RydWN0IGNsYWltaW5nX2luZm9ybWF0aW9uIGNsYWltSW5mbzsgLy8gMzkgLSBuZXcgYW5kIHByZXZpb3VzIG93bmVyIGluZm8KICAgIHN0cnVjdCB3b3Jrb3V0X2xpbmVzIHdvcmtvdXRMaW5lc1s0XTsgIC8vIDQwIC0gaW5zaWdodCBpbnRvIHRoZSBob3JzZXMgZml0bmVzcyBhbmQgcmVhZGluZXNzCgp9IEhPUlNFX0RFVEFJTFM7CgppbnQgbWFpbiAgKCAgKQp7CgogICAgLy8gZGVjbGFyZSBzdHJ1Y3RzIHRvIHRlc3QgY29tcGlsZQogICAgLy8gdHlwZWRlZnMgd2VyZSBpbnRlbnRpb25hbGx5IG1hZGUgb25seSBmb3Igc3RydWN0dXJlcyBkZWNsYXJlZCBpbiBtYWluCiAgICBSQUNFX0RFVEFJTFMgbXlSYWNlc1sxMF07CiAgICBIT1JTRV9ERVRBSUxTIG15SG9yc2VzWzIwXTsKCiAgICByZXR1cm4gKDApOwp9Ow==