Jump to content

QuickOldCar

Staff Alumni
  • Posts

    2,972
  • Joined

  • Last visited

  • Days Won

    28

Everything posted by QuickOldCar

  1. I think you are confused. sqlite2 versus sqlite3 pdo is a way to manage and display through database objects So in essence you use sqlite3 and pdo together.
  2. This is the easiest way. <?php $url = "http://www.phpfreaks.com"; $tag = get_meta_tags($url); echo $tag["keywords"]."<br />"; ?> Using curl and resolving the urls is a better way.
  3. Here's a starter rss feed php code, change the values that you need, add whatever else would want. This uses the same code and always seems to validate: http://dynaindex.com/feed http://validator.w3.org/feed/check.cgi?url=http%3A%2F%2Fdynaindex.com%2Ffeed <?php header("Content-Type: application/rss+xml; charset=UTF-8"); DEFINE ('DB_USER', 'username');//change username DEFINE ('DB_PASSWORD', 'databasepassword');//change databasepassword DEFINE ('DB_HOST', 'localhost');//usually is localhost DEFINE ('DB_NAME', 'databasename');//change databasename $rssfeed = '<?xml version="1.0" encoding="UTF-8"?>'; $rssfeed .= '<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">'; $rssfeed .= '<channel>'; $rssfeed .= '<atom:link href="http://mysite.com/feed" rel="self" type="application/rss+xml" />';//change $rssfeed .= '<title>Mysite.com Feed</title>';//change $rssfeed .= '<link>http://mysite.com</link>';//change $rssfeed .= '<description>New Posts</description>';//optional change $rssfeed .= '<language>en-us</language>'; $rssfeed .= '<copyright>Copyright (C) 2011 Mysite.com</copyright>';//change $connection = @mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die('Could not connect to database'); mysql_select_db(DB_NAME) or die ('Could not select database'); $query = "SELECT * FROM table_name ORDER BY ID DESC LIMIT 0,10";//change table_name,maybe ID to id, optional mysql parameters $result = mysql_query($query) or die ("Could not execute query"); while($row = mysql_fetch_array($result)) { //change any of the values below to your specific needs $post_url = "http://".$row['post_title'];//change,this is for title $hyperlink = "<a href='http://somesite.com/$post_url'>$post_url</a> ";//change $title = $row['title_2'];//i use alternate titles and post_url is my titles $title = htmlentities($title);//clean odd characters $post_date = $row['post_date'];//date $permalink = "http://somesite.com/".$row['post_name'];//change $thumb = "http://somesite.com/images/imagelocation";//if added images change //$rssfeed .= '<image>'; //$rssfeed .= '<url>' .$thumb. '</url>'; //$rssfeed .= '<title>' . $post_url . '</title>'; //$rssfeed .= '<link>' . $thumb . '</link>'; //$rssfeed .= '</image>'; $rssfeed .= '<item>'; $rssfeed .= '<title>' . $post_url . '</title>'; $rssfeed .= '<guid>' . $permalink . '</guid>'; $rssfeed .= '<description>' . $title . '</description>'; //$rssfeed .= '<image>' .$thumb. '</image>';//may need to do images different $rssfeed .= '<link>' . $permalink .'</link>'; $rssfeed .= '<pubDate>' . date("D, d M Y H:i:s O", strtotime($post_date)) . '</pubDate>'; $rssfeed .= '</item>'; } $rssfeed .= '</channel>'; $rssfeed .= '</rss>'; echo $rssfeed; ?> Forgot to mention, just make a folder named feed, and name this file index.php your address would then be like http://mysite.com/feed
  4. A simple design for a simple question..... I did notice this. <meta name="keywords" content="fullahead, pat, heard, free, template, OWD, more, keywords, comma, seperated" /> Should do keywords related to your site. I signed up, asked a simple question. Odd way you have there that that the site appears in the lightbox, and then gotta close the box. Where are all the other questions, is it just for your own questions? Just didn't make sense to me.... how can anyone answer a question for somebody else. Or is this your own little private one on one chat system that they ask and you tell them yourself.
  5. Maybe try to target the download a new window and force close window with javascript when completed.
  6. when i run the same code I get this in the source, also displays correct in browser "\´\“"\”\‘\’\«\»
  7. I forgot to mention can also include or exclude using + or - before the words or characters.
  8. "seacrh" and "search" are two different words, I should hope they didn't have a match. If needed something like similar words as you described would take enormous work, you would need to manually do word associations for every possible item someone would search for. Is multiple ways to do searches, is like,match and then can use normal index, then full_text. I personally use a mixture, but for the main searches I made full text indexes in mysql for the values looking into. I use booleon mode. http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html You can do full,partial,beginning,ending,exact phrases,only one word and so on. If want to find words with at least 3 letters need to change this ft_min_word_len=3
  9. You can just include the content as well. <?php include_once('header.php');?> <div id="bodywrapper"> <div id="main"> <div id="content"> <?php include_once('content.php');?> </div> </div> </div> <?php include_once('footer.php');?> I feel is a good way to do it. Sometimes would like the page different too, so can break in and out of php and call for different header and content area or styles if would like. <?php include_once('header.php'); echo"all php code up top"; ?> <div> html code if need to </div> <?php echo "back into php with some more code"; $variable = 'name your variables but echo it in the html area below'; ?> best practice is to place all html together at the bottom and echo any php into it, or even just a php section that echoes php and html I guess it all just matters on what need to do with it or how complex it is.
  10. In my case I have multiple words and characters like + and - as the word because they are search terms like +funny + video, or can be funny video or even just a single word. I made a function to handle and explode the words so can highlight them all if using multiple words or still does the single words too. I'm in the process of making different colors for when there are multiple words. <?php function highlighter($words, $content) { preg_match_all('~\w+~', $words, $matched); if(!$matched) { return $content; } $regex_pattern = '~\\b('.implode('|', $matched[0]).')\\b~i'; return preg_replace($regex_pattern, "<span style='background-color:#43C6DB;'><FONT COLOR=Yellow>$0</FONT></span>", $content); } ?> <?php //some sample content and words $the_single_word = "single"; $the_words = "The words"; $content = "This is the content area or any text area values you want. It should highlight any time the words or The Words or even the Words are used. It will highligt any time the or any time words is used. The Words is the multiple version, if want just a single word then use just one word. I'll use an example word like singleton. See, has to match the word. Stuff like +single , are you single?, or single.com works.<br />"; //example usage $content_area =highlighter($the_words,$content); $content_area_2 =highlighter($the_single_word,$content); //show results echo "<h2>Multiple words</h2>"; echo "$content_area<br />"; echo "<h2>Single words</h2>"; echo "$content_area_2"; ?> Live Demo http://get.blogdns.com/highlight-words.php
  11. Although there are a few, very few pagination scripts out there, they are very limited in what can do because all databases and circumstances are different, so I really doubt would ever see a simple function for this. It takes manual work for your specific needs to make it all work together. What webbhelp said is correct. You can do it by switch/case or if/else statements and use variables to reflect any superglobals like GET,POST,RESQUEST and so on. I did a few examples on other posts can check out Here's a post in the forum for a pagination that controls the count for start rows http://www.phpfreaks.com/forums/php-coding-help/results-on-multiple-pages-help/msg1506457/#msg1506457 Live Demo for the above code http://get.blogdns.com/dynaindex/paginate.php Otherwise I do have an example of code involving multi-select queries based on search terms, it won't be a working example but can get an idea how to go about it. http://www.phpfreaks.com/forums/php-coding-help/remove-commas-from-search-string-and-pass-results-to-a-query/msg1504627/#msg1504627
  12. I guess is many ways to do this. <?php $url = filter_var("http://".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'], FILTER_SANITIZE_STRING); if (!empty($_SERVER["QUERY_STRING"])){ $query_string = filter_var($_SERVER['QUERY_STRING'], FILTER_SANITIZE_STRING); $url .= "?".$query_string; } echo "<a href='$url'>$url</a><br />"; if (empty($_SERVER["QUERY_STRING"])){ echo "Showing index.php"; } else { echo "Showing everything"; } ?>
  13. I found this to show some examples of church sites. I do notice many try to get the warm inviting feeling. You know....earthly like ground,clouds and nature,heavenly with clouds, soft sunsets http://vandelaydesign.com/blog/wordpress/best-church-websites/ Just as an idea, how about the posts are bible looking paper and text, with some age to the corners or curls, an old type writing instrument at the top of the page as a separator, can go the old leather bound route too. Here's an old paper background to get the idea http://www.psdgraphics.com/file/old-paper-background.jpg another example http://www.poweredtemplates.com/_src_brochure/03789/ad_template_b.jpg
  14. Well the text area is quite large and big text, but I do understand some have a hard time seeing. As a simple example place say a stained glass image for your body background in your .css file body{ background: #0066CC; background-image: url('img/stainedglass.png'); and take it from there, ditch the bright blue for everything and get some soft earthly colors
  15. I would think you make a field name quantity and an amount of how many items in it for each item. In this case you say is only one Have a script checking mysql each time someone adds an item to their cart, change the 1 to 0 if they don't complete the transaction then place the quantity back to 1 I guess can use true or false as well mysql query... $quantity = $row['quantity']; if ($quantity < 1 ){ $stop_the_purchase = "some code to say is not available, don't let add to cart"; header('Location: /'); exit; }
  16. Yeah I would think having a slow front page is bad for people looking to get hosting, they may think the servers speed is slow.
  17. Awwww man, was I disappointed when i tried to strum across all the strings and it didn't work. That would be really neat if can incorporate that so can just swipe the mouse over strings versus having to click. On Hover Hmm, maybe an on hover but also only when left clicked
  18. More looking like church related..... stained glass is always good, cathedrals, backdrop of the church, some crosses, the good book somewhere. You have to give it a more warm and inviting color, like earthtones.
  19. You can break this down to something more specific to your needs as a function. like this: <?php $url = "http://localhost/application/blog/view/Test-Blog-Entry/1"; function explodePaths($new_parse_url) { $get_path_parse_url = parse_url($new_parse_url, PHP_URL_PATH); $path_parts = explode("/",$get_path_parse_url); RETURN $path_parts; } echo "url: $url<br />"; $paths = explodePaths($url); print_r($paths); ?> this returns: Array ( [0] => [1] => application [2] => blog [3] => view [4] => Test-Blog-Entry [5] => 1 ) or since I have the complete you can have this too if need it: <?php $url = "http://localhost/application/blog/view/Test-Blog-Entry/1"; function getparsedHost($new_parse_url) { $parsedUrl = parse_url(trim($new_parse_url)); return trim($parsedUrl[host] ? $parsedUrl[host] : array_shift(explode('/', $parsedUrl[path], 2))); } $new_parse_url = $url; $get_parse_url = parse_url($new_parse_url, PHP_URL_HOST); $host_parse_url .= str_replace(array('Www.','WWW.'), '', $get_parse_url); $host_parse_url = strtolower($host_parse_url); $port_parse_url = parse_url($new_parse_url, PHP_URL_PORT); $user_parse_url = parse_url($new_parse_url, PHP_URL_USER); $pass_parse_url = parse_url($new_parse_url, PHP_URL_PASS); $get_path_parse_url = parse_url($new_parse_url, PHP_URL_PATH); $path_parts = explode("/",$get_path_parse_url); $extract_path_1 = $path_parts[1]; $extract_path_2 = $path_parts[2]; $extract_path_3 = $path_parts[3]; $extract_path_4 = $path_parts[4]; $extract_path_5 = $path_parts[5]; $path_parse_url .= str_replace(array('Www.','WWW.'), '', $get_path_parse_url); $query_parse_url = parse_url($new_parse_url, PHP_URL_QUERY); $query_parse_url = "?$query_parse_url"; $query_parse_url = rtrim($query_parse_url, '#'); $fragment_parse_url = parse_url($new_parse_url, PHP_URL_FRAGMENT); $fragment_parse_url = "#$fragment_parse_url"; $hostpath_url = "$host_parse_url$path_parse_url"; $hostpath_url = rtrim($hostpath_url, '?'); $query_parse_url = rtrim($query_parse_url, '?'); $hostpathquery_url = "$host_parse_url$path_parse_url$query_parse_url"; $complete_url = "$host_parse_url$port_parse_url$user_parse_url$pass_parse_url$path_parse_url$query_parse_url$fragment_parse_url"; $complete_url = rtrim($complete_url, '#'); //adding http back to front, can do substr checks in url to suit your needs $complete_url = "http://$complete_url"; $parsed = getparsedHost($new_parse_url); echo "url: $url<br />"; echo "parsed: $parsed <br />"; echo "host parse: $host_parse_url<br />"; echo "path parse: $path_parse_url<br />"; echo "extract path 1: $extract_path_1<br />"; echo "extract path 2: $extract_path_2<br />"; echo "extract path 3: $extract_path_3<br />"; echo "extract path 4: $extract_path_4<br />"; echo "extract path 5: $extract_path_5<br />"; echo "host and path: $hostpath_url<br />"; echo "complete: $complete_url<br />"; ?>
  20. I don't understand this, can you type out expected results for the number sequence
  21. I wasn't happy with the results the first "page keyword extractor", I improved upon it best I could. See the section that has all the tags like <form>,<image> so on, if remove any it will not look for words within the tag area, if add a new tag it will also include that area. I started to make exclusions for common useless words at the end, just add any words you don't want to see. Is this perfect? Hardly, does a fairly decent job though. <?php function getparsedHost($new_parse_url) { $parsedUrl = parse_url(trim($new_parse_url)); return trim($parsedUrl[host] ? $parsedUrl[host] : array_shift(explode('/', $parsedUrl[path], 2))); } $url_input = mysql_real_escape_string($_GET['url']); $input_parse_url = strtolower(getparsedHost($url_input)); /*check for valid urls*/ if ((substr($input_parse_url, 0, == "https://") OR (substr($input_parse_url, 0, 12) == "https://www.") OR (substr($input_parse_url, 0, 7) == "http://") OR (substr($input_parse_url, 0, 11) == "http://www.") OR (substr($input_parse_url, 0, 6) == "ftp://") OR (substr($input_parse_url, 0, 11) == "feed://www.")OR (substr($input_parse_url, 0, 7) == "feed://")) { $new_parse_url = $input_parse_url; } else { /*replace uppercase or unsupported to normal*/ $clean_url .= str_replace(array('feed://www.','feed://','HTTP://','HTTP://www.','HTTP://WWW.','http://WWW.','HTTPS://','HTTPS://www.','HTTPS://WWW.','https://WWW.'), '', $input_parse_url); $new_parse_url = "http://$clean_url"; } if (!isset($_GET['url'])) { $new_parse_url = "http://www.aol.com"; } ?> <div align="center"> <h3>Extract Keywords</h3> <form action="" method="get"> Insert url: <input type="text" name="url" value="<?php echo $new_parse_url;?>" class="text" style="width:480px; height:25px;" /> <input type="submit" value="Go" class="button" style="width:80px; height:30px;" /> </form> </div> <?php $file_data = file_get_contents($new_parse_url); preg_match( '@<meta\s+http-equiv="Content-Type"\s+content="([\w/]+)(;\s+charset=([^\s"]+))?@i', $file_data, $matches ); if (isset($matches[1])) { $mime = $matches[1]; } if (isset($matches[3])) { $charset = $matches[3]; } $utf8_text = iconv( $charset, "utf-8", $file_data ); $utf8_text = preg_replace('#<script[^>]*>.*?</script>#is','',$utf8_text); //ummm can add the 500 tld and sld's here, i was too lazy $utf8_text = str_replace(array(".com",".net",".biz",".org",".info",".co.uk","http","n't"," ","|","<p>","</p>","<br>","<br />","<br/>","</a>","<img>","</img>","<ul>","</ul>","<li>","</li>","<head>","</head>","<div>","</div>","<form>","</form>","<body>","</body>"), '|', $utf8_text); $utf8_text = strip_tags(str_replace(array('[',']'), array('<','>'), $utf8_text)); $utf8_text = strip_tags($utf8_text); $keywords = str_replace(array(' ',' ',',','-','>','/','<','(',')','?'), '|', $utf8_text); $keywords = str_replace(array("'",",","\r","\n"), "|", $utf8_text); $utf8_text = html_entity_decode( $utf8_text, ENT_QUOTES, "utf-8" ); $unwanted_items = array (" ","| ?","| ","||",".","-","=","!","@","#","$","%","^","&","?","var","gaJsHost","?","'",";",":","\r","\n",",","*",'"',"(",")","{","}","/","//"); $keywords = str_replace($unwanted_items,"|",$utf8_text); $keywords = trim($keywords); function strip_symbols($text) { $plus = '\+\x{FE62}\x{FF0B}\x{208A}\x{207A}'; $minus = '\x{2012}\x{208B}\x{207B}'; $units = '\\x{00B0}\x{2103}\x{2109}\\x{23CD}'; $units .= '\\x{32CC}-\\x{32CE}'; $units .= '\\x{3300}-\\x{3357}'; $units .= '\\x{3371}-\\x{33DF}'; $units .= '\\x{33FF}'; $ideo = '\\x{2E80}-\\x{2EF3}'; $ideo .= '\\x{2F00}-\\x{2FD5}'; $ideo .= '\\x{2FF0}-\\x{2FFB}'; $ideo .= '\\x{3037}-\\x{303F}'; $ideo .= '\\x{3190}-\\x{319F}'; $ideo .= '\\x{31C0}-\\x{31CF}'; $ideo .= '\\x{32C0}-\\x{32CB}'; $ideo .= '\\x{3358}-\\x{3370}'; $ideo .= '\\x{33E0}-\\x{33FE}'; $ideo .= '\\x{A490}-\\x{A4C6}'; return preg_replace( array( // Remove modifier and private use symbols. '/[\p{Sk}\p{Co}]/u', // Remove mathematics symbols except + - = ~ and fraction slash '/\p{Sm}(?<![' . $plus . $minus . '=~\x{2044}])/u', // Remove + - if space before, no number or currency after '/((?<= )|^)[' . $plus . $minus . ']+((?![\p{N}\p{Sc}])|$)/u', // Remove = if space before '/((?<= )|^)=+/u', // Remove + - = ~ if space after '/[' . $plus . $minus . '=~]+((?= )|$)/u', // Remove other symbols except units and ideograph parts '/\p{So}(?<![' . $units . $ideo . '])/u', // Remove consecutive white space '/ +/', ), ' ', $text ); } $keywords = mb_strtolower($keywords); $keywords = explode("|", $keywords); $keywords = array_unique($keywords); sort($keywords); $remove_common_words = array("0","1","2","3","4","5","6","7","8","9","a","all","by","but","each","has","have","how","the","and","login","no","or","our","for","with","you","your","are","not","out","some","soon","take","then","there","their","this","that","try","way","what","which","when","where","why","with"); foreach ($keywords as $keyword) { $keyword_length = strlen($keyword); if ($keyword_length > 2){ $keyword = strip_symbols($keyword); if ($keyword != '') { if (!in_array(end(explode('"', strtolower($keyword))), $remove_common_words)){ echo "$keyword<br />"; } } } } ?>
  22. Just made this for ripping keywords, modify it as you please. <?php $url = "http://www.aol.com"; $file_data = file_get_contents($url); preg_match( '@<meta\s+http-equiv="Content-Type"\s+content="([\w/]+)(;\s+charset=([^\s"]+))?@i', $file_data, $matches ); if (isset($matches[1])) { $mime = $matches[1]; } if (isset($matches[3])) { $charset = $matches[3]; } $utf8_text = iconv( $charset, "utf-8", $file_data ); $utf8_text = preg_replace('#<script[^>]*>.*?</script>#is','',$utf8_text); $utf8_text = str_replace(array(".com",".net",".biz",".org",".info",".co.uk","http","n't"," ","|","<p>","</p>","<br>","<br />","<br/>","</a>","<img>","</img>","<ul>","</ul>","<li>","</li>","<head>","</head>","<form>","</form>","<body>","</body>"), '|', $utf8_text); $utf8_text = strip_tags(str_replace(array('[',']'), array('<','>'), $utf8_text)); $utf8_text = strip_tags($utf8_text); $keywords = str_replace(array(' ',' ',',','-','>','/','<','(',')','?'), '|', $utf8_text); $keywords = str_replace(array("'",",","\r","\n"), "|", $utf8_text); $utf8_text = html_entity_decode( $utf8_text, ENT_QUOTES, "utf-8" ); $unwanted_items = array (" ","| ?","| ","||",".","-","=","!","@","#","$","%","^","&","?","var","gaJsHost","?","'",";",":","\r","\n",","); $keywords = str_replace($unwanted_items,"|",$utf8_text); $keywords = trim($keywords); function strip_symbols($text) { $plus = '\+\x{FE62}\x{FF0B}\x{208A}\x{207A}'; $minus = '\x{2012}\x{208B}\x{207B}'; $units = '\\x{00B0}\x{2103}\x{2109}\\x{23CD}'; $units .= '\\x{32CC}-\\x{32CE}'; $units .= '\\x{3300}-\\x{3357}'; $units .= '\\x{3371}-\\x{33DF}'; $units .= '\\x{33FF}'; $ideo = '\\x{2E80}-\\x{2EF3}'; $ideo .= '\\x{2F00}-\\x{2FD5}'; $ideo .= '\\x{2FF0}-\\x{2FFB}'; $ideo .= '\\x{3037}-\\x{303F}'; $ideo .= '\\x{3190}-\\x{319F}'; $ideo .= '\\x{31C0}-\\x{31CF}'; $ideo .= '\\x{32C0}-\\x{32CB}'; $ideo .= '\\x{3358}-\\x{3370}'; $ideo .= '\\x{33E0}-\\x{33FE}'; $ideo .= '\\x{A490}-\\x{A4C6}'; return preg_replace( array( // Remove modifier and private use symbols. '/[\p{Sk}\p{Co}]/u', // Remove mathematics symbols except + - = ~ and fraction slash '/\p{Sm}(?<![' . $plus . $minus . '=~\x{2044}])/u', // Remove + - if space before, no number or currency after '/((?<= )|^)[' . $plus . $minus . ']+((?![\p{N}\p{Sc}])|$)/u', // Remove = if space before '/((?<= )|^)=+/u', // Remove + - = ~ if space after '/[' . $plus . $minus . '=~]+((?= )|$)/u', // Remove other symbols except units and ideograph parts '/\p{So}(?<![' . $units . $ideo . '])/u', // Remove consecutive white space '/ +/', ), ' ', $text ); } $keywords = mb_strtolower($keywords); $keywords = explode("|", $keywords); $keywords = array_unique($keywords); sort($keywords); foreach ($keywords as $keyword) { $keyword_length = strlen($keyword); if ($keyword_length > 2){ $keyword = strip_symbols($keyword); if ($keyword != '') { echo "$keyword<br />"; } } } ?>
  23. Is probably a better way, but just made this, so you can set minimum keyword length and add any characters would not like to see into the replace array <?php $keywords = file_get_contents('http://suggestqueries.google.com/complete/search?hl=en&gl=us&ds=pr&client=products&hjson=t&jsonp=ac_hr&q=paintball&cp=2'); $keywords = explode('"',$keywords ); $keywords = str_replace(array('(',')','[',']','?','/','<','>','*'), '', $keywords); foreach ($keywords as $keyword) { $keyword_length = strlen($keyword); if ($keyword_length > 3){ echo "$keyword<br />"; } } ?>
  24. For reference. Everyone working with php should at least read the php manual, or relative content with what they are doing. http://www.php.net/manual/en/index.php Here's just the string functions http://www.php.net/manual/en/ref.strings.php for any user input, don't use directly any superglobals in mysql queries, Those would be like $_POST,$_GET,$_REQUEST and so on. http://php.net/manual/en/language.variables.superglobals.php always escape them first http://php.net/manual/en/function.mysql-real-escape-string.php use for cleaning the input the following http://php.net/manual/en/function.htmlentities.php or http://www.php.net/manual/en/function.htmlspecialchars.php to strip the slashes http://www.php.net/manual/en/function.stripslashes.php And as Pikachu2000 said, you would be open to all types of attacks not taking the above measures. I guarantee you would get hacked,deleted databases and whatnot fairly fast. The biggest rule is "Never Trust User Input", not ever. You just can't allow every character.
  25. Maybe you are happy with your code, but if wanted something more I wrote up a pagination script that controls the mysql start and stop rows. Also added +x amount of pages if available and a go to page text area as well. Here's the code in the forums http://www.phpfreaks.com/forums/php-coding-help/results-on-multiple-pages-help/msg1506457/#msg1506457 If want to test it, here's the live demo. http://get.blogdns.com/dynaindex/paginate.php Maybe can even use something from it for yours.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.