commit 7d9e54c418b7c96c3cf9512d17e3d78e69f939a1 Author: Tommy Parnell Date: Mon Jun 29 04:56:29 2015 -0400 init diff --git a/.bowerrc b/.bowerrc new file mode 100644 index 0000000..2f00fdf --- /dev/null +++ b/.bowerrc @@ -0,0 +1,4 @@ +{ + "directory": "public/components", + "json": "bower.json" +} diff --git a/.deployment b/.deployment new file mode 100644 index 0000000..1e42f16 --- /dev/null +++ b/.deployment @@ -0,0 +1,2 @@ +[config] +command = bash deploy.sh \ No newline at end of file diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..d1d8a41 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5fa7f16 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +public/components +.sass-cache +public/out diff --git a/app.js b/app.js new file mode 100644 index 0000000..18dafca --- /dev/null +++ b/app.js @@ -0,0 +1,11 @@ + + +var express = require('express'), + config = require('./config/config'); + +var app = express(); + +require('./config/express')(app, config); + +app.listen(config.port); + diff --git a/app/controllers/home.js b/app/controllers/home.js new file mode 100644 index 0000000..91b8a14 --- /dev/null +++ b/app/controllers/home.js @@ -0,0 +1,11 @@ +var express = require('express'), + router = express.Router(); + +module.exports = function (app) { + app.use('/', router); +}; + +router.get('/', function (req, res, next) { +//var articles = [new Article(), new Article()]; + res.render('index', {}); +}); diff --git a/app/models/.keep b/app/models/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/views/index.vash b/app/views/index.vash new file mode 100644 index 0000000..5977628 --- /dev/null +++ b/app/views/index.vash @@ -0,0 +1,334 @@ + + + + Tommy James Parnell + @*Meta*@ + + + + + + + + + + + + + + + + + + + + + +
+
+ Tommy Parnell +
+

Tommy Parnell

+

Web Applications Developer

+ +
+
+ @* @if (!string.IsNullOrWhiteSpace(Model.CurrentBeer)) + { + drinking: @Model.CurrentBeer + } *@ + Contact Me +
+
+
+ +
+
+
+
+
+

About Me

+
+

Ops turned Dev. I love solving huge web problems. I love C#, but I am open to using any language/technology. I really enjoy working with cloud technologies, and utilizing the latest Continuous Integration techniques

+ +

On my free time I like to play guitar, and tinker with various cloud technologies

+
+
+
+
+
+

Work Experience

+
+
+

Software Engineer Vistaprint.com (2015 - Present)

+

+ Software engineer for vistaprint's gallery, and keyword search platform
+ Javascript, C#, Ruby, Bower, Grunt, Rake, MVC 6, SQLServer, Backbone.js, React.js, Jenkins, AWS, ElasticBeanstalk
+

+

See Gallery Live

+ +
+
+

Lead Systems Administrator Vistaprint.com (2011 - 2015)

+

Devops Engineer, Technical lead for our Monitoring team

+

+ Monitoring the health of and providing support for Vistaprint's globally-distributed production infrastructure.
+ Creating, implementing, and maintaining tools, automation, and applications to support infrastructure and other internal teams.
+ C#, SQL, IIS, SCOM, Nagios, PowerShell, Windows. +

+
+
+
+
+
+
+

Latest Projects

+
+ + + @**@ +
+
+
+ @*Blog Posts*@ + + @*Github Feed*@ +
+
+
+
+
+
+
+
+ + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..733c46a --- /dev/null +++ b/bower.json @@ -0,0 +1,20 @@ +{ + "name": "nodeabout", + "version": "0.0.1", + "ignore": [ + "**/.*", + "node_modules", + "components" + ], + "dependencies": { + "jquery": "~2.1.4", + "bootstrap": "~3.3.5", + "mustache": "~2.1.2", + "jquery-rss": "~1.5.1", + "bower": "*", + "install": "~1.0.4", + "jquery.easing": "~1.3.1", + "lodestoneapi.min": "http://xivsync.com/lodestoneapi.min.js", + "font-awesome": "~4.3.0" + } +} diff --git a/config/config.js b/config/config.js new file mode 100644 index 0000000..b152ef3 --- /dev/null +++ b/config/config.js @@ -0,0 +1,31 @@ +var path = require('path'), + rootPath = path.normalize(__dirname + '/..'), + env = process.env.NODE_ENV || 'development'; + +var config = { + development: { + root: rootPath, + app: { + name: 'about.tommyparnell' + }, + port: 4000, + }, + + test: { + root: rootPath, + app: { + name: 'about.tommyparnell' + }, + port: 4000, + }, + + production: { + root: rootPath, + app: { + name: 'about.tommyparnell' + }, + port: 80, + } +}; + +module.exports = config[env]; diff --git a/config/express.js b/config/express.js new file mode 100644 index 0000000..a3c8d2b --- /dev/null +++ b/config/express.js @@ -0,0 +1,37 @@ +var express = require('express'); +var glob = require('glob'); + +var favicon = require('serve-favicon'); +var logger = require('morgan'); +var cookieParser = require('cookie-parser'); +var bodyParser = require('body-parser'); +var compress = require('compression'); +var methodOverride = require('method-override'); +var vash = require('vash'); + +module.exports = function(app, config) { + app.set('views', config.root + '/app/views'); + app.set('view engine', 'vash'); + + var env = process.env.NODE_ENV || 'development'; + app.locals.ENV = env; + app.locals.ENV_DEVELOPMENT = env == 'development'; + + // app.use(favicon(config.root + '/public/img/favicon.ico')); + app.use(logger('dev')); + app.use(bodyParser.json()); + app.use(bodyParser.urlencoded({ + extended: true + })); + app.use(cookieParser()); + app.use(compress()); + app.use(express.static(config.root + '/public')); + app.use(methodOverride()); + + var controllers = glob.sync(config.root + '/app/controllers/*.js'); + controllers.forEach(function (controller) { + require(controller)(app); + }); + + +}; diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..d139d41 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,146 @@ +#!/bin/bash + +# ---------------------- +# KUDU Deployment Script +# Version: 0.2.2 +# ---------------------- + +# Helpers +# ------- + +exitWithMessageOnError () { + if [ ! $? -eq 0 ]; then + echo "An error has occurred during web site deployment." + echo $1 + exit 1 + fi +} + +# Prerequisites +# ------------- + +# Verify node.js installed +hash node 2>/dev/null +exitWithMessageOnError "Missing node.js executable, please install node.js, if already installed make sure it can be reached from current environment." + +# Setup +# ----- + +SCRIPT_DIR="${BASH_SOURCE[0]%\\*}" +SCRIPT_DIR="${SCRIPT_DIR%/*}" +ARTIFACTS=$SCRIPT_DIR/../artifacts +KUDU_SYNC_CMD=${KUDU_SYNC_CMD//\"} + +if [[ ! -n "$DEPLOYMENT_SOURCE" ]]; then + DEPLOYMENT_SOURCE=$SCRIPT_DIR +fi + +if [[ ! -n "$NEXT_MANIFEST_PATH" ]]; then + NEXT_MANIFEST_PATH=$ARTIFACTS/manifest + + if [[ ! -n "$PREVIOUS_MANIFEST_PATH" ]]; then + PREVIOUS_MANIFEST_PATH=$NEXT_MANIFEST_PATH + fi +fi + +if [[ ! -n "$DEPLOYMENT_TARGET" ]]; then + DEPLOYMENT_TARGET=$ARTIFACTS/wwwroot +else + KUDU_SERVICE=true +fi + +if [[ ! -n "$KUDU_SYNC_CMD" ]]; then + # Install kudu sync + echo Installing Kudu Sync + npm install kudusync -g --silent + exitWithMessageOnError "npm failed" + + if [[ ! -n "$KUDU_SERVICE" ]]; then + # In case we are running locally this is the correct location of kuduSync + KUDU_SYNC_CMD=kuduSync + else + # In case we are running on kudu service this is the correct location of kuduSync + KUDU_SYNC_CMD=$APPDATA/npm/node_modules/kuduSync/bin/kuduSync + fi +fi + +# Node Helpers +# ------------ + +selectNodeVersion () { + if [[ -n "$KUDU_SELECT_NODE_VERSION_CMD" ]]; then + SELECT_NODE_VERSION="$KUDU_SELECT_NODE_VERSION_CMD \"$DEPLOYMENT_SOURCE\" \"$DEPLOYMENT_TARGET\" \"$DEPLOYMENT_TEMP\"" + eval $SELECT_NODE_VERSION + exitWithMessageOnError "select node version failed" + + if [[ -e "$DEPLOYMENT_TEMP/__nodeVersion.tmp" ]]; then + NODE_EXE=`cat "$DEPLOYMENT_TEMP/__nodeVersion.tmp"` + exitWithMessageOnError "getting node version failed" + fi + + if [[ -e "$DEPLOYMENT_TEMP/.tmp" ]]; then + NPM_JS_PATH=`cat "$DEPLOYMENT_TEMP/__npmVersion.tmp"` + exitWithMessageOnError "getting npm version failed" + fi + + if [[ ! -n "$NODE_EXE" ]]; then + NODE_EXE=node + fi + + NPM_CMD="\"$NODE_EXE\" \"$NPM_JS_PATH\"" + else + NPM_CMD=npm + NODE_EXE=node + fi +} + +################################################################################################################################## +# Deployment +# ---------- + +echo Handling node.js deployment. + +# 1. KuduSync +if [[ "$IN_PLACE_DEPLOYMENT" -ne "1" ]]; then + "$KUDU_SYNC_CMD" -v 50 -f "$DEPLOYMENT_SOURCE" -t "$DEPLOYMENT_TARGET" -n "$NEXT_MANIFEST_PATH" -p "$PREVIOUS_MANIFEST_PATH" -i ".git;.hg;.deployment;deploy.sh" + exitWithMessageOnError "Kudu Sync failed" +fi + +# 2. Select node version +selectNodeVersion + +# 3. Install npm packages +if [ -e "$DEPLOYMENT_TARGET/package.json" ]; then + cd "$DEPLOYMENT_TARGET" + eval $NPM_CMD install --production + exitWithMessageOnError "npm failed" + cd - > /dev/null +fi + +# 4. Install bower packages +if [ -e "$DEPLOYMENT_SOURCE/bower.json" ]; then + eval $NPM_CMD install bower + exitWithMessageOnError "installing bower failed" + ./node_modules/.bin/bower install + exitWithMessageOnError "bower failed" +fi + +# 5. Execute gulp +if [-e "$DEPLOYMENT_SOURCE/gulpfile.js"]; then + ./node_modules/.bin/gulp publish + exitWithMessageOnError "gulp run failed" + + fi + + +################################################################################################################################## + +# Post deployment stub +if [[ -n "$POST_DEPLOYMENT_ACTION" ]]; then + POST_DEPLOYMENT_ACTION=${POST_DEPLOYMENT_ACTION//\"} + cd "${POST_DEPLOYMENT_ACTION_DIR%\\*}" + "$POST_DEPLOYMENT_ACTION" + exitWithMessageOnError "post deployment action failed" +fi + +echo "Finished successfully." diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..ec09493 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,47 @@ +var gulp = require('gulp'), + nodemon = require('gulp-nodemon'), + plumber = require('gulp-plumber'), + livereload = require('gulp-livereload'), + less = require('gulp-less'), + concatCss = require('gulp-concat-css'); + +gulp.task('less', function () { + gulp.src('./public/css/*.less') + .pipe(plumber()) + .pipe(less()) + .pipe(gulp.dest('./public/css')) + .pipe(livereload()); +}); + +gulp.task('combineCss', function(){ + gulp.src('./public/**/*.css') + .pipe(concatCss("bundle.css")) + .pipe(gulp.dest('public/out')); + +}); + +gulp.task('watch', function() { + gulp.watch('./public/css/*.less', ['less']); +}); + +gulp.task('develop', function () { + livereload.listen(); + nodemon({ + script: 'app.js', + ext: 'js coffee handlebars vash', + }).on('restart', function () { + setTimeout(function () { + livereload.changed(__dirname); + }, 500); + }); +}); + +gulp.task('publish', [ + 'less' +]); + +gulp.task('default', [ + 'less', + 'develop', + 'watch' +]); diff --git a/package.json b/package.json new file mode 100644 index 0000000..d59493e --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "about.tommyparnell", + "version": "0.0.1", + "private": true, + "scripts": { + "start": "node app.js" + }, + "dependencies": { + "express": "~4.12.0", + "serve-favicon": "~2.2.0", + "morgan": "~1.5.0", + "cookie-parser": "~1.3.3", + "body-parser": "~1.12.0", + "compression": "~1.4.1", + "method-override": "~2.3.0", + "glob": "~5.0.3" + }, + "devDependencies": { + "gulp": "~3.8.10", + "gulp-concat-css": "^2.2.0", + "gulp-less": "~3.0.1", + "gulp-livereload": "~3.8.0", + "gulp-nodemon": "~2.0.2", + "gulp-plumber": "~1.0.0" + } +} diff --git a/public/css/GithubActivity.css b/public/css/GithubActivity.css new file mode 100644 index 0000000..10c9f50 --- /dev/null +++ b/public/css/GithubActivity.css @@ -0,0 +1,2 @@ +/*! GitHub Activity Stream - v0.1.0 - Copyright 2014 Casey Scarborough */ +body,html{height:100%;width:100%;margin:0;padding:0}.gha-feed{width:100%;height:100%;background:#fff;font-weight:700;font-size:14px;font-family:Helvetica,arial,freesans,clean,sans-serif;line-height:1.3;overflow-y:auto;border:1px solid #ddd}.gha-feed,.gha-feed h2,.gha-feed h3,.gha-feed li,.gha-feed p,.gha-feed ul{margin:0;padding:0}.gha-feed ul{list-style-type:none;padding:0;margin:0}.gha-feed li{list-style-type:none;line-height:1.4}.gha-feed small{color:#666;font-weight:400;font-size:13px}.gha-feed small a{font-weight:400}.gha-feed small a .more-commits{font-size:11px}span.gha-time{color:#bbb;font-weight:400;font-size:12px}.gha-feed a{color:#4183c4;text-decoration:none;font-weight:700}.gha-feed a:hover{text-decoration:underline}.gha-feed pre{padding:0;border:0;border-radius:0;box-shadow:1px 1px 4px #bbb;color:#fff}.gha-header{position:absolute;top:1px;left:1px;width:calc(100% - 20px);padding:10px;height:67px;border-bottom:1px solid #ddd;background:#fff;background:-moz-linear-gradient(top,#fff 0,#f4f4f4 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#fff),color-stop(100%,#f4f4f4));background:-webkit-linear-gradient(top,#fff 0,#f4f4f4 100%);background:-o-linear-gradient(top,#fff 0,#f4f4f4 100%);background:-ms-linear-gradient(top,#fff 0,#f4f4f4 100%);background:linear-gradient(to bottom,#fff 0,#f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f4f4f4', GradientType=0)}.gha-footer{position:absolute;bottom:-1px;left:1px;padding:5px 5px 5px 10px;border-top:1px solid #ddd;height:16px;width:calc(100% - 15px);background:#fff;background:-moz-linear-gradient(top,#fff 0,#f4f4f4 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#fff),color-stop(100%,#f4f4f4));background:-webkit-linear-gradient(top,#fff 0,#f4f4f4 100%);background:-o-linear-gradient(top,#fff 0,#f4f4f4 100%);background:-ms-linear-gradient(top,#fff 0,#f4f4f4 100%);background:linear-gradient(to bottom,#fff 0,#f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f4f4f4', GradientType=0);color:#495961;font-size:13px}.gha-footer a{float:right;color:#495961;padding-right:20px;font-size:13px;font-weight:700}.gha-footer a:hover,.gha-header a:hover{text-decoration:none}.gha-github-icon{display:inline;float:left;padding:9px 0 0;width:35px;height:35px;color:#495961}.gha-github-icon .octicon{font:normal normal 40px octicons}.gha-gravatar{display:inline;float:right;margin-right:10px;padding-right:20px;max-width:60px;height:67px}.gha-gravatar img{padding:3px;width:100%;border:1px solid #ddd;box-shadow:1px 1px 3px #ccc}.gha-activity{clear:both;padding:10px 0;width:100%;border-bottom:1px solid #ddd}.gha-activity.gha-small{margin-top:5px;font-weight:400;font-size:13px}.gha-activity.gha-small a{font-weight:400}.gha-activity.gha-small .gha-message{float:left;width:auto;margin-right:5px;margin-top:5px}.gha-activity.gha-small span{font-size:16px}.gha-activity.gha-small .gha-time{float:left;margin-top:6px}.gha-activity:last-child{padding-bottom:100px}.gha-repo{clear:both;padding:10px 0;width:100%;border-bottom:1px solid #ddd}.gha-activity-icon .octicon{display:inline;float:left;clear:both;margin:6px auto;width:50px;color:#bbb;text-align:center;font:normal normal 30px octicons}.gha-activity-icon .gha-small{font-size:16px}.gha-message{display:inline-block;float:left;width:calc(100% - 50px)}.gha-message-commits{font-size:11px}.gha-message-merge{padding:3px 7px;border-radius:3px;background:#e8f1f6;color:rgba(0,0,0,.5);font-size:12px;line-height:2}.gha-sha{font-size:12px;font-family:Consolas,"Liberation Mono",Courier,monospace}.gha-gravatar-small{float:left;margin-right:6px;width:30px}.gha-gravatar-commit{margin-bottom:-3px;border-radius:2px}.gha-gravatar-user{float:left}.gha-user-info{display:inline-block;float:left;margin:0 auto;padding:6px 10px 5px;color:#495961;font-size:20px}.gha-user-info a{color:#495961}.gha-user-info p a{font-weight:100}.gha-without-name{padding-top:20px;padding-left:15px}.gha-info{margin:15px;padding:10px;border:1px solid #e4e4c6;border-radius:4px;background:#ffffde;color:#6d6d4b;font-weight:400;font-size:13px}.gha-time{color:#bbb;font-weight:400;font-size:12px}.gha-clear{clear:both}.gha-muted{color:#666}.gha-push{height:87px}.gha-push-small{height:26px} \ No newline at end of file diff --git a/public/css/Site.css b/public/css/Site.css new file mode 100644 index 0000000..aca59a6 --- /dev/null +++ b/public/css/Site.css @@ -0,0 +1,96 @@ +body { + padding-top: 50px; + padding-bottom: 20px; +} + +/* Set padding to keep content from hitting the edges */ +.body-content { + padding-left: 15px; + padding-right: 15px; +} + +/* Override the default bootstrap behavior where horizontal description lists + will truncate terms that are too long to fit in the left column +*/ +.dl-horizontal dt { + white-space: normal; +} + +/* Set width on the form input elements since they're 100% wide by default */ +input, +select, +textarea { + max-width: 280px; +} + +.profile-outer img { + -moz-animation: profile-image 1s ease-in; + -o-animation: profile-image 1s ease-in; + -webkit-animation: profile-image 1s ease-in; + animation: profile-image 1s ease-in; +} + + + +.profile-image{ + + border-radius: 50% +} + +@-moz-keyframes profile-image { + from { border-radius: 0 } + to { border-radius: 50% } +} + +@-webkit-keyframes profile-image { + from { border-radius: 0 } + to { border-radius: 50% } +} + +@keyframes profile-image { + from { border-radius: 0 } + to { border-radius: 50% } +} + +@media (min-width: 992px) { + .pull-right-md { + float: right; + } +} + +@media(min-width: 992px){ + .stick { + position: fixed; + top: 0; + width: 100%; + height: 130px; + z-index: 10000; + border-bottom: 1px solid #778492 +} + .header.stick{ + border-top: 0px; + padding-top: 0px; + } + .stick #standardContainer{ + position: relative; + width: 100%; + height: 100%; + +} +.stick #standardContainer > * > .social.list-inline{ + display: none; +} + +.stick ~.sections-wrapper{ + margin-top: 270px; +} + +.stick > * > * > .profile-image{ + width: 120px; +} + +} + +body{ + padding-top: 0px; +} diff --git a/public/css/styles.min.css b/public/css/styles.min.css new file mode 100644 index 0000000..32419df --- /dev/null +++ b/public/css/styles.min.css @@ -0,0 +1 @@ +body{font-family:'Lato',arial,sans-serif;color:#434343;background:#dae3e7;font-size:16px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{font-family:'Montserrat',sans-serif;font-weight:700;color:#778492}a{color:#3aaa64;-webkit-transition:all .4s ease-in-out;-moz-transition:all .4s ease-in-out;-ms-transition:all .4s ease-in-out;-o-transition:all .4s ease-in-out;transition:all .4s ease-in-out}a:hover{text-decoration:underline;color:#5f6b77;color:#2d844e}.btn,a.btn{-webkit-transition:all .4s ease-in-out;-moz-transition:all .4s ease-in-out;-ms-transition:all .4s ease-in-out;-o-transition:all .4s ease-in-out;transition:all .4s ease-in-out;font-family:'Montserrat',arial,sans-serif;padding:8px 16px;font-weight:bold}.btn .fa,a.btn .fa{margin-right:5px}.btn:focus,a.btn:focus{color:#fff}a.btn-cta-primary,.btn-cta-primary{background:#54ba4e;border:1px solid #54ba4e;color:#fff;font-weight:600;text-transform:uppercase}a.btn-cta-primary:hover,.btn-cta-primary:hover{background:#49ac43;border:1px solid #49ac43;color:#fff}a.btn-cta-secondary,.btn-cta-secondary{background:#479fc8;border:1px solid #479fc8;color:#fff;font-weight:600;text-transform:uppercase}a.btn-cta-secondary:hover,.btn-cta-secondary:hover{background:#3893bd;border:1px solid #3893bd;color:#fff}.text-highlight{color:#32383e}.label-theme{background:#3aaa64;font-size:12px}a.dotted-link{border-bottom:1px dotted #778492;color:#778492}a.dotted-link:hover{text-decoration:none;color:#49515a}.header{padding:30px 0;background:#f5f5f5;border-top:10px solid #778492}.header .btn{margin-top:60px;font-weight:bold}.header .profile-image{margin-right:30px}.header .profile-content .name{color:#49515a;font-size:38px;margin-bottom:5px;margin-top:30px}.header .profile-content .desc{color:#778492;font-family:"Lato",arial,sans-serif;font-weight:400;font-size:24px;margin-top:0;margin-bottom:15px}.header .profile-content .social a{background:#b0b7bf;width:36px;height:36px;display:inline-block;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;color:#fff;text-align:center}.header .profile-content .social a:hover{background:#778492}.header .profile-content .social a .fa{font-size:20px;padding-top:8px}.sections-wrapper{padding-top:60px;padding-bottom:60px}.section{margin-bottom:30px}.section .section-inner{background:#fff;padding:30px}.section .heading{margin-top:0;margin-bottom:30px;color:#545e69;font-size:24px}.section .content .more-link .fa{margin-right:5px;font-size:14px}.latest .item{margin-bottom:30px}.latest .item .title{font-size:18px;margin-top:0}.latest .item .title .label{margin-left:5px;font-size:12px}.latest .item .title a{color:#778492}.latest .item .title a:hover{color:#5f6b77}.latest .item .project-image:hover{-webkit-opacity:.8;-moz-opacity:.8;opacity:.8}.latest .divider{margin-bottom:60px}.latest .featured{margin-bottom:60px}.latest .featured .title{margin-bottom:5px;font-size:20px}.latest .featured .summary{margin-bottom:30px;color:#778492}.latest .featured img{margin-bottom:30px}.latest .featured .desc{margin-bottom:30px}.latest .featured-image{position:relative}.latest .featured-image .text{background:#3aaa64;color:#fff}.latest .featured-image .ribbon{position:absolute;top:-4px;right:-4px;width:110px;height:110px;overflow:hidden}.latest .featured-image .ribbon .text{font-family:'Montserrat',sans-serif;position:relative;left:-8px;top:18px;width:158px;padding:10px 10px;font-size:15px;font-weight:bold;text-align:center;text-transform:uppercase;color:#fff;background-color:#479fc8;-webkit-transform:rotate(45deg) translate3d(0,0,0);-moz-transform:rotate(45deg) translate3d(0,0,0);-ms-transform:rotate(45deg) translate3d(0,0,0);-o-transform:rotate(45deg) translate3d(0,0,0);transform:rotate(45deg) translate3d(0,0,0)}.latest .featured-image .ribbon .text:before,.latest .featured-image .ribbon .text:after{content:'';position:absolute;bottom:-5px;border-top:5px solid #276582;border-left:5px solid transparent;border-right:5px solid transparent}.latest .featured-image .ribbon .text:before{left:0}.latest .featured-image .ribbon .text:after{right:0}.projects .item{margin-bottom:30px}.projects .item .title{font-size:16px;margin-top:0;margin-bottom:5px;line-height:1.5}.projects .item .title a{color:#778492}.projects .item .title a:hover{color:#5f6b77}.experience .item{margin-bottom:30px}.experience .item .title{font-size:16px;margin-top:0;margin-bottom:5px;line-height:1.5}.experience .item .title .place{color:#999;font-weight:normal}.experience .item .title .place a{color:#999}.experience .item .title .place a:hover{color:#666}.experience .item .title .year{color:#999;font-weight:normal}.ghfeed{height:600px}.ghfeed,.ghfeed *,.ghfeed *:before,.ghfeed *:after{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.info .fa{margin-right:15px;color:#ccd1d6}.info .fa.fa-envelope-o{font-size:14px}.info ul{margin-bottom:0}.info li{margin-bottom:15px}.info li:last-child{margin-bottom:0}.skills .intro{margin-bottom:30px}.skills .skillset .item{margin-bottom:30px}.skills .skillset .level-title{font-size:16px;position:relative;margin-top:0;margin-bottom:10px}.skills .skillset .level-title .level-label{color:#ccd1d6;font-size:14px;font-weight:400;font-family:"Lato",arial,sans-serif;position:absolute;right:0;top:0}.skills .skillset .level-bar{height:15px;background:#e8e8e8}.skills .skillset .level-bar-inner{height:15px;background:#66cb8c}.testimonials .item{margin-bottom:30px}.testimonials .item:last-child{margin-bottom:0}.testimonials .item .quote{color:#666;font-size:16px;border-left-color:#9fdeb7;margin-bottom:15px}.testimonials .item .quote .fa{color:#79d19a;margin-right:15px}.testimonials .item .source{font-size:14px;padding-left:30px;font-weight:500}.testimonials .item .source .name{color:#939ea9;font-weight:600}.testimonials .item .source .title{color:#999}.education .item{margin-bottom:30px}.education .item:last-child{margin-bottom:0}.education .item .title{font-size:16px;margin-top:0}.education .item .university{font-family:"Lato",arial,sans-serif;font-size:13px;color:#999;font-weight:600;padding-left:25px}.education .item .university .year{color:#b0b7bf;font-weight:500}.languages .item{margin-bottom:15px}.languages .item .title{color:#778492}.languages .item .level{color:#999}.languages .item:last-child{margin-bottom:0}.languages .item .fa{color:#79d19a}.blog .item{margin-bottom:30px}.blog .item .title{font-size:18px;line-height:1.3}.blog .item .title a{color:#778492}.blog .item .title a:hover{color:#5f6b77}.blog .item:last-child{margin-bottom:0}.list ul li{margin-bottom:10px}.list ul li .fa{margin-right:5px}.list ul li a{color:#778492}.list ul li a:hover{color:#49515a}.credits ul li{margin-bottom:10px}.credits ul li .fa{margin-right:5px}.credits ul li a{color:#778492}.credits ul li a:hover{color:#49515a}.credits .btn{margin-bottom:15px}.footer{background:#32383e;color:#fff;padding:10px 0}.footer .copyright{line-height:1.6;color:#a1aab4;font-size:14px}.footer a{color:#fff}.footer .fa-heart{color:#fb866a}@media(max-width:767px){.header{text-align:center}.header .profile-image{float:none !important;margin:0 auto}.header .profile-content{float:none !important;text-align:center}.header .btn{margin-top:30px;float:none !important}.project-image{margin-bottom:15px}}@media(min-width:1400px){.container{width:1360px}} \ No newline at end of file diff --git a/public/fonts/FontAwesome.otf b/public/fonts/FontAwesome.otf new file mode 100644 index 0000000..81c9ad9 Binary files /dev/null and b/public/fonts/FontAwesome.otf differ diff --git a/public/fonts/fontawesome-webfont.eot b/public/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..84677bc Binary files /dev/null and b/public/fonts/fontawesome-webfont.eot differ diff --git a/public/fonts/fontawesome-webfont.svg b/public/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..ec42a19 --- /dev/null +++ b/public/fonts/fontawesome-webfont.svg @@ -0,0 +1,520 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/fonts/fontawesome-webfont.ttf b/public/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..96a3639 Binary files /dev/null and b/public/fonts/fontawesome-webfont.ttf differ diff --git a/public/fonts/fontawesome-webfont.woff b/public/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..628b6a5 Binary files /dev/null and b/public/fonts/fontawesome-webfont.woff differ diff --git a/public/fonts/glyphicons-halflings-regular.eot b/public/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000..b93a495 Binary files /dev/null and b/public/fonts/glyphicons-halflings-regular.eot differ diff --git a/public/fonts/glyphicons-halflings-regular.svg b/public/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..184468a --- /dev/null +++ b/public/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/fonts/glyphicons-halflings-regular.ttf b/public/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000..1413fc6 Binary files /dev/null and b/public/fonts/glyphicons-halflings-regular.ttf differ diff --git a/public/fonts/glyphicons-halflings-regular.woff b/public/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000..9e61285 Binary files /dev/null and b/public/fonts/glyphicons-halflings-regular.woff differ diff --git a/public/fonts/glyphicons-halflings-regular.woff2 b/public/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000..64539b5 Binary files /dev/null and b/public/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/public/img/Untappd2.jpg b/public/img/Untappd2.jpg new file mode 100644 index 0000000..11d39e2 Binary files /dev/null and b/public/img/Untappd2.jpg differ diff --git a/public/img/favicon.ico b/public/img/favicon.ico new file mode 100644 index 0000000..1e7aaf5 Binary files /dev/null and b/public/img/favicon.ico differ diff --git a/public/img/profile.png b/public/img/profile.png new file mode 100644 index 0000000..c3ea27f Binary files /dev/null and b/public/img/profile.png differ diff --git a/public/img/sqprofile.jpg b/public/img/sqprofile.jpg new file mode 100644 index 0000000..ce75591 Binary files /dev/null and b/public/img/sqprofile.jpg differ diff --git a/public/js/GAnalytics.js b/public/js/GAnalytics.js new file mode 100644 index 0000000..b591d14 --- /dev/null +++ b/public/js/GAnalytics.js @@ -0,0 +1,7 @@ + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m); + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + +ga('create', 'UA-60676910-1', 'auto'); +ga('send', 'pageview'); \ No newline at end of file diff --git a/public/js/GAnalytics.min.js b/public/js/GAnalytics.min.js new file mode 100644 index 0000000..42f3a17 --- /dev/null +++ b/public/js/GAnalytics.min.js @@ -0,0 +1,2 @@ +(function(n,t,i,r,u,f,e){n.GoogleAnalyticsObject=u;n[u]=n[u]||function(){(n[u].q=n[u].q||[]).push(arguments)};n[u].l=1*new Date;f=t.createElement(i);e=t.getElementsByTagName(i)[0];f.async=1;f.src=r;e.parentNode.insertBefore(f,e)})(window,document,"script","//www.google-analytics.com/analytics.js","ga");ga("create","UA-60676910-1","auto");ga("send","pageview"); +//# sourceMappingURL=GAnalytics.min.js.map diff --git a/public/js/GAnalytics.min.js.map b/public/js/GAnalytics.min.js.map new file mode 100644 index 0000000..856e0a3 --- /dev/null +++ b/public/js/GAnalytics.min.js.map @@ -0,0 +1,8 @@ +{ +"version":3, +"file":"GAnalytics.min.js", +"lineCount":1, +"mappings":"CAAG,QAAQ,CAACA,CAAC,CAACC,CAAC,CAACC,CAAC,CAACC,CAAC,CAACC,CAAC,CAACC,CAAC,CAACC,CAAb,CAAe,CAACN,CAAEO,sBAAwB,CAACH,CAAC,CAACJ,CAAE,CAAAI,CAAA,CAAE,CAACJ,CAAE,CAAAI,CAAA,CAAE,EAAE,QAAQ,CAAA,CAAE,CACvE,CAACJ,CAAE,CAAAI,CAAA,CAAEI,EAAE,CAACR,CAAE,CAAAI,CAAA,CAAEI,EAAE,EAAE,CAAA,CAAhB,CAAmBC,KAAK,CAACC,SAAD,CAD+C,C,CAClCV,CAAE,CAAAI,CAAA,CAAEO,EAAE,CAAC,CAAC,CAAC,IAAIC,I,CAAOP,CAAC,CAACJ,CAACY,cAAc,CAACX,CAAD,C,CAC1EI,CAAC,CAACL,CAACa,qBAAqB,CAACZ,CAAD,CAAI,CAAA,CAAA,C,CAAGG,CAACU,MAAM,CAAC,CAAC,CAACV,CAACW,IAAI,CAACb,CAAC,CAACG,CAACW,WAAWC,aAAa,CAACb,CAAC,CAACC,CAAH,CAFtD,EAGtB,CAACa,MAAM,CAACC,QAAQ,CAAC,QAAQ,CAAC,yCAAyC,CAAC,IAApE,CAAyE,CAE7EC,EAAE,CAAC,QAAQ,CAAE,eAAe,CAAE,MAA5B,CAAmC,CACrCA,EAAE,CAAC,MAAM,CAAE,UAAT,CAAoB", +"sources":["GAnalytics.js"], +"names":["i","s","o","g","r","a","m","GoogleAnalyticsObject","q","push","arguments","l","Date","createElement","getElementsByTagName","async","src","parentNode","insertBefore","window","document","ga"] +} diff --git a/public/js/GithubActivity.js b/public/js/GithubActivity.js new file mode 100644 index 0000000..a443ddb --- /dev/null +++ b/public/js/GithubActivity.js @@ -0,0 +1,2 @@ +/*! GitHub Activity Stream - v0.1.0 - Copyright 2014 Casey Scarborough */ +function millisecondsToStr(a) { "use strict"; function b(a) { return a > 1 ? "s ago" : " ago" } var c = Math.floor(a / 1e3), d = Math.floor(c / 31536e3); if (d) return d + " year" + b(d); var e = Math.floor((c %= 31536e3) / 2592e3); if (e) return e + " month" + b(e); var f = Math.floor((c %= 2592e3) / 86400); if (f) return f + " day" + b(f); var g = Math.floor((c %= 86400) / 3600); if (g) return "about " + g + " hour" + b(g); var h = Math.floor((c %= 3600) / 60); if (h) return h + " minute" + b(h); var i = c % 60; return i ? i + " second" + b(i) : "just now" } function pluralize(a, b) { return 1 !== b ? a + "s" : a } function md5cycle(a, b) { var c = a[0], d = a[1], e = a[2], f = a[3]; c = ff(c, d, e, f, b[0], 7, -680876936), f = ff(f, c, d, e, b[1], 12, -389564586), e = ff(e, f, c, d, b[2], 17, 606105819), d = ff(d, e, f, c, b[3], 22, -1044525330), c = ff(c, d, e, f, b[4], 7, -176418897), f = ff(f, c, d, e, b[5], 12, 1200080426), e = ff(e, f, c, d, b[6], 17, -1473231341), d = ff(d, e, f, c, b[7], 22, -45705983), c = ff(c, d, e, f, b[8], 7, 1770035416), f = ff(f, c, d, e, b[9], 12, -1958414417), e = ff(e, f, c, d, b[10], 17, -42063), d = ff(d, e, f, c, b[11], 22, -1990404162), c = ff(c, d, e, f, b[12], 7, 1804603682), f = ff(f, c, d, e, b[13], 12, -40341101), e = ff(e, f, c, d, b[14], 17, -1502002290), d = ff(d, e, f, c, b[15], 22, 1236535329), c = gg(c, d, e, f, b[1], 5, -165796510), f = gg(f, c, d, e, b[6], 9, -1069501632), e = gg(e, f, c, d, b[11], 14, 643717713), d = gg(d, e, f, c, b[0], 20, -373897302), c = gg(c, d, e, f, b[5], 5, -701558691), f = gg(f, c, d, e, b[10], 9, 38016083), e = gg(e, f, c, d, b[15], 14, -660478335), d = gg(d, e, f, c, b[4], 20, -405537848), c = gg(c, d, e, f, b[9], 5, 568446438), f = gg(f, c, d, e, b[14], 9, -1019803690), e = gg(e, f, c, d, b[3], 14, -187363961), d = gg(d, e, f, c, b[8], 20, 1163531501), c = gg(c, d, e, f, b[13], 5, -1444681467), f = gg(f, c, d, e, b[2], 9, -51403784), e = gg(e, f, c, d, b[7], 14, 1735328473), d = gg(d, e, f, c, b[12], 20, -1926607734), c = hh(c, d, e, f, b[5], 4, -378558), f = hh(f, c, d, e, b[8], 11, -2022574463), e = hh(e, f, c, d, b[11], 16, 1839030562), d = hh(d, e, f, c, b[14], 23, -35309556), c = hh(c, d, e, f, b[1], 4, -1530992060), f = hh(f, c, d, e, b[4], 11, 1272893353), e = hh(e, f, c, d, b[7], 16, -155497632), d = hh(d, e, f, c, b[10], 23, -1094730640), c = hh(c, d, e, f, b[13], 4, 681279174), f = hh(f, c, d, e, b[0], 11, -358537222), e = hh(e, f, c, d, b[3], 16, -722521979), d = hh(d, e, f, c, b[6], 23, 76029189), c = hh(c, d, e, f, b[9], 4, -640364487), f = hh(f, c, d, e, b[12], 11, -421815835), e = hh(e, f, c, d, b[15], 16, 530742520), d = hh(d, e, f, c, b[2], 23, -995338651), c = ii(c, d, e, f, b[0], 6, -198630844), f = ii(f, c, d, e, b[7], 10, 1126891415), e = ii(e, f, c, d, b[14], 15, -1416354905), d = ii(d, e, f, c, b[5], 21, -57434055), c = ii(c, d, e, f, b[12], 6, 1700485571), f = ii(f, c, d, e, b[3], 10, -1894986606), e = ii(e, f, c, d, b[10], 15, -1051523), d = ii(d, e, f, c, b[1], 21, -2054922799), c = ii(c, d, e, f, b[8], 6, 1873313359), f = ii(f, c, d, e, b[15], 10, -30611744), e = ii(e, f, c, d, b[6], 15, -1560198380), d = ii(d, e, f, c, b[13], 21, 1309151649), c = ii(c, d, e, f, b[4], 6, -145523070), f = ii(f, c, d, e, b[11], 10, -1120210379), e = ii(e, f, c, d, b[2], 15, 718787259), d = ii(d, e, f, c, b[9], 21, -343485551), a[0] = add32(c, a[0]), a[1] = add32(d, a[1]), a[2] = add32(e, a[2]), a[3] = add32(f, a[3]) } function cmn(a, b, c, d, e, f) { return b = add32(add32(b, a), add32(d, f)), add32(b << e | b >>> 32 - e, c) } function ff(a, b, c, d, e, f, g) { return cmn(b & c | ~b & d, a, b, e, f, g) } function gg(a, b, c, d, e, f, g) { return cmn(b & d | c & ~d, a, b, e, f, g) } function hh(a, b, c, d, e, f, g) { return cmn(b ^ c ^ d, a, b, e, f, g) } function ii(a, b, c, d, e, f, g) { return cmn(c ^ (b | ~d), a, b, e, f, g) } function md51(a) { txt = ""; var b, c = a.length, d = [1732584193, -271733879, -1732584194, 271733878]; for (b = 64; b <= a.length; b += 64) md5cycle(d, md5blk(a.substring(b - 64, b))); a = a.substring(b - 64); var e = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; for (b = 0; b < a.length; b++) e[b >> 2] |= a.charCodeAt(b) << (b % 4 << 3); if (e[b >> 2] |= 128 << (b % 4 << 3), b > 55) for (md5cycle(d, e), b = 0; 16 > b; b++) e[b] = 0; return e[14] = 8 * c, md5cycle(d, e), d } function md5blk(a) { var b, c = []; for (b = 0; 64 > b; b += 4) c[b >> 2] = a.charCodeAt(b) + (a.charCodeAt(b + 1) << 8) + (a.charCodeAt(b + 2) << 16) + (a.charCodeAt(b + 3) << 24); return c } function rhex(a) { for (var b = "", c = 0; 4 > c; c++) b += hex_chr[a >> 8 * c + 4 & 15] + hex_chr[a >> 8 * c & 15]; return b } function hex(a) { for (var b = 0; b < a.length; b++) a[b] = rhex(a[b]); return a.join("") } function md5(a) { return hex(md51(a)) } function add32(a, b) { return a + b & 4294967295 } function add32(a, b) { var c = (65535 & a) + (65535 & b), d = (a >> 16) + (b >> 16) + (c >> 16); return d << 16 | 65535 & c } var GitHubActivity = function () { "use strict"; var a = {}, b = { renderLink: function (a, b, c) { return b || (b = a), "undefined" == typeof c && (c = ""), Mustache.render('{{{title}}}', { url: a, title: b }) }, renderGitHubLink: function (a, c, d) { return c || (c = a), "undefined" == typeof d && (d = ""), b.renderLink("https://github.com/" + a, c, d) }, getMessageFor: function (a) { var c = a.payload; if (a.repoLink = b.renderGitHubLink(a.repo.name), a.userGravatar = Mustache.render('
', { url: a.actor.avatar_url }), c.ref && (a.branch = "refs/heads/" === c.ref.substring(0, 11) ? c.ref.substring(11) : c.ref, a.branchLink = b.renderGitHubLink(a.repo.name + "/tree/" + a.branch, a.branch) + " at "), c.commits) { var d = c.before + "..." + c.head, e = c.commits.length; 2 === e ? a.commitsMessage = Mustache.render('View comparison for these 2 commits »', { repo: a.repo.name, shaDiff: d }) : e > 2 && (a.commitsMessage = Mustache.render('{{length}} more ' + pluralize("commit", e - 2) + " »", { repo: a.repo.name, shaDiff: d, length: c.size - 2 })), c.commits.forEach(function (d, e) { return d.message.length > 66 && (d.message = d.message.substring(0, 66) + "..."), 2 > e ? (d.shaLink = b.renderGitHubLink(a.repo.name + "/commit/" + d.sha, d.sha.substring(0, 6), "gha-sha"), void (d.committerGravatar = Mustache.render('', { hash: md5(d.author.email) }))) : (c.commits.splice(2, c.size), !1) }) } if (c.issue) { var f = a.repo.name + "#" + c.issue.number; a.issueLink = b.renderLink(c.issue.html_url, f), a.issueType = "issue", c.issue.pull_request && (a.issueType = "pull request") } if (c.pull_request) { var g = c.pull_request; if (a.pullRequestLink = b.renderLink(c.html_url, a.repo.name + "#" + g.number), a.mergeMessage = "", c.pull_request.merged) { c.action = "merged"; var h = "{{c}} " + pluralize("commit", g.commits) + " with {{a}} " + pluralize("addition", g.additions) + " and {{d}} " + pluralize("deletion", g.deletions); a.mergeMessage = Mustache.render('
' + h + "", { c: g.commits, a: g.additions, d: g.deletions }) } } if (c.comment && c.comment.pull_request_url) { var f = a.repo.name + "#" + c.comment.pull_request_url.split("/").pop(); a.pullRequestLink = b.renderGitHubLink(c.comment.pull_request_url, f) } if (c.comment && c.comment.body && (a.comment = c.comment.body, a.comment.length > 150 && (a.comment = a.comment.substring(0, 150) + "..."), c.comment.html_url && c.comment.commit_id)) { var f = a.repo.name + "@" + c.comment.commit_id.substring(0, 10); a.commentLink = b.renderLink(c.comment.html_url, f) } if ("ReleaseEvent" === a.type && (a.tagLink = b.renderLink(c.release.html_url, c.release.tag_name), a.zipLink = b.renderLink(c.release.zipball_url, "Download Source Code (zip)")), "GollumEvent" === a.type) { var i = c.pages[0]; a.actionType = i.action, a.message = a.actionType.charAt(0).toUpperCase() + a.actionType.slice(1) + " ", a.message += b.renderGitHubLink(i.html_url, i.title) } "FollowEvent" === a.type && (a.targetLink = b.renderGitHubLink(c.target.login)), "ForkEvent" === a.type && (a.forkLink = b.renderGitHubLink(c.forkee.full_name)), "MemberEvent" === a.type && (a.memberLink = b.renderGitHubLink(c.member.login)), c.gist && (a.actionType = "fork" === c.action ? c.action + "ed" : c.action + "d", a.gistLink = b.renderLink(c.gist.html_url, "gist: " + c.gist.id)); var j, h = Mustache.render(templates[a.type], a), k = millisecondsToStr(new Date - new Date(a.created_at)); j = "CreateEvent" == a.type && ["repository", "branch", "tag"].indexOf(c.ref_type) >= 0 ? icons[a.type + "_" + c.ref_type] : icons[a.type]; var l = { message: h, icon: j, timeString: k, userLink: b.renderGitHubLink(a.actor.login) }; return singleLineActivities.indexOf(a.type) > -1 ? Mustache.render(templates.SingleLineActivity, l) : Mustache.render(templates.Activity, l) }, getHeaderHTML: function (a) { return a.name ? a.userNameLink = b.renderLink(a.html_url, a.name) : a.withoutName = " without-name", a.userLink = b.renderLink(a.html_url, a.login), a.gravatarLink = b.renderLink(a.html_url, ''), Mustache.render(templates.UserHeader, a) }, getActivityHTML: function (a) { var c = ""; return 0 === a.length ? Mustache.render(templates.NoActivity, {}) : (a.forEach(function (a) { c += b.getMessageFor(a) }), c) }, getOutputFromRequest: function (a, b) { var c, d, e = new XMLHttpRequest; return e.open("GET", a, !1), e.onload = function () { return e.status >= 200 && e.status < 400 ? (d = JSON.parse(e.responseText), void (c = b(d))) : !1 }, e.onerror = function () { console.log("An error occurred connecting to the url.") }, e.send(), c }, renderStream: function (a, b) { b.innerHTML = Mustache.render(templates.Stream, { text: a, footer: templates.Footer }), b.style.position = "relative" } }; return a.feed = function (a) { if (!a.username || !a.selector) return !1; var c, d, e = a.selector, f = "https://api.github.com/users/" + a.username, g = f + "/events?client_id=4c37e445b8ed8635dbcc&client_secret=a3152ff17d859f138428abb51cd78df425dbea28"; if (a.clientId && a.clientSecret) { var h = "?client_id=" + a.clientId + "&client_secret=" + a.clientSecret; f += h, g += h } if (c = b.getOutputFromRequest(f, b.getHeaderHTML), c ? c += b.getOutputFromRequest(g, b.getActivityHTML) : c = Mustache.render(templates.NotFound, { username: a.username }), d = "#" === e.charAt(0) ? document.getElementById(e.substring(1)) : document.getElementsByClassName(e.substring(1)), d instanceof HTMLCollection) for (var i = 0; i < d.length; i++) b.renderStream(c, d[i]); else b.renderStream(c, d) }, a }(), hex_chr = "0123456789abcdef".split(""); "5d41402abc4b2a76b9719d911017c592" != md5("hello"); var templates = { Stream: '
{{{text}}}
{{{footer}}}
', Activity: '
{{{timeString}}}
{{{userLink}}} {{{message}}}
', SingleLineActivity: '
{{{userLink}}} {{{message}}}
{{{timeString}}}
', UserHeader: '
{{{userNameLink}}}

{{{userLink}}}

{{{gravatarLink}}}
', Footer: '