COVID-19 has been a wrecking ball. Lives have been lost, and dreams have been delayed. It’s scary and humbling to be living during this time, but the efforts on behalf of Californians have been tremendous. I am thankful to be surrounded by thoughtful folks when faced with this invisible and lethal terror. One unexpected change that I’ve faced during this time period was losing my full-time offer as Data Scientist at Gap, Inc. The excitement I had of starting my career on San Francisco’s Folsom Street seems pretty distant now, but what I learned there is still fresh.

It’s been more than a year since I left my Gap internship and three months since I graduated from Cal. Time has gone by so fast, and it certainly has been a while since my blog received any love from me. This particular blog has been in the making for a while with small additions here and there since the start of my last school year at Cal. What I hope is to bring to light the contrast between the work environment and academia for those who are living at the border between them right now.


When I wrote my cover letter to the Gap recruitment team, I pondered the ways I could put the techniques I learned in class to the test in the real world. Was I finally going to use my years-earned regression knowledge in a useful scenario? Maybe I would try a couple of clustering techniques for whatever reason. All of these ideas were but a reach. I did however end up using my regression knowledge and clustering during some exploratory analyses.

On June 17th, 2019, I was so scared of meeting my fellow interns at 2 Folsom, but I put my brave face on. There was a group of about 40 of us all with different backgounds. We were assigned to work with assorted teams around the company for the summer. Four of us were data science interns, and two of which (Anni and Ashley) I was able to work with all summer. Ashley, Anni, and I couldn’t have been a better fit for each other as the “data boys”. We spent around 40 hours per week sitting in the same room as each other for 10 weeks. Is there a better way to bond quickly? Ashley at the time was an undergraduate statistics student at Cal Poly SLO who was incredible at databases and well-versed in machine learning techniques. Anni, an undergraduate student from University of Washington, double majored in mathematics and economics. You couldn’t tell that she wasn’t a statistics major. Both Ashley and Anni taught me so much, as well as learned the data science ropes along with me in our first internships.

By summer’s end, I found myself thinking oppositely from how I’d been when writing my cover letter. How was I going to apply all the things I learned at Gap to my final year at Berkeley? My undergrad introduced me to statistics broadly, and my grad school education had elevated me to my so-far intellectual best. To my surprise, my internship caught me off-guard with how rich one month could be. I learned the data science tools that only experience could get you.

I compiled a list of tips that would’ve helped me as I began my internship. Here’s a photo of a bunch of some of the interns and our incredible recruiter, David McKenna.

1 Tips

1.1 Appearances matter.

Upon reading this, I antipcate a few: “I work in tech. Appearances don’t matter. I’m coming to work in sweats!” While it may be commonplace to dress extra comfortably in tech, appearances really do matter. From a shallow perspective, you are always being evaluated in some way. It’s not just about the way you dress, though it can help, but more in the way you carry yourself. Other than being clean and appropriately dressed, wearing what makes you feel most confident will amplify even the best of your first impressions. Looking “good” is important. A couple notes I took on BART and at the Gap:

  • A clean face looks good on everyone.
  • Everyone has their own style. Revel in what you think looks good, but make sure your clothes fit as intended.
  • Tech bros love Allbirds.
  • Gap employees will stunt TF on you with Gucci, Commes de Garcones, Louis, and more…

Appearing “busy” is also just as important as looking your best. When I worked in a science lab, it was normal for us to kick off my shoes and read up on semi-related material if I was running automated analyses. I surely did not kick off my shoes at the Gap, but I did have funny friends. Being seen as interns chatting most of the time, it was difficult for management to give us benefit of the doubt when some of our project plans were delayed. Part of our intern process was showing your employers we could behave professionally, especially since we wanted the opportunity transition to full-time. One of the full-time data scientists I met told my friends and I that at her previous job, when she knew that she had a long-term project, she would make sure she visibly picked up (visibly to her higher ups) other small projects to look and stay busy.

1.2 You need to produce lots of summary stats.

So, you are finishing up a degree in statistics, computer science, or math, and you have learned all your machine learning ABC’s. At your internship you will be wanting to utilize your ANOVA, BNN, and CV to come up with novel results. That’s not all you’ll do. In fact, that’s not even the half you’ll do. As an intern in data science, I really needed 3 letters in the alphabet. S, Q, and L. And you’re going to want to switch back to chapter 1 of your stats textbooks. Spending all your time on summary statistics may be basic, it is incredibly important.

Since I was working with data queried from SQL databases all summer, summary statistics served as a measure of validity. For example, if you query your data for a complicated analysis on clothing demand, you’re going to want to know what the average unit prices are based on your data and based on what what may be commonplace knowledge to experienced colleagues. You don’t want to look over details that can heavily sway your final estimates, and you will want to incorporate (validate) what others in the building already know.

1.3 Your data will be annoying.

Depending on where you work, you will have different amounts of data available to you. At the Gap, there was definitely a bunch. This doesn’t always mean that because you have a bunch of data that the data will be in the best format for you to answer your question. In fact, data can come in many forms: completely unstructured (in which case you will have to clean it) or too structured (where you’ll have to go digging and figure out what the heck happened to your data before it got to you.) If you have access to the way your data were generated, you’re in luck. If you don’t have an idea, then good luck, Sherlock.

During my internship, I worked with survey data. My fellow data boy, Ashley, grabbed a bunch of the data we were looking for off of servers, which we all later cleaned. It took approximately 7.5 out of 10 weeks for us to understand our dataset. Building a cohesive project around it took about 1.5 weeks. It’d be hard to describe our full data struggle, but to summarize:

  • First, we had no data.
  • Then, we had some data, but after plenty of work, found out it was not the correct dataset.
  • Next, we were in a data drought; we tried to connect in-house database with contracting company’s database (~6 weeks).
  • Finally, we had data, worked super hard to clean it and analyze it responsibly, conquering our inner and outer demons.
  • During modelling, using na.omit() killed more than half of our data.

But after all that, we came out of the internship with a squeaky clean dataset, PLUS documentation, thanks to my second fellow data boy, Anni. It wouldn’t have been possible if not for lots and lots of asking the right questions to track down where the data may have been. It was not the funnest game of hide-and-seek!

1.4 Computers are not THAT fast. Your code can help.

We coded mainly in R (sometimes we coded in Python). If there’s anything you should remember about R is that it can use up a lot of memory.

Prior to internship, I wasn’t that experienced in using clusters/servers. With a dataset of about 1.5 million records, I managed to use an odd combination of command line, base R, and Tidyverse functions. If I could tell myself now from what I’ve learned from the statistical computing class I took the fall semester afterward, then I would inform myself of the following:

  • R makes a lot a lot a lot of object copies, so avoid them at all costs when working with a dataset that big. Some helpful functions would be gc() or .Internal(inspect(x)) before committing to code in pipelines.
  • Try to use C code to go through and filter your data. The awk, sed, and grep functions are all helpful.
  • Packages like doParallel and foreach can help distribute your code and keep it streamline.

I think there are many ways to make your code faster, but what will matter most are the resources you have when you’re at work. I would also caution about server traffic. If you have something demanding you need to run, run it overnight so you get shorter wait times while you’re physically at the office. (RIP, when is anyone going to be back at the office?)

1.5 Presentations to business partners will lose lots of technicalities. Keep an appendix.

Punch lines and the long story short. My friends and I presented our data science project that way. Truth be told, I love myself an intentionally sharp and business-focused presentation. I prefer to be understood rather than confuse others with my ANN, ML, CNN, RF, ABC, TLDR. But it never occurred to me how punishing it might be to not display all your technical hard work. I really don’t know why I never thought of it. Probably because I’m an entertainer at heart.

Matter of fact, your presentation will be shy of a reflection of your hard work. What it really will be is a translation of your hard work into impactful business statements. Not one is more valuable than the other. So take your hard work. Set the stage with your data science as the backdrop. When you’re up there presenting, hit the important business questions. If anyone has a technical question, flip over to your slide appendix which you can fill with lots and lots of code, plots, and all that shiny good stuff.

1.6 As a data scientist, you will have your admirers and your haters.

ML, AI, and big data are all hot words. Isn’t that why you wanted to become a data scientist anyway? Well, for me – yeah, probably. I give into hype. But I stuck around right? So #6 seems a little obvious, but I think it’s a point that was really important for me to drive home.

So, your colleagues will use data-centric words. They will talk about making data-driven decisions. … Yes, even your nontechnical colleagues. Some of them will be absolutely fantastic and know what they’re talking about. You won’t have to explain to them the importance of what you’re doing at work because “queens recognize queens”.

Other colleagues will not understand your work. Some will discount it and question why it even takes you so long to do it. This is not okay! “Data science” is a new term for a lot of old concepts melded together to solve modern problems. A lot of people will not know that or respect it. But they don’t know how hard you work. And you don’t need to go out of your way to prove to them your worth. But do assert you’re valuable and worthy of respect in the ways you can. Speak confidently. Keep eye contact. Be patient, be excited, be yourself unapologetically.

When I mentioned “colleagues”, I’m not sure who you imagined I was talking about, but I want you to imagine with me now. A colleague could be someone from another department who simply doesn’t know what you do or a colleague could be in your department working a few desks from you. We could imagine that colleague easily to be someone of similar professional experience to you but from at least a slightly different role. But imagine this for a second. Imagine this colleague to be a senior director or someone C-level with tons of career experience. This can be hard to digest if you experience it in real life, but at all levels of the workplace, you can find blatant apathy toward your line of work.

But I hope you find appreciation. Data science does wonders.

1.7 Do your write ups. Daily.

My friends and I took up our boss Dan Driscoll’s office the whole summer. It was nice to have that level of privacy as a newcomer, especially when we were dazed and confused. Every so often, Dan would walk in and ask us what we were up to. We soon learned that at any point in time, some part of our work had to be ready to show. Only you know exactly what you’ve learned since your boss last walked in, so write down your discoveries as you go. I prefer writing up R notebooks and making graphical summaries on Keynote (Apple’s Powerpoint… I much prefer).

Pro-tip: At the end of each day, make sure you’ve written up your code so it is reproducible. Be able to click ‘Run’ on your script, and make sure it runs without errors. As a reference to #1, having your work packaged up like this shows that you have always done something.

1.8 Your higher ups have done your job before (hopefully). Take advantage of that.

One of our Gap data science bosses, Chris Chapo, was quite the genius with a crunch for time. (I say this super respectfully, trust me.) We met with him several times during our internship to discuss our project progress. It was a scary feeling, really, to be a meager intern and presenting project goals/thoughts to someone so pivotal to the company. I had to get over the imposter syndrome and focus on adding value to the time that Chris Chapo set aside for my partners and me.

Before going into our meetings, Ashley, Anni, and I always got on the same page on what we were going to focus on. I unintentionally played timekeeper in the meeting. We had the most important questions written out and allotted appropriate time to each. Watching Chris paint the whiteboard and show us how he would approach a lot of the challenges we faced was really eye-opening. He explained simple solutions to complex problems. And hated writing in red marker.

When Dan would walk in to our office, we would ask so many questions. He always had a really good answer. And not just that, like the good boss he was, he would make us really think and throw questions back at us. One of my favorite chats with Dan was about using demographic information in marketing data science. We didn’t come to a consensus within the room, but having these discussions with our higher ups really gave me perspective. It also gave me perspective to know that Dan did all of his data science coding in C … Wow.


It’s so important to remember that though you can be the smartest student in school, being able to listen (soft skill) and being able to adapt (soft skill) are the most important things to flex in the workplace. Your technicalities will shine through regardless. Flash forward a year from being part of Gap Interns 2019, Ashley has now graduated from Cal Poly SLO in Statistics and is a data science intern for a startup in So Cal. Anni graduated from UW and is now starting off her PhD in statistics at Carnegie Mellon. I couldn’t be more proud of those two data boys. I feel like our summer together was incredible, and when I say we went through so much together, we really did. Thanks, Ashley and Anni. And Subha, Gianna, and Caiti (our summer FTE buddies). Anni drew this of us.

As for me, I’m still looking for the right placement. It sucked getting rescinded, but I’m really hopeful that wherever I go next, I’ll find many positive learning experiences.

LS0tCnRpdGxlOiAiOCBUaXBzIGZvciBOZXcgRGF0YSBTY2llbnRpc3RzIChGcm9tIGFuIEludGVybnNoaXAgUGVyc3BlY3RpdmUpIgphdXRob3I6IEVkaWUgRXNwZWpvCmRhdGU6IDIxIEF1Z3VzdCAyMDIwCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQogICAgdG9jX2RlcHRoOiAyCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKLS0tCgpDT1ZJRC0xOSBoYXMgYmVlbiBhIHdyZWNraW5nIGJhbGwuIExpdmVzIGhhdmUgYmVlbiBsb3N0LCBhbmQgZHJlYW1zIGhhdmUgYmVlbiBkZWxheWVkLiBJdCdzIHNjYXJ5IGFuZCBodW1ibGluZyB0byBiZSBsaXZpbmcgZHVyaW5nIHRoaXMgdGltZSwgYnV0IHRoZSBlZmZvcnRzIG9uIGJlaGFsZiBvZiBDYWxpZm9ybmlhbnMgaGF2ZSBiZWVuIHRyZW1lbmRvdXMuIEkgYW0gdGhhbmtmdWwgdG8gYmUgc3Vycm91bmRlZCBieSB0aG91Z2h0ZnVsIGZvbGtzIHdoZW4gZmFjZWQgd2l0aCB0aGlzIGludmlzaWJsZSBhbmQgbGV0aGFsIHRlcnJvci4gT25lIHVuZXhwZWN0ZWQgY2hhbmdlIHRoYXQgSSd2ZSBmYWNlZCBkdXJpbmcgdGhpcyB0aW1lIHBlcmlvZCB3YXMgbG9zaW5nIG15IGZ1bGwtdGltZSBvZmZlciBhcyBEYXRhIFNjaWVudGlzdCBhdCBHYXAsIEluYy4gVGhlIGV4Y2l0ZW1lbnQgSSBoYWQgb2Ygc3RhcnRpbmcgbXkgY2FyZWVyIG9uIFNhbiBGcmFuY2lzY28ncyBGb2xzb20gU3RyZWV0IHNlZW1zIHByZXR0eSBkaXN0YW50IG5vdywgYnV0IHdoYXQgSSBsZWFybmVkIHRoZXJlIGlzIHN0aWxsIGZyZXNoLgoKSXQncyBiZWVuIG1vcmUgdGhhbiBhIHllYXIgc2luY2UgSSBsZWZ0IG15IEdhcCBpbnRlcm5zaGlwIGFuZCB0aHJlZSBtb250aHMgc2luY2UgSSBncmFkdWF0ZWQgZnJvbSBDYWwuIFRpbWUgaGFzIGdvbmUgYnkgc28gZmFzdCwgYW5kIGl0IGNlcnRhaW5seSBoYXMgYmVlbiBhIHdoaWxlIHNpbmNlIG15IGJsb2cgcmVjZWl2ZWQgYW55IGxvdmUgZnJvbSBtZS4gVGhpcyBwYXJ0aWN1bGFyIGJsb2cgaGFzIGJlZW4gaW4gdGhlIG1ha2luZyBmb3IgYSB3aGlsZSB3aXRoIHNtYWxsIGFkZGl0aW9ucyBoZXJlIGFuZCB0aGVyZSBzaW5jZSB0aGUgc3RhcnQgb2YgbXkgbGFzdCBzY2hvb2wgeWVhciBhdCBDYWwuIFdoYXQgSSBob3BlIGlzIHRvIGJyaW5nIHRvIGxpZ2h0IHRoZSBjb250cmFzdCBiZXR3ZWVuIHRoZSB3b3JrIGVudmlyb25tZW50IGFuZCBhY2FkZW1pYSBmb3IgdGhvc2Ugd2hvIGFyZSBsaXZpbmcgYXQgdGhlIGJvcmRlciBiZXR3ZWVuIHRoZW0gcmlnaHQgbm93LgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKV2hlbiBJIHdyb3RlIG15IGNvdmVyIGxldHRlciB0byB0aGUgR2FwIHJlY3J1aXRtZW50IHRlYW0sIEkgcG9uZGVyZWQgdGhlIHdheXMgSSBjb3VsZCBwdXQgdGhlIHRlY2huaXF1ZXMgSSBsZWFybmVkIGluIGNsYXNzIHRvIHRoZSB0ZXN0IGluIHRoZSByZWFsIHdvcmxkLiBXYXMgSSBmaW5hbGx5IGdvaW5nIHRvIHVzZSBteSB5ZWFycy1lYXJuZWQgcmVncmVzc2lvbiBrbm93bGVkZ2UgaW4gYSB1c2VmdWwgc2NlbmFyaW8/IE1heWJlIEkgd291bGQgdHJ5IGEgY291cGxlIG9mIGNsdXN0ZXJpbmcgdGVjaG5pcXVlcyBmb3Igd2hhdGV2ZXIgcmVhc29uLiBBbGwgb2YgdGhlc2UgaWRlYXMgd2VyZSBidXQgYSByZWFjaC4gSSBkaWQgaG93ZXZlciBlbmQgdXAgdXNpbmcgbXkgcmVncmVzc2lvbiBrbm93bGVkZ2UgYW5kIGNsdXN0ZXJpbmcgZHVyaW5nIHNvbWUgZXhwbG9yYXRvcnkgYW5hbHlzZXMuCgpPbiBKdW5lIDE3dGgsIDIwMTksIEkgd2FzIHNvIHNjYXJlZCBvZiBtZWV0aW5nIG15IGZlbGxvdyBpbnRlcm5zIGF0IDIgRm9sc29tLCBidXQgSSBwdXQgbXkgYnJhdmUgZmFjZSBvbi4gVGhlcmUgd2FzIGEgZ3JvdXAgb2YgYWJvdXQgNDAgb2YgdXMgYWxsIHdpdGggZGlmZmVyZW50IGJhY2tnb3VuZHMuIFdlIHdlcmUgYXNzaWduZWQgdG8gd29yayB3aXRoIGFzc29ydGVkIHRlYW1zIGFyb3VuZCB0aGUgY29tcGFueSBmb3IgdGhlIHN1bW1lci4gRm91ciBvZiB1cyB3ZXJlIGRhdGEgc2NpZW5jZSBpbnRlcm5zLCBhbmQgdHdvIG9mIHdoaWNoIChBbm5pIGFuZCBBc2hsZXkpIEkgd2FzIGFibGUgdG8gd29yayB3aXRoIGFsbCBzdW1tZXIuIEFzaGxleSwgQW5uaSwgYW5kIEkgY291bGRuJ3QgaGF2ZSBiZWVuIGEgYmV0dGVyIGZpdCBmb3IgZWFjaCBvdGhlciBhcyB0aGUgImRhdGEgYm95cyIuIFdlIHNwZW50IGFyb3VuZCA0MCBob3VycyBwZXIgd2VlayBzaXR0aW5nIGluIHRoZSBzYW1lIHJvb20gYXMgZWFjaCBvdGhlciBmb3IgMTAgd2Vla3MuIElzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBib25kIHF1aWNrbHk/IEFzaGxleSBhdCB0aGUgdGltZSB3YXMgYW4gdW5kZXJncmFkdWF0ZSBzdGF0aXN0aWNzIHN0dWRlbnQgYXQgQ2FsIFBvbHkgU0xPIHdobyB3YXMgaW5jcmVkaWJsZSBhdCBkYXRhYmFzZXMgYW5kIHdlbGwtdmVyc2VkIGluIG1hY2hpbmUgbGVhcm5pbmcgdGVjaG5pcXVlcy4gQW5uaSwgYW4gdW5kZXJncmFkdWF0ZSBzdHVkZW50IGZyb20gVW5pdmVyc2l0eSBvZiBXYXNoaW5ndG9uLCBkb3VibGUgbWFqb3JlZCBpbiBtYXRoZW1hdGljcyBhbmQgZWNvbm9taWNzLiBZb3UgY291bGRuJ3QgdGVsbCB0aGF0IHNoZSB3YXNuJ3QgYSBzdGF0aXN0aWNzIG1ham9yLiBCb3RoIEFzaGxleSBhbmQgQW5uaSB0YXVnaHQgbWUgc28gbXVjaCwgYXMgd2VsbCBhcyBsZWFybmVkIHRoZSBkYXRhIHNjaWVuY2Ugcm9wZXMgYWxvbmcgd2l0aCBtZSBpbiBvdXIgZmlyc3QgaW50ZXJuc2hpcHMuCgpCeSBzdW1tZXIncyBlbmQsIEkgZm91bmQgbXlzZWxmIHRoaW5raW5nIG9wcG9zaXRlbHkgZnJvbSBob3cgSSdkIGJlZW4gd2hlbiB3cml0aW5nIG15IGNvdmVyIGxldHRlci4gSG93IHdhcyBJIGdvaW5nIHRvIGFwcGx5IGFsbCB0aGUgdGhpbmdzIEkgbGVhcm5lZCBhdCBHYXAgdG8gbXkgZmluYWwgeWVhciBhdCBCZXJrZWxleT8gTXkgdW5kZXJncmFkIGludHJvZHVjZWQgbWUgdG8gc3RhdGlzdGljcyBicm9hZGx5LCBhbmQgbXkgZ3JhZCBzY2hvb2wgZWR1Y2F0aW9uIGhhZCBlbGV2YXRlZCBtZSB0byBteSBzby1mYXIgaW50ZWxsZWN0dWFsIGJlc3QuIFRvIG15IHN1cnByaXNlLCBteSBpbnRlcm5zaGlwIGNhdWdodCBtZSBvZmYtZ3VhcmQgd2l0aCBob3cgcmljaCBvbmUgbW9udGggY291bGQgYmUuIEkgbGVhcm5lZCB0aGUgZGF0YSBzY2llbmNlIHRvb2xzIHRoYXQgb25seSBleHBlcmllbmNlIGNvdWxkIGdldCB5b3UuCgpJIGNvbXBpbGVkIGEgbGlzdCBvZiB0aXBzIHRoYXQgd291bGQndmUgaGVscGVkIG1lIGFzIEkgYmVnYW4gbXkgaW50ZXJuc2hpcC4gSGVyZSdzIGEgcGhvdG8gb2YgYSBidW5jaCBvZiBzb21lIG9mIHRoZSBpbnRlcm5zIGFuZCBvdXIgaW5jcmVkaWJsZSByZWNydWl0ZXIsIERhdmlkIE1jS2VubmEuCgo8Y2VudGVyPgo8aW1nIHNyYz0naW1hZ2VzLzZERTQ5RTE5LTlGNkEtNEI4OS1BNEJELUI5RTUwQUU3NUZEQS0xNjA3NC0wMDAwMDgyN0NGNDU4RUUyLnBuZycgd2lkdGg9JzcwJSc+CjwvY2VudGVyPgoKIyBUaXBzCgojIyBBcHBlYXJhbmNlcyBtYXR0ZXIuClVwb24gcmVhZGluZyB0aGlzLCBJIGFudGlwY2F0ZSBhIGZldzogIkkgd29yayBpbiB0ZWNoLiBBcHBlYXJhbmNlcyBkb24ndCBtYXR0ZXIuIEknbSBjb21pbmcgdG8gd29yayBpbiBzd2VhdHMhIiBXaGlsZSBpdCBtYXkgYmUgY29tbW9ucGxhY2UgdG8gZHJlc3MgZXh0cmEgY29tZm9ydGFibHkgaW4gdGVjaCwgYXBwZWFyYW5jZXMgcmVhbGx5IGRvIG1hdHRlci4gRnJvbSBhIHNoYWxsb3cgcGVyc3BlY3RpdmUsIHlvdSBhcmUgYWx3YXlzIGJlaW5nIGV2YWx1YXRlZCBpbiBzb21lIHdheS4gSXQncyBub3QganVzdCBhYm91dCB0aGUgd2F5IHlvdSBkcmVzcywgdGhvdWdoIGl0IGNhbiBoZWxwLCBidXQgbW9yZSBpbiB0aGUgd2F5IHlvdSBjYXJyeSB5b3Vyc2VsZi4gT3RoZXIgdGhhbiBiZWluZyBjbGVhbiBhbmQgYXBwcm9wcmlhdGVseSBkcmVzc2VkLCB3ZWFyaW5nIHdoYXQgbWFrZXMgeW91IGZlZWwgbW9zdCBjb25maWRlbnQgd2lsbCBhbXBsaWZ5IGV2ZW4gdGhlIGJlc3Qgb2YgeW91ciBmaXJzdCBpbXByZXNzaW9ucy4gTG9va2luZyAiZ29vZCIgaXMgaW1wb3J0YW50LiBBIGNvdXBsZSBub3RlcyBJIHRvb2sgb24gQkFSVCBhbmQgYXQgdGhlIEdhcDoKCi0gQSBjbGVhbiBmYWNlIGxvb2tzIGdvb2Qgb24gZXZlcnlvbmUuICAKLSBFdmVyeW9uZSBoYXMgdGhlaXIgb3duIHN0eWxlLiBSZXZlbCBpbiB3aGF0IHlvdSB0aGluayBsb29rcyBnb29kLCBidXQgbWFrZSBzdXJlIHlvdXIgY2xvdGhlcyBmaXQgYXMgaW50ZW5kZWQuICAKLSBUZWNoIGJyb3MgbG92ZSBBbGxiaXJkcy4gIAotIEdhcCBlbXBsb3llZXMgd2lsbCBzdHVudCBURiBvbiB5b3Ugd2l0aCBHdWNjaSwgQ29tbWVzIGRlIEdhcmNvbmVzLCBMb3VpcywgYW5kIG1vcmUuLi4gIAoKQXBwZWFyaW5nICJidXN5IiBpcyBhbHNvIGp1c3QgYXMgaW1wb3J0YW50IGFzIGxvb2tpbmcgeW91ciBiZXN0LiBXaGVuIEkgd29ya2VkIGluIGEgc2NpZW5jZSBsYWIsIGl0IHdhcyBub3JtYWwgZm9yIHVzIHRvIGtpY2sgb2ZmIG15IHNob2VzIGFuZCByZWFkIHVwIG9uIHNlbWktcmVsYXRlZCBtYXRlcmlhbCBpZiBJIHdhcyBydW5uaW5nIGF1dG9tYXRlZCBhbmFseXNlcy4gSSBzdXJlbHkgZGlkIG5vdCBraWNrIG9mZiBteSBzaG9lcyBhdCB0aGUgR2FwLCBidXQgSSBkaWQgaGF2ZSBmdW5ueSBmcmllbmRzLiBCZWluZyBzZWVuIGFzIGludGVybnMgY2hhdHRpbmcgbW9zdCBvZiB0aGUgdGltZSwgaXQgd2FzIGRpZmZpY3VsdCBmb3IgbWFuYWdlbWVudCB0byBnaXZlIHVzIGJlbmVmaXQgb2YgdGhlIGRvdWJ0IHdoZW4gc29tZSBvZiBvdXIgcHJvamVjdCBwbGFucyB3ZXJlIGRlbGF5ZWQuIFBhcnQgb2Ygb3VyIGludGVybiBwcm9jZXNzIHdhcyBzaG93aW5nIHlvdXIgZW1wbG95ZXJzIHdlIGNvdWxkIGJlaGF2ZSBwcm9mZXNzaW9uYWxseSwgZXNwZWNpYWxseSBzaW5jZSB3ZSB3YW50ZWQgdGhlIG9wcG9ydHVuaXR5IHRyYW5zaXRpb24gdG8gZnVsbC10aW1lLiBPbmUgb2YgdGhlIGZ1bGwtdGltZSBkYXRhIHNjaWVudGlzdHMgSSBtZXQgdG9sZCBteSBmcmllbmRzIGFuZCBJIHRoYXQgYXQgaGVyIHByZXZpb3VzIGpvYiwgd2hlbiBzaGUga25ldyB0aGF0IHNoZSBoYWQgYSBsb25nLXRlcm0gcHJvamVjdCwgc2hlIHdvdWxkIG1ha2Ugc3VyZSBzaGUgdmlzaWJseSBwaWNrZWQgdXAgICh2aXNpYmx5IHRvIGhlciBoaWdoZXIgdXBzKSBvdGhlciBzbWFsbCBwcm9qZWN0cyB0byBsb29rIGFuZCBzdGF5IGJ1c3kuCgoKIyMgWW91IG5lZWQgdG8gcHJvZHVjZSBsb3RzIG9mIHN1bW1hcnkgc3RhdHMuClNvLCB5b3UgYXJlIGZpbmlzaGluZyB1cCBhIGRlZ3JlZSBpbiBzdGF0aXN0aWNzLCBjb21wdXRlciBzY2llbmNlLCBvciBtYXRoLCBhbmQgeW91IGhhdmUgbGVhcm5lZCBhbGwgeW91ciBtYWNoaW5lIGxlYXJuaW5nIEFCQydzLiBBdCB5b3VyIGludGVybnNoaXAgeW91IHdpbGwgYmUgd2FudGluZyB0byB1dGlsaXplIHlvdXIgQU5PVkEsIEJOTiwgYW5kIENWIHRvIGNvbWUgdXAgd2l0aCBub3ZlbCByZXN1bHRzLiBUaGF0J3Mgbm90IGFsbCB5b3UnbGwgZG8uIEluIGZhY3QsIHRoYXQncyBub3QgZXZlbiB0aGUgaGFsZiB5b3UnbGwgZG8uIEFzIGFuIGludGVybiBpbiBkYXRhIHNjaWVuY2UsIEkgcmVhbGx5IG5lZWRlZCAzIGxldHRlcnMgaW4gdGhlIGFscGhhYmV0LiBTLCBRLCBhbmQgTC4gQW5kIHlvdSdyZSBnb2luZyB0byB3YW50IHRvIHN3aXRjaCBiYWNrIHRvIGNoYXB0ZXIgMSBvZiB5b3VyIHN0YXRzIHRleHRib29rcy4gU3BlbmRpbmcgYWxsIHlvdXIgdGltZSBvbiBzdW1tYXJ5IHN0YXRpc3RpY3MgbWF5IGJlIGJhc2ljLCBpdCBpcyBpbmNyZWRpYmx5IGltcG9ydGFudC4KClNpbmNlIEkgd2FzIHdvcmtpbmcgd2l0aCBkYXRhIHF1ZXJpZWQgZnJvbSBTUUwgZGF0YWJhc2VzIGFsbCBzdW1tZXIsIHN1bW1hcnkgc3RhdGlzdGljcyBzZXJ2ZWQgYXMgYSBtZWFzdXJlIG9mIHZhbGlkaXR5LiBGb3IgZXhhbXBsZSwgaWYgeW91IHF1ZXJ5IHlvdXIgZGF0YSBmb3IgYSBjb21wbGljYXRlZCBhbmFseXNpcyBvbiBjbG90aGluZyBkZW1hbmQsIHlvdSdyZSBnb2luZyB0byB3YW50IHRvIGtub3cgd2hhdCB0aGUgYXZlcmFnZSB1bml0IHByaWNlcyBhcmUgYmFzZWQgb24geW91ciBkYXRhIGFuZCBiYXNlZCBvbiB3aGF0IHdoYXQgbWF5IGJlIGNvbW1vbnBsYWNlIGtub3dsZWRnZSB0byBleHBlcmllbmNlZCBjb2xsZWFndWVzLiBZb3UgZG9uJ3Qgd2FudCB0byBsb29rIG92ZXIgZGV0YWlscyB0aGF0IGNhbiBoZWF2aWx5IHN3YXkgeW91ciBmaW5hbCBlc3RpbWF0ZXMsIGFuZCB5b3Ugd2lsbCB3YW50IHRvIGluY29ycG9yYXRlICh2YWxpZGF0ZSkgd2hhdCBvdGhlcnMgaW4gdGhlIGJ1aWxkaW5nIGFscmVhZHkga25vdy4KCgojIyBZb3VyIGRhdGEgd2lsbCBiZSBhbm5veWluZy4KRGVwZW5kaW5nIG9uIHdoZXJlIHlvdSB3b3JrLCB5b3Ugd2lsbCBoYXZlIGRpZmZlcmVudCBhbW91bnRzIG9mIGRhdGEgYXZhaWxhYmxlIHRvIHlvdS4gQXQgdGhlIEdhcCwgdGhlcmUgd2FzIGRlZmluaXRlbHkgYSBidW5jaC4gVGhpcyBkb2Vzbid0IGFsd2F5cyBtZWFuIHRoYXQgYmVjYXVzZSB5b3UgaGF2ZSBhIGJ1bmNoIG9mIGRhdGEgdGhhdCB0aGUgZGF0YSB3aWxsIGJlIGluIHRoZSBiZXN0IGZvcm1hdCBmb3IgeW91IHRvIGFuc3dlciB5b3VyIHF1ZXN0aW9uLiBJbiBmYWN0LCBkYXRhIGNhbiBjb21lIGluIG1hbnkgZm9ybXM6IGNvbXBsZXRlbHkgdW5zdHJ1Y3R1cmVkIChpbiB3aGljaCBjYXNlIHlvdSB3aWxsIGhhdmUgdG8gY2xlYW4gaXQpIG9yIHRvbyBzdHJ1Y3R1cmVkICh3aGVyZSB5b3UnbGwgaGF2ZSB0byBnbyBkaWdnaW5nIGFuZCBmaWd1cmUgb3V0IHdoYXQgdGhlIGhlY2sgaGFwcGVuZWQgdG8geW91ciBkYXRhIGJlZm9yZSBpdCBnb3QgdG8geW91LikgSWYgeW91IGhhdmUgYWNjZXNzIHRvIHRoZSB3YXkgeW91ciBkYXRhIHdlcmUgZ2VuZXJhdGVkLCB5b3UncmUgaW4gbHVjay4gSWYgeW91IGRvbid0IGhhdmUgYW4gaWRlYSwgdGhlbiBnb29kIGx1Y2ssIFNoZXJsb2NrLgoKRHVyaW5nIG15IGludGVybnNoaXAsIEkgd29ya2VkIHdpdGggc3VydmV5IGRhdGEuIE15IGZlbGxvdyBkYXRhIGJveSwgQXNobGV5LCBncmFiYmVkIGEgYnVuY2ggb2YgdGhlIGRhdGEgd2Ugd2VyZSBsb29raW5nIGZvciBvZmYgb2Ygc2VydmVycywgd2hpY2ggd2UgYWxsIGxhdGVyIGNsZWFuZWQuIEl0IHRvb2sgYXBwcm94aW1hdGVseSA3LjUgb3V0IG9mIDEwIHdlZWtzIGZvciB1cyB0byB1bmRlcnN0YW5kIG91ciBkYXRhc2V0LiBCdWlsZGluZyBhIGNvaGVzaXZlIHByb2plY3QgYXJvdW5kIGl0IHRvb2sgYWJvdXQgMS41IHdlZWtzLiBJdCdkIGJlIGhhcmQgdG8gZGVzY3JpYmUgb3VyIGZ1bGwgZGF0YSBzdHJ1Z2dsZSwgYnV0IHRvIHN1bW1hcml6ZToKCi0gRmlyc3QsIHdlIGhhZCBubyBkYXRhLiAgCi0gVGhlbiwgd2UgaGFkIHNvbWUgZGF0YSwgYnV0IGFmdGVyIHBsZW50eSBvZiB3b3JrLCBmb3VuZCBvdXQgaXQgd2FzIG5vdCB0aGUgY29ycmVjdCBkYXRhc2V0LiAgCi0gTmV4dCwgd2Ugd2VyZSBpbiBhIGRhdGEgZHJvdWdodDsgIHdlIHRyaWVkIHRvIGNvbm5lY3QgaW4taG91c2UgZGF0YWJhc2Ugd2l0aCBjb250cmFjdGluZyBjb21wYW55J3MgZGF0YWJhc2UgKH42IHdlZWtzKS4gICAgCi0gRmluYWxseSwgd2UgaGFkIGRhdGEsIHdvcmtlZCBzdXBlciBoYXJkIHRvIGNsZWFuIGl0IGFuZCBhbmFseXplIGl0IHJlc3BvbnNpYmx5LCBjb25xdWVyaW5nIG91ciBpbm5lciBhbmQgb3V0ZXIgZGVtb25zLiAgICAKLSBEdXJpbmcgbW9kZWxsaW5nLCB1c2luZyBgbmEub21pdCgpYCBraWxsZWQgbW9yZSB0aGFuIGhhbGYgb2Ygb3VyIGRhdGEuICAgIAoKQnV0IGFmdGVyIGFsbCB0aGF0LCB3ZSBjYW1lIG91dCBvZiB0aGUgaW50ZXJuc2hpcCB3aXRoIGEgc3F1ZWFreSBjbGVhbiBkYXRhc2V0LCAqUExVUyogZG9jdW1lbnRhdGlvbiwgdGhhbmtzIHRvIG15IHNlY29uZCBmZWxsb3cgZGF0YSBib3ksIEFubmkuIEl0IHdvdWxkbid0IGhhdmUgYmVlbiBwb3NzaWJsZSBpZiBub3QgZm9yIGxvdHMgYW5kIGxvdHMgb2YgYXNraW5nIHRoZSByaWdodCBxdWVzdGlvbnMgdG8gdHJhY2sgZG93biB3aGVyZSB0aGUgZGF0YSBtYXkgaGF2ZSBiZWVuLiBJdCB3YXMgbm90IHRoZSBmdW5uZXN0IGdhbWUgb2YgaGlkZS1hbmQtc2VlayEKCgojIyBDb21wdXRlcnMgYXJlIG5vdCBUSEFUIGZhc3QuIFlvdXIgY29kZSBjYW4gaGVscC4KV2UgY29kZWQgbWFpbmx5IGluIGBSYCAoc29tZXRpbWVzIHdlIGNvZGVkIGluIFB5dGhvbikuIElmIHRoZXJlJ3MgYW55dGhpbmcgeW91IHNob3VsZCByZW1lbWJlciBhYm91dCBgUmAgaXMgdGhhdCBpdCBjYW4gdXNlIHVwIGEgbG90IG9mIG1lbW9yeS4gCgpQcmlvciB0byBpbnRlcm5zaGlwLCBJIHdhc24ndCB0aGF0IGV4cGVyaWVuY2VkIGluIHVzaW5nIGNsdXN0ZXJzL3NlcnZlcnMuIFdpdGggYSBkYXRhc2V0IG9mIGFib3V0IDEuNSBtaWxsaW9uIHJlY29yZHMsIEkgbWFuYWdlZCB0byB1c2UgYW4gb2RkIGNvbWJpbmF0aW9uIG9mIGNvbW1hbmQgbGluZSwgYmFzZSBSLCBhbmQgVGlkeXZlcnNlIGZ1bmN0aW9ucy4gSWYgSSBjb3VsZCB0ZWxsIG15c2VsZiBub3cgZnJvbSB3aGF0IEkndmUgbGVhcm5lZCBmcm9tIHRoZSBzdGF0aXN0aWNhbCBjb21wdXRpbmcgY2xhc3MgSSB0b29rIHRoZSBmYWxsIHNlbWVzdGVyIGFmdGVyd2FyZCwgdGhlbiBJIHdvdWxkIGluZm9ybSBteXNlbGYgb2YgdGhlIGZvbGxvd2luZzoKCi0gUiBtYWtlcyBhIGxvdCBhIGxvdCBhIGxvdCBvZiBvYmplY3QgY29waWVzLCBzbyBhdm9pZCB0aGVtIGF0IGFsbCBjb3N0cyB3aGVuIHdvcmtpbmcgd2l0aCBhIGRhdGFzZXQgdGhhdCBiaWcuIFNvbWUgaGVscGZ1bCBmdW5jdGlvbnMgd291bGQgYmUgYGdjKClgIG9yIGAuSW50ZXJuYWwoaW5zcGVjdCh4KSlgIGJlZm9yZSBjb21taXR0aW5nIHRvIGNvZGUgaW4gcGlwZWxpbmVzLiAgICAgCi0gVHJ5IHRvIHVzZSBDIGNvZGUgdG8gZ28gdGhyb3VnaCBhbmQgZmlsdGVyIHlvdXIgZGF0YS4gVGhlIGBhd2tgLCBgc2VkYCwgYW5kIGBncmVwYCBmdW5jdGlvbnMgYXJlIGFsbCBoZWxwZnVsLiAgICAKLSBQYWNrYWdlcyBsaWtlIGBkb1BhcmFsbGVsYCBhbmQgYGZvcmVhY2hgIGNhbiBoZWxwIGRpc3RyaWJ1dGUgeW91ciBjb2RlIGFuZCBrZWVwIGl0IHN0cmVhbWxpbmUuICAKCkkgdGhpbmsgdGhlcmUgYXJlIG1hbnkgd2F5cyB0byBtYWtlIHlvdXIgY29kZSBmYXN0ZXIsIGJ1dCB3aGF0IHdpbGwgbWF0dGVyIG1vc3QgYXJlIHRoZSByZXNvdXJjZXMgeW91IGhhdmUgd2hlbiB5b3UncmUgYXQgd29yay4gSSB3b3VsZCBhbHNvIGNhdXRpb24gYWJvdXQgc2VydmVyIHRyYWZmaWMuIElmIHlvdSBoYXZlIHNvbWV0aGluZyBkZW1hbmRpbmcgeW91IG5lZWQgdG8gcnVuLCBydW4gaXQgb3Zlcm5pZ2h0IHNvIHlvdSBnZXQgc2hvcnRlciB3YWl0IHRpbWVzIHdoaWxlIHlvdSdyZSBwaHlzaWNhbGx5IGF0IHRoZSBvZmZpY2UuIChSSVAsIHdoZW4gaXMgYW55b25lIGdvaW5nIHRvIGJlIGJhY2sgYXQgdGhlIG9mZmljZT8pCgoKIyMgUHJlc2VudGF0aW9ucyB0byBidXNpbmVzcyBwYXJ0bmVycyB3aWxsIGxvc2UgbG90cyBvZiB0ZWNobmljYWxpdGllcy4gS2VlcCBhbiBhcHBlbmRpeC4KUHVuY2ggbGluZXMgYW5kIHRoZSBsb25nIHN0b3J5IHNob3J0LiBNeSBmcmllbmRzIGFuZCBJIHByZXNlbnRlZCBvdXIgZGF0YSBzY2llbmNlIHByb2plY3QgdGhhdCB3YXkuIFRydXRoIGJlIHRvbGQsIEkgbG92ZSBteXNlbGYgYW4gaW50ZW50aW9uYWxseSBzaGFycCBhbmQgYnVzaW5lc3MtZm9jdXNlZCBwcmVzZW50YXRpb24uIEkgcHJlZmVyIHRvIGJlIHVuZGVyc3Rvb2QgcmF0aGVyIHRoYW4gY29uZnVzZSBvdGhlcnMgd2l0aCBteSBBTk4sIE1MLCBDTk4sIFJGLCBBQkMsIFRMRFIuIEJ1dCBpdCBuZXZlciBvY2N1cnJlZCB0byBtZSBob3cgcHVuaXNoaW5nIGl0IG1pZ2h0IGJlIHRvIG5vdCBkaXNwbGF5IGFsbCB5b3VyIHRlY2huaWNhbCBoYXJkIHdvcmsuIEkgcmVhbGx5IGRvbid0IGtub3cgd2h5IEkgbmV2ZXIgdGhvdWdodCBvZiBpdC4gUHJvYmFibHkgYmVjYXVzZSBJJ20gYW4gZW50ZXJ0YWluZXIgYXQgaGVhcnQuIAoKTWF0dGVyIG9mIGZhY3QsIHlvdXIgcHJlc2VudGF0aW9uIHdpbGwgYmUgc2h5IG9mIGEgcmVmbGVjdGlvbiBvZiB5b3VyIGhhcmQgd29yay4gV2hhdCBpdCByZWFsbHkgd2lsbCBiZSBpcyBhIHRyYW5zbGF0aW9uIG9mIHlvdXIgaGFyZCB3b3JrIGludG8gaW1wYWN0ZnVsIGJ1c2luZXNzIHN0YXRlbWVudHMuIE5vdCBvbmUgaXMgbW9yZSB2YWx1YWJsZSB0aGFuIHRoZSBvdGhlci4gU28gdGFrZSB5b3VyIGhhcmQgd29yay4gU2V0IHRoZSBzdGFnZSB3aXRoIHlvdXIgZGF0YSBzY2llbmNlIGFzIHRoZSBiYWNrZHJvcC4gV2hlbiB5b3UncmUgdXAgdGhlcmUgcHJlc2VudGluZywgaGl0IHRoZSBpbXBvcnRhbnQgYnVzaW5lc3MgcXVlc3Rpb25zLiBJZiBhbnlvbmUgaGFzIGEgdGVjaG5pY2FsIHF1ZXN0aW9uLCBmbGlwIG92ZXIgdG8geW91ciBzbGlkZSBhcHBlbmRpeCB3aGljaCB5b3UgY2FuIGZpbGwgd2l0aCBsb3RzIGFuZCBsb3RzIG9mIGNvZGUsIHBsb3RzLCBhbmQgYWxsIHRoYXQgc2hpbnkgZ29vZCBzdHVmZi4KCiMjIEFzIGEgZGF0YSBzY2llbnRpc3QsIHlvdSB3aWxsIGhhdmUgeW91ciBhZG1pcmVycyBhbmQgeW91ciBoYXRlcnMuCk1MLCBBSSwgYW5kIGJpZyBkYXRhIGFyZSBhbGwgaG90IHdvcmRzLiBJc24ndCB0aGF0IHdoeSB5b3Ugd2FudGVkIHRvIGJlY29tZSBhIGRhdGEgc2NpZW50aXN0IGFueXdheT8gV2VsbCwgZm9yIG1lIC0tIHllYWgsIHByb2JhYmx5LiBJIGdpdmUgaW50byBoeXBlLiBCdXQgSSBzdHVjayBhcm91bmQgcmlnaHQ/IFNvICM2IHNlZW1zIGEgbGl0dGxlIG9idmlvdXMsIGJ1dCBJIHRoaW5rIGl0J3MgYSBwb2ludCB0aGF0IHdhcyByZWFsbHkgaW1wb3J0YW50IGZvciBtZSB0byBkcml2ZSBob21lLgoKU28sIHlvdXIgY29sbGVhZ3VlcyB3aWxsIHVzZSBkYXRhLWNlbnRyaWMgd29yZHMuIFRoZXkgd2lsbCB0YWxrIGFib3V0IG1ha2luZyBkYXRhLWRyaXZlbiBkZWNpc2lvbnMuIC4uLiBZZXMsIGV2ZW4geW91ciBub250ZWNobmljYWwgY29sbGVhZ3Vlcy4gU29tZSBvZiB0aGVtIHdpbGwgYmUgYWJzb2x1dGVseSBmYW50YXN0aWMgYW5kIGtub3cgd2hhdCB0aGV5J3JlIHRhbGtpbmcgYWJvdXQuIFlvdSB3b24ndCBoYXZlIHRvIGV4cGxhaW4gdG8gdGhlbSB0aGUgaW1wb3J0YW5jZSBvZiB3aGF0IHlvdSdyZSBkb2luZyBhdCB3b3JrIGJlY2F1c2UgInF1ZWVucyByZWNvZ25pemUgcXVlZW5zIi4KCk90aGVyIGNvbGxlYWd1ZXMgd2lsbCBub3QgdW5kZXJzdGFuZCB5b3VyIHdvcmsuIFNvbWUgd2lsbCBkaXNjb3VudCBpdCBhbmQgcXVlc3Rpb24gd2h5IGl0IGV2ZW4gdGFrZXMgeW91IHNvIGxvbmcgdG8gZG8gaXQuIFRoaXMgaXMgbm90IG9rYXkhICJEYXRhIHNjaWVuY2UiIGlzIGEgbmV3IHRlcm0gZm9yIGEgbG90IG9mIG9sZCBjb25jZXB0cyBtZWxkZWQgdG9nZXRoZXIgdG8gc29sdmUgbW9kZXJuIHByb2JsZW1zLiBBIGxvdCBvZiBwZW9wbGUgd2lsbCBub3Qga25vdyB0aGF0IG9yIHJlc3BlY3QgaXQuIEJ1dCB0aGV5IGRvbid0IGtub3cgaG93IGhhcmQgeW91IHdvcmsuIEFuZCB5b3UgZG9uJ3QgbmVlZCB0byBnbyBvdXQgb2YgeW91ciB3YXkgdG8gcHJvdmUgdG8gdGhlbSB5b3VyIHdvcnRoLiBCdXQgZG8gYXNzZXJ0IHlvdSdyZSB2YWx1YWJsZSBhbmQgd29ydGh5IG9mIHJlc3BlY3QgaW4gdGhlIHdheXMgeW91IGNhbi4gU3BlYWsgY29uZmlkZW50bHkuIEtlZXAgZXllIGNvbnRhY3QuIEJlIHBhdGllbnQsIGJlIGV4Y2l0ZWQsIGJlIHlvdXJzZWxmIHVuYXBvbG9nZXRpY2FsbHkuCgpXaGVuIEkgbWVudGlvbmVkICJjb2xsZWFndWVzIiwgSSdtIG5vdCBzdXJlIHdobyB5b3UgaW1hZ2luZWQgSSB3YXMgdGFsa2luZyBhYm91dCwgYnV0IEkgd2FudCB5b3UgdG8gaW1hZ2luZSB3aXRoIG1lIG5vdy4gQSBjb2xsZWFndWUgY291bGQgYmUgc29tZW9uZSBmcm9tIGFub3RoZXIgZGVwYXJ0bWVudCB3aG8gc2ltcGx5IGRvZXNuJ3Qga25vdyB3aGF0IHlvdSBkbyBvciBhIGNvbGxlYWd1ZSBjb3VsZCBiZSBpbiB5b3VyIGRlcGFydG1lbnQgd29ya2luZyBhIGZldyBkZXNrcyBmcm9tIHlvdS4gV2UgY291bGQgaW1hZ2luZSB0aGF0IGNvbGxlYWd1ZSBlYXNpbHkgdG8gYmUgc29tZW9uZSBvZiBzaW1pbGFyIHByb2Zlc3Npb25hbCBleHBlcmllbmNlIHRvIHlvdSBidXQgZnJvbSBhdCBsZWFzdCBhIHNsaWdodGx5IGRpZmZlcmVudCByb2xlLiBCdXQgaW1hZ2luZSB0aGlzIGZvciBhIHNlY29uZC4gSW1hZ2luZSB0aGlzIGNvbGxlYWd1ZSB0byBiZSBhIHNlbmlvciBkaXJlY3RvciBvciBzb21lb25lIEMtbGV2ZWwgd2l0aCB0b25zIG9mIGNhcmVlciBleHBlcmllbmNlLiBUaGlzIGNhbiBiZSBoYXJkIHRvIGRpZ2VzdCBpZiB5b3UgZXhwZXJpZW5jZSBpdCBpbiByZWFsIGxpZmUsIGJ1dCBhdCBhbGwgbGV2ZWxzIG9mIHRoZSB3b3JrcGxhY2UsIHlvdSBjYW4gZmluZCBibGF0YW50IGFwYXRoeSB0b3dhcmQgeW91ciBsaW5lIG9mIHdvcmsuCgpCdXQgSSBob3BlIHlvdSBmaW5kIGFwcHJlY2lhdGlvbi4gRGF0YSBzY2llbmNlIGRvZXMgd29uZGVycy4KCgojIyBEbyB5b3VyIHdyaXRlIHVwcy4gRGFpbHkuICAKPGNlbnRlcj4KPGltZyBzcmM9J2ltYWdlcy9JTUdfMTEzMi5KUEcnIHdpZHRoPSc3MCUnPgo8L2NlbnRlcj4KCk15IGZyaWVuZHMgYW5kIEkgdG9vayB1cCBvdXIgYm9zcyBEYW4gRHJpc2NvbGwncyBvZmZpY2UgdGhlIHdob2xlIHN1bW1lci4gSXQgd2FzIG5pY2UgdG8gaGF2ZSB0aGF0IGxldmVsIG9mIHByaXZhY3kgYXMgYSBuZXdjb21lciwgZXNwZWNpYWxseSB3aGVuIHdlIHdlcmUgZGF6ZWQgYW5kIGNvbmZ1c2VkLiBFdmVyeSBzbyBvZnRlbiwgRGFuIHdvdWxkIHdhbGsgaW4gYW5kIGFzayB1cyB3aGF0IHdlIHdlcmUgdXAgdG8uIFdlIHNvb24gbGVhcm5lZCB0aGF0IGF0IGFueSBwb2ludCBpbiB0aW1lLCBzb21lIHBhcnQgb2Ygb3VyIHdvcmsgaGFkIHRvIGJlIHJlYWR5IHRvIHNob3cuIE9ubHkgeW91IGtub3cgZXhhY3RseSB3aGF0IHlvdSd2ZSBsZWFybmVkIHNpbmNlIHlvdXIgYm9zcyBsYXN0IHdhbGtlZCBpbiwgc28gd3JpdGUgZG93biB5b3VyIGRpc2NvdmVyaWVzIGFzIHlvdSBnby4gSSBwcmVmZXIgd3JpdGluZyB1cCBgUmAgbm90ZWJvb2tzIGFuZCBtYWtpbmcgZ3JhcGhpY2FsIHN1bW1hcmllcyBvbiBLZXlub3RlIChBcHBsZSdzIFBvd2VycG9pbnQuLi4gSSBtdWNoIHByZWZlcikuCgpQcm8tdGlwOiBBdCB0aGUgZW5kIG9mIGVhY2ggZGF5LCBtYWtlIHN1cmUgeW91J3ZlIHdyaXR0ZW4gdXAgeW91ciBjb2RlIHNvIGl0IGlzIHJlcHJvZHVjaWJsZS4gQmUgYWJsZSB0byBjbGljayAnUnVuJyBvbiB5b3VyIHNjcmlwdCwgYW5kIG1ha2Ugc3VyZSBpdCBydW5zIHdpdGhvdXQgZXJyb3JzLiBBcyBhIHJlZmVyZW5jZSB0byAjMSwgaGF2aW5nIHlvdXIgd29yayBwYWNrYWdlZCB1cCBsaWtlIHRoaXMgc2hvd3MgdGhhdCB5b3UgaGF2ZSBhbHdheXMgZG9uZSBzb21ldGhpbmcuCgoKIyMgWW91ciBoaWdoZXIgdXBzIGhhdmUgZG9uZSB5b3VyIGpvYiBiZWZvcmUgKGhvcGVmdWxseSkuIFRha2UgYWR2YW50YWdlIG9mIHRoYXQuCk9uZSBvZiBvdXIgR2FwIGRhdGEgc2NpZW5jZSBib3NzZXMsIENocmlzIENoYXBvLCB3YXMgcXVpdGUgdGhlIGdlbml1cyB3aXRoIGEgY3J1bmNoIGZvciB0aW1lLiAoSSBzYXkgdGhpcyBzdXBlciByZXNwZWN0ZnVsbHksIHRydXN0IG1lLikgV2UgbWV0IHdpdGggaGltIHNldmVyYWwgdGltZXMgZHVyaW5nIG91ciBpbnRlcm5zaGlwIHRvIGRpc2N1c3Mgb3VyIHByb2plY3QgcHJvZ3Jlc3MuIEl0IHdhcyBhIHNjYXJ5IGZlZWxpbmcsIHJlYWxseSwgdG8gYmUgYSBtZWFnZXIgaW50ZXJuIGFuZCBwcmVzZW50aW5nIHByb2plY3QgZ29hbHMvdGhvdWdodHMgdG8gc29tZW9uZSBzbyBwaXZvdGFsIHRvIHRoZSBjb21wYW55LiBJIGhhZCB0byBnZXQgb3ZlciB0aGUgaW1wb3N0ZXIgc3luZHJvbWUgYW5kIGZvY3VzIG9uIGFkZGluZyB2YWx1ZSB0byB0aGUgdGltZSB0aGF0IENocmlzIENoYXBvIHNldCBhc2lkZSBmb3IgbXkgcGFydG5lcnMgYW5kIG1lLgoKQmVmb3JlIGdvaW5nIGludG8gb3VyIG1lZXRpbmdzLCBBc2hsZXksIEFubmksIGFuZCBJIGFsd2F5cyBnb3Qgb24gdGhlIHNhbWUgcGFnZSBvbiB3aGF0IHdlIHdlcmUgZ29pbmcgdG8gZm9jdXMgb24uIEkgdW5pbnRlbnRpb25hbGx5IHBsYXllZCB0aW1la2VlcGVyIGluIHRoZSBtZWV0aW5nLiBXZSBoYWQgdGhlIG1vc3QgaW1wb3J0YW50IHF1ZXN0aW9ucyB3cml0dGVuIG91dCBhbmQgYWxsb3R0ZWQgYXBwcm9wcmlhdGUgdGltZSB0byBlYWNoLiBXYXRjaGluZyBDaHJpcyBwYWludCB0aGUgd2hpdGVib2FyZCBhbmQgc2hvdyB1cyBob3cgaGUgd291bGQgYXBwcm9hY2ggYSBsb3Qgb2YgdGhlIGNoYWxsZW5nZXMgd2UgZmFjZWQgd2FzIHJlYWxseSBleWUtb3BlbmluZy4gSGUgZXhwbGFpbmVkIHNpbXBsZSBzb2x1dGlvbnMgdG8gY29tcGxleCBwcm9ibGVtcy4gQW5kIGhhdGVkIHdyaXRpbmcgaW4gcmVkIG1hcmtlci4KCldoZW4gRGFuIHdvdWxkIHdhbGsgaW4gdG8gb3VyIG9mZmljZSwgd2Ugd291bGQgYXNrIHNvIG1hbnkgcXVlc3Rpb25zLiBIZSBhbHdheXMgaGFkIGEgcmVhbGx5IGdvb2QgYW5zd2VyLiBBbmQgbm90IGp1c3QgdGhhdCwgbGlrZSB0aGUgZ29vZCBib3NzIGhlIHdhcywgaGUgd291bGQgbWFrZSB1cyByZWFsbHkgdGhpbmsgYW5kIHRocm93IHF1ZXN0aW9ucyBiYWNrIGF0IHVzLiBPbmUgb2YgbXkgZmF2b3JpdGUgY2hhdHMgd2l0aCBEYW4gd2FzIGFib3V0IHVzaW5nIGRlbW9ncmFwaGljIGluZm9ybWF0aW9uIGluIG1hcmtldGluZyBkYXRhIHNjaWVuY2UuIFdlIGRpZG4ndCBjb21lIHRvIGEgY29uc2Vuc3VzIHdpdGhpbiB0aGUgcm9vbSwgYnV0IGhhdmluZyB0aGVzZSBkaXNjdXNzaW9ucyB3aXRoIG91ciBoaWdoZXIgdXBzIHJlYWxseSBnYXZlIG1lIHBlcnNwZWN0aXZlLiBJdCBhbHNvIGdhdmUgbWUgcGVyc3BlY3RpdmUgdG8ga25vdyB0aGF0IERhbiBkaWQgYWxsIG9mIGhpcyBkYXRhIHNjaWVuY2UgY29kaW5nIGluIEMgLi4uIFdvdy4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCgpJdCdzIHNvIGltcG9ydGFudCB0byByZW1lbWJlciB0aGF0IHRob3VnaCB5b3UgY2FuIGJlIHRoZSBzbWFydGVzdCBzdHVkZW50IGluIHNjaG9vbCwgYmVpbmcgYWJsZSB0byBsaXN0ZW4gKHNvZnQgc2tpbGwpIGFuZCBiZWluZyBhYmxlIHRvIGFkYXB0IChzb2Z0IHNraWxsKSBhcmUgdGhlIG1vc3QgaW1wb3J0YW50IHRoaW5ncyB0byBmbGV4IGluIHRoZSB3b3JrcGxhY2UuIFlvdXIgdGVjaG5pY2FsaXRpZXMgd2lsbCBzaGluZSB0aHJvdWdoIHJlZ2FyZGxlc3MuIEZsYXNoIGZvcndhcmQgYSB5ZWFyIGZyb20gYmVpbmcgcGFydCBvZiBHYXAgSW50ZXJucyAyMDE5LCBBc2hsZXkgaGFzIG5vdyBncmFkdWF0ZWQgZnJvbSBDYWwgUG9seSBTTE8gaW4gU3RhdGlzdGljcyBhbmQgaXMgYSBkYXRhIHNjaWVuY2UgaW50ZXJuIGZvciBhIHN0YXJ0dXAgaW4gU28gQ2FsLiBBbm5pIGdyYWR1YXRlZCBmcm9tIFVXIGFuZCBpcyBub3cgc3RhcnRpbmcgb2ZmIGhlciBQaEQgaW4gc3RhdGlzdGljcyBhdCBDYXJuZWdpZSBNZWxsb24uIEkgY291bGRuJ3QgYmUgbW9yZSBwcm91ZCBvZiB0aG9zZSB0d28gZGF0YSBib3lzLiBJIGZlZWwgbGlrZSBvdXIgc3VtbWVyIHRvZ2V0aGVyIHdhcyBpbmNyZWRpYmxlLCBhbmQgd2hlbiBJIHNheSB3ZSB3ZW50IHRocm91Z2ggc28gbXVjaCB0b2dldGhlciwgd2UgcmVhbGx5IGRpZC4gVGhhbmtzLCBBc2hsZXkgYW5kIEFubmkuIEFuZCBTdWJoYSwgR2lhbm5hLCBhbmQgQ2FpdGkgKG91ciBzdW1tZXIgRlRFIGJ1ZGRpZXMpLiBBbm5pIGRyZXcgdGhpcyBvZiB1cy4KCjxjZW50ZXI+CjxpbWcgc3JjPSdpbWFnZXMvZGF0YS1ib3l6LXBhaW50aW5nLnBuZycgd2lkdGg9JzcwJSc+CjwvY2VudGVyPgoKQXMgZm9yIG1lLCBJJ20gc3RpbGwgbG9va2luZyBmb3IgdGhlIHJpZ2h0IHBsYWNlbWVudC4gSXQgc3Vja2VkIGdldHRpbmcgcmVzY2luZGVkLCBidXQgSSdtIHJlYWxseSBob3BlZnVsIHRoYXQgd2hlcmV2ZXIgSSBnbyBuZXh0LCBJJ2xsIGZpbmQgbWFueSBwb3NpdGl2ZSBsZWFybmluZyBleHBlcmllbmNlcy4=