text:
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "quiche/quic/core/quic_crypto_stream.h"

#include <cstdint>
#include <memory>
#include <string>
#include <utility>
#include <vector>

#include "quiche/quic/core/crypto/crypto_handshake.h"
#include "quiche/quic/core/crypto/crypto_protocol.h"
#include "quiche/quic/core/crypto/null_encrypter.h"
#include "quiche/quic/core/quic_error_codes.h"
#include "quiche/quic/core/quic_types.h"
#include "quiche/quic/core/quic_utils.h"
#include "quiche/quic/platform/api/quic_expect_bug.h"
#include "quiche/quic/platform/api/quic_flags.h"
#include "quiche/quic/platform/api/quic_socket_address.h"
#include "quiche/quic/platform/api/quic_test.h"
#include "quiche/quic/test_tools/crypto_test_utils.h"
#include "quiche/quic/test_tools/quic_connection_peer.h"
#include "quiche/quic/test_tools/quic_stream_peer.h"
#include "quiche/quic/test_tools/quic_test_utils.h"

using testing::_;
using testing::InSequence;
using testing::Invoke;
using testing::InvokeWithoutArgs;
using testing::Return;

namespace quic {
namespace test {
namespace {

class MockQuicCryptoStream : public QuicCryptoStream,
                             public QuicCryptoHandshaker {
 public:
  explicit MockQuicCryptoStream(QuicSession* session)
      : QuicCryptoStream(session),
        QuicCryptoHandshaker(this, session),
        params_(new QuicCryptoNegotiatedParameters) {}
  MockQuicCryptoStream(const MockQuicCryptoStream&) = delete;
  MockQuicCryptoStream& operator=(const MockQuicCryptoStream&) = delete;

  void OnHandshakeMessage(const CryptoHandshakeMessage& message) override {
    messages_.push_back(message);
  }

  std::vector<CryptoHandshakeMessage>* messages() { return &messages_; }

  ssl_early_data_reason_t EarlyDataReason() const override {
    return ssl_early_data_unknown;
  }
  bool encryption_established() const override { return false; }
  bool one_rtt_keys_available() const override { return false; }

  const QuicCryptoNegotiatedParameters& crypto_negotiated_params()
      const override {
    return *params_;
  }
  CryptoMessageParser* crypto_message_parser() override {
    return QuicCryptoHandshaker::crypto_message_parser();
  }
  void OnPacketDecrypted(EncryptionLevel /*level*/) override {}
  void OnOneRttPacketAcknowledged() override {}
  void OnHandshakePacketSent() override {}
  void OnHandshakeDoneReceived() override {}
  void OnNewTokenReceived(absl::string_view /*token*/) override {}
  std::string GetAddressToken(
      const CachedNetworkParameters* /*cached_network_parameters*/)
      const override {
    return "";
  }
  bool ValidateAddressToken(absl::string_view /*token*/) const override {
    return true;
  }
  const CachedNetworkParameters* PreviousCachedNetworkParams() const override {
    return nullptr;
  }
  void SetPreviousCachedNetworkParams(
      CachedNetworkParameters /*cached_network_params*/) override {}
  HandshakeState GetHandshakeState() const override { return HANDSHAKE_START; }
  void SetServerApplicationStateForResumption(
      std::unique_ptr<ApplicationState> /*application_state*/) override {}
  std::unique_ptr<QuicDecrypter> AdvanceKeysAndCreateCurrentOneRttDecrypter()
      override {
    return nullptr;
  }
  std::unique_ptr<QuicEncrypter> CreateCurrentOneRttEncrypter() override {
    return nullptr;
  }
  bool ExportKeyingMaterial(absl::string_view /*label*/,
                            absl::string_view /*context*/,
                            size_t /*result_len*/,
                            std::string* /*result*/) override {
    return false;
  }
  SSL* GetSsl() const override { return nullptr; }

  bool IsCryptoFrameExpectedForEncryptionLevel(
      EncryptionLevel level) const override {
    return level != ENCRYPTION_ZERO_RTT;
  }

  EncryptionLevel GetEncryptionLevelToSendCryptoDataOfSpace(
      PacketNumberSpace space) const override {
    switch (space) {
      case INITIAL_DATA:
        return ENCRYPTION_INITIAL;
      case HANDSHAKE_DATA:
        return ENCRYPTION_HANDSHAKE;
      case APPLICATION_DATA:
        return QuicCryptoStream::session()
            ->GetEncryptionLevelToSendApplicationData();
      default:
        QUICHE_DCHECK(false);
        return NUM_ENCRYPTION_LEVELS;
    }
  }

 private:
  quiche::QuicheReferenceCountedPointer<QuicCryptoNegotiatedParameters> params_;
  std::vector<CryptoHandshakeMessage> messages_;
};

class QuicCryptoStreamTest : public QuicTest {
 public:
  QuicCryptoStreamTest()
      : connection_(new MockQuicConnection(&helper_, &alarm_factory_,
                                           Perspective::IS_CLIENT)),
        session_(connection_, /*create_mock_crypto_stream=*/false) {
    EXPECT_CALL(*static_cast<MockPacketWriter*>(connection_->writer()),
                WritePacket(_, _, _, _, _))
        .WillRepeatedly(Return(WriteResult(WRITE_STATUS_OK, 0)));
    stream_ = new MockQuicCryptoStream(&session_);
    session_.SetCryptoStream(stream_);
    session_.Initialize();
    message_.set_tag(kSHLO);
    message_.SetStringPiece(1, "abc");
    message_.SetStringPiece(2, "def");
    ConstructHandshakeMessage();
  }
  QuicCryptoStreamTest(const QuicCryptoStreamTest&) = delete;
  QuicCryptoStreamTest& operator=(const QuicCryptoStreamTest&) = delete;

  void ConstructHandshakeMessage() {
    CryptoFramer framer;
    message_data_ = framer.ConstructHandshakeMessage(message_);
  }

 protected:
  MockQuicConnectionHelper helper_;
  MockAlarmFactory alarm_factory_;
  MockQuicConnection* connection_;
  MockQuicSpdySession session_;
  MockQuicCryptoStream* stream_;
  CryptoHandshakeMessage message_;
  std::unique_ptr<QuicData> message_data_;
};

TEST_F(QuicCryptoStreamTest, NotInitiallyConected) {
  EXPECT_FALSE(stream_->encryption_established());
  EXPECT_FALSE(stream_->one_rtt_keys_available());
}

TEST_F(QuicCryptoStreamTest, ProcessRawData) {
  if (!QuicVersionUsesCryptoFrames(connection_->transport_version())) {
    stream_->OnStreamFrame(QuicStreamFrame(
        QuicUtils::GetCryptoStreamId(connection_->transport_version()),
        /*fin=*/false,
        /*offset=*/0, message_data_->AsStringPiece()));
  } else {
    stream_->OnCryptoFrame(QuicCryptoFrame(ENCRYPTION_INITIAL, /*offset*/ 0,
                                           message_data_->AsStringPiece()));
  }
  ASSERT_EQ(1u, stream_->messages()->size());
  const CryptoHandshakeMessage& message = (*stream_->messages())[0];
  EXPECT_EQ(kSHLO, message.tag());
  EXPECT_EQ(2u, message.tag_value_map().size());
  EXPECT_EQ("abc", crypto_test_utils::GetValueForTag(message, 1));
  EXPECT_EQ("def", crypto_test_utils::GetValueForTag(message, 2));
}

TEST_F(QuicCryptoStreamTest, ProcessBadData) {
  std::string bad(message_data_->data(), message_data_->length());
  const int kFirstTagIndex = sizeof(uint32_t) +  // message tag
                             sizeof(uint16_t) +  // number of tag-value pairs
                             sizeof(uint16_t);   // padding
  EXPECT_EQ(1, bad[kFirstTagIndex]);
  bad[kFirstTagIndex] = 0x7F;  // out of order tag

  EXPECT_CALL(*connection_, CloseConnection(QUIC_CRYPTO_TAGS_OUT_OF_ORDER,
                                            testing::_, testing::_));
  if (!QuicVersionUsesCryptoFrames(connection_->transport_version())) {
    stream_->OnStreamFrame(QuicStreamFrame(
        QuicUtils::GetCryptoStreamId(connection_->transport_version()),
        /*fin=*/false, /*offset=*/0, bad));
  } else {
    stream_->OnCryptoFrame(
        QuicCryptoFrame(ENCRYPTION_INITIAL, /*offset*/ 0, bad));
  }
}

TEST_F(QuicCryptoStreamTest, NoConnectionLevelFlowControl) {
  EXPECT_FALSE(
      QuicStreamPeer::StreamContributesToConnectionFlowControl(stream_));
}

TEST_F(QuicCryptoStreamTest, RetransmitCryptoData) {
  if (QuicVersionUsesCryptoFrames(connection_->transport_version())) {
    return;
  }
  InSequence s;
  // Send [0, 1350) in ENCRYPTION_INITIAL.
  EXPECT_EQ(ENCRYPTION_INITIAL, connection_->encryption_level());
  std::string data(1350, 'a');
  EXPECT_CALL(
      session_,
      WritevData(QuicUtils::GetCryptoStreamId(connection_->transport_version()),
                 1350, 0, _, _, _))
      .WillOnce(Invoke(&session_, &MockQuicSpdySession::ConsumeData));
  stream_->WriteOrBufferData(data, false, nullptr);
  // Send [1350, 2700) in ENCRYPTION_ZERO_RTT.
  connection_->SetDefaultEncryptionLevel(ENCRYPTION_ZERO_RTT);
  EXPECT_EQ(ENCRYPTION_ZERO_RTT, connection_->encryption_level());
  EXPECT_CALL(
      session_,
      WritevData(QuicUtils::GetCryptoStreamId(connection_->transport_version()),
                 1350, 1350, _, _, _))
      .WillOnce(Invoke(&session_, &MockQuicSpdySession::ConsumeData));
  stream_->WriteOrBufferData(data, false, nullptr);
  connection_->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
  EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, connection_->encryption_level());

  // Lost [0, 1000).
  stream_->OnStreamFrameLost(0, 1000, false);
  EXPECT_TRUE(stream_->HasPendingRetransmission());
  // Lost [1200, 2000).
  stream_->OnStreamFrameLost(1200, 800, false);
  EXPECT_CALL(
      session_,
      WritevData(QuicUtils::GetCryptoStreamId(connection_->transport_version()),
                 1000, 0, _, _, _))
      .WillOnce(Invoke(&session_, &MockQuicSpdySession::ConsumeData));
  // Verify [1200, 2000) are sent in [1200, 1350) and [1350, 2000) because of
  // they are in different encryption levels.
  EXPECT_CALL(
      session_,
      WritevData(QuicUtils::GetCryptoStreamId(connection_->transport_version()),
                 150, 1200, _, _, _))
      .WillOnce(Invoke(&session_, &MockQuicSpdySession::ConsumeData));
  EXPECT_CALL(
      session_,
      WritevData(QuicUtils::GetCryptoStreamId(connection_->transport_version()),
                 650, 1350, _, _, _))
      .WillOnce(Invoke(&session_, &MockQuicSpdySession::ConsumeData));
  stream_->OnCanWrite();
  EXPECT_FALSE(stream_->HasPendingRetransmission());
  // Verify connection's encryption level has restored.
  EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, connection_->encryption_level());
}

TEST_F(QuicCryptoStreamTest, RetransmitCryptoDataInCryptoFrames) {
  if (!QuicVersionUsesCryptoFrames(connection_->transport_version())) {
    return;
  }
  EXPECT_CALL(*connection_, SendCryptoData(_, _, _)).Times(0);
  InSequence s;
  // Send [0, 1350) in ENCRYPTION_INITIAL.
  EXPECT_EQ(ENCRYPTION_INITIAL, connection_->encryption_level());
  std::string data(1350, 'a');
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_INITIAL, 1350, 0))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  stream_->WriteCryptoData(ENCRYPTION_INITIAL, data);
  // Send [1350, 2700) in ENCRYPTION_ZERO_RTT.
  std::unique_ptr<NullEncrypter> encrypter =
      std::make_unique<NullEncrypter>(Perspective::IS_CLIENT);
  connection_->SetEncrypter(ENCRYPTION_ZERO_RTT, std::move(encrypter));
  connection_->SetDefaultEncryptionLevel(ENCRYPTION_ZERO_RTT);
  EXPECT_EQ(ENCRYPTION_ZERO_RTT, connection_->encryption_level());
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_ZERO_RTT, 1350, 0))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  stream_->WriteCryptoData(ENCRYPTION_ZERO_RTT, data);

  // Before encryption moves to ENCRYPTION_FORWARD_SECURE, ZERO RTT data are
  // retranmitted at ENCRYPTION_ZERO_RTT.
  QuicCryptoFrame lost_frame = QuicCryptoFrame(ENCRYPTION_ZERO_RTT, 0, 650);
  stream_->OnCryptoFrameLost(&lost_frame);

  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_ZERO_RTT, 650, 0))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  stream_->WritePendingCryptoRetransmission();

  connection_->SetEncrypter(
      ENCRYPTION_FORWARD_SECURE,
      std::make_unique<NullEncrypter>(Perspective::IS_CLIENT));
  connection_->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
  EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, connection_->encryption_level());

  // Lost [0, 1000).
  lost_frame = QuicCryptoFrame(ENCRYPTION_INITIAL, 0, 1000);
  stream_->OnCryptoFrameLost(&lost_frame);
  EXPECT_TRUE(stream_->HasPendingCryptoRetransmission());
  // Lost [1200, 2000).
  lost_frame = QuicCryptoFrame(ENCRYPTION_INITIAL, 1200, 150);
  stream_->OnCryptoFrameLost(&lost_frame);
  lost_frame = QuicCryptoFrame(ENCRYPTION_ZERO_RTT, 0, 650);
  stream_->OnCryptoFrameLost(&lost_frame);
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_INITIAL, 1000, 0))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  // Verify [1200, 2000) are sent in [1200, 1350) and [1350, 2000) because of
  // they are in different encryption levels.
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_INITIAL, 150, 1200))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_FORWARD_SECURE, 650, 0))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  stream_->WritePendingCryptoRetransmission();
  EXPECT_FALSE(stream_->HasPendingCryptoRetransmission());
  // Verify connection's encryption level has restored.
  EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, connection_->encryption_level());
}

// Regression test for handling the missing ENCRYPTION_HANDSHAKE in
// quic_crypto_stream.cc. This test is essentially the same as
// RetransmitCryptoDataInCryptoFrames, except it uses ENCRYPTION_HANDSHAKE in
// place of ENCRYPTION_ZERO_RTT.
TEST_F(QuicCryptoStreamTest, RetransmitEncryptionHandshakeLevelCryptoFrames) {
  if (!QuicVersionUsesCryptoFrames(connection_->transport_version())) {
    return;
  }
  EXPECT_CALL(*connection_, SendCryptoData(_, _, _)).Times(0);
  InSequence s;
  // Send [0, 1000) in ENCRYPTION_INITIAL.
  EXPECT_EQ(ENCRYPTION_INITIAL, connection_->encryption_level());
  std::string data(1000, 'a');
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_INITIAL, 1000, 0))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  stream_->WriteCryptoData(ENCRYPTION_INITIAL, data);
  // Send [1000, 2000) in ENCRYPTION_HANDSHAKE.
  std::unique_ptr<NullEncrypter> encrypter =
      std::make_unique<NullEncrypter>(Perspective::IS_CLIENT);
  connection_->SetEncrypter(ENCRYPTION_HANDSHAKE, std::move(encrypter));
  connection_->SetDefaultEncryptionLevel(ENCRYPTION_HANDSHAKE);
  EXPECT_EQ(ENCRYPTION_HANDSHAKE, connection_->encryption_level());
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_HANDSHAKE, 1000, 0))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  stream_->WriteCryptoData(ENCRYPTION_HANDSHAKE, data);
  connection_->SetEncrypter(
      ENCRYPTION_FORWARD_SECURE,
      std::make_unique<NullEncrypter>(Perspective::IS_CLIENT));
  connection_->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
  EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, connection_->encryption_level());

  // Lost [1000, 1200).
  QuicCryptoFrame lost_frame(ENCRYPTION_HANDSHAKE, 0, 200);
  stream_->OnCryptoFrameLost(&lost_frame);
  EXPECT_TRUE(stream_->HasPendingCryptoRetransmission());
  // Verify [1000, 1200) is sent.
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_HANDSHAKE, 200, 0))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  stream_->WritePendingCryptoRetransmission();
  EXPECT_FALSE(stream_->HasPendingCryptoRetransmission());
}

TEST_F(QuicCryptoStreamTest, NeuterUnencryptedStreamData) {
  if (QuicVersionUsesCryptoFrames(connection_->transport_version())) {
    return;
  }
  // Send [0, 1350) in ENCRYPTION_INITIAL.
  EXPECT_EQ(ENCRYPTION_INITIAL, connection_->encryption_level());
  std::string data(1350, 'a');
  EXPECT_CALL(
      session_,
      WritevData(QuicUtils::GetCryptoStreamId(connection_->transport_version()),
                 1350, 0, _, _, _))
      .WillOnce(Invoke(&session_, &MockQuicSpdySession::ConsumeData));
  stream_->WriteOrBufferData(data, false, nullptr);
  // Send [1350, 2700) in ENCRYPTION_ZERO_RTT.
  connection_->SetDefaultEncryptionLevel(ENCRYPTION_ZERO_RTT);
  EXPECT_EQ(ENCRYPTION_ZERO_RTT, connection_->encryption_level());
  EXPECT_CALL(
      session_,
      WritevData(QuicUtils::GetCryptoStreamId(connection_->transport_version()),
                 1350, 1350, _, _, _))
      .WillOnce(Invoke(&session_, &MockQuicSpdySession::ConsumeData));
  stream_->WriteOrBufferData(data, false, nullptr);

  // Lost [0, 1350).
  stream_->OnStreamFrameLost(0, 1350, false);
  EXPECT_TRUE(stream_->HasPendingRetransmission());
  // Neuters [0, 1350).
  stream_->NeuterUnencryptedStreamData();
  EXPECT_FALSE(stream_->HasPendingRetransmission());
  // Lost [0, 1350) again.
  stream_->OnStreamFrameLost(0, 1350, false);
  EXPECT_FALSE(stream_->HasPendingRetransmission());

  // Lost [1350, 2000).
  stream_->OnStreamFrameLost(1350, 650, false);
  EXPECT_TRUE(stream_->HasPendingRetransmission());
  stream_->NeuterUnencryptedStreamData();
  EXPECT_TRUE(stream_->HasPendingRetransmission());
}

TEST_F(QuicCryptoStreamTest, NeuterUnencryptedCryptoData) {
  if (!QuicVersionUsesCryptoFrames(connection_->transport_version())) {
    return;
  }
  // Send [0, 1350) in ENCRYPTION_INITIAL.
  EXPECT_EQ(ENCRYPTION_INITIAL, connection_->encryption_level());
  std::string data(1350, 'a');
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_INITIAL, 1350, 0))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  stream_->WriteCryptoData(ENCRYPTION_INITIAL, data);
  // Send [1350, 2700) in ENCRYPTION_ZERO_RTT.
  connection_->SetEncrypter(
      ENCRYPTION_ZERO_RTT,
      std::make_unique<NullEncrypter>(Perspective::IS_CLIENT));
  connection_->SetDefaultEncryptionLevel(ENCRYPTION_ZERO_RTT);
  std::unique_ptr<NullEncrypter> encrypter =
      std::make_unique<NullEncrypter>(Perspective::IS_CLIENT);
  connection_->SetEncrypter(ENCRYPTION_ZERO_RTT, std::move(encrypter));
  EXPECT_EQ(ENCRYPTION_ZERO_RTT, connection_->encryption_level());
  EXPECT_CALL(*connection_, SendCryptoData(_, _, _)).Times(0);
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_ZERO_RTT, 1350, 0))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  stream_->WriteCryptoData(ENCRYPTION_ZERO_RTT, data);

  // Lost [0, 1350).
  QuicCryptoFrame lost_frame(ENCRYPTION_INITIAL, 0, 1350);
  stream_->OnCryptoFrameLost(&lost_frame);
  EXPECT_TRUE(stream_->HasPendingCryptoRetransmission());
  // Neuters [0, 1350).
  stream_->NeuterUnencryptedStreamData();
  EXPECT_FALSE(stream_->HasPendingCryptoRetransmission());
  // Lost [0, 1350) again.
  stream_->OnCryptoFrameLost(&lost_frame);
  EXPECT_FALSE(stream_->HasPendingCryptoRetransmission());

  // Lost [1350, 2000), which starts at offset 0 at the ENCRYPTION_ZERO_RTT
  // level.
  lost_frame = QuicCryptoFrame(ENCRYPTION_ZERO_RTT, 0, 650);
  stream_->OnCryptoFrameLost(&lost_frame);
  EXPECT_TRUE(stream_->HasPendingCryptoRetransmission());
  stream_->NeuterUnencryptedStreamData();
  EXPECT_TRUE(stream_->HasPendingCryptoRetransmission());
}

TEST_F(QuicCryptoStreamTest, RetransmitStreamData) {
  if (QuicVersionUsesCryptoFrames(connection_->transport_version())) {
    return;
  }
  InSequence s;
  // Send [0, 1350) in ENCRYPTION_INITIAL.
  EXPECT_EQ(ENCRYPTION_INITIAL, connection_->encryption_level());
  std::string data(1350, 'a');
  EXPECT_CALL(
      session_,
      WritevData(QuicUtils::GetCryptoStreamId(connection_->transport_version()),
                 1350, 0, _, _, _))
      .WillOnce(Invoke(&session_, &MockQuicSpdySession::ConsumeData));
  stream_->WriteOrBufferData(data, false, nullptr);
  // Send [1350, 2700) in ENCRYPTION_ZERO_RTT.
  connection_->SetDefaultEncryptionLevel(ENCRYPTION_ZERO_RTT);
  EXPECT_EQ(ENCRYPTION_ZERO_RTT, connection_->encryption_level());
  EXPECT_CALL(
      session_,
      WritevData(QuicUtils::GetCryptoStreamId(connection_->transport_version()),
                 1350, 1350, _, _, _))
      .WillOnce(Invoke(&session_, &MockQuicSpdySession::ConsumeData));
  stream_->WriteOrBufferData(data, false, nullptr);
  connection_->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
  EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, connection_->encryption_level());

  // Ack [2000, 2500).
  QuicByteCount newly_acked_length = 0;
  stream_->OnStreamFrameAcked(2000, 500, false, QuicTime::Delta::Zero(),
                              QuicTime::Zero(), &newly_acked_length);
  EXPECT_EQ(500u, newly_acked_length);

  // Force crypto stream to send [1350, 2700) and only [1350, 1500) is consumed.
  EXPECT_CALL(
      session_,
      WritevData(QuicUtils::GetCryptoStreamId(connection_->transport_version()),
                 650, 1350, _, _, _))
      .WillOnce(InvokeWithoutArgs([this]() {
        return session_.ConsumeData(
            QuicUtils::GetCryptoStreamId(connection_->transport_version()), 150,
            1350, NO_FIN, HANDSHAKE_RETRANSMISSION, absl::nullopt);
      }));

  EXPECT_FALSE(stream_->RetransmitStreamData(1350, 1350, false,
                                             HANDSHAKE_RETRANSMISSION));
  // Verify connection's encryption level has restored.
  EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, connection_->encryption_level());

  // Force session to send [1350, 1500) again and all data is consumed.
  EXPECT_CALL(
      session_,
      WritevData(QuicUtils::GetCryptoStreamId(connection_->transport_version()),
                 650, 1350, _, _, _))
      .WillOnce(Invoke(&session_, &MockQuicSpdySession::ConsumeData));
  EXPECT_CALL(
      session_,
      WritevData(QuicUtils::GetCryptoStreamId(connection_->transport_version()),
                 200, 2500, _, _, _))
      .WillOnce(Invoke(&session_, &MockQuicSpdySession::ConsumeData));
  EXPECT_TRUE(stream_->RetransmitStreamData(1350, 1350, false,
                                            HANDSHAKE_RETRANSMISSION));
  // Verify connection's encryption level has restored.
  EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, connection_->encryption_level());

  EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(0);
  // Force to send an empty frame.
  EXPECT_TRUE(
      stream_->RetransmitStreamData(0, 0, false, HANDSHAKE_RETRANSMISSION));
}

TEST_F(QuicCryptoStreamTest, RetransmitStreamDataWithCryptoFrames) {
  if (!QuicVersionUsesCryptoFrames(connection_->transport_version())) {
    return;
  }
  InSequence s;
  // Send [0, 1350) in ENCRYPTION_INITIAL.
  EXPECT_EQ(ENCRYPTION_INITIAL, connection_->encryption_level());
  std::string data(1350, 'a');
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_INITIAL, 1350, 0))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  stream_->WriteCryptoData(ENCRYPTION_INITIAL, data);
  // Send [1350, 2700) in ENCRYPTION_ZERO_RTT.
  std::unique_ptr<NullEncrypter> encrypter =
      std::make_unique<NullEncrypter>(Perspective::IS_CLIENT);
  connection_->SetEncrypter(ENCRYPTION_ZERO_RTT, std::move(encrypter));
  connection_->SetDefaultEncryptionLevel(ENCRYPTION_ZERO_RTT);
  EXPECT_EQ(ENCRYPTION_ZERO_RTT, connection_->encryption_level());
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_ZERO_RTT, 1350, 0))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  stream_->WriteCryptoData(ENCRYPTION_ZERO_RTT, data);
  connection_->SetEncrypter(
      ENCRYPTION_FORWARD_SECURE,
      std::make_unique<NullEncrypter>(Perspective::IS_CLIENT));
  connection_->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
  EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, connection_->encryption_level());

  // Ack [2000, 2500).
  QuicCryptoFrame acked_frame(ENCRYPTION_ZERO_RTT, 650, 500);
  EXPECT_TRUE(
      stream_->OnCryptoFrameAcked(acked_frame, QuicTime::Delta::Zero()));

  // Retransmit only [1350, 1500).
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_FORWARD_SECURE, 150, 0))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  QuicCryptoFrame frame_to_retransmit(ENCRYPTION_ZERO_RTT, 0, 150);
  stream_->RetransmitData(&frame_to_retransmit, HANDSHAKE_RETRANSMISSION);

  // Verify connection's encryption level has restored.
  EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, connection_->encryption_level());

  // Retransmit [1350, 2700) again and all data is sent.
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_FORWARD_SECURE, 650, 0))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  EXPECT_CALL(*connection_,
              SendCryptoData(ENCRYPTION_FORWARD_SECURE, 200, 1150))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  frame_to_retransmit = QuicCryptoFrame(ENCRYPTION_ZERO_RTT, 0, 1350);
  stream_->RetransmitData(&frame_to_retransmit, HANDSHAKE_RETRANSMISSION);
  // Verify connection's encryption level has restored.
  EXPECT_EQ(ENCRYPTION_FORWARD_SECURE, connection_->encryption_level());

  EXPECT_CALL(*connection_, SendCryptoData(_, _, _)).Times(0);
  // Force to send an empty frame.
  QuicCryptoFrame empty_frame(ENCRYPTION_FORWARD_SECURE, 0, 0);
  stream_->RetransmitData(&empty_frame, HANDSHAKE_RETRANSMISSION);
}

// Regression test for b/115926584.
TEST_F(QuicCryptoStreamTest, HasUnackedCryptoData) {
  if (QuicVersionUsesCryptoFrames(connection_->transport_version())) {
    return;
  }
  std::string data(1350, 'a');
  EXPECT_CALL(
      session_,
      WritevData(QuicUtils::GetCryptoStreamId(connection_->transport_version()),
                 1350, 0, _, _, _))
      .WillOnce(testing::Return(QuicConsumedData(0, false)));
  stream_->WriteOrBufferData(data, false, nullptr);
  EXPECT_FALSE(stream_->IsWaitingForAcks());
  // Although there is no outstanding data, verify session has pending crypto
  // data.
  EXPECT_TRUE(session_.HasUnackedCryptoData());

  EXPECT_CALL(
      session_,
      WritevData(QuicUtils::GetCryptoStreamId(connection_->transport_version()),
                 1350, 0, _, _, _))
      .WillOnce(Invoke(&session_, &MockQuicSpdySession::ConsumeData));
  stream_->OnCanWrite();
  EXPECT_TRUE(stream_->IsWaitingForAcks());
  EXPECT_TRUE(session_.HasUnackedCryptoData());
}

TEST_F(QuicCryptoStreamTest, HasUnackedCryptoDataWithCryptoFrames) {
  if (!QuicVersionUsesCryptoFrames(connection_->transport_version())) {
    return;
  }
  // Send [0, 1350) in ENCRYPTION_INITIAL.
  EXPECT_EQ(ENCRYPTION_INITIAL, connection_->encryption_level());
  std::string data(1350, 'a');
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_INITIAL, 1350, 0))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  stream_->WriteCryptoData(ENCRYPTION_INITIAL, data);
  EXPECT_TRUE(stream_->IsWaitingForAcks());
  EXPECT_TRUE(session_.HasUnackedCryptoData());
}

// Regression test for bugfix of GetPacketHeaderSize.
TEST_F(QuicCryptoStreamTest, CryptoMessageFramingOverhead) {
  for (const ParsedQuicVersion& version :
       AllSupportedVersionsWithQuicCrypto()) {
    SCOPED_TRACE(version);
    QuicByteCount expected_overhead = 48;
    if (version.HasIetfInvariantHeader()) {
      expected_overhead += 4;
    }
    if (version.HasLongHeaderLengths()) {
      expected_overhead += 3;
    }
    if (version.HasLengthPrefixedConnectionIds()) {
      expected_overhead += 1;
    }
    EXPECT_EQ(expected_overhead,
              QuicCryptoStream::CryptoMessageFramingOverhead(
                  version.transport_version, TestConnectionId()));
  }
}

TEST_F(QuicCryptoStreamTest, WriteCryptoDataExceedsSendBufferLimit) {
  if (!QuicVersionUsesCryptoFrames(connection_->transport_version())) {
    return;
  }
  EXPECT_EQ(ENCRYPTION_INITIAL, connection_->encryption_level());
  int32_t buffer_limit = GetQuicFlag(quic_max_buffered_crypto_bytes);

  // Write data larger than the buffer limit, when there is no existing data in
  // the buffer. Data is sent rather than closing the connection.
  EXPECT_FALSE(stream_->HasBufferedCryptoFrames());
  int32_t over_limit = buffer_limit + 1;
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_INITIAL, over_limit, 0))
      // All the data is sent, no resulting buffer.
      .WillOnce(Return(over_limit));
  std::string large_data(over_limit, 'a');
  stream_->WriteCryptoData(ENCRYPTION_INITIAL, large_data);

  // Write data to the buffer up to the limit. One byte gets sent.
  EXPECT_FALSE(stream_->HasBufferedCryptoFrames());
  EXPECT_CALL(*connection_,
              SendCryptoData(ENCRYPTION_INITIAL, buffer_limit, over_limit))
      .WillOnce(Return(1));
  std::string data(buffer_limit, 'a');
  stream_->WriteCryptoData(ENCRYPTION_INITIAL, data);
  EXPECT_TRUE(stream_->HasBufferedCryptoFrames());

  // Write another byte that is not sent (due to there already being data in the
  // buffer); send buffer is now full.
  EXPECT_CALL(*connection_, SendCryptoData(_, _, _)).Times(0);
  std::string data2(1, 'a');
  stream_->WriteCryptoData(ENCRYPTION_INITIAL, data2);
  EXPECT_TRUE(stream_->HasBufferedCryptoFrames());

  // Writing an additional byte to the send buffer closes the connection.
  if (GetQuicFlag(quic_bounded_crypto_send_buffer)) {
    EXPECT_CALL(*connection_, CloseConnection(QUIC_INTERNAL_ERROR, _, _));
    EXPECT_QUIC_BUG(
        stream_->WriteCryptoData(ENCRYPTION_INITIAL, data2),
        "Too much data for crypto send buffer with level: ENCRYPTION_INITIAL, "
        "current_buffer_size: 16384, data length: 1");
  }
}

TEST_F(QuicCryptoStreamTest, WriteBufferedCryptoFrames) {
  if (!QuicVersionUsesCryptoFrames(connection_->transport_version())) {
    return;
  }
  EXPECT_FALSE(stream_->HasBufferedCryptoFrames());
  InSequence s;
  // Send [0, 1350) in ENCRYPTION_INITIAL.
  EXPECT_EQ(ENCRYPTION_INITIAL, connection_->encryption_level());
  std::string data(1350, 'a');
  // Only consumed 1000 bytes.
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_INITIAL, 1350, 0))
      .WillOnce(Return(1000));
  stream_->WriteCryptoData(ENCRYPTION_INITIAL, data);
  EXPECT_TRUE(stream_->HasBufferedCryptoFrames());

  // Send [1350, 2700) in ENCRYPTION_ZERO_RTT and verify no write is attempted
  // because there is buffered data.
  EXPECT_CALL(*connection_, SendCryptoData(_, _, _)).Times(0);
  connection_->SetEncrypter(
      ENCRYPTION_ZERO_RTT,
      std::make_unique<NullEncrypter>(Perspective::IS_CLIENT));
  connection_->SetDefaultEncryptionLevel(ENCRYPTION_ZERO_RTT);
  stream_->WriteCryptoData(ENCRYPTION_ZERO_RTT, data);
  EXPECT_EQ(ENCRYPTION_ZERO_RTT, connection_->encryption_level());

  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_INITIAL, 350, 1000))
      .WillOnce(Return(350));
  // Partial write of ENCRYPTION_ZERO_RTT data.
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_ZERO_RTT, 1350, 0))
      .WillOnce(Return(1000));
  stream_->WriteBufferedCryptoFrames();
  EXPECT_TRUE(stream_->HasBufferedCryptoFrames());
  EXPECT_EQ(ENCRYPTION_ZERO_RTT, connection_->encryption_level());

  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_ZERO_RTT, 350, 1000))
      .WillOnce(Return(350));
  stream_->WriteBufferedCryptoFrames();
  EXPECT_FALSE(stream_->HasBufferedCryptoFrames());
}

TEST_F(QuicCryptoStreamTest, LimitBufferedCryptoData) {
  if (!QuicVersionUsesCryptoFrames(connection_->transport_version())) {
    return;
  }

  EXPECT_CALL(*connection_,
              CloseConnection(QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA, _, _));
  std::string large_frame(2 * GetQuicFlag(quic_max_buffered_crypto_bytes), 'a');

  // Set offset to 1 so that we guarantee the data gets buffered instead of
  // immediately processed.
  QuicStreamOffset offset = 1;
  stream_->OnCryptoFrame(
      QuicCryptoFrame(ENCRYPTION_INITIAL, offset, large_frame));
}

TEST_F(QuicCryptoStreamTest, CloseConnectionWithZeroRttCryptoFrame) {
  if (!QuicVersionUsesCryptoFrames(connection_->transport_version())) {
    return;
  }

  EXPECT_CALL(*connection_,
              CloseConnection(IETF_QUIC_PROTOCOL_VIOLATION, _, _));

  test::QuicConnectionPeer::SetLastDecryptedLevel(connection_,
                                                  ENCRYPTION_ZERO_RTT);
  QuicStreamOffset offset = 1;
  stream_->OnCryptoFrame(QuicCryptoFrame(ENCRYPTION_ZERO_RTT, offset, "data"));
}

TEST_F(QuicCryptoStreamTest, RetransmitCryptoFramesAndPartialWrite) {
  if (!QuicVersionUsesCryptoFrames(connection_->transport_version())) {
    return;
  }

  EXPECT_CALL(*connection_, SendCryptoData(_, _, _)).Times(0);
  InSequence s;
  // Send [0, 1350) in ENCRYPTION_INITIAL.
  EXPECT_EQ(ENCRYPTION_INITIAL, connection_->encryption_level());
  std::string data(1350, 'a');
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_INITIAL, 1350, 0))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  stream_->WriteCryptoData(ENCRYPTION_INITIAL, data);

  // Lost [0, 1000).
  QuicCryptoFrame lost_frame(ENCRYPTION_INITIAL, 0, 1000);
  stream_->OnCryptoFrameLost(&lost_frame);
  EXPECT_TRUE(stream_->HasPendingCryptoRetransmission());
  // Simulate connection is constrained by amplification restriction.
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_INITIAL, 1000, 0))
      .WillOnce(Return(0));
  stream_->WritePendingCryptoRetransmission();
  EXPECT_TRUE(stream_->HasPendingCryptoRetransmission());
  // Connection gets unblocked.
  EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_INITIAL, 1000, 0))
      .WillOnce(Invoke(connection_,
                       &MockQuicConnection::QuicConnection_SendCryptoData));
  stream_->WritePendingCryptoRetransmission();
  EXPECT_FALSE(stream_->HasPendingCryptoRetransmission());
}

// Regression test for b/203199510
TEST_F(QuicCryptoStreamTest, EmptyCryptoFrame) {
  if (!QuicVersionUsesCryptoFrames(connection_->transport_version())) {
    return;
  }
  EXPECT_CALL(*connection_, CloseConnection(_, _, _)).Times(0);
  QuicCryptoFrame empty_crypto_frame(ENCRYPTION_INITIAL, 0, nullptr, 0);
  stream_->OnCryptoFrame(empty_crypto_frame);
}

}  // namespace
}  // namespace test
}  // namespace quic


text:
Prize Christmas Quiz – Part Two
If you missed it, you can find Part One of the Prize Christmas Quiz here.
Jesus Christ is our spiritual king, the emperor of our souls, and of course there is the story of the three Kings—the three wise men—that is traditionally a part of Christmas (see the Gospel of Matthew Ch. 2 for the Adoration of the Magi). The kings and emperors in my next set of questions all hoped that they were doing their Christian duty. The main event in each question happened on the twenty-third of December in their various years, which is, of course, today's date and the last Sunday in this year's Advent-tide.
1) On the twenty-third of December in AD 1688 the last Roman Catholic monarch of Scotland landed at a small port in north-west France.
(a) What did Napoleon I plan to do from there?
(b) What did Pluto have to do with this town?
2) The following is an extract from a famous poem extolling the virtues of Bohea and published in AD 1700:
"BY Avon's Stream (the Muses calm Retreat)
Palaemon liv'd in his un-envy'd Seat,
None better knew, or practis'd, in his Cell
The chast Delights that with Retirement dwell.
And thus confin'd to Safety's humble Sphear,
Desiring Little, had not Much to fear;
Was neither Fortune's Envy, nor her Sport;
Free from the servile Arts of Town or Court,
The nauseous Task, that gen'rous Souls contemn,
Of Knaves Caresses, and Caressing them.
Yet (whether Novelty his Fancy fir'd,
Or some Diviner Pow'r the Thought inspir'd,)
Through Foreign Climates he resolv'd to roam,
And view those Wonders which he read at home.
Most strict Survey in every Realm he made
Of Men and Manners, Policy and Trade;
But none he found, his gentle Soul to please,
Like the Refin'd and Civiliz'd Chinese.
Rich in Improvements of his well-spent Time,
The Bard returns to his own Native Clime:
The Neighb'ring Shepherds, who his Absence mourn'd,
Visit with Joy their wandring Friend return'd.
Short Salutation past, he feasts their Eyes
With pleasing View of Eastern Rarities.
Nature and Art's choice Gift, the Goa-stone,
With Plants and Herbs to Western Swains unknown.
Yet, more surpriz'd, they found their Senses chear'd,
Soon as the Verdant fragrant TEA appear'd;
It's Nature, Use, confus'dly they demand,
What Name it bore? The Product of what Land?
'Twill Time require to have at full exprest
(The Bard reply'd) what you in hast request.
Come to my Bow'r, and I'll inform you there,
What curious Souls must needs be pleas'd to hear."
. . . and so on for two cantos.
What did two monarchs do to the author of this poem on the twenty-third of December in AD 1692?
How is Psalm 42 connected to the Christmas carol describing the Annunciation to the Shepherds and also to the poem in this question?
3) The Castle of Bliss saw something dreadful happen to Le Balafré on the twenty-third of December in AD 1588.
How was the "Forty-five", which belonged to a king, involved and who was the king?
What connection through two authors does Le Balafré have to the Right Honourable Lawrence, Earl of Rochester?
4) A well-loved and very brave king, who succeeded to his throne on the twenty-third of December, AD 1909, once said in pointing out the risks in abandoning Christian ideals in his country: "Every time society has distanced itself from the Gospel, which preaches humility, fraternity, and peace, the people have been unhappy. . ." This same king also refused to comply with a great empire's demand that its troops be allowed safe passage through his country and so the United Kingdom of Great Britain was forced to go to war over that issue, amongst others.
What does the city of Lumbashi have to do with this king's wife?
What did the Tiwa, or Tigua, peoples of New Mexico give to this king?
Why was this king's wife awarded the title Righteous Among the Nations by the Israeli government?
5) On the twenty-third of December in AD 962 this Mohammedan occupied city was stormed by a victorious Christian general who became known and feared as 'The Pale Death of the Saracens' and who went on to become an emperor. By his side was his nephew, another future emperor. They razed the city to the ground and killed or enslaved all the Mohammedan inhabitants, carrying off several tons of silver dirhams (a coin of the primitive currency of the Mohammedans) that had been amassed by extorting Christians and Jews, together with thousands of camels and mules and much more treasure besides. Most importantly they retrieved and carried off the ancient and tattered tunic of the Forerunner.
What is the name of the city that was razed?
How is the 'Pale Death of the Saracens' linked to Herod Antipas (Herod the King)?
Why is his nephew important to Mount Athos?
There will be answers to every part of the quiz after the New Year.
There will be a small prize for the first person, drawn at random, who correctly answers all, or the most, questions and emails me their answers to
You may email your answers to each section as you finish it or save them all up and email me the lot when the quiz is complete, but don't lose your answers in the meantime if you choose to do the latter.
Even if you don't manage to answer every question, or think that you might have got some wrong answers, do still join in and send me your entry – you might still win.
In the spirit of Christmas I'll tell you what the small prize is on Christmas Day – after all, one shouldn't open one's presents early.
Happy Advent.
PrevWhat is behind the Gilet Jaune Insurrection in France? An interview with Nidra Poller
Prize Christmas Quiz – Part ThreeNext

redpajama_set_name: RedPajamaCommonCrawl


text:
24H/12H Events
FIA GT World Cup
Historic Racing
Intercontinental GTC
International GT Open
Ligier European Series
Michelin Le Mans Cup
Other Series & Events
Bathurst 12 Hour
IMSA Daytona 24 Hours
Le Mans 24 Hours
Nürburgring 24 Hours
Spa 24 Hours
ADAC GT
GT Cup
Italian GT
24H Proto Series
Blancpain Endurance Cup
British LMP3 Cup
FRD LMP3 Series
Grand-Am
GT4 European Series Northern Cup
Roar Before The 24: Friday Paddock Notes 2
DSC's second set of paddock notes from Friday's action in Daytona
Kobayashi's first impressions
Kamui Kobayashi, who is making his IMSA debut at the Rolex 24 this year, gave his first impressions to DSC of the Cadillac DPi V.R and the circuit today.
The FIA WEC and Super Formula regular says he's relishing the chance to race in the Floridian endurance classic for the first time, as it's a race he's always wanted to do.
"It's a pretty good car," he said. "I haven't done many laps yet, but I feel like it's a good package with a good balance. It's challenge because the United States has a lot of bumpy tracks and its prepared for that. I feel comfortable though.
"I do Super Formula, and I'd say it's similar to that, it looks like a WEC car, but it drives more like a formula car, as it has more downforce. It's not hard to adjust for me, because it's not too far away from what I'm used to driving.
"The circuit itself is amazing, the banking is incredible, this is the first time I'm driving the banking at speed, and when you're over 250kph it's just different."
Vanthoor's baby arrives
Porsche GTLM driver Laurens Vanthoor is not in attendance at the Roar Before the 24 this weekend, as he's been accompanying his wife, who today gave birth to Emily Kaya.
Jacqueline and myself are proud to tell that our baby daughter has arrived. After an 18h race, Emily Kaya Vanthoor has crossed the finish line at 18:14 on January the 4th. She passed scrutineering with a weight of 3.450 grams and a length of 51 cm.
— Laurens Vanthoor (@VanthoorLaurens) January 4, 2019
DSC sends its congratulations to the whole family!
Entry list updated
An updated entry list for the Roar was released last night, and it includes a few notable driver changes/additions.
There's nothing of note in DPi, though in LMP2 Kyle Masson and his father Robert will race with Cameron Cassels and Kris Wright Performance Tech's ORECA. DragonSpeed's line-up meanwhile, still has holes, the #18 only listing Roberto Gonzalez – currently the car is still sporting the names of its WEC crew, Pastor Maldonado and Anthony Davidson.
There's also a TBA in the #81, which has four confirmed drivers, Henrik Hedman, Ben Hanley, James Allen and Miki Weckstrom.
PR1's crew is still incomplete meanwhile, still only has two drivers listed, Matt McMurry and Gabriel Aubry.
GTLM meanwhile sees FIA WEC regular Davide Rigon join Miguel Molina in the Risi Competitzione Ferrari.
GTD features multiple additions, including the full Via Italia Racing Ferrari crew of Chico Lomngo, Victor Frazoni and Marcos Gomes, Kang Ling joining defending Rolex 24 GTD winner Grasser Racing's #11 line-up and Porsche works driver Sven Muller headlining the NGT Motorsport crew which includes Juergen Haering, Steffen Goering and Klaus Bachler.
Riley's driving stable is also complete with the addition of Luca Stolz and Felipe Fraga. Dirk Werner and Matteo Cairoli will race with Tim Pappas in Black Swan's Porsche.
The full entry list with all the changes can be found HERE >>>
Atherton pleased with Prototype Challenge grid
19 cars are entered in the Prototype Challenge series for this weekend's running, and race at Daytona. IMSA head Scott Atherton is encouraged by the quantity and quality of the field, following the move to make it a single-class, LMP3-only series for 2019.
"This year the class has a new look, as it's all LMP3, we're starting the season with 19 cars, that will continue to grow as we transition from two classes to one. It's a healthy platform that will get moreso in seasons to come. Don't be surprised to see numbers in the mid-20s as the season goes on."
Rossi still getting to grips with the Acura
Heading into the second session this afternoon, former Indy 500 winner Alex Rossi, said he'd had four hours of track time so far in the Penske Acura he'll make his IMSA debut in later this month.
"It's great to work with Penske, everyone has been welcoming. We tested a cpuple of weeks ago and I got a bit of time in the car, it was pretty successful but there's a lot more systems to deal with than an IndyCar.
"It's a good package all round though, and we're here to win, the team made a lot of progress last year, and they're confident, so I'm fortunate to have them to coach me up."
Zanardi unsure whether Rolex 24 will be his last race
During Alex Zanardi's press conference today he revealed that he's not sure whether or not the Rolex 24 will be his last race. The 52-year-old multiple CART champion and Paralympic Gold Medalist, who said he chose actively to race at Daytona over Le Mans this year with BMW, said he'd be lured back to racing if offers came in, but isn't sure what the future holds.
"In reality, this is a one-off thing, but I can't guarantee you this will be the last race in my career," said Zanardi, who is driving #24 GTLM BMW with Jesse John, John Edwards and Chaz Mostert. "I'm not sure. But, I think my last race was really at the end of the 2009 WTCC season, prior to the moment when I decided to focus on hand cycling.
"Since then racing has just been like entering a play house, I don't think I have the mental energy to compete at the level it takes for a full championship, but to prepare and dedicate to myself to do an event like this one is very fascinating for me. I cannot tell you that after this race if everything goes well, it will be over.
"Maybe someone will ask me to do another race, and I would probably say yes, asking a driver if he wants to drive a car is like asking a cat if he likes to catch a mouse. But, too much is too much, and I'll be 53 this year. This is why I accepted this fantastic offer from BMW."
More from Zanardi will be on DSC in the coming days.
Alonso yet to decide on sportscar racing future past Le Mans
Fernando Alonso told the media today in Daytona that he hasn't confirmed his plans to race in sportscar beyond June yet.
The Spaniard, who is back in Florida for a second crack at the Rolex 24, with Wayne Taylor Racing, said though, that medium to long-term a full IMSA season could be something he'd take on.
"I don't know my programmes right now, I will do after June. Until then I have this race, Sebring with Toyota, Spa, Indy 500 and the 24 Hours of Le Mans. After that I have a few different ideas, and I will let you know.
"It's definitely a possibility I will race in IMSA in the future, and why not a full season one day, in medium to long term?"
Hurley Haywood Scholarship winner announced
This year's winner of the Hurley Haywood Scholarship was announced today at Daytona, Scott Atherton revealing that 21-year-old Sean McAlister, the reigning Porsche Trophy West winner.
For winning, McCalister has received a full-season Premium Entry in the 2019 Porsche GT3 Cup Challenge USA, a parts credit with Porsche Motorsports North America, a set of Yokohama Tyres for each Porsche GT3 Cup Challenge event, a complete OMP driver suit, gloves, etc and a two-page feature story in RACER Magazine.
Tagged with: Stephen Kilbey
Previous article Scott Pruett Named As Grand Marshal For 2019 Rolex 24 Hours
Next article Mazda Team Joest Tops Day 1 At The Roar
GT3, All The Cars In Pictures
by Stephen Kilbey 20 October 2020 0 Comments
Falken At The Nürburgring 24 Hours, The Strangest Year
by Graham Goodwin 24 September 2020 0 Comments
#IMSA
Calendars by Series & Date
Join the conversation across Facebook, Twitter & Instagram
© 2016 Dailysportscar. All Rights Reserved. TJS - Web Design Lincolnshire
The DSC Team


text:
Lets Welcome all Children with Disability to School
Children rang the bell at a time to draw the attention to their manifesto
With the theme 'All Children Are Welcome to School, Including Children with Disability`, 12326 students, with disabilities and without disabilities, of 40 schools in Bangladesh, rang the bell at a time for a minute between 12:00-12:01. Thus they created the attention to the policy makers and others, who are in a position to eliminate the barriers that prevent children with disabilities from going to school highlighting the 10 action points on inclusive education.
In line with the 'We Ring the Bell' program, a global campaign of education pioneered by Lilliane Fonds, an organization based in the Netherlands, this extra-ordinary campaign is organized in Bangladesh by its strategic partner organization Disabled Rehabilitation and Research Association (DRRA) and its 21 partner organizations.
Children got together in school premises and created attention to the policy makers and other through making noise by ringing bells, drums, sirens, flute, whistle, dish-spoon etc. Along with students, 1122 parents, teachers, school committee members, educational officials, political leaders, civil society personnel, religious leaders, NGOs, local Government & local Administrative official, polices and journalists were also participated bell rally where they expressed their commitment by ringing bell.
A poster campaign with the call to welcome all children including children with disability has been demonstrated where 10 action points on inclusive education has been highlighted. There was signature campaign, where a total of 21,220 individuals signed on the manifesto.
DRRA developed one video for promoting rights of children with disability and good wishes message from Rasheda K. Chowdhury, Former Adviser to the Care Taker Government of the People's Republic of Bangladesh and Executive Director of CAMPE and Monsur Ahmed Chowdhury, Former Member, UN Committee for UNCRPD and Member, Disable Council International, Geneva.
A welcome to school suitcase demonstration was introduced on 5th March at Tongi which will be run in all schools, by rotation, those participated in we ring the bell campaign. The objective of the demonstration was to make 'accessibility audit' by the students on their own school, in a funny way.


text:
Methodist Doctors Near Me
admin October 10, 2019 October 10, 2019 Comments Off on Methodist Doctors Near Me
Find best Doctors near me & make an appointment online instantly! Zocdoc helps you find Doctors with verified patient reviews and appointment availability that accept your insurance. All appointment times are guaranteed by our Doctors. It's free!
Which Bus To Vatican City She added that flowers had been left at the tomb regularly "for some years". Emanuela, who lived inside the Vatican City, was last seen at a bus stop talking to
Your Family's Resource for Healthcare in Richardson. The Methodist Richardson Medical Center provides a close-to-home location for advanced healthcare services in Richardson, Garland, Plano, and surrounding areas in Dallas and Collin counties.
One reason lines form outside St. Luke's United Methodist Church in Lakeview each June. a previous production of "Oliver" boasted 130 performers. In an intricate, near-continuous choreography of.
Christianity Golden Rule Roman Catholic Church News New Hyde Park, New York. A ROMAN CATHOLIC PARISH COMMUNITY. Sunday 7 am, 9 am (Family), 10:30 am, 12 pm. Around The Parish. News & Events.
And, "This reminded me why. seeing their physicians and were doing fine medically," she added. Blood sugars also improved. One patient reported that blood sugars previously above 200 now were.
a prominent transplant surgeon and director of the hospital's general surgery training program for new doctors who'd just finished their four years of medical school. She became close to each one,
Matt Branch was loading up his truck after an annual hunting trip with friends near Eagle. worked on me and brought me back." When Branch finally regained consciousness 12 days later, his injured.
Meet your physician for life. Your neighborhood Methodist Family Health Center – Central Grand Prairie has proudly served the Grand Prairie community for more than a.
We are in your neighborhood with more than 20 clinic locations throughout Omaha and Southwest Iowa including 5 Urgent Care clinics. We have a tradition of caring for your families with physicians who understand that how you're treated is just as important as your treatment.
The gunman burst into the bodega on Fulton St. near Fort. Doctors at Methodist Hospital removed the bullet from his foot, he said. "It broke bone and I can feel it in there," he said. "I ask the.
Live News From Vatican City Which Bus To Vatican City She added that flowers had been left at the tomb regularly "for some years". Emanuela, who lived inside the Vatican City, was last seen at
Located throughout Nebraska and western Iowa, the hospitals and clinics of Methodist Health System bring the full resources of our regional network of health care providers, educators and support services to ensure you always have the care you need when – and where – you need it. Methodist Hospital. 8303 Dodge Street Omaha, NE 68114 (402) 354-4000
It's very important to me that I can work with providers, doctors and nurses and help them impact other people's lives." In recent weeks, Methodist's board affirmed. to uphold those principles that.
3 Cardinal Symptoms Of Copd Durable reductions in OHSA and OHDAS Composite scores reflect improvements in overall symptoms and. reductions in the cardinal symptom of dizziness as measured by OHSA #1 and supportive of ongoing.
It's taken me fifty eight years to write. it was always my grandmother taking him to doctor visits, helping him learn to walk, to talk, to read and write. My grandmother refused to let my mother.
Luckily, doctors at the Methodist Dallas Medical Center were able to remove them. "It shocked me," said Dr. Richard Meyrat. economic burden," with the average cost of treatment near $37,600. Meyrat.
Online ER Check-In. Mansfield's Trusted Resource for Quality Healthcare. Since its opening in 2006, Methodist Mansfield Medical Center has been awarded an "A" Hospital Safety Score by Leapfrog Group, Advanced Primary Stroke Center accreditation by the Joint Commission, and recognition as one of the Best Hospitals and Emergency Departments in Arlington by Living Magazine.
Methodist Physicians Clinic – Healthwest provides comprehensive care for men, women and children. Located just northwest of the 156th street exit on West Dodge Road, we offer general primary care services, including family medicine and internal medicine,
It's for Darion to answer for me." Earlier this week, ABC13 learned the little girl, along with two of her siblings, was taken from her home last August as CPS investigated her head injuries. In court.
Methodist North Hospital Employment Methodist Stone Oak Hospital will expand by more than 100,000 square feet and boost its number of patient beds by a third because of the growth and the aging population
MAP2 is the new operating name for the Methodist Patient-Centered Accountable Care Organization (MPCACO). Through the Methodist Alliance for Patients and Physicians, your medical history is shared with your team of healthcare providers.
Charlie started accumulating angels: An army of doctors. she is to me." KALAMAZOO, Mich. (WOOD) — Two men were arrested.
"The issue is health, not age," Dr. Hassan Ibrahim, head of Houston Methodist Hospital's living kidney donor. of her husbands Jeep and the other in her yard. "Why not me?," he thought. For more.
Let me provide you with a couple of specific examples in the quarter. of HIFU device made a clear difference in the decision process. Finally, Houston Methodist Hospital was one of the first.
The Methodist Physician Group Specialists work to give unparalleled care to the residents of Northwest Indiana, with quality services, skilled medical experts and a full range of treatment options in a professional but inviting environment. We accept most major insurance providers.
Meet your physician for life. Your neighborhood Methodist Family Health Center is nearby to keep your family healthy. Whether you need treatment for colds, cuts, sports injuries, or preventive care, remember that our healing hands are conveniently close at hand.
A Texas woman suffering from months of debilitating headaches was surprised to learn that tapeworms had lodged inside of her brain, laying numerous eggs near the base, officials said. Doctors made.
Use our Find a Doctor tool to find one near you in Peoria, Illinois, or the surrounding communities. the physicians shown on this website may be independent practitioners who are not necessarily employees or agents of Methodist, Pekin, or Proctor Hospitals. Please select Yes to accept or No to decline.
In spite of Granny's midwestern Methodist reserve and impermeable. which I listened to with rapt attention, the doctor grabbed the intern by his lab coat, and said desperately, "Abe, Abe! Help me.
And he still often wonders why he survived those near-death experiences. his mark at the Methodist church on College Avenue. "Dean Dickerson was associate dean of Agriculture," recalls the mushroom.
We are dedicated to helping you find a personal physician for managing your health. Below you can find a specific provider who matches the needs of you and your family.
Christianity And The Roman Empire Christianizing the Roman Empire: A.D. 100-400 [Ramsay MacMullen] on Amazon.com. *FREE* shipping on qualifying offers. How did the early Christian church manage to win its dominant place in the Roman
Doctors spent 12 hours treating the. "I think it's going to be impossible for me to pay $250,000," he said. "I just hope I.
Find a Cardiologist near you in your state. Get education/training information, practice information, health insurance affiliations and contact information.
9 reviews of Methodist Family Medicine Group "I have been seeing Dr. Diamond for over a decade now. She is absolutely the best. She takes the time to listen and never makes me feel rushed. As I've gotten older I have more questions about general…
Spirituality 12th House Christianity Golden Rule Roman Catholic Church News New Hyde Park, New York. A ROMAN CATHOLIC PARISH COMMUNITY. Sunday 7 am, 9 am (Family), 10:30 am, 12 pm. Around The Parish.
I would like to thank the doctors, nurses and support staff at Houston Methodist for providing me with expert medical care. Police reported they found Roland's vehicle near the Galleria. Her purse.
Pre Spiritual Awakening
Methodist Jobs Hiring


• New! Enter by Sept 18 and get your Team Name on personalized number plates!
• One lucky draw rider will go home with a Cannondale bike courtesy of Dukes Cycle and Cannondale.
For all the event details and easy On-Line Registration see www.epic8hour.ca.
We look forward to an awesome autumn day of fun and great riding!


If the event needs to run special code when a player binds the event, it can be done here.
This is called if the script attempts to cancel the event, so the underlying event can also be cancelled.
Returns if this event is cancelled.
If the event needs to run special code when a player binds the event, it can be done here. By default, an UnsupportedOperationException is thrown, but is caught and ignored.
This is called if the script attempts to cancel the event, so the underlying event can also be cancelled. If the underlying event is not cancellable, this should throw an EventException, which is caught in the triggering code, and at this time ignored.
Returns if this event is cancelled. If the event is not cancellable, false should be returned, though this case shouldn't normally occur, since isCancellable will be called prior to calling this function.


See Wok and Roll - Thai Food Truck in Juárez - See Top Reviews, Detail Information, Address, Hours, Phone Number, and more for Wok and Roll - Thai Food Truck. & - Av. Simona Barba 6301, Col. Villa Hermosa. Ciudad Juárez (Antes de Valentin Fuentes) Ciudad Juárez, Mexico.


On Saturday 10th June shoppers visiting Victorian Arcade in Walsall were treated to a special visit from Marshall – the popular Dalmatian fire-pup from the children's television show PAW Patrol – as part of National Child Safety Week.
The heroic pup made meet and greet appearances at intervals throughout the day, where local families were encouraged to get their cameras at the ready for Walsall youngsters to pose for photos with Marshall.
What's more, Walsall Fire Station and the West Midlands Fire Service where available throughout the day to help raise awareness of the importance of fire safety to visitors at the arcade. Lucky shoppers were also given the opportunity to take a glimpse inside an 'on call' Walsall fire engine.
"I would like to say a huge thank you to our local fire department for coming down and supporting our child safety event. It was a hugely popular day and I hope many youngsters took advantage of the opportunity to learn more about the importance of fire safety. Marshall was a fantastic addition to the event providing a fun and informative way to provide potentially lifesaving information."


OYO is looking for a dynamic and ambitious colleague to contribute in our continued development in communication and business, both nationally and internationally. We are searching for a person who can assist with press work, general communication strategies and also assists with our business development team. You will have a central role in the continuation of our professional activities reporting directly to the management and with the opportunity to put your own stamp on the tasks. You are able to assist the business development team with prequalification applications and be pro-active in the search for new opportunities and collaborations.
Dedicated, proactive, curious and versatile person with experience in business and economics, communication, graphic design, architecture, construction or creative industries. You have an entrepreneurial spirit.
Freelance fulltime or part-time position. Possibility to combine with our office assistant candidature.


Swift, Secure Fee Payment Solutions.
Need A Business-To-Business Vendor Fee Solution?
AFS Provides You An Intelligent, Organized End-to-End Enterprise Payment System.
You Lend Money, We Lend A Hand.
AFS gives you the fee payment control you've been looking for.
We understand the chaos of managing real estate transaction fees and the difficulty in keeping current with ever-changing compliance regulations. We also recognize your desire for more streamlined workflow and faster fee processing.
AFS is the mortgage industry's intelligent enterprise payment system that supplies Lenders and Service Providers with a simple, secure end-to-end solution for collecting application and appraisal fees.
We're changing the way lenders and service providers manage service payments by combining security and affordability into one hassle-free, simple-to-use service. The AFS solution allows complete control of the payment process from order placement to order completion.


Custom made kitchen base units are made out of high quality German Egger melamine faced chipboard, award winning soft close German Hettich or Blum hinges & colour matching ABS edging as standard.
What separates our kitchen units from 95% of competition is a high build quality achieved by using cam & dowel construction method, solid 18mm top, solid 18mm back, ABS edging & use of high quality drawer mechanism and hinges. Bespoke made so you can request any type of modification & customisation you require.
Our kitchen base units are supplied fully assembled and we deliver to all parts of the UK.
Choose between award winning Hettich or Blum for a superior hinge choice. With either choice, you can be confident of high quality, longevity & style.
At Two Tone kitchens, we only use proven manufacturers to supply us with the high quality components needed to ensure our cabinets stay cutting edge and withstand test of time.


TL;DR: The easiest way to get your HomeKit device codes off paper. Just $2.99.
HomePass allows you to get rid of that old notebook and store your HomeKit device's codes right on your phone or iPad.
Sick of writing your HomeKit setup codes down in a notebook you have to store somewhere? HomePass lets you store your device codes on the device you use HomeKit with.
iCloud Sync - With HomePass, you can keep your device codes off paper and backed up in your iCloud account.
Import Existing Accessories - HomePass offers the ability to easily import your existing accessories, just input the device's code yourself.
Face ID/Touch ID/Passcode Authentication - Secure your HomeKit codes with your face, fingerprint or a passcode.
Custom Accessories - Add any accessories you have that aren't in HomeKit now, simply fill in the details as needed.
Dark Mode – HomePass comes with a dark mode that is perfect for the iPhone X, with automatic switching based on location or screen brightness.


The Ranunculus at the Santa Rosa Plateau Ecological Reserve (henceforth SRP here) was a source of puzzlement to me from 2001 until 2006. Every year when the plants bloomed, I'd study them some more to try to understand why Lathrop and Thorne (1985) determined the species as R. californicus, despite most flowers having the 5-6 petals of R. occidentalis, and not the 7-22 petals of R. californicus.
All the references supported the Lathrop and Thorne (1985) determination. Munz gives only R. californicus as being in southern California south of the Tehachapis, and the Jepson Manual says that R. occidentalis is not present in the SW. These floras largely followed the last monograph on Ranunculus published by the noted expert on southern California plants, Lyman Benson, in 1948. Benson presents a beautiful map which cleanly separates 21 Ranunculus taxa, showing the distribution for these two taxa as above.
So surely there was some more-cryptic feature of these plants that revealed them to be R. californicus and not the R. occidentalis they appeared to be. As a beginning botanist in 2001, I was not about to question any determination made by a professional botanist.
Nonetheless, it was still unsatisfying that the number of petals disagreed so violently with the number of petals that R. californicus was supposed to have, so in mid-March 2003 I reexamined the determination. That year, I finally consulted Munz and discovered that the variety of R. occidentalis found in the southern Sierra Nevada and the Tehachapis was var. eisenii, with beaks 0.5-1.0 mm long. This was almost precisely the length of the beaks of the SRP plants! Apparently, the more numerous other varieties had longer beaks, accounting for the gen 1.5-2.5 mm in the Jepson Manual description for R. occidentalis.
So I was back to being puzzled again, enough so that in late March 2003 I made my first visit ever to a herbarium, the famous Rancho Santa Ana Herbarium, to see the Lathrop and Thorne vouchers from the SRP. I was greatly surprised to see those vouchers; one voucher was of a plant with 8 petals per flower on most flowers! I've seen perhaps 1 in 1,000 plants like that at the SRP, and it is understandable that they keyed that one to R. californicus. A second voucher showed a plant with 5 petals per flower, our typical plant at the SRP. Thorne called that "R. californicus, app. R. occidentalis" (I assumed that app. meant appearing as). Their third and last voucher showed a plant with 5 petals, with simply R. californicus as the id.
It began to seem likely to me that the Lathrop and Thorne determination was based on this non-representative sampling of the plants at the SRP, combined with the common knowledge at that point that "R. occidentalis doesn't occur in southern California except in the Tehachapi Mountains".
Lathrop and Thorne cannot be faulted for either the non-representative sample nor the determination. Most likely, Lathrop and Thorne simply intentionally sampled the extremes of the population, to see if they were possibly different species. This is a good thing to do when compiling a flora, but potentially misleading to anyone who studies voucher specimens in deducing the properties of the population as a whole. Also, botanists don't often spend much time worrying about specimens being a taxon not known to be present in an area, for the following excellent reason. There are plenty of species whose determinations are difficult, so it is general a waste of time to always make sure a given specimen is not a species found only outside of the area one is studying.
In April 2003 I finally saw my first true R. californicus at Laurel Canyon in Orange County. I was ecstatic!! The flowers had an average of 10 petals each, exactly in the range of what the floras said they were supposed to have! Even more interesting, the plants were growing in a completely different habitat than the plants at the SRP. Their habitat was a shady moist hillside bank near a moist drainage, whereas the SRP plants are often found completely out in the open as well as in dryish drainages.
There was no doubt that these specimens looked at a glance like a completely different species than the SRP plants. This observation stimulated me to begin to collect data on Ranunculus plants I ran across in the field in order to help understand this situation further. There are plenty of species with incredible variation within the species, so an observation that these plants look different is not sufficient to prove that they are a different species.
In July 2003, I ran across a population of R. californicus at Palomar Mountain, and compiled a histogram of the number of petals for these plants (see below). Once again, these plants fit the description of R. californicus, and looked very different from the SRP plants.
I later realized that the petal shape was also an important discriminant. In 2004, I collected and measured petals from the SRP plants, and R. californicus in three locations: Laurel Canyon (Orange County), Hondo Canyon (Santa Monica Mountains), and Garnet Peak (Laguna Mountains).
Analysis of the petal shape also confirmed the plants at the SRP were only consistent with a determination of R. occidentalis.
On 10 and 16 March 2005, I took pictures of 38 groups of flowers from six widely-separated locations, all with GPS locations, to produce and document an unbiased histogram of the number of petals for the SRP plants. In most locations, essentially every flower was photographed. Each picture contains ~20 flowers that can be measured; the data from a random subset of these pictures is given below.
Finally, in 2006, I had the good fortune to be shown a population of R. occidentalis in the southern Sierra Nevada, in a location where no one has ever claimed that any plants there are R. californicus. These plants looked like clones of the SRP plants! The moment I saw them, it removed any lingering doubts I had about the classification of the SRP plants.
The SRP plants unambiguously key to R. occidentalis, are identical to plants of that species growing in the Sierra Nevada, and are distinctly different from true specimens of R. californicus in southern California.
In particular, the flowers have 5 petals the vast majority of the time, sometimes 6 petals, and very infrequently up to 12 petals, and the petals are ~roundish. These are both key characteristics of R. occidentalis, compared to the 9-17 petals and petal length ~2-3 times its width of R. californicus. The SRP plants also have only the glabrous receptacles of R. occidentalis.
R. occidentalis: petals 5-14, yellow, 5-13 x 1.5-8 mm.
although Jepson's Flora of California says R. californicus uncommonly as few as 7 or 8.
The most dependable character for the segregation of these forms [the species] seems to lie in the number of corolla parts. The petals of R. californicus vary most commonly from 7 to 16 and we determined the modal value to be 12 which if graphically represented makes a 2-sided figure. The petals of R. occidentalis are 5, varying to 7 or 8, the modal value being 5 and representing a 1-sided figure. This seems to be therefore the soundest test of differentiation between these two species.
The following pictures show some randomly-chosen specimens at the SRP for the reader to see for themselves how clearly these plants key to R. occidentalis. The photographs were taken on 10 and 16 March 2005 as described above.
The number of petals is overwhelmingly 5. The petals are without doubt just 1-2 times as long as broad, and not 2-3 times. The keying is unambiguous: petals 5-6 and petals roundish goes to R. occidentalis in every flora.
In addition, although there weren't enough blooms to histogram, the number of petals in the Laurel Canyon R. californicus was 10 on 4/13/03, and 13-14 on 5/9/04, consistent with the distribution for the Palomar plants.
As mentioned above, I have observed a larger number of petals on some flowers at the SRP, but they occurred too rarely to show up in the above histogram derived from my random pictures.
The two lines in the above plot give the range of length and width given in Munz and in the Jepson Manual. The slopes of the lines correspond to the following ratios of length to width: for R. californicus, 2.2-3; for R. occidentalis, 1.5-2.
The above two plots clearly demonstrate that the only possible determination for the SRP plants is R. occidentalis, and that they are distinctly different from the other southern California specimens studied of R. californicus. The SRP plants do not grade into any of the other studied populations of R. californicus; a hypothesis that the SRP plants fall within the variation seen in the other specimens is clearly rejected.
The SRP is ~120 miles distant from the Tehachapi Mountains, and ~150 miles distant from the bulk of the R. occidentalis population in the southern Sierra Nevada. Similar disjunct populations happen occasionally in many species, and are usually of much interest to botanists, since they give clues as to the former distributions of such species. The SRP contains other taxa that are not "supposed to be" in Southern California, such as Plagiobothrys fulvus.
The landscape of the SRP has been essentially intact for the last 8 million years, and thus hasn't been subject to the massive erosion or deposition everyplace else has experienced.
The SRP has basalt, an unusual soil type like serpentine.
It is very plausible that R. occidentalis once was more widespread in southern California during the cooler climate when the Ice-Age glaciers were at their greatest extents. These plants on the basalt at the SRP are likely a remnant population from them that adapted to the basalt, and thus did not participate in the evolution to or replacement with R. californicus. A disjunct distance of ~120 miles is less than one-fifth the 600+ miles for the limestone disjuncts in the Sierra Nevada.
Your task, if you believe that any of these are R. californicus, especially the ones from Riverside County, is to pick out which ones are R. californicus.


It also notes that the activity on Twitter is dominated by a small percentage -- most users rarely tweet, while the most prolific 10 percent are responsible for 80 percent of tweets from U.S. adults. Pew says only around 22 percent of American adults today use Twitter, and they are representative of the broader population in some ways, but not in others. For starters, Twitter's U.S. adult users tend to be younger.
Snap Inc, the parent company of Snapchat, reported first quarter earnings on Tuesday .
Twitter stock surges after reporting better than expected earnings. The social media platform also added 330 million users in the first quarter. Yahoo Finance's Zack Guzman and Heidi Chung are joined by Ian Wishingrad, BigEyedWish Founder and Creative Director, to discuss.
Yahoo Finance's Julie Hyman, Adam Shapiro, Emily McCormick, Sibile Marcellus and Dan Roberts discuss Twitter's robust earnings.
A new Pew Research Center survey maps the differences between Twitter users and the general U.S. population. Pew estimates that 80% of all tweets from U.S. adult users come from just the top 10% of Twitter users, and they are mostly women. The survey also finds that U.S. adult Twitter users tend to be younger and more likely to identify with the Democratic Party than does the overall population.
Wall Street closed sharply higher on Tuesday buoyed by strong first-quarter 2019 earnings results.
After a sometimes tense debate that lasted more than eight hours, the Lower House Constitution and Justice Committee voted 48 against 18 that the bill is constitutional and can proceed in Congress. Bolsonaro still faces a long road to get final approval for the proposal that is to fix the country's battered public accounts and help cut public debt.


STAGE TWO - LET'S PLAY AND KNOW EACH OTHER - Website of andtheoscargoesto!
Each blazon will be put on our Twin space.
Pupils prepare storyboards for shooting to present his/her blazon (+ name, age) (the name should be written as subtitles).


text:
"""Tests for asset ids.

The output of this test should be used to verify the client-side
server id generation tests.
"""

__author__ = 'spencer@emailscrubbed.com (Spencer Kimball)'

import time
import unittest

from viewfinder.backend.db.activity import Activity
from viewfinder.backend.db.asset_id import AssetIdUniquifier
from viewfinder.backend.db.comment import Comment
from viewfinder.backend.db.episode import Episode
from viewfinder.backend.db.operation import Operation
from viewfinder.backend.db.photo import Photo
from viewfinder.backend.db.viewpoint import Viewpoint

class IdTestCase(unittest.TestCase):
  _PRINT_RESULTS = False

  def testActivityIds(self):
    """Test activity ids."""
    self._TestIdRoundTripWithTimestamp(Activity.ConstructActivityId, Activity.DeconstructActivityId)

  def testCommentIds(self):
    """Test comment ids."""
    self._TestIdRoundTripWithTimestamp(Comment.ConstructCommentId, Comment.DeconstructCommentId)

  def testEpisodeIds(self):
    """Test episode ids."""
    self._TestIdRoundTripWithTimestamp(Episode.ConstructEpisodeId, Episode.DeconstructEpisodeId)

  def testOperationIds(self):
    """Test operation ids."""
    self._TestIdRoundTrip(Operation.ConstructOperationId, Operation.DeconstructOperationId)

  def testPhotoIds(self):
    """Test photo ids."""
    self._TestIdRoundTripWithTimestamp(Photo.ConstructPhotoId, Photo.DeconstructPhotoId)

  def testViewpointIds(self):
    """Test viewpoint ids."""
    self._TestIdRoundTrip(Viewpoint.ConstructViewpointId, Viewpoint.DeconstructViewpointId)

  def _TestIdRoundTripWithTimestamp(self, construct, deconstruct):
    """Round-trip id with a timestamp."""
    def _RoundTrip(timestamp, device_id, uniquifier):
      asset_id = construct(timestamp, device_id, uniquifier)
      actual_timestamp, actual_device_id, actual_uniquifier = \
          deconstruct(asset_id)
      self.assertEqual(int(timestamp), actual_timestamp)
      self.assertEqual(device_id, actual_device_id)
      self.assertEqual(uniquifier, actual_uniquifier)
      if IdTestCase._PRINT_RESULTS:
        print '%r => %s' % ((timestamp, device_id, uniquifier), asset_id)

    _RoundTrip(0, 0, (0, None))
    _RoundTrip(1234234.123423, 127, (128, None))
    _RoundTrip(time.time(), 128, (127, None))
    _RoundTrip(time.time(), 128, (128, None))
    _RoundTrip(time.time(), 123512341234, (827348273422, None))

    _RoundTrip(0, 0, (0, 'v1234'))
    _RoundTrip(1234234.123423, 127, (128, '\n\t\r\b\0abc123\x1000'))
    _RoundTrip(time.time(), 128, (127, u'1'))
    _RoundTrip(time.time(), 128, (128, '   '))

  def _TestIdRoundTrip(self, construct, deconstruct):
    """Round-trip id."""
    def _RoundTrip(device_id, device_local_id):
      server_id = construct(device_id, device_local_id)
      actual_device_id, actual_device_local_id = deconstruct(server_id)
      self.assertEqual(device_id, actual_device_id)
      self.assertEqual(device_local_id, actual_device_local_id)
      if IdTestCase._PRINT_RESULTS:
        print '%r => %s' % ((device_id, device_local_id), server_id)

    _RoundTrip(0, (0, None))
    _RoundTrip(127, (128, None))
    _RoundTrip(128, (127, None))
    _RoundTrip(128, (128, None))
    _RoundTrip(123512341234, (827348273422, None))

    _RoundTrip(0, (0, 'v1234'))
    _RoundTrip(127, (128, '\n\t\r\b\0abc123\x1000'))
    _RoundTrip(128, (127, u'1'))
    _RoundTrip(128, (128, '   '))

redpajama_set_name: RedPajamaGithub


Honeymoon is a serious venture. Therefore, you cannot approach this important event without planning. What to do on your honeymoon? Where to go? How to spend your money effectively? You should do what's best for you and your partner. Choose a great place to go, perhaps, something exotic, something you've always dreamt about. Compromise and make sure you consider your partner's needs as well. Make your dreams come true and choose entertainment activities that seem to suit you best. Without any doubt, careful planning organized beforehand can help make the most out of your honeymoon.
So, how to plan a honeymoon? Start with booking tickets to a place you want to go. It can be anywhere as long as you have enough money and enthusiasm to undertake a journey. Of course, you partner should approve the place. It can be a country you've always wanted to visit or a certain route you'd like to explore. Perhaps, it can even be a place you've already visited, maybe with your partner, and have always wanted to return to it. Book tickets in advance and prearrange everything so that your honeymoon goes as smoothly as possible.
A honeymoon is not just a trip. Believe it or not, some couples even do a honeymoon without voyage. Nevertheless, generally, couples decide to go somewhere. No matter whether you're going somewhere or not, exciting entertainment is a crucial part of a well-planned honeymoon. Moreover, going somewhere, you're able to enjoy diverse activities hard to come by in a different place or your usual habitat. For example, during a trip to the seaside you can do diving, snorkelling, surfing, wakeboarding, etc. You can play beach volleyball or swim, tan and relax on the beach, and, for instance, build sandcastles. You can go to a gallery or visit a museum, rent a bungalow, ride on a yacht, etc. Doing something interesting together helps you to remember your special moments together and share mutually pleasant memories.
You won't know how to plan a honeymoon unless you pay attention to food. Try eating at different restaurants each day or cook yourself. The same as with the place you'd like to visit, pick food that you think is delicious. It might be a dish you tasted in the past or it may be something entirely new. Cooking yourself is itself a great activity that you can enjoy. You can have a picnic that is also a wonderful activity. Being in another country you should definitely enjoy local food and traditional dishes because national cuisine around the world is diverse and rich. Enjoying different kind of food is one of the many amazing things about traveling.
Aiming for comfort is the best way to realize how to plan a honeymoon. Everything should be as comfortable as possible. It means that the hotel rooms or other rentals must be extra comfortable to bring the atmosphere. You should not think about anything outside pleasure and mutual satisfaction. Therefore, you should organize your honeymoon in a way that will free your mind from planning once you close the door of your home on your way to the airport.
Finally, honeymoon planning is all about romance and passion. You cannot plan it but it will come on its own with everything else being arranged properly. You are encouraged to buy some candles, oils, put the music on, enjoy your partner being near, bring flowers, etc. You can make surprises and tell kind words, show care, and express sympathy.
Well, now you know how to plan your honeymoon. You need decide whether you're going somewhere or not together, then choose your destination, and have a great time there. Do something interesting and eat lobsters or caviar. Good luck!


The team at Good Deeds is truly world class. They helped to negotiate a real bargain for a dream residence in Manly. I'm grateful for what they've done and look forward to working with the team again on my next property (whenever that may be).


The future of the New Zealand China relationship will be determined by our next generation of leaders – young New Zealanders with the energy, vision and creativity to build on the successes of the past and present.
The New Zealand China Council recognises the importance of next-generation leadership to achieving its goals of a stronger, more resilient relationship. This month, the Council brought together 20 young people from a range of backgrounds and from all over the country for the second Next Generation Leadership Event.


This week on the FadCast, we talk about some of the most exciting trailers for the most disappointing movies and vice versa.
FadCast Ep. 106 | What Ever Happened To The Summer Blockbuster?
This week on the FadCast, we are joined by long time friend of the show and small time black market Italian deli meat peddler, JD the Mime to talk Late Summer Blockbuster gold to garbage.
This week on the FadCast, Emily brings the controversy for a discussion pitting feminism versus sexism within the film medium.
David Ayer is the real-life Amanda Waller, ditching the capable A-List cast and wasting their performances with poor editing and incoherent plot.
After watching the newest "Suicide Squad" trailer, here are five reasons why I think this baddie-filled flick will murder the Summer box-office.
Empire Magazine keeps tradition by flaunting a colorfully demented capture of Jared Leto's Joker from the upcoming 'Suicide Squad' for their December issue.
Was Common just cast as Green Lantern?!?!


The Children's Developmental Clinic is a community service program that is conducted by the Workforce Development and Continuing Education division at Prince George's Community College.
The clinic serves children who are experiencing such developmental difficulties as learning problems, physical fitness and coordination problems, language delays, emotional issues or orthopedic challenges.
During clinic sessions, children participate in one-to-one, individualized motor development training. They can also be enrolled in the language development or reading development programs at the site.
Student volunteers are needed to help during the fall and spring semesters. They must register for OCC-334 (Clinician Pre-Clinic Training) or OCC-327 (Child Development, Clinician-T) and attend at least one of the pre-clinic training sessions.
The pre-clinic training sessions for the spring 2019 semester will take place in February, 2019. The first on February 2 and the second on February 9. Both will be held 8:30 a.m.-12:30 p.m. Training for PGCC students will be located in Novak Field House (Largo Campus), and training for University of Maryland Students will be held in the School of Public Health building.
Although students may register in advance, in-person registration on the morning of the training session is preferred.
All volunteers must, prior to working with children, complete fingerprinting and a criminal background check. These services are provided to volunteers at no cost by Prince George's Community College as part of the pre-clinic training.
Mail completed forms with payment to: Children's Developmental Clinic Prince George's Community College, 301 Largo Rd., CE-123, Largo, MD 20774-2199.


These days, I stick to my plant-based diet so a skinny mocha (whipped cream or no) is out of the picture. However, now that the allergen menu is available I can confirm a mocha is still okay.
Last updated: January 2019. There's a public allergen menu available to download from the Caffé Nero website: drinks allergen menu.
Honey: there's no mention of honey in allergen menu (since it's not an allergen) and no ingredients list, so, please use your judgement. For things like the syrups, milkshakes and fruit blends, I asked them to confirm that the drinks would be suitable for vegans, and their Head of Food and Beverage confirmed they were.
Essentially, it's "the usual" that appear on the list. Caffe Nero vegan drinks just require a soy milk substitution – and skipping the whipped cream, where applicable.
They're all vegan! Have fun.
Want to know what's vegan at Costa Coffee?
Don't forget to tell the barista to skip the whipped cream.
Is there any vegan food at Caffe Nero?
Actually, yes. And in my opinion, theirSundried Tomato & Pesto cheese toastie is so fantastic it edges Caffe Nero above Starbucks in the lunch department. Controversial, I know. They've been a bit of a dark horse, Nero, but they've snuck right up there!
My main draw to the Caffe Nero vegan food is that the items produced by Nero tend to be marked as vegan. I didn't realise this until one Christmas when I discovered it with the mince pies. It was a very happy surprise!
My favourite vegan drink to order at Caffe Nero is the same as pretty much everywhere else: small soy cappuccino. I also like to venture into the regular hot chocolate and mocha territories when craving something chocolaty, but always go for a cappuccino at Nero for some reason.
Fab!!! I goto Nero's too – I am always a bit samey having the soya latte… had no idea that they had such a good selection of other stuff. Mince pies – wow!
I love Caffè Nero too! My favourite is a Decaff soy cappuccino, closely followed by a soy flat white yum…. also I noticed that the small dark chocolate bars are vegan too!!!
I'm just heading there now in the hope there will be some sweet potato wraps left! I am starving! But for sure I shall be getting a soya hazelnut latte, perfect for this chilly lunchtime.