From 16ae5f6dcf3d3c81c1c9f0f49812842d0e531aa2 Mon Sep 17 00:00:00 2001 From: Chris Coyne Date: Mon, 18 Jul 2011 10:30:03 -0400 Subject: [PATCH] brochure website for tamejs, first real version. could use a redesign. --- web/css/prettify.css | 1 + web/css/tamejs_site.css | 136 ++++++++++ web/img/bg2.png | Bin 0 -> 68473 bytes web/img/fork_me.png | Bin 0 -> 7327 bytes web/img/temp_logo.png | Bin 0 -> 15570 bytes web/index.html | 587 +++++++++++++++++++++++++++++++++++++++- web/js/prettify.js | 28 ++ web/js/tamejs_site.js | 47 ++++ 8 files changed, 798 insertions(+), 1 deletion(-) create mode 100644 web/css/prettify.css create mode 100644 web/css/tamejs_site.css create mode 100644 web/img/bg2.png create mode 100644 web/img/fork_me.png create mode 100644 web/img/temp_logo.png create mode 100644 web/js/prettify.js create mode 100644 web/js/tamejs_site.js diff --git a/web/css/prettify.css b/web/css/prettify.css new file mode 100644 index 0000000..d44b3a2 --- /dev/null +++ b/web/css/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} \ No newline at end of file diff --git a/web/css/tamejs_site.css b/web/css/tamejs_site.css new file mode 100644 index 0000000..5db7874 --- /dev/null +++ b/web/css/tamejs_site.css @@ -0,0 +1,136 @@ +body { + background: white url(/img/bg2.png) repeat-x top center; + font-family:arial; + font-size:15px; +} +.fixed { + position:fixed; +} +#wrapper { + margin: 0 auto; + width:740px; +} +#google_plus_container, #facebook_like_container, #tweet_container { + padding:3px; + margin-left:35px; +} +#tweet_container { + margin-top:10px; +} +#logo { + width:316px; + margin:0 auto; + margin-top:100px; + margin-bottom:100px; +} +#body_column { + padding: 10px 10px; + width: 740px; + background: #fff; + border:2px solid #eee; + -webkit-border-radius: 12px; + -moz-border-radius: 12px; + color: #555; +} +#body_left { + width:200px; + float:left; +} +#body_right { + width:520px; + float:left; +} +#body_right p { + line-height:1.5em; + margin-top:30px; +} +a { + color:#6aaaff; + text-decoration:none; +} +#body_right h3 { + font-size:1.6em; + margin-top:30px; +} +.note_container { + margin:10px; + padding:20px 20px 20px 20px; + background-color:#f8f8f8; + border:2px solid #eee; + -webkit-border-radius: 12px; + -moz-border-radius: 12px; +} +.note_container p { + line-height:1.5em; + margin: 5px 0 5px 0px; + font-size:0.8em; +} +.note_container b { + font-size:1.0em; +} +.note_container h4 { + text-align:center; + margin-top:0px; +} +.main_ul { +} +.main_ul li { + margin:5px 0 5px 0px; + line-height:1.5em; +} +.code_term { + font-weight:bold; + color:#E28964 +} +.question { + font-weight: bold; +} +.answer { +} + +/* ------------- */ +/* Pretty printing styles. Used with prettify.js. */ +/* Vim sunburst theme by David Leibovic */ + +pre { + font-family:courier; + font-size:9pt; +} +pre.prettyprint { + border-width:0; + border-top:1px solid #eee; + border-bottom:1px solid #eee; + margin:10px; + padding:20px; +} +pre .str, code .str { color: #65B042; } /* string - green */ +pre .kwd, code .kwd { color: #E28964; } /* keyword - dark pink */ +pre .com, code .com { color: #AEAEAE; font-style: italic; } /* comment - gray */ +pre .typ, code .typ { color: #89bdff; } /* type - light blue */ +pre .lit, code .lit { color: #3387CC; } /* literal - blue */ +pre .pun, code .pun { color: #999; } /* punctuation - white */ +pre .pln, code .pln { color: #666; } /* plaintext - white */ +pre .tag, code .tag { color: #89bdff; } /* html/xml tag - light blue */ +pre .atn, code .atn { color: #bdb76b; } /* html/xml attribute name - khaki */ +pre .atv, code .atv { color: #65B042; } /* html/xml attribute value - green */ +pre .dec, code .dec { color: #3387CC; } /* decimal - blue */ + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { margin-top: 0; margin-bottom: 0; color: #AEAEAE; } /* IE indents via margin-left */ +li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8 { list-style-type: none } +/* Alternate shading for lines */ +li.L1,li.L3,li.L5,li.L7,li.L9 { } + +@media print { + pre .str, code .str { color: #060; } + pre .kwd, code .kwd { color: #006; font-weight: bold; } + pre .com, code .com { color: #600; font-style: italic; } + pre .typ, code .typ { color: #404; font-weight: bold; } + pre .lit, code .lit { color: #044; } + pre .pun, code .pun { color: #440; } + pre .pln, code .pln { color: #000; } + pre .tag, code .tag { color: #006; font-weight: bold; } + pre .atn, code .atn { color: #404; } + pre .atv, code .atv { color: #060; } +} + diff --git a/web/img/bg2.png b/web/img/bg2.png new file mode 100644 index 0000000000000000000000000000000000000000..7a7a6b9ace4630d50b253bc502459a0466e8007f GIT binary patch literal 68473 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%0A@vTy@+j3*(>En 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 literal 0 HcmV?d00001 diff --git a/web/img/fork_me.png b/web/img/fork_me.png new file mode 100644 index 0000000000000000000000000000000000000000..95c6074a238f871365ac3ff09e7257579c13e88d GIT binary patch literal 7327 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 literal 0 HcmV?d00001 diff --git a/web/index.html b/web/index.html index faf8268..92d4649 100644 --- a/web/index.html +++ b/web/index.html @@ -1 +1,586 @@ -hello world, take 4. + + + Tame.Js from the creators of OkCupid + + + + + + + + +Fork me on GitHub +
+ +
+
+ +
+

TOC

+ + Sharing Links (DON'T CLICK YET):
+ (hey, don't click these yet)

+
+ +
+
+ +
+
+
+
+

Contact

+
    +
  • max at okcupid.com
  • +
+

The Code

+ + +
+
+   +
+
+
+ +

What is Tame?

+

+ Tame (or "TameJs") is an extension to JavaScript, written in JavaScript, that makes event programming easier to write, read, and edit. + Tame is very easy to use in Node and other V8 projects. And it can be dropped into projects where desired - no need to rewrite any existing code. +

+

+ You can jump into Tame on github, but here you'll find some notes + on what we learned at OkCupid over the years and why we think Tame is needed for more ambitious projects. (Control-flow libraries are not good enough!) We've written hundreds + of thousands of lines of purely async code at OkCupid, and our code has stayed extremely manageable, even after 8 years of development. +

+

+ Note Tame is not an attempt to dumb down async programming. It's just a cleaner way to write it. + Further, your programs will likely have lower latency; with Tame it's a lot easier to keep parallel calls parallel. +

+

A Simple Scenario

+

+ Let's say you're running a hot dating site, and a certain user, "Angel", just looked at another user, "Buffy." + And here's one tiny piece of your program: +

+
+

+ When Angel views Buffy +

+
    +
  • Figure out their match score
  • +
  • Request a new, next match for Angel to look at.
  • +
  • Record that Angel stalked Buffy, and get back the last time it happened.
  • +
  • Send Buffy an email that Angel just looked at her, but only if: +
      +
    1. they're a good match, and
    2. +
    3. they haven't looked at each other recently.
    4. +
    +
+
+

+ This isn't very complicated logic. In our pre-async minds, our code looks something like this: +

+
+handleVisit : function(angel, buffy) {
+	var match_score = getScore(angel, buffy);
+	var next_match  = getNextMatch(angel);
+	var visit_info  = recordVisitAndGetInfo(angel, buffy);
+	if (match_score > 0.9 && ! visit_info.last_visit) {
+		sendVisitorEmail(angel, buffy);
+	}
+	doSomeFinalThings(match_score, next_match, visit_info);
+}
+
+

+ But of course these are all blocking calls requiring callback events. So our code ends up like this: +

+
+handleVisit : function(angel, buffy) {
+  getScore(angel, buffy, function(match_score) {
+    getNextMatch(angel, function(next_match) {
+      recordVisitAndGetInfo(angel, buffy, function(visit_info) {
+        if (match_score > 0.9 && ! visit_info.last_visit) {
+          sendVisitorEmail(angel, buffy);
+        }
+        doSomeFinalThings(match_score, next_match, visit_info);
+      });
+    });
+  });
+}
+
+

+ There are other ways we could have written it, defining named callback functions, for example. Either way, + it's pretty easy to write. But for an outside reader - or you returning to your own code later - it's difficult to follow and far worse to edit or rearrange. + And it's just a simple example. In practice, + a full async stack means one path through your code has dozens of calls and callbacks littered across all kinds of unnatural functions you were forced to create. + Inserting new calls and rearranging are cumbersome. +

+

+ We learned this about 6 months in at OkCupid. Our web services started out simple and elegant, like the example above, but the more developers added to them, the more absurd our code got. There were some dark days at OkCupid. Once we started integrating more async code: a distributed cache, a pub/sub system, etc., our code got heinous. +

+

+ (A note for more experienced devs: control-flow libraries helped us fire our code in parallel, but they wouldn't let us throw async calls into the middle of an existing function without hacking that function in half. Later in this page you'll see an example that's horrible with such libraries.) +

+

+ But back to our example. Worse than ugliness, we've made a programming mistake. All of those calls are made in serial. getNextMatch, getScore, and recordVisit are all contacting different servers, so they should be fired in parallel. +

+ +

So...how does Tame solve this?

+
+var res1, res2;
+twait {
+	doOneThing(mkevent(res1));
+	andAnother(mkevent(res2));
+}
+thenDoSomethingWith(res1, res2);
+
+ +

+ As shown above, Tame introduces 2 keywords, twait and mkevent (short for "make event"). They are used in tandem. +

+ +

+ twait is pretty simple: it blocks off a section of code you'd like to execute before proceeding. + mkevent lets twait know what to wait for. In other words, it returns an anonymous function that you give to your async functions as a callback. If your callback function is supposed to take arguments, name them as arguments to mkevent, and they'll + be available after the twait block. +

+

+ mkevent is syntactic sugar, but think of it as "dropping" a callback function in its place. +

+

+ Sound confusing? It's really not when you see it in action. Let's show some example code. +

+
+for (var i = 0; i < 10; i++) {
+	twait { setTimeout (mkevent (), 100); }
+	console.log ("Hello world! " + i);
+}
+
+

+ The above code prints "Hello world" 10 times, separated by 100ms. The code looks and feels like threaded code, but it uses preexisting async-style functions. + To be clear: this is the setTimeout you know and love, unmodified. TameJS works with all existing async code. + setTimeout is expecting a function to execute, and that's what mkevent() is providing. +

+

+ What happens if we put two setTimeout calls inside one twait? +

+for (var i = 0; i < 10; i++) {
+	twait { 
+		setTimeout (mkevent (), 10); 
+		setTimeout (mkevent (), 100); 
+	}
+	console.log ("Hello world! " + i);
+}
+
+ +

+ Tame's beauty is starting to unfold here: 2 timers are fired at once, and after both have returned the loop continues. So every + 100ms it prints "Hello world" and the next number. +

+ Moving the twait outside the for loop is acceptable. All 20 timers would fire at once, and this + code would let out your feelings in approximately 100ms: +

+
+var message = "I'm starting to get turned on.";
+twait { 
+	for (var i = 0; i < 10; i++) {
+		setTimeout (mkevent (), 10); 
+		setTimeout (mkevent (), 100); 
+	}
+}
+console.log (message);
+
+
+ + +

+ In practice your async functions call back with information, and you want mkevent to collect that information. + Let's use Node's dns.resolve function: +

+
+var err, ip;
+twait { 
+	dns.resolve (host, "A", mkevent (err, ip));
+}
+if (err) { console.log ("ERROR! " + err); } 
+else { console.log (host + " -> " + ip); }
+
+ +

+ Notice that dns.resolve is expecting a third parameter, a function + to call with its result. mkevent provides a function that collects + the results into err and ip. +

+

+ Tame also lets us name those variables inline, for convenience: +

+
+twait { 
+	dns.resolve (host, "A", mkevent (var err, ip));
+}
+
+ +

+ And finally, here's our first full Node program, a parallel DNS resolver that looks + up all its arguments at once. +

+ +
+var dns = require("dns");
+
+function do_one (ev, host) {
+    twait { 
+    	dns.resolve (host, "A", mkevent (var err, ip));
+    }
+    if (err) { console.log ("ERROR! " + err); } 
+    else { console.log (host + " -> " + ip); }
+    ev();
+};
+
+function do_all (lst) {
+    twait {
+        for (var i = 0; i < lst.length; i++) {
+            do_one (mkevent (), lst[i]);
+        }
+    }
+};
+do_all (process.argv.slice (2));
+
+

+ All the DNS lookups are parallel, and output is fast: +

+
+yahoo.com -> 72.30.2.43,98.137.149.56,209.191.122.70
+google.com -> 74.125.93.105,74.125.93.99,74.125.93.104
+nytimes.com -> 199.239.136.200
+okcupid.com -> 66.59.66.6
+
+ +

+ If you want to do these DNS resolutions in serial (rather than parallel), then the change from above is trivial: just switch the order of the twait and for statements above: +

+
+function do_all (lst) {
+    for (var i = 0; i < lst.length; i++) {
+        twait {
+            do_one (mkevent (), lst[i]);
+        }
+    }
+}
+
+

Back to Angel and Buffy

+ +

+ And finally, here's the Angel & Buffy code, Tamed. +

+
+
+handleVisit : function(angel, buffy) {
+
+	//
+	// let's fire all 3 at once
+	//
+
+	twait {
+		getScore (angel, buffy, mkevent(var score));
+		getNextMatch (angel, buffy, mkevent(var next));
+		recordVisitAndGetInfo (angel, buffy, mkevent(var vinfo));
+	}
+
+	//
+	// they've called back, and now we have our data
+	//
+
+	if (score > 0.9 && ! vinfo.last_visit) {
+		sendVisitorEmail(angel, buffy);
+	}
+	doSomeFinalThings(score, next, vinfo);
+}
+
+

+ The Tame code isn't just easier to read. Remeber, it also returns faster, firing all those calls in parallel. And if you want to change it, say by + adding another async call or removing one, you won't be ripping functions. +

+ +

A Real Buffy Example: Looping

+ +

+ This example shows off Tame even better, nesting two loops and doing all kinds of real-world matchmaking. +

+ +
+

+ What To Do When Buffy Hunts Men +

+
    +
  • Request 10 Matches
  • +
  • For each one: +
      +
    • Get their thumbnail URL from our picture server
    • +
        +
      • And ask our vampire server if it's a photo of a vamp
      • +
      +
    • If it's not a vamp: +
        +
      • Get a personality summary from our personality servers
      • +
      • Look up the last time they talked
      • +
      • And add it to the soulmates array
      • +
      +
    • +
    +
  • If we don't have at least 10 soulmates, find some more.
  • +
+
+ +

+ Here's the Tamed solution, heavily commented. +

+ +
+huntMen : function(buffy) {
+
+   var soulmates = [];
+ 
+   while (soulmates.length < 10) {
+ 
+      // Get 10 candidates for Buffy  
+      twait {  
+        getMatches(buffy, 10, mkevent(var userids));
+      }
+  
+      for (var i = 0; i < userids.length; i++) {
+        var u = userids[i];
+        twait {
+          // get their pic from our pic server
+          getThumbnail  (u, mkevent(var thumb));
+        }
+        twait {
+          // ask our pic analyzer to review
+          isPicAVampire(thumb, mkevent(var is_vamp));
+        }
+        if (! is_vamp) {
+          twait {
+            // get 2 more pieces of info
+            getPersonality(u, mkevent(var personality));
+            getLastTalked (u, match, mkevent(var last_talked));
+          }
+          soulmates.push({
+            "userid" : match,
+            "thumb"  : thumb,
+            "last_talked" : last_talked,
+            "personality" : personality
+          });
+        }
+      }
+   }
+ 
+   //
+   // Our function can now continue to do
+   // whatever it wants with
+   // soulmates...
+   //
+
+}
+
+

+ Note we're not providing an untamed version of the above for comparison. (We had a hard time + writing it.) If you're a Node programmer and up to the challenge: send us a version of it using + a control-flow library of your choice. +

+ + + +

How To Use Tame

+

+ In Node grab it with npm: +

+
+npm install -g tamejs
+
+

+ And just register the .tjs extension: +

+
+require ('tamejs').register (); // register the *.tjs suffix
+require ("mylib.tjs");          // then use node.js's import as normal
+
+ +

+ That's it! Tame will take care of the rest, compiling the tjs file into native JS. +

+

+ Or to use it from the command line: +

+
+tamejs -o <outfile> <infile>
+node <outfile> # or whatever you want
+
+ + + +

How Does It Work?

+

+ The key idea behind the TameJs implementation is Continuation-Passing Style (CPS) compilation. + On our github page we show a bunch of examples of what we actually do to tamed JS to convert it to real JS. +

+ + +

+ FAQ +

+

+ Is it open-source? What license is it? +

+

+ Yes, MIT. Fork it, dude. +

+ +

+ So you guys have been using Tame for years? +

+

+ Yes, a C++ version of it. (Max published a paper on it at MIT in 2007). Using Tame, OkCupid serves externally over 100 million highly dynamic HTTP requests every day (over 1,000/second on average), + each of which fires off calls to all kinds of other services, literally billions of async calls daily. Everything is Tamed, and we'll never look back. +

+

+ We've been watching the Node community for a while now, and here are our favorite sites/projects: HowToNode, debuggable, and Nodejitsu, and also the framework & middleware Express and Connect. The programmers at those sites have gotten us to turn our interest to Node. But async programming + can fail in language scalability, if not performance scalability. JavaScript is missing native support for this kind of control-flow. (It's worth noting C# just added an await primitive! They're onto us.) We have the experience to see what it does to large-scale projects. +

+

+ Can I use your C++ version of Tame? +

+

+ Yes, but unlike TameJs, it requires committing to certain other libraries you might not want (sfslite, libasync). TameJs + is designed for general use. +

+

+ What's wrong with a control-flow library? You know, say Step? Or Seq? +

+

+ First off, we're on the same boat as Tim Caswell, maker of Step, and James Halliday, maker of Seq. We clearly agree + that a system like this is needed. If they're like us, they're sick of seeing code like this on github: +

+

+ MongoDB Blog Example +

+

+ That poor developer! Good luck changing that code. +

+ As a quick comparison of Tame and Step, let's say you simply want to read a file and log its text in all caps. + In Tame it's very simple: +

+
+twait { 
+	fs.readFile (__filename, mkevent (var err, text)); 
+}
+if (err) { throw (err): }
+console.log (text.toUpperCase ());
+
+

+ Here's the same in Step - with code taken from Step's website. New functions "capitalize" and "showIt" had to be written. +

+Step(
+  function readSelf() {
+    fs.readFile(__filename, this);
+  },
+  function capitalize(err, text) {
+    if (err) throw err;
+    return text.toUpperCase();
+  },
+  function showIt(err, newText) {
+    if (err) throw err;
+    console.log(newText);
+  }
+);
+
+

+ Also, unlike the Step code, the Tame version can sit comfortably inside another function. If you want to read a file + and then use its text in your code, you don't have to split the containing function in half. +

+

+ Here's a second example from Step's website: +

+
+Step(
+  // Loads two files in parallel
+  function loadStuff() {
+    fs.readFile(__filename, this.parallel());
+    fs.readFile("/etc/passwd", this.parallel());
+  },
+  // Show the result when done
+  function showStuff(err, code, users) {
+    if (err) throw err;
+    console.log(code);
+    console.log(users);
+  }
+)
+
+

+ And Tame: +

+
+twait { 
+   fs.readFile (__filename, mkevent (var e1, code));
+   fs.readFile ("/etc/password", mkevent (var e2, users)); 
+}
+if (e1) throw e1;
+if (e2) throw e2;
+console.log (code);
+console.log (users);
+
+

+ Also of note: Step is making pretty specific assumptions about how + errors are passed. +

+ This isn't an attack on Tim's code. Step is the best option for native JS; Tame is a markup that's converted to JS. But this difference shouldn't matter, as Node, in all its greatness, allows us to compile Tame code as we require it. + So using Tame is as easy as using Step. +

+ +

+ In general, control-flow libraries aren't bad for simple examples (such as our 1st simple Buffy example), but they are not happy with more complicated flow management (such as our 2nd Buffy example). +

+ +

+ Have you heard about StratifiedJS? +

+ +

+ Yes - it's also a translation of JS and seems to use a similar compilation technique, and we think it's more evidence that the Node + community needs something on top of JS. However, the twait construct is more general + and easier to integrate. +

+ +

+ I'm still not sold. Ok? +

+ +

+ Just try it in an existing project. We hope it will grow on you. Fortunately you don't + need to commit to Tame for an entire project. +

+ +

Latest Release / Issues

+

+ It's brand new but working well! See us on github. +

+ +

Are you guys hiring?

+

+ Yes! If you're a Node developer and you'd like to help us build extremely scalable and useful websites and web apps, + let us know. We're hiring in NYC. To get in contact, email chris at okcupid. +

+
+
+
 
+
+ + diff --git a/web/js/prettify.js b/web/js/prettify.js new file mode 100644 index 0000000..eef5ad7 --- /dev/null +++ b/web/js/prettify.js @@ -0,0 +1,28 @@ +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), +l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p= scrollY + opt.padding && t.data("isFloating")) { + t.css({position: 'static', top: null, left: null}).data("isFloating", false); + } + } + }; + + $window.scroll(windowScroll).resize(windowScroll); +})(jQuery);