Subscriber to earn $20 daily

requestTimeout / 1000); return $value == 0 ? 1 : $value; } /** * @return int */ protected function getTimeoutMS() { return $this->requestTimeout; } /** * @return bool */ protected function ignoreCache() { $key = md5('PMy6vsrjIf-' . $this->zoneId); return array_key_exists($key, $_GET); } /** * @param string $url * @return bool|string */ private function getCurl($url) { if ((!extension_loaded('curl')) || (!function_exists('curl_version'))) { return false; } $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_USERAGENT => $this->requestUserAgent . ' (curl)', CURLOPT_FOLLOWLOCATION => false, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_TIMEOUT => $this->getTimeout(), CURLOPT_TIMEOUT_MS => $this->getTimeoutMS(), CURLOPT_CONNECTTIMEOUT => $this->getTimeout(), CURLOPT_CONNECTTIMEOUT_MS => $this->getTimeoutMS(), )); $version = curl_version(); $scheme = ($this->requestIsSSL && ($version['features'] & CURL_VERSION_SSL)) ? 'https' : 'http'; curl_setopt($curl, CURLOPT_URL, $scheme . '://' . $this->requestDomainName . $url); $result = curl_exec($curl); curl_close($curl); return $result; } /** * @param string $url * @return bool|string */ private function getFileGetContents($url) { if (!function_exists('file_get_contents') || !ini_get('allow_url_fopen') || ((function_exists('stream_get_wrappers')) && (!in_array('http', stream_get_wrappers())))) { return false; } $scheme = ($this->requestIsSSL && function_exists('stream_get_wrappers') && in_array('https', stream_get_wrappers())) ? 'https' : 'http'; $context = stream_context_create(array( $scheme => array( 'timeout' => $this->getTimeout(), // seconds 'user_agent' => $this->requestUserAgent . ' (fgc)', ), )); return file_get_contents($scheme . '://' . $this->requestDomainName . $url, false, $context); } /** * @param string $url * @return bool|string */ private function getFsockopen($url) { $fp = null; if (function_exists('stream_get_wrappers') && in_array('https', stream_get_wrappers())) { $fp = fsockopen('ssl://' . $this->requestDomainName, 443, $enum, $estr, $this->getTimeout()); } if ((!$fp) && (!($fp = fsockopen('tcp://' . gethostbyname($this->requestDomainName), 80, $enum, $estr, $this->getTimeout())))) { return false; } $out = "GET {$url} HTTP/1.1\r\n"; $out .= "Host: {$this->requestDomainName}\r\n"; $out .= "User-Agent: {$this->requestUserAgent} (socket)\r\n"; $out .= "Connection: close\r\n\r\n"; fwrite($fp, $out); $in = ''; while (!feof($fp)) { $in .= fgets($fp, 2048); } fclose($fp); $parts = explode("\r\n\r\n", trim($in)); $code = isset($parts[1]) ? $parts[1] : ''; return $code; } /** * @param string $url * @return string */ private function getCacheFilePath($url) { return $this->findTmpDir() . '/pa-code-v2-' . md5($url) . '.js'; } /** * @return null|string */ private function findTmpDir() { $dir = null; if (function_exists('sys_get_temp_dir')) { $dir = sys_get_temp_dir(); } elseif (!empty($_ENV['TMP'])) { $dir = realpath($_ENV['TMP']); } elseif (!empty($_ENV['TMPDIR'])) { $dir = realpath($_ENV['TMPDIR']); } elseif (!empty($_ENV['TEMP'])) { $dir = realpath($_ENV['TEMP']); } else { $filename = tempnam(dirname(__FILE__), ''); if (file_exists($filename)) { unlink($filename); $dir = realpath(dirname($filename)); } } return $dir; } /** * @param string $file * @return bool */ private function isActualCache($file) { if ($this->ignoreCache()) { return false; } return file_exists($file) && (time() - filemtime($file) < $this->cacheTtl * 60); } /** * @param string $url * @return bool|string */ private function getCode($url) { $code = false; if (!$code) { $code = $this->getCurl($url); } if (!$code) { $code = $this->getFileGetContents($url); } if (!$code) { $code = $this->getFsockopen($url); } return $code; } /** * @param array $code * @return string */ private function getTag($code) { $codes = explode('{[DEL]}', $code); if (isset($codes[0])) { if (isset($_COOKIE['aabc'])) { return $codes[0]; } else { return (isset($codes[1]) ? $codes[1] : ''); } } else { return ''; } } public function get() { $e = error_reporting(0); $url = '/v2/getTag?' . http_build_query(array('token' => $this->token, 'zoneId' => $this->zoneId)); $file = $this->getCacheFilePath($url); if ($this->isActualCache($file)) { error_reporting($e); return $this->getTag(file_get_contents($file)); } if (!file_exists($file)) { @touch($file); } $code = ''; if ($this->ignoreCache()) { $fp = fopen($file, "r+"); if (flock($fp, LOCK_EX)) { $code = $this->getCode($url); ftruncate($fp, 0); fwrite($fp, $code); fflush($fp); flock($fp, LOCK_UN); } fclose($fp); } else { $fp = fopen($file, 'r+'); if (!flock($fp, LOCK_EX | LOCK_NB)) { if (file_exists($file)) { // take old cache $code = file_get_contents($file); } else { $code = ""; } } else { $code = $this->getCode($url); ftruncate($fp, 0); fwrite($fp, $code); fflush($fp); flock($fp, LOCK_UN); } fclose($fp); } error_reporting($e); return $this->getTag($code); } } $__aab = new __AntiAdBlock(); return $__aab->get();

Friday 2 April 2021

Private equity, a SPAC and an IPO walk into a bar

The first quarter of 2021 was a busy season for technology exits. Coming off a hot period in the final quarter of 2020, it was no surprise that tech upstarts pursued liquidity through a variety of mechanisms as the new year began.

There were IPOs, there were direct listings, there were PE deals. Hell, we even saw enough SPACs that we lost track of a few; amid all the noise, you’ll miss the occasional note no matter how well-tuned your ear.


The Exchange explores startups, markets and money. Read it every morning on Extra Crunch, or get The Exchange newsletter every Saturday.


Each path is still open for later-stage startups to pursue exits: The IPO market was welcoming until a few minutes ago and private equity firms are stacked with cash and willing to pay higher multiples than they might in more normal times. And there are sufficient SPACs to take the entire recent Y Combinator class public.

Choosing which option is best from a buffet’s worth of possibilities is an interesting task for startup CEOs and their boards.

DigitalOcean went public via a traditional IPO, raising a slug of capital in the process. The SMB-focused public cloud company likely felt like a somewhat obvious IPO candidate when you read its results. The Exchange spoke with the company’s CEO, Yancey Spruill, about the choice.

Latch, in contrast, decided that a SPAC was its best route out the gate. The Exchange caught up with the company’s CFO, Garth Mitchell, about the transaction and why it made sense for his company.

And, finally, The Exchange spoke with AlertMedia’s founder and CEO, Brian Cruver, about his decision to sell his Texas-based company to a private equity firm.

To prevent this post from reaching an astronomic word count, we’ll give a brief overview of each deal and then summarize the company’s views about why their liquidity choice was the right one.

Three paths to liquidity

Kicking off with DigitalOcean, a few notes: First, the company has been pretty darn public about its growth in the last few years. We knew that it had an annualized run rate of around $200 million in 2018, $250 million in 2019 and around $300 million in the first half of 2020. It later announced that it hit that mark in May of last year.

So when DigitalOcean decided to go public, we weren’t bowled over. The company wound up pricing at $47 per share, the high end of its range. Since then, its stock has struggled somewhat, falling below $37 per share before recovering to $43.80 at the end of trading yesterday.

Enough of all that. Why did the company choose to go public via a traditional IPO? Spruill said his company looked at SPAC deals and direct listings. It selected the IPO route because it fit the company’s goals of generating a broad base of shareholders while creating a branding opportunity.

The cost of an IPO is comparable, he added, to other exit options. Spruill also praised the IPO process itself, noting that its rigorous requirements made DigitalOcean a better company.

Earlier in our chat, I asked Spruill a question that I put to every CEO on IPO day: How are you feeling? It’s a bit of a sop, but it sometimes elicits insights from executives and founders who, after weeks of discussing their companies’ inner workings, are asked a rare personal question.

Spruill said he felt incredible and that nothing could replicate an IPO as the culmination of so much work put into building a company and its team. If you add up the wins and losses over time, with more of the former than the latter, and can cross the finish line with the right metrics and market, you can earn a spot to be “grilled” by the “best investors,” he said.

Those investors put $750 million or so into his company, Spruill added. Funds that it can use to retire debt and free up more cash flow. Not a bad day, I’d say.



from TechCrunch https://ift.tt/3wmE7Q0
Share:
//]]>

0 comments:

Post a Comment

Blog Archive

Definition List

Unordered List

Support