I feel the same way about my black lab. Maybe, buy him a seat??
My dog was called "Joy" ;) He died 6 years ago and I still miss him. I'm also grateful because he was 11years with me and my family.
Your beautiful photograph and gratitude brought me good memories, thanks, Joyce !!!
It's a BEARDIE!! (Bearded Collie).
You may be a singer in love with one, but I'm a singer with one sitting at my feet... Yep, that's our family hairball!
Travel is one of the reasons I have, and had, Yorkies.
See my current furfriend here, here or here (the magazine cover is not for real).
So how do hairy dogs see through all that hair????


3 Picture Frames Photo Collage Frame V I S O N Eg Range is part of great design ideas. 3 Picture Frames Photo Collage Frame V I S O N Eg Range was created by combining fantastic ideas, interesting arrangements, and follow the current trends in the field of that make you more inspired and give artistic touches. We'd be honored if you can apply some or all of these design in your wedding. believe me, brilliant ideas would be perfect if it can be applied in real and make the people around you amazed!
3 Picture Frames Photo Collage Frame V I S O N Eg Range was posted in October 12, 2018 at 2:46 pm. 3 Picture Frames Photo Collage Frame V I S O N Eg Range has viewed by 36 users. Click it and download the 3 Picture Frames Photo Collage Frame V I S O N Eg Range.
Picture Frames, 2 X 3 Picture Frames was posted March 3, 2016 at 11:06 pm by storybeader.us . More over 2 X 3 Picture Frames has viewed by 3239 visitor.
Picture Frames, 25 X 35 Picture Frames was posted August 3, 2018 at 9:52 pm by storybeader.us . More over 25 X 35 Picture Frames has viewed by 6675 visitor.
Picture Frames, 3×5 Picture Frames Bulk was posted September 15, 2016 at 7:04 am by storybeader.us . More over 3×5 Picture Frames Bulk has viewed by 6029 visitor.
Picture Frames, 3 5×7 Picture Frames was posted July 18, 2016 at 4:00 pm by storybeader.us . More over 3 5×7 Picture Frames has viewed by 7774 visitor.
Picture Frames, 3 Picture Frames was posted December 24, 2016 at 11:23 am by storybeader.us . More over 3 Picture Frames has viewed by 2414 visitor.
Picture Frames, 35 X 5 Picture Frames was posted September 9, 2017 at 2:58 am by storybeader.us . More over 35 X 5 Picture Frames has viewed by 4596 visitor.
Picture Frames, Picture Frames 13 X 19 was posted July 16, 2017 at 5:54 pm by storybeader.us . More over Picture Frames 13 X 19 has viewed by 2695 visitor.
Picture Frames, 10 By 13 Picture Frames was posted March 7, 2017 at 7:32 pm by storybeader.us . More over 10 By 13 Picture Frames has viewed by 4057 visitor.
Picture Frames, Walmart Picture Frames 24×36 was posted November 4, 2015 at 7:29 am by storybeader.us . More over Walmart Picture Frames 24×36 has viewed by 9287 visitor.
Picture Frames, 10×13 Picture Frames was posted January 8, 2018 at 12:25 pm by storybeader.us . More over 10×13 Picture Frames has viewed by 5475 visitor.


Ransomware has an outsized reputation as a security problem, and that's partly due to mystery. One reason the extent of the ransomware problem is hard to quantify is shame.
In his role running partner community and field marketing for SolarWinds MSP, Dave Sobel talks to a lot of managed services providers (MSPs) in person at shows.
"Just about every solution provider knows somebody who was affected by ransomware," Sobel says. "Everyone has a story. Either they've 'got a friend' or they are the 'friend.'"
In a mid-September public service announcement begging organizations to report ransomware incidents to law enforcement no matter the outcome, the U.S. Federal Bureau of Investigation went through a litany of reasons that companies stay quiet: "Victims may not report to law enforcement for a number of reasons, including concerns over not knowing where and to whom to report; not feeling their loss warrants law enforcement attention; concerns over privacy, business reputation, or regulatory data breach reporting requirements; or embarrassment. Additionally, those who resolve the issue internally either by paying the ransom or by restoring their files from backups may not feel a need to contact law enforcement."
Those who won't admit to ransomware attacks are in the overwhelming majority, according to "Datto's State of the Channel Ransomware Report 2016," a report released this fall based on a survey of 1,100 MSPs worldwide, but primarily in the United States, Canada, Australia and the United Kingdom. That report found that fewer than one in four respondents had reported ransomware attacks to authorities.
That piece of context makes U.S. authorities' ransomware figures that much more alarming. A U.S. government interagency technical guidance document for CIOs and CISOs said that an average of more than 4,000 ransomware attacks have occurred daily since Jan. 1, 2016. That's up 300 percent from 1,000 per day in 2015. Elsewhere, the FBI has been widely reported as saying it had received reports of total costs of mitigating ransomware at $209 million in the first three months of 2016 -- putting ransomware on track to generate nearly $1 billion in losses for the full year. That was a huge jump in damage estimates from the year before.
Datto's report showed small businesses getting hit hard. Nine out of 10 MSPs said they'd had recent attacks against small business clients, and about 40 percent of those had seen six or more attacks on clients in the last year. The CryptoLocker trojan was the most frequent culprit.
Regardless of whether they're telling authorities (the FBI requests reports at the Internet Crime Complaint Center, at IC3.gov), there's a fair amount of agreement on how to handle ransomware. While some organizations stockpile Bitcoin to be able to make payments in a pinch, the clear preference is to avoid infection in the first place through a combination of user training, which can be very effective; anti-spam tools, which can be less effective against spearphishing-style attacks; and regular security measures like keeping patches up-to-date, adhering to the principle of least privilege and application whitelisting.
A winning countermeasure is having solid backup and recovery and business continuity procedures in place should ransomware get through those other defenses. Last month, for example, Datto refreshed several products in its backup and recovery product line with what it calls ransomware protection -- technology to detect potential ransomware and allow MSPs to roll back to a last-known good configuration. The tools also work for backing up cloud products like Office 365, Google Apps and Dropbox, three applications that some of Datto's survey respondents noted had been hit by ransomware. Around the same time, Microsoft was plugging its Operations Management Suite and Azure Backup as solutions for ransomware woes.
Getting back to the Datto survey, a whopping 95 percent of respondent MSPs thought ransomware was becoming more frequent. It could be that things appear darkest before the dawn. More likely, as with most security ills, once a vector emerges, attackers never quit abusing it. The FBI recommends against paying the ransoms, even though they're usually less than $2,000, and most MSPs have figured out how to recover clients quickly using solid backup and recovery procedures.
As the hype settles down in the future, some see even successful ransomware infections becoming the technology equivalent of petty vandalism. Like a brick thrown through a storefront window with a ransom demand tied to it, the best approach is to ignore the demand, fix the window with reinforced glass, report the incident to police and insurance, and go on with your day.


RIP is a distance vector routing protocol that is suitable for small scale networks. It is a dynamic routing protocol that is very easy to configure.
Uses hop count as the only metric.
Each hop in the path is assigned a value of 1. When a routing advertisement is received for a destination network, the router adds 1 to the metric value specified in the advertisement and specifies the sender as the next-hop.
A directly connected network metric = 0.
Maximum hop count is 15.
Unreachable network metric = 16.
route update timer (30s) · Updates are sent every 30 seconds and when there are topology changes.
· Sends a complete copy of the routing table.
Invalid after timer (180s) · Length of time that must pass before concluding a route is invalid.
· By default, it's 180 seconds.
Hold down timer (180s) · This is the amount of time a route is suppressed.
· This occurs when an update is received for a particular route stating it is unreachable.
· This continues until the hold down timer expires or an update with a route for better metric is received.
· The default is 180 seconds.
Flushed after timer (240s) · This is the time between a route becoming invalid and its removal from the routing table.
· If there is still no update after 240 seconds, the receiving router removes all routing table entries for the neighbouring router that failed to send an update.
· The route flush timer must be greater than the value of route invalid timer.
· The default is 240 seconds.
!— Enables a RIP routing process and enters router configuration mode —!
!— Associates a network interface with a RIP routing process. RIP is a classful routing protocol. The network need to be followed by a classful IP address. For example, let's assume, the router interface Fa0/1 is configured with 10.10.10.1/24 subnet IPv4 address. Then the network statement would be "network 10.0.0.0" to enable advertising 10.10.10.0/24 and to include the interface Fa0/1 in the RIP routing process. —!
!— Exits router configuration mode and returns to privileged EXEC mode. —!
When you do not want to propagation of RIP messages out a particular interface we can use the passive-interface command to suppress the rip process on that interface.
!--- Stops propagation of RIP on the interface Fa0/0 ---!
Unlike RIPv1 uses multicast (224.0.0.9) updates.
!— Enters the Privileged EXEC mode —!
!— Enables RIPv2 routing on the router —!
!— Associates a network interface with a RIP routing process. RIP is a classful routing protocol. The network need to be followed by a classful IP address. For example, let's assume, the router Fa0/1 interface is configured with 10.10.10.1/24 subnet IPv4 address. Then the network statement would be "network 10.0.0.0" to enable advertising 10.10.10.0/24 and to include the interface Fa0/1 in the RIP routing process. —!


text:
MPR News From our outstate correspondents
Will the next oil boom be nano-sized?
Dan Gunderson February 15, 2012, 11:56 AM Feb 15, 2012
Electron microscope image of oil shale (Photo courtesy of Kalpana Katti)
The United States has massive deposits of petroleum locked in shale. Government estimates are there are two trillion barrels of oil, and perhaps 800 billion barrels could be recovered. That's about three times the oil reserves of Saudi Arabia.
The problem is finding an efficient way to get that petroleum out of the rock. It's a challenge that's frustrated scientists for decades.
Two North Dakota State University researchers are taking a different approach to the problem, and they believe the key to extracting oil from shale is in understanding the material at the nano scale.
Nano is breaking materials down to the molecular level and manipulating those tiny building blocks. Many nano materials are being studied and developed, but nature also creates nano materials.
Oil shale isn't really oil or shale. The rock is made up of very hard minerals like quartz and it contains a waxy organic substance called kerogen. The kerogen will naturally turn into oil after millions of years of exposure to heat and pressure in the earth.
If the kerogen can be extracted from the rock it can be refined into crude oil. Most efforts to extract kerogen involve heating the rock until the kerogen vaporizes. The problem is that process uses more energy than is recovers.
Oil shale sample from 500 feet below the surface (Courtesy of Kalpana Katti)
The husband wife team of Kalpana and Dinesh Katti are taking a different approach.
Dinesh Katti is a civil engineering professor at NDSU who works with molecular computer modeling.
Kalpana Katti is a distinguished professor in the Civil Engineering Department who studies nano scale materials. She essentially takes things apart and rebuilds them at the molecular level. A couple of years ago she started looking at oil shale and discovered the kerogen in the rock is nano sized. At 10 to 20 nanometers it's a little smaller than a virus.
"Nanometer kerogen was a huge surprise, said Kalpana Katti. "That was not in the scientific literature, that was a very wow moment."
"That changes the whole thing," adds Dinesh Katti.
And here's why. Researchers are increasingly understanding that at the nano scale, materials have different properties.
In the case of oil shale, it means the nanoscale kerogen bonds with the minerals in the rock. That's why it's so difficult to remove.
The Kattis discovered different characteristics in different locations on the kerogen molecules. It's like a ball with velcro in one spot, a magnet in another. Different things will stick to each spot. So each Kerogen molecule could have attraction to nearly a dozen different minerals.
"If we can get a good understanding of the energy connection between the kerogen and the minerals, we might be able to get in between with some other molecules," said Dinesh Katti.
The Kattis plan to use computer modeling to find the best way to break the bonds between kerogen and minerals, freeing the petroleum from the rock.
They say the solution needs to be cost effective and environmentally friendly. It could be an enzyme, or a chemical, or a combination.
Dinesh Katti offers an over simplified analogy. "If you have a pan with food dried on it's very difficult to clean. But soak it in water and the dried food is easily removed."
The next big step is looking to pharmaceutical and biomedical research for molecules that might break the bonds between kerogen and minerals.
They'll run computer simulations to identify the best options, and test those in the lab.
Kalpana Katti said it won't be easy or quick because of the complex interactions happening at the nano scale.
Their research hasn't received much funding, just a $150,000 Department of Energy seed grant that helped buy some new lab equipment.
But Dinesh and Kalpana Katti both say they are very confident the nano scale is the right place to solve a problem that has stymied researchers for decades.
"Of course you never a guarantee a solution will happen, but based on what we have learned I have a high degree of optimism," Dinesh Katti said. "We might find the best way, or maybe somebody else will use our research to find the answer."
‹ Older Mayo loses whistleblower case, frac sand road repairs, income disparity
Newer › Santorum finds friends in Fargo, Chippewa band settle dispute from 1800s
Browse by category Escape Route Minnesota Sounds & Voices Get Out There MN Made State Fair Minnesota Scenes "Fargo"
Dan Gunderson
dgunderson@mpr.org
Goose antibodies that can save puppies
State Fair University: How to walk in Antarctica
Mayo gets $3 million to study cells tied to aging
Glenn Vawter
Interesting concept. One flaw I notices is that oil shale produces more energy that it takes to produce it through retorting (heating). This has been demonstrated by independent researchers many times.
The process does not take more energy than it produces. There are many myths like this about oil shale. The web site http://www.oilshaleassoc.org contains factual information about the resource. Good luck with the nano research. We always need new ideas and ways to unlock our domestic energy resources.

redpajama_set_name: RedPajamaCommonCrawl


text:
/**********
This library is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 3 of the License, or (at your
option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)

This library is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
more details.

You should have received a copy of the GNU Lesser General Public License
along with this library; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
**********/
// "liveMedia"
// Copyright (c) 1996-2017 Live Networks, Inc.  All rights reserved.
// A subclass of "ServerMediaSession" that can be used to create a (unicast) RTSP servers that acts as a 'proxy' for
// another (unicast or multicast) RTSP/RTP stream.
// Implementation

#include "liveMedia.hh"
#include "RTSPCommon.hh"
#include "GroupsockHelper.hh" // for "our_random()"

#ifndef MILLION
#define MILLION 1000000
#endif

// A "OnDemandServerMediaSubsession" subclass, used to implement a unicast RTSP server that's proxying another RTSP stream:

class ProxyServerMediaSubsession: public OnDemandServerMediaSubsession {
public:
  ProxyServerMediaSubsession(MediaSubsession& mediaSubsession,
			     portNumBits initialPortNum, Boolean multiplexRTCPWithRTP);
  virtual ~ProxyServerMediaSubsession();

  char const* codecName() const { return fCodecName; }
  char const* url() const { return ((ProxyServerMediaSession*)fParentSession)->url(); }

private: // redefined virtual functions
  virtual FramedSource* createNewStreamSource(unsigned clientSessionId,
                                              unsigned& estBitrate);
  virtual void closeStreamSource(FramedSource *inputSource);
  virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock,
                                    unsigned char rtpPayloadTypeIfDynamic,
                                    FramedSource* inputSource);
  virtual Groupsock* createGroupsock(struct in_addr const& addr, Port port);
  virtual RTCPInstance* createRTCP(Groupsock* RTCPgs, unsigned totSessionBW, /* in kbps */
				   unsigned char const* cname, RTPSink* sink);

private:
  static void subsessionByeHandler(void* clientData);
  void subsessionByeHandler();

  int verbosityLevel() const { return ((ProxyServerMediaSession*)fParentSession)->fVerbosityLevel; }

private:
  friend class ProxyRTSPClient;
  MediaSubsession& fClientMediaSubsession; // the 'client' media subsession object that corresponds to this 'server' media subsession
  char const* fCodecName;  // copied from "fClientMediaSubsession" once it's been set up
  ProxyServerMediaSubsession* fNext; // used when we're part of a queue
  Boolean fHaveSetupStream;
};

////////// ProxyServerMediaSession implementation //////////

UsageEnvironment& operator<<(UsageEnvironment& env, const ProxyServerMediaSession& psms) { // used for debugging
  return env << "ProxyServerMediaSession[" << psms.url() << "]";
}

ProxyRTSPClient*
defaultCreateNewProxyRTSPClientFunc(ProxyServerMediaSession& ourServerMediaSession,
				    char const* rtspURL,
				    char const* username, char const* password,
				    portNumBits tunnelOverHTTPPortNum, int verbosityLevel,
				    int socketNumToServer) {
  return new ProxyRTSPClient(ourServerMediaSession, rtspURL, username, password,
			     tunnelOverHTTPPortNum, verbosityLevel, socketNumToServer);
}

ProxyServerMediaSession* ProxyServerMediaSession
::createNew(UsageEnvironment& env, GenericMediaServer* ourMediaServer,
	    char const* inputStreamURL, char const* streamName,
	    char const* username, char const* password,
	    portNumBits tunnelOverHTTPPortNum, int verbosityLevel, int socketNumToServer,
	    MediaTranscodingTable* transcodingTable) {
  return new ProxyServerMediaSession(env, ourMediaServer, inputStreamURL, streamName, username, password,
				     tunnelOverHTTPPortNum, verbosityLevel, socketNumToServer,
				     transcodingTable);
}

ProxyServerMediaSession
::ProxyServerMediaSession(UsageEnvironment& env, GenericMediaServer* ourMediaServer,
			  char const* inputStreamURL, char const* streamName,
			  char const* username, char const* password,
			  portNumBits tunnelOverHTTPPortNum, int verbosityLevel,
			  int socketNumToServer,
			  MediaTranscodingTable* transcodingTable,
			  createNewProxyRTSPClientFunc* ourCreateNewProxyRTSPClientFunc,
			  portNumBits initialPortNum, Boolean multiplexRTCPWithRTP)
  : ServerMediaSession(env, streamName, NULL, NULL, False, NULL),
    describeCompletedFlag(0), fOurMediaServer(ourMediaServer), fClientMediaSession(NULL),
    fVerbosityLevel(verbosityLevel),
    fPresentationTimeSessionNormalizer(new PresentationTimeSessionNormalizer(envir())),
    fCreateNewProxyRTSPClientFunc(ourCreateNewProxyRTSPClientFunc),
    fTranscodingTable(transcodingTable),
    fInitialPortNum(initialPortNum), fMultiplexRTCPWithRTP(multiplexRTCPWithRTP) {
  // Open a RTSP connection to the input stream, and send a "DESCRIBE" command.
  // We'll use the SDP description in the response to set ourselves up.
  fProxyRTSPClient
    = (*fCreateNewProxyRTSPClientFunc)(*this, inputStreamURL, username, password,
				       tunnelOverHTTPPortNum,
				       verbosityLevel > 0 ? verbosityLevel-1 : verbosityLevel,
				       socketNumToServer);
  ProxyRTSPClient::sendDESCRIBE(fProxyRTSPClient);
}

ProxyServerMediaSession::~ProxyServerMediaSession() {
  if (fVerbosityLevel > 0) {
    envir() << *this << "::~ProxyServerMediaSession()\n";
  }

  // Begin by sending a "TEARDOWN" command (without checking for a response):
  if (fProxyRTSPClient != NULL && fClientMediaSession != NULL) {
    fProxyRTSPClient->sendTeardownCommand(*fClientMediaSession, NULL, fProxyRTSPClient->auth());
  }

  // Then delete our state:
  Medium::close(fClientMediaSession);
  Medium::close(fProxyRTSPClient);
  Medium::close(fPresentationTimeSessionNormalizer);
}

char const* ProxyServerMediaSession::url() const {
  return fProxyRTSPClient == NULL ? NULL : fProxyRTSPClient->url();
}

Groupsock* ProxyServerMediaSession::createGroupsock(struct in_addr const& addr, Port port) {
  // Default implementation; may be redefined by subclasses:
  return new Groupsock(envir(), addr, port, 255);
}

RTCPInstance* ProxyServerMediaSession
::createRTCP(Groupsock* RTCPgs, unsigned totSessionBW, /* in kbps */
	     unsigned char const* cname, RTPSink* sink) {
  // Default implementation; may be redefined by subclasses:
  return RTCPInstance::createNew(envir(), RTCPgs, totSessionBW, cname, sink, NULL/*we're a server*/);
}

Boolean ProxyServerMediaSession::allowProxyingForSubsession(MediaSubsession const& /*mss*/) {
  // Default implementation
  return True;
}

void ProxyServerMediaSession::continueAfterDESCRIBE(char const* sdpDescription) {
  describeCompletedFlag = 1;

  // Create a (client) "MediaSession" object from the stream's SDP description ("resultString"), then iterate through its
  // "MediaSubsession" objects, to set up corresponding "ServerMediaSubsession" objects that we'll use to serve the stream's tracks.
  do {
    fClientMediaSession = MediaSession::createNew(envir(), sdpDescription);
    if (fClientMediaSession == NULL) break;

    MediaSubsessionIterator iter(*fClientMediaSession);
    for (MediaSubsession* mss = iter.next(); mss != NULL; mss = iter.next()) {
      if (!allowProxyingForSubsession(*mss)) continue;

      ServerMediaSubsession* smss
	= new ProxyServerMediaSubsession(*mss, fInitialPortNum, fMultiplexRTCPWithRTP);
      addSubsession(smss);
      if (fVerbosityLevel > 0) {
	envir() << *this << " added new \"ProxyServerMediaSubsession\" for "
		<< mss->protocolName() << "/" << mss->mediumName() << "/" << mss->codecName() << " track\n";
      }
    }
  } while (0);
}

void ProxyServerMediaSession::resetDESCRIBEState() {
  // Delete all of our "ProxyServerMediaSubsession"s; they'll get set up again once we get a response to the new "DESCRIBE".
  if (fOurMediaServer != NULL) {
    // First, close any client connections that may have already been set up:
    fOurMediaServer->closeAllClientSessionsForServerMediaSession(this);
  }
  deleteAllSubsessions();

  // Finally, delete the client "MediaSession" object that we had set up after receiving the response to the previous "DESCRIBE":
  Medium::close(fClientMediaSession); fClientMediaSession = NULL;
}

///////// RTSP 'response handlers' //////////

static void continueAfterDESCRIBE(RTSPClient* rtspClient, int resultCode, char* resultString) {
  char const* res;

  if (resultCode == 0) {
    // The "DESCRIBE" command succeeded, so "resultString" should be the stream's SDP description.
    res = resultString;
  } else {
    // The "DESCRIBE" command failed.
    res = NULL;
  }
  ((ProxyRTSPClient*)rtspClient)->continueAfterDESCRIBE(res);
  delete[] resultString;
}

static void continueAfterSETUP(RTSPClient* rtspClient, int resultCode, char* resultString) {
  ((ProxyRTSPClient*)rtspClient)->continueAfterSETUP(resultCode);
  delete[] resultString;
}

static void continueAfterPLAY(RTSPClient* rtspClient, int resultCode, char* resultString) {
  ((ProxyRTSPClient*)rtspClient)->continueAfterPLAY(resultCode);
  delete[] resultString;
}

static void continueAfterOPTIONS(RTSPClient* rtspClient, int resultCode, char* resultString) {
  Boolean serverSupportsGetParameter = False;
  if (resultCode == 0) {
    // Note whether the server told us that it supports the "GET_PARAMETER" command:
    serverSupportsGetParameter = RTSPOptionIsSupported("GET_PARAMETER", resultString);
  }
  ((ProxyRTSPClient*)rtspClient)->continueAfterLivenessCommand(resultCode, serverSupportsGetParameter);
  delete[] resultString;
}

#ifdef SEND_GET_PARAMETER_IF_SUPPORTED
static void continueAfterGET_PARAMETER(RTSPClient* rtspClient, int resultCode, char* resultString) {
  ((ProxyRTSPClient*)rtspClient)->continueAfterLivenessCommand(resultCode, True);
  delete[] resultString;
}
#endif

////////// "ProxyRTSPClient" implementation /////////

UsageEnvironment& operator<<(UsageEnvironment& env, const ProxyRTSPClient& proxyRTSPClient) { // used for debugging
  return env << "ProxyRTSPClient[" << proxyRTSPClient.url() << "]";
}

ProxyRTSPClient::ProxyRTSPClient(ProxyServerMediaSession& ourServerMediaSession, char const* rtspURL,
				 char const* username, char const* password,
				 portNumBits tunnelOverHTTPPortNum, int verbosityLevel, int socketNumToServer)
  : RTSPClient(ourServerMediaSession.envir(), rtspURL, verbosityLevel, "ProxyRTSPClient",
	       tunnelOverHTTPPortNum == (portNumBits)(~0) ? 0 : tunnelOverHTTPPortNum, socketNumToServer),
    fOurServerMediaSession(ourServerMediaSession), fOurURL(strDup(rtspURL)), fStreamRTPOverTCP(tunnelOverHTTPPortNum != 0),
    fSetupQueueHead(NULL), fSetupQueueTail(NULL), fNumSetupsDone(0), fNextDESCRIBEDelay(1),
    fServerSupportsGetParameter(False), fLastCommandWasPLAY(False), fDoneDESCRIBE(False),
    fLivenessCommandTask(NULL), fDESCRIBECommandTask(NULL), fSubsessionTimerTask(NULL), fResetTask(NULL) {
  if (username != NULL && password != NULL) {
    fOurAuthenticator = new Authenticator(username, password);
  } else {
    fOurAuthenticator = NULL;
  }
}

void ProxyRTSPClient::reset() {
  envir().taskScheduler().unscheduleDelayedTask(fLivenessCommandTask); fLivenessCommandTask = NULL;
  envir().taskScheduler().unscheduleDelayedTask(fDESCRIBECommandTask); fDESCRIBECommandTask = NULL;
  envir().taskScheduler().unscheduleDelayedTask(fSubsessionTimerTask); fSubsessionTimerTask = NULL;
  envir().taskScheduler().unscheduleDelayedTask(fResetTask); fResetTask = NULL;

  fSetupQueueHead = fSetupQueueTail = NULL;
  fNumSetupsDone = 0;
  fNextDESCRIBEDelay = 1;
  fLastCommandWasPLAY = False;
  fDoneDESCRIBE = False;

  RTSPClient::reset();
}

ProxyRTSPClient::~ProxyRTSPClient() {
  reset();

  delete fOurAuthenticator;
  delete[] fOurURL;
}

int ProxyRTSPClient::connectToServer(int socketNum, portNumBits remotePortNum) {
  int res;
  res = RTSPClient::connectToServer(socketNum, remotePortNum);

  if (res == 0 && fDoneDESCRIBE && fStreamRTPOverTCP) {
    if (fVerbosityLevel > 0) {
      envir() << "ProxyRTSPClient::connectToServer calling scheduleReset()\n";
    }
    scheduleReset();
  }

  return res;
}

void ProxyRTSPClient::continueAfterDESCRIBE(char const* sdpDescription) {
  if (sdpDescription != NULL) {
    fOurServerMediaSession.continueAfterDESCRIBE(sdpDescription);

    // Unlike most RTSP streams, there might be a long delay between this "DESCRIBE" command (to the downstream server) and the
    // subsequent "SETUP"/"PLAY" - which doesn't occur until the first time that a client requests the stream.
    // To prevent the proxied connection (between us and the downstream server) from timing out, we send periodic 'liveness'
    // ("OPTIONS" or "GET_PARAMETER") commands.  (The usual RTCP liveness mechanism wouldn't work here, because RTCP packets
    // don't get sent until after the "PLAY" command.)
    scheduleLivenessCommand();
  } else {
    // The "DESCRIBE" command failed, most likely because the server or the stream is not yet running.
    // Reschedule another "DESCRIBE" command to take place later:
    scheduleDESCRIBECommand();
  }
  fDoneDESCRIBE = True;
}

void ProxyRTSPClient::continueAfterLivenessCommand(int resultCode, Boolean serverSupportsGetParameter) {
  if (resultCode != 0) {
    // The periodic 'liveness' command failed, suggesting that the back-end stream is no longer alive.
    // We handle this by resetting our connection state with this server.  Any current clients will be closed, but
    // subsequent clients will cause new RTSP "SETUP"s and "PLAY"s to get done, restarting the stream.
    // Then continue by sending more "DESCRIBE" commands, to try to restore the stream.

    fServerSupportsGetParameter = False; // until we learn otherwise, in response to a future "OPTIONS" command

    if (resultCode < 0) {
      // The 'liveness' command failed without getting a response from the server (otherwise "resultCode" would have been > 0).
      // This suggests that the RTSP connection itself has failed.  Print this error code, in case it's useful for debugging:
      if (fVerbosityLevel > 0) {
	envir() << *this << ": lost connection to server ('errno': " << -resultCode << ").  Scheduling reset...\n";
      }
    }

    scheduleReset();
    return;
  }

  fServerSupportsGetParameter = serverSupportsGetParameter;

  // Schedule the next 'liveness' command (i.e., to tell the back-end server that we're still alive):
  scheduleLivenessCommand();
}

#define SUBSESSION_TIMEOUT_SECONDS 5 // how many seconds to wait for the last track's "SETUP" to be done (note below)

void ProxyRTSPClient::continueAfterSETUP(int resultCode) {
  if (resultCode != 0) {
    // The "SETUP" command failed, so arrange to reset the state. (We don't do this now, because it deletes the
    // "ProxyServerMediaSubsession", and we can't do that during "ProxyServerMediaSubsession::createNewStreamSource()".)
    scheduleReset();
    return;
  }

  if (fVerbosityLevel > 0) {
    envir() << *this << "::continueAfterSETUP(): head codec: " << fSetupQueueHead->codecName()
	    << "; numSubsessions " << fSetupQueueHead->fParentSession->numSubsessions() << "\n\tqueue:";
    for (ProxyServerMediaSubsession* p = fSetupQueueHead; p != NULL; p = p->fNext) {
      envir() << "\t" << p->codecName();
    }
    envir() << "\n";
  }
  envir().taskScheduler().unscheduleDelayedTask(fSubsessionTimerTask); // in case it had been set

  // Dequeue the first "ProxyServerMediaSubsession" from our 'SETUP queue'.  It will be the one for which this "SETUP" was done:
  ProxyServerMediaSubsession* smss = fSetupQueueHead; // Assert: != NULL
  fSetupQueueHead = fSetupQueueHead->fNext;
  if (fSetupQueueHead == NULL) fSetupQueueTail = NULL;

  if (fSetupQueueHead != NULL) {
    // There are still entries in the queue, for tracks for which we have still to do a "SETUP".
    // "SETUP" the first of these now:
    sendSetupCommand(fSetupQueueHead->fClientMediaSubsession, ::continueAfterSETUP,
		     False, fStreamRTPOverTCP, False, fOurAuthenticator);
    ++fNumSetupsDone;
    fSetupQueueHead->fHaveSetupStream = True;
  } else {
    if (fNumSetupsDone >= smss->fParentSession->numSubsessions()) {
      // We've now finished setting up each of our subsessions (i.e., 'tracks').
      // Continue by sending a "PLAY" command (an 'aggregate' "PLAY" command, on the whole session):
      sendPlayCommand(smss->fClientMediaSubsession.parentSession(), ::continueAfterPLAY, -1.0f, -1.0f, 1.0f, fOurAuthenticator);
          // the "-1.0f" "start" parameter causes the "PLAY" to be sent without a "Range:" header, in case we'd already done
          // a "PLAY" before (as a result of a 'subsession timeout' (note below))
      fLastCommandWasPLAY = True;
    } else {
      // Some of this session's subsessions (i.e., 'tracks') remain to be "SETUP".  They might get "SETUP" very soon, but it's
      // also possible - if the remote client chose to play only some of the session's tracks - that they might not.
      // To allow for this possibility, we set a timer.  If the timer expires without the remaining subsessions getting "SETUP",
      // then we send a "PLAY" command anyway:
      fSubsessionTimerTask
	= envir().taskScheduler().scheduleDelayedTask(SUBSESSION_TIMEOUT_SECONDS*MILLION, (TaskFunc*)subsessionTimeout, this);
    }
  }
}

void ProxyRTSPClient::continueAfterPLAY(int resultCode) {
  if (resultCode != 0) {
    // The "PLAY" command failed, so arrange to reset the state. (We don't do this now, because it deletes the
    // "ProxyServerMediaSubsession", and we can't do that during "ProxyServerMediaSubsession::createNewStreamSource()".)
    scheduleReset();
    return;
  }
}

void ProxyRTSPClient::scheduleLivenessCommand() {
  // Delay a random time before sending another 'liveness' command.
  unsigned delayMax = sessionTimeoutParameter(); // if the server specified a maximum time between 'liveness' probes, then use that
  if (delayMax == 0) {
    delayMax = 60;
  }

  // Choose a random time from [delayMax/2,delayMax-1) seconds:
  unsigned const us_1stPart = delayMax*500000;
  unsigned uSecondsToDelay;
  if (us_1stPart <= 1000000) {
    uSecondsToDelay = us_1stPart;
  } else {
    unsigned const us_2ndPart = us_1stPart-1000000;
    uSecondsToDelay = us_1stPart + (us_2ndPart*our_random())%us_2ndPart;
  }
  fLivenessCommandTask = envir().taskScheduler().scheduleDelayedTask(uSecondsToDelay, sendLivenessCommand, this);
}

void ProxyRTSPClient::sendLivenessCommand(void* clientData) {
  ProxyRTSPClient* rtspClient = (ProxyRTSPClient*)clientData;

  // Note.  By default, we do not send "GET_PARAMETER" as our 'liveness notification' command, even if the server previously
  // indicated (in its response to our earlier "OPTIONS" command) that it supported "GET_PARAMETER".  This is because
  // "GET_PARAMETER" crashes some camera servers (even though they claimed to support "GET_PARAMETER").
#ifdef SEND_GET_PARAMETER_IF_SUPPORTED
  MediaSession* sess = rtspClient->fOurServerMediaSession.fClientMediaSession;

  if (rtspClient->fServerSupportsGetParameter && rtspClient->fNumSetupsDone > 0 && sess != NULL) {
    rtspClient->sendGetParameterCommand(*sess, ::continueAfterGET_PARAMETER, "", rtspClient->auth());
  } else {
#endif
    rtspClient->sendOptionsCommand(::continueAfterOPTIONS, rtspClient->auth());
#ifdef SEND_GET_PARAMETER_IF_SUPPORTED
  }
#endif
}

void ProxyRTSPClient::scheduleReset() {
  if (fVerbosityLevel > 0) {
    envir() << "ProxyRTSPClient::scheduleReset\n";
  }
  envir().taskScheduler().rescheduleDelayedTask(fResetTask, 0, doReset, this);
}

void ProxyRTSPClient::doReset() {
  if (fVerbosityLevel > 0) {
    envir() << *this << "::doReset\n";
  }

  reset();
  fOurServerMediaSession.resetDESCRIBEState();

  setBaseURL(fOurURL); // because we'll be sending an initial "DESCRIBE" all over again
  sendDESCRIBE(this);
}

void ProxyRTSPClient::doReset(void* clientData) {
  ProxyRTSPClient* rtspClient = (ProxyRTSPClient*)clientData;
  rtspClient->doReset();
}

void ProxyRTSPClient::scheduleDESCRIBECommand() {
  // Delay 1s, 2s, 4s, 8s ... 256s until sending the next "DESCRIBE".  Then, keep delaying a random time from [256..511] seconds:
  unsigned secondsToDelay;
  if (fNextDESCRIBEDelay <= 256) {
    secondsToDelay = fNextDESCRIBEDelay;
    fNextDESCRIBEDelay *= 2;
  } else {
    secondsToDelay = 256 + (our_random()&0xFF); // [256..511] seconds
  }

  if (fVerbosityLevel > 0) {
    envir() << *this << ": RTSP \"DESCRIBE\" command failed; trying again in " << secondsToDelay << " seconds\n";
  }
  fDESCRIBECommandTask = envir().taskScheduler().scheduleDelayedTask(secondsToDelay*MILLION, sendDESCRIBE, this);
}

void ProxyRTSPClient::sendDESCRIBE(void* clientData) {
  ProxyRTSPClient* rtspClient = (ProxyRTSPClient*)clientData;
  if (rtspClient != NULL) rtspClient->sendDescribeCommand(::continueAfterDESCRIBE, rtspClient->auth());
}

void ProxyRTSPClient::subsessionTimeout(void* clientData) {
  ((ProxyRTSPClient*)clientData)->handleSubsessionTimeout();
}

void ProxyRTSPClient::handleSubsessionTimeout() {
  // We still have one or more subsessions ('tracks') left to "SETUP".  But we can't wait any longer for them.  Send a "PLAY" now:
  MediaSession* sess = fOurServerMediaSession.fClientMediaSession;
  if (sess != NULL) sendPlayCommand(*sess, ::continueAfterPLAY, -1.0f, -1.0f, 1.0f, fOurAuthenticator);
  fLastCommandWasPLAY = True;
}

//////// "ProxyServerMediaSubsession" implementation //////////

ProxyServerMediaSubsession
::ProxyServerMediaSubsession(MediaSubsession& mediaSubsession,
			     portNumBits initialPortNum, Boolean multiplexRTCPWithRTP)
  : OnDemandServerMediaSubsession(mediaSubsession.parentSession().envir(), True/*reuseFirstSource*/,
				  initialPortNum, multiplexRTCPWithRTP),
    fClientMediaSubsession(mediaSubsession), fCodecName(strDup(mediaSubsession.codecName())),
    fNext(NULL), fHaveSetupStream(False) {
}

UsageEnvironment& operator<<(UsageEnvironment& env, const ProxyServerMediaSubsession& psmss) { // used for debugging
  return env << "ProxyServerMediaSubsession[" << psmss.url() << "," << psmss.codecName() << "]";
}

ProxyServerMediaSubsession::~ProxyServerMediaSubsession() {
  if (verbosityLevel() > 0) {
    envir() << *this << "::~ProxyServerMediaSubsession()\n";
  }

  delete[] (char*)fCodecName;
}

FramedSource* ProxyServerMediaSubsession::createNewStreamSource(unsigned clientSessionId, unsigned& estBitrate) {
  ProxyServerMediaSession* const sms = (ProxyServerMediaSession*)fParentSession;

  if (verbosityLevel() > 0) {
    envir() << *this << "::createNewStreamSource(session id " << clientSessionId << ")\n";
  }

  // If we haven't yet created a data source from our 'media subsession' object, initiate() it to do so:
  if (fClientMediaSubsession.readSource() == NULL) {
    if (sms->fTranscodingTable == NULL || !sms->fTranscodingTable->weWillTranscode("audio", "MPA-ROBUST")) fClientMediaSubsession.receiveRawMP3ADUs(); // hack for proxying MPA-ROBUST streams
    if (sms->fTranscodingTable == NULL || !sms->fTranscodingTable->weWillTranscode("video", "JPEG")) fClientMediaSubsession.receiveRawJPEGFrames(); // hack for proxying JPEG/RTP streams.
    fClientMediaSubsession.initiate();
    if (verbosityLevel() > 0) {
      envir() << "\tInitiated: " << *this << "\n";
    }

    if (fClientMediaSubsession.readSource() != NULL) {
      // First, check whether we have defined a 'transcoder' filter to be used with this codec:
      if (sms->fTranscodingTable != NULL) {
	char* outputCodecName;
	FramedFilter* transcoder
	  = sms->fTranscodingTable->lookupTranscoder(fClientMediaSubsession, outputCodecName);
	if (transcoder != NULL) {
	  fClientMediaSubsession.addFilter(transcoder);
	  delete[] (char*)fCodecName; fCodecName = outputCodecName;
	}
      }

      // Then, add to the front of all data sources a filter that will 'normalize' their frames'
      // presentation times, before the frames get re-transmitted by our server:
      FramedFilter* normalizerFilter = sms->fPresentationTimeSessionNormalizer
	->createNewPresentationTimeSubsessionNormalizer(fClientMediaSubsession.readSource(),
							fClientMediaSubsession.rtpSource(),
							fCodecName);
      fClientMediaSubsession.addFilter(normalizerFilter);

      // Some data sources require a 'framer' object to be added, before they can be fed into
      // a "RTPSink".  Adjust for this now:
      if (strcmp(fCodecName, "H264") == 0) {
	fClientMediaSubsession.addFilter(H264VideoStreamDiscreteFramer
					 ::createNew(envir(), fClientMediaSubsession.readSource()));
      } else if (strcmp(fCodecName, "H265") == 0) {
	fClientMediaSubsession.addFilter(H265VideoStreamDiscreteFramer
					 ::createNew(envir(), fClientMediaSubsession.readSource()));
      } else if (strcmp(fCodecName, "MP4V-ES") == 0) {
	fClientMediaSubsession.addFilter(MPEG4VideoStreamDiscreteFramer
					 ::createNew(envir(), fClientMediaSubsession.readSource(),
						     True/* leave PTs unmodified*/));
      } else if (strcmp(fCodecName, "MPV") == 0) {
	fClientMediaSubsession.addFilter(MPEG1or2VideoStreamDiscreteFramer
					 ::createNew(envir(), fClientMediaSubsession.readSource(),
						     False, 5.0, True/* leave PTs unmodified*/));
      } else if (strcmp(fCodecName, "DV") == 0) {
	fClientMediaSubsession.addFilter(DVVideoStreamFramer
					 ::createNew(envir(), fClientMediaSubsession.readSource(),
						     False, True/* leave PTs unmodified*/));
      }
    }

    if (fClientMediaSubsession.rtcpInstance() != NULL) {
      fClientMediaSubsession.rtcpInstance()->setByeHandler(subsessionByeHandler, this);
    }
  }

  ProxyRTSPClient* const proxyRTSPClient = sms->fProxyRTSPClient;
  if (clientSessionId != 0) {
    // We're being called as a result of implementing a RTSP "SETUP".
    if (!fHaveSetupStream) {
      // This is our first "SETUP".  Send RTSP "SETUP" and later "PLAY" commands to the proxied server, to start streaming:
      // (Before sending "SETUP", enqueue ourselves on the "RTSPClient"s 'SETUP queue', so we'll be able to get the correct
      //  "ProxyServerMediaSubsession" to handle the response.  (Note that responses come back in the same order as requests.))
      Boolean queueWasEmpty = proxyRTSPClient->fSetupQueueHead == NULL;
      if (queueWasEmpty) {
	proxyRTSPClient->fSetupQueueHead = this;
	proxyRTSPClient->fSetupQueueTail = this;
      } else {
	// Add ourself to the "RTSPClient"s 'SETUP queue' (if we're not already on it):
	ProxyServerMediaSubsession* psms;
	for (psms = proxyRTSPClient->fSetupQueueHead; psms != NULL; psms = psms->fNext) {
	  if (psms == this) break;
	}
	if (psms == NULL) {
	    proxyRTSPClient->fSetupQueueTail->fNext = this;
	    proxyRTSPClient->fSetupQueueTail = this;
	}
      }

      // Hack: If there's already a pending "SETUP" request, don't send this track's "SETUP" right away, because
      // the server might not properly handle 'pipelined' requests.  Instead, wait until after previous "SETUP" responses come back.
      if (queueWasEmpty) {
	proxyRTSPClient->sendSetupCommand(fClientMediaSubsession, ::continueAfterSETUP,
					  False, proxyRTSPClient->fStreamRTPOverTCP, False, proxyRTSPClient->auth());
	++proxyRTSPClient->fNumSetupsDone;
	fHaveSetupStream = True;
      }
    } else {
      // This is a "SETUP" from a new client.  We know that there are no other currently active clients (otherwise we wouldn't
      // have been called here), so we know that the substream was previously "PAUSE"d.  Send "PLAY" downstream once again,
      // to resume the stream:
      if (!proxyRTSPClient->fLastCommandWasPLAY) { // so that we send only one "PLAY"; not one for each subsession
	proxyRTSPClient->sendPlayCommand(fClientMediaSubsession.parentSession(), ::continueAfterPLAY, -1.0f/*resume from previous point*/,
					 -1.0f, 1.0f, proxyRTSPClient->auth());
	proxyRTSPClient->fLastCommandWasPLAY = True;
      }
    }
  }

  estBitrate = fClientMediaSubsession.bandwidth();
  if (estBitrate == 0) estBitrate = 50; // kbps, estimate
  return fClientMediaSubsession.readSource();
}

void ProxyServerMediaSubsession::closeStreamSource(FramedSource* inputSource) {
  if (verbosityLevel() > 0) {
    envir() << *this << "::closeStreamSource()\n";
  }
  // Because there's only one input source for this 'subsession' (regardless of how many downstream clients are proxying it),
  // we don't close the input source here.  (Instead, we wait until *this* object gets deleted.)
  // However, because (as evidenced by this function having been called) we no longer have any clients accessing the stream,
  // then we "PAUSE" the downstream proxied stream, until a new client arrives:
  if (fHaveSetupStream) {
    ProxyServerMediaSession* const sms = (ProxyServerMediaSession*)fParentSession;
    ProxyRTSPClient* const proxyRTSPClient = sms->fProxyRTSPClient;
    if (proxyRTSPClient->fLastCommandWasPLAY) { // so that we send only one "PAUSE"; not one for each subsession
      if (fParentSession->referenceCount() > 1) {
	// There are other client(s) still streaming other subsessions of this stream.
	// Therefore, we don't send a "PAUSE" for the whole stream, but only for the sub-stream:
	proxyRTSPClient->sendPauseCommand(fClientMediaSubsession, NULL, proxyRTSPClient->auth());
      } else {
	// Normal case: There are no other client still streaming (parts of) this stream.
	// Send a "PAUSE" for the whole stream.
	proxyRTSPClient->sendPauseCommand(fClientMediaSubsession.parentSession(), NULL, proxyRTSPClient->auth());
	proxyRTSPClient->fLastCommandWasPLAY = False;
      }
    }
  }
}

RTPSink* ProxyServerMediaSubsession
::createNewRTPSink(Groupsock* rtpGroupsock, unsigned char rtpPayloadTypeIfDynamic, FramedSource* inputSource) {
  if (verbosityLevel() > 0) {
    envir() << *this << "::createNewRTPSink()\n";
  }

  // Create (and return) the appropriate "RTPSink" object for our codec:
  // (Note: The configuration string might not be correct if a transcoder is used. FIX!) #####
  RTPSink* newSink;
  if (strcmp(fCodecName, "AC3") == 0 || strcmp(fCodecName, "EAC3") == 0) {
    newSink = AC3AudioRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic,
					 fClientMediaSubsession.rtpTimestampFrequency());
#if 0 // This code does not work; do *not* enable it:
  } else if (strcmp(fCodecName, "AMR") == 0 || strcmp(fCodecName, "AMR-WB") == 0) {
    Boolean isWideband = strcmp(fCodecName, "AMR-WB") == 0;
    newSink = AMRAudioRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic,
					 isWideband, fClientMediaSubsession.numChannels());
#endif
  } else if (strcmp(fCodecName, "DV") == 0) {
    newSink = DVVideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic);
  } else if (strcmp(fCodecName, "GSM") == 0) {
    newSink = GSMAudioRTPSink::createNew(envir(), rtpGroupsock);
  } else if (strcmp(fCodecName, "H263-1998") == 0 || strcmp(fCodecName, "H263-2000") == 0) {
    newSink = H263plusVideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic,
					      fClientMediaSubsession.rtpTimestampFrequency());
  } else if (strcmp(fCodecName, "H264") == 0) {
    newSink = H264VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic,
					  fClientMediaSubsession.fmtp_spropparametersets());
  } else if (strcmp(fCodecName, "H265") == 0) {
    newSink = H265VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic,
					  fClientMediaSubsession.fmtp_spropvps(),
					  fClientMediaSubsession.fmtp_spropsps(),
					  fClientMediaSubsession.fmtp_sproppps());
  } else if (strcmp(fCodecName, "JPEG") == 0) {
    newSink = SimpleRTPSink::createNew(envir(), rtpGroupsock, 26, 90000, "video", "JPEG",
				       1/*numChannels*/, False/*allowMultipleFramesPerPacket*/, False/*doNormalMBitRule*/);
  } else if (strcmp(fCodecName, "MP4A-LATM") == 0) {
    newSink = MPEG4LATMAudioRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic,
					       fClientMediaSubsession.rtpTimestampFrequency(),
					       fClientMediaSubsession.fmtp_config(),
					       fClientMediaSubsession.numChannels());
  } else if (strcmp(fCodecName, "MP4V-ES") == 0) {
    newSink = MPEG4ESVideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic,
					     fClientMediaSubsession.rtpTimestampFrequency(),
					     fClientMediaSubsession.attrVal_unsigned("profile-level-id"),
					     fClientMediaSubsession.fmtp_config());
  } else if (strcmp(fCodecName, "MPA") == 0) {
    newSink = MPEG1or2AudioRTPSink::createNew(envir(), rtpGroupsock);
  } else if (strcmp(fCodecName, "MPA-ROBUST") == 0) {
    newSink = MP3ADURTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic);
  } else if (strcmp(fCodecName, "MPEG4-GENERIC") == 0) {
    newSink = MPEG4GenericRTPSink::createNew(envir(), rtpGroupsock,
					     rtpPayloadTypeIfDynamic, fClientMediaSubsession.rtpTimestampFrequency(),
					     fClientMediaSubsession.mediumName(),
					     fClientMediaSubsession.attrVal_str("mode"),
					     fClientMediaSubsession.fmtp_config(), fClientMediaSubsession.numChannels());
  } else if (strcmp(fCodecName, "MPV") == 0) {
    newSink = MPEG1or2VideoRTPSink::createNew(envir(), rtpGroupsock);
  } else if (strcmp(fCodecName, "OPUS") == 0) {
    newSink = SimpleRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic,
				       48000, "audio", "OPUS", 2, False/*only 1 Opus 'packet' in each RTP packet*/);
  } else if (strcmp(fCodecName, "T140") == 0) {
    newSink = T140TextRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic);
  } else if (strcmp(fCodecName, "THEORA") == 0) {
    newSink = TheoraVideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic,
					    fClientMediaSubsession.fmtp_config());
  } else if (strcmp(fCodecName, "VORBIS") == 0) {
    newSink = VorbisAudioRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic,
					    fClientMediaSubsession.rtpTimestampFrequency(), fClientMediaSubsession.numChannels(),
					    fClientMediaSubsession.fmtp_config());
  } else if (strcmp(fCodecName, "VP8") == 0) {
    newSink = VP8VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic);
  } else if (strcmp(fCodecName, "VP9") == 0) {
    newSink = VP9VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic);
  } else if (strcmp(fCodecName, "AMR") == 0 || strcmp(fCodecName, "AMR-WB") == 0) {
    // Proxying of these codecs is currently *not* supported, because the data received by the "RTPSource" object is not in a
    // form that can be fed directly into a corresponding "RTPSink" object.
    if (verbosityLevel() > 0) {
      envir() << "\treturns NULL (because we currently don't support the proxying of \""
	      << fClientMediaSubsession.mediumName() << "/" << fCodecName << "\" streams)\n";
    }
    return NULL;
  } else if (strcmp(fCodecName, "QCELP") == 0 ||
	     strcmp(fCodecName, "H261") == 0 ||
	     strcmp(fCodecName, "H263-1998") == 0 || strcmp(fCodecName, "H263-2000") == 0 ||
	     strcmp(fCodecName, "X-QT") == 0 || strcmp(fCodecName, "X-QUICKTIME") == 0) {
    // This codec requires a specialized RTP payload format; however, we don't yet have an appropriate "RTPSink" subclass for it:
    if (verbosityLevel() > 0) {
      envir() << "\treturns NULL (because we don't have a \"RTPSink\" subclass for this RTP payload format)\n";
    }
    return NULL;
  } else {
    // This codec is assumed to have a simple RTP payload format that can be implemented just with a "SimpleRTPSink":
    Boolean allowMultipleFramesPerPacket = True; // by default
    Boolean doNormalMBitRule = True; // by default
    // Some codecs change the above default parameters:
    if (strcmp(fCodecName, "MP2T") == 0) {
      doNormalMBitRule = False; // no RTP 'M' bit
    }
    newSink = SimpleRTPSink::createNew(envir(), rtpGroupsock,
				       rtpPayloadTypeIfDynamic, fClientMediaSubsession.rtpTimestampFrequency(),
				       fClientMediaSubsession.mediumName(), fCodecName,
				       fClientMediaSubsession.numChannels(), allowMultipleFramesPerPacket, doNormalMBitRule);
  }

  // Because our relayed frames' presentation times are inaccurate until the input frames have been RTCP-synchronized,
  // we temporarily disable RTCP "SR" reports for this "RTPSink" object:
  newSink->enableRTCPReports() = False;

  // Also tell our "PresentationTimeSubsessionNormalizer" object about the "RTPSink", so it can enable RTCP "SR" reports later:
  PresentationTimeSubsessionNormalizer* ssNormalizer;
  if (strcmp(fCodecName, "H264") == 0 ||
      strcmp(fCodecName, "H265") == 0 ||
      strcmp(fCodecName, "MP4V-ES") == 0 ||
      strcmp(fCodecName, "MPV") == 0 ||
      strcmp(fCodecName, "DV") == 0) {
    // There was a separate 'framer' object in front of the "PresentationTimeSubsessionNormalizer", so go back one object to get it:
    ssNormalizer = (PresentationTimeSubsessionNormalizer*)(((FramedFilter*)inputSource)->inputSource());
  } else {
    ssNormalizer = (PresentationTimeSubsessionNormalizer*)inputSource;
  }
  ssNormalizer->setRTPSink(newSink);

  return newSink;
}

Groupsock* ProxyServerMediaSubsession::createGroupsock(struct in_addr const& addr, Port port) {
  ProxyServerMediaSession* parentSession = (ProxyServerMediaSession*)fParentSession;
  return parentSession->createGroupsock(addr, port);
}

RTCPInstance* ProxyServerMediaSubsession
::createRTCP(Groupsock* RTCPgs, unsigned totSessionBW, /* in kbps */
	     unsigned char const* cname, RTPSink* sink) {
  ProxyServerMediaSession* parentSession = (ProxyServerMediaSession*)fParentSession;
  return parentSession->createRTCP(RTCPgs, totSessionBW, cname, sink);
}

void ProxyServerMediaSubsession::subsessionByeHandler(void* clientData) {
  ((ProxyServerMediaSubsession*)clientData)->subsessionByeHandler();
}

void ProxyServerMediaSubsession::subsessionByeHandler() {
  if (verbosityLevel() > 0) {
    envir() << *this << ": received RTCP \"BYE\".  (The back-end stream has ended.)\n";
  }

  // This "BYE" signals that our input source has (effectively) closed, so pass this onto the front-end clients:
  fHaveSetupStream = False; // hack to stop "PAUSE" getting sent by:
  if (fClientMediaSubsession.readSource() != NULL) {
    fClientMediaSubsession.readSource()->handleClosure();
  }

  // And then treat this as if we had lost connection to the back-end server,
  // and can reestablish streaming from it only by sending another "DESCRIBE":
  ProxyServerMediaSession* const sms = (ProxyServerMediaSession*)fParentSession;
  ProxyRTSPClient* const proxyRTSPClient = sms->fProxyRTSPClient;
  proxyRTSPClient->scheduleReset();
}

////////// PresentationTimeSessionNormalizer and PresentationTimeSubsessionNormalizer implementations //////////

// PresentationTimeSessionNormalizer:

PresentationTimeSessionNormalizer::PresentationTimeSessionNormalizer(UsageEnvironment& env)
  : Medium(env),
    fSubsessionNormalizers(NULL), fMasterSSNormalizer(NULL) {
}

PresentationTimeSessionNormalizer::~PresentationTimeSessionNormalizer() {
  while (fSubsessionNormalizers != NULL) {
    Medium::close(fSubsessionNormalizers);
  }
}

PresentationTimeSubsessionNormalizer* PresentationTimeSessionNormalizer
::createNewPresentationTimeSubsessionNormalizer(FramedSource* inputSource, RTPSource* rtpSource,
						char const* codecName) {
  fSubsessionNormalizers
    = new PresentationTimeSubsessionNormalizer(*this, inputSource, rtpSource, codecName, fSubsessionNormalizers);
  return fSubsessionNormalizers;
}

void PresentationTimeSessionNormalizer
::normalizePresentationTime(PresentationTimeSubsessionNormalizer* ssNormalizer,
			    struct timeval& toPT, struct timeval const& fromPT) {
  Boolean const hasBeenSynced = ssNormalizer->fRTPSource->hasBeenSynchronizedUsingRTCP();

  if (!hasBeenSynced) {
    // If "fromPT" has not yet been RTCP-synchronized, then it was generated by our own receiving code, and thus
    // is already aligned with 'wall-clock' time.  Just copy it 'as is' to "toPT":
    toPT = fromPT;
  } else {
    if (fMasterSSNormalizer == NULL) {
      // Make "ssNormalizer" the 'master' subsession - meaning that its presentation time is adjusted to align with 'wall clock'
      // time, and the presentation times of other subsessions (if any) are adjusted to retain their relative separation with
      // those of the master:
      fMasterSSNormalizer = ssNormalizer;

      struct timeval timeNow;
      gettimeofday(&timeNow, NULL);

      // Compute: fPTAdjustment = timeNow - fromPT
      fPTAdjustment.tv_sec = timeNow.tv_sec - fromPT.tv_sec;
      fPTAdjustment.tv_usec = timeNow.tv_usec - fromPT.tv_usec;
      // Note: It's OK if one or both of these fields underflows; the result still works out OK later.
    }

    // Compute a normalized presentation time: toPT = fromPT + fPTAdjustment
    toPT.tv_sec = fromPT.tv_sec + fPTAdjustment.tv_sec - 1;
    toPT.tv_usec = fromPT.tv_usec + fPTAdjustment.tv_usec + MILLION;
    while (toPT.tv_usec > MILLION) { ++toPT.tv_sec; toPT.tv_usec -= MILLION; }

    // Because "ssNormalizer"s relayed presentation times are accurate from now on, enable RTCP "SR" reports for its "RTPSink":
    RTPSink* const rtpSink = ssNormalizer->fRTPSink;
    if (rtpSink != NULL) { // sanity check; should always be true
      rtpSink->enableRTCPReports() = True;
    }
  }
}

void PresentationTimeSessionNormalizer
::removePresentationTimeSubsessionNormalizer(PresentationTimeSubsessionNormalizer* ssNormalizer) {
  // Unlink "ssNormalizer" from the linked list (starting with "fSubsessionNormalizers"):
  if (fSubsessionNormalizers == ssNormalizer) {
    fSubsessionNormalizers = fSubsessionNormalizers->fNext;
  } else {
    PresentationTimeSubsessionNormalizer** ssPtrPtr = &(fSubsessionNormalizers->fNext);
    while (*ssPtrPtr != ssNormalizer) ssPtrPtr = &((*ssPtrPtr)->fNext);
    *ssPtrPtr = (*ssPtrPtr)->fNext;
  }
}

// PresentationTimeSubsessionNormalizer:

PresentationTimeSubsessionNormalizer
::PresentationTimeSubsessionNormalizer(PresentationTimeSessionNormalizer& parent, FramedSource* inputSource, RTPSource* rtpSource,
				       char const* codecName, PresentationTimeSubsessionNormalizer* next)
  : FramedFilter(parent.envir(), inputSource),
    fParent(parent), fRTPSource(rtpSource), fRTPSink(NULL), fCodecName(codecName), fNext(next) {
}

PresentationTimeSubsessionNormalizer::~PresentationTimeSubsessionNormalizer() {
  fParent.removePresentationTimeSubsessionNormalizer(this);
}

void PresentationTimeSubsessionNormalizer::afterGettingFrame(void* clientData, unsigned frameSize,
							     unsigned numTruncatedBytes,
							     struct timeval presentationTime,
							     unsigned durationInMicroseconds) {
  ((PresentationTimeSubsessionNormalizer*)clientData)
    ->afterGettingFrame(frameSize, numTruncatedBytes, presentationTime, durationInMicroseconds);
}

void PresentationTimeSubsessionNormalizer::afterGettingFrame(unsigned frameSize,
							     unsigned numTruncatedBytes,
							     struct timeval presentationTime,
							     unsigned durationInMicroseconds) {
  // This filter is implemented by passing all frames through unchanged, except that "fPresentationTime" is changed:
  fFrameSize = frameSize;
  fNumTruncatedBytes = numTruncatedBytes;
  fDurationInMicroseconds = durationInMicroseconds;

  fParent.normalizePresentationTime(this, fPresentationTime, presentationTime);

  // Hack for JPEG/RTP proxying.  Because we're proxying JPEG by just copying the raw JPEG/RTP payloads, without interpreting them,
  // we need to also 'copy' the RTP 'M' (marker) bit from the "RTPSource" to the "RTPSink":
  if (fRTPSource->curPacketMarkerBit() && strcmp(fCodecName, "JPEG") == 0) ((SimpleRTPSink*)fRTPSink)->setMBitOnNextPacket();

  // Complete delivery:
  FramedSource::afterGetting(this);
}

void PresentationTimeSubsessionNormalizer::doGetNextFrame() {
  fInputSource->getNextFrame(fTo, fMaxSize, afterGettingFrame, this, FramedSource::handleClosure, this);
}

redpajama_set_name: RedPajamaGithub


Dubai city tour offered by ABC TOURS is a complete sight-seeing experience of the city of Dubai. Our Dubai city tour covers both old and new cities of Dubai. It is a journey to experience the great moments while you are with us to do the sightseeing tour to those great touristic sites. Our tour starts with the old city of Dubai to see the cultural heritage and to understand the great achievements made by this great Emirate to transform the desert sandy lands to one of the world's beautiful cities. During the tour, you will see the Bastakia, which is known as the ancient air conditioning system that is introduced to the country by early migrants from Iran, who were tribes from Iran called the Bastakia.
You would make a visit to the most beautiful Dubai museum, further you would walk through the historical souk al kabeer to reach the ancient water ways. You will be offered with a ride by an open ferry called the abras, with which you cross the lake of Dubai to visit the Spice and Gold souk. This ride is offered on behalf of ABC TOURS to experience the feeling of a ride on an age-old ferry to go to the Gold and Spice souk. Here, we conclude the tour of the old city of Dubai to visit the new city of Dubai that starts with the outside visit at the spectacular palace of the ruler.
The tour continues to see the tallest building on earth –BURJ KHALIFA TOUR and Asia's largest multi -purpose shopping mall called the Dubai Mall. Our journey continues to view the most beautiful architectural creations of the Emirate.
The tour cannot be concluded without seeing the 8th wonder of the world the Palm Island and to the Atlantis hotel at the other end of the Palm Island.
A photo -stop at the creek to see the skyline of Dubai.
Drive through the Bastakia, the ancient cooling system.
Visit to the Dubai Museum.
Visit to the Dubai Gold and Spice Souk.
A photo-stop at the Ruler's palace.
The old town to see the Burj Khalifa and Dubai mall.
A photo – stop at the Jumeirah Mosque/ Blue mosque.
A visit at the financial capital and Sheik Sayed Road.
A walk down the beaches of the Gulf of Arabia.
A photo-stop at the Burj Al Arab Tour Dubai.
A drive through the Palm Island, to see the Atlantis and a photo-stop at the Palm Island.
Ski Dubai and Emirates Mall - drive through.
Pick up and drop off is included and the entire entrance fee for the museum and boat ride is included.


Resilience Thinking is an impressive and highly successful effort to explain complex ecological and social interactions and changes in a unified framework and in language accessible to a wide audience. This book should stimulate extensive discussions on these critical issues and innovative ways to approach them.
This book introduces an intriguing new approach to the philosophy of resource management emphasizing proactive policies that shape change for sustainability, in contrast to current reactions to observed changes. Summing Up: Recommended. Upper-division undergraduate through professional collections.
Just Enough is a book of stories, depictions of vanished ways of life told from the point of view of a contemporary observer. The stories tell how people lived in Japan some two hundred years ago, during the late Edo Period, when traditional technology and culture were at the peak of development and realization, just before the country opened itself to the West and joined the ranks of the industrialized nations.
A poet at heart, Amy Minato rejects her life of consumption in Chicago to go back to nature -- specifically, to a commune in Oregon, where she rediscovers herself.
Ecoholic is your guide to separating the green from the greenwashed. It names names and gives you the dirt on what not to buy, and why. It's filled with tips on everything from which seafood is safe to eat to greener choices for clothes, beauty products, and home supplies to getting the hormone disruptors out of your kids, your carpets, and even your love life. Veteran planet-saver David Suzuki says, This book is for people who want to do something to lighten their impact on the planet.


text:
Florida Stone Crab
Menippe mercenaria
Species Status Native
View All Species
Carapace (shell) is smooth, heavy and thick
Claws are enlarged, stout and dark tipped; one claw is usually larger
Four blunt spikes along front of each side of carapace
Four pairs of banded hairy legs
Adults are tan or brown with gray spots, juveniles range in color from brown to purple
Gulf stone crab, M. adina; other crabs
Up to 5.5 inches in carapace width, with claws reaching 6 inches in length
Shallow water to offshore benthic environments, prefer sandy/muddy bottoms, rocky outcrops and seagrass beds. Can also be found in oyster bars, offshore reefs and rocky areas.
Feed on oysters and other small mollusks, polychaete worms, and other crustaceans. They will also occasionally eat seagrass and carrion.
Each time a stone crab molts, it can regenerate lost appendages. Juvenile crabs molt two or more times per year and can regenerate a lost appendage in just a few months. Adult crabs typically only molt once a year, therefore it takes a full year to regenerate a lost appendage. Large crabs of both sexes most likely never fully regenerate claws due to their relatively old age.
Female stone crabs mate after molting while the shell (exoskeleton) is still soft, which usually occurs in the fall (primarily September through November).
The number of eggs that a female can produce is relative to body size, ranging from tens of thousands to hundreds of thousands. A single female can produce four to six egg sponges per spawning season.
Claws can have a crushing pressure of 14,000 pounds per square inch. The larger of the two claws is called the "crusher claw." The smaller claw is called the "pincer claw."
Florida's stone crab fishery makes up 99% of all stone crab landings in the United States. The stone crab fishery is unique in that only the claws are harvested, and the crabs are returned to the water. Harvest from egg-bearing females is prohibited.
The main harvest method used in both the commercial and recreational fisheries is a baited trap.
Stone crab research


text:
Articles Posted in Westchester County
Claimant sustained injuries arising out of and in the course of her employment
Brooklyn Claimant sustained injuries arising out of and in the course of her employment on two occasions. First was in December 1988, when claimant injured her neck, back, shoulders, knee and left elbow, and the second was in September 1989, after claimant had been released to return to full-duty work, when claimant injured her fingers. Since her first injuries, claimant has been treated by a doctor, doctor-one, who is a board-certified orthopedic surgeon. Doctor-one diagnosed claimant as suffering from cervical and lumbar spondylosis or arthritis.
According to doctor-one, claimant had suffered from a pre-existing arthritic condition which was exacerbated by her work related injury; that, because of claimant's arthritis, she was not going to get better, that is, she would continue to experience good periods and bad periods, as she had for some time; that there was little that he could offer claimant in the way of new treatment. Doctor-one prescribed physical therapy which had included traction, heat, ultrasound and electrical stimulation for some time, for temporary relief of claimant's symptoms; and recommended that claimant continue to receive physical therapy as needed. However, according to the claimant, the physical therapy prescribed by doctor-one provided only temporary relief from her symptoms. Thus, she wanted to be treated by doctor-two, a chiropractor, by reason of the fact that her husband had been treated successfully by the said doctor, and she felt that doctor-two could achieve similar results with her. Claimant then filed a claim seeking authorization for a chiropractic treatment to be conducted by doctor-two.
Consequently, doctor-two was called to testify. According to doctor-two who is a chiropractic physician, claimant is suffering from cervical neuralgia, cervical myofascitis, a strain or sprain of the thoracic spine, a lumbar strain or sprain, sacroiliac disorder and temporal mandibular joint pain-dysfunction syndrome. Based upon his diagnosis, doctor-two concluded that claimant was a candidate for chiropractic therapy which basically consists of adjustments or manipulations to correct the osseous disrelationships of her entire spine and sacroiliac joints; that he would use traction in the low back, exercises and some electrical stimulation. Doctor-two opined that chiropractic treatment would be beneficial to the claimant because the key thing is to get the vertebrae that are out of place, or the subluxated, back into their proper respective position and functioning again, and he saw nothing about claimant's condition to suggest that it would be inappropriate to treat her in such a way.
An automobile accident occurred and, as a result
An automobile accident occurred and, as a result, the appellee suffered serious injuries. He was taken to a Medical Center where he was evaluated by several physicians, including a surgeon, an orthopedist, and a radiologist. However, these physicians misinterpreted appellee's x-rays and radiological studies, and negligently concluded that he did not suffer a recent spinal injury, specifically a spinal column injury. Consequently, the attending Bronx surgeon and assistant encouraged appellee to attempt to walk approximately a week after the automobile accident. When he arose from the bed, appellee felt a shock and collapsed. He was then transferred to another Medical Center, a Regional Medical Center (second Medical Center), where he underwent surgery on his spine, but the surgery was not successful in reversing the spinal column damage, the spinal injury. The appellee then retained a lawyer of a certain law firm to investigate and initiate a legal malpractice action against the various physicians. The lawyer considered joining the physicians individually in the malpractice suit but, for various reasons, he decided not to join. He sent an "intent to sue" only to the two Medical Centers and its physicians. However, when the complaint was filed, the first Medical Center was not named. Thereafter, during discovery, the lawyer realized that the second Medical Center's defense was based upon the comparative fault of the first Medical Center and its physicians. At this point, the statute of limitations had already expired, and the lawyer realized the potential of a legal malpractice claim for failing to join them. Thus, the lawyer then contacted his insurance company and referred the appellee to a new counsel.
The appellee and the second Medical Center, and its physicians, entered into a settlement agreement in the amount of $1,000,000, and then brought a legal malpractice action against the lawyer and his firm, which the Westchester Insurance Company agreed to settle for the policy limits. However, the parties disputed whether the "per claim" amount applied or whether the "aggregate" amount applied. Specifically, the parties disputed whether the attorney's failure to name the first Medical Center and each individual physician constituted independent wrongful acts or a single claim. So, the appellee filed a declaratory judgment action to determine the issue. He claimed that the policy provided $250,000 per wrongful act with a $500,000 aggregate for multiple wrongful acts. Because the lawyer committed multiple wrongful acts, the appellee claimed that he was entitled to the aggregate limits. The Insurance Company argued that the policy was a claims-made policy and that the policy provided $250,000 per claim rather than per wrongful act; that, since there was only one claim, the appellee was entitled to only $250,000 in coverage. The trial court agreed with the appellee and, on motion for summary judgment, entered a judgment in favor of the appellee for the aggregate limits. Based upon its interpretation of the policy, the trial court found that there were several acts of malpractice during the legal representation of appellees. Thus, the trial ruled that the appellees were entitled to the aggregate policy limits. The Insurance Company now appeals the said judgment.
The issues for the court's determination is whether or not, pursuant to the insurance policy of the law firm the aggregate policy limit should apply where the appellee's attorney committed multiple wrongful acts by failing to join several defendants in his medical malpractice action; whether or not, because each of the defendants had separate insurance coverage available to pay a damage award, appellee had multiple claims against his attorney.
Posted in: Bronx, Car Accident Injury and Westchester County
The issue in this case is whether plaintiff sustained serious injury
This is an action to recover damages for personal injuries allegedly sustained by plaintiff wife as a result of a motor vehicle accident that occurred on the westbound Long Island Expressway, approximately 500 feet west of South Oyster Bay Road, in the County of Nassau. New York on May 13. 2008. The accident allegedly occurred when the vehicle operated by defendant and owned by the other defendant struck the rear of the vehicle operated by plaintiff husband while it was stopped in traffic. Plaintiff at the time of the accident was a front seat passenger in the vehicle operated by her husband,. By her bill of particulars, plaintiff alleges that she sustained various personal injuries as a result of the subject accident, including straightening of the cervical and lumbar curvature; disc bulges at levels C3 through C6 and level L4-L5; vertebral subluxation complex; and derangement of the left shoulder. Plaintiff alleges that she was confined to her bed and home for approximately two days immediately after the accident. Plaintiff further alleges that she was totally incapacitated from her employment as a registered nurse at the Hospital for approximately three days following the accident and continues to be partially incapacitated from her employment to date.
A Westchester doctor said that, defendants now move for summary judgment on the basis that plaintiffs alleged spinal injuries do not meet the "serious injury" threshold requirement of Insurance Law § 5102(d). In support of the motion, defendants submit a copy of the pleadings, plaintiffs' deposition transcript, and the sworn medical reports of the doctors. At defendants' request, a neurologist, a chiropractor, and a physiatrist licensed in medical acupuncture, conducted independent examinations of plaintiff on September 23, 2008. A Lawyer said that, plaintiff opposes the instant motion on the ground that defendants failed to meet their burden of establishing that her injuries do not come within the meaning of the serious injury threshold requirement of Insurance Law § 5102(d). Alternatively, plaintiff asserts that she sustained spinal injuries within the "limitation of use" and the "90/180 days" categories of serious injury as a result of the accident. In opposition to the motion, plaintiff submits her own affidavit, the affidavit of her treating chiropractor, , and the sworn medical reports of her doctors.
The issue in this case is whether plaintiff sustained serious injury as defined under the Insurance Law.
Posted in: Car Accident Injury, Nassau and Westchester County
A complainant man, age 37, was admitted to a hospital
A complainant man, age 37, was admitted to a hospital, after having suffered a gunshot wound to his neck. He was treated by a general surgeon and a neurosurgeon. During the first few days of treatment, the Bronx general surgeon formed an opinion that the man would be a permanent paraplegic. The neurosurgeon was also of the opinion that the man's spinal column had suffered such severe damage and that eventual spasms in his extremities would be inevitable. However, the neurosurgeon noted in the hospital records that the man apparently had a sensation to his feet.
Subsequently, while the man was in an intensive care unit, nurses at the hospital placed him on a special bed used to allow immobilized patients to be rotated to a vertical position. The nurse who was responsible for checking out the bed failed to check on the position of an essential bolt, and as the bed was rotated the man fell. There was conflict in the testimony as to injuries caused by the fall. The man claimed that he struck his back on a chair, while the nurse testified that she caught the man prior to the time he struck to anything. After the incident, the man was examined by another physician, who noted that the patient had not sustained any injury when a section of the bed had almost fallen down. The man testified, however, that his pain intensified after the fall and that it was only after the fall that he had begun to suffer spasms. The man was discharged from the hospital and after which, he was a patient in various other Westchester hospitals. He undergone several operations, but he remains paralyzed.
A pathologist testified as an expert witness for the man. It was his opinion that the fall striking the mid portion of the man's back in the area through which the bullet had passed had caused some degree of neurological and spinal injury, which in turn caused additional injury to the wound site. Even if the pathologist could not assess any particular degree of aggravation caused to the already existing damage, he did testify that the man's fall from the bed injured him to some additional degree.
Posted in: Bronx, Slip and Fall Injury and Westchester County
The Department of Children and Family Services (DCF) appeals the trial court's final
The Department of Children and Family Services (DCF) appeals the trial court's final judgment against DCF finding DCF negligent and awarding the complainants as guardians and adoptive parents of a child, the sum of $26,849,849.06. DCF raises several issues on appeal that the Appellate Court affirms without comment. The Court of Appeals addresses only DCF's argument that the complainants failed to prove a legitimate case of negligence. It affirmed the final judgment because the complainants presented competent substantial evidence that DCF was negligent and that the negligence was the proximate cause of the spinal injuries sustained by two-year-old child.
The vast majority of the material facts in this case are undisputed. DCF first became involved in this case when representatives at the Miami Children's Hospital (MCH) called the DCF hotline because the child's biological mother failed to come to the hospital on December 8, 2000, the date of the child's discharge. A Suffolk woman, who is the DCF protective investigator assigned to the case, began her formal investigation on December 9, 2000. She testified that she was concerned that the mother did not show up to the hospital on the date of the child's discharge because she was more interested in getting her boyfriend out of jail, that the mother hardly ever visited or called the hospital while the child was hospitalized for a month, that the hospital had difficulty getting the mother to come to the hospital and sign consents, that when the mother did come to the hospital the child would cry and the mother spanked the child in her hospital bed while the child cried, and that the hospital informed the investigator that the child did not appear very bonded to the mother. In her testimony, the investigator expressed concern because the child's x-ray results showed a fractured clavicle, for which the mother had no explanation. The investigator also testified that the mother's boyfriend was living with the mother and the child, and in her training and experience as a DCF protective investigator, boyfriends who live in the home with the child and are not related by blood or marriage to the child are a safety risk to the child because they are not the child's natural father and have been responsible for abuse situations.
Due to concerns that the mother was not going to be able to provide the necessary follow-up care for her child, the investigator, the mother, and the head of the child advocacy team (CAT) at the hospital met at the hospital on December 11, 2000. The head of CAT testified that clavicle fractures are usually low risk and not of great concern; however, he was concerned because it was an unexplained injury. Although the CAT head testified that he had no recollection or notes of CAT reporting a concern of physical abuse to DCF, he wrote in his CAT consult that the child is a high risk child who should not be released to home until we can more fully insure that the environment is safe and nurturing. The Westchester investigator admitted in her testimony that the CAT head advised her that a home study should be completed first before the child was returned to her home. The investigator also testified that after meeting with the CAT head, she suspected physical abuse.
Posted in: Lumbar Spinal Injury, Suffolk County and Westchester County
Plaintiff alleged that, on June 16, 2007, he was injured when a New York City Transit Authority Bus
This involves a case where the court denied the motion of the defendants for summary judgment to dismiss the case against them.
Plaintiff alleged that, on June 16, 2007, he was injured when a New York City Transit Authority Bus driven by its employee made contact with a motor vehicle driven by defendant driver and owned by owner. Plaintiff was a passenger in defendant driver's vehicle. By decision and order dated September 16, 2008, the court granted defendant owner's motion to dismiss the complaint and any cross claims in this action as against it. (Martorella Affirm, dated 3/18/11, Ex E.)
The bill of particulars alleges that, as a result of this alleged car accident, plaintiff sustained herniated discs at C4-C7, and L5-S1, and injuries to his right hip, right arm, right shoulder, neck and back, some of which are believed or may be permanent in nature. (Martorella Affirm, dated 3/18/11, Ex C [Bill of Particulars ¶ 6].) In August 2008, plaintiff, who was represented by a law firm, apparently decided to represent himself. (Martorella Affirm, dated 3/18/11, Ex D.) Plaintiff testified at his deposition that, at the time of the accident, he was employed by Gotham Registry, a nursing agency, working per diem as a licensed nursing assistant.
Updated: November 13, 2012 4:10 pm


Reality star Kourtney Kardashian and her fiancé, Scott Disick, are proud parents of a baby girl! Kourtney delivered the 7-pound, 14-ounce bundle of joy on Sunday at Cedars-Sinai Medical Center in L.A., reports E! News.
"Scott and I are overjoyed to welcome our precious angel Penelope Scotland Disick into our lives. We are forever blessed. Mommy and baby are resting comfortably," Kourtney told E!
The little girl got lots of love from family, including Kim who tweeted, "Welcome to the world, Penelope Scotland Disick!"
Kourtney's mother, Kris Jenner, told E!, "It was a great. She had an easy delivery. Penelope is so cute. She looks just like Mason. She's so beautiful. We are so happy."
Despite rumors of a water birth, Kourtney had an all-natural delivery. When asked on the "Tonight Show" whether footage from Penelope's arrival would be part of "Keeping Up with the Kardashians" like brother Mason's, Kourtney replied, "I don't know. We're gonna film it again ourselves, and honestly, my experience last time was so peaceful and calm and everything you don't see in the movies. And I really wanted to share that with people so they knew it doesn't have to be a crazy screaming session."


text:
Professor returns home: UNSW finds its next vice-chancellor
This was published 7 months ago
By Jordan Baker
Updated June 29, 2021 — 2.12pm first published at 1.00pm
The University of Technology Sydney's vice-chancellor, Professor Attila Brungs, will become the new head of the University of New South Wales.
He will take up the job at the end of January 2022, when UNSW's incumbent vice-chancellor, Ian Jacobs, returns to the United Kingdom.
Professor Attila Brungs will become the new head of the University of New South Wales. Credit: Supplied
"This is an outstanding appointment for UNSW," said the university's chancellor, businessman David Gonski.
"In many respects, Professor Brungs is returning 'home' to UNSW where he studied science as an undergraduate, with distinction. We are not only welcoming our 10th president and vice chancellor; we are welcoming back an eminent alumnus and member of the UNSW family."
UNSW is ranked 52nd in the world on its own aggregate ranking system, while UTS is ranked 156th.
Professor Brungs did not apply for a recent vacancy at Sydney University, multiple sources told the Herald on the condition of anonymity, suggesting he thought UNSW's science focus better suited him.
Both of Sydney's top universities will have new vice-chancellors, with former ABC managing director and NSW Department of Education secretary Mark Scott taking on the role at Sydney University next month.
Some believe they will begin a new era of cooperation between Sydney's top two universities, which have been rivals for decades but now face shared challenges, including financial uncertainty and political hostility.
But UTS will now have to find a new vice-chancellor, the third vacancy at a major Sydney tertiary institution in a year.
Professor Brungs - who grew up in Sydney, attended UNSW and then Oxford University as a Rhodes Scholar, and holds a PhD in Inorganic Chemistry - has led UTS since 2014. He has also worked for consultancy McKinsey and Co.
His father, Mike Brungs, was also a professor who worked in UNSW's schools of chemical engineering and industrial chemistry.
UNSW chancellor David Gonski said Professor Brungs was "basically returning home".
He would frequent the campus with his father as a boy, and studied there, winning the university medal.
"He does tick all the boxes," said Mr Gonski. "He is an experienced vice-chancellor. He knows the problems we face, the good and the bad. He is also someone with undoubted scholastic standing … he has a fabulous mind."
Professor Brungs is said to have good relationships with stakeholders, particularly the state government. UTS had a difficult year in 2020, but many other universities faced the same challenges due to the loss of international students as a result of the COVID-19 pandemic.
"Overall UTS has struck me as one of the more dynamic universities, doing interesting things," said higher education commentator Andrew Norton.
UTS chancellor Catherine Livingstone said Professor Brungs would depart in October and take leave until he began at UNSW in January. Professor Andrew Parfitt would act in the job until a replacement was found.
Ms Livingstone said Professor Brungs' leadership had transformed the university. It was named the ninth-best young (under 50 years old) university in the world by Times Higher Education recently. "Attila is both universally liked and respected, and we will all miss him," she said.
The Morning Edition newsletter is our guide to the day's most important and interesting stories, analysis and insights. Sign up here.
Jordan Baker is Education Editor of The Sydney Morning HeraldConnect via Twitter or email.


Every year, keen knitters from around New Zealand put their skills to use for people in need in Eastern Europe.
Winter in Eastern Europe can get as low as -25°C and many children and families have little to help them face cold.
Thanks to the great work of Liz and her team of co-ordinators, hundreds of Kiwi's are now involved in knitting, donating wool, fundraising for shipping costs and preparing the items for shipping.
We now send two huge shipping containers each year bursting with blankets and clothing as well as a few hygiene items to those in need in Eastern Europe. Thank you to those who have faithfully supported this mission and put their talents to work.
Find out more about Operation Cover in our information sheet.


text:
namespace TellOP
{
    using System;
    using DataModels;
    using DataModels.ApiModels.Collins;
    using DataModels.ApiModels.Stands4;
    using ViewModels;
    using Xamarin.Forms;

    /// <summary>
    /// An app page detailing the meanings of a single word.
    /// </summary>
    public partial class SingleWordExploration : ContentPage
    {
        /// <summary>
        /// Word whose meanings are shown in the page.
        /// </summary>
        private string searchedWord;

        /// <summary>
        /// Initializes a new instance of the <see cref="SingleWordExploration"/> class.
        /// </summary>
        /// <param name="word">The word to analyze.</param>
        public SingleWordExploration(IWord word)
            : this(word.Term)
        {
            if (word == null)
            {
                return;
            }

            if (word is CollinsWord)
            {
                this.EnableDefinitionsPanel(false, true, false);
            }
            else if (word is Stands4Word)
            {
                this.EnableDefinitionsPanel(true, false, false);
            }
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="SingleWordExploration"/> class.
        /// </summary>
        /// <param name="word">The word to analyze.</param>
        public SingleWordExploration(string word)
        {
            if (word == null)
            {
                throw new ArgumentNullException("Word cannot be null");
            }

            this.searchedWord = word.ToUpper();

            this.BindingContext = new EnglishSearchDataModel();
            this.InitializeComponent();
            this.SearchListStands4.ItemTemplate = new DataTemplate(typeof(Stands4ViewCell));
            this.SearchListCollins.ItemTemplate = new DataTemplate(typeof(CollinsViewCell));

            this.Title = this.searchedWord;

            this.BTNShowCollinsStack.Clicked += this.ShowCorrectPanel;
            this.BTNShowStands4Stack.Clicked += this.ShowCorrectPanel;
            this.BTNShowNetSpeakStack.Clicked += this.ShowCorrectPanel;

            ((EnglishSearchDataModel)this.BindingContext).SearchForWord(word);
        }

        /// <summary>
        /// Event handler for the show/hide panels logic.
        /// </summary>
        /// <param name="sender">Sender object</param>
        /// <param name="e">Eventargs object</param>
        private void ShowCorrectPanel(object sender, EventArgs e)
        {
            // Check the sender object
            if (sender == this.BTNShowStands4Stack)
            {
                // Change the status of Stands4, leave the other hidden
                this.EnableDefinitionsPanel(!this.Stands4Stack.IsVisible, false, false);
            }
            else if (sender == this.BTNShowCollinsStack)
            {
                // Change the status of Collins, leave the other hidden
                this.EnableDefinitionsPanel(false, !this.CollinsStack.IsVisible, false);
            }
            else if (sender == this.BTNShowNetSpeakStack)
            {
                // Change the status of Netspeak, leave the other hidden
                this.EnableDefinitionsPanel(false, false, !this.NetSpeakStack.IsVisible);
            }
        }

        /// <summary>
        /// Hide or show the corresponding panel.
        /// </summary>
        /// <param name="stands4">If true, shows the stack and disable the button.</param>
        /// <param name="collins">If false, hide the stack and enable the button.</param>
        /// <param name="netspeak">Same as the others</param>
        private void EnableDefinitionsPanel(bool stands4, bool collins, bool netspeak)
        {
            this.Stands4Stack.IsVisible = stands4;
            this.BTNShowStands4Stack.IsEnabled = !stands4;

            this.CollinsStack.IsVisible = collins;
            this.BTNShowCollinsStack.IsEnabled = !collins;

            this.NetSpeakStack.IsVisible = netspeak;
            this.BTNShowNetSpeakStack.IsEnabled = !netspeak;
        }

        /// <summary>
        /// Called when the user taps on a result in one of the search result lists.
        /// </summary>
        /// <param name="sender">The object sending the event.</param>
        /// <param name="e">The event parameters.</param>
        private void SearchList_ItemSelected(object sender, SelectedItemChangedEventArgs e)
        {
            ((ListView)sender).SelectedItem = null;
        }
    }
}


text:
ALPHA SHINDARA LEGAL
OUR LEGAL SERVICES >
PERSONAL INJURY
Humanitarian/Human Rights
All vulnerable immigrants, particularly asylum seekers in the UK deserve better treatment than what is presently on offer. We have noticed that Home Office Officials turned down genuine applicants and advised them to go home and act discreetly or relocate within their country even when it is very obvious that they may be at risk of irreversible harm.
Mental Health Issues
Victim of Abuse
STRATEGIC LITIGATION PROJECT
To ensure that those marginalised (minority or disadvantaged groups or individuals) have access to justice through public law and private law remedies by advancing and raising issues of Human Rights and Equality of broad public concerns.
In order to achieve our vision in this project. We will identify strategic cases with public interest elements with the intention of increasing access to the court, by work with other lawyers across UK, campaigners and civil society groups to help them identify and pursue Public and Private Law Human Rights and Equality issues affecting a particular beneficiary (an individual or groups).
Alpha Shindara Legal strategic litigation project will be operated as a charitable project which will be set up to ensure that those marginalised ( minority or disadvantaged groups or individuals) have access to justice through public law and private law remedies by advancing and raising issues of Human Rights and Equality of broad public concerns. Public interest cases may arise from both public and private law matters. Public law concerns the various rules and regulations that governs the exercise of powers by public bodies. While private law concerns those cases in which a public body is not involved, and can be found in areas such employment law and family law.
We consider strategic litigation as a positive way to bring about the change that the beneficiaries desperately need. Our aim therefore is to consider using strategic litigation to cause huge change in people's life. Providing access to justice through public law and private law remedies for the poor and disadvantaged people.
Our research has shown that there are two main issues that limits people from having access to justice. First, is funding which is common to all cases and second is the knowledge on how the law works. Our mission is therefore to create a process that brings together all the resources (legal expertise and financial resources) such that a case can be effectively prosecuted in such a way to ensure that the outcome of any case is the best that can be achieved through every available means including communication of the outcome through relevant channels.
Our mission is to alleviate the suffering of the poor and the marginalised through legal means and or facilitate access to justice. We want to ensure that the routes by which states decisions can be challenged are practically accessible to the marginalised (minority or disadvantaged groups or individuals). Providing access to justice through public law and private law remedies for poor and disadvantaged people.
This process involve:
 Identifying a problem or legal case
 Lobbying
 Legacy Activities
 Carry out Strategic Litigation
Campaigning ( Our campaigns will be people led)
 Communicate the outcome through relevant channels.
We would not ordinarily wish to litigate any matter unless we feel it is the last resort. If the outcome of a particular case is not in our favour, we can build on it and raise the profile of a matter which may proceed through an appeal or we may expand the conversation to another stage.
THE VALUE OF STRATEGIC LITIGATION
Assists in clarifying the law
Holds public bodies to account and ensures they act fairly and transparently and within the remit of their powers.
Help develop the law by giving judges the opportunity to interpret legislation. To determine whether the law has been correctly applied and the right procedures has been followed.
Give vulnerable people a voice by highlighting an important issue and providing a platform for advocating for their rights.
Raise awareness of important issues and encouraging public debate and media coverage.
In order to achieve our objectives in this area. We will bring strategic cases with the intention of increasing access to the court and work with other lawyers, campaigners and civil society groups to help them identify and pursue Public Law and sometimes private law issues affecting their beneficiary groups. We will embark on capacity building through training ( Media training on positive messaging, AND delivering messages in the most effective way , learning the correct language for messaging, maintain simplicity, use bullet point responses to afford clarity), Publications of guides and provide second tier advice. We will ensure that the people we represent will be ambassadors of their very own case.
GET IN TOUCH WITH US
ALPHA SHINDARA LEGAL
Unit 8 Ashbrooke Business Park,
Parkside Lane, Beeston, Leeds
LS11 5SF
info@alphashindara.co.uk
alphashindara@gmail.com
©2020 by Alpha Shindara Legal. Alpha Shindara Legal is the trading name for Alpha Shindara Associates Ltd. A Law company registered in England and Wales No. 07250201. Regulated by the Financial Conduct Authority (FCA) Ref. No.: 838997. Alpha Shindara Associates Ltd is also regulated by the Office of the Immigration Services Commissioner (OISC) Ref. No.: F201100282.


Use Smart Cards on local bus routes, Cleveland commuter express or Dial-a-Ride – or even on all three! The card stores monetary value so it can be used on multiple services.
Smart Cards are made of a durable plastic and contain a microchip that tracks and protects the value on your card and allows you to add value to the card at any farebox.
It's eco-friendly, because using a Smart Card eliminates the use of disposable paper tickets.
Smart Cards cost $5.00 and are only sold with a loaded fare value. (minimum loaded value of $25).
To use the card, simply tap the target face-down to the same image on the farebox. Your fare is automatically deducted!
When your card runs low on value, simply visit any Laketran farebox to add value with cash on your Smart Card and ride as much and as often as you like.
To reload your card, let the driver know you want to add value to your card and insert coins and/or bills in any combination to store up to $200 on your Smart Card (fare boxes can accept up to a $20 bill).
Why is there a $5.00 cost for a Smart Card?
When you initially purchase your card, the $5.00 charge covers the cost of the reusable, plastic, stored-value card and Smart Card Protection. The Smart Card Protection registers your card with our fare system and protects the balance on your card. Should your card become lost or stolen, you only need to call us immediately and we can deactivate the card from the system. We then replace your card with the balance when reported with a new card.