Fix revisionless-build-group URL bug

Component update; Add Lukas to BuildFeed team, drop WUTest.
This commit is contained in:
Thomas Hounsell 2016-04-25 13:38:58 +01:00
parent e361583fe6
commit 71513c0e7f
16 changed files with 458 additions and 300 deletions

View File

@ -53,7 +53,8 @@ public async Task<ActionResult> IndexPage(int page)
return View("Index", buildGroups); return View("Index", buildGroups);
} }
[Route("group/{major}.{minor}.{number}.{revision}/")] [Route("group/{major}.{minor}.{number}.{revision}/", Order = 1)]
[Route("group/{major}.{minor}.{number}/", Order = 5)] // for when there is no revision
#if !DEBUG #if !DEBUG
// [OutputCache(Duration = 600, VaryByParam = "none", VaryByCustom = "userName")] // [OutputCache(Duration = 600, VaryByParam = "none", VaryByCustom = "userName")]
#endif #endif

View File

@ -5,8 +5,8 @@
/// <reference path="excanvas.js" /> /// <reference path="excanvas.js" />
/// <reference path="jquery.validate.min.js" /> /// <reference path="jquery.validate.min.js" />
/// <reference path="jquery.validate.unobtrusive.min.js" /> /// <reference path="jquery.validate.unobtrusive.min.js" />
/// <reference path="jquery-2.2.0.js" /> /// <reference path="jquery-2.2.3.js" />
/// <reference path="jquery-2.2.0.min.js" /> /// <reference path="jquery-2.2.3.min.js" />
/// <reference path="jsrender.min.js" /> /// <reference path="jsrender.min.js" />
/// <reference path="trumbowyg/langs/ar.min.js" /> /// <reference path="trumbowyg/langs/ar.min.js" />
/// <reference path="trumbowyg/langs/ca.min.js" /> /// <reference path="trumbowyg/langs/ca.min.js" />

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
/*! /*!
* jQuery JavaScript Library v2.2.0 * jQuery JavaScript Library v2.2.3
* http://jquery.com/ * http://jquery.com/
* *
* Includes Sizzle.js * Includes Sizzle.js
@ -9,7 +9,7 @@
* Released under the MIT license * Released under the MIT license
* http://jquery.org/license * http://jquery.org/license
* *
* Date: 2016-01-08T20:02Z * Date: 2016-04-05T19:26Z
*/ */
(function( global, factory ) { (function( global, factory ) {
@ -65,7 +65,7 @@ var support = {};
var var
version = "2.2.0", version = "2.2.3",
// Define a local copy of jQuery // Define a local copy of jQuery
jQuery = function( selector, context ) { jQuery = function( selector, context ) {
@ -276,6 +276,7 @@ jQuery.extend( {
}, },
isPlainObject: function( obj ) { isPlainObject: function( obj ) {
var key;
// Not plain objects: // Not plain objects:
// - Any object or value whose internal [[Class]] property is not "[object Object]" // - Any object or value whose internal [[Class]] property is not "[object Object]"
@ -285,14 +286,18 @@ jQuery.extend( {
return false; return false;
} }
// Not own constructor property must be Object
if ( obj.constructor && if ( obj.constructor &&
!hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { !hasOwn.call( obj, "constructor" ) &&
!hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) {
return false; return false;
} }
// If the function hasn't returned already, we're confident that // Own properties are enumerated firstly, so to speed up,
// |obj| is a plain object, created by {} or constructed with new Object // if last one is own, then all properties are own
return true; for ( key in obj ) {}
return key === undefined || hasOwn.call( obj, key );
}, },
isEmptyObject: function( obj ) { isEmptyObject: function( obj ) {
@ -4479,7 +4484,7 @@ function on( elem, types, selector, data, fn, one ) {
if ( fn === false ) { if ( fn === false ) {
fn = returnFalse; fn = returnFalse;
} else if ( !fn ) { } else if ( !fn ) {
return this; return elem;
} }
if ( one === 1 ) { if ( one === 1 ) {
@ -5128,14 +5133,14 @@ var
rscriptTypeMasked = /^true\/(.*)/, rscriptTypeMasked = /^true\/(.*)/,
rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g; rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
// Manipulating tables requires a tbody
function manipulationTarget( elem, content ) { function manipulationTarget( elem, content ) {
if ( jQuery.nodeName( elem, "table" ) && return jQuery.nodeName( elem, "table" ) &&
jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
return elem.getElementsByTagName( "tbody" )[ 0 ] || elem; elem.getElementsByTagName( "tbody" )[ 0 ] ||
} elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) :
elem;
return elem;
} }
// Replace/restore the type attribute of script elements for safe DOM manipulation // Replace/restore the type attribute of script elements for safe DOM manipulation
@ -5642,7 +5647,7 @@ var getStyles = function( elem ) {
// FF meanwhile throws on frame elements through "defaultView.getComputedStyle" // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
var view = elem.ownerDocument.defaultView; var view = elem.ownerDocument.defaultView;
if ( !view.opener ) { if ( !view || !view.opener ) {
view = window; view = window;
} }
@ -5791,15 +5796,18 @@ function curCSS( elem, name, computed ) {
style = elem.style; style = elem.style;
computed = computed || getStyles( elem ); computed = computed || getStyles( elem );
ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
// Support: Opera 12.1x only
// Fall back to style even without computed
// computed is undefined for elems on document fragments
if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) {
ret = jQuery.style( elem, name );
}
// Support: IE9 // Support: IE9
// getPropertyValue is only needed for .css('filter') (#12537) // getPropertyValue is only needed for .css('filter') (#12537)
if ( computed ) { if ( computed ) {
ret = computed.getPropertyValue( name ) || computed[ name ];
if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
ret = jQuery.style( elem, name );
}
// A tribute to the "awesome hack by Dean Edwards" // A tribute to the "awesome hack by Dean Edwards"
// Android Browser returns percentage for some values, // Android Browser returns percentage for some values,
@ -7322,6 +7330,12 @@ jQuery.extend( {
} }
} ); } );
// Support: IE <=11 only
// Accessing the selectedIndex property
// forces the browser to respect setting selected
// on the option
// The getter ensures a default option is selected
// when in an optgroup
if ( !support.optSelected ) { if ( !support.optSelected ) {
jQuery.propHooks.selected = { jQuery.propHooks.selected = {
get: function( elem ) { get: function( elem ) {
@ -7330,6 +7344,16 @@ if ( !support.optSelected ) {
parent.parentNode.selectedIndex; parent.parentNode.selectedIndex;
} }
return null; return null;
},
set: function( elem ) {
var parent = elem.parentNode;
if ( parent ) {
parent.selectedIndex;
if ( parent.parentNode ) {
parent.parentNode.selectedIndex;
}
}
} }
}; };
} }
@ -7524,7 +7548,8 @@ jQuery.fn.extend( {
var rreturn = /\r/g; var rreturn = /\r/g,
rspaces = /[\x20\t\r\n\f]+/g;
jQuery.fn.extend( { jQuery.fn.extend( {
val: function( value ) { val: function( value ) {
@ -7600,9 +7625,15 @@ jQuery.extend( {
option: { option: {
get: function( elem ) { get: function( elem ) {
// Support: IE<11 var val = jQuery.find.attr( elem, "value" );
// option.value not trimmed (#14858) return val != null ?
return jQuery.trim( elem.value ); val :
// Support: IE10-11+
// option.text throws exceptions (#14686, #14858)
// Strip and collapse whitespace
// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " );
} }
}, },
select: { select: {
@ -7655,7 +7686,7 @@ jQuery.extend( {
while ( i-- ) { while ( i-- ) {
option = options[ i ]; option = options[ i ];
if ( option.selected = if ( option.selected =
jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
) { ) {
optionSet = true; optionSet = true;
} }
@ -7849,7 +7880,7 @@ jQuery.extend( jQuery.event, {
// But now, this "simulate" function is used only for events // But now, this "simulate" function is used only for events
// for which stopPropagation() is noop, so there is no need for that anymore. // for which stopPropagation() is noop, so there is no need for that anymore.
// //
// For the compat branch though, guard for "click" and "submit" // For the 1.x branch though, guard for "click" and "submit"
// events is still used, but was moved to jQuery.event.stopPropagation function // events is still used, but was moved to jQuery.event.stopPropagation function
// because `originalEvent` should point to the original event for the constancy // because `originalEvent` should point to the original event for the constancy
// with other events and for more focused logic // with other events and for more focused logic
@ -9350,18 +9381,6 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
// Support: Safari 8+
// In Safari 8 documents created via document.implementation.createHTMLDocument
// collapse sibling forms: the second one becomes a child of the first one.
// Because of that, this security measure has to be disabled in Safari 8.
// https://bugs.webkit.org/show_bug.cgi?id=137337
support.createHTMLDocument = ( function() {
var body = document.implementation.createHTMLDocument( "" ).body;
body.innerHTML = "<form></form><form></form>";
return body.childNodes.length === 2;
} )();
// Argument "data" should be string of html // Argument "data" should be string of html
// context (optional): If specified, the fragment will be created in this context, // context (optional): If specified, the fragment will be created in this context,
// defaults to document // defaults to document
@ -9374,12 +9393,7 @@ jQuery.parseHTML = function( data, context, keepScripts ) {
keepScripts = context; keepScripts = context;
context = false; context = false;
} }
context = context || document;
// Stop scripts or inline event handlers from being executed immediately
// by using document.implementation
context = context || ( support.createHTMLDocument ?
document.implementation.createHTMLDocument( "" ) :
document );
var parsed = rsingleTag.exec( data ), var parsed = rsingleTag.exec( data ),
scripts = !keepScripts && []; scripts = !keepScripts && [];
@ -9461,7 +9475,7 @@ jQuery.fn.load = function( url, params, callback ) {
// If it fails, this function gets "jqXHR", "status", "error" // If it fails, this function gets "jqXHR", "status", "error"
} ).always( callback && function( jqXHR, status ) { } ).always( callback && function( jqXHR, status ) {
self.each( function() { self.each( function() {
callback.apply( self, response || [ jqXHR.responseText, status, jqXHR ] ); callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
} ); } );
} ); } );
} }
@ -9619,11 +9633,8 @@ jQuery.fn.extend( {
} }
// Add offsetParent borders // Add offsetParent borders
// Subtract offsetParent scroll positions parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ) - parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
offsetParent.scrollTop();
parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true ) -
offsetParent.scrollLeft();
} }
// Subtract parent offsets and element margins // Subtract parent offsets and element margins

4
BuildFeed/Scripts/jquery-2.2.3.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -4,7 +4,7 @@
* intended to be used only for design-time IntelliSense. Please use the * intended to be used only for design-time IntelliSense. Please use the
* standard jQuery library for all production use. * standard jQuery library for all production use.
* *
* Comment version: 1.14.0 * Comment version: 1.15.0
*/ */
/* /*
@ -15,7 +15,7 @@
* for informational purposes only and are not the license terms under * for informational purposes only and are not the license terms under
* which Microsoft distributed this file. * which Microsoft distributed this file.
* *
* jQuery Validation Plugin - v1.14.0 - 2/4/2013 * jQuery Validation Plugin - v1.15.0 - 2/4/2013
* https://github.com/jzaefferer/jquery-validation * https://github.com/jzaefferer/jquery-validation
* Copyright (c) 2013 Jörn Zaefferer; Licensed MIT * Copyright (c) 2013 Jörn Zaefferer; Licensed MIT
* *

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -1,7 +1,7 @@
// Type definitions for jQuery 1.10.x / 2.0.x // Type definitions for jQuery 1.10.x / 2.0.x
// Project: http://jquery.com/ // Project: http://jquery.com/
// Definitions by: Boris Yankov <https://github.com/borisyankov/>, Christian Hoffmeister <https://github.com/choffmeister>, Steve Fenton <https://github.com/Steve-Fenton>, Diullei Gomes <https://github.com/Diullei>, Tass Iliopoulos <https://github.com/tasoili>, Jason Swearingen <https://github.com/jasons-novaleaf>, Sean Hill <https://github.com/seanski>, Guus Goossens <https://github.com/Guuz>, Kelly Summerlin <https://github.com/ksummerlin>, Basarat Ali Syed <https://github.com/basarat>, Nicholas Wolverson <https://github.com/nwolverson>, Derek Cicerone <https://github.com/derekcicerone>, Andrew Gaspar <https://github.com/AndrewGaspar>, James Harrison Fisher <https://github.com/jameshfisher>, Seikichi Kondo <https://github.com/seikichi>, Benjamin Jackman <https://github.com/benjaminjackman>, Poul Sorensen <https://github.com/s093294>, Josh Strobl <https://github.com/JoshStrobl>, John Reilly <https://github.com/johnnyreilly/>, Dick van den Brink <https://github.com/DickvdBrink> // Definitions by: Boris Yankov <https://github.com/borisyankov/>, Christian Hoffmeister <https://github.com/choffmeister>, Steve Fenton <https://github.com/Steve-Fenton>, Diullei Gomes <https://github.com/Diullei>, Tass Iliopoulos <https://github.com/tasoili>, Jason Swearingen <https://github.com/jasons-novaleaf>, Sean Hill <https://github.com/seanski>, Guus Goossens <https://github.com/Guuz>, Kelly Summerlin <https://github.com/ksummerlin>, Basarat Ali Syed <https://github.com/basarat>, Nicholas Wolverson <https://github.com/nwolverson>, Derek Cicerone <https://github.com/derekcicerone>, Andrew Gaspar <https://github.com/AndrewGaspar>, James Harrison Fisher <https://github.com/jameshfisher>, Seikichi Kondo <https://github.com/seikichi>, Benjamin Jackman <https://github.com/benjaminjackman>, Poul Sorensen <https://github.com/s093294>, Josh Strobl <https://github.com/JoshStrobl>, John Reilly <https://github.com/johnnyreilly/>, Dick van den Brink <https://github.com/DickvdBrink>
// Definitions: https://github.com/borisyankov/DefinitelyTyped // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
/* ***************************************************************************** /* *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved. Copyright (c) Microsoft Corporation. All rights reserved.
@ -48,7 +48,7 @@ interface JQueryAjaxSettings {
*/ */
contents?: { [key: string]: any; }; contents?: { [key: string]: any; };
//According to jQuery.ajax source code, ajax's option actually allows contentType to set to "false" //According to jQuery.ajax source code, ajax's option actually allows contentType to set to "false"
// https://github.com/borisyankov/DefinitelyTyped/issues/742 // https://github.com/DefinitelyTyped/DefinitelyTyped/issues/742
/** /**
* When sending data to the server, use this content type. Default is "application/x-www-form-urlencoded; charset=UTF-8", which is fine for most cases. If you explicitly pass in a content-type to $.ajax(), then it is always sent to the server (even if no data is sent). The W3C XMLHttpRequest specification dictates that the charset is always UTF-8; specifying another charset will not force the browser to change the encoding. * When sending data to the server, use this content type. Default is "application/x-www-form-urlencoded; charset=UTF-8", which is fine for most cases. If you explicitly pass in a content-type to $.ajax(), then it is always sent to the server (even if no data is sent). The W3C XMLHttpRequest specification dictates that the charset is always UTF-8; specifying another charset will not force the browser to change the encoding.
*/ */
@ -180,7 +180,7 @@ interface JQueryXHR extends XMLHttpRequest, JQueryPromise<any> {
/** /**
* Incorporates the functionality of the .done() and .fail() methods, allowing (as of jQuery 1.8) the underlying Promise to be manipulated. Refer to deferred.then() for implementation details. * Incorporates the functionality of the .done() and .fail() methods, allowing (as of jQuery 1.8) the underlying Promise to be manipulated. Refer to deferred.then() for implementation details.
*/ */
then(doneCallback: (data: any, textStatus: string, jqXHR: JQueryXHR) => void, failCallback?: (jqXHR: JQueryXHR, textStatus: string, errorThrown: any) => void): JQueryPromise<any>; then<R>(doneCallback: (data: any, textStatus: string, jqXHR: JQueryXHR) => R, failCallback?: (jqXHR: JQueryXHR, textStatus: string, errorThrown: any) => void): JQueryPromise<R>;
/** /**
* Property containing the parsed response if the response Content-Type is json * Property containing the parsed response if the response Content-Type is json
*/ */
@ -676,6 +676,12 @@ interface JQueryStatic {
* @param dataType The type of data expected from the server. Default: Intelligent Guess (xml, json, script, or html). * @param dataType The type of data expected from the server. Default: Intelligent Guess (xml, json, script, or html).
*/ */
get(url: string, data?: Object|string, success?: (data: any, textStatus: string, jqXHR: JQueryXHR) => any, dataType?: string): JQueryXHR; get(url: string, data?: Object|string, success?: (data: any, textStatus: string, jqXHR: JQueryXHR) => any, dataType?: string): JQueryXHR;
/**
* Load data from the server using a HTTP GET request.
*
* @param settings The JQueryAjaxSettings to be used for the request
*/
get(settings : JQueryAjaxSettings): JQueryXHR;
/** /**
* Load JSON-encoded data from the server using a GET HTTP request. * Load JSON-encoded data from the server using a GET HTTP request.
* *
@ -721,7 +727,12 @@ interface JQueryStatic {
* @param dataType The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html). * @param dataType The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html).
*/ */
post(url: string, data?: Object|string, success?: (data: any, textStatus: string, jqXHR: JQueryXHR) => any, dataType?: string): JQueryXHR; post(url: string, data?: Object|string, success?: (data: any, textStatus: string, jqXHR: JQueryXHR) => any, dataType?: string): JQueryXHR;
/**
* Load data from the server using a HTTP POST request.
*
* @param settings The JQueryAjaxSettings to be used for the request
*/
post(settings : JQueryAjaxSettings): JQueryXHR;
/** /**
* A multi-purpose callbacks list object that provides a powerful way to manage callback lists. * A multi-purpose callbacks list object that provides a powerful way to manage callback lists.
* *

View File

@ -1,11 +1,11 @@
// Type definitions for JsRender // Type definitions for JsRender
// Project: http://www.jsviews.com/#jsrender // Project: http://www.jsviews.com/#jsrender
// Definitions by: Kensuke Matsuzaki <https://github.com/zakki> // Definitions by: Kensuke Matsuzaki <https://github.com/zakki>
// Definitions: https://github.com/borisyankov/DefinitelyTyped // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
/// <reference path="../jquery/jquery.d.ts"/> /// <reference path="../jquery/jquery.d.ts"/>
declare module JsRender { declare namespace JsRender {
interface Converters { interface Converters {
(name: string, converterFn: (value: any) => any): any; (name: string, converterFn: (value: any) => any): any;
(namedConverters: any, parentTemplate?: any): any; (namedConverters: any, parentTemplate?: any): any;

View File

@ -9,7 +9,7 @@
<meta name="viewport" content="width=device-width" /> <meta name="viewport" content="width=device-width" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link href="//maxcdn.bootstrapcdn.com/bootswatch/3.3.6/slate/bootstrap.min.css" rel="stylesheet" /> <link href="//maxcdn.bootstrapcdn.com/bootswatch/3.3.6/slate/bootstrap.min.css" rel="stylesheet" />
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet" /> <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css" rel="stylesheet" />
<link href="//fonts.googleapis.com/css?family=Rajdhani:400,700&subset=latin,latin-ext" rel="stylesheet" type="text/css" /> <link href="//fonts.googleapis.com/css?family=Rajdhani:400,700&subset=latin,latin-ext" rel="stylesheet" type="text/css" />
<link rel="shortcut icon" href="~/favicon.ico" /> <link rel="shortcut icon" href="~/favicon.ico" />
<link rel="icon" href="~/favicon.ico" /> <link rel="icon" href="~/favicon.ico" />

View File

@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width" /> <meta name="viewport" content="width=device-width" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link href="//maxcdn.bootstrapcdn.com/bootswatch/3.3.6/slate/bootstrap.min.css" rel="stylesheet" /> <link href="//maxcdn.bootstrapcdn.com/bootswatch/3.3.6/slate/bootstrap.min.css" rel="stylesheet" />
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet" /> <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css" rel="stylesheet" />
<link href="//fonts.googleapis.com/css?family=Rajdhani:400,700&subset=latin,latin-ext" rel="stylesheet" type="text/css" /> <link href="//fonts.googleapis.com/css?family=Rajdhani:400,700&subset=latin,latin-ext" rel="stylesheet" type="text/css" />
<link rel="shortcut icon" href="~/favicon.ico" /> <link rel="shortcut icon" href="~/favicon.ico" />
<link rel="icon" href="~/favicon.ico" /> <link rel="icon" href="~/favicon.ico" />

View File

@ -6,10 +6,11 @@
<h1>@BuildFeed.Local.Common.Credits</h1> <h1>@BuildFeed.Local.Common.Credits</h1>
<dl class="credits-list"> <dl class="credits-list">
<dt>BuildFeed / WUTest Team</dt> <dt>BuildFeed Team</dt>
<dd>Thomas Hounsell&ensp;<a target="_blank" rel="nofollow" href="https://twitter.com/tomhounsell"><i class="fa fa-twitter"></i></a></dd> <dd>Thomas Hounsell&ensp;<a target="_blank" rel="nofollow" href="https://twitter.com/tomhounsell"><i class="fa fa-twitter"></i></a></dd>
<dd>Nick (ultrawindows)&ensp;<a target="_blank" rel="nofollow" href="https://twitter.com/nickurtnl"><i class="fa fa-twitter"></i></a></dd> <dd>Nick (ultrawindows)&ensp;<a target="_blank" rel="nofollow" href="https://twitter.com/nickurtnl"><i class="fa fa-twitter"></i></a></dd>
<dd>Ahmed (airportsfan)&ensp;<a target="_blank" rel="nofollow" href="https://twitter.com/airportsfan"><i class="fa fa-twitter"></i></a></dd> <dd>Ahmed (airportsfan)&ensp;<a target="_blank" rel="nofollow" href="https://twitter.com/airportsfan"><i class="fa fa-twitter"></i></a></dd>
<dd>Lukas (tfwboredom)&ensp;<a target="_blank" rel="nofollow" href="https://twitter.com/tfwboredom"><i class="fa fa-twitter"></i></a></dd>
<dd>Daniel K</dd> <dd>Daniel K</dd>
</dl> </dl>
<div class="row"> <div class="row">