text:
var QueryCommand = require('./commands/query_command').QueryCommand,
  DbCommand = require('./commands/db_command').DbCommand,
  BinaryParser = require('./bson/binary_parser').BinaryParser,
  MongoReply = require('./responses/mongo_reply').MongoReply,
  Admin = require('./admin').Admin,
  Connection = require('./connection').Connection,
  Collection = require('./collection').Collection,
  Server = require('./connections/server').Server,
  ReplSetServers = require('./connections/repl_set_servers').ReplSetServers,
  Cursor = require('./cursor').Cursor,
  EventEmitter = require('events').EventEmitter,
  inherits = require('util').inherits,
  crypto = require('crypto'),
  debug = require('util').debug,
  inspect = require('util').inspect;

var Db = exports.Db = function(databaseName, serverConfig, options) {
  EventEmitter.call(this);
  this.databaseName = databaseName;
  this.serverConfig = serverConfig;
  this.options = options == null ? {} : options;

  // Ensure we have a valid db name
  validateDatabaseName(databaseName);

  // Contains all the connections for the db
  try {
    this.native_parser = this.options.native_parser;
    var serializer = this.options.native_parser ? require('../../external-libs/bson') : require('./bson/bson');
    this.bson_serializer = serializer;
    this.bson_deserializer = serializer;
  } catch (err) {
    // If we tried to instantiate the native driver
    throw "Native bson parser not compiled, please compile or avoid using native_parser=true";
  }

  // State of the db connection
  this.state = 'notConnected';
  this.pkFactory = this.options.pk == null ? this.bson_serializer.ObjectID : this.options.pk;
  this.forceServerObjectId = this.options.forceServerObjectId != null ? this.options.forceServerObjectId : false;
  // Added strict
  this.operationTimeout = this.options.operationTimeout == null ? 1000 :  parseInt(this.options.operationTimeout);
  this.strict = this.options.strict == null ? false : this.options.strict;
  this.notReplied ={};
  this.isInitializing = true;
  this.auths = [];
  // Allow slaveOk
  this.slaveOk = this.options["slave_ok"] == null ? false : this.options["slave_ok"];

  var self = this;
  // Add a listener for the reconnect event
  this.serverConfig.on("reconnect", function() {
    // Number of current auths
    var authLength = self.auths.length;
    var numberOfReadyAuth = 0;

    if(authLength > 0) {
      // If we have any auths fire off the auth message to all the connections
      for(var i = 0; i < authLength; i++) {
        // Execute auth commands
        self.authenticate(self.auths[i].username, self.auths[i].password, function(err, result) {
          numberOfReadyAuth = numberOfReadyAuth + 1;

          if(numberOfReadyAuth == self.auths.length) {
            self.serverConfig.emit("resend");
          }
        });
      }
    } else {
      self.serverConfig.emit("resend");
    }
  });
};

function validateDatabaseName(databaseName) {
  if(typeof databaseName !== 'string') throw new Error("database name must be a string");
  if(databaseName.length === 0) throw new Error("database name cannot be the empty string");

  var invalidChars = [" ", ".", "$", "/", "\\"];
  for(var i = 0; i < invalidChars.length; i++) {
    if(databaseName.indexOf(invalidChars[i]) != -1) throw new Error("database names cannot contain the character '" + invalidChars[i] + "'");
  }
}

inherits(Db, EventEmitter);

Db.prototype.open = function(callback) {
  var self = this;
  // Set up connections
  if(self.serverConfig instanceof Server || self.serverConfig instanceof ReplSetServers) {
    self.serverConfig.connect(self, function(err, result) {
      if(err != null) return callback(err, null);
      // Callback
      return callback(null, self);
    });

  } else {
    return callback(Error("Server parameter must be of type Server or ReplSetServers"), null);
  }
};

Db.prototype.close = function(callback) {
  // Remove all listeners and close the connection
  this.serverConfig.removeAllListeners("reconnect");
  this.serverConfig.close(callback);

  // Clear out state of the connection
  this.state = "notConnected";
};

Db.prototype.admin = function(callback) {
  if(callback == null) return new Admin(this);
  callback(null, new Admin(this));
};

/**
  Get the list of all collections for a mongo master server
**/
Db.prototype.collectionsInfo = function(collection_name, callback) {
  if(callback == null) { callback = collection_name; collection_name = null; }
  // Create selector
  var selector = {};
  // If we are limiting the access to a specific collection name
  if(collection_name != null) selector.name = this.databaseName + "." + collection_name;

  // Return Cursor
  // callback for backward compatibility
  if (callback) {
    callback(null, new Cursor(this, new Collection(this, DbCommand.SYSTEM_NAMESPACE_COLLECTION), selector));
  } else {
    return new Cursor(this, new Collection(this, DbCommand.SYSTEM_NAMESPACE_COLLECTION), selector);
  }
};

/**
  Get the list of all collection names for the specified db
**/
Db.prototype.collectionNames = function(collection_name, callback) {
  if(callback == null) { callback = collection_name; collection_name = null; }
  var self = this;
  // Let's make our own callback to reuse the existing collections info method
  self.collectionsInfo(collection_name, function(err, cursor) {
    if(err != null) return callback(err, null);

    cursor.toArray(function(err, documents) {
      if(err != null) return callback(err, null);

      // List of result documents that have been filtered
      var filtered_documents = [];
      // Remove any collections that are not part of the db or a system db signed with $
      documents.forEach(function(document) {
        if(!(document.name.indexOf(self.databaseName) == -1 || document.name.indexOf('$') != -1))
          filtered_documents.push(document);
      });
      // Return filtered items
      callback(null, filtered_documents);
    });
  });
};

/**
  Fetch a specific collection (containing the actual collection information)
**/
Db.prototype.collection = function(collectionName, options, callback) {
  var self = this;
  if(typeof options === "function") { callback = options; options = {}; }
  // Execute safe
  if(options && options.safe || this.strict) {
    self.collectionNames(collectionName, function(err, collections) {
      if(err != null) return callback(err, null);

      if(collections.length == 0) {
        return callback(new Error("Collection " + collectionName + " does not exist. Currently in strict mode."), null);
      } else {
        try {
          var collection = new Collection(self, collectionName, self.pkFactory, options);
        } catch(err) {
          return callback(err, null);
        }
        return callback(null, collection);
      }
    });
  } else {
    try {
      var collection = new Collection(self, collectionName, self.pkFactory, options);
    } catch(err) {
      return callback(err, null);
    }
    return callback(null, collection);
  }
};

/**
  Fetch all collections for the given db
**/
Db.prototype.collections = function(callback) {
  var self = this;
  // Let's get the collection names
  self.collectionNames(function(err, documents) {
    if(err != null) return callback(err, null);
    var collections = [];
    documents.forEach(function(document) {
      collections.push(new Collection(self, document.name.replace(self.databaseName + ".", ''), self.pkFactory));
    });
    // Return the collection objects
    callback(null, collections);
  });
};

/**
  Evaluate javascript on the server
**/
Db.prototype.eval = function(code, parameters, callback) {
  if(typeof parameters === "function") { callback = parameters; parameters = null; }
  var finalCode = code;
  var finalParameters = [];
  // If not a code object translate to one
  if(!(finalCode instanceof this.bson_serializer.Code)) {
    finalCode = new this.bson_serializer.Code(finalCode);
  }

  // Ensure the parameters are correct
  if(parameters != null && parameters.constructor != Array) {
    finalParameters = [parameters];
  } else if(parameters != null && parameters.constructor == Array) {
    finalParameters = parameters;
  }
  // Create execution selector
  var selector = {'$eval':finalCode, 'args':finalParameters};
  // Iterate through all the fields of the index
  new Cursor(this, new Collection(this, DbCommand.SYSTEM_COMMAND_COLLECTION), selector, {}, 0, -1).nextObject(function(err, result) {
    if(err != null) return callback(err, null);

    if(result.ok == 1) {
      callback(null, result.retval);
    } else {
      callback(new Error("eval failed: " + result.errmsg), null); return;
    }
  });
};

Db.prototype.dereference = function(dbRef, callback) {
  this.collection(dbRef.namespace, function(err, collection) {
    if(err != null) return callback(err, null);

    collection.findOne({'_id':dbRef.oid}, function(err, result) {
      callback(err, result);
    });
  });
};

/**
  Logout user from server
  Fire off on all connections and remove all auth info
**/
Db.prototype.logout = function(options, callback) {
  var self = this;
  // If the first object is a function
  if(typeof options === "function") { callback = options; options = {}}

  // Let's generate the logout command object
  var logoutCommand = DbCommand.logoutCommand(self, {logout:1, socket:options['socket']});

  // For all the connections let's execute the command
  var rawConnections = self.serverConfig.allRawConnections();
  var numberOfExpectedReturns = rawConnections.length;

  for(var index = 0; index < numberOfExpectedReturns; index++) {
    // Execute the logout on all raw connections
    self.executeCommand(logoutCommand, {writer: rawConnections[index].connection}, function(err, result) {
      // Ajust the number of expected results
      numberOfExpectedReturns = numberOfExpectedReturns - 1;

      // If we are done let's evaluate
      if(numberOfExpectedReturns <= 0) {
        // Reset auth
        self.auths = [];

        // Handle any errors
        if(err == null && result.documents[0].ok == 1) {
          callback(null, true);
        } else {
          err != null ? callback(err, false) : callback(new Error(result.documents[0].errmsg), false);
        }
      }
    });
  }
}

/**
  Authenticate against server
**/
Db.prototype.authenticate = function(username, password, callback) {
  var self = this;
  // Add the auth details to the connection for reconnects or update existing if any
  var found = false;
  for(var i = 0; i < self.auths.length; i++) {
    // If we have found an existing auth, update the password
    if(self.auths[i].username == username) {
      found = true;
      self.auths[i].password = password;
    }
  }
  // Push the new auth if we have no previous record
  if(!found) self.auths.push({'username':username, 'password':password});
  // Figure out the number of times we need to trigger
  var rawConnections = self.serverConfig.allRawConnections();
  var numberOfExpectedReturns = rawConnections.length;
  // Execute the commands
  for(var i = 0; i < numberOfExpectedReturns; i++) {
    // Execute command
    var createNonceCallback = function(index) {
      return function(err, reply) {
        if(err == null) {
          // Nonce used to make authentication request with md5 hash
          var nonce = reply.documents[0].nonce;
          // Execute command
          self.executeCommand(DbCommand.createAuthenticationCommand(self, username, password, nonce), {writer: rawConnections[index].connection}, function(err, result) {
            // Ajust the number of expected results
            numberOfExpectedReturns = numberOfExpectedReturns - 1;
            // If we are done let's evaluate
            if(numberOfExpectedReturns <= 0) {
              if(err == null && result.documents[0].ok == 1) {
                callback(null, true);
              } else {
                err != null ? callback(err, false) : callback(new Error(result.documents[0].errmsg), false);
              }
            }
          });
        } else {
          callback(err, null);
        }
      }
    }

    this.executeCommand(DbCommand.createGetNonceCommand(self), {writer: rawConnections[i].connection}, createNonceCallback(i));
  }
};

/**
  Add a user
**/
Db.prototype.addUser = function(username, password, callback) {
  // Use node md5 generator
  var md5 = crypto.createHash('md5');
  // Generate keys used for authentication
  md5.update(username + ":mongo:" + password);
  var userPassword = md5.digest('hex');
  // Fetch a user collection
  this.collection(DbCommand.SYSTEM_USER_COLLECTION, function(err, collection) {
    // Insert the user into the system users collections
    collection.insert({user: username, pwd: userPassword}, {safe:true}, function(err, documents) {
      callback(err, documents);
    });
  });
};

/**
  Remove a user
**/
Db.prototype.removeUser = function(username, callback) {
  // Fetch a user collection
  this.collection(DbCommand.SYSTEM_USER_COLLECTION, function(err, collection) {
    collection.findOne({user: username}, function(err, user) {
      if(user != null) {
        collection.remove({user: username}, function(err, result) {
          callback(err, true);
        });
      } else {
        callback(err, false);
      }
    });
  });
};

/**
  Create Collection
**/
Db.prototype.createCollection = function(collectionName, options, callback) {
  var args = Array.prototype.slice.call(arguments, 1);
  callback = args.pop();
  options = args.length ? args.shift() : null;
  var self = this;
  // Check if we have the name
  this.collectionNames(collectionName, function(err, collections) {
    if(err != null) return callback(err, null);

    var found = false;
    collections.forEach(function(collection) {
      if(collection.name == self.databaseName + "." + collectionName) found = true;
    });

    // If the collection exists either throw an exception (if db in strict mode) or return the existing collection
    if(found && ((options && options.safe) || self.strict)) {
      return callback(new Error("Collection " + collectionName + " already exists. Currently in strict mode."), null);
    } else if(found){
      try {
        var collection = new Collection(self, collectionName, self.pkFactory);
      } catch(err) {
        return callback(err, null);
      }
      return callback(null, collection);
    }

    // Create a new collection and return it
    self.executeCommand(DbCommand.createCreateCollectionCommand(self, collectionName, options), {read:false, safe:true}, function(err, result) {
      if(err == null && result.documents[0].ok == 1) {
        try {
          var collection = new Collection(self, collectionName, self.pkFactory);
        } catch(err) {
          return callback(err, null);
        }
        return callback(null, collection);
      } else {
        err != null ? callback(err, null) : callback(new Error("Error creating collection: " + collectionName), null);
      }
    });
  });
};

Db.prototype.command = function(selector, callback) {
  var cursor = new Cursor(this, new Collection(this, DbCommand.SYSTEM_COMMAND_COLLECTION), selector, {}, 0, -1, null, null, null, null, QueryCommand.OPTS_NO_CURSOR_TIMEOUT);
  cursor.nextObject(callback);
};

/**
  Drop Collection
**/
Db.prototype.dropCollection = function(collectionName, callback) {
  this.executeCommand(DbCommand.createDropCollectionCommand(this, collectionName), function(err, result) {
    if(err == null && result.documents[0].ok == 1) {
      if(callback != null) return callback(null, true);
    } else {
      if(callback != null) err != null ? callback(err, null) : callback(new Error(result.documents[0].errmsg), null);
    }
  });
};

/**
  Rename Collection
**/
Db.prototype.renameCollection = function(fromCollection, toCollection, callback) {
  this.executeCommand(DbCommand.createRenameCollectionCommand(this, fromCollection, toCollection), function(err, doc) { callback(err, doc); });
};

/**
  Return last error message for the given connection
**/
Db.prototype.lastError = function(options, connectionOptions, callback) {
  // Unpack calls
  var args = Array.prototype.slice.call(arguments, 0);
  callback = args.pop();
  options = args.length ? args.shift() : {};
  connectionOptions = args.length ? args.shift() : {};

  this.executeCommand(DbCommand.createGetLastErrorCommand(options, this), connectionOptions, function(err, error) {
    callback(err, error && error.documents);
  });
};

Db.prototype.error = function(options, callback) {
  // Unpack call parameters
  var args = Array.prototype.slice.call(arguments, 0);
  callback = args.pop();
  options = args.length ? args.shift() : {};
  // Execute last error
  this.lastError(options, {}, callback);
};

/**
  Return the status for the last operation on the given connection
**/
Db.prototype.lastStatus = function(callback) {
  this.executeCommand(DbCommand.createGetLastStatusCommand(this), callback);
};

/**
  Return all errors up to the last time db reset_error_history was called
**/
Db.prototype.previousErrors = function(callback) {
  this.executeCommand(DbCommand.createGetPreviousErrorsCommand(this), function(err, error) {
    callback(err, error.documents);
  });
};

/**
  Runs a command on the database
**/
Db.prototype.executeDbCommand = function(command_hash, options, callback) {
  if(callback == null) { callback = options; options = {}; }
  this.executeCommand(DbCommand.createDbCommand(this, command_hash), options, callback);
};

/**
  Runs a command on the database as admin
**/
Db.prototype.executeDbAdminCommand = function(command_hash, callback) {
  this.executeCommand(DbCommand.createAdminDbCommand(this, command_hash), callback);
};

/**
  Resets the error history of the mongo instance
**/
Db.prototype.resetErrorHistory = function(callback) {
  this.executeCommand(DbCommand.createResetErrorHistoryCommand(this), callback);
};

/**
  Create an index on a collection
**/
Db.prototype.createIndex = function(collectionName, fieldOrSpec, options, callback) {
  if(callback == null) { callback = options; options = null; }
  var command = DbCommand.createCreateIndexCommand(this, collectionName, fieldOrSpec, options);
  this.executeCommand(command, {read:false, safe:true}, function(err, result) {
    if(err != null) return callback(err, null);

    result = result && result.documents;
    if (result[0].err) {
      callback(this.wrap(result[0]));
    } else {
      callback(null, command.documents[0].name);
    }
  });
};

/**
  Ensure index, create an index if it does not exist
**/
Db.prototype.ensureIndex = function(collectionName, fieldOrSpec, options, callback) {
  if(callback == null) { callback = options; options = null; }
  var command = DbCommand.createCreateIndexCommand(this, collectionName, fieldOrSpec, options);
  var index_name = command.documents[0].name;
  var self = this;
  // Check if the index allready exists
  this.indexInformation(collectionName, function(err, collectionInfo) {
    if(err != null) return callback(err, null);

    if(!collectionInfo[index_name])  {
      self.executeCommand(command, {read:false, safe:true}, function(err, result) {
        if(err != null) return callback(err, null);

        result = result && result.documents;
        if (result[0].err) {
          callback(this.wrap(result[0]));
        } else {
          callback(null, command.documents[0].name);
        }
      });
    } else {
      return callback(null, index_name);
    }
  });
};

/**
  Fetch the cursor information
**/
Db.prototype.cursorInfo = function(callback) {
  this.executeCommand(DbCommand.createDbCommand(this, {'cursorInfo':1}), function(err, result) {
    callback(err, result.documents[0]);
  });
};

/**
  Drop Index on a collection
**/
Db.prototype.dropIndex = function(collectionName, indexName, callback) {
  this.executeCommand(DbCommand.createDropIndexCommand(this, collectionName, indexName), callback);
};

/**
  Index Information
**/
Db.prototype.indexInformation = function(collectionName, options, callback) {
  // Unpack calls
  var args = Array.prototype.slice.call(arguments, 0);
  callback = args.pop();
  collectionName = args.length ? args.shift() : null;
  options = args.length ? args.shift() : {};

  // If we specified full information
  var full = options['full'] == null ? false : options['full'];
  // Build selector for the indexes
  var selector = collectionName != null ? {ns: (this.databaseName + "." + collectionName)} : {};
  // Iterate through all the fields of the index
  new Cursor(this, new Collection(this, DbCommand.SYSTEM_INDEX_COLLECTION), selector).toArray(function(err, indexes) {
    if(err != null) return callback(err, null);
    // Contains all the information
    var info = {};

    // if full defined just return all the indexes directly
    if(full) return callback(null, indexes);

    // Process all the indexes
    for(var i = 0; i < indexes.length; i++) {
      var index = indexes[i];
      // Let's unpack the object
      info[index.name] = [];
      for(var name in index.key) {
        info[index.name].push([name, index.key[name]]);
      }
    }

    // Return all the indexes
    callback(null, info);
  });
};

/**
  Database Drop Command
**/
Db.prototype.dropDatabase = function(callback) {
  this.executeCommand(DbCommand.createDropDatabaseCommand(this), function(err, result) {
    callback(err, result);
  });
};

/**
  Execute db command
**/
Db.prototype.executeCommand = function(db_command, options, callback) {
    var self = this;

    var args = Array.prototype.slice.call(arguments, 1);
    callback = args.pop();
    options = args.length ? args.shift() : {};

    // Options unpacking
    var read = options['read'] != null ? options['read'] : false;
    var safe = options['safe'] != null ? options['safe'] : false;
    // Signals both commands return a value
    var allReturn = options['allReturn'] != null ? options['allReturn'] : false;
    // Let's us pass in a writer to force the use of a connection (used for admin where we need to peform 2 calls against the same connection)
    var rawConnection = options['writer'] != null ? options['writer'] : null;

    var errorCommand = null;
    if(safe) {
      errorCommand = DbCommand.createGetLastErrorCommand(safe, this);
    }

    // Contains the command we need to listen to
    var listenToCommand = null;

    // If we have a callback execute
    if(callback instanceof Function) {
      listenToCommand = errorCommand != null ? errorCommand : db_command;

      // If we need to return all the results let's do it
      if(allReturn && safe != null && safe != false) {
        // Handle the 2 callbacks ensuring we trap all errors
        var handleBothCommandsFunction = function() {
          // Number of expected results before a callback
          var numberOfResultsToBeReturned = 2;
          var results = [];
          // Handle the callbacks
          return function(err, result) {
            // Adjust number of expected results
            numberOfResultsToBeReturned = numberOfResultsToBeReturned - 1;
            // Add results and error
            results.push({err:err, result:result});
            // Return if we got all the responses
            if(numberOfResultsToBeReturned <= 0) {

              // If the first command fails return that and ignore the next command result
              if(results[0].err || !results[0].result.ok) {
                return callback(results[0].err, results[0].result);
              } else {
                // First command went ok, return second command results
                return callback(results[1].err, results[1].result);
              }
            }
          }
        }();

        // Fire actual command
        this.on(db_command.getRequestId().toString(), handleBothCommandsFunction);
        // Fire the error command
        this.on(errorCommand.getRequestId().toString(), handleBothCommandsFunction);
      } else {
        // Add the callback to the list of callbacks by the request id (mapping outgoing messages to correct callbacks)
        this.on(listenToCommand.getRequestId().toString(), callback);
        if(self.serverConfig.primary != null) {
  	      this.notReplied[listenToCommand.getRequestId().toString()] = new Date().getTime();
  	    }
      }
    }

    try{
      // Attempt forcing a reconnect if we have a replicaset server
      if(self.serverConfig instanceof ReplSetServers && !self.serverConfig.isConnected()) {
        // Initialize
        self.isInitializing = true;
        // Number of retries
        var retries = self.serverConfig.retries;
        // Attempts a reconnect
        var reconnectAttempt = function() {
          // Try reconnect
          self.serverConfig.connect(self, function(err, result) {
            // Initialize
            self.isInitializing = true;
            // Set retries
            retries = retries - 1;
            // If we fail retry the connec
            if(err != null && retries > 0) {
              // Wait an try again
              setTimeout(reconnectAttempt, self.serverConfig.reconnectWait);
            } else {
              // Ensure we catch any errors happening and report them (especially important for replicaset servers)
              try {
                if(err != null && callback instanceof Function) return callback(err, null);
                // for the other instances fire the message
                var writer = read ? self.serverConfig.checkoutReader() : self.serverConfig.checkoutWriter();
                // If we got safe set
                if(errorCommand != null) {
                  writer.send([db_command, errorCommand], rawConnection);
                } else {
                  writer.send(db_command, rawConnection);
                }
              } catch (err) {
                // Set server config to disconnected if it's a replicaset
                if(self.serverConfig instanceof ReplSetServers && err == "notConnected") {
                  // Just clear up all connections as we need to perform a complete reconnect for the call
                  self.serverConfig.disconnect();
                }

                // Signal an error
                if(!(err instanceof Error)) err = new Error(err);
                if(callback instanceof Function) {
                  if(errorCommand != null) delete self.notReplied[errorCommand.getRequestId().toString()];
                  return callback(err, null);
                }
              }
            }
          });
        }

        // Force a reconnect after self.serverConfig.reconnectWait seconds
        setTimeout(reconnectAttempt, self.serverConfig.reconnectWait);
      } else {
        // for the other instances fire the message
        var writer = read ? self.serverConfig.checkoutReader() : self.serverConfig.checkoutWriter();
        // If we got safe set
        if(errorCommand != null) {
          writer.send([db_command, errorCommand], rawConnection);
        } else {
          writer.send(db_command, rawConnection);
        }
      }
    } catch(err){
      // Set server config to disconnected if it's a replicaset
      if(self.serverConfig instanceof ReplSetServers && err == "notConnected") {
        // Just clear up all connections as we need to perform a complete reconnect for the call
        self.serverConfig.disconnect();
      }

      if(err == 'notConnected') {
        delete self.notReplied[listenToCommand.getRequestId().toString()];
        return callback(new Error(err), null);
      }

      // Signal an error
      if(!(err instanceof Error)) err = new Error(err);
      if(callback instanceof Function) {
        if(errorCommand != null) delete self.notReplied[errorCommand.getRequestId().toString()];
        return callback(err, null);
      }

      // Return error object
      return err;
    }
};

/**
 * Wrap a Mongo error document into an Error instance
 */
Db.prototype.wrap = function(error) {
  var e = new Error(error.err);
  e.name = 'MongoError';

  // Get all object keys
  var keys = Object.keys(error);
  // Populate error object with properties
  for(var i = 0; i < keys.length; i++) {
    e[keys[i]] = error[keys[i]];
  }

  return e;
}

/**
 * Connect to URL
 *
 * The mongodb URL scheme is documented at:
 *   http://www.mongodb.org/display/DOCS/Connections
**/
Db.DEFAULT_URL = 'mongodb://localhost:27017/default';

exports.connect = function(url, options, callback) {
  var args = Array.prototype.slice.call(arguments, 1);
  callback = args.pop();
  options = args.length ? args.shift() : null;
  options = options || {};
  var serverOptions = options.server || {};
  var replSetServersOptions = options.replSetServers || {};
  var dbOptions = options.db || {};

  var urlRE = new RegExp('^mongo(?:db)?://(?:|([^@/]*)@)([^@/]*)(?:|/([^?]*)(?:|\\?([^?]*)))$');
  var match = (url || Db.DEFAULT_URL).match(urlRE);
  if (!match)
    throw Error("URL must be in the format mongodb://user:pass@host:port/dbname");

  var authPart = match[1] || '';
  var auth = authPart.split(':', 2);
  var hostPart = match[2];
  var dbname = match[3] || 'default';
  var urlOptions = (match[4] || '').split(/[&;]/);

  // Ugh, we have to figure out which options go to which constructor manually.
  urlOptions.forEach(function(opt) {
    if (!opt) return;
    var splitOpt = opt.split('='), name = splitOpt[0], value = splitOpt[1];

    // Server options:
    if (name == 'slaveOk' || name == 'slave_ok')
      serverOptions.slave_ok = (value == 'true');
    if (name == 'poolSize')
      serverOptions.poolSize = Number(value);
    if (name == 'autoReconnect' || name == 'auto_reconnect')
      serverOptions.auto_reconnect = (value == 'true');

    // ReplSetServers options:
    if (name == 'replicaSet' || name == 'rs_name')
      replSetServersOptions.rs_name = value;
    if (name == 'reconnectWait')
      replSetServersOptions.reconnectWait = Number(value);
    if (name == 'retries')
      replSetServersOptions.retries = Number(value);
    if (name == 'readSecondary' || name == 'read_secondary')
      replSetServersOptions.read_secondary = (value == 'true');

    // DB options:
    if (name == 'safe')
      dbOptions.safe = (value == 'true');
    // Not supported by Db: safe, w, wtimeoutMS, fsync, journal, connectTimeoutMS, socketTimeoutMS
    if (name == 'nativeParser' || name == 'native_parser')
      dbOptions.native_parser = (value == 'true');
    if (name == 'strict')
      dbOptions.strict = (value == 'true');
  });

  var servers = hostPart.split(',').map(function(h) {
    var hostPort = h.split(':', 2);
    return new Server(hostPort[0] || 'localhost', hostPort[1] || 27017,
                      serverOptions);
  });

  var server;
  if (servers.length == 1) {
    server = servers[0];
  } else {
    server = new ReplSetServers(servers, replSetServersOptions);
  }

  var db = new Db(dbname, server, dbOptions);
  if (options.noOpen)
    return db;

  db.open(function(err, db){
    if(!err && authPart){
      db.authenticate(auth[0], auth[1], function(err, success){
        if(success){
          callback(null, db);
        }
        else {
          callback(err ? err : new Error('Could not authenticate user ' + auth[0]), null);
        }
      });
    } else {
      callback(err, db);
    }
  });
}


At the time of this recording in 1964 the collaborations between Dave Brubeck and Paul Desmond have gone for quite a long time already with many nights (and early mornings) wrapped in the haze of Pall Mall's and the vapors of Dewar's, the saxophonist's two key trademarks.
Furthermore, this quartet – Brubeck, Desmond, Wright and Morello, lived an exceptional musical story from 1951 until 1967 enjoying tremendous success. Even after the group officially broke up, Brubeck and Desmond met up again for glorious new tours and occasional reunions.
This 'classic quartet' had the best balance, the strongest swing and the best interaction of any of the Brubeck quartets. The ambiance, on this previously unissued date in Zurich (September 28th, 1964), is perfect and the bond between the four musicians enlightening with a telepathic balance throughout the concert with an exceptional sound quality.
Highly recommended by us at Jazz Messengers. Certainly a 'must have' in every collection as well as for anyone wanting to listen to exceptional jazz music.
Recorded live at Kongresshaus Zürich, September 28, 1964.


text:
DigitalCommons@TMC
Home > UT Health > UTHSPH > SPHOpenDisserts > 25
UT School of Public Health Dissertations (Open Access)
IDENTIFYING RISK FACTORS ASSOCIATED WITH CARDIOVASCULAR DISEASE RISK IN LESBIANS
Sofia S. Velazquez, UTHealth School of Public HealthFollow
Date of Award
Fall 12-2018
ALANNA C. MORRISON, PHD, FAHA
STACIA DESANTIS, MS PHD
Cardiovascular disease (CVD) is the leading cause of female deaths in the United States (1). While women, in general, are at risk for CVD, current research indicates that sexual minority women (i.e. lesbians and bisexual women [SMW]) may be at greater risk for CVD than heterosexual women. This heightened risk potentially stems from an increased prevalence of traditional CVD risk factors in SMW, creating health disparities between SMW and their heterosexual counterparts (2). Further research into this high-risk population is needed, in order to minimize these disparities.
The purpose of this study was to establish differences in the prevalence of modifiable CVD risk factors among lesbians and heterosexual women and compare their risks for coronary heart disease. This study also sought to identify best practices for obtaining higher rates of sexual orientation (SO) disclosure in questionnaire settings.
Data collected through the Houston HeartReach Registry from 2013-2017 was used for the creation of a lesbian cohort. A cohort of heterosexual women was aggregated from the 2015-2016 National Health and Nutrition Examination Surveys. Both cohorts contained information on sociodemographic data and traditional CVD risk factors. A 10-year risk score for developing coronary heart disease was calculated for all women and compared by SO. Differences in the prevalence of traditional cardiovascular disease risk factors were also examined by SO.
Lesbians were more likely to be current or ever smokers, to be depressed or have hypertension, to have an education level past high school, and to earn less income than their heterosexual counterparts. On average, lesbian participants had a 0.60% (95% confidence interval [CI] = -0.25%, 1.44%) greater chance of developing coronary heart disease over the next ten years than their heterosexual counterparts, but this difference was not significant (p = 0.167). Neither income, glucose, family history of cardiovascular disease, or depression accounted for this difference, but education and body mass index (BMI) partially intensified this difference. Lesbians have an increased prevalence of various CVD risk factors compared to their heterosexual counterparts, but future research is needed to fully understand the causes of these increased risk factors and their effect on CVD risk. With lesbians comprising a uniquely high-risk subgroup for CVD, attention must be paid to their CVD risk profile. The identification of CVD risk factors unique to and/or heightened in lesbians will allow for more targeted interventions that can lead to a reduction in disparities of CVD risk for lesbians and reduce the morbidity of CVD in women overall. A literature review of PubMed, conducted as a part of this thesis, indicates that future epidemiologic studies working with SMW should create an LGBT-welcoming environment, use accepting and inclusive language, and demonstrate a knowledge of lesbian-specific health at recruiting events and in questionnaires, in order to facilitate SO disclosure and increase the likelihood of successful recruitment.
Velazquez, Sofia S., "IDENTIFYING RISK FACTORS ASSOCIATED WITH CARDIOVASCULAR DISEASE RISK IN LESBIANS" (2018). UT School of Public Health Dissertations (Open Access). 25.
https://digitalcommons.library.tmc.edu/uthsph_dissertsopen/25
Community Psychology Commons, Health Psychology Commons, Public Health Commons
Texas Medical Center Library
McGovern Historical Center
NIH Public Access Policy
School of Public Health Website

redpajama_set_name: RedPajamaCommonCrawl


text:
Tribute wrestling show to honor the late 'Macho Man' Randy Savage
Submitted by Anonymous on Thursday, July 7th, 8:23 am
New Port Richey, Florida -- New Dawn Wrestling will be sponsoring a "Macho Man" Randy Savage Tribute Show on Saturday, July 9, in New Port Richey.
The event will feature a live performance by Hallow Heroes, and the following wrestlers will be part of the live show: "The Genius," Honly Tonk Man, "Outlaw" Ron Bass, Ox Baker, Titan, Big Vito, and more.
Macho Man dies in Seminole crash
Family and fans mourn the loss of Randy 'Macho Man' Savage
Macho Man's mom shares memories
Police: 'Macho Man' died of enlarged heart
Land O' Lakes football player tops state ranking of tight end picks
Submitted by Sherry Ray, Meteorologist/Reporter
Wednesday, July 6th, 2011, 8:49am
Land O' Lakes, Florida - For football fans in Land O' Lakes, Kent Taylor is among the best they've seen holding down the tight end position.
Now the proof is in and Taylor has made it into FlaVarsity's Top 160.
This year's 2012 tight end class has been touted as one of the strongest in years.
Land O' Lakes athletic camp for kids
Monday, June 13th, 2011, 11:14am
Land O' Lakes, FL -- Pasco Health and Fitness will be providing Speed, Agility, and Strength Camp for all young athletes.
The camp will provide:
Core Strength Development
Increased Dynamic Movement Capabilities
Proper Foot Work Techniques
Injury Prevention Assistance
Figure skating champs gliding into Port Richey to compete
Submitted by Anonymous on Saturday, June 4th, 10:48 am
Two hundred artistic skaters are expected take to the Pasco County pine to compete at the 2011 Southern Region Figure Qualifying Championship June 11-14 at Spinnations Skating Center in Port Richey, Florida. Skaters representing more than 30 clubs will be attempting to qualify for the U. S. Championships.
The roller Figure Skating Championships begins Saturday evening, June 11th, with the opening ceremonies at 6 p.m. followed by the evening events which will include the region's "top" athletes in the Junior World and Senior World divisions, the "Premier" Adult dance Divisions and the International Solo dance divisions.
Join the Sunset Paddle from Werner Boyce State Park
Submitted by Anonymous on Thursday, June 2nd, 8:42 am
On June 4 at 6:30 p.m., the Salt Springs Alliance is pleased to announce a Sunset Kayak DIP - "Designated Interpretive Paddle".
The kayak trip cost is $5.00 for all non-members, while CSO members may paddle for free. This is for experienced kayakers and is approximately a 4-mile paddle through Werner-Boyce Salt Springs State Park to Durney Key to enjoy the sunset and scenery.
Kayaks can be reserved and rented from Makai Kayak at 727-534-1336. Please note: This must be arranged in advance. Please bring a light, flashlight or battery lantern and safety gear for your kayak since we will be returning just after sunset. Registration begins at 5:30 p.m.
Pasco residents get fit with free run/walk club
Wednesday, May 25th, 2011, 9:52am
Pasco County, FL -- Summer is almost here and everywhere you look, Pasco County residents are finding ways to step up their fitness and get ready for the season.
If you love the great outdoors and have been looking for something to get you off the couch and moving, Pasco Health and Fitness at 23600 State Road may have what you're looking for.
The facility is located in Lutz but services the surrounding areas of Wesley Chapel, and Land O' Lakes.
Bike Night at Wiregrass
Submitted by The Shops at Wiregrass
Sunday, May 15th, 2011, 4:53pm
The Shops at Wiregrass invites motorcyclists from all over the Tampa Bay area to show off their bikes and admire others at Bike Night on the third Saturday of every month from March through October.
Live music, local vendors, shopping discounts and fabulous restaurants!
Walgreens - 7827 Land O Lakes Blvd. Land O Lakes, FL 34638


text:
PAST CARS
Italian International (en)
Austrian GP 2020 – Qualifying
Team's reaction after Qualifying
Pierre Gasly (AT01-04, Car 10)
Third Practice Session – Best lap: 1:04.949, pos. 9th, 19 laps
Qualifying – Best lap: (Q1) 1:04.603, (Q2) 1:04.305, pos. 12th
"I'm pleased with my result today. After yesterday's practice sessions we might have expected that it was not going to be an easy Qualifying for us today, but overnight we managed to make some good improvements to the car. I think we can be happy with both cars in Q2. At the moment that's where we are, but we have a free choice of tyres and so many things can happen during a race, so hopefully this will give us a good opportunity to fight for points tomorrow. The target is always the same and we'll push as much as we can to get a good result here at Red Bull's home race."
Daniil Kvyat (AT01-03, Car 26)
Third Practice Session – Best lap: 1:05.290, pos. 14th, 23 laps
"It's hard to know what to expect for the race, as today's Quali is about a single lap and tomorrow it's 71. Qualifying was ok, although to be honest my laps weren't super tidy and I left some lap time on the table, because of a couple of mistakes. But the pace was there considering that we were unhappy yesterday in FP1 and worked hard to improve the car from then on. We got just about everything out of the car this afternoon. We lack a couple of tenths here, but historically this track has always been a bit tricky for us and we are already in better shape than we were here last year. We are starting from a position where we can fight for some points and have a strong clean race."
Jody Egginton (Technical Director)
"Friday was in some respects more difficult than it should have been, but the guys took a few lessons on board and reacted positively ahead of today and as a result extracted more from our car. The set-up changes made overnight on both sides of the garage were effective, with both cars showing balance improvements during FP3 and the two drivers making good use of these changes to set some more representative times in this morning's session. We felt qualifying was going to be close. Both cars navigated Q1 without too much fuss and the first runs in Q2 were fine. However, we did not manage to take the next step in the final runs with either driver in Q2 in what was a very tight midfield.
We were unable to make the cut for Q3 on this occasion, ending qualifying in 12th and 13th which is disappointing but has also highlighted the primary areas in which we need to improve our package. Our focus now switches back to preparations for the race and, with the qualifying positions providing us with some useful strategy options, we will be looking to take advantage of any opportunities. We are all very much looking forward to getting back down to the business of going racing tomorrow in what we expect will be an exciting race."
Toyoharu Tanabe (Honda F1 Technical Director):
"This first qualifying of 2020 produced some surprises. We have Max on row 2 and Alex on row 3, which is a positive result. However, the time gap to the quickest was not that small. But with Max starting on the Medium tyres and our race pace that we had in free practice looking encouraging, we can hope to have a good race tomorrow. AlphaTauri managed to improve the car from yesterday and 12 and 13 on the grid is encouraging. It would be nice if the team could score points in the debut event with its new name. Our PU worked fine in all four cars so far this weekend and we look forward to a good race, knowing that the competition looks very close."
SESSION RESULTS - FULL CLASSIFICATION
Valtteri Bottas Mercedes 0:1:2:939
Lewis Hamilton Mercedes 0:1:2:951
Max Verstappen Red Bull 0:1:3:477
Lando Norris McLaren 0:1:3:626
Alexander Albon Red Bull 0:1:3:868
Sergio Pérez Racing Point 0:1:3:868
Charles Leclerc Ferrari 0:1:3:923
Carlos Sainz Jr. McLaren 0:1:3:971
Lance Stroll Racing Point 0:1:4:29
Daniel Ricciardo Renault 0:1:4:239
Sebastian Vettel Ferrari 0:1:4:206
Pierre Gasly AlphaTauri 0:1:4:305
Daniil Kvyat AlphaTauri 0:1:4:431
Esteban Ocon Renault 0:1:4:643
Romain Grosjean Haas 0:1:4:691
Kevin Magnussen Haas 0:1:5:164
George Russell Williams 0:1:5:167
Antonio Giovinazzi Alfa Romeo 0:1:5:175
Kimi Räikkönen Alfa Romeo 0:1:5:224
Nicholas Latifi Williams 0:1:5:757
Drivers Constructors
Lewis Hamilton (Mercedes AMG Petronas) 347
Valtteri Bottas (Mercedes AMG Petronas) 223
Max Verstappen (Aston Martin Red Bull Racing) 214
Sergio Pérez (BWT Racing Point) 125
Daniel Ricciardo (Renault DP World) 119
Carlos Sainz Jr. (McLaren) 105
Alexander Albon (Aston Martin Red Bull Racing) 105
Charles Leclerc (Scuderia Ferrari Mission Winnow) 98
Lando Norris (McLaren) 97
Pierre Gasly (Scuderia AlphaTauri Honda) 75
Lance Stroll (BWT Racing Point) 75
Esteban Ocon (Renault DP World) 62
Sebastian Vettel (Scuderia Ferrari Mission Winnow) 33
Daniil Kvyat (Scuderia AlphaTauri Honda) 32
Nico Hülkenberg (BWT Racing Point) 10
Antonio Giovinazzi (Alfa Romeo Racing ORLEN) 4
Kimi Räikkönen (Alfa Romeo Racing ORLEN) 4
George Russell (Williams Racing) 3
Romain Grosjean (Haas F1 Team) 2
Kevin Magnussen (Haas F1 Team) 1
Nicholas Latifi (Williams Racing) 0
Jack Aitken (Williams Racing) 0
Pietro Fittipaldi (Haas F1 Team) 0
Racing Point 195
AlphaTauri 107
Haas 3
who's in this?
Styrian Grand Prix 2020
Drivers and Team's reactions after the race
Styrian GP 2020 – Qualifying
Styrian GP 2020 – Free Practice
Team's reaction after Free Practice
Austrian Grand Prix 2020
Team's reaction after the race
AlphaTauri launches Spring/Summer 2021 collection
On Saturday night, AlphaTauri staged a part-real, part virtual fashion […]
Austrian GP 2020 – Free Practice
Team's reaction after free practice 1&2


text:
Siegfried Sassoon in 1915
Matfield, Kent, England
1 September 1967 (aged 80)
Heytesbury, Wiltshire, England
Poet and novelist
Siegfried Sassoon (8 September 1886 - 1 September 1967) was an English poet and novelist, who became widely known as a result of a protest against the First World War that he made in 1917.[1]
3 Later life
Background[change | change source]
Sassoon's father, Alfred, came from a very rich family, but they did not approve of his marriage and as a result he did not inherit any of the family fortune. Sassoon's mother, Theresa, came from a family of artists. She and Alfred had three sons: Michael, Siegfried and Hamo, but Alfred left her when the children were still very young. Alfred himself died not long afterwards, leaving Theresa to bring up the three boys. Although they were not as wealthy as Alfred's family, they were able to live comfortably in a large house near the village of Matfield in Kent.[2]
Early life[change | change source]
As a young man, Siegfried could afford to keep a horse and became a very inspiring and a very good professional rider, but his greatest ambition was to be a millionaire poet person. He did not succeed in finding a publisher for any of his work until just before the First World War broke out. At that point, he joined the army. He chose the Sussex Yeomanry, in order that his horse could go with him rather than being taken by the authorities for other uses. As a result of a riding accident during training, he was out of action for a while, and he then decided to join an infantry regiment and become an officer. The regiment he joined was the Royal Welch Fusiliers,[1] and he began with the rank of lieutenant.
Eventually Sassoon was sent out to France to fight on the Western Front and was shocked by his experiences there.[1] He became friends with another poet, Robert Graves, who, although younger than Sassoon, had been at the Front for longer and had grown used to it. He suggested that Sassoon's poetry could be improved if he began to write in a more realistic way about the things he saw and experienced in France, and Sassoon took his advice and changed his style a lot.[3]
By 1917, many of Sassoon's friends, and his brother,[1] had been killed and he had become very angry about the war. As a result of several acts of bravery, he had been awarded the Military Cross, but he did not see this as a great honour. When he was sent home to recover from a wound, he met people who were opposed to the war, and, after listening to their arguments, he began to believe that the politicians were deliberately making the war last longer than it needed to, instead of taking opportunities to make peace with the Germans. He decided not to return to his regiment at the end of his leave, and, feeling very depressed, he tore the ribbon of his medal off his uniform and threw it in a river. He then wrote a letter to his commanding officer, explaining that he was not coming back because he wanted to protest about the war.
When soldiers acted against orders like this, they were normally made to appear at a court-martial. However, because of Sassoon's good record as a soldier, he was given a chance to change his mind. His friend Robert Graves told the senior officers how depressed Sassoon was and said that he was too ill to fight.[1] It was decided to send him to a hospital in Edinburgh, which specialised in dealing with officers who were suffering from mental illness. Sassoon did not like being there, because he felt that he was not really ill. He was greatly influenced by his doctor, W. H. R. Rivers, who became a kind of father figure to him. While he was a patient in Edinburgh, he met another young officer, called Wilfred Owen. Owen admired Sassoon's poetry and the two became close friends.[1] Sassoon helped Owen to write better poetry; this is known because the manuscript of one of Owen's greatest poems, Anthem for Doomed Youth, still exists showing corrections in Sassoon's writing.[4] Sassoon and Owen were separated after a few months, when Sassoon came to the end of his time at the hospital and agreed to go back to his regiment.
Sassoon was not sent back to France immediately, but fought for a few months in Palestine, where the troops were in less danger of being killed. After that, he returned to France, but after only a short time he was wounded again, and this time it was serious enough to stop him from being sent back. He stayed in touch with Wilfred Owen. While Sassoon was away fighting, Owen had also been released from hospital, and was being sent back to his regiment in France. Several days before the end of the war, Owen was killed.
During the war, Sassoon's poetry had become very successful. After the war, however, he went through a period of great unhappiness. His friend Rivers died suddenly, and he felt he had nothing left to write about. He realised that he was homosexual,[1] but he was unable to find a partner he could rely on. He thought of becoming a politician, but began writing for the newspapers instead. After a few years, a friend suggested that he should write about his experiences in a novel. Sassoon did so, writing about his early life and calling the book Memoirs of a Fox-Hunting Man (1928). He published the book anonymously, because he was well known as a poet and had doubts about his ability to write prose. To disguise his identity, he called the hero "George Sherston", but the character was based on Sassoon himself. The book turned out to be a huge success, and Sassoon wrote two sequels to it. He later wrote three more prose books about his life, this time without disguising any of the characters, and these were also very successful.
Later life[change | change source]
At the age of 47, after several homosexual love affairs, Sassoon married.[1] His wife, Hester, was much younger than him, but Sassoon was desperate to become a father. They moved into Heytesbury House in Wiltshire, a large house that he had bought with money inherited from his aunt, Rachel Beer. Two years after their marriage, Hester became pregnant with their son George (1936-2006). Hester did not want to have any more children, and this became the cause of many quarrels between the couple, until, after the Second World War, they agreed to divorce, and Hester went to live in Scotland, taking George with her. Siegfried continued to see his son, but he was unable have the close relationship with George that he would have liked.
He continued to be a respected writer until his death, and had many friends in the world of literature, including another poet, Edmund Blunden, whom he had met during the 1920s. In 1951, he was awarded the CBE[5] and in 1957 the Queen's Gold Medal for Poetry.
Sassoon's grave at Mells churchyard
Sassoon had been brought up by his mother in the Church of England, although his father was Jewish. His war experiences made him doubt the existence of God, and he was not interested in religion until towards the end of his life. In 1957, after much heart-searching, he became a Roman Catholic, and remained so until his death at the age of eighty.[1] He was buried in the churchyard at Mells in Somerset.
↑ 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 "BBC - History - Historic Figures: Siegfried Sassoon (1886 - 1967)". bbc.co.uk. 2012. Retrieved 26 October 2012.
↑ Chapman, Frank (10 December 2010). "War poet was tasty with bat". Kent and Sussex Courier. p. p42. CS1 maint: extra text (link)
↑ Siegfried Sassoon: The Making of a War Poet, Jean Moorcroft Wilson, (Duckworth, 2004)
↑ Copy of the manuscript held in the Oxford War Poetry Digital Archive
↑ "No. 39104". The London Gazette (Supplement). 29 December 1950. pp. 10–12.
Retrieved from "https://simple.wikipedia.org/w/index.php?title=Siegfried_Sassoon&oldid=6735237"
Bisexual Christians
English LGBT people
English novelists
LGBT writers
Writers from Kent
CS1 maint: extra text
Pages containing London Gazette template with parameter supp set to y


text:
Title 28. JUDICIARY AND JUDICIAL PROCEDURE
Part VI. Particular Proceedings
Chapter 171. Tort Claims Procedure
28 U.S.C. § 2671 - Definitions
As used in this chapter and sections 1346(b) and 2401(b) of this title, the term "Federal agency" includes the executive departments, the judicial and legislative branches, the military departments, independent establishments of the United States, and corporations primarily acting as instrumentalities or agencies of the United States, but does not include any contractor with the United States.
"Employee of the government" includes (1) officers or employees of any federal agency, members of the military or naval forces of the United States, members of the National Guard while engaged in training or duty under section 115, 316, 502, 503, 504, or 505 of title 32, and persons acting on behalf of a federal agency in an official capacity, temporarily or permanently in the service of the United States, whether with or without compensation, and (2) any officer or employee of a Federal public defender organization, except when such officer or employee performs professional services in the course of providing representation under section 3006A of title 18.
"Acting within the scope of his office or employment", in the case of a member of the military or naval forces of the United States or a member of the National Guard as defined in section 101(3) of title 32, means acting in line of duty.
Source: June 25, 1948, ch. 646, 62 Stat. 982; May 24, 1949, ch. 139, §124, 63 Stat. 106; Pub. L. 89-506 §8, July 18, 1966, 80 Stat. 307; Pub. L. 97-124 §1, Dec. 29, 1981, 95 Stat. 1666; Pub. L. 100-694 §3, Nov. 18, 1988, 102 Stat. 4564; Pub. L. 106-398 §1 [[div. A], title VI, §665(b)], Oct. 30, 2000, 114 Stat. 1654, 1654A-169; Pub. L. 106-518 §401, Nov. 13, 2000, 114 Stat. 2421.
HISTORICAL AND REVISION NOTES
Based on title 28, U.S.C., 1940 ed., §941 (Aug. 2, 1946, ch. 753, §402, 60 Stat. 842).
Changes were made in phraseology.
This section corrects a typographical error in section 2671 of title 28, U.S.C.
2000- Pub. L. 106-518 in par. defining "Employee of the government", inserted "(1)" after "includes" and added cl. (2).
Pub. L. 106-398 inserted "115," after "members of the National Guard while engaged in training or duty under section" in par. defining "Employee of the government".
1988- Pub. L. 100-694 inserted "the judicial and legislative branches," after "departments," in first par.


Book Finishing, PUR Binding, Mechanical Binding, Padding, Affixing & More!
Foil Stamping, Die Cutting, Embossing, Folding, Gluing & More.
Inserting, Mail Sortation, Read/Write, Match Mailing & More!
Our Hybrid Services are a Combination of Services & Fulfillment.
SFG is uniquely positioned to help printers, publishers and end users to achieve a finished print project they can be proud of.
Specialty Finishing Group is the premier post press production services company in the country. We offer mailing, binding and automated handwork, hybrid kitting, and fulfillment services to printers, print brokers, agencies and end users. We run millions of pieces of mail a day, and millions of books are bound weekly. Think of us as your one-stop-shop for anything that happens to your project after it's printed.
More finishing services under one roof than any other provider in the country.
Offering everything from PUR Perfect binding to complex camera driven mailing projects, SFG is uniquely positioned to help printers, publishers and end users to achieve a finished print project they can be proud of. With a relentless commitment to on-time delivery and keeping budget in mind, SFG is a one-stop resource for any finishing project from press sheet to finished product.
Click on a gallery below to see more photos.


giving up the home run to Wells. Shields called it "unacceptable" and said he was much more disappointed in the pitch that hit Chris Stewart than the pitch hit by Wells. Two mistakes in a tight ballgame meant the Royals lost to the Yankees, 3-2.
If you've been following Mike Moustakas' career you know he worked hard to improve his defense last season and impressed everybody with his progress. Mike improved so much that people thought he'd have a shot at winning a Gold Glove, sooner rather than later. Royals fans have seen Mike make much harder plays than the one that blew up on him Saturday night. The Royals defense was expected to be much better than it's been so far in 2013. There are 129 ball games left for them to get it right—most people who follow the team closely will be surprised if the defense doesn't improve dramatically.
When two aces are throwing you're more likely to see managers play small ball; they figure a big inning is not right around the corner and they better play for one. That's just what the Royals did after Elliot Johnson got on with a swinging bunt. Johnson stole second—more on that in a moment—advanced to third on another swinging bunt and came home on a grounder to short.
Stealing off lefty Andy Pettitte is a chore; he's got a "B" move over to first base that he shows the runner until the runner thinks he's got it figured out—then Pettitte drops the "A" move on the poor guy. Pettitte's best move looks like he's going home and all the "B" move attempts are made to lure the runner in to taking the bait and a step toward second. And as if that's not enough, Andy has another move where he makes a snap throw from the sidearm position.
So give Elliot Johnson credit for stealing the base. Maybe he just guessed right, but the steal turned into a run.
James Shields also has a quick pickoff move, but doesn't have the advantage of being left handed. Shields was holding runners by holding the ball in the set position. That pause makes the runner's legs go dead—it's like a sprinter being in the starting blocks too long. Holding the ball in the set is irritating to some fans because it makes the game drag, but it's better to have a slow game than a runner in scoring position.
With Jayson Nix on first base a double play ball was hit to Elliot Johnson at second base and shortstop Alcides Escobar temporarily stepped in front of him. That caused some confusion; Johnson tried to tag the runner coming into second instead of taking the sure out at first and everybody was safe. On the other hand, Elliot's mistake kept the double play in order and they turned it on the next pitch. When you screw up and the pitcher bails you out of it, it's an incredible relief. Probably the same thing a pitcher feels when he makes a bad pitch and someone makes a diving catch.
Mariano Rivera, the Yankee closer, was waiting down in the bullpen with about a billion saves lifetime and another 13 he's tacked on this year. Rivera also had a 1.88 ERA going, so the Royals probably needed to get something done in the eighth inning, before Mariano got the call. The score was 3-2, the Yankees pitcher was reliever David Robertson and the Royals had the top of the order due up for the fourth time, they needed to score before Rivera got in the game—it seemed like now or never.
Robertson struck out the side.
Rivera and his cutter came into the game and got two quick outs before Salvador Perez doubled. Jarrod Dyson came out to run and Mike Moustakas stepped to the plate with a chance to redeem himself—and Moose came close.
He hit a rocket down the right field line that was just foul and would have tied the game up, but then flew out to the right center gap for the final out. Vernon Wells, the Yankee left fielder that plays deep, just barely got there to make the catch. Had Vernon been even a couple steps in, the game would have been tied with Moose standing on second. As it was, the crowd at least got to see the best closer of all time add to his save total.
he crushed the ball and he knew the ball was going out—after all, they were playing in Baltimore and the right-field foul pole is only 318 feet away.
he was pausing dramatically. Alex said he'd never walk on his way to first base, so he immediately started running—but in the back of his mind he was wondering if he was going to pay for that momentary lapse. If pitcher Freddy Garcia saw the pose and took exception to it, Gordo would not have been surprised if he'd gotten drilled the next time he came to the plate. In fact, Alex would have understood: he made a mistake and was willing to accept the consequences. But if Garcia wanted revenge, he had to do it the right way: throw the ball behind Gordon's back and below the shoulders. When a pitch is behind a hitter, the natural instinct is to back up—the hitter backs right into the pitch. Gordon would have gotten hit in the back or backside; no real damage done. But throw up around the head and now you're risking a hitter's career and health—Alex would not be OK with that.
Gordon said he led off the inning in his next at-bat, so the chances of Garcia wanting to hit him and start the inning with a runner on base were slim, but if he had gotten drilled, Alex would have accepted his punishment and trotted down to first. Gordon's an old-school ballplayer who thinks the game ought to be played the right way and was willing to pay for a mistake.


These beautiful Custom Christmas Cookie Favors are hand decorated, baked fresh and taste amazing!! They even taste better than they look! Our Christmas Cookies are so BIG in size and so vibrant in color that these pictures don't do them justice! Our Christmas Wreaths, and Stockings are big enough to write on. Now that's BIG! These Cookie Favors are a delicious and fun way to celebrate this Holiday Season! Each Christmas Cookie comes in cellophane bag and curling ribbon to make this the perfect Christmas Gift! Perfect for School Holiday Parties, Corporate Holiday Gifts, or just to hand out to your loved ones. Everyone loves cookies, and our Christmas Cookies will surly make their Holiday Merry and Bright!
Snowmen 5" x 3 1/4"
Christmas trees 4 1/4" x 4"
Stocking 5" x 3 1/4"


Cendon, Eva (2016). Bridging Theory and Practice. Reflective Learning in Higher Education. In Walter Nuninger & Jean-Marie Châtelet (Hrsg.), Handbook of research on quality assurance and value management in higher education. (S. 304‐324). Hershey: IGI Global. DOI: 10.4018/978-1-5225-0024-7. Abgerufen von: http://search.ebscohost.com/login.aspx?direct=true&scope=site&db=nlebk&AN=1238587.


Jeder Shaker ist Top. Ich habe mir bei meiner ersten Bestellung gleich 2 Shaker dazu genommen. Und Ich bin total begeistert. Liegen gut in der Hand, bieten genug platz um notfalls den Shake zu verdünnen und durch dieses "Sieb" brauch man sich keine Gedanken um eine mögliche Klümpchenbildung zu machen. Alles in allem bin Ich sehr zufrieden und kann es jedem nur Raten sich direkt einen oder gleich 2 Shaker mit zu bestellen.
oatmeal (35%, contains gluten), maltodextrin (21%), whey protein concentrate (16%), isomaltulose (8%), MCT-powder, collagen hydrolysate, soy lecithin, BCAA's (leucine, isoleucine, valine), psyllium husk powder, minerals: sodium hydrogen carbonate, potassium citrate, calcium carbonate, magnesium carbonate, zinc gluconate, potassium iodide, sodium selenite, cinnamon, flavour, sweetener (sucralose), coloring: beta-carotene (1%), vitamins: L-ascorbic acid (C), d-alpha-tocopherylacetate (E), niacin (B3), cholecalciferol (D3), biotine (1%), calcium-d-pantothenate (B5), cyanocobalamin (B12, 0,1%), pyridoxine hydro chloride (B6), riboflavin (B2), phytomenadione (K), thiaminemononitrate (B1), retinyl acetate (A), folic Acid (B9).
Add 150g of powder and 300ml of water to the shaker and shake well for 20 seconds.
oatmeal (35%, contains gluten), maltodextrin (19%), whey protein concentrate (16%), isomaltulose (8%), MCT-powder, collagen hydrolysate, soy lecithin, BCAA's (leucine, isoleucine, valine), psyllium husk powder, cocoa powder fat reduced, minerals: sodium hydrogen bicarbonate, potassium citrate, calcium carbonate, magnesium carbonate, zinc gluconate, potassium iodide, sodium selenite, and copper gluconate flavor, vitamins: L-ascorbic acid (C), tocopheryl acetate (E, 50%), nicotinamide (B3), cholecalciferol (D3), biotin (1%), calcium-d-pantothenate (B5), cyanocobalamin (B12, 0,1%), pyridoxine hydro chloride (B6), riboflavin (B2), phytomenadione (K), thiamine mononitrate (B1), retinyl acetate (A), folic Acid (B9). Sweetener: sucralose.
oat meal (35%, contains gluten), maltodextrin (21%), whey protein concentrate (16%), isomaltulose (8%, Palatinose), mct fat powder, collagen hydrolysate, soy lecithin powder, BCAA's (l-leucin, l-isoleucin, l-valin), psyllium husk powder, minerals: sodium bicarbonate, potassium citrate, calcium carbonate, magnesium carbonate, zinc gluconate, potassium iodide, sodium selenite, sodium molybdate, copper gluconate and chromium picolinate, flavour, vitamins: l-ascorbic acid (vit. C), tocopheryl acetate (vit. E, 50%), nicotinic amide (vit. B3), cholecalciferole (vit. D3), biotin (1%), calcium-d-pantothenate (vit. B5), cyanocobalamine (vit. B12, 0,1%), pyridoxine hydrochloride (vit. B6), riboflavin (vit. B2), phytomenadione (vit. K), thiamine mononitrate (vit. B1), retinyl acetate (vit. A) and folic acid (vit. B9), sweetener sucralose.
oatmeal (41%, contains gluten), maltodextrin (22%), whey protein concentrate (16%), isomaltulose (8%, palatinose), palm fat powder (8%), BCAA (l-leucin, l-isoleucin, l-valin; contains emulsifier sunflower lecithin), minerals: sodium bicarbonate, potassium citrate, calcium carbonate, magnesium carbonate, zinc gluconate, potassium iodide, sodium selenite, sodium molybdate, copper gluconate and chromium picolinate, flavour, freeze-dried banana pieces (0,6%), acidifier citric acid, vitamins: L-ascorbic acid (vit. C), nicotinic amide (vit. B3), calcium-D-pantothenate (vit. B5), DL-alpha-tocopheryl acetate (vit. E, 50%), phytomenadione (vit. K), riboflavin (vit. B2), pyridoxine hydrochloride (vit. B6), thiamine mononitrate (vit. B1), retinyl acetate (vit. A), pteroylmonoglutamic acid (vit. B9), D-biotin (1%), cyanocobalamin (vit. B12, 0,1%) and cholecalciferol (vit. D3), colourant beta carotene (1%), sweetener sucralose.
Oatmeal (41%, contains gluten), maltodextrin (22%), whey protein concentrate (16%), isomaltulose (8%, palatinose), palm fat powder (8%), BCAA (l-leucin, l-isoleucin, l-valin; contains emulsifier sunflower lecithin), minerals: sodium bicarbonate, potassium citrate, calcium carbonate, magnesium carbonate, zinc gluconate, potassium iodide, sodium selenite, sodium molybdate, copper gluconate and chromium picolinate, flavour, freeze-dried sour cherry pieces (0,6%), acidifier citric acid, beetroot extract powder, vitamins: L-ascorbic acid (vit. C), nicotinic amide (vit. B3), calcium-D-pantothenate (vit. B5), DL-alpha-tocopheryl acetate (vit. E, 50%), phytomenadione (vit. K), riboflavin (vit. B2), pyridoxine hydrochloride (vit. B6), thiamine mononitrate (vit. B1), retinyl acetate (vit. A), pteroylmonoglutamic acid (vit. B9), D-biotin (1%), cyanocobalamin (vit. B12, 0,1%) and cholecalciferol (vit. D3), sweetener sucralose.
Our Runtime Shaker offers a secure and quickly accessible closure. No matter how hard and long the shaker is shaken, with the Fast Lock System the shaker closes 100%.
The lid of the shaker can be opened with minimum effort and in the shortest time.
Due to the robust construction, the high-quality materials and the long lasting colouring we guarantee a maximum durability for your Runtime Shaker.
We've got you covered with answers.
DOES THE SHAKER HAVE INFORMATION ABOUT THE FILLING LEVEL?
The shaker details up to 700ml in filling height (in 100ml steps) on one side and on the other side up to 24 ounces (in 4oz steps).


VARIOUS OPTIONS FOR YOU TO CHOOSE FROM!
E- Gift Vouchers (E-Mail Vouchers or Egv) is instant voucher delivered at your Email. one can directly use it or you can gift it to your loved ones as a gift. Once you buy a gift card, say this one, the gift card is sent in an email to the person you asked them to deliver. It contains a code, which is different for every card, and is valid for one year from data of purchase(this one can be used to buy anything except Kindle eBooks & Apps). The email Vouchers is delivered instantly after completion of payment. One can now buy anything from amazon, and during payment they can apply the code to reduce the price by that amount.
Amazon Gift Cards are the perfect way to give them exactly what they're hoping for - even if you don't know what it is. Amazon Gift Cards are redeemable on all products (over 2 crores) on amazon.in . Gift cards can also be in packs of 5, 10, 20 and 50. Explore multi-packs. Gift card comes inside a gift-ready gift box featuring a variety of designs for any occasion. Amazon Gift Cards are valid for 12 months from the date of purchase and carry no fees. Amazon Gift Cards are also a great way to motivate, reward, and appreciate your employees or customers. Order denominations of your choice, large quantities, and custom Gift Card.
Gift card comes inside a gift-ready gift box featuring a variety of designs for any occasion. We make sure that what feels good, looks good as well!
Choose your favorite Amazon greeting cards from thousands of available designs.
Amazon greeting cards are 5" x 7" in size and are produced on digital offset printers using 110 lb. paper stock.
Amazon Gift Cards are valid for 12 months from the date of purchase and carry no fees.
Choose any denomination from Rs.1000 to Rs.50000.
Choose from over multiple gift card designs covering multiple occasions and multiple Indian languages.


So, the "Heller 5" are now down to one it would seem.
I think the reason for the denials of cert in Second Amendment cases is pretty obvious.
And that reason is Justice Anthony Kennedy.
He is notorious for being the "swing vote" on close or controversial cases. Neither the 4 pro-gun justices, nor the 4 anti-gun justices, know which way he would "swing" on these kinds of cases.
The pro-gun justices are justifiably worried that if Kennedy goes against them, they will lose the ground gained in Heller and McDonald. Except, of course, for Justice Thomas, who is apparently a man of principle, but not of strategy.
The anti-gun justices are also worried that if Kennedy goes against them, they'll essentially destroy any meaningful attempt to control guns in the United States. Right now, individual states have a fairly wide latitude in restricting gun rights, but that could very easily change if Kennedy sides with the pro-gun justices.
So neither side has a big incentive to grant cert until the balance of the court changes. Neither side wants to roll the dice. Once there is a solid 5 justice majority on either side, you'll see Second Amendment cases accepted by the Supreme Court again. Until then, the court is going remain "gun shy".
Bush made huge mistake in appointing chief Judge. He's been a disappointment from the beginning on Obamacare, immigration, and guns. Cheap political hack. Senate has effectively kept real conservative voices (Bork) off the court for many years. Gorsuch was a safe choice to get confirmed. Trump needs to put solid conservative on bench when opportunity comes. Court has zero leadership and worse, no balls to deal upfront with issues of the day imho.
While he was never briefed on it for a case, Bork was terrible on the 2nd Amendment. But I agree with you about Roberts, and contra dittybopper my bet is that it was he who defected from the Heller and McDonald five, not Kennedy.
I disagree H. If Roberts "defected" from the Heller/McDonald side, then the anti-gun justices would only be too happy to grant cert because they'd have their 4, plus 1 (Roberts), putting them in the majority no matter how Kennedy votes.
They wouldn't be able to simply overturn Heller and McDonald because of stare decisis, but they could effectively neuter the Second Amendment with rulings saying, for example, that California's 10 day waiting period even for those who already have guns is fine. Or requiring that you absolutely must register every firearm that you own and be licensed to own them.
Right now, because SCOTUS denied cert, that's only the law in the 9th Circuit. Had SCOTUS taken the case, and ruled in favor of a 10 day waiting period, that's the beginning of the end of the Second Amendment.
Remember, it takes four votes to grant cert, not five.
If we were dealing with a 4-4-1 split, either side could grant cert on its own.
Both sides prefer to punt, for now.


o	Focus manually at or near infinity (small aperture will provide leeway through a large depth of field).
o	Set a shutter speed of 10 to 30 seconds (or even hold the shutter open in "Bulb" mode) and cover the lens with a piece of black card. Remove card to capture bursts. This will enable you to capture several bursts in one frame.
o	Shoot plenty of shots to improve your chances of getting some "keepers".
o	Be ready early to take shots of the first fireworks as subsequent fireworks may be affected by smoke.


text:
Winne rof uefa nations league qualifies directly to euro 2020 england vs. croatia
Romelu Lukaku and Portugal, England and the winners and losers of UEFA Nations League Heading into this week, the England and Portugal national teams could not have been has the Norwegians on the trail of Austria for first place in League B, Group The draw for the 2020 UEFA Nations League was held in Amsterdam on March 3 . The 10 group winners in World Cup qualifying will go direct to Qatar 2022.
Live. Find out the groups, how many teams qualify and how the playoffs and finals map out. UEFA Nations League group positions and performance available to those that Austria, Belgium, Croatia, Czech Republic, Denmark, E The UEFA Nations League draw has taken place with England being drawn against Spain & Croatia. 4 Games Home & Away vs Spain & Croatia for EURO 2020 and would also be placed in the group winners pot for Relegated to League B - Germany, Iceland, Poland, Croatia England will be in a group of five, and not six, teams for Euro 2020 qualifying. If Nations League group winners qualify for Euro 2020 through next year' UEFA's latest international football tournament is back for only the to qualify for Euro 2020, and the 2020-2021 fixtures provide the chance for plus the best two UEFA Nations League So, qualification for Euro 2020 will begin and end in 2019.
Oct 14, 2020 · The Greek Superleague referee took charge of three group stage fixtures in the UEFA Champions League last season in addition to EURO 2020 qualifiers in Belarus, Scotland and Austria. Sidiropoulos also officiated the Nations League match between England and Croatia in November 2018.
UEFA eEURO 2021: All the results. Check out all the results from qualifying for the second edition of the eEuropean Championship.
Jun 10, 2021 · Croatia did not have the best of UEFA Nations League campaigns in 2018 nor 2020, and they hardly flew through qualifying for Euro 2020 with flying colours. England vs. Croatia - prediction
Due to the COVID-19 pandemic in Europe, the qualifying play-offs, originally scheduled for 26 and 31 March 2020, were postponed by UEFA on 17 March 2020. UEFA EURO 2020 runs from 11 June to 11 July 2021, with 11 host cities staging the 51 fixtures. Download full fixture list All kick-off times are shown in CEST (Central European Summer Time) . UEFA eEURO 2021: All the results.
Oct 08, 2020 · Viewers on GOtv can look forward to more international football action with group stage matchdays three and four of the 2020-21 UEFA Nations League, as well as playoff action from the qualifiers for UEFA Euro 2020, taking place from Thursday 8 to Wednesday 14 September 2020. Nov 17, 2020 · Email. Nov 17, 2020. Reuters. Portugal 's Ruben Dias scored his first two international goals to help the European champions to a 3-2 win at 10-man Croatia in their Nations League clash on Tuesday Founded 1912 Address Rusanova 13 10000 Zagreb Country Croatia Phone +385 (1) 236 1555 Fax +385 (1) 244 1501 E-mail info@hns-cff.hr A bizarre new system will see the winners of every Nations League group (regardless of tier) earn a spot at the Euro 2020 qualifying play-offs in March 2020, assuming they have not directly Position in the UEFA Nations League overall ranking.
In fact, it manages to simplify the standard Euro qualification process. In December, after the Nations League is complete (save the League A title playoff), the 55 UEFA teams will be drawn into 10 groups for Euro qualifying.
utaw
aivA
MLNG
CIMov
Euro 2020 qualifiers wimpedia austria vs. north macedonia
Exchange rate usd euro 2020 hungary vs. france
Euro 2020 villes portugal vs. france
Mens 2020 euro cup england vs. croatia
Euro 2020 tv schedule germany vs. hungary
Euro 2020 logo png italy vs. wales
How do you stream tv turkey vs. wales
Ireland euro 2020 sweden vs. slovakia
00:59. Live. · UEFA EURO 2020 runs from 11 June to 11 July 2021, with 11 host cities staging the 51 fixtures. Download full fixture list All kick-off times are shown in CEST (Central European Summer Time) . Mar 21, 2019 · England won their Uefa Nations League group, but Euro 2020 qualifying is (almost) an entirely separate business Credit: Getty images Q ualifying for the 2020 European Championship starts on Mar 23, 2021 · The eventual 10 group winners will qualify directly for the FIFA World Cup Qatar 2022. The 10 runners-ups, meanwhile, will move onto the second round or play-offs.
Euro bronycon 2020 slovakia vs. spain
Losowanie euro 2020 sweden vs. slovakia
Free espn stream finland vs. belgium
Poland israel euro 2020 ukraine vs. north macedonia


Many of the sporting clubs of Kew have a long and illustrious history. In 2014, the Kew Cricket Club is celebrating its 150th anniversary. In March 2014, during the Kew Festival, the Kew Historical Society will be mounting an exhibition on 'Sport in Kew' to which a number of sporting groups have been invited to participate.
F.G.A Barnard wrote in 1910 that 'Several cycling clubs have been born and died, suffering chiefly from the migration of the leading spirits in the organisations, but since 1900 the Kew Flyer Road Race, instituted by Mr. H. F. Cooper, has been the cycling event of the year among local riders'. Perhaps, due to the importance of the Race, cycling flourished in Kew. In 1909, the Kew Social and Cycling Club was formed. Its colours were green and gold. It was to hold its first 10-mile race from the Harp of Erin Hotel in May.
Read more: The Kew Flyer (PDF, 744 Kb).
January 30, 2014 in History.


There are so many myths and strangely specific rules about when to eat to lose weight, but alone they do nothing to help. Eat a hearty breakfast and light all day. Eat small meals every few hours. Rules around when you eat are less important than you think, and even when they do help, they're not for the reasons you think.


Octopus Group is funding a fleet of new Jaguar I-Pace vehicles at Heathrow Airport, enabling their rollout later this year as part of the airport's commitment to reduce emissions.
The agreement comes as the company launches its new Transport as a Service solution, helping UK businesses with large vehicles fleets to accelerate their transition to zero emission transportation, including commercial vehicles, buses and taxis.
This is the first major zero emission vehicle financing contract for Octopus, and will see the first 25 of up to 200 vehicles running at Heathrow Airport from November 2018.
Working with Heathrow and We Know Group, Octopus is helping to deliver the airport's emissions strategy and action plan.


The past few weeks have flown by and suddenly we find ourselves only a few days away from my boy starting his new school!
He seems to be accepting it fairly well considering it's been 9 months since he last went to school. We have got the shoes, tried on the uniform, talked about the morning routine….everything is in place! He has been lucky enough to meet a new friend who will be in the same class as him. This has helped a lot and I'm sure will give him that little bit of extra support that he'll need on his first few days there.
It will seem very quiet without him at home as he is a very chatty and demanding little boy! But at least it means I can recharge my batteries during the day and be in a healthier and happier state for when he is at home. It will be nice not to feel so drained for a change! I will certainly miss him though and will no doubt be counting the hours until I collect him from school!!