diff options
| author | s1n <[email protected]> | 2020-03-28 10:31:08 -0700 |
|---|---|---|
| committer | s1n <[email protected]> | 2020-03-28 10:31:08 -0700 |
| commit | 6b81836e6b9815a2996a55ad37dcaa4d89f99e42 (patch) | |
| tree | 74bb9aa78ca31a6acfffd908e34dfb0df433c707 | |
| parent | Create .gitignore (diff) | |
| download | cyne.cf-backup-master.tar.xz cyne.cf-backup-master.zip | |
174 files changed, 15179 insertions, 0 deletions
diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..f5e1e5e --- /dev/null +++ b/.htaccess @@ -0,0 +1,13 @@ +# Error pages +ErrorDocument 400 /404.html +ErrorDocument 401 /404.html +ErrorDocument 403 /404.html +ErrorDocument 404 /404.html + +ErrorDocument 500 /404.html + +#RewriteEngine On +#RewriteCond %{SERVER_PORT} 80 +#RewriteRule ^(.*)$ https://cyne.cf/$1 [R,L] + +Options -Indexes
\ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 0000000..1173692 --- /dev/null +++ b/404.html @@ -0,0 +1,117 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - 404</title> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <!-- External Libraries --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/trianglify/0.3.1/trianglify.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <!-- CSS Links --> + <!-- Why am I so dumb, I just found out why the css wasn't working on the 404 with a trailing slash on Stack Overflow, lol, then I + went through ALL of the files checking if I had any more "./" instead of absolute path and turns out this is the only file I didn't go through...--> + <link rel="stylesheet" href="/about/css/main.css"> + <link rel="stylesheet" href="/about/css/navigation-bar.css"> + <link rel="stylesheet" href="/about/css/loader-animation.css"> + <link rel="stylesheet" href="/about/css/blog-slider.css"> + <link rel="stylesheet" href="/404/css/main.css"> + <!-- Site metadata --> + <meta name="description" content="Error 404"> + <meta property="og:description" content="Error 404"> + <meta property="og:title" content="s1nical - 404"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/404.html"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/404.html"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "Error: 404", + "headline": "Error: 404", + "url": "https://cyne.cf/404.html", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <!-- Invisible Scripts --> + <script src="/js/loader-animation.js"></script> + <script src="/js/refresh-on-media.js"></script> +</head> + + <body> + <!-- Visable Scripts --> + <script src="/js/background-sparkles.js"></script> + + <!-- Navigation Bar --> + <div class="navigation-bar"> + <nav class="nav"> + <a href="/home/" class="nav-item" active-color="orange">Home</a> + <!-- Had `is-active` after it but removed it due to not highlighting. --> + <a href="/about/" class="nav-item" active-color="green">About</a> <!-- About --> + <a href="https://cyne.cf/status" class="nav-item" active-color="red">Status</a> <!-- Blog --> + <!--<a href="/cars/" class="nav-item" active-color="rebeccapurple">Cars</a> <!-- Contact --> + <!--<a href="https://nani.s1n.pw" class="nav-item" active-color="rebeccapurple">Nani?!</a>--> + <span class="nav-indicator"></span> + </nav> + </div> + + <div class="bio"> + <div class="links"> + <div class="blog-slider"> + <div class="content" style="text-align: center;"> + <h1>404</h1> + <h2>Page not found</h2> + <h1><!-- Filler --></h1> + <a class="mobile" href="/home/">Back home</a> + <h1 class="mobile"><!-- Filler --></h1> + </div> + </div> + </div> + </div> + + <!-- Loading Animation --> + <div class="loader-wrapper"> + <div class="loader"> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + </div> + </div> + </body> + +</html> diff --git a/404/.htaccess b/404/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/404/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/404/css/main.css b/404/css/main.css new file mode 100644 index 0000000..ad791a3 --- /dev/null +++ b/404/css/main.css @@ -0,0 +1,35 @@ +.content { + text-align: center; + color: #000000; +} + +.content h1 { + font-weight: 900; + line-height: 1; + margin-bottom: -10px; + opacity: 0.6; +} + +.content h2 { + font-weight: 700; + margin-bottom: 6px; + opacity: 0.9; +} + +@media(max-width: 768px) { + .navigation-bar { + display: none; + } + + .bio { + margin: auto; + width: 100%; + padding: 0; + } +} + +@media(min-width: 768px) { + .mobile { + display: none; + } +}
\ No newline at end of file diff --git a/about/css/.htaccess b/about/css/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/about/css/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/about/css/blog-slider.css b/about/css/blog-slider.css new file mode 100644 index 0000000..995faff --- /dev/null +++ b/about/css/blog-slider.css @@ -0,0 +1,16 @@ +.blog-slider { + /* width: 95%; */ + position: relative; + max-width: auto; + margin: auto; + background: #fff; + -webkit-box-shadow: 0px 14px 80px rgba(34, 35, 58, 0.2); + box-shadow: 0px 14px 80px rgba(34, 35, 58, 0.2); + padding: 25px; + border-radius: 25px; + height: auto; + -webkit-transition: all .3s; + transition: all .3s; + /* margin-top: -15px; /*for exact positioning */ + /* margin-top: -5%; /* for relative positioning */ +}
\ No newline at end of file diff --git a/about/css/loader-animation.css b/about/css/loader-animation.css new file mode 100644 index 0000000..6e3bd1b --- /dev/null +++ b/about/css/loader-animation.css @@ -0,0 +1,122 @@ +/* LOADING ANIMATION */ +/* body { +** text-align: center; +** padding-top: 20%; +** background: #fdfdfd; +** } +*/ + +.loader-wrapper { + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + background: #fdfdfd; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.loader { + width: 100px; + height: 100px; + display: inline-table; + -webkit-box-sizing: border-box; + box-sizing: border-box; + position: relative; + border-spacing: 0.3em; +} + +.loader row { + display: table-row; +} + +.loader row span { + display: table-cell; + position: relative; + background: #1d1f20; + opacity: 0; + -webkit-animation: flicker 0.5985999999999999s ease-out infinite alternate; + animation: flicker 0.5985999999999999s ease-out infinite alternate; + /* Added standard property to fix compatbiliy issues */ +} + +@-webkit-keyframes flicker { + + from, + 20% { + opacity: 0; + } + + 100%, + to { + opacity: 1; + } +} + +@keyframes flicker { + + /* Added standard property to fix compatbiliy issues */ + from, + 20% { + opacity: 0; + } + + 100%, + to { + opacity: 1; + } +} + +.loader row:nth-child(1) span:nth-child(1) { + -webkit-animation-delay: .50s; + animation-delay: .50s; +} + +/* Added standard property to fix compatbiliy issues */ +.loader row:nth-child(1) span:nth-child(2) { + -webkit-animation-delay: .70s; + animation-delay: .70s; +} + +.loader row:nth-child(1) span:nth-child(3) { + -webkit-animation-delay: .60s; + animation-delay: .60s; +} + +.loader row:nth-child(2) span:nth-child(1) { + -webkit-animation-delay: .20s; + animation-delay: .20s; +} + +.loader row:nth-child(2) span:nth-child(2) { + -webkit-animation-delay: .80s; + animation-delay: .80s; +} + +.loader row:nth-child(2) span:nth-child(3) { + -webkit-animation-delay: .90s; + animation-delay: .90s; +} + +.loader row:nth-child(3) span:nth-child(1) { + -webkit-animation-delay: .10s; + animation-delay: .10s; +} + +.loader row:nth-child(3) span:nth-child(2) { + -webkit-animation-delay: .30s; + animation-delay: .30s; +} + +.loader row:nth-child(3) span:nth-child(3) { + -webkit-animation-delay: .40s; + animation-delay: .40s; +}
\ No newline at end of file diff --git a/about/css/main.css b/about/css/main.css new file mode 100644 index 0000000..bd80b97 --- /dev/null +++ b/about/css/main.css @@ -0,0 +1,32 @@ +.title { + text-align: none; +} + +.desc { + text-align: center; +} + +.bio { + font-size: 22px; + padding-top: 100px +} + +.title2 { + text-align: none; + background-color: #fcac94; + -webkit-box-shadow: 0 7px 30px -10px #fcac94, 0 7px 30px -10px #fcac94; + box-shadow: 0 7px 30px -10px #fcac94, 0 7px 30px -10px #fcac94; + -webkit-transition: background-color 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out; + width: 456px; +} + +.disclaimer { + font-size: 17px; + font-weight: 600; +} + +.important { + color: red; + font-size: 20px +}
\ No newline at end of file diff --git a/about/css/navigation-bar.css b/about/css/navigation-bar.css new file mode 100644 index 0000000..9d93988 --- /dev/null +++ b/about/css/navigation-bar.css @@ -0,0 +1,208 @@ +/* BACKGROUND SPARKLES CSS */ +@import url("https://fonts.googleapis.com/css?family=DM+Sans:500,700&display=swap"); + +html, +body { + margin: 0 0; + padding: 0 0; + font-size: 0; + background-color: #fdfcf3; +} + +body svg { + position: absolute; + top: 0; + left: 0; + z-index: -1; +} + +/* ORINGINAL SITE CSS */ +html { + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-tap-highlight-color: transparent; +} + +*, +*:before, +*:after { + -webkit-box-sizing: inherit; + box-sizing: inherit; +} + +html, +body { + height: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row wrap; + flex-flow: row wrap; +} + +body { + font: normal 20px/1.4 'Inter', sans-serif; + margin: 0 1em; + padding: 1em 0; + color: #000; + background: none; +} + +@supports (font-variation-settings: normal) { + body { + font-family: 'Inter var', sans-serif; + } +} + +main { + /* margin: auto; ** This is only needed for mobile */ + font-size: 6vh; + line-height: 1.2; + max-width: 75vh; +} + +/* I was trying to figure out how to only call the <a> tags from index.html, so it wouldn't change the values for other <a> tags, and I tried everything, +** or so I thought, and I figured out I had to do `.links a` by scrolling up and saw `.loader row span` which wasn't even the correct syntax but I removed +** the `row` and IT WORKED! I actually got so happy lol. - 2:15 AM, 8/7/2019 +*/ +.links a { + color: inherit; + text-decoration: none; + background-color: #ffdc73; + /* hsl(200, 100%, 80% */ + -webkit-box-shadow: 0 7px 30px -10px #ffdc73, 0 7px 30px -10px #ffdc73; + box-shadow: 0 7px 30px -10px #ffdc73, 0 7px 30px -10px #ffdc73; + -webkit-transition: background-color 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out; +} + +/* #ffdc73 box-shadow should usually be only box-shadow, but I made it two so it would be more visable. +// Secondary box-shadow, rgba(154,160,185,0.05) +*/ +.links a:hover, +.links a:focus { + outline: none; + background-color: #282936; + color: #fff; + -webkit-transition: color 0.15s ease-in-out; + transition: color 0.15s ease-in-out; + -webkit-box-shadow: 0 7px 30px -10px #282936, 0 7px 30px -10px #282936; + box-shadow: 0 7px 30px -10px #282936, 0 7px 30px -10px #282936; + /* rgba(166,173,201,0.2) */ + -webkit-transition: -webkit-box-shadow 0.15s ease-in-out; + transition: -webkit-box-shadow 0.15s ease-in-out; + transition: box-shadow 0.15s ease-in-out; + transition: box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; +} + +/* NAVIGATION MENU */ +.navigation-bar { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex: 1 0 100%; + flex: 1 0 100%; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.nav { + overflow: hidden; + max-width: 100%; + background-color: #fff; + padding: 0 20px; + border-radius: 40px; + -webkit-box-shadow: 0 10px 40px rgba(159, 162, 177, 0.8); + box-shadow: 0 10px 40px rgba(159, 162, 177, 0.8); + position: absolute; + /* Only reason it's centered. */ + /* Manual position adjusting + ** top: 0; + ** left: 0; + */ + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.nav-item { + color: #83818c; + padding: 20px; + text-decoration: none; + -webkit-transition: .3s; + transition: .3s; + margin: 0 6px; + font-family: 'DM Sans', sans-serif; + font-weight: 500; + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.nav-item:before { + content: ""; + position: absolute; + bottom: -6px; + left: 0; + width: 100%; + height: 5px; + background-color: #dfe2ea; + border-radius: 8px 8px 0 0; + opacity: 0; + -webkit-transition: .3s; + transition: .3s; +} + +.nav-item:not(.is-active):hover:before { + opacity: 1; + bottom: 0; +} + +.nav-item:not(.is-active):hover { + color: #333; +} + +.nav-indicator { + position: absolute; + left: 0; + bottom: 0; + height: 4px; + -webkit-transition: .4s; + transition: .4s; + height: 5px; + z-index: 1; + border-radius: 8px 8px 0 0; +} + +@media (max-width: 580px) { + .nav { + overflow: auto; + } +} diff --git a/about/index.html b/about/index.html new file mode 100644 index 0000000..4c06b09 --- /dev/null +++ b/about/index.html @@ -0,0 +1,375 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - About</title> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <!-- Site metadata --> + <meta name="description" content="About"> + <meta property="og:description" content="About"> + <meta property="og:title" content="s1nical - About"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/about"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/about"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "About", + "headline": "About", + "url": "https://cyne.cf/about", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <!-- External Libraries --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/trianglify/0.3.1/trianglify.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <!-- CSS Links --> + <link rel="stylesheet" href="/about/css/main.css"> + <link rel="stylesheet" href="/about/css/navigation-bar.css"> + <link rel="stylesheet" href="/about/css/loader-animation.css"> + <link rel="stylesheet" href="/about/css/blog-slider.css"> + <style> + + html { + overflow-x: hidden; + } + </style> + <!-- Invisable Scripts --> + <script src="/js/loader-animation.js"></script> + <script src="/js/redirect-to-mobile.js"></script> +</head> +<body> + <!-- Visable Scripts --> + <script> + // Background only renders based on the original browser window size when + // starting to load the site. Due to rendering issues, I don't think I + // can do it other wise. + + /////////////// + // SCRIPT #1 // + /////////////// + + // If light mode detected, in reality, if nothing is detected lmao + // Dark mode feature was removed lol + // Set up base pattern + var pattern = Trianglify({ + height: window.innerHeight * 1.63, // White: #fdfbfb, Salmon: #cc3300 + width: window.innerWidth, + // Christmas Colours: + x_colors: ['#040404', '#f9f9f9', '#fffff4', '#fbf7f5', '#d55454'], // Cappuccino: ['#854442', '#3c2f2f', '#fff4e6', '#be9b7b', '#4b3832'] + y_colors: ['#f9f1f1', '#f9f9f9', '#fffff4', '#fbf7f5', '#f9f1f1'], // Random colour generator: "#"+((1<<24)*Math.random()|0).toString(16) + // + // Normal Colours: + // x_colors: ['#040404', '#f9f9f9', '#fffff4', '#fbf7f5', '#d55454'], + // y_colors: ['#f9f1f1', '#f9f9f9', '#fffff4', '#fbf7f5', '#f9f1f1'], + // + // Christmas Colours: + // x_colors: ['#0F8A5F', '#f9f9f9', '#fffff4', '#fbf7f5', '#CC231E'], + // y_colors: ['#f9f1f1', '#f9f9f9', '#fffff4', '#fbf7f5', '#f9f1f1'], + // + variance: 10, // Gives it more style + seed: Number.parseInt(Math.floor(Math.random() * 100)), // TODO: Live seed transitioning. + cell_size: 160 // Cell size + }); + + // REMOVED bc looked ugly + // If dark mode detected + // if (matchMedia('(prefers-color-scheme: dark)').matches) { + // var pattern = Trianglify({ + // height: window.innerHeight, // White: #fdfbfb, Salmon: #cc3300 + // width: window.innerWidth, + // x_colors: ['#040404', '#111111', '#111111', '#111111', '#d55454'], // Cappuccino: ['#854442', '#3c2f2f', '#fff4e6', '#be9b7b', '#4b3832'] + // y_colors: ['#f9f1f1', '#111111', '#111111', '#111111', '#f9f1f1'], // Random colour generator: "#"+((1<<24)*Math.random()|0).toString(16) + // variance: 10, // Gives it more style + // seed: Number.parseInt(Math.floor(Math.random() * 100)), // TODO: Live seed transitioning. + // cell_size: 160 // Cell size + // }); + // } + + // // Canvas + // document.body.appendChild(pattern.canvas()) + + // SVG + document.body.appendChild(pattern.svg()) + + + + // // PNG + // var png = document.createElement('img') + // png.src = pattern.png() + // document.body.appendChild(png) + + /////////////// + // SCRIPT #2 // + /////////////// + + $('.title-wrapper').css('width', window.innerWidth); + $('.title-wrapper').css('height', window.innerHeight); + + + var time = 10, + $paths = $('body').find('svg').find('path'), + pathCollection = $paths.get(), + count = $paths.length; + + // // Log variable "count" + // console.log(count); + + pathCollection.sort(function () { + return Math.random() * 10 > 5 ? 1 : -1; + }); + + function showText() { + var title = $('h1'), + subtitle = $('h2'); + + title.removeClass('hidden'); + setTimeout(function () { + subtitle.removeClass('hidden'); + }, 500); + } + + setTimeout(function () { + $.each(pathCollection, function (i, el) { + var $path = $(this); + setTimeout(function () { + + $path.css('opacity', '1'); + }, time) + time += 10; + + if (i + 1 === count) { + setTimeout(function () { + showText(); + }, 2000); + } + + }); + }, 2000); + </script> + + <!-- Navigation Bar --> + <div class="navigation-bar"> + <nav class="nav"> + <a href="/home/" class="nav-item" active-color="orange">Home</a> <!-- Had `is-active` after it but removed it due to not highlighting. --> + <a href="#" class="nav-item" active-color="green">About</a> + <a href="https://cyne.cf/status" class="nav-item" active-color="red">Status</a> + <span class="nav-indicator"></span> + </nav> + </div> + + <div class="bio"> + <div class="links"> + <div class="blog-slider" style="height: 1380px"> + <p class="title"><a>Technical Skills.</a></p> <!-- This was not a very effective way of accomplishing this but idk rn. --> + + <p class="desc" style="width: 1000px; height: 0px"> + <ul style="font-size: 15px"> + <li>JavaScript</li> + <li>HTML5/ CSS3</li> + <li>PHP7</li> + <li>MySQL</li> + <li>PostgreSQL</li> + <li>MongoDB</li> + <li>SCSS</li> + <li>EmberJS</li> + <li>ReactJS</li> + <li>Redux</li> + <li>AngularJS</li> + <li>GraphQL</li> + <li>Apollo</li> + <li>Git</li> + <li>SVN</li> + <li>BackboneJS</li> + <li>jQuery</li> + <li>jQuery Mobile</li> + <li>D3JS</li> + <li>Echarts</li> + <li>Webpack</li> + <li>Python</li> + <li>NodeJS</li> + <li>ExpressJS</li> + <li>Redis</li> + <li>XSLT</li> + <li>JSON</li> + <li>C++13/17</li> + <li>Lua</li> + </ul> + + <style> + .experience { + position: relative; + top: -683px; + left: 20% + } + </style> + <div class="experience"> + <p class="title"><a>Experience.</a></p> + + <p class="title2" style="font-size: 17px; width: 94px">UI Engineer.</p> + <p style="font-size: 15px; color: #fcac94;"> Jul 2017 - Present</p> + <p style="font-size: 15px">Data Visualization</p> + <ul> + <li style="font-size: 15px"> + Collaborating with product designers, product managers, and marketing analytics, developed for financial<br> managers new contextual and configurable chart widgets in HTML/CSS, SCSS, Ember.js, React/Redux<br> and Echarts + </li> + <li style="font-size: 15px"> + Maintained old chart widgets Ember Chart, an open source project developed in Ember and D3 by Addepar.<br> Ozymandias, a front-end framework agnostic data visualization toolkit.<br> + </li> + <li style="font-size: 15px"> + Led Architecting front-end framework agnostic data visualization toolkit. Responsible for planning, scoping and<br> assigning tasks. + </li> + </ul> + + <p style="font-size: 15px">Counter Strike: Global Offensive SDK</p> + <ul> + <li style="font-size: 15px"> + CS:GO trainer/ cheat softwares development. + </li> + </ul> + <br> + + <!-- END UI ENG --> + + <p class="title2" style="font-size: 17px; width: 224px">Front End Software Engineer.</p> + <p style="font-size: 15px; color: #fcac94;"> Sep 2016 - Jul 2017</p> + <p style="font-size: 15px">Responsive-ness</p> + <ul> + <li style="font-size: 15px"> + Developed a fully responsive website with accessible interfaces using Atypon Literatum platform, Java Spring<br> framework, XSLT, LESS, Jquery, HandlebarsJS and related tools. + </li> + <li style="font-size: 15px"> + Served as a key front end team member collaborating with cross-functional teams to turn product requirements<br> +and mockups into high-quality frontend code. + </li> + </ul> + + <p style="font-size: 15px">Atypon Literatum for mobile</p> + <ul> + <li style="font-size: 15px"> + Collaborated with back-end developers and product managers to develop and maintain Literatum for mobile<br> +platform using BackboneJS, HTML5/CSS3, Jquery Mobile and related tools. + </li> + <li style="font-size: 15px"> + Served as a key member of front end team responsible for developing new functionalities with best mobile<br> + development strategies. + </li> + <li style="font-size: 15px"> + Fixed bugs on existing sites/features. + </li> + <li style="font-size: 15px"> + Developed accessible interfaces for mobile devices. + </li> + </ul> + <br> + + <p class="title2" style="font-size: 17px; width: 81px">Front End.</p> + <p style="font-size: 15px; color: #fcac94;"> Jun 2016 - Jul 2017</p> + <p style="font-size: 15px">CSS framework, UI libraries using React, SCSS</p> + <ul> + <li style="font-size: 15px"> + Architected and developed responsive, modular, and scalable CSS framework and React UI library. + </li> + <li style="font-size: 15px"> + Strategized and collaborated with design. + </li> + <li style="font-size: 15px"> + Tested and deployed client/ server and related components. + </li> + <li style="font-size: 15px"> + Developed accessible interfaces for mobile devices + </li> + </ul> + + <p style="font-size: 15px">Team management</p> + <ul> + <li style="font-size: 15px"> + Trained and mentored junior front end developers in UI development methodologies and best practices. + </li> + <li style="font-size: 15px"> + Served as a core group member in defining and prioritizing technology investments, ensuring the alignment of<br> +process, technology and business objectives. + </li> + </ul> + <br> + </div> + </p> + + <!-- + <p class="desc"> + I'm a fullstack developer. Some of my favourite languages to work with are PHP, JavaScript and C++.<br> + Some of my favourite applications I have for such languages are small little PHP tools, C++ game development<br> + projects using OpenGL and Discord bots using the <a href="https://discord.js.org/#/">discord.js</a> framework. You can check out most of my creations<br> + on my <a href="https://github.com/8cy">GitHub</a>. On there, I have lots of my smaller C++ projects to take examples from, some Discord bot</a><br> + examples, and even some public archive repositories of some special software's such as my archive of various <a href="https://github.com/8cy/net">Botnets</a>.<br> + Keep a lookout, because I'm planning on posting even more tutorial like things soon.<br> + <!-- Unused Line --> + <!-- + </p> + <br> + <p class="title2">Well what kind of applications do you develop?</p> + + <p class="desc"> + Some things I like to test my knowledge with are usually moding instances. Albeit, my Java programming skills aren't as<br> + sharp as I'd hope for them to be, I like to spend some of my free time developing Minecraft mods using the Forge framework.<br> + I also like to write server plugins for popular Minecraft server platforms like <a href="https://dev.bukkit.org/">Bukkit</a>, they aren't the most useful<br> + things, (Minecraft mods and plugins) however they are fun to write and it helps me further my Java knowledge.<br> + <br> + I also like to occasionally write CS:GO cheats, I've fiddled around with writing my own CS:GO skin changers, full<br> + cheat modules that include such things as aimbots, anti-aim and more.<br> + <br> + <div class="disclaimer"> + <span class="important">*</span> <span>Use at your own risk, I am not to be held accountable if you get VAC banned.</span> + </div> + </p> + --> + </div> + </div> + </div> + + <!-- Loading Animation --> + <div class="loader-wrapper"> + <div class="loader"> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + </div> + </div> +</body> +</html>
\ No newline at end of file diff --git a/about/legacy-I1vRDCX6gfVVC2Cg7syJ.html b/about/legacy-I1vRDCX6gfVVC2Cg7syJ.html new file mode 100644 index 0000000..1c41498 --- /dev/null +++ b/about/legacy-I1vRDCX6gfVVC2Cg7syJ.html @@ -0,0 +1,95 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - About</title> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <!-- External Links --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/trianglify/0.3.1/trianglify.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <!-- CSS Links --> + <link rel="stylesheet" href="/about/css/main.css"> + <link rel="stylesheet" href="/about/css/navigation-bar.css"> + <link rel="stylesheet" href="/about/css/loader-animation.css"> + <link rel="stylesheet" href="/about/css/blog-slider.css"> + <!-- Invisable Scripts --> + <script src="/js/loader-animation.js"></script> + <script src="/js/redirect-to-mobile.js"></script> +</head> +<body> + <!-- Visable Scripts --> + <script src="/js/background-sparkles.js"></script> + + <!-- Navigation Bar --> + <div class="navigation-bar"> + <nav class="nav"> + <a href="/home/" class="nav-item" active-color="orange">Home</a> + <!-- Had `is-active` after it but removed it due to not highlighting. --> + <a href="#" class="nav-item" active-color="green">About</a> <!-- About --> + <a href="https://p.s1n.pw/" class="nav-item" active-color="blue">Portfolio</a> <!-- Testimonials --> + <!--<a href="http://cyne.cf/status" class="nav-item" active-color="red">Status</a> <!-- Blog --> + <!--<a href="/cars/" class="nav-item" active-color="rebeccapurple">Cars</a> <!-- Contact --> + <!--<a href="https://nani.s1n.pw" class="nav-item" active-color="rebeccapurple">Nani?!</a>--> + <span class="nav-indicator"></span> + </nav> + </div> + + <div class="bio"> + <div class="links"> + <div class="blog-slider"> + <p class="title">Hi! I'm <a href="mailto:[email protected]">s1nical!</a></p> <!-- This was not a very effective way of accomplishing this but idk rn. --> + + <p class="desc"> + I'm a fullstack developer. Some of my favourite languages to work with are PHP, JavaScript and C++.<br> + Some of my favourite applications I have for such languages are small little PHP tools, C++ game development<br> + projects using OpenGL and Discord bots using the <a href="https://discord.js.org/#/">discord.js</a> framework. You can check out most of my creations<br> + on my <a href="https://github.com/8cy">GitHub</a>. On there, I have lots of my smaller C++ projects to take examples from, some Discord bot</a><br> + examples, and even some public archive repositories of some special software's such as my archive of various <a href="https://github.com/8cy/net">Botnets</a>.<br> + Keep a lookout, because I'm planning on posting even more tutorial like things soon.<br> + <!-- Unused Line --> + </p> + <br> + <p class="title2">Well what kind of applications do you develop?</p> + + <p class="desc"> + Some things I like to test my knowledge with are usually moding instances. Albeit, my Java programming skills aren't as<br> + sharp as I'd hope for them to be, I like to spend some of my free time developing Minecraft mods using the Forge framework.<br> + I also like to write server plugins for popular Minecraft server platforms like <a href="https://dev.bukkit.org/">Bukkit</a>, they aren't the most useful<br> + things, (Minecraft mods and plugins) however they are fun to write and it helps me further my Java knowledge.<br> + <br> + I also like to occasionally write CS:GO cheats, I've fiddled around with writing my own CS:GO skin changers, full<br> + cheat modules that include such things as aimbots, anti-aim and more.<br> + <br> + <div class="disclaimer"> + <span class="important">*</span> <span>Use at your own risk, I am not to be held accountable if you get VAC banned.</span> + </div> + </p> + </div> + </div> + </div> + + <!-- Loading Animation --> + <div class="loader-wrapper"> + <div class="loader"> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + </div> + </div> +</body> +</html>
\ No newline at end of file diff --git a/aes/index.html b/aes/index.html new file mode 100644 index 0000000..23f0e90 --- /dev/null +++ b/aes/index.html @@ -0,0 +1,124 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - AES</title> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <!-- Site metadata --> + <meta name="description" content="Fortnite AES Key"> + <meta property="og:description" content="Fortnite AES Key"> + <meta property="og:title" content="s1nical - AES"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/aes"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/aes"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "Fortnite AES Key", + "headline": "Fortnite AES Key", + "url": "https://cyne.cf/aes", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <!-- External Libraries --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/trianglify/0.3.1/trianglify.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <!-- CSS Links --> + <link rel="stylesheet" href="/about/css/main.css"> + <link rel="stylesheet" href="/about/css/navigation-bar.css"> + <link rel="stylesheet" href="/about/css/loader-animation.css"> + <link rel="stylesheet" href="/about/css/blog-slider.css"> + <link rel="stylesheet" href="/404/css/main.css"> + <!-- Invisible Scripts --> + <script src="/js/loader-animation.js"></script> + <script src="/js/refresh-on-media.js"></script> + <script src="/js/redirect-to-mobile.js"></script> +</head> + + <body> + <!-- Visable Scripts --> + <script src="/js/background-sparkles.js"></script> + + <!-- Navigation Bar --> + <div class="navigation-bar"> + <nav class="nav"> + <a href="/home/" class="nav-item" active-color="orange">Home</a> + <!-- Had `is-active` after it but removed it due to not highlighting. --> + <a href="/about/" class="nav-item" active-color="green">About</a> <!-- About --> + <!--<a href="https://p.s1n.pw/" class="nav-item" active-color="blue">Portfolio</a> <!-- Testimonials --> + <a href="https://cyne.cf/status" class="nav-item" active-color="red">Status</a> <!-- Blog --> + <!--<a href="/cars/" class="nav-item" active-color="rebeccapurple">Cars</a> <!-- Contact --> + <!--<a href="https://nani.s1n.pw" class="nav-item" active-color="rebeccapurple">Nani?!</a>--> + <span class="nav-indicator"></span> + </nav> + </div> + + <style> + .aes { + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + } + </style> + + <div class="bio"> + <div class="links"> + <div class="blog-slider"> + <div class="content" style="text-align: center;"> + <h2 class="aes" style="font-size: 10px; word-wrap: break-word; white-space: pre-wrap;"> + {"additionalKeys":{"pakchunk1005-WindowsClient.pak":"0xE40130A02A7BF678D8722F10605FAC2CC906A630E714260B482B73E0B0FD0FBF","pakchunk1011-WindowsClient.pak":"0x77DC00E2C9E9978238078CD91715B2BBD70BF734A45EACBDFAF4F0F4F5211E5C","pakchunk1018-WindowsClient.pak":"0xE688FC078479DE994FC5189CB4C37A42443BE350A26CC6E6CD1258203210E623","pakchunk1002-WindowsClient.pak":"0xFA1524F3FC03EF7EAEE6CCA540F5DC28A444A28E6F48F6963C6FB7C714F99C53","pakchunk1015-WindowsClient.pak":"0xF84CD02B8A23364D43AB171E41E02B00666140F432B9004A5F8815B8612A4B13","pakchunk1009-WindowsClient.pak":"0x5C6C00F1159D6AFA5E49C429A8CFDA1687774864C1DCF89B74613B886291E238","pakchunk1006-WindowsClient.pak":"0x23673E49009D0EF2690BACF5C678914FE938D4A029D2995AFA8FC7EBCA1714B4","pakchunk1000-WindowsClient.pak":"0x146E7972681D067B33B2BE694B46810B8E0D565ECEC88F80B8E5F100BC9A34A0","pakchunk1003-WindowsClient.pak":"0x08C25C97243523D898F9590389A8E11B1C584266461EB4C094497FC2D953FA99","pakchunk1016-WindowsClient.pak":"0xBDEAFC074E884B4BA9EED358CB4DF39210A5F82AD39777338265CF61838D70CF","pakchunk1004-WindowsClient.pak":"0xC591E53D3CFF77135A86BA7D22A4D9FAD8CE65260CC506FD299157960F4DEB7F","pakchunk1001-WindowsClient.pak":"0xECD456F4540E35FA0D1303890116B20B5BA92A48E0DE86F1016202BDC5DF516B","pakchunk1014-WindowsClient.pak":"0xCC0C9E945CBA45CC86216FFDCFD22F8046E6456F69740CADBE00483DBD7F91D9","pakchunk1007-WindowsClient.pak":"0x19B31C426769BF78EEFCFDFA5102250C56744398EBD217BB3B6A1327BD3631C6"},"mainKey":"0x6C51ABA88CA1240A0D14EB94701F6C41FD7799B102E9060D1E6C316993196FDF"} + </h2> + </div> + </div> + </div> + </div> + + <!-- Loading Animation --> + <div class="loader-wrapper"> + <div class="loader"> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + </div> + </div> + </body> + +</html> diff --git a/assets/.htaccess b/assets/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/assets/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/assets/audio/sadness.mp3 b/assets/audio/sadness.mp3 Binary files differnew file mode 100644 index 0000000..c369107 --- /dev/null +++ b/assets/audio/sadness.mp3 diff --git a/assets/audio/{SHA}4v3ZxUfx+KYkFDtpE2k5NvNdYE=.mp3 b/assets/audio/{SHA}4v3ZxUfx+KYkFDtpE2k5NvNdYE=.mp3 Binary files differnew file mode 100644 index 0000000..c2dee8e --- /dev/null +++ b/assets/audio/{SHA}4v3ZxUfx+KYkFDtpE2k5NvNdYE=.mp3 diff --git a/assets/configs/particles.json b/assets/configs/particles.json new file mode 100644 index 0000000..9d6f410 --- /dev/null +++ b/assets/configs/particles.json @@ -0,0 +1,110 @@ +{ + "particles": { + "number": { + "value": 20, + "density": { + "enable": true, + "value_area": 800 + } + }, + "color": { + "value": "#FFDC73" + }, + "shape": { + "type": "circle", + "stroke": { + "width": 0, + "color": "#000000" + }, + "polygon": { + "nb_sides": 5 + }, + "image": { + "src": "img/github.svg", + "width": 100, + "height": 100 + } + }, + "opacity": { + "value": 0.5, + "random": false, + "anim": { + "enable": false, + "speed": 1, + "opacity_min": 0.1, + "sync": false + } + }, + "size": { + "value": 3, + "random": true, + "anim": { + "enable": false, + "speed": 40, + "size_min": 0.1, + "sync": false + } + }, + "line_linked": { + "enable": true, + "distance": 150, + "color": "#000000", + "opacity": 0.4, + "width": 1 + }, + "move": { + "enable": true, + "speed": 4, + "direction": "none", + "random": false, + "straight": false, + "out_mode": "out", + "bounce": false, + "attract": { + "enable": false, + "rotateX": 600, + "rotateY": 1200 + } + } + }, + "interactivity": { + "detect_on": "canvas", + "events": { + "onhover": { + "enable": true, + "mode": "grab" + }, + "onclick": { + "enable": false, + "mode": "push" + }, + "resize": true + }, + "modes": { + "grab": { + "distance": 140, + "line_linked": { + "opacity": 1 + } + }, + "bubble": { + "distance": 400, + "size": 40, + "duration": 2, + "opacity": 8, + "speed": 3 + }, + "repulse": { + "distance": 200, + "duration": 0.4 + }, + "push": { + "particles_nb": 4 + }, + "remove": { + "particles_nb": 2 + } + } + }, + "retina_detect": true +}
\ No newline at end of file diff --git a/assets/favicon/og-favicon.ico b/assets/favicon/og-favicon.ico Binary files differnew file mode 100644 index 0000000..50e8433 --- /dev/null +++ b/assets/favicon/og-favicon.ico diff --git a/assets/imgs/clairo.webp b/assets/imgs/clairo.webp Binary files differnew file mode 100644 index 0000000..cefe5cf --- /dev/null +++ b/assets/imgs/clairo.webp diff --git a/assets/imgs/clairo2.gif b/assets/imgs/clairo2.gif Binary files differnew file mode 100644 index 0000000..41d5d43 --- /dev/null +++ b/assets/imgs/clairo2.gif diff --git a/assets/users/.htpasswdmufxo45v5tz7bAWr b/assets/users/.htpasswdmufxo45v5tz7bAWr new file mode 100644 index 0000000..648e865 --- /dev/null +++ b/assets/users/.htpasswdmufxo45v5tz7bAWr @@ -0,0 +1 @@ +sin:$2y$10$ryTjhpVcd6cp6vcW2E9R5.Wn6vndB6hosZBLI.u6mmaOdDPgT.FUm
\ No newline at end of file diff --git a/backdoor/index.php b/backdoor/index.php new file mode 100644 index 0000000..38ff336 --- /dev/null +++ b/backdoor/index.php @@ -0,0 +1,207 @@ +<!DOCTYPE html> +<html lang="en"> + + <head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - Backdoor/ Login Finder</title> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <!-- Site metadata --> + <meta name="description" content="Backdoor/ Login Finder"> + <meta property="og:description" content="Backdoor/ Login Finder"> + <meta property="og:title" content="s1nical - Backdoor/ Login Finder"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/backdoor"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/backdoor"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "Backdoor/ Login Finder", + "headline": "Backdoor/ Login Finder", + "url": "https://cyne.cf/backdoor", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <!-- External Libraries --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/trianglify/0.3.1/trianglify.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <!-- CSS Links --> + <link rel="stylesheet" href="/about/css/main.css"> + <link rel="stylesheet" href="/about/css/navigation-bar.css"> + <link rel="stylesheet" href="/about/css/loader-animation.css"> + <link rel="stylesheet" href="/about/css/blog-slider.css"> + <link rel="stylesheet" href="/404/css/main.css"> + <!-- Invisible Scripts --> + <script src="/js/loader-animation.js"></script> + <script src="/js/refresh-on-media.js"></script> + </head> + + <body> + <!-- Visable Scripts --> + <script src="/js/background-sparkles.js"></script> + + <!-- Navigation Bar --> + <div class="navigation-bar"> + <nav class="nav"> + <a href="/home/" class="nav-item" active-color="orange">Home</a> + <!-- Had `is-active` after it but removed it due to not highlighting. --> + <a href="/about/" class="nav-item" active-color="green">About</a> <!-- About --> + <!--<a href="https://p.s1n.pw/" class="nav-item" active-color="blue">Portfolio</a> <!-- Testimonials --> + <a href="https://cyne.cf/status" class="nav-item" active-color="red">Status</a> <!-- Blog --> + <!--<a href="/cars/" class="nav-item" active-color="rebeccapurple">Cars</a> <!-- Contact --> + <!--<a href="https://nani.s1n.pw" class="nav-item" active-color="rebeccapurple">Nani?!</a>--> + <span class="nav-indicator"></span> + </nav> + </div> + + <style> + .result { + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + } + </style> + + <div class="bio"> + <div class="links"> + <div class="blog-slider"> + <div class="content"> + <form method="POST"> + <font size="3" face="Orbitron"><b>URL:</b> <input type ="text" name="site" /> + <font size="3" face="Orbitron"><b>Search:</b> <select name="search"> + <option value="xhell">Backdoor</option> + <option value="php">Admin Page</option> + <input type = "submit" name="submit" value="Find" /> + </form> + <style> + @media (max-width: 768px) { + .content { + font-size: 10px; + } + } + </style> + <br class="mobile"> + <h1> + <!-- Filler --> + </h1> + <a class="mobile" href="/home/">Back home</a> + <h1 class="mobile"> + <!-- Filler --> + </h1> + </div> + </div> + </div> + </div> + + <!-- Loading Animation --> + <div class="loader-wrapper"> + <div class="loader"> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + </div> + </div> + </body> + +</html> + +<?php +@session_start(); +@error_reporting(0); +@ini_set('error_log',NULL); +@ini_set('log_errors',0); +@ini_set('display_errors', 0); +@set_time_limit(0); + +if(isset($_POST['submit']) && !empty($_POST['site'])) { + $url = $_POST['site']; + $search = $_POST['search']; + + switch($search) { + case 'php': + s_php($url); + break; + case 'xhell': + s_xhell($url); + break; + default: + echo "<br>Please select a item to search... "; + break; + } + + +} elseif(isset($_POST['submit']) && empty($_POST['site'])) { + echo "Please PUT in the URL and try again..."; +} + +function s_php($get_url) { + + $pages = array('/redaktur','/webadmin','/adminweb','/web@admin','/operator','/webmaster','/web@master','/master@web','/administrator','/admin_area','/login_area','/admin','/sign_in','/login','/superuser','/log-in','/bb-admin','/wp-login.php','/admin_login','/moderator','/po-admin','/management','/manage','/phpmyadmin','/phpMyAdmin','/PMA','/phpmysql','/pmadmin','/user'); + find_admin($pages,$get_url); +} + +function s_xhell($get_url) { + $pages = array('/symlink','/sym','/dm1sym','/asu.txt','/DecW.txt','/idx_config','/idx_cgi','/wso.php','/idx.php','/dm.php','/DM5.php','/1n73ct10n.php','/shell.php','/r00t.php','/idb.php','/idb.phtml','/sabun.php','/r00t.pl','/z.php','/.php','/sh3ll.php','/xploit.php','/sa.php','/-.php','/_.php','/&.php','/$.php','/indoxploit.php','/indoXploit.php','/jembutmu.php','/jembutku.php','/indo.php','/upload.php?option=upload','/simple.php','/k3ll3d.php','/shellx.php','/kill.php','/whmkiller.php','/tools.php','/indexx.php','/shell.phtml','/shell.php.jpg','/unix.php','/b374k.php','/irdb.php','/mig3r.php','/cp.php','/cpanel.php','/indeshell.php','/cmd.php','/upl.php','/shell.txt','/unknown.txt','/root.txt','/haxor.img','/haxor.ht','/anon.txt','/c99.php','/wp-content/plugins/akismet/akismet.php','/wp-content/plugins/akismet/index.php','/d.php','/hmm.php','/include.php','/up.php','/gaza.php','/dz1.php','/priv8.php','/andela.php','/a.php','/css.php' ); + find_admin($pages,$get_url); +} + +function find_admin($pages_list,$url) { + set_time_limit(0); + $find = false; + + foreach($pages_list as $key => $value) { + $c_start = curl_init(); + curl_setopt($c_start,CURLOPT_AUTOREFERER,1); + curl_setopt($c_start, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($c_start, CURLOPT_HEADER, 1); + curl_setopt($c_start, CURLOPT_URL, $url.$value); + $result = curl_exec($c_start); + curl_close($c_start); + + if (preg_match("/200 OK/", $result)) { + echo "<br /> <h3> Found! :<a href='".$url.$value."'>".url.$value."</a> </h3> <br />"; + $find = true ; + } + } + + if(!$find) { + echo "<h3>Not able to find... </h3>"; + } +} +?>
\ No newline at end of file diff --git a/cars/.htaccess b/cars/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/cars/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/cars/cars_files/console_runner-1df7d3399bdc1f40995a35209755dcfd8c7547da127f6469fd81e5fba982f6af.js b/cars/cars_files/console_runner-1df7d3399bdc1f40995a35209755dcfd8c7547da127f6469fd81e5fba982f6af.js new file mode 100644 index 0000000..85fc223 --- /dev/null +++ b/cars/cars_files/console_runner-1df7d3399bdc1f40995a35209755dcfd8c7547da127f6469fd81e5fba982f6af.js @@ -0,0 +1 @@ +!function(){function n(){u(),t()}function t(){window.addEventListener?window.addEventListener("message",l,!1):window.attachEvent("onmessage",l)}function e(n){var t;try{t={}.toString.call(n)}catch(e){t="[object Object]"}return t}function r(n){return!!(n&&"object"==typeof n&&"nodeType"in n&&1===n.nodeType&&n.outerHTML)}function o(n,t){return n.toLowerCase()<t.toLowerCase()?-1:1}function c(n){if(null==n)return 1;var t,r=e(n);if("[object Number]"===r||"[object Boolean]"===r||"[object String]"===r)return 1;if("[object Function]"===r||"[object global]"===r)return 2;if("[object Object]"===r){var o=Object.keys(n);for(t=0;t<o.length;t++){var c=n[o[t]];if("[object Function]"===(u={}.toString.call(c))||"[object Object]"===u||"[object Array]"===u)return 2}return 1}if("[object Array]"===r){for(t=0;t<n.length;t++){var i=n[t],u={}.toString.call(i);if("[object Function]"===u||"[object Object]"===u||"[object Array]"===u)return 2}return 1}return 2}function i(n,t,r){var c,u,a="",l=[];if(r=r||"",t=t||[],null===n)return"null";if(void 0===n)return"undefined";if("[object Object]"==(a=e(n))&&(a="Object"),"[object Number]"==a)return""+n;if("[object Boolean]"==a)return n?"true":"false";if("[object Function]"==a)return n.toString().split("\n ").join("\n"+r);if("[object String]"==a)return'"'+n.replace(/"/g,"'")+'"';for(u=0;u<t.length;u++)if(n===t[u])return"[circular "+a.slice(1)+("outerHTML"in n?" :\n"+n.outerHTML.split("\n").join("\n"+r):"");if(t.push(n),"[object Array]"==a){for(c=0;c<n.length;c++)l.push(i(n[c],t));return"["+l.join(", ")+"]"}if(a.match(/Array/))return a;var f=a+" ",s=r+" ";if(r.length/2<2){var b=[];try{for(c in n)b.push(c)}catch(j){}for(b.sort(o),c=0;c<b.length;c++)try{l.push(s+b[c]+": "+i(n[b[c]],t,s))}catch(j){}}return l.length?f+"{\n"+l.join(",\n")+"\n"+r+"}":f+"{}"}function u(){if(window.console)for(var n=0;n<f.length;n++)!function(){var t=f[n];window.console[t]&&(window.console[t]=function(){for(var n=[].slice.call(arguments),e=[],o=[],u=0;u<n.length;u++)r(n[u])?(o.push(i(n[u].outerHTML)),e.push(1)):(o.push(i(n[u])),e.push(c(n[u])));s.postMessage(["console",{"function":t,arguments:o,complexity:Math.max.apply(null,e)}],"*"),this.apply(console,n)}.bind(console[t]))}()}function a(n){return!!n.origin.match(/codepen/)&&("object"==typeof n.data&&"command"===n.data.type)}function l(n){if(a(n)){var t=n.data.command;try{var e=window.eval(t)}catch(r){return void console.error(r.message)}console.log(e)}}var f=["log","error","warn","info","debug","table","time","timeEnd","count","clear"],s=window.parent;n()}();
\ No newline at end of file diff --git a/cars/cars_files/css_reload-5619dc0905a68b2e6298901de54f73cefe4e079f65a75406858d92924b4938bf.js b/cars/cars_files/css_reload-5619dc0905a68b2e6298901de54f73cefe4e079f65a75406858d92924b4938bf.js new file mode 100644 index 0000000..09e1dff --- /dev/null +++ b/cars/cars_files/css_reload-5619dc0905a68b2e6298901de54f73cefe4e079f65a75406858d92924b4938bf.js @@ -0,0 +1 @@ +!function(){function e(e){t(e),window.PrefixFree&&StyleFix.process()}function t(e){var t=n(),a=document.createElement("style");a.type="text/css",a.className="cp-pen-styles",a.styleSheet?a.styleSheet.cssText=e:a.appendChild(document.createTextNode(e)),c.appendChild(a),t&&t.parentNode.removeChild(t)}function n(){for(var e=document.getElementsByTagName("style"),t=e.length-1;t>=0;t--)if("cp-pen-styles"===e[t].className)return e[t];return!1}function a(e){window.addEventListener?window.addEventListener("message",e,!1):window.attachEvent("onmessage",e)}function s(e,t){try{if(!/codepen/.test(e.origin))return null;if("object"!=typeof e.data)return null;if(e.data.action===t)return e.data}catch(n){}return null}var c=document.head||document.getElementsByTagName("head")[0],r="ACTION_LIVE_VIEW_RELOAD_CSS";a(function(t){var n=s(t,r);n&&e(n.data.css)})}();
\ No newline at end of file diff --git a/cars/cars_files/stopExecutionOnTimeout-de7e2ef6bfefd24b79a3f68b414b87b8db5b08439cac3f1012092b2290c719cd.js b/cars/cars_files/stopExecutionOnTimeout-de7e2ef6bfefd24b79a3f68b414b87b8db5b08439cac3f1012092b2290c719cd.js new file mode 100644 index 0000000..5193a70 --- /dev/null +++ b/cars/cars_files/stopExecutionOnTimeout-de7e2ef6bfefd24b79a3f68b414b87b8db5b08439cac3f1012092b2290c719cd.js @@ -0,0 +1 @@ +"use strict";"object"!=typeof window.CP&&(window.CP={}),window.CP.PenTimer={programNoLongerBeingMonitored:!1,timeOfFirstCallToShouldStopLoop:0,_loopExits:{},_loopTimers:{},START_MONITORING_AFTER:2e3,STOP_ALL_MONITORING_TIMEOUT:5e3,MAX_TIME_IN_LOOP_WO_EXIT:2200,exitedLoop:function(o){this._loopExits[o]=!0},shouldStopLoop:function(o){if(this.programKilledSoStopMonitoring)return!0;if(this.programNoLongerBeingMonitored)return!1;if(this._loopExits[o])return!1;var t=this._getTime();if(0===this.timeOfFirstCallToShouldStopLoop)return this.timeOfFirstCallToShouldStopLoop=t,!1;var i=t-this.timeOfFirstCallToShouldStopLoop;if(i<this.START_MONITORING_AFTER)return!1;if(i>this.STOP_ALL_MONITORING_TIMEOUT)return this.programNoLongerBeingMonitored=!0,!1;try{this._checkOnInfiniteLoop(o,t)}catch(e){return this._sendErrorMessageToEditor(),this.programKilledSoStopMonitoring=!0,!0}return!1},_sendErrorMessageToEditor:function(){try{if(this._shouldPostMessage()){var o={action:"infinite-loop",line:this._findAroundLineNumber()};parent.postMessage(o,"*")}else this._throwAnErrorToStopPen()}catch(t){this._throwAnErrorToStopPen()}},_shouldPostMessage:function(){return document.location.href.match(/boomerang/)},_throwAnErrorToStopPen:function(){throw"We found an infinite loop in your Pen. We've stopped the Pen from running. Please correct it or contact [email protected]."},_findAroundLineNumber:function(){var o=new Error,t=0;if(o.stack){var i=o.stack.match(/boomerang\S+:(\d+):\d+/);i&&(t=i[1])}return t},_checkOnInfiniteLoop:function(o,t){if(!this._loopTimers[o])return this._loopTimers[o]=t,!1;if(t-this._loopTimers[o]>this.MAX_TIME_IN_LOOP_WO_EXIT)throw"Infinite Loop found on loop: "+o},_getTime:function(){return+new Date}},window.CP.shouldStopExecution=function(o){var t=window.CP.PenTimer.shouldStopLoop(o);return!0===t&&console.warn("[CodePen]: An infinite loop (or a loop taking too long) was detected, so we stopped its execution. Sorry!"),t},window.CP.exitedLoop=function(o){window.CP.PenTimer.exitedLoop(o)};
\ No newline at end of file diff --git a/cars/css/main.css b/cars/css/main.css new file mode 100644 index 0000000..3fc15da --- /dev/null +++ b/cars/css/main.css @@ -0,0 +1,13 @@ +/* cp-pen-styles */ +html { + background: #ccc; +} + +canvas { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + margin: auto; +}
\ No newline at end of file diff --git a/cars/favicon.png b/cars/favicon.png Binary files differnew file mode 100644 index 0000000..aa511fc --- /dev/null +++ b/cars/favicon.png diff --git a/cars/index.html b/cars/index.html new file mode 100644 index 0000000..97f327d --- /dev/null +++ b/cars/index.html @@ -0,0 +1,67 @@ +<!DOCTYPE html> +<html lang="en" class=""> + +<head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> + <!-- Site metadata --> + <meta name="description" content="Cars"> + <meta property="og:description" content="Cars"> + <meta property="og:title" content="s1nical - Cars"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/cars"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/cars"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "Cars", + "headline": "Cars", + "url": "https://cyne.cf/cars", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <!-- External Libraries --> + <script src="/cars/cars_files/console_runner-1df7d3399bdc1f40995a35209755dcfd8c7547da127f6469fd81e5fba982f6af.js"></script> + <script src="/cars/cars_files/css_reload-5619dc0905a68b2e6298901de54f73cefe4e079f65a75406858d92924b4938bf.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> + <link rel="shortcut icon" href="favicon.png" type="image/x-icon"> + <meta name="robots" content="noindex"> + <!-- CSS Links --> + <link rel="stylesheet" href="/cars/css/main.css"> + <title>s1nical - Cars</title> + <!-- Visable Scripts --> + <script src="/js/redirect-to-mobile.js"></script> +</head> + + <body> + + <script src="/cars/cars_files/stopExecutionOnTimeout-de7e2ef6bfefd24b79a3f68b414b87b8db5b08439cac3f1012092b2290c719cd.js"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/p5.min.js"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.14.2/matter.min.js"></script> + <script src="/cars/js/main.js"></script> + + <canvas id="defaultCanvas0" width="1536" height="937" style="width: 1536.68px; height: 937px;"></canvas> + + </body> + +</html>
\ No newline at end of file diff --git a/cars/js/main.js b/cars/js/main.js new file mode 100644 index 0000000..c8c88fc --- /dev/null +++ b/cars/js/main.js @@ -0,0 +1,387 @@ +// Visable JavaScript +class Wall { + constructor(x, y, w, h, a) { + var options = { + friction: 0.5, + restitution: 0.5, + angle: a, + isStatic: true + }; + + this.body = Bodies.rectangle(x, y, w, h, options); + this.w = w; + this.h = h; + World.add(world, this.body); + } + } + + + class Ball { + constructor() { + this.position = createVector(width / 2, height / 2); + this.radius = width / 32; + const options = { + restitution: 0.9, + friction: 0.001, + density: 0.0001 + }; + + this.body = Bodies.circle( + this.position.x, this.position.y, this.radius / 2, options); + + World.add(world, this.body); + } + + didScore() { + const [x, y] = [this.body.position.x, this.body.position.y]; + const topOfGoalY = height / 2 + goalHeight / 2; + const bottomOfGoalY = height / 2 - goalHeight / 2; + const withinGoalRange = y < topOfGoalY && y > bottomOfGoalY; + if (withinGoalRange) { + return x <= this.radius / 2 || x >= width - this.radius / 2; + } + return false; + } + + render() { + this.position.x = this.body.position.x; + this.position.y = this.body.position.y; + + push(); + translate(this.body.position.x, this.body.position.y); + rotate(this.body.angle); + fill(173, 255, 47); + ellipse(0, 0, this.radius); + fill(54); + ellipse(0, 0, this.radius / 3); + line(-this.radius / 2, 0, this.radius / 2, 0); + pop(); + } + } + + + class Car { + constructor(paintColor, startX) { + const startY = startX < width / 2 ? height / 4 : 3 * height / 4; + this.position = createVector(startX, startY); + this.width = width / 36; + this.length = this.width * 2; + this.isAccelerating = false; + this.rotation = 0; // If you set this to 100, it goes wack lmao 9/15/2019 + this.color = paintColor; + this.history = []; + const options = { + density: 0.01, + friction: 0.0, // Usually 0.2 but Jared wanted to move easier 9/15/2019 + mass: 50 + }; + this.body = Bodies.rectangle( + this.position.x, this.position.y, this.length, this.width, options); + + World.add(world, this.body); + if (startX > width / 2) { + Body.setAngle(this.body, PI); + } + } + + update() { + if (this.isAccelerating) { + this.accelerate(); + } + this.rotate(this.rotation); + this.history.push([this.body.position.x, this.body.position.y]); + if (this.history.length > exaustClouds) { + this.history.splice(0, 1); + } + this.position.x = this.body.position.x; + this.position.y = this.body.position.y; + } + + accelerating(isAccelerating) { + this.isAccelerating = isAccelerating; + } + + accelerate() { + var force = p5.Vector.fromAngle(this.body.angle); + force.mult(0.02); + Body.applyForce(this.body, this.body.position, force); + } + + rotate(rotation) { + this.rotation = rotation; + Body.setAngularVelocity(this.body, rotation); + } + + pointTowardsBall() { + const desired = p5.Vector.sub(ball.position, this.position); + const angle = desired.heading(); + Body.setAngle(this.body, angle); + } + + render() { + var angle = this.body.angle; + push(); + rectMode(CENTER); + translate(this.body.position.x, this.body.position.y); + rotate(angle); + // Car Tires + fill(54); + ellipse(this.length / 3, -this.width / 2, this.width / 4, this.width / 8); + ellipse(this.length / 3, this.width / 2, this.width / 4, this.width / 8); + ellipse(-this.length / 3, -this.width / 2, this.width / 4, this.width / 8); + ellipse(-this.length / 3, this.width / 2, this.width / 4, this.width / 8); + // Car Body + fill(this.color); + rect(0, 0, this.length, this.width, 5); + fill(54); + rect(-this.length / 24, 0, 0.7 * this.length, 0.8 * this.width, 5); + fill(this.color); + rect(-this.length / 12, 0, 0.45 * this.length, 0.6 * this.width, 5); + // Car Headlights + fill(255, 255, 200); + ellipse(this.length / 2, -this.width / 3, this.width / 8, this.width / 4); + ellipse(this.length / 2, this.width / 3, this.width / 8, this.width / 4); + pop(); + push(); + noStroke(); + const carWidth = this.width; + this.history.forEach(function (h, i) { + const [x, y] = h; + push(); + translate(x, y); + rotate(angle); + fill(54, i); + ellipse(-carWidth, 0, exaustClouds - i + random(-10, 10), exaustClouds - i + random(-3, 3)); + pop(); + }); + pop(); + } + } + + + class Spark { + constructor(x, y, xVel) { + this.pos = createVector(x, y); + this.lifespan = 255; + + this.vel = createVector(random(0, xVel), random(-xVel, xVel)); + // Get Direction + this.vel.normalize(); + // Add Random Speed + this.vel.mult(random(0, 20)); + this.fill = [random(255), random(255), random(255)]; + } + + update() { + this.vel.mult(0.95); + this.lifespan -= 5; + this.pos.add(this.vel); + } + + done() { + return this.lifespan < 0; + } + + render() { + if (!this.done()) { + noStroke(); + fill(this.fill, this.lifespan); + rect(this.pos.x, this.pos.y, this.lifespan / 20, this.lifespan / 20, 3); + } + } + } + + + const Engine = Matter.Engine; + const World = Matter.World; + const Bodies = Matter.Bodies; + const Body = Matter.Body; + + let engine; + let world; + + const exaustClouds = 25; // Set this to anything above 50, it goes wild 9/15/2019 + let car; + let computerCar; + let ball; + + // Goal Explosion Effect + let sparks = []; + + let goalHeight; + let goalWaitPeriod = false; + + let playerScore = 0; + let computerScore = 0; + + function setup() { + const h = min(window.innerHeight, window.innerWidth * 0.61); + // keep field dimensions nice :) + const w = min(window.innerWidth, h * 1.64); + + createCanvas(w, h); + + goalHeight = width / 6; + + engine = Engine.create(); + world = engine.world; + + // Disable matter.js Gravity + engine.world.gravity.y = 0; + + addWalls(); + + const redHexVals = [255, 100, 100]; + const playerStartX = width / 4; + car = new Car(redHexVals, playerStartX); + const blueHexVals = [100, 100, 255]; + const computerStartX = 3 * width / 4; + computerCar = new Car(blueHexVals, computerStartX); + + ball = new Ball(); + } + + function keyReleased() { + if (keyCode == 87) { // UP_ARROW + car.accelerating(false); + } else if (keyCode == 68 || keyCode == 65) { // RIGHT_ARROW, LEFT_ARROW + car.rotate(0); + } + } + + // TODO: Add multiple key layout functionality, eg. both WASD and arrow keys. + + function keyPressed() { + if (keyCode == 68) { // RIGHT_ARROW + car.rotate(PI / 72); + } else if (keyCode == 65) { // LEFT_ARROW + car.rotate(-PI / 72); + } else if (keyCode == 87) { // UP_ARROW + car.accelerating(true); + } + } + + function draw() { + if (goalWaitPeriod) { + // Screen Shakes On Goal (User feedback) + translate(random(-13, 13), random(-13, 13)); + } + + drawSoccerField(); + + Engine.update(engine); + + car.render(); + car.update(); + + computerCar.render(); + computerCar.update(); + + computerCar.accelerating(true); + computerCar.pointTowardsBall(); + + + ball.render(); + if (ball.didScore()) { + const [x, y] = [ball.body.position.x, ball.body.position.y]; + x < width / 2 ? computerScore++ : playerScore++; + shootSparks(x, y); + Body.setPosition(ball.body, { + x: width / 2, + y: height / 2 + }); + Body.setVelocity(ball.body, { + x: 0, + y: 0 + }); + goalWaitPeriod = true; + setTimeout(function () { + goalWaitPeriod = false; + }, 1000); + } + + textSize(18); + noStroke(); + fill(255, 100, 100); + text("Player", width / 2 - 100, height / 16); + fill(100, 100, 255); + text("Computer", width / 2 + 50, height / 16); + fill(4); + textSize(48); + text(playerScore, width / 2 - 88, height / 6); + text(computerScore, width / 2 + 78, height / 6); + + if (goalWaitPeriod) { + fill(random(255), random(255), random(255)); + textSize(64); + text("GOOOOOOAL", width / 2 - 200, height / 2); + } + + // Update, show, and delete sparks for goals + goSparksGo(); + + } + + function shootSparks(x, y) { + // Shoot sparks in opposite direction (towards middle) + const xVel = x < width / 2 ? 10 : -10; + const xPos = x < width / 2 ? 0 : width; + for (var i = 0; i < 50; i++) { + if (window.CP.shouldStopExecution(0)) break; + var s = new Spark(xPos, y, xVel); + sparks.push(s); + } + window.CP.exitedLoop(0); + } + + function goSparksGo() { + // Go backwards through array in case we splice (will break if forwards) <- lol + for (var i = sparks.length - 1; i >= 0; i--) { + if (window.CP.shouldStopExecution(1)) break; + sparks[i].update(); + sparks[i].render(); + if (sparks[i].done()) { + sparks.splice(i, 1); + } + } + window.CP.exitedLoop(1); + } + + function drawSoccerField() { + background(254); + noFill(); + stroke(55); + strokeWeight(1); + + // Center Field Line + line(width / 2, 0, width / 2, height); + ellipse(width / 2, height / 2, width / 6); + + // left Goalie Box + rect(0, height / 2 - width / 6, width / 6, width / 3); + stroke(255, 100, 100); + rect(0, height / 2 - width / 12, width / 18, goalHeight); + strokeWeight(10); + line(0, height / 2 - width / 12, 0, height / 2 - width / 12 + goalHeight); + // Right Goalie Box + strokeWeight(1); + stroke(0); + rect(width - width / 6, height / 2 - width / 6, width / 6, width / 3); + stroke(100, 100, 255); + rect(width - width / 18, height / 2 - width / 12, width / 18, goalHeight); + strokeWeight(10); + line(width, height / 2 - width / 12, width, height / 2 - width / 12 + goalHeight); + strokeWeight(1); + stroke(0); + } + + function addWalls() { + const wallThickness = 500; + const wt2 = wallThickness / 2; + + bottomWall = new Wall(width / 2, height + wt2, width, wallThickness, 0); + topWall = new Wall(width / 2, -wt2, width, wallThickness, 0); + + leftWall = new Wall(-wt2, height / 2, height, wallThickness, PI / 2); + rightWall = new Wall(width + wt2, height / 2, height, wallThickness, PI / 2); + }
\ No newline at end of file diff --git a/changelog/.htaccess b/changelog/.htaccess new file mode 100644 index 0000000..0762e39 --- /dev/null +++ b/changelog/.htaccess @@ -0,0 +1,4 @@ +AuthUserFile /home/vol9_2/epizy.com/epiz_25275270/htdocs/assets/users/.htpasswdmufxo45v5tz7bAWr +AuthType Basic +AuthName "My restricted Area" +Require valid-user
\ No newline at end of file diff --git a/changelog/index.html b/changelog/index.html new file mode 100644 index 0000000..261ab3d --- /dev/null +++ b/changelog/index.html @@ -0,0 +1,46 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8" /> + </head> + <body> + <h1 id="changeloghistory">Change Log + History</h1> + <p>Author: s1nical</p> + <hr /> + + <div id="1.22020-03-18"> + <h3>1.2 2020–03–18</h3> + <p>And here we go.</p> + <ul> + <li>remove java form skills in about</li> + </ul> + </div> + + <div id="1.12020-03-11"> + <h3>1.1 2020–03–11</h3> + <p>And here we go.</p> + <ul> + <li>add securly bypass</li> + <li>remove red highlights from web proxy in tools and browser games</li> + <li>remove web proxy in browser games</li> + <li>remove securly bypass</li> + <li>rename web proxy to usefull web proxy</li> + <li>add /dir and /cl which redirect to /directory and /changelog</li> + </ul> + </div> + + <div id="1.02020-03-10"> + <h3>1.0 2020–03–10</h3> + <p>And here we go.</p> + <ul> + <li>changed all seo meta deta to be correct (url, type etc.)</li> + <li>added regex to root, if at rhs, says rhs on load</li> + <li>removed rhs load</li> + <li>changed locations of visitors</li> + <li>added changelog</li> + <li>added .htpasswd for encryption instead of custom thing (might change but who knows)</li> + <li>add web proxy to broswer games and tools</li> + </ul> + </div> + </body> +</html>
\ No newline at end of file diff --git a/cl/index.html b/cl/index.html new file mode 100644 index 0000000..5120dbb --- /dev/null +++ b/cl/index.html @@ -0,0 +1 @@ +<script>location = "/changelog"</script>
\ No newline at end of file diff --git a/css/.htaccess b/css/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/css/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/css/main.css b/css/main.css new file mode 100644 index 0000000..ff64538 --- /dev/null +++ b/css/main.css @@ -0,0 +1,425 @@ +/* BACKGROUND SPARKLES CSS */ +@import url("https://fonts.googleapis.com/css?family=DM+Sans:500,700&display=swap"); + +html, body { + margin: 0 0; + padding: 0 0; + text-align: center; + font-size: 0; + background-color: none; /* This used to be #fdfcf3 */ +} + +/* It literally took my like 15 minutes in a Discord call with Gavin and Aaron to figure out +why this was not working. I tried like everything but this ended up solving it; +https: //www.freecodecamp.org/forum/t/why-is-my-background-color-not-changing/251971 +So yea lol -10/04/2019 19:26*/ + +/* // This is not really needed bc it doesn't fix the problem, + // just left it here for further reference. +@media (prefers-color-scheme: dark) { + html, body { + background-color: #2d2d2d !important; + } +} +*/ + +body svg { + position: absolute; + top: 0; + left: 0; + z-index: -2; +} + +/* LOADING ANIMATION */ +/* body { +** text-align: center; +** padding-top: 20%; +** background: #fdfdfd; +** } +*/ + +.loader-wrapper { + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + background: #fdfdfd; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + z-index: 4; +} + +.loader { + width: 100px; + height: 100px; + display: inline-table; + -webkit-box-sizing: border-box; + box-sizing: border-box; + position: relative; + border-spacing: 0.3em; +} + +.loader row { + display: table-row; +} + +.loader row span { + display: table-cell; + position: relative; + background: #1d1f20; + opacity: 0; + -webkit-animation: flicker 0.5985999999999999s ease-out infinite alternate; + animation: flicker 0.5985999999999999s ease-out infinite alternate; /* Added standard property to fix compatbiliy issues */ +} + +@-webkit-keyframes flicker { + from, 20% { + opacity: 0; + } + 100%, to { + opacity: 1; + } +} + +@keyframes flicker { /* Added standard property to fix compatbiliy issues */ + from, 20% { + opacity: 0; + } + 100%, to { + opacity: 1; + } +} + +.loader row:nth-child(1) span:nth-child(1) { + -webkit-animation-delay: .50s; + animation-delay: .50s; +} + +/* Added standard property to fix compatbiliy issues */ +.loader row:nth-child(1) span:nth-child(2) { + -webkit-animation-delay: .70s; + animation-delay: .70s; +} + +.loader row:nth-child(1) span:nth-child(3) { + -webkit-animation-delay: .60s; + animation-delay: .60s; +} + +.loader row:nth-child(2) span:nth-child(1) { + -webkit-animation-delay: .20s; + animation-delay: .20s; +} + +.loader row:nth-child(2) span:nth-child(2) { + -webkit-animation-delay: .80s; + animation-delay: .80s; +} + +.loader row:nth-child(2) span:nth-child(3) { + -webkit-animation-delay: .90s; + animation-delay: .90s; +} + +.loader row:nth-child(3) span:nth-child(1) { + -webkit-animation-delay: .10s; + animation-delay: .10s; +} + +.loader row:nth-child(3) span:nth-child(2) { + -webkit-animation-delay: .30s; + animation-delay: .30s; +} + +.loader row:nth-child(3) span:nth-child(3) { + -webkit-animation-delay: .40s; + animation-delay: .40s; +} + +/* ORINGINAL SITE CSS */ +html { + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-tap-highlight-color: transparent; +} + +*, *:before, *:after { + -webkit-box-sizing: inherit; + box-sizing: inherit; +} + +html, body { + height: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row wrap; + flex-flow: row wrap; +} + +body { + font: normal 20px/1.4 'Inter', sans-serif; + margin: 0 1em; + padding: 1em 0; + color: #000; + background: none; +} + + + +/* Media queries for navbar size in different screen sizes */ + +@media (max-height: 768px) { + body { + font: normal 15px/1.4 'Inter', sans-serif; + } +} + +@media (max-height: 750px) { + body { + font: normal 13px/1.4 'Inter', sans-serif; + } +} + +@media (max-height: 658px) { + body { + font: normal 11px/1.4 'Inter', sans-serif; + } +} + +@media (max-height: 579px) { + body { + font: normal 8px/1.4 'Inter', sans-serif; + } +} + +@media (max-height: 549px) { + body { + font: normal 6px/1.4 'Inter', sans-serif; + } +} + +/* End media queries */ + + + +/* // This was supposed to be for the dark mode feature but I + // took it out because it looked ugly asf +@media (prefers-color-scheme: dark) { + body { + color: #fdfcf3; + } +} +*/ + +@supports (font-variation-settings: normal) { + body { + font-family: 'Inter var', sans-serif; + } +} + +main { + font-size: 6vh; + line-height: 1.2; + max-width: 75vh; + z-index: 3; +} + +@media(max-width: 768px) { + main { + margin: auto; + width: 86.21%; + } +} + +@media(max-width: 411px) { + main { + margin: auto; + width: 76.21%; + } +} + +/* I was trying to figure out how to only call the <a> tags from index.html, so it wouldn't change the values for other <a> tags, and I tried everything, +** or so I thought, and I figured out I had to do `.links a` by scrolling up and saw `.loader row span` which wasn't even the correct syntax but I removed +** the `row` and IT WORKED! I actually got so happy lol. - 2:15 AM, 8/7/2019 +*/ +.links a { + color: inherit; + text-decoration: none; + background-color: #ffdc73; + /* hsl(200, 100%, 80% */ + -webkit-box-shadow: 0 7px 30px -10px #ffdc73, 0 7px 30px -10px #ffdc73; + box-shadow: 0 7px 30px -10px #ffdc73, 0 7px 30px -10px #ffdc73; + -webkit-transition: background-color 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out; + /* border-radius: 4px; // Looks nice but idk */ +} + +/* #ffdc73 box-shadow should usually be only box-shadow, but I made it two so it would be more visable. +// Secondary box-shadow, rgba(154,160,185,0.05) +*/ + +.links a:hover, +.links a:focus { + outline: none; + background-color: #282936; + color: #fff; + -webkit-transition: color 0.15s ease-in-out; + transition: color 0.15s ease-in-out; + -webkit-box-shadow: 0 7px 30px -10px #282936, 0 7px 30px -10px #282936; + box-shadow: 0 7px 30px -10px #282936, 0 7px 30px -10px #282936; /* rgba(166,173,201,0.2) */ + -webkit-transition: -webkit-box-shadow 0.15s ease-in-out; + transition: -webkit-box-shadow 0.15s ease-in-out; + transition: box-shadow 0.15s ease-in-out; + transition: box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; +} + +/* NAVIGATION MENU */ +.navigation-bar { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex: 1 0 100%; + flex: 1 0 100%; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +@media(max-width: 768px) { + .navigation-bar { + display: none; + } +} + +.nav { + overflow: hidden; + max-width: 100%; + background-color: #fff; + padding: 0 20px; + border-radius: 40px; + -webkit-box-shadow: 0 10px 40px rgba(159, 162, 177, 0.8); + box-shadow: 0 10px 40px rgba(159, 162, 177, 0.8); + position: absolute; /* Only reason it's centered. */ + /* Manual position adjusting + ** top: 0; + ** left: 0; + */ + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.nav-item { + color: #83818c; + padding: 20px; + text-decoration: none; + -webkit-transition: .3s; + transition: .3s; + margin: 0 6px; + font-family: 'DM Sans', sans-serif; + font-weight: 500; + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.nav-item:before { + content: ""; + position: absolute; + bottom: -6px; + left: 0; + width: 100%; + height: 5px; + background-color: #dfe2ea; + border-radius: 8px 8px 0 0; + opacity: 0; + -webkit-transition: .3s; + transition: .3s; +} + +.nav-item:not(.is-active):hover:before { + opacity: 1; + bottom: 0; +} + +.nav-item:not(.is-active):hover { + color: #333; +} + +.nav-indicator { + position: absolute; + left: 0; + bottom: 0; + height: 4px; + -webkit-transition: .4s; + transition: .4s; + height: 5px; + z-index: 1; + border-radius: 8px 8px 0 0; +} + +/* +// NO IDEA WHAT THIS DOES HAHA +@media (max-width: 580px) { + .nav { + overflow: auto; + } +} +*/ + +/* CLAIRO */ +.clairo { + position: absolute; + top: 5px; + left: 5px; +} + +/* Particles.js CSS */ +#particles-js { + width: 100%; + height: 100%; + background-color: none; + background-image: url(''); + background-size: cover; + background-position: 50% 50%; + background-repeat: no-repeat; + position: absolute; + left: 0; + top: 0; + z-index: -1 !important; +}
\ No newline at end of file diff --git a/css/no-text-highlighting.css b/css/no-text-highlighting.css new file mode 100644 index 0000000..3764314 --- /dev/null +++ b/css/no-text-highlighting.css @@ -0,0 +1,7 @@ +* { + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: -moz-none; + -o-user-select: none; + user-select: none; +}
\ No newline at end of file diff --git a/detection/.htaccess b/detection/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/detection/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/detection/assets/Sigbench.jar b/detection/assets/Sigbench.jar new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/detection/assets/Sigbench.jar diff --git a/detection/index.php b/detection/index.php new file mode 100644 index 0000000..f136da6 --- /dev/null +++ b/detection/index.php @@ -0,0 +1,336 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - Detection</title> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <!-- Site metadata --> + <meta name="description" content="Detection Information"> + <meta property="og:description" content="Detection Information"> + <meta property="og:title" content="s1nical - Detection"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/detection"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/detection"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "Detection Information", + "headline": "Detection Information", + "url": "https://cyne.cf/detection", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <!-- External Links --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/trianglify/0.3.1/trianglify.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <!-- CSS Links --> + <link rel="stylesheet" href="/about/css/main.css"> + <link rel="stylesheet" href="/about/css/navigation-bar.css"> + <link rel="stylesheet" href="/about/css/loader-animation.css"> + <link rel="stylesheet" href="/about/css/blog-slider.css"> + <style> + html { + overflow-x: hidden; + } + </style> + <!-- Invisable Scripts --> + <script src="/js/loader-animation.js"></script> + <script src="/js/redirect-to-mobile.js"></script> +</head> +<body> + <!-- Visable Scripts --> + <script> + // Background only renders based on the original browser window size when + // starting to load the site. Due to rendering issues, I don't think I + // can do it other wise. + + /////////////// + // SCRIPT #1 // + /////////////// + + // If light mode detected, in reality, if nothing is detected lmao + // Dark mode feature was removed lol + // Set up base pattern + var pattern = Trianglify({ + height: window.innerHeight * 3.23, // White: #fdfbfb, Salmon: #cc3300 + width: window.innerWidth, + // Christmas Colours: + x_colors: ['#040404', '#f9f9f9', '#fffff4', '#fbf7f5', '#d55454'], // Cappuccino: ['#854442', '#3c2f2f', '#fff4e6', '#be9b7b', '#4b3832'] + y_colors: ['#f9f1f1', '#f9f9f9', '#fffff4', '#fbf7f5', '#f9f1f1'], // Random colour generator: "#"+((1<<24)*Math.random()|0).toString(16) + // + // Normal Colours: + // x_colors: ['#040404', '#f9f9f9', '#fffff4', '#fbf7f5', '#d55454'], + // y_colors: ['#f9f1f1', '#f9f9f9', '#fffff4', '#fbf7f5', '#f9f1f1'], + // + // Christmas Colours: + // x_colors: ['#0F8A5F', '#f9f9f9', '#fffff4', '#fbf7f5', '#CC231E'], + // y_colors: ['#f9f1f1', '#f9f9f9', '#fffff4', '#fbf7f5', '#f9f1f1'], + // + variance: 10, // Gives it more style + seed: Number.parseInt(Math.floor(Math.random() * 100)), // TODO: Live seed transitioning. + cell_size: 160 // Cell size + }); + + // REMOVED bc looked ugly + // If dark mode detected + // if (matchMedia('(prefers-color-scheme: dark)').matches) { + // var pattern = Trianglify({ + // height: window.innerHeight, // White: #fdfbfb, Salmon: #cc3300 + // width: window.innerWidth, + // x_colors: ['#040404', '#111111', '#111111', '#111111', '#d55454'], // Cappuccino: ['#854442', '#3c2f2f', '#fff4e6', '#be9b7b', '#4b3832'] + // y_colors: ['#f9f1f1', '#111111', '#111111', '#111111', '#f9f1f1'], // Random colour generator: "#"+((1<<24)*Math.random()|0).toString(16) + // variance: 10, // Gives it more style + // seed: Number.parseInt(Math.floor(Math.random() * 100)), // TODO: Live seed transitioning. + // cell_size: 160 // Cell size + // }); + // } + + // // Canvas + // document.body.appendChild(pattern.canvas()) + + // SVG + document.body.appendChild(pattern.svg()) + + + + // // PNG + // var png = document.createElement('img') + // png.src = pattern.png() + // document.body.appendChild(png) + + /////////////// + // SCRIPT #2 // + /////////////// + + $('.title-wrapper').css('width', window.innerWidth); + $('.title-wrapper').css('height', window.innerHeight); + + + var time = 10, + $paths = $('body').find('svg').find('path'), + pathCollection = $paths.get(), + count = $paths.length; + + // // Log variable "count" + // console.log(count); + + pathCollection.sort(function () { + return Math.random() * 10 > 5 ? 1 : -1; + }); + + function showText() { + var title = $('h1'), + subtitle = $('h2'); + + title.removeClass('hidden'); + setTimeout(function () { + subtitle.removeClass('hidden'); + }, 500); + } + + setTimeout(function () { + $.each(pathCollection, function (i, el) { + var $path = $(this); + setTimeout(function () { + + $path.css('opacity', '1'); + }, time) + time += 10; + + if (i + 1 === count) { + setTimeout(function () { + showText(); + }, 2000); + } + + }); + }, 2000); + </script> + + <!-- Navigation Bar --> + <div class="navigation-bar"> + <nav class="nav"> + <a href="/home/" class="nav-item" active-color="orange">Home</a> + <!-- Had `is-active` after it but removed it due to not highlighting. --> + <a href="#" class="nav-item" active-color="green">About</a> <!-- About --> + <!--<a href="https://p.s1n.pw/" class="nav-item" active-color="blue">Portfolio</a> <!-- Testimonials --> + <a href="https://cyne.cf/status" class="nav-item" active-color="red">Status</a> <!-- Blog --> + <!--<a href="/cars/" class="nav-item" active-color="rebeccapurple">Cars</a> <!-- Contact --> + <!--<a href="https://nani.s1n.pw" class="nav-item" active-color="rebeccapurple">Nani?!</a>--> + <span class="nav-indicator"></span> + </nav> + </div> + + <div class="bio"> + <div class="links"> + <div class="blog-slider" style="height: 2860px; width: 100%"> + <p class="desc" id="introduction" style="color: #a52233; font-weight: bold; text-align: left; font-size: 18px; position: relative; left: 5.5%"> + Warning: "Experienced Pasters" May find the following post cringy.<br> + This thread is for newcomers without any knowledge about how to protect your Paste from VAC. + </p> + <p class="desc" style="color: #3399ff; font-weight: bold; text-align: left; font-size: 18px; margin: 0; position: relative; left: 5.5%"> + Since you asked for it, I'll do a simple Step by Step Tutorial for braindeads on how to protect your Pastes from VAC Signature Scans etc (Make them Undetected).<br> + <span style="color: #3366ff;">You don't need to do any of those steps if you are using your 100% self-coded Cheat since the code shouldn't be public.</span> + </p> + <br> + + <p class="desc" id="remove-features" style="word-wrap: break-word; white-space: pre-wrap; text-align: left; font-size : 17px"> + <span style="font-weight: bold; font-size: 20px">1. Change Signature</span> + + First, you will need the Project File of your Paste. You won't be able to protect it properly with the DLL only. + (I'll use Riptide for this Step) + + 1.1 Remove Features: + Only keep features you will really need. + Removing unnecessary features will change the signature and speed up the cheat. Also, you'll maybe fix crashes without knowing it. + + Don't remove the Checkboxes only, also remove the Functions. Search with "CTRL + F" for relateable functions you don't need. + For example, if you want to remove Knifebot, Remove the Knifebot.cpp and Knifebot.h. Also remove the Saving and Loading Convars in Settings.cpp and Settings.h. + Stuff like this "<code>#define CVAR_KNIFEBOT_ACTIVE</code>, "<code>knf_Active</code>" or this "<code>extern bool knf_Active;</code>". + Of course, you have to remove the Checkboxes in Client.cpp and "class CKnifebot" in Client.h too. + + If you want to remove features like Damage Indicator you also have to remove all the Stuff in Esp.cpp, Client.cpp and Settings.cpp/h. Search with CTRL + F for "DamageIndicator" and remove + everything you can find. + For example this stuff: + "<code>void CEsp::DrawDamageIndicator()...." and this "std::vector<DamageIndicator_t> DamageIndicator;</code>" + etc. + </p> + <p class="desc" id="rename-functions-features" style="word-wrap: break-word; white-space: pre-wrap; text-align: left; font-size : 17px"> + <span style="font-weight: bold; font-size: 20px">1.2 Rename Functions and Features:</span> + <span style="font-size: 15px">User Advice: Please Save a Source Backup in case you break features with the next Step.</span> + + If you have the time to, you can rename all features in Riptide / Indigo and other Pastes. + For example rename "Backtrack". + + Open your Client.cpp and search for "Backtrack". + You will probably find something like this: + <code>ImGui::Checkbox("Backtrack", &Settings::Aimbot::aim_Backtrack);</code> + + Now Rename "<code>aim_Backtrack</code>". You can do CTRL + H if you don't want to remove everything manually. Be careful, you can break some features with CTRL + H. + In the first Field write "<code>aim_Backtrack</code>" and in the second any other name. For example "RewindKill". + Now change the Search Options to "Entire Solution" and press on the Replace All Button (Red Circled Button in the Picture). + This will Replace all functions named <code>aim_Backtrack</code> with RewindKill. + </p> + <p class="desc" id="junkcode" style="word-wrap: break-word; white-space: pre-wrap; text-align: left; font-size : 17px"> + <span style="font-weight: bold; font-size: 20px">1.3 Add Junkcode:</span> + <span style="font-size: 15px">User Advice: Please Save a Source Backup in case you break features with the next Step. + I don't care if Junkcode is a Meme. VAC scans for signature and Junk changes signature a lot. It works for me so I suggest you to use it.</span> + + Why do you need Junkcode / What is Junkcode? + Imagine you wrote an exam on your Computer and the Teacher checks if you copied something from the Internet. He will take random sentences from your exam and search online if you copied them. VAC + is kind of similar. It scans randomly for code and searches in the Database for detected Code. You use "undetected" Junkcode to mess up your source code. The more Junkcode you have, the harder it + will be for VAC to find detected code. With a lot of Junk, VAC picks up the Junkcode instead of your source code, so the detection will be false. I know, It's definitely not the way how VAC works + but the easiest way to explain VAC to newcomers. + + I suggest you, don't use Auto Junk Adder. They only add Junk Code at the end of your CPP Files. If you want to be safe, add Junk between the Source Code and not only at the end of your source. + + This Step will take a lot of time if you do it manually without auto junk adder, but it will be a lot safer. The longer it takes, the safer it will be. + + Add Junkcode to every single .CPP File. Don't add Junk to your .h (headerfiles). If you have Protobuf, ("protobuf" folder with files) add Junk to all .pb.cc files. + You can use this Website for c++ Junk: <a href="https://junkcode.gehaxelt.in/">https://junkcode.gehaxelt.in/</a>. + If you use C# use this: <a href="https://pasters.cc/showthread.php?tid=5017">https://pasters.cc/showthread.php?tid=5017</a></span>. + The Junkcode changes everytime you reload the Website. Only use the same Junkcode once on all CPP Files. That means, don't C&P the Junkcode and Paste the same Junk 2 times at the same Page. + + I suggest you to add +50% Junkcode of the actual CPP file. 50% Junk and 50% cheat code. + + GIF: <a href="https://imgur.com/aQU4qQD">https://imgur.com/aQU4qQD</a></span> + </p> + <p class="desc" id="-disable-optimizations" style="word-wrap: break-word; white-space: pre-wrap; text-align: left; font-size : 17px"> + <span style="font-weight: bold; font-size: 20px">1.4 Disable Optimization Settings</span> + + Open your Project Settings and Disable all Optimization Settings. + If you don't know how to do that: + - Right Click on Solution and open Options. + - Press on C/C++, Open Optimizations + - Optimization should be "Disabled (/Od), + - Change Everything else to No/Neither/Disabled + </p> + <p class="desc" id="signbench" style="word-wrap: break-word; white-space: pre-wrap; text-align: left; font-size : 17px"> + <span style="font-weight: bold; font-size: 20px">1.5 Signbench</span> + + Sigbench will show you the percentage amount of difference between the old default dll and your junkprotected dll. + + You need JAVA for this. Install this if you haven't already <a href="https://java.com/de/download/">https://java.com/de/download/</a> + + <a href="/detection/assets/Sigbench.jar">Download Sigbench</a><!--: http://www.mediafire.com/file/6k0mh81gf3y4vqg/Sigbench_%255Bunknowncheats.me%255D_.zip/file--> + + You need your Junkprotected DLL (without vmprotect or themida) and the default DLL (Without Junk). + Open Sigbench. Drag&Drop the protected dll on the left and the default on the right side of Sigbench. + Change the Sig size to 16 and press Benchmark. This can take a while (up to 5 Minutes if your PC is garbage). + Do this step 5 times. If the average is below 45% you should add more Junk. Average +50% = decent. Average +75% = good, your safe. + + It should look somehow like this: <a href="https://imgur.com/6kOpTCv">https://imgur.com/6kOpTCv</a> + </p> + <p class="desc" id="protect" style="word-wrap: break-word; white-space: pre-wrap; text-align: left; font-size : 17px"> + <span style="font-weight: bold; font-size: 20px">2. Protect your Cheat</span> + <span style="font-size: 15px">This step will protect your cheat from Skids, trying to crack your dll and steal the source. + It also changes the Signature difference up to 99% but nobody knows if this actually makes your cheat undetected (works for me tho).</span> + + I've been banned a lot with VMProtect so I suggest you to use Themida. + Download Crack: <a href="http://www.mediafire.com/file/yv4dkz2zmqnaeq3/Themida.zip/file">http://www.mediafire.com/file/yv4dkz2zmqnaeq3/Themida.zip/file</a> + + Some of you told me it crashes with Themida. That's because of the Compression. Disable "Application" in the "Compression" options. + Enable all those Settings: <a href="https://imgur.com/a/2hEvpA6">https://imgur.com/a/2hEvpA6</a> + + Now just Protect it and you Dll should be VAC Safe. + + You can check your Final dll with sigbench again. If you have an average difference +80% your dll should be safe. + + Tipps: + - Play the first 10 Matchmaking Matches without any cheats for a good trust factor. + - Don't share your Dll with anyone. + - Use an Undetected Injector and only Inject in Main Menu. Don't inject Ingame. + </p> + <p class="desc" id="outro" style="color: #cc3333; font-weight: bold; text-align: left; font-size: 17px; position: relative; left: 5.5%"> + There are definitely more ways to protect your cheat. Those are Basics. + </p> + </div> + </div> + </div> + + <!-- Loading Animation --> + <div class="loader-wrapper"> + <div class="loader"> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + </div> + </div> +</body> +</html>
\ No newline at end of file diff --git a/dino/css/main.css b/dino/css/main.css new file mode 100644 index 0000000..f5774fa --- /dev/null +++ b/dino/css/main.css @@ -0,0 +1,170 @@ +/* latin */ +@font-face { + font-family: 'Press Start 2P'; + font-style: normal; + font-weight: 400; + src: local('Press Start 2P Regular'), local('PressStart2P-Regular'), url(https://fonts.gstatic.com/s/pressstart2p/v8/e3t4euO8T-267oIAQAu6jDQyK3nVivM.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + } + +html, +body { + padding: 0; + margin: 0; + width: 100%; + height: 100%; +} + +.icon { + -webkit-user-select: none; + user-select: none; + display: inline-block; +} + +.icon-offline { + content: -webkit-image-set( + url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABIAQMAAABvIyEEAAAABlBMVEUAAABTU1OoaSf/AAAAAXRSTlMAQObYZgAAAGxJREFUeF7tyMEJwkAQRuFf5ipMKxYQiJ3Z2nSwrWwBA0+DQZcdxEOueaePp9+dQZFB7GpUcURSVU66yVNFj6LFICatThZB6r/ko/pbRpUgilY0Cbw5sNmb9txGXUKyuH7eV25x39DtJXUNPQGJtWFV+BT/QAAAAABJRU5ErkJggg==) + 1x, + url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAACQBAMAAAAVaP+LAAAAGFBMVEUAAABTU1NNTU1TU1NPT09SUlJSUlJTU1O8B7DEAAAAB3RSTlMAoArVKvVgBuEdKgAAAJ1JREFUeF7t1TEOwyAMQNG0Q6/UE+RMXD9d/tC6womIFSL9P+MnAYOXeTIzMzMzMzMzaz8J9Ri6HoITmuHXhISE8nEh9yxDh55aCEUoTGbbQwjqHwIkRAEiIaG0+0aa9vbmae89rogeoww936mqrwdbr4gn/z0IAdQ6nQ/FIpRXDwHcA+JIJcQowQAlFUA0MfQpXLlVQfkzR4igS6ENjknm/wiaGhsAAAAASUVORK5CYII=) + 2x + ); + position: relative; +} + +.hidden { + display: none; +} + +/* Offline page */ + +.offline .interstitial-wrapper { + color: #2b2b2b; + font-size: 1em; + line-height: 1.55; + margin: 0 auto; + max-width: 600px; + padding-top: 100px; + width: 100%; +} + +.offline .runner-container { + height: 150px; + max-width: 600px; + overflow: hidden; + position: absolute; + top: 35px; + width: 44px; +} + +.offline .runner-canvas { + height: 150px; + max-width: 600px; + opacity: 1; + overflow: hidden; + position: absolute; + top: 0; + z-index: 2; +} + +.offline .controller { + background: rgba(247, 247, 247, 0.1); + height: 100vh; + left: 0; + position: absolute; + top: 0; + width: 100vw; + z-index: 1; +} + +#offline-resources { + display: none; +} + +#instructions { + margin: 2em; + text-align: center; +} + +@media (max-width: 420px) { + .suggested-left > #control-buttons, + .suggested-right > #control-buttons { + float: none; + } + .snackbar { + left: 0; + bottom: 0; + width: 100%; + border-radius: 0; + } +} + +@media (max-height: 350px) { + h1 { + margin: 0 0 15px; + } + .icon-offline { + margin: 0 0 10px; + } + .interstitial-wrapper { + margin-top: 5%; + } + .nav-wrapper { + margin-top: 30px; + } +} + +@media (min-width: 600px) and (max-width: 736px) and (orientation: landscape) { + .offline .interstitial-wrapper { + margin-left: 0; + margin-right: 0; + } +} + +@media (min-width: 420px) and (max-width: 736px) and (min-height: 240px) and (max-height: 420px) and (orientation: landscape) { + .interstitial-wrapper { + margin-bottom: 100px; + } +} + +@media (min-height: 240px) and (orientation: landscape) { + .offline .interstitial-wrapper { + margin-bottom: 90px; + } + .icon-offline { + margin-bottom: 20px; + } +} + +@media (max-height: 320px) and (orientation: landscape) { + .icon-offline { + margin-bottom: 0; + } + .offline .runner-container { + top: 10px; + } +} + +@media (max-width: 240px) { + .interstitial-wrapper { + overflow: inherit; + padding: 0 8px; + } +} + +.footer{ + position: fixed; + text-align: center; + bottom: 5px; + width: 100%; + left: 0%; + font-family: 'Press Start 2P'; + font-size: 75%; + color: #535353; +} + +a:link { + text-decoration: none; + } + + + diff --git a/dino/favicon.png b/dino/favicon.png Binary files differnew file mode 100644 index 0000000..ccf9494 --- /dev/null +++ b/dino/favicon.png diff --git a/dino/index.html b/dino/index.html new file mode 100644 index 0000000..3041a1a --- /dev/null +++ b/dino/index.html @@ -0,0 +1,90 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - Dino Game</title> + <!-- Site metadata --> + <meta name="description" content="Dino Game"> + <meta property="og:description" content="Dino Game"> + <meta property="og:title" content="s1nical - Dino Game"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/dino"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/dino"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "Dino Game", + "headline": "Dino Game", + "url": "https://cyne.cf/dino", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <!-- CSS Links --> + <link rel="stylesheet" href="/dino/css/main.css"> + <link rel="stylesheet" href="/css/no-text-highlighting.css"> + <link rel="shortcut icon" href="/dino/favicon.png" type="image/x-icon"> + <!-- External Libraries --> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> +</head> + + <body id="t" class="offline"> + <div id="main-frame-error" class="interstitial-wrapper"> + <div id="main-content"> + <div class="icon icon-offline" alt=""></div> + </div> + <div id="offline-resources"> + <img id="offline-resources-1x" + src="data:image/png;base64,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"> + <img id="offline-resources-2x" + src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAACYkAAACCBAMAAAD7gMi8AAAAIVBMVEUAAAD39/fa2tr///+5ublTU1P29vbv7+/+/v74+Pjw8PCjSky4AAAAAXRSTlMAQObYZgAADDlJREFUeAHs3StsLEmWh/Gvy2WuJBe3gs9r3RwFV7+Ss36h4cgcLZnXchbkcgVc6GqZg9TlJJpb7odDLh0pFBN2ONPOqvT/J3U568Q5OTs7M+WTJ6PSrEZEREREPgMYaEksxQETyxpIz8oitQNXcJhVYlmWt+hCqbvC8WCaEWP2GSZK/uYXHlx+CXcfj4f5aARykBGyYIkjx9UcsljOy4fFWcY/XnJuwM73qoZKLG0g99TsOGciIntg8LTERI92H+AcE29u8BBTK3DlgMOcEsuyvOUXSp0VE6uZwLE8EfaInIDxLjBefnm8Pswh8sXk5RgIx7e2Sn6bjRAsxmi1X37EzoIJx6tW2YL9k60YPs6/jHZMZBOOBQ14Iuk5PYqPqRqwvspxmFFiWZa3/EI5nmtXGEfBYlMrz4Lt8abFrO9q523fAPgiFs8+14zF+/Ce5mIOkaMPfHfNHCJ7a8U6mrHOj24HE+dsSEXg6sA6bDzXb3qV3Ak3ZzT2Z36+AUaAkK/7uPv4pf1uH6G8bxnGx9CI3Xu0ise3+VSvQnSPcgKR7MN33wHf5deXEtmf/yeXTca6eioLXHGoNVmWMZTd6JUrSt6MjefalpuKucagsxGbcE/n/Tkf/MxW+fp/WTeRO1YiYdOfYt0XmCK2mzUfPfxTXj2S7z3ataVdeYYRxsejvJrZkagX6/joPh2VnioHrly1ybKMweNj0Yq5sqTfAGn7F/LN0VgEDze/sGETbtXz9ueCm5+7+V5swjnyTxC5/jtLEvVi0dMlMC62sWIAUld2VweYe6pUBpwDN2FN1qHMoMVKlr/Z2N/WLTUVm4pYczI2uZdPxoj+JkKdfReSu2BXj+UNyJxzXP2SkEvvPl5++ZAbHt8/5uWMFnFM83O33ou5CaZ8wPJERL0Y0S/+yb4pQ1rnZmNpSGVbd4rEncB5nab7C5vKe5UituEVM9qdyMq+1vzScmfDDkveItkzsxkbn/r8n3q+EwmR1JUd8e3J2JCagXpJx33O9e+3tts614hNz8wzfXvGXDPvJMnUm7u+vR7VIiKb6cWiNWP5jd/CPKy+R6yvpHHTch2V+61t08lvoAqXX47Ys1kvR+zeYgjjcV+rsVh9dbQH9RSLxb+GzJu36VmvzvGOyYdrexWZ34tFO/L24602iw/4Wdk2GWv3TmXgyZLlN3ENpI6KTfvz/9rrC4nsV7+4EO3bf3i9C9htSDuwQxOKmB0VZynOZxmBTdKnWLSgt55MlnsQmC1EUkeFdW/9jWDtq16OR1PfHcr+u5STq+ZNuMdYjJBfRU5sLuYc7pnDv8mxFNGzXkVXlHZvEjyRtzPgG/OtdjZF5ToGSLW9+dUFHzGNCluJaUYjeKLsWa+nRjQXc0xMTzZaIh++ZILvfuH/EFnyU8xrk8yyUzBb6D+VdW9p4S9prs+e9bp98cxy1YtN5ZHI00Z7yk4RrweDPdm1OImdpyZXZWHWOS0eWJXsl2nF4iJTMXtvUjt7/SfNtpsfW1ijj3I8mCox+mPtu5R9scnl2Aae9Srau4/INXOI7N/9VOyAYx1iz3otruNMjufH9pTGP+JUBNrsynGs/iv2nNPOQ/mg4qHyP6uYM84hF8t9pqBeTPQ9SpHXnu73fMzPmooV7yKpI7vF1wOtZsyf1Nf5B5K+RylyUr2YyPXj6/gl4SOUHuPh48NB6XIEENnzrsQ0lAE4AK5dsvr3pood/APbsJnvUQ54YnGl4jmKZ50LI6GMVOdhF38FuL+ln5WqFxMR9WLzf9X0i5jac8PApI7sRCGmauDAlc262iXZwVIdb6L4/qVnm2yD68yTQKCP3ffsPOeI9HddhfvbWaU7zoKIiOZiEVIzkE2HoZVh3RjOSlhDTDAk5MQUVyomnWNuZ/u5+/zXTxdXuUOqdk55YfHSPesR+fDT///xz7X9CREojRQsuZof6GUn5HKsniH0XwLLSr1YnP2rpl9ZFyuzLhOB1JGdLGSFRaBoxVoZ5sDVIq3YMK8V8zHZqc5zw9gX2i72nlxcPXRdACb3YC8vvb/dsSKRf/Id14gs0ov5uMUnjaXoG4HCBAfqJb5Z8mKeXtaSFn+U0nOOIvx8EyHUv9Vo31UESneBZd2FnitEuwgN5Q3y2gVCxJxf7kigfoFfXoLvnDVXRef0sEBpidIdaxH58N13wHf5VWReL1ZvxjzdH93zpcqsy2Z2qS+7txk7QH/J/CaxX+KM6FmvYqzLsoj79dOs0j1rErGructx2WfGNi4Dcw6hthS6zpkvQkeLr0H2GM8WpQi+Eugr8WR++Yndemda39ae9eqJ+bUU8WefOxLyaylUYjtHjS3cfbRJ5wKlO9Yj8gH45zUziOwX/VWzvPbszSZjjezEgKkFSpWSMHgexXQSLdSQ7Ch6ztSfb7644Yb69Z0F70JHvMGqOpYsVIsH5F0/X0zkOv8zg8iePhLTSUzGBh+THZ3vZCx6YmQzPHVxA7kjdQHz62T3ERvsRs4ipTvOmYjIfvlfNcsrd4u1J2OWvbzYPu1QHrUXUgS8LXTI2/btKEXsVGbCAW4qY6YrVjG9LObIMRHNxUR/jlJkTw9JNPjyKKahuhATWYKhWlHv3hqSJR4PYuIcxMg7kDaca+4PF3+18VZf6W13qdmBiIh6scRriM88fyJSRk5BTB1xW6l3bwPPYxWIaC4mInLydqQ4e4eUpFgJxmQLHa1YrC/0sIppApwDk2OZq8TKvKanqlw9zzmLbURKMW41F0J4/mTsll+nT/Sy0vfXi4mI7J/eQh6T7cl6S5G04lxu/j78mCoLEWi3YgmraIzLzqZ/lkjabG7QXGw2EZE9kOKsPieSkBR9peUqFixq2hW2YNE2q8A4Jk6FY5PscmV7uRAYl98z9uunhUp3nDsRUS9Gmv/R3W9rHV6K9T9kaQstRYXHpGq0JT33O5JuejJvznco3VN5IpqLiYjskYUkYOhaaPd1vjF6k7OZjMVN5NYnY6FnMmYDrePSzh0j97ezSnecMxGR/exfNWczskqNwMFe+0uWR4Kh8beZOrQnXo7OyZimYv1EczEREc3F0pOBw/ySN5AYbEaGB/JLTDzJdXVAriMXp81izccOpw3k1iZjobFnjIu/luMt7Eliv5aRmaU7zpmIyH6BXzXr7hbTdwViet3JGE5TMZkn77XffZ5/LF+6YzUiIpqLqRmLkDBLjcbcs1OdhmKVP5RvP5fPBY+HOEBq5UZY+P+GwGg/m3L7ZBu8Ho7M/YEWK8pHO/dwYKXqxUREvVj50b28pKnYs6SIf/ZYcgJcPeZgauXloOuZieHaebJ1F3+t/Y0jcl91cXV/21OaWal6sXdLRL3Y2NipP67z+EdJA70cTHqs2Bvs6IskrFdeNncgHoNVOQOPJy74f4MJzclY0T6RB1z3t/SwootftXdfRNSLlf1V5aM7sLSELI9p4Vj/GWTz7NkUlPh1ymu3M0rVi4mI7lGuTUR/9aidb5Ox/HONv3pk7dOMqdixM6vet1QvJiLqxSKJHiKiWdn8UvViIqJebAQiItLkiSQ7Wjz3aZa19P8NI6E4arRPj/v1L/omY7bVrKReTET0xOrwBwDvhwHsSCqGJRd6DbxLok8xERHtFxsD79aQBuyNj+mlC8YWOljFGiTa0eK5/Zb9vyHYUceuMTOrSL2YiOiZFqH50a0HWgw+enuXYnr5gjVptjAkKhoVZ0BEczERkc94DZqLpZcvFE1aTMdQyj+OsSHlNzHVKt4nUS8mIqJeTKxx6l6oN2l5weZiOZ4eCwZI/73i9/buAjdyIIgCaC34fBv6lwyfL8zJBhYslQda7wkz2F1Tir+5EchiADhw/9+PO3AfWQwAAADso4TUg8vzaqCAswpruxgAkNS9KTvVQAFnFFYWAwCSVAljbQWcUVhZDABI6sWUvtCggL2FlcUAvlVqRHBUb6adevP5UKfUPyngvwu7CkcDZDEAIEmtaesOtosBOI8Spp3tvnUXshggi2XhBVgalpANQ22byQAaZqevGuirMbMYQJJUn3z+/GqVzBnBZ1liKPOHlKRhH9uyb01VJTM+QV+1iL4aKosBkO7PWF6yohokqU2nr/SVLAaQuf/fk2TZ7QBJGieXjBBRks0PIvqqgb4aNIsB9k4mq9vrlEHLudzvkw1f3kZfLURf9WcxAAAAuAMrmVNBFPg6WAAAAABJRU5ErkJggg=="> + <template id="audio-resources"> + <audio id="offline-sound-press" + src="data:audio/mpeg;base64,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"></audio> + <audio id="offline-sound-hit" + src="data:audio/mpeg;base64,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"></audio> + <audio id="offline-sound-reached" + src="data:audio/mpeg;base64,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"></audio> + </template> + </div> + </div> + + <!-- Visable Scripts --> + <script src="/dino/js//main.js"></script> + + <div class="footer"> + <link rel="stylesheet" type="text/css" + href="//code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css" />Copyright © + <script> + var d = new Date() + document.write(d.getFullYear()) + </script> + <a href="https://google.de">Google</a></a> + </div> + + </body> + +</html> diff --git a/dino/js/main.js b/dino/js/main.js new file mode 100644 index 0000000..62735fe --- /dev/null +++ b/dino/js/main.js @@ -0,0 +1,2961 @@ +(function () { + "use strict"; + /** + * T-Rex runner. + * @param {string} outerContainerId Outer containing element id. + * @param {Object} opt_config + * @constructor + * @export + */ + function Runner(outerContainerId, opt_config) { + // Singleton + if (Runner.instance_) { + return Runner.instance_; + } + Runner.instance_ = this; + + this.outerContainerEl = document.querySelector(outerContainerId); + this.containerEl = null; + this.snackbarEl = null; + this.detailsButton = this.outerContainerEl.querySelector("#details-button"); + + this.config = opt_config || Runner.config; + + this.dimensions = Runner.defaultDimensions; + + this.canvas = null; + this.canvasCtx = null; + + this.tRex = null; + + this.distanceMeter = null; + this.distanceRan = 0; + + this.highestScore = 0; + + this.time = 0; + this.runningTime = 0; + this.msPerFrame = 1000 / FPS; + this.currentSpeed = this.config.SPEED; + + this.obstacles = []; + + this.activated = false; // Whether the easter egg has been activated. + this.playing = false; // Whether the game is currently in play state. + this.crashed = false; + this.paused = false; + this.inverted = false; + this.invertTimer = 0; + this.resizeTimerId_ = null; + + this.playCount = 0; + + // Sound FX. + this.audioBuffer = null; + this.soundFx = {}; + + // Global web audio context for playing sounds. + this.audioContext = null; + + // Images. + this.images = {}; + this.imagesLoaded = 0; + + if (this.isDisabled()) { + this.setupDisabledRunner(); + } else { + this.loadImages(); + } + } + window["Runner"] = Runner; + + /** + * Default game width. + * @const + */ + var DEFAULT_WIDTH = 600; + + console.log("FPS Configuration") + /** + * Frames per second. + * @const + */ + var FPS = 60; + + /** @const */ + var IS_HIDPI = window.devicePixelRatio > 1; + + /** @const */ + var IS_IOS = /iPad|iPhone|iPod/.test(window.navigator.platform); + + /** @const */ + var IS_MOBILE = /Android/.test(window.navigator.userAgent) || IS_IOS; + + /** @const */ + var IS_TOUCH_ENABLED = "ontouchstart" in window; + + console.log("Game Configuration") + /** + * Default game configuration. + * @enum {number} + */ + Runner.config = { + ACCELERATION: 0.001, + BG_CLOUD_SPEED: 0.2, + BOTTOM_PAD: 10, + CLEAR_TIME: 3000, + CLOUD_FREQUENCY: 0.5, + GAMEOVER_CLEAR_TIME: 750, + GAP_COEFFICIENT: 0.6, + GRAVITY: 0.6, + INITIAL_JUMP_VELOCITY: 12, + INVERT_FADE_DURATION: 12000, + INVERT_DISTANCE: 700, + MAX_BLINK_COUNT: 3, + MAX_CLOUDS: 6, + MAX_OBSTACLE_LENGTH: 3, + MAX_OBSTACLE_DUPLICATION: 2, + MAX_SPEED: 13, + MIN_JUMP_HEIGHT: 35, + MOBILE_SPEED_COEFFICIENT: 1.2, + RESOURCE_TEMPLATE_ID: "audio-resources", + SPEED: 6, + SPEED_DROP_COEFFICIENT: 3 + }; + + /** + * Default dimensions. + * @enum {string} + */ + Runner.defaultDimensions = { + WIDTH: DEFAULT_WIDTH, + HEIGHT: 150 + }; + + /** + * CSS class names. + * @enum {string} + */ + Runner.classes = { + CANVAS: "runner-canvas", + CONTAINER: "runner-container", + CRASHED: "crashed", + ICON: "icon-offline", + INVERTED: "inverted", + SNACKBAR: "snackbar", + SNACKBAR_SHOW: "snackbar-show", + TOUCH_CONTROLLER: "controller" + }; + + /** + * Sprite definition layout of the spritesheet. + * @enum {Object} + */ + Runner.spriteDefinition = { + LDPI: { + CACTUS_LARGE: { + x: 332, + y: 2 + }, + CACTUS_SMALL: { + x: 228, + y: 2 + }, + CLOUD: { + x: 86, + y: 2 + }, + HORIZON: { + x: 2, + y: 54 + }, + MOON: { + x: 484, + y: 2 + }, + PTERODACTYL: { + x: 134, + y: 2 + }, + RESTART: { + x: 2, + y: 2 + }, + TEXT_SPRITE: { + x: 655, + y: 2 + }, + TREX: { + x: 848, + y: 2 + }, + STAR: { + x: 645, + y: 2 + } + }, + HDPI: { + CACTUS_LARGE: { + x: 652, + y: 2 + }, + CACTUS_SMALL: { + x: 446, + y: 2 + }, + CLOUD: { + x: 166, + y: 2 + }, + HORIZON: { + x: 2, + y: 104 + }, + MOON: { + x: 954, + y: 2 + }, + PTERODACTYL: { + x: 260, + y: 2 + }, + RESTART: { + x: 2, + y: 2 + }, + TEXT_SPRITE: { + x: 1294, + y: 2 + }, + TREX: { + x: 1678, + y: 2 + }, + STAR: { + x: 1276, + y: 2 + } + } + }; + + /** + * Sound FX. Reference to the ID of the audio tag on interstitial page. + * @enum {string} + */ + Runner.sounds = { + BUTTON_PRESS: "offline-sound-press", + HIT: "offline-sound-hit", + SCORE: "offline-sound-reached" + }; + + /** + * Key code mapping. + * @enum {Object} + */ + Runner.keycodes = { + JUMP: { + "38": 1, + "32": 1, + "87": 1 + }, // Up, spacebar + DUCK: { + "40": 1, + "83": 1 + }, // Down + RESTART: { + "13": 1, + "82": 1 + } // Enter + }; + + /** + * Runner event names. + * @enum {string} + */ + Runner.events = { + ANIM_END: "webkitAnimationEnd", + CLICK: "click", + KEYDOWN: "keydown", + KEYUP: "keyup", + MOUSEDOWN: "mousedown", + MOUSEUP: "mouseup", + RESIZE: "resize", + TOUCHEND: "touchend", + TOUCHSTART: "touchstart", + VISIBILITY: "visibilitychange", + BLUR: "blur", + FOCUS: "focus", + LOAD: "load" + }; + + Runner.prototype = { + /** + * Whether the easter egg has been disabled. CrOS enterprise enrolled devices. + * @return {boolean} + */ + isDisabled: function () { + // return loadTimeData && loadTimeData.valueExists('disabledEasterEgg'); + return false; + }, + + /** + * For disabled instances, set up a snackbar with the disabled message. + */ + setupDisabledRunner: function () { + this.containerEl = document.createElement("div"); + this.containerEl.className = Runner.classes.SNACKBAR; + this.containerEl.textContent = loadTimeData.getValue("disabledEasterEgg"); + this.outerContainerEl.appendChild(this.containerEl); + + // Show notification when the activation key is pressed. + document.addEventListener( + Runner.events.KEYDOWN, + function (e) { + if (Runner.keycodes.JUMP[e.keyCode]) { + this.containerEl.classList.add(Runner.classes.SNACKBAR_SHOW); + document.querySelector(".icon").classList.add("icon-disabled"); + } + }.bind(this) + ); + }, + + /** + * Setting individual settings for debugging. + * @param {string} setting + * @param {*} value + */ + updateConfigSetting: function (setting, value) { + if (setting in this.config && value != undefined) { + this.config[setting] = value; + + switch (setting) { + case "GRAVITY": + case "MIN_JUMP_HEIGHT": + case "SPEED_DROP_COEFFICIENT": + this.tRex.config[setting] = value; + break; + case "INITIAL_JUMP_VELOCITY": + this.tRex.setJumpVelocity(value); + break; + case "SPEED": + this.setSpeed(value); + break; + } + } + }, + + /** + * Cache the appropriate image sprite from the page and get the sprite sheet + * definition. + */ + loadImages: function () { + if (IS_HIDPI) { + Runner.imageSprite = document.getElementById("offline-resources-2x"); + this.spriteDef = Runner.spriteDefinition.HDPI; + } else { + Runner.imageSprite = document.getElementById("offline-resources-1x"); + this.spriteDef = Runner.spriteDefinition.LDPI; + } + + if (Runner.imageSprite.complete) { + this.init(); + } else { + // If the images are not yet loaded, add a listener. + Runner.imageSprite.addEventListener( + Runner.events.LOAD, + this.init.bind(this) + ); + } + }, + + /** + * Load and decode base 64 encoded sounds. + */ + loadSounds: function () { + if (!IS_IOS) { + this.audioContext = new AudioContext(); + + var resourceTemplate = document.getElementById( + this.config.RESOURCE_TEMPLATE_ID + ).content; + + for (var sound in Runner.sounds) { + var soundSrc = resourceTemplate.getElementById(Runner.sounds[sound]) + .src; + soundSrc = soundSrc.substr(soundSrc.indexOf(",") + 1); + var buffer = decodeBase64ToArrayBuffer(soundSrc); + + // Async, so no guarantee of order in array. + this.audioContext.decodeAudioData( + buffer, + function (index, audioData) { + this.soundFx[index] = audioData; + }.bind(this, sound) + ); + } + } + }, + + /** + * Sets the game speed. Adjust the speed accordingly if on a smaller screen. + * @param {number} opt_speed + */ + setSpeed: function (opt_speed) { + var speed = opt_speed || this.currentSpeed; + + // Reduce the speed on smaller mobile screens. + if (this.dimensions.WIDTH < DEFAULT_WIDTH) { + var mobileSpeed = + speed * + this.dimensions.WIDTH / + DEFAULT_WIDTH * + this.config.MOBILE_SPEED_COEFFICIENT; + this.currentSpeed = mobileSpeed > speed ? speed : mobileSpeed; + } else if (opt_speed) { + this.currentSpeed = opt_speed; + } + }, + + /** + * Game initialiser. + */ + init: function () { + // Hide the static icon. + document.querySelector("." + Runner.classes.ICON).style.visibility = + "hidden"; + + this.adjustDimensions(); + this.setSpeed(); + + this.containerEl = document.createElement("div"); + this.containerEl.className = Runner.classes.CONTAINER; + + // Player canvas container. + this.canvas = createCanvas( + this.containerEl, + this.dimensions.WIDTH, + this.dimensions.HEIGHT, + Runner.classes.PLAYER + ); + + this.canvasCtx = this.canvas.getContext("2d"); + this.canvasCtx.fillStyle = "#f7f7f7"; + this.canvasCtx.fill(); + Runner.updateCanvasScaling(this.canvas); + + // Horizon contains clouds, obstacles and the ground. + this.horizon = new Horizon( + this.canvas, + this.spriteDef, + this.dimensions, + this.config.GAP_COEFFICIENT + ); + + // Distance meter + this.distanceMeter = new DistanceMeter( + this.canvas, + this.spriteDef.TEXT_SPRITE, + this.dimensions.WIDTH + ); + + // Draw t-rex + this.tRex = new Trex(this.canvas, this.spriteDef.TREX); + + this.outerContainerEl.appendChild(this.containerEl); + + if (IS_MOBILE) { + this.createTouchController(); + } + + this.startListening(); + this.update(); + + window.addEventListener( + Runner.events.RESIZE, + this.debounceResize.bind(this) + ); + }, + + /** + * Create the touch controller. A div that covers whole screen. + */ + createTouchController: function () { + this.touchController = document.createElement("div"); + this.touchController.className = Runner.classes.TOUCH_CONTROLLER; + this.outerContainerEl.appendChild(this.touchController); + }, + + /** + * Debounce the resize event. + */ + debounceResize: function () { + if (!this.resizeTimerId_) { + this.resizeTimerId_ = setInterval( + this.adjustDimensions.bind(this), + 250 + ); + } + }, + + /** + * Adjust game space dimensions on resize. + */ + adjustDimensions: function () { + clearInterval(this.resizeTimerId_); + this.resizeTimerId_ = null; + + var boxStyles = window.getComputedStyle(this.outerContainerEl); + var padding = Number( + boxStyles.paddingLeft.substr(0, boxStyles.paddingLeft.length - 2) + ); + + this.dimensions.WIDTH = this.outerContainerEl.offsetWidth - padding * 2; + + // Redraw the elements back onto the canvas. + if (this.canvas) { + this.canvas.width = this.dimensions.WIDTH; + this.canvas.height = this.dimensions.HEIGHT; + + Runner.updateCanvasScaling(this.canvas); + + this.distanceMeter.calcXPos(this.dimensions.WIDTH); + this.clearCanvas(); + this.horizon.update(0, 0, true); + this.tRex.update(0); + + // Outer container and distance meter. + if (this.playing || this.crashed || this.paused) { + this.containerEl.style.width = this.dimensions.WIDTH + "px"; + this.containerEl.style.height = this.dimensions.HEIGHT + "px"; + this.distanceMeter.update(0, Math.ceil(this.distanceRan)); + this.stop(); + } else { + this.tRex.draw(0, 0); + } + + // Game over panel. + if (this.crashed && this.gameOverPanel) { + this.gameOverPanel.updateDimensions(this.dimensions.WIDTH); + this.gameOverPanel.draw(); + } + } + }, + + /** + * Play the game intro. + * Canvas container width expands out to the full width. + */ + playIntro: function () { + if (!this.activated && !this.crashed) { + this.playingIntro = true; + this.tRex.playingIntro = true; + + // CSS animation definition. + var keyframes = + "@-webkit-keyframes intro { " + + "from { width:" + + Trex.config.WIDTH + + "px }" + + "to { width: " + + this.dimensions.WIDTH + + "px }" + + "}"; + document.styleSheets[0].insertRule(keyframes, 0); + + this.containerEl.addEventListener( + Runner.events.ANIM_END, + this.startGame.bind(this) + ); + + this.containerEl.style.webkitAnimation = "intro .4s ease-out 1 both"; + this.containerEl.style.width = this.dimensions.WIDTH + "px"; + + // if (this.touchController) { + // this.outerContainerEl.appendChild(this.touchController); + // } + this.playing = true; + this.activated = true; + } else if (this.crashed) { + this.restart(); + } + }, + + /** + * Update the game status to started. + */ + startGame: function () { + this.runningTime = 0; + this.playingIntro = false; + this.tRex.playingIntro = false; + this.containerEl.style.webkitAnimation = ""; + this.playCount++; + + // Handle tabbing off the page. Pause the current game. + document.addEventListener( + Runner.events.VISIBILITY, + this.onVisibilityChange.bind(this) + ); + + window.addEventListener( + Runner.events.BLUR, + this.onVisibilityChange.bind(this) + ); + + window.addEventListener( + Runner.events.FOCUS, + this.onVisibilityChange.bind(this) + ); + }, + + clearCanvas: function () { + this.canvasCtx.clearRect( + 0, + 0, + this.dimensions.WIDTH, + this.dimensions.HEIGHT + ); + }, + + /** + * Update the game frame and schedules the next one. + */ + update: function () { + this.updatePending = false; + + var now = getTimeStamp(); + var deltaTime = now - (this.time || now); + this.time = now; + + if (this.playing) { + this.clearCanvas(); + + if (this.tRex.jumping) { + this.tRex.updateJump(deltaTime); + } + + this.runningTime += deltaTime; + var hasObstacles = this.runningTime > this.config.CLEAR_TIME; + + // First jump triggers the intro. + if (this.tRex.jumpCount == 1 && !this.playingIntro) { + this.playIntro(); + } + + // The horizon doesn't move until the intro is over. + if (this.playingIntro) { + this.horizon.update(0, this.currentSpeed, hasObstacles); + } else { + deltaTime = !this.activated ? 0 : deltaTime; + this.horizon.update( + deltaTime, + this.currentSpeed, + hasObstacles, + this.inverted + ); + } + + // Check for collisions. + var collision = + hasObstacles && + checkForCollision(this.horizon.obstacles[0], this.tRex); + + if (!collision) { + this.distanceRan += this.currentSpeed * deltaTime / this.msPerFrame; + + if (this.currentSpeed < this.config.MAX_SPEED) { + this.currentSpeed += this.config.ACCELERATION; + } + } else { + this.gameOver(); + } + + var playAchievementSound = this.distanceMeter.update( + deltaTime, + Math.ceil(this.distanceRan) + ); + + if (playAchievementSound) { + this.playSound(this.soundFx.SCORE); + } + + // Night mode. + if (this.invertTimer > this.config.INVERT_FADE_DURATION) { + this.invertTimer = 0; + this.invertTrigger = false; + this.invert(); + } else if (this.invertTimer) { + this.invertTimer += deltaTime; + } else { + var actualDistance = this.distanceMeter.getActualDistance( + Math.ceil(this.distanceRan) + ); + + if (actualDistance > 0) { + this.invertTrigger = !( + actualDistance % this.config.INVERT_DISTANCE + ); + + if (this.invertTrigger && this.invertTimer === 0) { + this.invertTimer += deltaTime; + this.invert(); + } + } + } + } + + if ( + this.playing || + (!this.activated && + this.tRex.blinkCount < Runner.config.MAX_BLINK_COUNT) + ) { + this.tRex.update(deltaTime); + this.scheduleNextUpdate(); + } + }, + + /** + * Event handler. + */ + handleEvent: function (e) { + return function (evtType, events) { + switch (evtType) { + case events.KEYDOWN: + case events.TOUCHSTART: + case events.MOUSEDOWN: + this.onKeyDown(e); + break; + case events.KEYUP: + case events.TOUCHEND: + case events.MOUSEUP: + this.onKeyUp(e); + break; + } + }.bind(this)(e.type, Runner.events); + }, + + /** + * Bind relevant key / mouse / touch listeners. + */ + startListening: function () { + // Keys. + document.addEventListener(Runner.events.KEYDOWN, this); + document.addEventListener(Runner.events.KEYUP, this); + + if (IS_MOBILE) { + // Mobile only touch devices. + this.touchController.addEventListener(Runner.events.TOUCHSTART, this); + this.touchController.addEventListener(Runner.events.TOUCHEND, this); + this.containerEl.addEventListener(Runner.events.TOUCHSTART, this); + } else { + // Mouse. + document.addEventListener(Runner.events.MOUSEDOWN, this); + document.addEventListener(Runner.events.MOUSEUP, this); + } + }, + + /** + * Remove all listeners. + */ + stopListening: function () { + document.removeEventListener(Runner.events.KEYDOWN, this); + document.removeEventListener(Runner.events.KEYUP, this); + + if (IS_MOBILE) { + this.touchController.removeEventListener( + Runner.events.TOUCHSTART, + this + ); + this.touchController.removeEventListener(Runner.events.TOUCHEND, this); + this.containerEl.removeEventListener(Runner.events.TOUCHSTART, this); + } else { + document.removeEventListener(Runner.events.MOUSEDOWN, this); + document.removeEventListener(Runner.events.MOUSEUP, this); + } + }, + + /** + * Process keydown. + * @param {Event} e + */ + onKeyDown: function (e) { + // Prevent native page scrolling whilst tapping on mobile. + if (IS_MOBILE && this.playing) { + e.preventDefault(); + } + + if (e.target != this.detailsButton) { + if ( + !this.crashed && + (Runner.keycodes.JUMP[e.keyCode] || + e.type == Runner.events.TOUCHSTART) + ) { + if (!this.playing) { + this.loadSounds(); + this.playing = true; + this.update(); + if (window.errorPageController) { + errorPageController.trackEasterEgg(); + } + } + // Play sound effect and jump on starting the game for the first time. + if (!this.tRex.jumping && !this.tRex.ducking) { + this.playSound(this.soundFx.BUTTON_PRESS); + this.tRex.startJump(this.currentSpeed); + } + } + + if ( + this.crashed && + e.type == Runner.events.TOUCHSTART && + e.currentTarget == this.containerEl + ) { + this.restart(); + } + } + + if (this.playing && !this.crashed && Runner.keycodes.DUCK[e.keyCode]) { + e.preventDefault(); + if (this.tRex.jumping) { + // Speed drop, activated only when jump key is not pressed. + this.tRex.setSpeedDrop(); + } else if (!this.tRex.jumping && !this.tRex.ducking) { + // Duck. + this.tRex.setDuck(true); + } + } + }, + + /** + * Process key up. + * @param {Event} e + */ + onKeyUp: function (e) { + var keyCode = String(e.keyCode); + var isjumpKey = + Runner.keycodes.JUMP[keyCode] || + e.type == Runner.events.TOUCHEND || + e.type == Runner.events.MOUSEDOWN; + + if (this.isRunning() && isjumpKey) { + this.tRex.endJump(); + } else if (Runner.keycodes.DUCK[keyCode]) { + this.tRex.speedDrop = false; + this.tRex.setDuck(false); + } else if (this.crashed) { + // Check that enough time has elapsed before allowing jump key to restart. + var deltaTime = getTimeStamp() - this.time; + + if ( + Runner.keycodes.RESTART[keyCode] || + this.isLeftClickOnCanvas(e) || + (deltaTime >= this.config.GAMEOVER_CLEAR_TIME && + Runner.keycodes.JUMP[keyCode]) + ) { + this.restart(); + } + } else if (this.paused && isjumpKey) { + // Reset the jump state + this.tRex.reset(); + this.play(); + } + }, + + /** + * Returns whether the event was a left click on canvas. + * On Windows right click is registered as a click. + * @param {Event} e + * @return {boolean} + */ + isLeftClickOnCanvas: function (e) { + return ( + e.button != null && + e.button < 2 && + e.type == Runner.events.MOUSEUP && + e.target == this.canvas + ); + }, + + /** + * RequestAnimationFrame wrapper. + */ + scheduleNextUpdate: function () { + if (!this.updatePending) { + this.updatePending = true; + this.raqId = requestAnimationFrame(this.update.bind(this)); + } + }, + + /** + * Whether the game is running. + * @return {boolean} + */ + isRunning: function () { + return !!this.raqId; + }, + + /** + * Game over state. + */ + gameOver: function () { + this.playSound(this.soundFx.HIT); + vibrate(200); + + this.stop(); + this.crashed = true; + this.distanceMeter.acheivement = false; + + this.tRex.update(100, Trex.status.CRASHED); + + // Game over panel. + if (!this.gameOverPanel) { + this.gameOverPanel = new GameOverPanel( + this.canvas, + this.spriteDef.TEXT_SPRITE, + this.spriteDef.RESTART, + this.dimensions + ); + } else { + this.gameOverPanel.draw(); + } + + // Update the high score. + if (this.distanceRan > this.highestScore) { + this.highestScore = Math.ceil(this.distanceRan); + this.distanceMeter.setHighScore(this.highestScore); + } + + // Reset the time clock. + this.time = getTimeStamp(); + }, + + stop: function () { + this.playing = false; + this.paused = true; + cancelAnimationFrame(this.raqId); + this.raqId = 0; + }, + + play: function () { + if (!this.crashed) { + this.playing = true; + this.paused = false; + this.tRex.update(0, Trex.status.RUNNING); + this.time = getTimeStamp(); + this.update(); + } + }, + + restart: function () { + if (!this.raqId) { + this.playCount++; + this.runningTime = 0; + this.playing = true; + this.crashed = false; + this.distanceRan = 0; + this.setSpeed(this.config.SPEED); + this.time = getTimeStamp(); + this.containerEl.classList.remove(Runner.classes.CRASHED); + this.clearCanvas(); + this.distanceMeter.reset(this.highestScore); + this.horizon.reset(); + this.tRex.reset(); + this.playSound(this.soundFx.BUTTON_PRESS); + this.invert(true); + this.update(); + } + }, + + /** + * Pause the game if the tab is not in focus. + */ + onVisibilityChange: function (e) { + if ( + document.hidden || + document.webkitHidden || + e.type == "blur" || + document.visibilityState != "visible" + ) { + this.stop(); + } else if (!this.crashed) { + this.tRex.reset(); + this.play(); + } + }, + + /** + * Play a sound. + * @param {SoundBuffer} soundBuffer + */ + playSound: function (soundBuffer) { + if (soundBuffer) { + var sourceNode = this.audioContext.createBufferSource(); + sourceNode.buffer = soundBuffer; + sourceNode.connect(this.audioContext.destination); + sourceNode.start(0); + } + }, + + /** + * Inverts the current page / canvas colors. + * @param {boolean} Whether to reset colors. + */ + invert: function (reset) { + if (reset) { + document.body.classList.toggle(Runner.classes.INVERTED, false); + this.invertTimer = 0; + this.inverted = false; + } else { + this.inverted = document.body.classList.toggle( + Runner.classes.INVERTED, + this.invertTrigger + ); + } + } + }; + + /** + * Updates the canvas size taking into + * account the backing store pixel ratio and + * the device pixel ratio. + * + * See article by Paul Lewis: + * http://www.html5rocks.com/en/tutorials/canvas/hidpi/ + * + * @param {HTMLCanvasElement} canvas + * @param {number} opt_width + * @param {number} opt_height + * @return {boolean} Whether the canvas was scaled. + */ + Runner.updateCanvasScaling = function (canvas, opt_width, opt_height) { + var context = canvas.getContext("2d"); + + // Query the various pixel ratios + var devicePixelRatio = Math.floor(window.devicePixelRatio) || 1; + var backingStoreRatio = + Math.floor(context.webkitBackingStorePixelRatio) || 1; + var ratio = devicePixelRatio / backingStoreRatio; + + // Upscale the canvas if the two ratios don't match + if (devicePixelRatio !== backingStoreRatio) { + var oldWidth = opt_width || canvas.width; + var oldHeight = opt_height || canvas.height; + + canvas.width = oldWidth * ratio; + canvas.height = oldHeight * ratio; + + canvas.style.width = oldWidth + "px"; + canvas.style.height = oldHeight + "px"; + + // Scale the context to counter the fact that we've manually scaled + // our canvas element. + context.scale(ratio, ratio); + return true; + } else if (devicePixelRatio == 1) { + // Reset the canvas width / height. Fixes scaling bug when the page is + // zoomed and the devicePixelRatio changes accordingly. + canvas.style.width = canvas.width + "px"; + canvas.style.height = canvas.height + "px"; + } + return false; + }; + + /** + * Get random number. + * @param {number} min + * @param {number} max + * @param {number} + */ + function getRandomNum(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; + } + + /** + * Vibrate on mobile devices. + * @param {number} duration Duration of the vibration in milliseconds. + */ + function vibrate(duration) { + if (IS_MOBILE && window.navigator.vibrate) { + window.navigator.vibrate(duration); + } + } + + /** + * Create canvas element. + * @param {HTMLElement} container Element to append canvas to. + * @param {number} width + * @param {number} height + * @param {string} opt_classname + * @return {HTMLCanvasElement} + */ + function createCanvas(container, width, height, opt_classname) { + var canvas = document.createElement("canvas"); + canvas.className = opt_classname + ? Runner.classes.CANVAS + " " + opt_classname + : Runner.classes.CANVAS; + canvas.width = width; + canvas.height = height; + container.appendChild(canvas); + + return canvas; + } + + /** + * Decodes the base 64 audio to ArrayBuffer used by Web Audio. + * @param {string} base64String + */ + function decodeBase64ToArrayBuffer(base64String) { + var len = base64String.length / 4 * 3; + var str = atob(base64String); + var arrayBuffer = new ArrayBuffer(len); + var bytes = new Uint8Array(arrayBuffer); + + for (var i = 0; i < len; i++) { + bytes[i] = str.charCodeAt(i); + } + return bytes.buffer; + } + + /** + * Return the current timestamp. + * @return {number} + */ + function getTimeStamp() { + return IS_IOS ? new Date().getTime() : performance.now(); + } + + //****************************************************************************** + + /** + * Game over panel. + * @param {!HTMLCanvasElement} canvas + * @param {Object} textImgPos + * @param {Object} restartImgPos + * @param {!Object} dimensions Canvas dimensions. + * @constructor + */ + function GameOverPanel(canvas, textImgPos, restartImgPos, dimensions) { + this.canvas = canvas; + this.canvasCtx = canvas.getContext("2d"); + this.canvasDimensions = dimensions; + this.textImgPos = textImgPos; + this.restartImgPos = restartImgPos; + this.draw(); + } + + console.log("Game Over Panel Configuration") + /** + * Dimensions used in the panel. + * @enum {number} + */ + GameOverPanel.dimensions = { + TEXT_X: 0, + TEXT_Y: 13, + TEXT_WIDTH: 191, + TEXT_HEIGHT: 11, + RESTART_WIDTH: 36, + RESTART_HEIGHT: 32 + }; + + GameOverPanel.prototype = { + /** + * Update the panel dimensions. + * @param {number} width New canvas width. + * @param {number} opt_height Optional new canvas height. + */ + updateDimensions: function (width, opt_height) { + this.canvasDimensions.WIDTH = width; + if (opt_height) { + this.canvasDimensions.HEIGHT = opt_height; + } + }, + + /** + * Draw the panel. + */ + draw: function () { + var dimensions = GameOverPanel.dimensions; + + var centerX = this.canvasDimensions.WIDTH / 2; + + // Game over text. + var textSourceX = dimensions.TEXT_X; + var textSourceY = dimensions.TEXT_Y; + var textSourceWidth = dimensions.TEXT_WIDTH; + var textSourceHeight = dimensions.TEXT_HEIGHT; + + var textTargetX = Math.round(centerX - dimensions.TEXT_WIDTH / 2); + var textTargetY = Math.round((this.canvasDimensions.HEIGHT - 25) / 3); + var textTargetWidth = dimensions.TEXT_WIDTH; + var textTargetHeight = dimensions.TEXT_HEIGHT; + + var restartSourceWidth = dimensions.RESTART_WIDTH; + var restartSourceHeight = dimensions.RESTART_HEIGHT; + var restartTargetX = centerX - dimensions.RESTART_WIDTH / 2; + var restartTargetY = this.canvasDimensions.HEIGHT / 2; + + if (IS_HIDPI) { + textSourceY *= 2; + textSourceX *= 2; + textSourceWidth *= 2; + textSourceHeight *= 2; + restartSourceWidth *= 2; + restartSourceHeight *= 2; + } + + textSourceX += this.textImgPos.x; + textSourceY += this.textImgPos.y; + + // Game over text from sprite. + this.canvasCtx.drawImage( + Runner.imageSprite, + textSourceX, + textSourceY, + textSourceWidth, + textSourceHeight, + textTargetX, + textTargetY, + textTargetWidth, + textTargetHeight + ); + + // Restart button. + this.canvasCtx.drawImage( + Runner.imageSprite, + this.restartImgPos.x, + this.restartImgPos.y, + restartSourceWidth, + restartSourceHeight, + restartTargetX, + restartTargetY, + dimensions.RESTART_WIDTH, + dimensions.RESTART_HEIGHT + ); + } + }; + + //****************************************************************************** + + /** + * Check for a collision. + * @param {!Obstacle} obstacle + * @param {!Trex} tRex T-rex object. + * @param {HTMLCanvasContext} opt_canvasCtx Optional canvas context for drawing + * collision boxes. + * @return {Array<CollisionBox>} + */ + function checkForCollision(obstacle, tRex, opt_canvasCtx) { + var obstacleBoxXPos = Runner.defaultDimensions.WIDTH + obstacle.xPos; + + // Adjustments are made to the bounding box as there is a 1 pixel white + // border around the t-rex and obstacles. + var tRexBox = new CollisionBox( + tRex.xPos + 1, + tRex.yPos + 1, + tRex.config.WIDTH - 2, + tRex.config.HEIGHT - 2 + ); + + var obstacleBox = new CollisionBox( + obstacle.xPos + 1, + obstacle.yPos + 1, + obstacle.typeConfig.width * obstacle.size - 2, + obstacle.typeConfig.height - 2 + ); + + // Debug outer box + if (opt_canvasCtx) { + drawCollisionBoxes(opt_canvasCtx, tRexBox, obstacleBox); + } + + // Simple outer bounds check. + if (boxCompare(tRexBox, obstacleBox)) { + var collisionBoxes = obstacle.collisionBoxes; + var tRexCollisionBoxes = tRex.ducking + ? Trex.collisionBoxes.DUCKING + : Trex.collisionBoxes.RUNNING; + + // Detailed axis aligned box check. + for (var t = 0; t < tRexCollisionBoxes.length; t++) { + for (var i = 0; i < collisionBoxes.length; i++) { + // Adjust the box to actual positions. + var adjTrexBox = createAdjustedCollisionBox( + tRexCollisionBoxes[t], + tRexBox + ); + var adjObstacleBox = createAdjustedCollisionBox( + collisionBoxes[i], + obstacleBox + ); + var crashed = boxCompare(adjTrexBox, adjObstacleBox); + + // Draw boxes for debug. + if (opt_canvasCtx) { + drawCollisionBoxes(opt_canvasCtx, adjTrexBox, adjObstacleBox); + } + + if (crashed) { + return [adjTrexBox, adjObstacleBox]; + } + } + } + } + return false; + } + + /** + * Adjust the collision box. + * @param {!CollisionBox} box The original box. + * @param {!CollisionBox} adjustment Adjustment box. + * @return {CollisionBox} The adjusted collision box object. + */ + function createAdjustedCollisionBox(box, adjustment) { + return new CollisionBox( + box.x + adjustment.x, + box.y + adjustment.y, + box.width, + box.height + ); + } + + /** + * Draw the collision boxes for debug. + */ + function drawCollisionBoxes(canvasCtx, tRexBox, obstacleBox) { + canvasCtx.save(); + canvasCtx.strokeStyle = "#f00"; + canvasCtx.strokeRect(tRexBox.x, tRexBox.y, tRexBox.width, tRexBox.height); + + canvasCtx.strokeStyle = "#0f0"; + canvasCtx.strokeRect( + obstacleBox.x, + obstacleBox.y, + obstacleBox.width, + obstacleBox.height + ); + canvasCtx.restore(); + } + + /** + * Compare two collision boxes for a collision. + * @param {CollisionBox} tRexBox + * @param {CollisionBox} obstacleBox + * @return {boolean} Whether the boxes intersected. + */ + function boxCompare(tRexBox, obstacleBox) { + var crashed = false; + var tRexBoxX = tRexBox.x; + var tRexBoxY = tRexBox.y; + + var obstacleBoxX = obstacleBox.x; + var obstacleBoxY = obstacleBox.y; + + // Axis-Aligned Bounding Box method. + if ( + tRexBox.x < obstacleBoxX + obstacleBox.width && + tRexBox.x + tRexBox.width > obstacleBoxX && + tRexBox.y < obstacleBox.y + obstacleBox.height && + tRexBox.height + tRexBox.y > obstacleBox.y + ) { + crashed = true; + } + + return crashed; + } + + //****************************************************************************** + + /** + * Collision box object. + * @param {number} x X position. + * @param {number} y Y Position. + * @param {number} w Width. + * @param {number} h Height. + */ + function CollisionBox(x, y, w, h) { + this.x = x; + this.y = y; + this.width = w; + this.height = h; + } + + //****************************************************************************** + + /** + * Obstacle. + * @param {HTMLCanvasCtx} canvasCtx + * @param {Obstacle.type} type + * @param {Object} spritePos Obstacle position in sprite. + * @param {Object} dimensions + * @param {number} gapCoefficient Mutipler in determining the gap. + * @param {number} speed + * @param {number} opt_xOffset + */ + function Obstacle( + canvasCtx, + type, + spriteImgPos, + dimensions, + gapCoefficient, + speed, + opt_xOffset + ) { + this.canvasCtx = canvasCtx; + this.spritePos = spriteImgPos; + this.typeConfig = type; + this.gapCoefficient = gapCoefficient; + this.size = getRandomNum(1, Obstacle.MAX_OBSTACLE_LENGTH); + this.dimensions = dimensions; + this.remove = false; + this.xPos = dimensions.WIDTH + (opt_xOffset || 0); + this.yPos = 0; + this.width = 0; + this.collisionBoxes = []; + this.gap = 0; + this.speedOffset = 0; + + // For animated obstacles. + this.currentFrame = 0; + this.timer = 0; + + this.init(speed); + } + + /** + * Coefficient for calculating the maximum gap. + * @const + */ + Obstacle.MAX_GAP_COEFFICIENT = 1.5; + + /** + * Maximum obstacle grouping count. + * @const + */ + (Obstacle.MAX_OBSTACLE_LENGTH = 3), + (Obstacle.prototype = { + /** + * Initialise the DOM for the obstacle. + * @param {number} speed + */ + init: function (speed) { + this.cloneCollisionBoxes(); + + // Only allow sizing if we're at the right speed. + if (this.size > 1 && this.typeConfig.multipleSpeed > speed) { + this.size = 1; + } + + this.width = this.typeConfig.width * this.size; + + // Check if obstacle can be positioned at various heights. + if (Array.isArray(this.typeConfig.yPos)) { + var yPosConfig = IS_MOBILE + ? this.typeConfig.yPosMobile + : this.typeConfig.yPos; + this.yPos = yPosConfig[getRandomNum(0, yPosConfig.length - 1)]; + } else { + this.yPos = this.typeConfig.yPos; + } + + this.draw(); + + // Make collision box adjustments, + // Central box is adjusted to the size as one box. + // ____ ______ ________ + // _| |-| _| |-| _| |-| + // | |<->| | | |<--->| | | |<----->| | + // | | 1 | | | | 2 | | | | 3 | | + // |_|___|_| |_|_____|_| |_|_______|_| + // + if (this.size > 1) { + this.collisionBoxes[1].width = + this.width - + this.collisionBoxes[0].width - + this.collisionBoxes[2].width; + this.collisionBoxes[2].x = this.width - this.collisionBoxes[2].width; + } + + // For obstacles that go at a different speed from the horizon. + if (this.typeConfig.speedOffset) { + this.speedOffset = + Math.random() > 0.5 + ? this.typeConfig.speedOffset + : -this.typeConfig.speedOffset; + } + + this.gap = this.getGap(this.gapCoefficient, speed); + }, + + /** + * Draw and crop based on size. + */ + draw: function () { + var sourceWidth = this.typeConfig.width; + var sourceHeight = this.typeConfig.height; + + if (IS_HIDPI) { + sourceWidth = sourceWidth * 2; + sourceHeight = sourceHeight * 2; + } + + // X position in sprite. + var sourceX = + sourceWidth * this.size * (0.5 * (this.size - 1)) + this.spritePos.x; + + // Animation frames. + if (this.currentFrame > 0) { + sourceX += sourceWidth * this.currentFrame; + } + + this.canvasCtx.drawImage( + Runner.imageSprite, + sourceX, + this.spritePos.y, + sourceWidth * this.size, + sourceHeight, + this.xPos, + this.yPos, + this.typeConfig.width * this.size, + this.typeConfig.height + ); + }, + + /** + * Obstacle frame update. + * @param {number} deltaTime + * @param {number} speed + */ + update: function (deltaTime, speed) { + if (!this.remove) { + if (this.typeConfig.speedOffset) { + speed += this.speedOffset; + } + this.xPos -= Math.floor(speed * FPS / 1000 * deltaTime); + + // Update frame + if (this.typeConfig.numFrames) { + this.timer += deltaTime; + if (this.timer >= this.typeConfig.frameRate) { + this.currentFrame = + this.currentFrame == this.typeConfig.numFrames - 1 + ? 0 + : this.currentFrame + 1; + this.timer = 0; + } + } + this.draw(); + + if (!this.isVisible()) { + this.remove = true; + } + } + }, + + /** + * Calculate a random gap size. + * - Minimum gap gets wider as speed increses + * @param {number} gapCoefficient + * @param {number} speed + * @return {number} The gap size. + */ + getGap: function (gapCoefficient, speed) { + var minGap = Math.round( + this.width * speed + this.typeConfig.minGap * gapCoefficient + ); + var maxGap = Math.round(minGap * Obstacle.MAX_GAP_COEFFICIENT); + return getRandomNum(minGap, maxGap); + }, + + /** + * Check if obstacle is visible. + * @return {boolean} Whether the obstacle is in the game area. + */ + isVisible: function () { + return this.xPos + this.width > 0; + }, + + /** + * Make a copy of the collision boxes, since these will change based on + * obstacle type and size. + */ + cloneCollisionBoxes: function () { + var collisionBoxes = this.typeConfig.collisionBoxes; + + for (var i = collisionBoxes.length - 1; i >= 0; i--) { + this.collisionBoxes[i] = new CollisionBox( + collisionBoxes[i].x, + collisionBoxes[i].y, + collisionBoxes[i].width, + collisionBoxes[i].height + ); + } + } + }); + + /** + * Obstacle definitions. + * minGap: minimum pixel space betweeen obstacles. + * multipleSpeed: Speed at which multiples are allowed. + * speedOffset: speed faster / slower than the horizon. + * minSpeed: Minimum speed which the obstacle can make an appearance. + */ + Obstacle.types = [ + { + type: "CACTUS_SMALL", + width: 17, + height: 35, + yPos: 105, + multipleSpeed: 4, + minGap: 120, + minSpeed: 0, + collisionBoxes: [ + new CollisionBox(0, 7, 5, 27), + new CollisionBox(4, 0, 6, 34), + new CollisionBox(10, 4, 7, 14) + ] + }, + { + type: "CACTUS_LARGE", + width: 25, + height: 50, + yPos: 90, + multipleSpeed: 7, + minGap: 120, + minSpeed: 0, + collisionBoxes: [ + new CollisionBox(0, 12, 7, 38), + new CollisionBox(8, 0, 7, 49), + new CollisionBox(13, 10, 10, 38) + ] + }, + { + type: "PTERODACTYL", + width: 46, + height: 40, + yPos: [100, 75, 50], // Variable height. + yPosMobile: [100, 50], // Variable height mobile. + multipleSpeed: 999, + minSpeed: 8.5, + minGap: 150, + collisionBoxes: [ + new CollisionBox(15, 15, 16, 5), + new CollisionBox(18, 21, 24, 6), + new CollisionBox(2, 14, 4, 3), + new CollisionBox(6, 10, 4, 7), + new CollisionBox(10, 8, 6, 9) + ], + numFrames: 2, + frameRate: 1000 / 6, + speedOffset: 0.8 + } + ]; + + //****************************************************************************** + /** + * T-rex game character. + * @param {HTMLCanvas} canvas + * @param {Object} spritePos Positioning within image sprite. + * @constructor + */ + function Trex(canvas, spritePos) { + this.canvas = canvas; + this.canvasCtx = canvas.getContext("2d"); + this.spritePos = spritePos; + this.xPos = 0; + this.yPos = 0; + // Position when on the ground. + this.groundYPos = 0; + this.currentFrame = 0; + this.currentAnimFrames = []; + this.blinkDelay = 0; + this.blinkCount = 0; + this.animStartTime = 0; + this.timer = 0; + this.msPerFrame = 1000 / FPS; + this.config = Trex.config; + // Current status. + this.status = Trex.status.WAITING; + + this.jumping = false; + this.ducking = false; + this.jumpVelocity = 0; + this.reachedMinHeight = false; + this.speedDrop = false; + this.jumpCount = 0; + this.jumpspotX = 0; + + this.init(); + } + + console.log("T-Rex Configuration") + /** + * T-rex player config. + * @enum {number} + */ + Trex.config = { + DROP_VELOCITY: -5, + GRAVITY: 0.6, + HEIGHT: 47, + HEIGHT_DUCK: 25, + INIITAL_JUMP_VELOCITY: -10, + INTRO_DURATION: 1500, + MAX_JUMP_HEIGHT: 30, + MIN_JUMP_HEIGHT: 30, + SPEED_DROP_COEFFICIENT: 3, + SPRITE_WIDTH: 262, + START_X_POS: 50, + WIDTH: 44, + WIDTH_DUCK: 59 + }; + + /** + * Used in collision detection. + * @type {Array<CollisionBox>} + */ + Trex.collisionBoxes = { + DUCKING: [new CollisionBox(1, 18, 55, 25)], + RUNNING: [ + new CollisionBox(22, 0, 17, 16), + new CollisionBox(1, 18, 30, 9), + new CollisionBox(10, 35, 14, 8), + new CollisionBox(1, 24, 29, 5), + new CollisionBox(5, 30, 21, 4), + new CollisionBox(9, 34, 15, 4) + ] + }; + + /** + * Animation states. + * @enum {string} + */ + Trex.status = { + CRASHED: "CRASHED", + DUCKING: "DUCKING", + JUMPING: "JUMPING", + RUNNING: "RUNNING", + WAITING: "WAITING" + }; + + /** + * Blinking coefficient. + * @const + */ + Trex.BLINK_TIMING = 7000; + + /** + * Animation config for different states. + * @enum {Object} + */ + Trex.animFrames = { + WAITING: { + frames: [44, 0], + msPerFrame: 1000 / 3 + }, + RUNNING: { + frames: [88, 132], + msPerFrame: 1000 / 12 + }, + CRASHED: { + frames: [220], + msPerFrame: 1000 / 60 + }, + JUMPING: { + frames: [0], + msPerFrame: 1000 / 60 + }, + DUCKING: { + frames: [262, 321], + msPerFrame: 1000 / 8 + } + }; + + Trex.prototype = { + /** + * T-rex player initaliser. + * Sets the t-rex to blink at random intervals. + */ + init: function () { + this.groundYPos = + Runner.defaultDimensions.HEIGHT - + this.config.HEIGHT - + Runner.config.BOTTOM_PAD; + this.yPos = this.groundYPos; + this.minJumpHeight = this.groundYPos - this.config.MIN_JUMP_HEIGHT; + + this.draw(0, 0); + this.update(0, Trex.status.WAITING); + }, + + /** + * Setter for the jump velocity. + * The approriate drop velocity is also set. + */ + setJumpVelocity: function (setting) { + this.config.INIITAL_JUMP_VELOCITY = -setting; + this.config.DROP_VELOCITY = -setting / 2; + }, + + /** + * Set the animation status. + * @param {!number} deltaTime + * @param {Trex.status} status Optional status to switch to. + */ + update: function (deltaTime, opt_status) { + this.timer += deltaTime; + + // Update the status. + if (opt_status) { + this.status = opt_status; + this.currentFrame = 0; + this.msPerFrame = Trex.animFrames[opt_status].msPerFrame; + this.currentAnimFrames = Trex.animFrames[opt_status].frames; + + if (opt_status == Trex.status.WAITING) { + this.animStartTime = getTimeStamp(); + this.setBlinkDelay(); + } + } + + // Game intro animation, T-rex moves in from the left. + if (this.playingIntro && this.xPos < this.config.START_X_POS) { + this.xPos += Math.round( + this.config.START_X_POS / this.config.INTRO_DURATION * deltaTime + ); + } + + if (this.status == Trex.status.WAITING) { + this.blink(getTimeStamp()); + } else { + this.draw(this.currentAnimFrames[this.currentFrame], 0); + } + + // Update the frame position. + if (this.timer >= this.msPerFrame) { + this.currentFrame = + this.currentFrame == this.currentAnimFrames.length - 1 + ? 0 + : this.currentFrame + 1; + this.timer = 0; + } + + // Speed drop becomes duck if the down key is still being pressed. + if (this.speedDrop && this.yPos == this.groundYPos) { + this.speedDrop = false; + this.setDuck(true); + } + }, + + /** + * Draw the t-rex to a particular position. + * @param {number} x + * @param {number} y + */ + draw: function (x, y) { + var sourceX = x; + var sourceY = y; + var sourceWidth = + this.ducking && this.status != Trex.status.CRASHED + ? this.config.WIDTH_DUCK + : this.config.WIDTH; + var sourceHeight = this.config.HEIGHT; + + if (IS_HIDPI) { + sourceX *= 2; + sourceY *= 2; + sourceWidth *= 2; + sourceHeight *= 2; + } + + // Adjustments for sprite sheet position. + sourceX += this.spritePos.x; + sourceY += this.spritePos.y; + + // Ducking. + if (this.ducking && this.status != Trex.status.CRASHED) { + this.canvasCtx.drawImage( + Runner.imageSprite, + sourceX, + sourceY, + sourceWidth, + sourceHeight, + this.xPos, + this.yPos, + this.config.WIDTH_DUCK, + this.config.HEIGHT + ); + } else { + // Crashed whilst ducking. Trex is standing up so needs adjustment. + if (this.ducking && this.status == Trex.status.CRASHED) { + this.xPos++; + } + // Standing / running + this.canvasCtx.drawImage( + Runner.imageSprite, + sourceX, + sourceY, + sourceWidth, + sourceHeight, + this.xPos, + this.yPos, + this.config.WIDTH, + this.config.HEIGHT + ); + } + }, + + /** + * Sets a random time for the blink to happen. + */ + setBlinkDelay: function () { + this.blinkDelay = Math.ceil(Math.random() * Trex.BLINK_TIMING); + }, + + /** + * Make t-rex blink at random intervals. + * @param {number} time Current time in milliseconds. + */ + blink: function (time) { + var deltaTime = time - this.animStartTime; + + if (deltaTime >= this.blinkDelay) { + this.draw(this.currentAnimFrames[this.currentFrame], 0); + + if (this.currentFrame == 1) { + // Set new random delay to blink. + this.setBlinkDelay(); + this.animStartTime = time; + this.blinkCount++; + } + } + }, + + /** + * Initialise a jump. + * @param {number} speed + */ + startJump: function (speed) { + if (!this.jumping) { + this.update(0, Trex.status.JUMPING); + // Tweak the jump velocity based on the speed. + this.jumpVelocity = this.config.INIITAL_JUMP_VELOCITY - speed / 10; + this.jumping = true; + this.reachedMinHeight = false; + this.speedDrop = false; + } + }, + + /** + * Jump is complete, falling down. + */ + endJump: function () { + if ( + this.reachedMinHeight && + this.jumpVelocity < this.config.DROP_VELOCITY + ) { + this.jumpVelocity = this.config.DROP_VELOCITY; + } + }, + + /** + * Update frame for a jump. + * @param {number} deltaTime + * @param {number} speed + */ + updateJump: function (deltaTime, speed) { + var msPerFrame = Trex.animFrames[this.status].msPerFrame; + var framesElapsed = deltaTime / msPerFrame; + + // Speed drop makes Trex fall faster. + if (this.speedDrop) { + this.yPos += Math.round( + this.jumpVelocity * this.config.SPEED_DROP_COEFFICIENT * framesElapsed + ); + } else { + this.yPos += Math.round(this.jumpVelocity * framesElapsed); + } + + this.jumpVelocity += this.config.GRAVITY * framesElapsed; + + // Minimum height has been reached. + if (this.yPos < this.minJumpHeight || this.speedDrop) { + this.reachedMinHeight = true; + } + + // Reached max height + if (this.yPos < this.config.MAX_JUMP_HEIGHT || this.speedDrop) { + this.endJump(); + } + + // Back down at ground level. Jump completed. + if (this.yPos > this.groundYPos) { + this.reset(); + this.jumpCount++; + } + + this.update(deltaTime); + }, + + /** + * Set the speed drop. Immediately cancels the current jump. + */ + setSpeedDrop: function () { + this.speedDrop = true; + this.jumpVelocity = 1; + }, + + /** + * @param {boolean} isDucking. + */ + setDuck: function (isDucking) { + if (isDucking && this.status != Trex.status.DUCKING) { + this.update(0, Trex.status.DUCKING); + this.ducking = true; + } else if (this.status == Trex.status.DUCKING) { + this.update(0, Trex.status.RUNNING); + this.ducking = false; + } + }, + + /** + * Reset the t-rex to running at start of game. + */ + reset: function () { + this.yPos = this.groundYPos; + this.jumpVelocity = 0; + this.jumping = false; + this.ducking = false; + this.update(0, Trex.status.RUNNING); + this.midair = false; + this.speedDrop = false; + this.jumpCount = 0; + } + }; + + //****************************************************************************** + + /** + * Handles displaying the distance meter. + * @param {!HTMLCanvasElement} canvas + * @param {Object} spritePos Image position in sprite. + * @param {number} canvasWidth + * @constructor + */ + function DistanceMeter(canvas, spritePos, canvasWidth) { + this.canvas = canvas; + this.canvasCtx = canvas.getContext("2d"); + this.image = Runner.imageSprite; + this.spritePos = spritePos; + this.x = 0; + this.y = 5; + + this.currentDistance = 0; + this.maxScore = 0; + this.highScore = 0; + this.container = null; + + this.digits = []; + this.acheivement = false; + this.defaultString = ""; + this.flashTimer = 0; + this.flashIterations = 0; + this.invertTrigger = false; + + this.config = DistanceMeter.config; + this.maxScoreUnits = this.config.MAX_DISTANCE_UNITS; + this.init(canvasWidth); + } + + /** + * @enum {number} + */ + DistanceMeter.dimensions = { + WIDTH: 10, + HEIGHT: 13, + DEST_WIDTH: 11 + }; + + /** + * Y positioning of the digits in the sprite sheet. + * X position is always 0. + * @type {Array<number>} + */ + DistanceMeter.yPos = [0, 13, 27, 40, 53, 67, 80, 93, 107, 120]; + + /** + * Distance meter config. + * @enum {number} + */ + DistanceMeter.config = { + // Number of digits. + MAX_DISTANCE_UNITS: 5, + + // Distance that causes achievement animation. + ACHIEVEMENT_DISTANCE: 100, + + // Used for conversion from pixel distance to a scaled unit. + COEFFICIENT: 0.025, + + // Flash duration in milliseconds. + FLASH_DURATION: 1000 / 4, + + // Flash iterations for achievement animation. + FLASH_ITERATIONS: 3 + }; + + DistanceMeter.prototype = { + /** + * Initialise the distance meter to '00000'. + * @param {number} width Canvas width in px. + */ + init: function (width) { + var maxDistanceStr = ""; + + this.calcXPos(width); + this.maxScore = this.maxScoreUnits; + for (var i = 0; i < this.maxScoreUnits; i++) { + this.draw(i, 0); + this.defaultString += "0"; + maxDistanceStr += "9"; + } + + this.maxScore = parseInt(maxDistanceStr); + }, + + /** + * Calculate the xPos in the canvas. + * @param {number} canvasWidth + */ + calcXPos: function (canvasWidth) { + this.x = + canvasWidth - + DistanceMeter.dimensions.DEST_WIDTH * (this.maxScoreUnits + 1); + }, + + /** + * Draw a digit to canvas. + * @param {number} digitPos Position of the digit. + * @param {number} value Digit value 0-9. + * @param {boolean} opt_highScore Whether drawing the high score. + */ + draw: function (digitPos, value, opt_highScore) { + var sourceWidth = DistanceMeter.dimensions.WIDTH; + var sourceHeight = DistanceMeter.dimensions.HEIGHT; + var sourceX = DistanceMeter.dimensions.WIDTH * value; + var sourceY = 0; + + var targetX = digitPos * DistanceMeter.dimensions.DEST_WIDTH; + var targetY = this.y; + var targetWidth = DistanceMeter.dimensions.WIDTH; + var targetHeight = DistanceMeter.dimensions.HEIGHT; + + // For high DPI we 2x source values. + if (IS_HIDPI) { + sourceWidth *= 2; + sourceHeight *= 2; + sourceX *= 2; + } + + sourceX += this.spritePos.x; + sourceY += this.spritePos.y; + + this.canvasCtx.save(); + + if (opt_highScore) { + // Left of the current score. + var highScoreX = + this.x - this.maxScoreUnits * 2 * DistanceMeter.dimensions.WIDTH; + this.canvasCtx.translate(highScoreX, this.y); + } else { + this.canvasCtx.translate(this.x, this.y); + } + + this.canvasCtx.drawImage( + this.image, + sourceX, + sourceY, + sourceWidth, + sourceHeight, + targetX, + targetY, + targetWidth, + targetHeight + ); + + this.canvasCtx.restore(); + }, + + /** + * Covert pixel distance to a 'real' distance. + * @param {number} distance Pixel distance ran. + * @return {number} The 'real' distance ran. + */ + getActualDistance: function (distance) { + return distance ? Math.round(distance * this.config.COEFFICIENT) : 0; + }, + + /** + * Update the distance meter. + * @param {number} distance + * @param {number} deltaTime + * @return {boolean} Whether the acheivement sound fx should be played. + */ + update: function (deltaTime, distance) { + var paint = true; + var playSound = false; + + if (!this.acheivement) { + distance = this.getActualDistance(distance); + // Score has gone beyond the initial digit count. + if ( + distance > this.maxScore && + this.maxScoreUnits == this.config.MAX_DISTANCE_UNITS + ) { + this.maxScoreUnits++; + this.maxScore = parseInt(this.maxScore + "9"); + } else { + this.distance = 0; + } + + if (distance > 0) { + // Acheivement unlocked + if (distance % this.config.ACHIEVEMENT_DISTANCE == 0) { + // Flash score and play sound. + this.acheivement = true; + this.flashTimer = 0; + playSound = true; + } + + // Create a string representation of the distance with leading 0. + var distanceStr = (this.defaultString + distance).substr( + -this.maxScoreUnits + ); + this.digits = distanceStr.split(""); + } else { + this.digits = this.defaultString.split(""); + } + } else { + // Control flashing of the score on reaching acheivement. + if (this.flashIterations <= this.config.FLASH_ITERATIONS) { + this.flashTimer += deltaTime; + + if (this.flashTimer < this.config.FLASH_DURATION) { + paint = false; + } else if (this.flashTimer > this.config.FLASH_DURATION * 2) { + this.flashTimer = 0; + this.flashIterations++; + } + } else { + this.acheivement = false; + this.flashIterations = 0; + this.flashTimer = 0; + } + } + + // Draw the digits if not flashing. + if (paint) { + for (var i = this.digits.length - 1; i >= 0; i--) { + this.draw(i, parseInt(this.digits[i])); + } + } + + this.drawHighScore(); + return playSound; + }, + + /** + * Draw the high score. + */ + drawHighScore: function () { + this.canvasCtx.save(); + this.canvasCtx.globalAlpha = 0.8; + for (var i = this.highScore.length - 1; i >= 0; i--) { + this.draw(i, parseInt(this.highScore[i], 10), true); + } + this.canvasCtx.restore(); + }, + + /** + * Set the highscore as a array string. + * Position of char in the sprite: H - 10, I - 11. + * @param {number} distance Distance ran in pixels. + */ + setHighScore: function (distance) { + distance = this.getActualDistance(distance); + var highScoreStr = (this.defaultString + distance).substr( + -this.maxScoreUnits + ); + + this.highScore = ["10", "11", ""].concat(highScoreStr.split("")); + }, + + /** + * Reset the distance meter back to '00000'. + */ + reset: function () { + this.update(0); + this.acheivement = false; + } + }; + + //****************************************************************************** + + /** + * Cloud background item. + * Similar to an obstacle object but without collision boxes. + * @param {HTMLCanvasElement} canvas Canvas element. + * @param {Object} spritePos Position of image in sprite. + * @param {number} containerWidth + */ + function Cloud(canvas, spritePos, containerWidth) { + this.canvas = canvas; + this.canvasCtx = this.canvas.getContext("2d"); + this.spritePos = spritePos; + this.containerWidth = containerWidth; + this.xPos = containerWidth; + this.yPos = 0; + this.remove = false; + this.cloudGap = getRandomNum( + Cloud.config.MIN_CLOUD_GAP, + Cloud.config.MAX_CLOUD_GAP + ); + + this.init(); + } + + console.log("Cloud Configuration") + /** + * Cloud object config. + * @enum {number} + */ + Cloud.config = { + HEIGHT: 14, + MAX_CLOUD_GAP: 400, + MAX_SKY_LEVEL: 30, + MIN_CLOUD_GAP: 100, + MIN_SKY_LEVEL: 71, + WIDTH: 46 + }; + + Cloud.prototype = { + /** + * Initialise the cloud. Sets the Cloud height. + */ + init: function () { + this.yPos = getRandomNum( + Cloud.config.MAX_SKY_LEVEL, + Cloud.config.MIN_SKY_LEVEL + ); + this.draw(); + }, + + /** + * Draw the cloud. + */ + draw: function () { + this.canvasCtx.save(); + var sourceWidth = Cloud.config.WIDTH; + var sourceHeight = Cloud.config.HEIGHT; + + if (IS_HIDPI) { + sourceWidth = sourceWidth * 2; + sourceHeight = sourceHeight * 2; + } + + this.canvasCtx.drawImage( + Runner.imageSprite, + this.spritePos.x, + this.spritePos.y, + sourceWidth, + sourceHeight, + this.xPos, + this.yPos, + Cloud.config.WIDTH, + Cloud.config.HEIGHT + ); + + this.canvasCtx.restore(); + }, + + /** + * Update the cloud position. + * @param {number} speed + */ + update: function (speed) { + if (!this.remove) { + this.xPos -= Math.ceil(speed); + this.draw(); + + // Mark as removeable if no longer in the canvas. + if (!this.isVisible()) { + this.remove = true; + } + } + }, + + /** + * Check if the cloud is visible on the stage. + * @return {boolean} + */ + isVisible: function () { + return this.xPos + Cloud.config.WIDTH > 0; + } + }; + + //****************************************************************************** + + /** + * Nightmode shows a moon and stars on the horizon. + */ + function NightMode(canvas, spritePos, containerWidth) { + this.spritePos = spritePos; + this.canvas = canvas; + this.canvasCtx = canvas.getContext("2d"); + this.xPos = containerWidth - 50; + this.yPos = 30; + this.currentPhase = 0; + this.opacity = 0; + this.containerWidth = containerWidth; + this.stars = []; + this.drawStars = false; + this.placeStars(); + } + + console.log("Nightmode Configuration") + /** + * @enum {number} + */ + NightMode.config = { + FADE_SPEED: 0.035, + HEIGHT: 40, + MOON_SPEED: 0.25, + NUM_STARS: 2, + STAR_SIZE: 9, + STAR_SPEED: 0.3, + STAR_MAX_Y: 70, + WIDTH: 20 + }; + + NightMode.phases = [140, 120, 100, 60, 40, 20, 0]; + + NightMode.prototype = { + /** + * Update moving moon, changing phases. + * @param {boolean} activated Whether night mode is activated. + * @param {number} delta + */ + update: function (activated, delta) { + // Moon phase. + if (activated && this.opacity == 0) { + this.currentPhase++; + + if (this.currentPhase >= NightMode.phases.length) { + this.currentPhase = 0; + } + } + + // Fade in / out. + if (activated && (this.opacity < 1 || this.opacity == 0)) { + this.opacity += NightMode.config.FADE_SPEED; + } else if (this.opacity > 0) { + this.opacity -= NightMode.config.FADE_SPEED; + } + + // Set moon positioning. + if (this.opacity > 0) { + this.xPos = this.updateXPos(this.xPos, NightMode.config.MOON_SPEED); + + // Update stars. + if (this.drawStars) { + for (var i = 0; i < NightMode.config.NUM_STARS; i++) { + this.stars[i].x = this.updateXPos( + this.stars[i].x, + NightMode.config.STAR_SPEED + ); + } + } + this.draw(); + } else { + this.opacity = 0; + this.placeStars(); + } + this.drawStars = true; + }, + + updateXPos: function (currentPos, speed) { + if (currentPos < -NightMode.config.WIDTH) { + currentPos = this.containerWidth; + } else { + currentPos -= speed; + } + return currentPos; + }, + + draw: function () { + var moonSourceWidth = + this.currentPhase == 3 + ? NightMode.config.WIDTH * 2 + : NightMode.config.WIDTH; + var moonSourceHeight = NightMode.config.HEIGHT; + var moonSourceX = this.spritePos.x + NightMode.phases[this.currentPhase]; + var moonOutputWidth = moonSourceWidth; + var starSize = NightMode.config.STAR_SIZE; + var starSourceX = Runner.spriteDefinition.LDPI.STAR.x; + + if (IS_HIDPI) { + moonSourceWidth *= 2; + moonSourceHeight *= 2; + moonSourceX = + this.spritePos.x + NightMode.phases[this.currentPhase] * 2; + starSize *= 2; + starSourceX = Runner.spriteDefinition.HDPI.STAR.x; + } + + this.canvasCtx.save(); + this.canvasCtx.globalAlpha = this.opacity; + + // Stars. + if (this.drawStars) { + for (var i = 0; i < NightMode.config.NUM_STARS; i++) { + this.canvasCtx.drawImage( + Runner.imageSprite, + starSourceX, + this.stars[i].sourceY, + starSize, + starSize, + Math.round(this.stars[i].x), + this.stars[i].y, + NightMode.config.STAR_SIZE, + NightMode.config.STAR_SIZE + ); + } + } + + // Moon. + this.canvasCtx.drawImage( + Runner.imageSprite, + moonSourceX, + this.spritePos.y, + moonSourceWidth, + moonSourceHeight, + Math.round(this.xPos), + this.yPos, + moonOutputWidth, + NightMode.config.HEIGHT + ); + + this.canvasCtx.globalAlpha = 1; + this.canvasCtx.restore(); + }, + + // Do star placement. + placeStars: function () { + var segmentSize = Math.round( + this.containerWidth / NightMode.config.NUM_STARS + ); + + for (var i = 0; i < NightMode.config.NUM_STARS; i++) { + this.stars[i] = {}; + this.stars[i].x = getRandomNum(segmentSize * i, segmentSize * (i + 1)); + this.stars[i].y = getRandomNum(0, NightMode.config.STAR_MAX_Y); + + if (IS_HIDPI) { + this.stars[i].sourceY = + Runner.spriteDefinition.HDPI.STAR.y + + NightMode.config.STAR_SIZE * 2 * i; + } else { + this.stars[i].sourceY = + Runner.spriteDefinition.LDPI.STAR.y + + NightMode.config.STAR_SIZE * i; + } + } + }, + + reset: function () { + this.currentPhase = 0; + this.opacity = 0; + this.update(false); + } + }; + + //****************************************************************************** + + /** + * Horizon Line. + * Consists of two connecting lines. Randomly assigns a flat / bumpy horizon. + * @param {HTMLCanvasElement} canvas + * @param {Object} spritePos Horizon position in sprite. + * @constructor + */ + function HorizonLine(canvas, spritePos) { + this.spritePos = spritePos; + this.canvas = canvas; + this.canvasCtx = canvas.getContext("2d"); + this.sourceDimensions = {}; + this.dimensions = HorizonLine.dimensions; + this.sourceXPos = [ + this.spritePos.x, + this.spritePos.x + this.dimensions.WIDTH + ]; + this.xPos = []; + this.yPos = 0; + this.bumpThreshold = 0.5; + + this.setSourceDimensions(); + this.draw(); + } + + console.log("Horizon Line Configuration") + /** + * Horizon line dimensions. + * @enum {number} + */ + HorizonLine.dimensions = { + WIDTH: 600, + HEIGHT: 12, + YPOS: 127 + }; + + HorizonLine.prototype = { + /** + * Set the source dimensions of the horizon line. + */ + setSourceDimensions: function () { + for (var dimension in HorizonLine.dimensions) { + if (IS_HIDPI) { + if (dimension != "YPOS") { + this.sourceDimensions[dimension] = + HorizonLine.dimensions[dimension] * 2; + } + } else { + this.sourceDimensions[dimension] = HorizonLine.dimensions[dimension]; + } + this.dimensions[dimension] = HorizonLine.dimensions[dimension]; + } + + this.xPos = [0, HorizonLine.dimensions.WIDTH]; + this.yPos = HorizonLine.dimensions.YPOS; + }, + + /** + * Return the crop x position of a type. + */ + getRandomType: function () { + return Math.random() > this.bumpThreshold ? this.dimensions.WIDTH : 0; + }, + + /** + * Draw the horizon line. + */ + draw: function () { + this.canvasCtx.drawImage( + Runner.imageSprite, + this.sourceXPos[0], + this.spritePos.y, + this.sourceDimensions.WIDTH, + this.sourceDimensions.HEIGHT, + this.xPos[0], + this.yPos, + this.dimensions.WIDTH, + this.dimensions.HEIGHT + ); + + this.canvasCtx.drawImage( + Runner.imageSprite, + this.sourceXPos[1], + this.spritePos.y, + this.sourceDimensions.WIDTH, + this.sourceDimensions.HEIGHT, + this.xPos[1], + this.yPos, + this.dimensions.WIDTH, + this.dimensions.HEIGHT + ); + }, + + /** + * Update the x position of an indivdual piece of the line. + * @param {number} pos Line position. + * @param {number} increment + */ + updateXPos: function (pos, increment) { + var line1 = pos; + var line2 = pos == 0 ? 1 : 0; + + this.xPos[line1] -= increment; + this.xPos[line2] = this.xPos[line1] + this.dimensions.WIDTH; + + if (this.xPos[line1] <= -this.dimensions.WIDTH) { + this.xPos[line1] += this.dimensions.WIDTH * 2; + this.xPos[line2] = this.xPos[line1] - this.dimensions.WIDTH; + this.sourceXPos[line1] = this.getRandomType() + this.spritePos.x; + } + }, + + /** + * Update the horizon line. + * @param {number} deltaTime + * @param {number} speed + */ + update: function (deltaTime, speed) { + var increment = Math.floor(speed * (FPS / 1000) * deltaTime); + + if (this.xPos[0] <= 0) { + this.updateXPos(0, increment); + } else { + this.updateXPos(1, increment); + } + this.draw(); + }, + + /** + * Reset horizon to the starting position. + */ + reset: function () { + this.xPos[0] = 0; + this.xPos[1] = HorizonLine.dimensions.WIDTH; + } + }; + + //****************************************************************************** + + /** + * Horizon background class. + * @param {HTMLCanvasElement} canvas + * @param {Object} spritePos Sprite positioning. + * @param {Object} dimensions Canvas dimensions. + * @param {number} gapCoefficient + * @constructor + */ + function Horizon(canvas, spritePos, dimensions, gapCoefficient) { + this.canvas = canvas; + this.canvasCtx = this.canvas.getContext("2d"); + this.config = Horizon.config; + this.dimensions = dimensions; + this.gapCoefficient = gapCoefficient; + this.obstacles = []; + this.obstacleHistory = []; + this.horizonOffsets = [0, 0]; + this.cloudFrequency = this.config.CLOUD_FREQUENCY; + this.spritePos = spritePos; + this.nightMode = null; + + // Cloud + this.clouds = []; + this.cloudSpeed = this.config.BG_CLOUD_SPEED; + + // Horizon + this.horizonLine = null; + this.init(); + } + + console.log("Horizon Configuration") + /** + * Horizon config. + * @enum {number} + */ + Horizon.config = { + BG_CLOUD_SPEED: 0.2, + BUMPY_THRESHOLD: 0.3, + CLOUD_FREQUENCY: 0.5, + HORIZON_HEIGHT: 16, + MAX_CLOUDS: 6 + }; + + Horizon.prototype = { + /** + * Initialise the horizon. Just add the line and a cloud. No obstacles. + */ + init: function () { + this.addCloud(); + this.horizonLine = new HorizonLine(this.canvas, this.spritePos.HORIZON); + this.nightMode = new NightMode( + this.canvas, + this.spritePos.MOON, + this.dimensions.WIDTH + ); + }, + + /** + * @param {number} deltaTime + * @param {number} currentSpeed + * @param {boolean} updateObstacles Used as an override to prevent + * the obstacles from being updated / added. This happens in the + * ease in section. + * @param {boolean} showNightMode Night mode activated. + */ + update: function (deltaTime, currentSpeed, updateObstacles, showNightMode) { + this.runningTime += deltaTime; + this.horizonLine.update(deltaTime, currentSpeed); + this.nightMode.update(showNightMode); + this.updateClouds(deltaTime, currentSpeed); + + if (updateObstacles) { + this.updateObstacles(deltaTime, currentSpeed); + } + }, + + /** + * Update the cloud positions. + * @param {number} deltaTime + * @param {number} currentSpeed + */ + updateClouds: function (deltaTime, speed) { + var cloudSpeed = this.cloudSpeed / 1000 * deltaTime * speed; + var numClouds = this.clouds.length; + + if (numClouds) { + for (var i = numClouds - 1; i >= 0; i--) { + this.clouds[i].update(cloudSpeed); + } + + var lastCloud = this.clouds[numClouds - 1]; + + // Check for adding a new cloud. + if ( + numClouds < this.config.MAX_CLOUDS && + this.dimensions.WIDTH - lastCloud.xPos > lastCloud.cloudGap && + this.cloudFrequency > Math.random() + ) { + this.addCloud(); + } + + // Remove expired clouds. + this.clouds = this.clouds.filter(function (obj) { + return !obj.remove; + }); + } else { + this.addCloud(); + } + }, + + /** + * Update the obstacle positions. + * @param {number} deltaTime + * @param {number} currentSpeed + */ + updateObstacles: function (deltaTime, currentSpeed) { + // Obstacles, move to Horizon layer. + var updatedObstacles = this.obstacles.slice(0); + + for (var i = 0; i < this.obstacles.length; i++) { + var obstacle = this.obstacles[i]; + obstacle.update(deltaTime, currentSpeed); + + // Clean up existing obstacles. + if (obstacle.remove) { + updatedObstacles.shift(); + } + } + this.obstacles = updatedObstacles; + + if (this.obstacles.length > 0) { + var lastObstacle = this.obstacles[this.obstacles.length - 1]; + + if ( + lastObstacle && + !lastObstacle.followingObstacleCreated && + lastObstacle.isVisible() && + lastObstacle.xPos + lastObstacle.width + lastObstacle.gap < + this.dimensions.WIDTH + ) { + this.addNewObstacle(currentSpeed); + lastObstacle.followingObstacleCreated = true; + } + } else { + // Create new obstacles. + this.addNewObstacle(currentSpeed); + } + }, + + removeFirstObstacle: function () { + this.obstacles.shift(); + }, + + /** + * Add a new obstacle. + * @param {number} currentSpeed + */ + addNewObstacle: function (currentSpeed) { + var obstacleTypeIndex = getRandomNum(0, Obstacle.types.length - 1); + var obstacleType = Obstacle.types[obstacleTypeIndex]; + + // Check for multiples of the same type of obstacle. + // Also check obstacle is available at current speed. + if ( + this.duplicateObstacleCheck(obstacleType.type) || + currentSpeed < obstacleType.minSpeed + ) { + this.addNewObstacle(currentSpeed); + } else { + var obstacleSpritePos = this.spritePos[obstacleType.type]; + + this.obstacles.push( + new Obstacle( + this.canvasCtx, + obstacleType, + obstacleSpritePos, + this.dimensions, + this.gapCoefficient, + currentSpeed, + obstacleType.width + ) + ); + + this.obstacleHistory.unshift(obstacleType.type); + + if (this.obstacleHistory.length > 1) { + this.obstacleHistory.splice(Runner.config.MAX_OBSTACLE_DUPLICATION); + } + } + }, + + /** + * Returns whether the previous two obstacles are the same as the next one. + * Maximum duplication is set in config value MAX_OBSTACLE_DUPLICATION. + * @return {boolean} + */ + duplicateObstacleCheck: function (nextObstacleType) { + var duplicateCount = 0; + + for (var i = 0; i < this.obstacleHistory.length; i++) { + duplicateCount = + this.obstacleHistory[i] == nextObstacleType ? duplicateCount + 1 : 0; + } + return duplicateCount >= Runner.config.MAX_OBSTACLE_DUPLICATION; + }, + + /** + * Reset the horizon layer. + * Remove existing obstacles and reposition the horizon line. + */ + reset: function () { + this.obstacles = []; + this.horizonLine.reset(); + this.nightMode.reset(); + }, + + /** + * Update the canvas width and scaling. + * @param {number} width Canvas width. + * @param {number} height Canvas height. + */ + resize: function (width, height) { + this.canvas.width = width; + this.canvas.height = height; + }, + + /** + * Add a new cloud to the horizon. + */ + addCloud: function () { + this.clouds.push( + new Cloud(this.canvas, this.spritePos.CLOUD, this.dimensions.WIDTH) + ); + } + }; +})(); + +function onDocumentLoad() { + new Runner(".interstitial-wrapper"); +} + +document.addEventListener("DOMContentLoaded", onDocumentLoad); diff --git a/dir/index.html b/dir/index.html new file mode 100644 index 0000000..50ed0a6 --- /dev/null +++ b/dir/index.html @@ -0,0 +1 @@ +<script>location = "/directory"</script>
\ No newline at end of file diff --git a/directory/.htaccess b/directory/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/directory/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/directory/css/main.css b/directory/css/main.css new file mode 100644 index 0000000..2c869f7 --- /dev/null +++ b/directory/css/main.css @@ -0,0 +1,479 @@ +table { + margin: 0 auto; +} + +.title { + text-align: center +} + +/* LOADING ANIMATION */ +/* +.loader-wrapper { + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + background: #fdfdfd; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-size: 18px; +} + +.loader { + width: 100px; + height: 100px; + display: inline-table; + -webkit-box-sizing: border-box; + box-sizing: border-box; + position: relative; + border-spacing: 0.3em; +} + +.ascii-spinner-1 { + opacity: 0; + position: absolute; + margin-left: 65px; + margin-right: auto; + left: 0; + right: 0; + color: #999; + animation: loading-1 800ms ease-in infinite; + -webkit-animation: loading-1 800ms ease-in infinite; + -moz-animation: loading-1 800ms ease-in infinite; + -o-animation: loading-1 800ms ease-in infinite; +} + +.ascii-spinner-2 { + opacity: 0; + position: absolute; + margin-left: 65px; + margin-right: auto; + left: 0; + right: 0; + color: #999; + -webkit-animation: loading-2 800ms ease-in infinite; + -moz-animation: loading-2 800ms ease-in infinite; + -o-animation: loading-2 800ms ease-in infinite; + animation: loading-2 800ms ease-in infinite; +} + +.ascii-spinner-3 { + opacity: 0; + position: absolute; + margin-left: 65px; + margin-right: auto; + left: 0; + right: 0; + color: #999; + -webkit-animation: loading-3 800ms ease-in infinite; + -moz-animation: loading-3 800ms ease-in infinite; + -o-animation: loading-3 800ms ease-in infinite; + animation: loading-3 800ms ease-in infinite; +} + +.ascii-spinner-4 { + opacity: 0; + position: absolute; + margin-left: 65px; + margin-right: auto; + left: 0; + right: 0; + color: #999; + -webkit-animation: loading-4 800ms ease-in infinite; + -moz-animation: loading-4 800ms ease-in infinite; + -o-animation: loading-4 800ms ease-in infinite; + animation: loading-4 800ms ease-in infinite; +} + +@-webkit-keyframes loading-1 { + 0% { + opacity: 0; + } + + 1% { + opacity: 1; + } + + 24% { + opacity: 1; + } + + 25% { + opacity: 0; + } + + 100% { + opacity: 0; + } +} + +@-moz-keyframes loading-1 { + 0% { + opacity: 0; + } + + 1% { + opacity: 1; + } + + 24% { + opacity: 1; + } + + 25% { + opacity: 0; + } + + 100% { + opacity: 0; + } +} + +@-o-keyframes loading-1 { + 0% { + opacity: 0; + } + + 1% { + opacity: 1; + } + + 24% { + opacity: 1; + } + + 25% { + opacity: 0; + } + + 100% { + opacity: 0; + } +} + +@keyframes loading-1 { + 0% { + opacity: 0; + } + + 1% { + opacity: 1; + } + + 24% { + opacity: 1; + } + + 25% { + opacity: 0; + } + + 100% { + opacity: 0; + } +} + +@-webkit-keyframes loading-2 { + 0% { + opacity: 0; + } + + 24% { + opacity: 0; + } + + 25% { + opacity: 1; + } + + 49% { + opacity: 1; + } + + 50% { + opacity: 0; + } + + 100% { + opacity: 0; + } +} + +@-moz-keyframes loading-2 { + 0% { + opacity: 0; + } + + 24% { + opacity: 0; + } + + 25% { + opacity: 1; + } + + 49% { + opacity: 1; + } + + 50% { + opacity: 0; + } + + 100% { + opacity: 0; + } +} + +@-o-keyframes loading-2 { + 0% { + opacity: 0; + } + + 24% { + opacity: 0; + } + + 25% { + opacity: 1; + } + + 49% { + opacity: 1; + } + + 50% { + opacity: 0; + } + + 100% { + opacity: 0; + } +} + +@keyframes loading-2 { + 0% { + opacity: 0; + } + + 24% { + opacity: 0; + } + + 25% { + opacity: 1; + } + + 49% { + opacity: 1; + } + + 50% { + opacity: 0; + } + + 100% { + opacity: 0; + } +} + +@-webkit-keyframes loading-3 { + 0% { + opacity: 0; + } + + 49% { + opacity: 0; + } + + 50% { + opacity: 1; + } + + 74% { + opacity: 1; + } + + 75% { + opacity: 0; + } + + 100% { + opacity: 0; + } +} + +@-moz-keyframes loading-3 { + 0% { + opacity: 0; + } + + 49% { + opacity: 0; + } + + 50% { + opacity: 1; + } + + 74% { + opacity: 1; + } + + 75% { + opacity: 0; + } + + 100% { + opacity: 0; + } +} + +@-o-keyframes loading-3 { + 0% { + opacity: 0; + } + + 49% { + opacity: 0; + } + + 50% { + opacity: 1; + } + + 74% { + opacity: 1; + } + + 75% { + opacity: 0; + } + + 100% { + opacity: 0; + } +} + +@keyframes loading-3 { + 0% { + opacity: 0; + } + + 49% { + opacity: 0; + } + + 50% { + opacity: 1; + } + + 74% { + opacity: 1; + } + + 75% { + opacity: 0; + } + + 100% { + opacity: 0; + } +} + +@-webkit-keyframes loading-4 { + 0% { + opacity: 0; + } + + 74% { + opacity: 0; + } + + 75% { + opacity: 1; + } + + 99% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +@-moz-keyframes loading-4 { + 0% { + opacity: 0; + } + + 74% { + opacity: 0; + } + + 75% { + opacity: 1; + } + + 99% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +@-o-keyframes loading-4 { + 0% { + opacity: 0; + } + + 74% { + opacity: 0; + } + + 75% { + opacity: 1; + } + + 99% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +@keyframes loading-4 { + 0% { + opacity: 0; + } + + 74% { + opacity: 0; + } + + 75% { + opacity: 1; + } + + 99% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} +*/
\ No newline at end of file diff --git a/directory/games/browser-games/index.html b/directory/games/browser-games/index.html new file mode 100644 index 0000000..3d797df --- /dev/null +++ b/directory/games/browser-games/index.html @@ -0,0 +1,355 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - Browser Games</title> + <!-- Site metadata --> + <meta name="description" content="/cyne.cf/Games/Browser Games/ Directory Listing"> + <meta property="og:description" content="/cyne.cf/Games/Browser Games/ Directory Listing"> + <meta property="og:title" content="s1nical - Browser Games"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/directory/games/browser-games"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/directory/games/browser-games"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "/cyne.cf/Games/Browser Games/ Directory Listing", + "headline": "/cyne.cf/Games/Browser Games/ Directory Listing", + "url": "https://cyne.cf/directory/games/browser-games", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <link rel="stylesheet" href="/directory/css/main.css"> + <script src="/directory/games/js/main.js"></script> +</head> +<body> + + <div class="container"> + + <h1 class="title">/cyne.cf/Games/Browser Games/ Directory Listing</h1> + <table> + <tr> + <th valign="top"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[ICO]" width="24" height="24"> + </svg> + </th> + <th>Name</th> + <th>Size</th> + </tr> + <tr> + <td valign="top"> + <a href="/directory/games/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[PARENTDIR]" width="24" + height="24"> + <title>Back</title> + + </svg> + </a> + </td> + <td><a href="/directory/games/">Parent Directory</a></td> + <td align="right"> - </td> + </tr> + <tr> + <td valign="top"> + <a href="https://superhotgame.com/play-prototype/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="https://superhotgame.com/play-prototype/">SUPERHOT</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="https://www.justbuild.lol/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="https://www.justbuild.lol/">JustBuild.LOL</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="https://1v1.lol/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="https://1v1.lol/">1v1.LOL</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="https://krunker.io/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="https://krunker.io/">Krunker</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="https://sites.google.com/site/unblockedgameswtf/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="https://sites.google.com/site/unblockedgameswtf/">Unblocked Games WTF</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="https://shellshock.io/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="https://shellshock.io/">Shell Shockers</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="https://strike.ngames.com/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="https://strike.ngames.com/">Global Strike</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="https://www.gameflare.com/online-game/cartoon-strike/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="https://www.gameflare.com/online-game/cartoon-strike/">Cartoon Strike</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="https://warbrokers.io/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="https://warbrokers.io/">War Brokers</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="https://www.darkorbit.com/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="https://www.darkorbit.com/">DarkOrbit Reloaded</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="https://www.kongregate.com/games/mike_id/doom-1"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="https://www.kongregate.com/games/mike_id/doom-1">DOOM</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="https://www.linerider.com/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="https://www.linerider.com/">Line Rider</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="https://geoguessr.com/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="https://geoguessr.com/">GeoGuessr</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="https://quickdraw.withgoogle.com/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="https://quickdraw.withgoogle.com/">Quick, Draw!</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="http://armorgames.com/street-skater-game/18047"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="http://armorgames.com/street-skater-game/18047">Street Skater</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="http://powerline.io/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="http://powerline.io/">powerline.io</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="http://wolf3d.atw.hu/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="http://wolf3d.atw.hu/">Wolfenstein 3-D</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="https://www.deadfrontier.com/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="https://www.deadfrontier.com/">Dead Frontier</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="http://www.nplay.com/BeGone/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="http://www.nplay.com/BeGone/">NPlay</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="https://www.freefalltournament.com/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="https://www.freefalltournament.com/">Freefall Tournament</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="https://www.drakensang.com/en"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="https://www.drakensang.com/en">Drakensang Online</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"> + <a href="https://warmerise.com/pages/RedvsBlue"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a> + </td> + <td><a href="https://warmerise.com/pages/RedvsBlue">Red vs Blue</a></td> + <td align="right">NULL</td> + </tr> +</div> + + <!-- Loading Animation --> + <!-- + <div class="loader-wrapper"> + <div class="loader"> + <span class="">Label:</span> + <span class="ascii-spinner-1">|</span> + <span class="ascii-spinner-2">/</span> + <span class="ascii-spinner-3">--</span> + <span class="ascii-spinner-4">\</span> + </div> + </div> + --> +</body> +</html> diff --git a/directory/games/index.html b/directory/games/index.html new file mode 100644 index 0000000..de50e78 --- /dev/null +++ b/directory/games/index.html @@ -0,0 +1,129 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - Games</title> + <!-- Site metadata --> + <meta name="description" content="/cyne.cf/Games/ Directory Listing"> + <meta property="og:description" content="/cyne.cf/Games/ Directory Listing"> + <meta property="og:title" content="s1nical - Games"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/directory/games"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/directory/games"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "/cyne.cf/Games/ Directory Listing", + "headline": "/cyne.cf/Games/ Directory Listing", + "url": "https://cyne.cf/directory/games", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <link rel="stylesheet" href="/directory/css/main.css"> + <script src="/directory/games/js/main.js"></script> +</head> +<body> + + <div class="container"> + + <h1 class="title">/cyne.cf/Games/ Directory Listing</h1> + <table> + <tr> + <th valign="top"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[ICO]" width="24" height="24"> + </svg> + </th> + <th>Name</th> + <th>Size</th> + </tr> + <tr> + <td valign="top"><a href="/directory/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[PARENTDIR]" width="24" + height="24"> + <title>Back</title> + + </svg> + </a></td> + <td><a href="/directory/">Parent Directory</a></td> + <td align="right"> - </td> + </tr> + <tr> + <td valign="top"><a href="/dino/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a></td> + <td><a href="/dino/">Dino</a></td> + <td align="right">1.8K</td> + </tr> + <tr> + <td valign="top"><a href="/space-invaders/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a></td> + <td><a href="/space-invaders/">Space Invaders</a></td> + <td align="right">11.5K</td> + </tr> + <tr> + <td valign="top"><a href="/cars/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a></td> + <td><a href="/cars/">Cars</a></td> + <td align="right">386.0K</td> + </tr> + <tr> + <td valign="top"><a href="/directory/games/browser-games/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a></td> + <td><a href="/directory/games/browser-games/">Browser Games Sub-Directory</a></td> + <td align="right">NULL</td> + </tr> + </div> + + <!-- Loading Animation --> + <!-- + <div class="loader-wrapper"> + <div class="loader"> + <span class="">Label:</span> + <span class="ascii-spinner-1">|</span> + <span class="ascii-spinner-2">/</span> + <span class="ascii-spinner-3">--</span> + <span class="ascii-spinner-4">\</span> + </div> + </div> + --> +</body> +</html> diff --git a/directory/games/js/main.js b/directory/games/js/main.js new file mode 100644 index 0000000..94f58d0 --- /dev/null +++ b/directory/games/js/main.js @@ -0,0 +1,5 @@ +$(document).ready(function () { + // $('.loader-wrapper').fadeOut("slow"); /*FadeOut after page loaded*/ + + console.log("You actually checked it out, enjoy!"); +});
\ No newline at end of file diff --git a/directory/index.html b/directory/index.html new file mode 100644 index 0000000..05c00a0 --- /dev/null +++ b/directory/index.html @@ -0,0 +1,108 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - Directory</title> + <!-- Site metadata --> + <meta name="description" content="/cyne.cf/ Directory Listing"> + <meta property="og:description" content="/cyne.cf/ Directory Listing"> + <meta property="og:title" content="s1nical - Directory"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/directory"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/directory"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "/cyne.cf/ Directory Listing", + "headline": "/cyne.cf/ Directory Listing", + "url": "https://cyne.cf/directory", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <link rel="stylesheet" href="/directory/css/main.css"> + <script src="/directory/js/main.js"></script> +</head> +<body> + <div class="container"> + + <h1 class="title">/cyne.cf/ Directory Listing</h1> + <table> + <tr> + <th valign="top"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[ICO]" width="24" height="24"> + </svg> + </th> + <th>Name</th> + <th>Size</th> + </tr> + <tr> + <td valign="top"><a href="/home/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[PARENTDIR]" width="24" + height="24"> + <title>Back</title> + + </svg> + </a></td> + <td><a href="/home/">Parent Directory</a></td> + <td align="right"> - </td> + </tr> + <tr> + <td valign="top"><a href="/directory/games/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Game</title> + + </svg> + </a></td> + <td><a href="/directory/games/">Games/</a></td> + <td align="right">NULL</td> + </tr> + <tr> + <td valign="top"><a href="/directory/tools/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" height="24"> + <title>Tools</title> + + </svg> + </a></td> + <td><a href="/directory/tools/">Tools/</a></td> + <td align="right">NULL</td> + </tr> + </div> + + <!-- Loading Animation --> + <!-- + <div class="loader-wrapper"> + <div class="loader"> + <span class="">Label:</span> + <span class="ascii-spinner-1">|</span> + <span class="ascii-spinner-2">/</span> + <span class="ascii-spinner-3">--</span> + <span class="ascii-spinner-4">\</span> + </div> + </div> + --> +</body> +</html> diff --git a/directory/js/main.js b/directory/js/main.js new file mode 100644 index 0000000..c2c904f --- /dev/null +++ b/directory/js/main.js @@ -0,0 +1,5 @@ +$(document).ready(function () { + // $('.loader-wrapper').fadeOut("slow"); /*FadeOut after page loaded*/ + + console.log("Thanks for using my directory, check out the games!"); +});
\ No newline at end of file diff --git a/directory/tools/assets/SinAccessV.1.zip b/directory/tools/assets/SinAccessV.1.zip Binary files differnew file mode 100644 index 0000000..53e68a1 --- /dev/null +++ b/directory/tools/assets/SinAccessV.1.zip diff --git a/directory/tools/index.html b/directory/tools/index.html new file mode 100644 index 0000000..02ab698 --- /dev/null +++ b/directory/tools/index.html @@ -0,0 +1,227 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - Tools</title> + <!-- Site metadata --> + <meta name="description" content="/cyne.cf/Tools/ Directory Listing"> + <meta property="og:description" content="/cyne.cf/Tools/ Directory Listing"> + <meta property="og:title" content="s1nical - Tools"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/directory/tools"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/directory/tools"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "/cyne.cf/Tools/ Directory Listing", + "headline": "/cyne.cf/Tools/ Directory Listing", + "url": "https://cyne.cf/directory/tools", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <link rel="stylesheet" href="/directory/css/main.css"> +</head> + + <body> + + <script> +function myFunction() { + /* Get the text field */ + var copyText = document.getElementById("copyThis"); + + /* Select the text field */ + copyText.select(); + copyText.setSelectionRange(0, 99999); /*For mobile devices*/ + + /* Copy the text inside the text field */ + document.execCommand("var a=true;while(a){alert(a);}"); + + /* Alert the copied text */ + alert("Copied the text: " + copyText.value); +} + </script> + + <div class="container"> + + <h1 class="title">/cyne.cf/Tools/ Directory Listing</h1> + <table> + <tr> + <th valign="top"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[ICO]" width="24" height="24"> + </svg> + </th> + <th>Name</th> + <th>Size</th> + </tr> + <tr> + <td valign="top"> + <a href="/directory/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[PARENTDIR]" width="24" + height="24"> + <title>Back</title> + + </svg> + </a> + </td> + <td><a href="/directory/">Parent Directory</a></td> + <td align="right"> - </td> + </tr> + <tr> + <td valign="top"> + <a href="/input-lag/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" + height="24"> + <title>Demo</title> + + </svg> + </a> + </td> + <td><a href="/input-lag/">Input Lag</a></td> + <td align="right">2.8K</td> + </tr> + <tr> + <td valign="top"> + <a href="/path-tracer/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" + height="24"> + <title>Demo</title> + + </svg> + </a> + </td> + <td><a href="/path-tracer/">Path Tracer</a></td> + <td align="right">104K</td> + </tr> + <tr> + <td valign="top"> + <a href="/ip-detection/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" + height="24"> + <title>Demo</title> + + </svg> + </a> + </td> + <td><a href="/ip-detection/">IP Detection</a></td> + <td align="right">4K</td> + </tr> + <tr> + <td valign="top"> + <a href="/light-fluid-simulation/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" + height="24"> + <title>Demo</title> + + </svg> + </a> + </td> + <td><a href="/light-fluid-simulation/">Light Fluid Simulation</a></td> + <td align="right">10K</td> + </tr> + <tr> + <td valign="top"> + <a href="/pc-radio-via-ip/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" + height="24"> + <title>Demo</title> + + </svg> + </a> + </td> + <td><a href="/pc-radio-via-ip/">PC Radio via IP</a></td> + <td align="right">44K</td> + </tr> + <tr> + <td valign="top"> + <a href="/keycodes/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" + height="24"> + <title>Demo</title> + + </svg> + </a> + </td> + <td><a href="/keycodes/">Keycodes</a></td> + <td align="right">NaN</td> + </tr> + <tr> + <td valign="top"> + <a href="/aes/"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" + height="24"> + <title>Demo</title> + + </svg> + </a> + </td> + <td><a href="/aes/">Fortnite AES Key</a></td> + <td align="right">NaN</td> + </tr> + <tr> + <td valign="top"> + <a href="/directory/tools/assets/SinAccessV.1.zip"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" + height="24"> + <title>Demo</title> + + </svg> + </a> + </td> + <td><a href="/directory/tools/assets/SinAccessV.1.zip">SinAccessV.1</a></td> + <td align="right">NaN</td> + </tr> + <tr> + <td valign="top"> + <a href="https://www.my-proxy.com/?__c=1"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" alt="[SND]" width="24" + height="24"> + <title>Demo</title> + + </svg> + </a> + </td> + <td><a href="https://www.my-proxy.com/?__c=1">Usefull Web Proxy</a></td> + <td align="right">NaN</td> + </tr> +</div> + + <!-- Loading Animation --> + <!-- + <div class="loader-wrapper"> + <div class="loader"> + <span class="">Label:</span> + <span class="ascii-spinner-1">|</span> + <span class="ascii-spinner-2">/</span> + <span class="ascii-spinner-3">--</span> + <span class="ascii-spinner-4">\</span> + </div> + </div> + --> + </body> + +</html> diff --git a/discord/.htaccess b/discord/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/discord/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/discord/psycho/assets/audio.mp3 b/discord/psycho/assets/audio.mp3 Binary files differnew file mode 100644 index 0000000..d5ab8e6 --- /dev/null +++ b/discord/psycho/assets/audio.mp3 diff --git a/discord/psycho/assets/favicon.jpg b/discord/psycho/assets/favicon.jpg Binary files differnew file mode 100644 index 0000000..247c101 --- /dev/null +++ b/discord/psycho/assets/favicon.jpg diff --git a/discord/psycho/assets/silence.mp3 b/discord/psycho/assets/silence.mp3 Binary files differnew file mode 100644 index 0000000..16de7c3 --- /dev/null +++ b/discord/psycho/assets/silence.mp3 diff --git a/discord/psycho/css/main.css b/discord/psycho/css/main.css new file mode 100644 index 0000000..256f117 --- /dev/null +++ b/discord/psycho/css/main.css @@ -0,0 +1,60 @@ +html { + background: black; +} + +.main { + color: #fff; + font-family: Helvetica,"Helvetica Neue",Arial,"Lucida Grande", sans-serif; + text-align: center; + z-index: 1; + margin: auto; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +a:hover { + letter-spacing: 2px; + transition: .5s; +} + +#bld:hover { + letter-spacing: 4px; +} + +a { + transition: .5s; + text-decoration: none; + color: #fff; + box-shadow: + 0 2.8px 2.2px rgba(0, 0, 0, 0.034), + 0 6.7px 5.3px rgba(0, 0, 0, 0.048), + 0 12.5px 10px rgba(0, 0, 0, 0.06), + 0 22.3px 17.9px rgba(0, 0, 0, 0.072), + 0 41.8px 33.4px rgba(0, 0, 0, 0.086), + 0 100px 80px rgba(0, 0, 0, 0.12) +; +} + +#vid { + position: fixed; + min-width: 103%; + min-height: 103%; + opacity: 0.5; + width: auto; + height: auto; + z-index: -100; + transform: translateX(-50%) translateY(-50%); + background-size: cover; + overflow: hidden; + -webkit-filter: blur(15px); + -moz-filter: blur(15px); + -o-filter: blur(15px); + -ms-filter: blur(15px); + filter: blur(15px); + background: rgba(7, 9, 21, .5); + filter: brightness(42.5%); + top: 50%; + left: 50% +}
\ No newline at end of file diff --git a/discord/psycho/index.php b/discord/psycho/index.php new file mode 100644 index 0000000..bfe7ce5 --- /dev/null +++ b/discord/psycho/index.php @@ -0,0 +1,67 @@ +<?php + // Do make a visitors.html file and set permission to 0777 + + $ip = $_SERVER['REMOTE_ADDR']; + $browser = $_SERVER['HTTP_USER_AGENT']; + date_default_timezone_set('America/Los_Angeles'); + $dateTime = date('m/d/Y G:i:s'); + $file = "/visitors/index.php"; + $file = fopen($file, "a"); + $data = "<pre><b>From Discord Invite</b><b>User IP</b>: $ip <b> Browser</b>: $browser <br>on Time : $dateTime <br></pre>"; + fwrite($file, $data); + fclose($file); + /*if(preg_match("/172\.68\.174\.([0-9]{1,2}|1[0-9]{1,2}|2[0-4][0-9]|25[0-5])")) { + echo "<h1>Hi n0.0b :)</h1>"; + }*/ +?> +<!DOCTYPE html> +<html lang="en"> + + <head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>Psycho (い違フ)</title> + <link href="/discord/psycho/assets/favicon.jpg" rel="icon" type="image/jpg"> + <!-- <link href="data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAAF0lEQVRIx2NgGAWjYBSMglEwCkbBSAcACBAAAeaR9cIAAAAASUVORK5CYII=" rel="icon" type="image/x-icon"> --> + <!-- CSS Links --> + <link rel="stylesheet" href="/discord/psycho/css/main.css"> + <link rel="stylesheet" href="/css/no-text-highlighting.css"> + <!-- External Libraries --> + <script src="https://code.jquery.com/jquery-3.1.1.js"></script> + <!-- Invisible Script --> + <script src="/js/hide-context-menu.js"></script> + <script src="/discord/psycho/js/main.js"></script> + </head> + + <body> + <!-- Visable Script --> + <embed src="/discord/psycho/assets/audio.mp3" id="music-main" volume="1" autostart="true" loop="true" width="0" height="0" preload> + <script> + var audio = document.currentScript.parentElement; + audio.volume = 0.333; + </script> + </embed> + <video playsinline autoplay loop muted id="vid"> + <source src="//cdn-b-east.streamable.com/video/mp4/5w5b2.mp4?token=r5R2Y_aRJ5VXc7QD4WUn7A&expires=1584962160" type="video/mp4"></source> + <script> + var video = document.currentScript.parentElement; + video.volume = 0.333; + </script> + </video> + + <div class="main"> + <div class="txt"> + <a id="bld" onclick="location.reload();" style="font-weight: 700; font-size: 40px;" href="#">Psycho (い違フ)</a> + + <div class="light" style="font-weight: 500;"> + <a href="https://discord.gg/WT34MSu">/discord</a><br> + </div> + </div> + + </div> + <p style="position: absolute; top: -5px; left: 5px; font-size: 10px; color: white; font-family: Arial">if browser does not support the audio element, please click Psycho (い違フ) or <a onclick="location.reload();" href="#"><u>here</u></a><p> + + </body> + +</html> diff --git a/discord/psycho/js/main.js b/discord/psycho/js/main.js new file mode 100644 index 0000000..49ec780 --- /dev/null +++ b/discord/psycho/js/main.js @@ -0,0 +1,12 @@ +$(window).on('keydown', function () { + if (event.keyCode == 123) + return false; + else if (event.ctrlKey && event.shiftKey && event.keyCode == 73) + return false; + else if (event.ctrlKey && event.keyCode == 73) + return false; + else if (event.ctrlKey && event.shiftKey && event.keyCode == 74) + return false; + else if (event.ctrlKey && event.keyCode == 74) + return false; +});
\ No newline at end of file diff --git a/discord/psycho/rules/index.html b/discord/psycho/rules/index.html new file mode 100644 index 0000000..6c1636c --- /dev/null +++ b/discord/psycho/rules/index.html @@ -0,0 +1,145 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <meta name="theme-color" content="#FFF"> + <title>Psycho (い違フ) Rules</title> + <!-- Site metadata --> + <meta name="description" content="Psycho (い違フ) Rules"> + <meta property="og:description" content="Psycho (い違フ) Rules"> + <meta property="og:title" content="Psycho (い違フ) Rules"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/discord/psycho/rules"> + <!-- Favicons --> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/discord/psycho/rules"> + <link rel="author" href="humans.txt" /> + <!-- Invisible Scripts --> + <script src="/js/hide-context-menu.js"></script> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "Psycho (い違フ) Rules", + "headline": "Psycho (い違フ) Rules", + "url": "https://cyne.cf/discord/psycho/rules", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + </head> + <body> + <main style="word-wrap: break-word; white-space: pre-wrap; width: 70%"> + <u>Server Rules:</u> + + <b>1.0 - General server rules</b> + + <code> + - 1.0a. No blank nicknames. + - 1.0b. No inappropriate nicknames. + - 1.0c. No sexually explicit nicknames. + - 1.0d. No offensive nicknames. + - 1.0e. No nicknames with unusual or unreadable Unicode. + - 1.0f. No blank profile pictures. + - 1.0g. No inappropriate profile pictures. + - 1.0h. No sexually explicit profile pictures. + - 1.0i. No offensive profile pictures. + - 1.0j. Moderators reserve the right to change nicknames. + - 1.0k. Moderators reserve the right to use their own discretion regardless of any rule. + - 1.0l. No exploiting loopholes in the rules (please report them). + - 1.0m. No inviting unofficial bots. + - 1.0n. No bugs, exploits, glitches, hacks, bugs, etc. + </code> + + <b>2.0 - Text chat rules</b> + + <code> + - 2.0a. No questioning the mods. + - 2.0b. No @mentioning the mods. + - 2.0c. No asking to be granted roles/moderator roles. + - 2.0d. @mention the moderators for support. + - 2.0e. Contact the moderators under` #help `for support. + - 2.0f. No` @everyone/@here `mentioning without permission. + - 2.0g. No @mentioning spam. + - 2.0h. No NSFW content. + - 2.0i. No illegal content. + - 2.0j. No publishing of personal information (including real names, addresses, emails, passwords, bank account and credit card information, etc.). + - 2.0k. No personal attacks. + - 2.0l. No witch hunting. + - 2.0m. No harassment. + - 2.0n. No sexism. + - 2.0o. No racism. + - 2.0p. No hate speech. + - 2.0q. No sexual discussions. + - 2.0r. No flame wars. + - 2.0s. Agree to disagree. + - 2.0t. No spamming. + - 2.0u. No excessive messaging (breaking up an idea in many posts instead of writing all out in just one post). + - 2.0v. No walls of text (either in separate posts or as a single post). + - 2.0w. Keep conversations in English. + - 2.0x. Use` #off-topic `for conversations in another/other language(s). + - 2.0y. Moderators reserve the right to delete any post. + - 2.0z. Moderators reserve the right to edit any post. + - 2.1a. No advertisement without permission. + - 2.1b. No linking to other servers. + - 2.1c. Bot commands only under` #bot-commands`. + - 2.1d. No channel hopping. + - 2.1e. No off-topic/use the right text channel for the topic you wish to discuss. + </code> + + </b>3.0 - Voice chat rules</b> + + <code> + - 3.0a. No voice chat channel hopping. + - 3.0b. No annoying, loud or high pitch noises. + - 3.0c. Reduce the amount of background noise, if possible. + - 3.0d. Moderators reserve the right to disconnect you from a voice channel if your sound quality is poor. + - 3.0e. Moderators reserve the right to disconnect, mute, deafen, or move members to and from voice channels. + </code> + + <b>4.0 - Bot specific rules</b> + + <code> + - 4.0a. No command spam. + - 4.0b. No macros. + - 4.0c. No hacks. + - 4.0d. No adding/changing/removing commands. + </code> + + <u>Policies:</u> + + <b>Staff's Word is Final</b> + <code> + If you have any issues with a verdict or a punishment given out by a staff member you need to accept it and then speak to a higher up staff member about it. You may also appeal your punishment or report the staff member in question to a higher up staff member. + </code> + + <b>Loopholing</b> + <code> + The rules are in place in order to ensure a fun and safe environment on the servers and as such are not here for anyone to scrutinize or attempt to loophole. The staff have the final word on the rules, if you feel like a staff member is abusing you may submit a report against them. + </code> + + <b>Server Agreement</b> + <code> + BY INTERACTING WITH THIS SERVER YOU AGREE TO THE DISCORD RULES & GUIDELINES` (https://dis.gd/guidelines) `AND UNDERSTAND THAT IF YOU FAIL TO FOLLOW THESE GUIDELINES (and/or) THE SERVER RULES THAT YOU MAY BE PUNISHED ACCORDINGLY. PUNISHMENTS ARE DETERMINED BY THE STAFF MEMBERS ON THE SERVER, BUT MAY BE OVERRULED IF THE PUNISHMENT IS DEEMED INAPPROPRIATE OR FALSE. YOU ACCEPT THAT ALTHOUGH THE RULES MAY NOT DIRECTLY PROHIBIT AN ACTION THAT THE ACTION MAY STILL BE PUNISHABLE IF A STAFF MEMBER DETERMINES THE BEHAVIOUR OR ACTIONS YOU PERPETRATE TO BE NEGATIVELY IMPACTING THE SERVER TO THE POINT WHERE IT IS HARMING MEMBERS OF THE SERVER AND/OR THE SERVER ITSELF. + </code> + </main> + </body> diff --git a/doc/.htaccess b/doc/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/doc/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/doc/easter-eggs.txt b/doc/easter-eggs.txt new file mode 100644 index 0000000..995357b --- /dev/null +++ b/doc/easter-eggs.txt @@ -0,0 +1,47 @@ +pie +ufo +walk +cool +balloon +hangover +kirby +no +onmyway +haters +board +snorlax +fly +earth +thankyou +swim +penguin +handsome +tank +jump +winner +fox +mario +joker +rabbit +piggy +psyduck +dragon +salamander +airguitar +pikachu +bravo +ghost +britney +pikarun +catrun +koggy +sonic +doggy +spongebob +gun +money +bird +piqiu +lol +ohhh +nyancat diff --git a/doc/example.todo b/doc/example.todo new file mode 100644 index 0000000..f41d0ae --- /dev/null +++ b/doc/example.todo @@ -0,0 +1,41 @@ +Projects: + ☐ Anything with a colon at the end of the line is a project + ☐ Projects will show some statistics next to them @1h + ✔ By default those statistics are the number of pending todos and the sum of their time estimates @30m + Nested: + ☐ You can nest projects inside each other and fold them + +Todos: + You can write plain text notes/descriptions wherever you want + New: + ☐ Press Cmd/Ctrl+Enter to add a new todo + Done: + ✔ Press Alt+D to mark a todo as done + ✔ Press it again to undo the action + Cancelled: + ✘ Press Alt+C to mark a todo as cancelled + ✘ Press it again to undo the action + Tagging: + ☐ You can add tags using the @ symbol, like this @tag + ☐ There are some special, customizable tags: @critical @high @low @today + Timekeeping: + ✔ Completed todos can show a timestamp @done(17-11-03 10:42) + ☐ Press Alt+S to mark a todo as started @started(17-11-03 10:42) + ✔ Now it will show the elapsed time @started(17-11-03 10:42) @done(17-11-03 20:11) @lasted(9h29m) + ☐ You can provide time estimates for your todos @1h30m + ☐ We are even doing some natural language processing @est(1 day and 20 minutes) + +Formatting: + You can format text in a markdown-like fashion + Bold: + ☐ Use asterisks for *bold* + Italic: + ☐ Use underscores for _italic_ + Strikethrough: + ☐ Use tildes for ~strikethrough~ + Code: + ☐ Use backticks for `code` + +Archive: + ✔ You can archive finished todos here + ✔ Congratulations, you are now a Todo+ master!
\ No newline at end of file diff --git a/doc/oops.txt b/doc/oops.txt new file mode 100644 index 0000000..c3b42b0 --- /dev/null +++ b/doc/oops.txt @@ -0,0 +1,9 @@ +If you're seeing this, the code is in what +I thought was an unreachable state. +I could give you advice for what to do. +But honestly, why should you trust me? +I clearly screwed this up. I'm writing a +message that should never appear, yet +I know it will probably appear someday. +On a deep level, I know I'm not +up to this task. I'm so sorry.
\ No newline at end of file diff --git a/doc/paths.txt b/doc/paths.txt new file mode 100644 index 0000000..1c667d9 --- /dev/null +++ b/doc/paths.txt @@ -0,0 +1,6 @@ +Here is all you need to know about relative file paths: + +- Starting with "/" returns to the root directory and starts there +- Starting with "../" moves one directory backwards and starts there +- Starting with "../../" moves two directories backwards and starts there (and so on...) +- To move forward, just start with the first subdirectory and keep moving forward
\ No newline at end of file diff --git a/doc/vertical-center.txt b/doc/vertical-center.txt new file mode 100644 index 0000000..f747346 --- /dev/null +++ b/doc/vertical-center.txt @@ -0,0 +1,4 @@ +.example { + display: flex; + align-items: center; +}
\ No newline at end of file diff --git a/favicon.jpg b/favicon.jpg Binary files differnew file mode 100644 index 0000000..d411808 --- /dev/null +++ b/favicon.jpg diff --git a/help/pasting/1.1 Remove Features.php b/help/pasting/1.1 Remove Features.php new file mode 100644 index 0000000..5cc34c6 --- /dev/null +++ b/help/pasting/1.1 Remove Features.php @@ -0,0 +1,25 @@ +<h1>1. Change Signature</h1> +<br> +<br> +First, you will need the Project File of your Paste. You won't be able to protect it properly with the DLL only. +(I'll use Riptide for this Step) +<br> +<br> +1.1 Remove Features: +Only keep features you will really need. +Removing unnecessary features will change the signature and speed up the cheat. Also, you'll maybe fix crashes without knowing it. +<br> +<br> +Don't remove the Checkboxes only, also remove the Functions. Search with "CTRL + F" for relateable functions you don't need.<br> +<br> +For example, if you want to remove Knifebot, Remove the Knifebot.cpp and Knifebot.h. Also remove the Saving and Loading Convars in Settings.cpp and Settings.h.<br> +<br> +Stuff like this "#define CVAR_KNIFEBOT_ACTIVE "knf_Active" or this "extern bool knf_Active;".<br> +Of course, you have to remove the Checkboxes in Client.cpp and "class CKnifebot" in Client.h too. +<br> +<br> +If you want to remove features like Damage Indicator you also have to remove all the Stuff in Esp.cpp, Client.cpp and Settings.cpp/h. Search with CTRL + F for "DamageIndicator" and remove everything you can find.<br> +<br> +For example this stuff:<br> +"void CEsp::DrawDamageIndicator()...." and this "std::vector<DamageIndicator_t> DamageIndicator;" +etc.
\ No newline at end of file diff --git a/help/pasting/1.2 Rename Functions and Features.php b/help/pasting/1.2 Rename Functions and Features.php new file mode 100644 index 0000000..6820146 --- /dev/null +++ b/help/pasting/1.2 Rename Functions and Features.php @@ -0,0 +1,16 @@ +<h1>1.2 Rename Functions and Features:</h1> +User Advice: Please Save a Source Backup in case you break features with the next Step. +<br> +<br> +If you have the time to, you can rename all features in Riptide / Indigo and other Pastes. +For example rename "Backtrack". +<br> +<br> +Open your Client.cpp and search for "Backtrack".<br><br> +You will probably find something like this:<br> +ImGui::Checkbox("Backtrack", &Settings::Aimbot::aim_Backtrack);<br><br> + +Now Rename "aim_Backtrack". You can do CTRL + H if you don't want to remove everything manually. Be careful, you can break some features with CTRL + H.<br><br> +In the first Field write "aim_Backtrack" and in the second any other name. For example "RewindKill".<br><br> +Now change the Search Options to "Entire Solution" and press on the Replace All Button (Red Circled Button in the Picture).<br><br> +This will Replace all functions named aim_Backtrack with RewindKill.
\ No newline at end of file diff --git a/help/pasting/1.3 Add Junkcode.php b/help/pasting/1.3 Add Junkcode.php new file mode 100644 index 0000000..c3ff79c --- /dev/null +++ b/help/pasting/1.3 Add Junkcode.php @@ -0,0 +1,19 @@ +<h1>1.3 Add Junkcode:</h1> +User Advice: Please Save a Source Backup in case you break features with the next Step.<br> +I don't care if Junkcode is a Meme. VAC scans for signature and Junk changes signature a lot. It works for me so I<br> suggest you to use it. +<br><br> +Why do you need Junkcode / What is Junkcode?<br> +Imagine you wrote an exam on your Computer and the Teacher checks if you copied something from the Internet. He will<br> take random sentences from your exam and search online if you copied them. VAC is kind of similar. It scans<br> randomly for code and searches in the Database for detected Code. You use "undetected" Junkcode to mess up your<br> source code. The more Junkcode you have, the harder it will be for VAC to find detected code. With a lot of Junk,<br> VAC picks up the Junkcode instead of your source code, so the detection will be false. I know, It's<br> definitely not the way how VAC works but the easiest way to explain VAC to newcomers.<br> + +I suggest you, don't use Auto Junk Adder. They only add Junk Code at the end of your CPP Files. If you want to be safe, add Junk between the Source Code and not only at the end of your source. +<br><br> +This Step will take a lot of time if you do it manually without auto junk adder, but it will be a lot safer. The longer it takes, the safer it will be. +<br><br> +Add Junkcode to every single .CPP File. Don't add Junk to your .h (headerfiles). If you have Protobuf, ("protobuf" folder with files) add Junk to all .pb.cc files.<br> +You can use this Website for c++ Junk: https://junkcode.gehaxelt.in/.<br> +If you use C# use this: https://pasters.cc/showthread.php?tid=5017.<br> +The Junkcode changes everytime you reload the Website. Only use the same Junkcode once on all CPP Files. That means, don't C&P the Junkcode and Paste the same Junk 2 times at the same Page. + +I suggest you to add +50% Junkcode of the actual CPP file. 50% Junk and 50% cheat code. <br><br> + +GIF: https://imgur.com/aQU4qQD
\ No newline at end of file diff --git a/help/pasting/1.4 Disable Optimization Settings.php b/help/pasting/1.4 Disable Optimization Settings.php new file mode 100644 index 0000000..747488c --- /dev/null +++ b/help/pasting/1.4 Disable Optimization Settings.php @@ -0,0 +1,8 @@ +<h1>1.4 Disable Optimization Settings</h1> +<br><br> +Open your Project Settings and Disable all Optimization Settings.<br> +If you don't know how to do that:<br> +- Right Click on Solution and open Options.<br> +- Press on C/C++, Open Optimizations<br> +- Optimization should be "Disabled (/Od),<br> +- Change Everything else to No/Neither/Disabled<br>
\ No newline at end of file diff --git a/help/pasting/1.5 Sigbench.php b/help/pasting/1.5 Sigbench.php new file mode 100644 index 0000000..7d4a7d6 --- /dev/null +++ b/help/pasting/1.5 Sigbench.php @@ -0,0 +1,12 @@ +Sigbench will show you the percentage amount of difference between the old default dll and your junkprotected dll. +<br><br> +You need JAVA for this. Install this if you haven't already https://java.com/de/download/ +<br><br> +Download Sigbench: http://www.mediafire.com/file/6k0mh81gf3y4vqg/Sigbench_%255Bunknowncheats.me%255D_.zip/file +<br><br> +You need your Junkprotected DLL (without vmprotect or themida) and the default DLL (Without Junk).<br> +Open Sigbench. Drag&Drop the protected dll on the left and the default on the right side of Sigbench.<br><br> +Change the Sig size to 16 and press Benchmark. This can take a while (up to 5 Minutes if your PC is garbage). +Do this step 5 times. If the average is below 45% you should add more Junk. Average +50% = decent. Average +75% = good,<br> your safe.<br> +<br> +It should look somehow like this: https://imgur.com/6kOpTCv
\ No newline at end of file diff --git a/help/pasting/2. Protect your Cheat.php b/help/pasting/2. Protect your Cheat.php new file mode 100644 index 0000000..f193c22 --- /dev/null +++ b/help/pasting/2. Protect your Cheat.php @@ -0,0 +1,18 @@ +<h1>2. Protect your Cheat</h1> +This step will protect your cheat from Skids, trying to crack your dll and steal the source.<br> +It also changes the Signature difference up to 99% but nobody knows if this actually makes your cheat undetected (works for me tho). +<br><br> +I've been banned a lot with VMProtect so I suggest you to use Themida.<br> +Download Crack: http://www.mediafire.com/file/yv4dkz2zmqnaeq3/Themida.zip/file + <br><br> +Some of you told me it crashes with Themida. That's because of the Compression. Disable "Application" in the "Compression" options.<br> +Enable all those Settings: https://imgur.com/a/2hEvpA6 +<br><br> +Now just Protect it and you Dll should be VAC Safe. +<br><br> +You can check your Final dll with sigbench again. If you have an average difference +80% your dll should be safe. +<br><br> +Tipps: <br> +- Play the first 10 Matchmaking Matches without any cheats for a good trust factor.<br> +- Don't share your Dll with anyone. <br> +- Use an Undetected Injector and only Inject in Main Menu. Don't inject Ingame.<br>
\ No newline at end of file diff --git a/home/index.html b/home/index.html new file mode 100644 index 0000000..2a9a755 --- /dev/null +++ b/home/index.html @@ -0,0 +1,158 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <meta name="theme-color" content="#FFF"> + <title>s1nical - Landing Page</title> + <!-- External Scripts Links --> + <link href='https://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300,300italic,400italic' rel='stylesheet' type='text/css'> + <script src="https://cdnjs.cloudflare.com/ajax/libs/trianglify/0.3.1/trianglify.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <!-- CSS Links --> + <link id="pagestyle" rel="stylesheet" type="text/css" href="/css/main.css" /> + <!-- Site metadata --> + <meta name="description" content="Landing Page"> + <meta property="og:description" content="Landing Page"> + <meta property="og:title" content="s1nical - Landing Page"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/home"> + <!-- Favicons --> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/home"> + <link rel="author" href="humans.txt" /> + <!-- Invisible Scripts --> + <script src="/js/hide-context-menu.js"></script> + <script src="/js/loader-animation.js"></script> + <script src="/js/refresh-on-media.js"></script> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "Landing Page", + "headline": "Landing Page", + "url": "https://cyne.cf/home", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/inter.css" integrity="sha256-DyLTj16AbuvawyWJMPz4tJNp46iGflE/fWYAoU2IGpk=" crossorigin="anonymous"> +</head> + <body> + <!-- Scripts --> + <script src="/js/app.js"></script> + <script id="js-konami" src="/js/background-sparkles.js"></script> + + <!-- particles.js Container --> + <div style="position: absolute; left: 0; top: 0; width: 100%; height: 100%;" id="particles-js"></div> + <script src="/js/lib/particles.min.js"></script> + <script> + particlesJS.load('particles-js', '/assets/configs/particles.json', function() { + console.log('Callback - particles.js Config Loaded.'); + }); + </script> + + <!-- Navigation Bar --> + <div class="navigation-bar"> + <nav class="nav"> + <a onclick="deactivateCheats()" href="#" class="nav-item" active-color="orange">Home</a> <!-- Had `is-active` after it but removed it due to not highlighting. --> + <a href="/about/" class="nav-item" active-color="green">About</a> + <a href="https://cyne.cf/status" class="nav-item" active-color="red">Status</a> + <span id="directory-konami"></span> + <span class="nav-indicator"></span> + </nav> + </div> + + <!-- Core Site Function, Site Primer/ Base --> + <main> + <div class="links"> + <div class="email"> + <a href="mailto:[email protected]">s1nical</a><br> + Full-stack developer.<br><br> + </div> + <div class="twitter"> + Follow me on <a href="https://twitter.com/9inny">Twitter</a>. + </div> + <div class="github"> + View my code on <a href="https://github.com/8cy">GitHub</a>. + </div> + </div> + </main> + + <div class="clairo"> + <span id="m-konami"></span> + </div> + + <script> + if (screen.width > 768) { // If Desktop + document.getElementById("m-konami").innerHTML = ` + <img src="/assets/imgs/clairo2.gif" alt="clairo" width="30px"> + `; + } else { // If Mobile + document.getElementById("m-konami").innerHTML = ` + <img src="/assets/imgs/clairo2.gif" onclick="activateCheats()" alt="clairo" width="30px"> + `; + } + </script> + + <!-- Konami Music --> + <!-- Background Music + // CREDITS: // + + Title: The Classics - A New Retro Synthwave Mix + + Uploader: Confused Bi-Product of a Misinformed Culture + + Full Credits: https://cyne.cf/konami/assets/audio/midi.mp3.txt --> + <audio src="/konami/assets/audio/midi.mp3" id="music"> + <p>If you are reading this, it is because your browser does not support the audio element.</p> + <script> + var audio = document.getElementById("music"); + audio.volume = 0.1; // Volume Adjuster, might bind it to "- and +" one day if possible. + </script> + </audio> + + <embed src="/assets/audio/sadness.mp3" id="music-main" volume="1" autostart="true" loop="true" width="0" height="0" preload></embed> + + <!-- Loading Animation --> + <div class="loader-wrapper"> + <div class="loader"> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + </div> + </div> + + </body> +</html> diff --git a/humans.txt b/humans.txt new file mode 100644 index 0000000..e2c2e52 --- /dev/null +++ b/humans.txt @@ -0,0 +1,79 @@ +/* TEAM */ + +Title: s1nicalDev + +Site: https://cyne.cf/ + +Contact: [email protected] + +Twitter: @9inny + +Location: Oregon + + + + [...] + + + +/* SITE */ + +Last update: 2020/03/11 + +Standards: HTML5, CSS3, JS and PHP7. + +Components: Trianglify, jQuery, Bootstrap, p5.js, matter.js and Easter Eggs Collection. + +Software: Visual Studio, Visual Studio Code, Atom, WebStorm, and PhpStorm. + + + + [...] + + + + + .-. + ( ) + '-' + J L + | | + J L + | | + J L + .-'.___.'-. + /___________\ + _.-""' `bmw._ + .' `. + J `. + F L + J J + J ` + | L + | | .---------. + | | ( OPUS DEI. ) + | J ,---------' + | L -' + | | + | ,.___ ___....--._ + | ,' `""""""""' `-._ + | J _____________________`-. + | F .-' `-88888-' `Y8888b.`. + | | .' `P' `88888b \ + | | J # L # q8888b L + | | | | )8888D ) + | J \ J d8888P P + | L `. .b. ,88888P / + | `. `-.___,o88888o.___,o88888P'.' + | `-.__________________________..-' + | | + | .-----.........____________J + | .' | | | | + | J---|-----..|...___|_______| + | | | | | | + | Y---|-----..|...___|_______| + | `. | | | | + | `'-------:....__|______.J + | | + L___ | + """----...______________....--' diff --git a/index.php b/index.php new file mode 100644 index 0000000..ed1212f --- /dev/null +++ b/index.php @@ -0,0 +1,96 @@ +<?php + require_once('spongebob.php'); +?> + +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - Landing Page</title> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <!-- External Libraries --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/trianglify/0.3.1/trianglify.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <!-- CSS Links --> + <!-- Why am I so dumb, I just found out why the css wasn't working on the 404 with a trailing slash on Stack Overflow, lol, then I + went through ALL of the files checking if I had any more "./" instead of absolute path and turns out this is the only file I didn't go through...--> + <link rel="stylesheet" href="/about/css/main.css"> + <link rel="stylesheet" href="/about/css/navigation-bar.css"> + <link rel="stylesheet" href="/about/css/loader-animation.css"> + <link rel="stylesheet" href="/about/css/blog-slider.css"> + <link rel="stylesheet" href="/404/css/main.css"> + <!-- Site metadata --> + <meta name="description" content="Landing Page for cyne.cf"> + <meta property="og:description" content="Landing Page for cyne.cf"> + <meta property="og:title" content="s1nical - Landing Page"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "Landing Page for cyne.cf", + "headline": "Landing Page for cyne.cf", + "url": "https://cyne.cf/", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <!-- Invisible Scripts --> + <script src="/js/loader-animation.js"></script> + <script src="/js/refresh-on-media.js"></script> + <script> + var timer = setTimeout(function() { + window.location='https://cyne.cf/home/' + }, 1); + </script> + </head> + <body> + <!-- Visable Scripts --> + <script src="/js/background-sparkles.js"></script> + + <!-- Loading Animation --> + <div class="loader-wrapper"> + <div class="loader"> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + </div> + </div> + </body> +</html> diff --git a/input-lag/.htaccess b/input-lag/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/input-lag/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/input-lag/css/main.css b/input-lag/css/main.css new file mode 100644 index 0000000..a044e24 --- /dev/null +++ b/input-lag/css/main.css @@ -0,0 +1,13 @@ +body { + margin: 0; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; +} + +svg { + width: 100%; + height: 100%; +}
\ No newline at end of file diff --git a/input-lag/index.html b/input-lag/index.html new file mode 100644 index 0000000..c06358a --- /dev/null +++ b/input-lag/index.html @@ -0,0 +1,57 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - Input Lag</title> + <!-- Site metadata --> + <meta name="description" content="Input Lag Simulation"> + <meta property="og:description" content="Input Lag Simulation"> + <meta property="og:title" content="s1nical - Input Lag"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/input-lag"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/input-lag"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "Input Lag Simulation", + "headline": "Input Lag Simulation", + "url": "https://cyne.cf/input-lag", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <!-- CSS Links --> + <link rel="stylesheet" href="/input-lag/css/main.css"> + <!-- External Libraries --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> +</head> + + <body> + <script src="/input-lag/js/main.js"></script> + </body> + +</html>
\ No newline at end of file diff --git a/input-lag/js/main.js b/input-lag/js/main.js new file mode 100644 index 0000000..8756bcc --- /dev/null +++ b/input-lag/js/main.js @@ -0,0 +1,84 @@ +var margin = { + top: 20, + right: 10, + bottom: 20, + left: 10 +}; +var width = screen.width - margin.left - margin.right; +var height = screen.height - margin.top - margin.bottom; +var circleRadius = 20; +var delay = 100; // in ms +var circleOffset = circleRadius; + +var svg = d3.select("body").append("svg") + .attr("width", width + margin.left + margin.right) + .attr("height", height + margin.top + margin.bottom) + .append("g") + .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); + +var delays = [1, 5, 10, 20, 50, 100, 500, 1000, 2000]; + +var circle2 = svg.append('circle') + .attr('cx', (width / 2) - circleOffset) + .attr('cy', (height / 2) - circleOffset) + .attr('r', circleRadius) + .attr('fill', 'red') + +var circle1 = svg.append('circle') + .attr('cx', (width / 2) - circleOffset) + .attr('cy', (height / 2) - circleOffset) + .attr('r', circleRadius) + .attr('fill', 'gray') + +var ds = svg.selectAll('.delay') + .data(delays) + .enter() + .append('g') + .attr('class', 'delay') + .attr('left', 100) + .attr('top', 50) + .attr('transform', function (d, i) { + return 'translate(' + i * 100 + ', 0)'; + }) + +function updateButtons() { + svg.selectAll('.delay') + .select('text') + .attr('fill', function (d) { + return d === delay ? 'black' : 'lightblue' + }) +} + +ds.append('text') + .text(function (d) { + return d + ' ms'; + }) + .on('click', function (d) { + delay = d; + updateButtons(); + }); + +svg.append('rect') + .attr('height', height) + .attr('width', width) + .attr('opacity', 0) + .on('mousemove', function () { + var start = performance.now(); + var x = d3.event.x; + var y = d3.event.y; + circle1.attr('cx', x - circleOffset / 2) + circle1.attr('cy', y - circleOffset) + + var step = function (timestamp) { + if (timestamp - start < delay) { + window.requestAnimationFrame(step); + } else { + circle2.attr('cx', x - circleOffset / 2); + circle2.attr('cy', y - circleOffset); + } + } + + window.requestAnimationFrame(step); + }) + +updateButtons();
\ No newline at end of file diff --git a/ip-detection/.htaccess b/ip-detection/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/ip-detection/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/ip-detection/index.html b/ip-detection/index.html new file mode 100644 index 0000000..05e47aa --- /dev/null +++ b/ip-detection/index.html @@ -0,0 +1,140 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - IP Detection</title> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <!-- Site metadata --> + <meta name="description" content="IP Detection"> + <meta property="og:description" content="IP Detection"> + <meta property="og:title" content="s1nical - IP Detection"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/ip-detection"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/ip-detection"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "IP Detection", + "headline": "IP Detection", + "url": "https://cyne.cf/ip-detection", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <!-- External Libraries --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/trianglify/0.3.1/trianglify.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <!-- CSS Links --> + <link rel="stylesheet" href="/about/css/main.css"> + <link rel="stylesheet" href="/about/css/navigation-bar.css"> + <link rel="stylesheet" href="/about/css/loader-animation.css"> + <link rel="stylesheet" href="/about/css/blog-slider.css"> + <link rel="stylesheet" href="/404/css/main.css"> + <!-- Invisible Scripts --> + <script src="/js/loader-animation.js"></script> + <script src="/js/refresh-on-media.js"></script> + <script src="/ip-detection/js/main.js"></script> +</head> + + <body> + <!-- Visable Scripts --> + <script src="/js/background-sparkles.js"></script> + + <!-- Navigation Bar --> + <div class="navigation-bar"> + <nav class="nav"> + <a href="/home/" class="nav-item" active-color="orange">Home</a> + <!-- Had `is-active` after it but removed it due to not highlighting. --> + <a href="/about/" class="nav-item" active-color="green">About</a> <!-- About --> + <!--<a href="https://p.s1n.pw/" class="nav-item" active-color="blue">Portfolio</a> <!-- Testimonials --> + <!--<a href="http://status.maldrama.ml" class="nav-item" active-color="red">Status</a> <!-- Blog --> + <!--<a href="/cars/" class="nav-item" active-color="rebeccapurple">Cars</a> <!-- Contact --> + <!--<a href="https://nani.s1n.pw" class="nav-item" active-color="rebeccapurple">Nani?!</a>--> + <span class="nav-indicator"></span> + </nav> + </div> + + <style> + .result { + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + } + </style> + + <div class="bio"> + <div class="links"> + <div class="blog-slider"> + <div class="content"> + <div style="text-align: center;">IP: <span class="result" id="ip"></span></div> + <div style="text-align: center;">Location: <span class="result" id="address"></span></div> + <hr/><h3 style="text-align: center;">Full Response:</h3> + <pre class="result" id="details" style="text-align: left;"></pre> + <style> + @media (max-width: 768px) { + .content { + font-size: 10px; + } + } + </style> + <br class="mobile"> + <h1> + <!-- Filler --> + </h1> + <a class="mobile" href="/home/">Back home</a> + <h1 class="mobile"> + <!-- Filler --> + </h1> + </div> + </div> + </div> + </div> + + <!-- Loading Animation --> + <div class="loader-wrapper"> + <div class="loader"> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + </div> + </div> + </body> + +</html> diff --git a/ip-detection/js/main.js b/ip-detection/js/main.js new file mode 100644 index 0000000..ce117d8 --- /dev/null +++ b/ip-detection/js/main.js @@ -0,0 +1,5 @@ +$.get("https://ipinfo.io/json", function (response) { + $("#ip").html(response.ip); + $("#address").html(response.city + ", " + response.region); + $("#details").html(JSON.stringify(response, null, 4)); +}, "jsonp"); diff --git a/js/.htaccess b/js/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/js/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/js/app.js b/js/app.js new file mode 100644 index 0000000..2b21815 --- /dev/null +++ b/js/app.js @@ -0,0 +1,210 @@ +// KONAMI CODE HINTS +$(window).on("load", function () { + console.log("UP, UP, DOWN, DOWN, LEFT, RIGHT, LEFT, RIGHT, B, A") + +}) + +/* +// THIS CHECKS WHAT OS THE USER IS ON +// This is a old variation so don't use this. +if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|Opera Mini/i.test(navigator.userAgent)) { + location.href = './mobile/'; +} +*/ + +/* Honestly I have NO idea what this is but it was in the original site source code so I kept it :) +**(async () => { +** if (navigator.webdriver || document.visibilityState === 'prerender' || !location.hostname) { +** return; +** } +** +** document.querySelector('a[href="/cdn-cgi/l/email-protection"]').href = `\x6dailto:hi\x40${location.hostname}`; +** })(); +*/ + +// KONAMI CODE FOR ALTERNATE 90S SITE +// A key map of allowed keys +var allowedKeys = { + 37: 'left', + 38: 'up', + 39: 'right', + 40: 'down', + 65: 'a', + 66: 'b', + 8: 'backspace' +}; + +// To somewhat stop backspace/ refresh spamming +window.addEventListener('keydown', function (event) { + + if (event.keyCode === 8) { + + event.preventDefault(); + + return false; + } +}); + +// The 'official' Konami Code sequence +var konamiCode = ['up', 'up', 'down', 'down', 'left', 'right', 'left', 'right', 'b', 'a']; + +// A variable to remember the 'position' the user has reached so far. +var konamiCodePosition = 0; + +// Add keydown event listener +document.addEventListener('keydown', function (e) { + // Get the value of the key code from the key map + var key = allowedKeys[e.keyCode]; + // Get the value of the required key from the Konami Code + var requiredKey = konamiCode[konamiCodePosition]; + + // Compare the key with the required key + if (key == requiredKey) { + + // Move to the next key in the Konami Code sequence + konamiCodePosition++; + + // Ff the last key is reached, activate cheats + if (konamiCodePosition == konamiCode.length) { + activateCheats(); + konamiCodePosition = 0; + } + } else { + konamiCodePosition = 0; + } +}); + +// Back to normal sequence +var backCode = ['backspace']; + +var backCodePosition = 0; + +document.addEventListener('keydown', function (e) { + var key = allowedKeys[e.keyCode]; + var requiredKey = backCode[backCodePosition]; + + if (key == requiredKey) { + + backCodePosition++; + + if (backCodePosition == backCode.length) { + deactivateCheats(); + backCodePosition = 0; + } + } else { + backCodePosition = 0; + } +}); + +function swapStyleSheet(sheet) { + document.getElementById('pagestyle').setAttribute('href', sheet); +} + +// Change favicon +document.head = document.head || document.getElementsByTagName('head')[0]; + +function changeFavicon(src) { + var link = document.createElement('link'), + oldLink = document.getElementById('dynamic-favicon'); + link.id = 'dynamic-favicon'; + link.rel = 'shortcut icon'; + link.href = src; + if (oldLink) { + document.head.removeChild(oldLink); + } + document.head.appendChild(link); +} + +function activateCheats() { + swapStyleSheet('/konami/css/main.css'); + // I overworked for this smh... + + changeFavicon('/konami/assets/images/small-spinning-globe3.gif'); + + var x = document.getElementById("music"); + function playAudio() { + x.play(); + } + playAudio(); + + document.getElementById("directory-konami").innerHTML = ` + <a href="/directory/" class="nav-item" active-color="rebeccapurple">Directory</a> + `; + + if (screen.width > 768) { // If Desktop + document.getElementById("m-konami").innerHTML = ` + <img src="/assets/imgs/clairo2.gif" alt="" width="30px"> + `; + } else { // If Mobile + document.getElementById("m-konami").innerHTML = ` + <img src="/assets/imgs/clairo2.gif" onclick="deactivateCheats()" alt="" width="30px"> + `; + } + + document.title = "// s1n.ical // Landing Page //" +} + +function deactivateCheats() { + + swapStyleSheet('/css/main.css'); + + changeFavicon('favicon.ico'); + + var x = document.getElementById("music"); + function pauseAudio() { + x.pause(); + } + pauseAudio(); + + document.getElementById("directory-konami").innerHTML = ``; + + document.getElementById("m-konami").innerHTML = ` + <div class="clairo"> + <img src="/assets/imgs/clairo2.gif" alt="" width="30px" onclick="activateCheats()"> + </div> + `; + + document.title = "s1nical - Landing Page"; +} + +var TxtRotate = function (el, toRotate, period) { + this.toRotate = toRotate; + this.el = el; + this.loopNum = 0; + this.period = parseInt(period, 10) || 2000; + this.txt = ''; + this.tick(); + this.isDeleting = false; +}; + +TxtRotate.prototype.tick = function () { + var i = this.loopNum % this.toRotate.length; + var fullTxt = this.toRotate[i]; + + if (this.isDeleting) { + this.txt = fullTxt.substring(0, this.txt.length - 1); + } else { + this.txt = fullTxt.substring(0, this.txt.length + 1); + } + + this.el.innerHTML = '<span class="wrap">' + this.txt + '</span>'; + + var that = this; + var delta = 300 - Math.random() * 100; + + + setTimeout(function () { + that.tick(); + }, delta); +}; + +window.onload = function () { + var elements = document.getElementsByClassName('txt-rotate'); + for (var i = 0; i < elements.length; i++) { + var toRotate = elements[i].getAttribute('data-rotate'); + var period = elements[i].getAttribute('data-period'); + if (toRotate) { + new TxtRotate(elements[i], JSON.parse(toRotate), period); + } + } +}; diff --git a/js/background-sparkles.js b/js/background-sparkles.js new file mode 100644 index 0000000..9c67fc2 --- /dev/null +++ b/js/background-sparkles.js @@ -0,0 +1,105 @@ +// Background only renders based on the original browser window size when +// starting to load the site. Due to rendering issues, I don't think I +// can do it other wise. + +/////////////// +// SCRIPT #1 // +/////////////// + +// If light mode detected, in reality, if nothing is detected lmao +// Dark mode feature was removed lol +// Set up base pattern +var pattern = Trianglify({ + height: window.innerHeight, // White: #fdfbfb, Salmon: #cc3300 + width: window.innerWidth, + // Christmas Colours: + x_colors: ['#040404', '#f9f9f9', '#fffff4', '#fbf7f5', '#d55454'], // Cappuccino: ['#854442', '#3c2f2f', '#fff4e6', '#be9b7b', '#4b3832'] + y_colors: ['#f9f1f1', '#f9f9f9', '#fffff4', '#fbf7f5', '#f9f1f1'], // Random colour generator: "#"+((1<<24)*Math.random()|0).toString(16) + // + // Normal Colours: + // x_colors: ['#040404', '#f9f9f9', '#fffff4', '#fbf7f5', '#d55454'], + // y_colors: ['#f9f1f1', '#f9f9f9', '#fffff4', '#fbf7f5', '#f9f1f1'], + // + // Christmas Colours: + // x_colors: ['#0F8A5F', '#f9f9f9', '#fffff4', '#fbf7f5', '#CC231E'], + // y_colors: ['#f9f1f1', '#f9f9f9', '#fffff4', '#fbf7f5', '#f9f1f1'], + // + variance: 10, // Gives it more style + seed: Number.parseInt(Math.floor(Math.random() * 100)), // TODO: Live seed transitioning. + cell_size: 160 // Cell size +}); + +// REMOVED bc looked ugly +// If dark mode detected +// if (matchMedia('(prefers-color-scheme: dark)').matches) { +// var pattern = Trianglify({ +// height: window.innerHeight, // White: #fdfbfb, Salmon: #cc3300 +// width: window.innerWidth, +// x_colors: ['#040404', '#111111', '#111111', '#111111', '#d55454'], // Cappuccino: ['#854442', '#3c2f2f', '#fff4e6', '#be9b7b', '#4b3832'] +// y_colors: ['#f9f1f1', '#111111', '#111111', '#111111', '#f9f1f1'], // Random colour generator: "#"+((1<<24)*Math.random()|0).toString(16) +// variance: 10, // Gives it more style +// seed: Number.parseInt(Math.floor(Math.random() * 100)), // TODO: Live seed transitioning. +// cell_size: 160 // Cell size +// }); +// } + +// // Canvas +// document.body.appendChild(pattern.canvas()) + +// SVG +document.body.appendChild(pattern.svg()) + + + +// // PNG +// var png = document.createElement('img') +// png.src = pattern.png() +// document.body.appendChild(png) + +/////////////// +// SCRIPT #2 // +/////////////// + +$('.title-wrapper').css('width', window.innerWidth); +$('.title-wrapper').css('height', window.innerHeight); + + +var time = 10, + $paths = $('body').find('svg').find('path'), + pathCollection = $paths.get(), + count = $paths.length; + +// // Log variable "count" +// console.log(count); + +pathCollection.sort(function () { + return Math.random() * 10 > 5 ? 1 : -1; +}); + +function showText() { + var title = $('h1'), + subtitle = $('h2'); + + title.removeClass('hidden'); + setTimeout(function () { + subtitle.removeClass('hidden'); + }, 500); +} + +setTimeout(function () { + $.each(pathCollection, function (i, el) { + var $path = $(this); + setTimeout(function () { + + $path.css('opacity', '1'); + }, time) + time += 10; + + if (i + 1 === count) { + setTimeout(function () { + showText(); + }, 2000); + } + + }); +}, 2000);
\ No newline at end of file diff --git a/js/hide-context-menu.js b/js/hide-context-menu.js new file mode 100644 index 0000000..af01311 --- /dev/null +++ b/js/hide-context-menu.js @@ -0,0 +1,3 @@ +document.addEventListener("contextmenu", function (e) { + e.preventDefault(); +}, false)
\ No newline at end of file diff --git a/js/lib/particles.min.js b/js/lib/particles.min.js new file mode 100644 index 0000000..b3d46d1 --- /dev/null +++ b/js/lib/particles.min.js @@ -0,0 +1,9 @@ +/* ----------------------------------------------- +/* Author : Vincent Garreau - vincentgarreau.com +/* MIT license: http://opensource.org/licenses/MIT +/* Demo / Generator : vincentgarreau.com/particles.js +/* GitHub : github.com/VincentGarreau/particles.js +/* How to use? : Check the GitHub README +/* v2.0.0 +/* ----------------------------------------------- */ +function hexToRgb(e){var a=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;e=e.replace(a,function(e,a,t,i){return a+a+t+t+i+i});var t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null}function clamp(e,a,t){return Math.min(Math.max(e,a),t)}function isInArray(e,a){return a.indexOf(e)>-1}var pJS=function(e,a){var t=document.querySelector("#"+e+" > .particles-js-canvas-el");this.pJS={canvas:{el:t,w:t.offsetWidth,h:t.offsetHeight},particles:{number:{value:400,density:{enable:!0,value_area:800}},color:{value:"#fff"},shape:{type:"circle",stroke:{width:0,color:"#ff0000"},polygon:{nb_sides:5},image:{src:"",width:100,height:100}},opacity:{value:1,random:!1,anim:{enable:!1,speed:2,opacity_min:0,sync:!1}},size:{value:20,random:!1,anim:{enable:!1,speed:20,size_min:0,sync:!1}},line_linked:{enable:!0,distance:100,color:"#fff",opacity:1,width:1},move:{enable:!0,speed:2,direction:"none",random:!1,straight:!1,out_mode:"out",bounce:!1,attract:{enable:!1,rotateX:3e3,rotateY:3e3}},array:[]},interactivity:{detect_on:"canvas",events:{onhover:{enable:!0,mode:"grab"},onclick:{enable:!0,mode:"push"},resize:!0},modes:{grab:{distance:100,line_linked:{opacity:1}},bubble:{distance:200,size:80,duration:.4},repulse:{distance:200,duration:.4},push:{particles_nb:4},remove:{particles_nb:2}},mouse:{}},retina_detect:!1,fn:{interact:{},modes:{},vendors:{}},tmp:{}};var i=this.pJS;a&&Object.deepExtend(i,a),i.tmp.obj={size_value:i.particles.size.value,size_anim_speed:i.particles.size.anim.speed,move_speed:i.particles.move.speed,line_linked_distance:i.particles.line_linked.distance,line_linked_width:i.particles.line_linked.width,mode_grab_distance:i.interactivity.modes.grab.distance,mode_bubble_distance:i.interactivity.modes.bubble.distance,mode_bubble_size:i.interactivity.modes.bubble.size,mode_repulse_distance:i.interactivity.modes.repulse.distance},i.fn.retinaInit=function(){i.retina_detect&&window.devicePixelRatio>1?(i.canvas.pxratio=window.devicePixelRatio,i.tmp.retina=!0):(i.canvas.pxratio=1,i.tmp.retina=!1),i.canvas.w=i.canvas.el.offsetWidth*i.canvas.pxratio,i.canvas.h=i.canvas.el.offsetHeight*i.canvas.pxratio,i.particles.size.value=i.tmp.obj.size_value*i.canvas.pxratio,i.particles.size.anim.speed=i.tmp.obj.size_anim_speed*i.canvas.pxratio,i.particles.move.speed=i.tmp.obj.move_speed*i.canvas.pxratio,i.particles.line_linked.distance=i.tmp.obj.line_linked_distance*i.canvas.pxratio,i.interactivity.modes.grab.distance=i.tmp.obj.mode_grab_distance*i.canvas.pxratio,i.interactivity.modes.bubble.distance=i.tmp.obj.mode_bubble_distance*i.canvas.pxratio,i.particles.line_linked.width=i.tmp.obj.line_linked_width*i.canvas.pxratio,i.interactivity.modes.bubble.size=i.tmp.obj.mode_bubble_size*i.canvas.pxratio,i.interactivity.modes.repulse.distance=i.tmp.obj.mode_repulse_distance*i.canvas.pxratio},i.fn.canvasInit=function(){i.canvas.ctx=i.canvas.el.getContext("2d")},i.fn.canvasSize=function(){i.canvas.el.width=i.canvas.w,i.canvas.el.height=i.canvas.h,i&&i.interactivity.events.resize&&window.addEventListener("resize",function(){i.canvas.w=i.canvas.el.offsetWidth,i.canvas.h=i.canvas.el.offsetHeight,i.tmp.retina&&(i.canvas.w*=i.canvas.pxratio,i.canvas.h*=i.canvas.pxratio),i.canvas.el.width=i.canvas.w,i.canvas.el.height=i.canvas.h,i.particles.move.enable||(i.fn.particlesEmpty(),i.fn.particlesCreate(),i.fn.particlesDraw(),i.fn.vendors.densityAutoParticles()),i.fn.vendors.densityAutoParticles()})},i.fn.canvasPaint=function(){i.canvas.ctx.fillRect(0,0,i.canvas.w,i.canvas.h)},i.fn.canvasClear=function(){i.canvas.ctx.clearRect(0,0,i.canvas.w,i.canvas.h)},i.fn.particle=function(e,a,t){if(this.radius=(i.particles.size.random?Math.random():1)*i.particles.size.value,i.particles.size.anim.enable&&(this.size_status=!1,this.vs=i.particles.size.anim.speed/100,i.particles.size.anim.sync||(this.vs=this.vs*Math.random())),this.x=t?t.x:Math.random()*i.canvas.w,this.y=t?t.y:Math.random()*i.canvas.h,this.x>i.canvas.w-2*this.radius?this.x=this.x-this.radius:this.x<2*this.radius&&(this.x=this.x+this.radius),this.y>i.canvas.h-2*this.radius?this.y=this.y-this.radius:this.y<2*this.radius&&(this.y=this.y+this.radius),i.particles.move.bounce&&i.fn.vendors.checkOverlap(this,t),this.color={},"object"==typeof e.value)if(e.value instanceof Array){var s=e.value[Math.floor(Math.random()*i.particles.color.value.length)];this.color.rgb=hexToRgb(s)}else void 0!=e.value.r&&void 0!=e.value.g&&void 0!=e.value.b&&(this.color.rgb={r:e.value.r,g:e.value.g,b:e.value.b}),void 0!=e.value.h&&void 0!=e.value.s&&void 0!=e.value.l&&(this.color.hsl={h:e.value.h,s:e.value.s,l:e.value.l});else"random"==e.value?this.color.rgb={r:Math.floor(256*Math.random())+0,g:Math.floor(256*Math.random())+0,b:Math.floor(256*Math.random())+0}:"string"==typeof e.value&&(this.color=e,this.color.rgb=hexToRgb(this.color.value));this.opacity=(i.particles.opacity.random?Math.random():1)*i.particles.opacity.value,i.particles.opacity.anim.enable&&(this.opacity_status=!1,this.vo=i.particles.opacity.anim.speed/100,i.particles.opacity.anim.sync||(this.vo=this.vo*Math.random()));var n={};switch(i.particles.move.direction){case"top":n={x:0,y:-1};break;case"top-right":n={x:.5,y:-.5};break;case"right":n={x:1,y:-0};break;case"bottom-right":n={x:.5,y:.5};break;case"bottom":n={x:0,y:1};break;case"bottom-left":n={x:-.5,y:1};break;case"left":n={x:-1,y:0};break;case"top-left":n={x:-.5,y:-.5};break;default:n={x:0,y:0}}i.particles.move.straight?(this.vx=n.x,this.vy=n.y,i.particles.move.random&&(this.vx=this.vx*Math.random(),this.vy=this.vy*Math.random())):(this.vx=n.x+Math.random()-.5,this.vy=n.y+Math.random()-.5),this.vx_i=this.vx,this.vy_i=this.vy;var r=i.particles.shape.type;if("object"==typeof r){if(r instanceof Array){var c=r[Math.floor(Math.random()*r.length)];this.shape=c}}else this.shape=r;if("image"==this.shape){var o=i.particles.shape;this.img={src:o.image.src,ratio:o.image.width/o.image.height},this.img.ratio||(this.img.ratio=1),"svg"==i.tmp.img_type&&void 0!=i.tmp.source_svg&&(i.fn.vendors.createSvgImg(this),i.tmp.pushing&&(this.img.loaded=!1))}},i.fn.particle.prototype.draw=function(){function e(){i.canvas.ctx.drawImage(r,a.x-t,a.y-t,2*t,2*t/a.img.ratio)}var a=this;if(void 0!=a.radius_bubble)var t=a.radius_bubble;else var t=a.radius;if(void 0!=a.opacity_bubble)var s=a.opacity_bubble;else var s=a.opacity;if(a.color.rgb)var n="rgba("+a.color.rgb.r+","+a.color.rgb.g+","+a.color.rgb.b+","+s+")";else var n="hsla("+a.color.hsl.h+","+a.color.hsl.s+"%,"+a.color.hsl.l+"%,"+s+")";switch(i.canvas.ctx.fillStyle=n,i.canvas.ctx.beginPath(),a.shape){case"circle":i.canvas.ctx.arc(a.x,a.y,t,0,2*Math.PI,!1);break;case"edge":i.canvas.ctx.rect(a.x-t,a.y-t,2*t,2*t);break;case"triangle":i.fn.vendors.drawShape(i.canvas.ctx,a.x-t,a.y+t/1.66,2*t,3,2);break;case"polygon":i.fn.vendors.drawShape(i.canvas.ctx,a.x-t/(i.particles.shape.polygon.nb_sides/3.5),a.y-t/.76,2.66*t/(i.particles.shape.polygon.nb_sides/3),i.particles.shape.polygon.nb_sides,1);break;case"star":i.fn.vendors.drawShape(i.canvas.ctx,a.x-2*t/(i.particles.shape.polygon.nb_sides/4),a.y-t/1.52,2*t*2.66/(i.particles.shape.polygon.nb_sides/3),i.particles.shape.polygon.nb_sides,2);break;case"image":if("svg"==i.tmp.img_type)var r=a.img.obj;else var r=i.tmp.img_obj;r&&e()}i.canvas.ctx.closePath(),i.particles.shape.stroke.width>0&&(i.canvas.ctx.strokeStyle=i.particles.shape.stroke.color,i.canvas.ctx.lineWidth=i.particles.shape.stroke.width,i.canvas.ctx.stroke()),i.canvas.ctx.fill()},i.fn.particlesCreate=function(){for(var e=0;e<i.particles.number.value;e++)i.particles.array.push(new i.fn.particle(i.particles.color,i.particles.opacity.value))},i.fn.particlesUpdate=function(){for(var e=0;e<i.particles.array.length;e++){var a=i.particles.array[e];if(i.particles.move.enable){var t=i.particles.move.speed/2;a.x+=a.vx*t,a.y+=a.vy*t}if(i.particles.opacity.anim.enable&&(1==a.opacity_status?(a.opacity>=i.particles.opacity.value&&(a.opacity_status=!1),a.opacity+=a.vo):(a.opacity<=i.particles.opacity.anim.opacity_min&&(a.opacity_status=!0),a.opacity-=a.vo),a.opacity<0&&(a.opacity=0)),i.particles.size.anim.enable&&(1==a.size_status?(a.radius>=i.particles.size.value&&(a.size_status=!1),a.radius+=a.vs):(a.radius<=i.particles.size.anim.size_min&&(a.size_status=!0),a.radius-=a.vs),a.radius<0&&(a.radius=0)),"bounce"==i.particles.move.out_mode)var s={x_left:a.radius,x_right:i.canvas.w,y_top:a.radius,y_bottom:i.canvas.h};else var s={x_left:-a.radius,x_right:i.canvas.w+a.radius,y_top:-a.radius,y_bottom:i.canvas.h+a.radius};switch(a.x-a.radius>i.canvas.w?(a.x=s.x_left,a.y=Math.random()*i.canvas.h):a.x+a.radius<0&&(a.x=s.x_right,a.y=Math.random()*i.canvas.h),a.y-a.radius>i.canvas.h?(a.y=s.y_top,a.x=Math.random()*i.canvas.w):a.y+a.radius<0&&(a.y=s.y_bottom,a.x=Math.random()*i.canvas.w),i.particles.move.out_mode){case"bounce":a.x+a.radius>i.canvas.w?a.vx=-a.vx:a.x-a.radius<0&&(a.vx=-a.vx),a.y+a.radius>i.canvas.h?a.vy=-a.vy:a.y-a.radius<0&&(a.vy=-a.vy)}if(isInArray("grab",i.interactivity.events.onhover.mode)&&i.fn.modes.grabParticle(a),(isInArray("bubble",i.interactivity.events.onhover.mode)||isInArray("bubble",i.interactivity.events.onclick.mode))&&i.fn.modes.bubbleParticle(a),(isInArray("repulse",i.interactivity.events.onhover.mode)||isInArray("repulse",i.interactivity.events.onclick.mode))&&i.fn.modes.repulseParticle(a),i.particles.line_linked.enable||i.particles.move.attract.enable)for(var n=e+1;n<i.particles.array.length;n++){var r=i.particles.array[n];i.particles.line_linked.enable&&i.fn.interact.linkParticles(a,r),i.particles.move.attract.enable&&i.fn.interact.attractParticles(a,r),i.particles.move.bounce&&i.fn.interact.bounceParticles(a,r)}}},i.fn.particlesDraw=function(){i.canvas.ctx.clearRect(0,0,i.canvas.w,i.canvas.h),i.fn.particlesUpdate();for(var e=0;e<i.particles.array.length;e++){var a=i.particles.array[e];a.draw()}},i.fn.particlesEmpty=function(){i.particles.array=[]},i.fn.particlesRefresh=function(){cancelRequestAnimFrame(i.fn.checkAnimFrame),cancelRequestAnimFrame(i.fn.drawAnimFrame),i.tmp.source_svg=void 0,i.tmp.img_obj=void 0,i.tmp.count_svg=0,i.fn.particlesEmpty(),i.fn.canvasClear(),i.fn.vendors.start()},i.fn.interact.linkParticles=function(e,a){var t=e.x-a.x,s=e.y-a.y,n=Math.sqrt(t*t+s*s);if(n<=i.particles.line_linked.distance){var r=i.particles.line_linked.opacity-n/(1/i.particles.line_linked.opacity)/i.particles.line_linked.distance;if(r>0){var c=i.particles.line_linked.color_rgb_line;i.canvas.ctx.strokeStyle="rgba("+c.r+","+c.g+","+c.b+","+r+")",i.canvas.ctx.lineWidth=i.particles.line_linked.width,i.canvas.ctx.beginPath(),i.canvas.ctx.moveTo(e.x,e.y),i.canvas.ctx.lineTo(a.x,a.y),i.canvas.ctx.stroke(),i.canvas.ctx.closePath()}}},i.fn.interact.attractParticles=function(e,a){var t=e.x-a.x,s=e.y-a.y,n=Math.sqrt(t*t+s*s);if(n<=i.particles.line_linked.distance){var r=t/(1e3*i.particles.move.attract.rotateX),c=s/(1e3*i.particles.move.attract.rotateY);e.vx-=r,e.vy-=c,a.vx+=r,a.vy+=c}},i.fn.interact.bounceParticles=function(e,a){var t=e.x-a.x,i=e.y-a.y,s=Math.sqrt(t*t+i*i),n=e.radius+a.radius;n>=s&&(e.vx=-e.vx,e.vy=-e.vy,a.vx=-a.vx,a.vy=-a.vy)},i.fn.modes.pushParticles=function(e,a){i.tmp.pushing=!0;for(var t=0;e>t;t++)i.particles.array.push(new i.fn.particle(i.particles.color,i.particles.opacity.value,{x:a?a.pos_x:Math.random()*i.canvas.w,y:a?a.pos_y:Math.random()*i.canvas.h})),t==e-1&&(i.particles.move.enable||i.fn.particlesDraw(),i.tmp.pushing=!1)},i.fn.modes.removeParticles=function(e){i.particles.array.splice(0,e),i.particles.move.enable||i.fn.particlesDraw()},i.fn.modes.bubbleParticle=function(e){function a(){e.opacity_bubble=e.opacity,e.radius_bubble=e.radius}function t(a,t,s,n,c){if(a!=t)if(i.tmp.bubble_duration_end){if(void 0!=s){var o=n-p*(n-a)/i.interactivity.modes.bubble.duration,l=a-o;d=a+l,"size"==c&&(e.radius_bubble=d),"opacity"==c&&(e.opacity_bubble=d)}}else if(r<=i.interactivity.modes.bubble.distance){if(void 0!=s)var v=s;else var v=n;if(v!=a){var d=n-p*(n-a)/i.interactivity.modes.bubble.duration;"size"==c&&(e.radius_bubble=d),"opacity"==c&&(e.opacity_bubble=d)}}else"size"==c&&(e.radius_bubble=void 0),"opacity"==c&&(e.opacity_bubble=void 0)}if(i.interactivity.events.onhover.enable&&isInArray("bubble",i.interactivity.events.onhover.mode)){var s=e.x-i.interactivity.mouse.pos_x,n=e.y-i.interactivity.mouse.pos_y,r=Math.sqrt(s*s+n*n),c=1-r/i.interactivity.modes.bubble.distance;if(r<=i.interactivity.modes.bubble.distance){if(c>=0&&"mousemove"==i.interactivity.status){if(i.interactivity.modes.bubble.size!=i.particles.size.value)if(i.interactivity.modes.bubble.size>i.particles.size.value){var o=e.radius+i.interactivity.modes.bubble.size*c;o>=0&&(e.radius_bubble=o)}else{var l=e.radius-i.interactivity.modes.bubble.size,o=e.radius-l*c;o>0?e.radius_bubble=o:e.radius_bubble=0}if(i.interactivity.modes.bubble.opacity!=i.particles.opacity.value)if(i.interactivity.modes.bubble.opacity>i.particles.opacity.value){var v=i.interactivity.modes.bubble.opacity*c;v>e.opacity&&v<=i.interactivity.modes.bubble.opacity&&(e.opacity_bubble=v)}else{var v=e.opacity-(i.particles.opacity.value-i.interactivity.modes.bubble.opacity)*c;v<e.opacity&&v>=i.interactivity.modes.bubble.opacity&&(e.opacity_bubble=v)}}}else a();"mouseleave"==i.interactivity.status&&a()}else if(i.interactivity.events.onclick.enable&&isInArray("bubble",i.interactivity.events.onclick.mode)){if(i.tmp.bubble_clicking){var s=e.x-i.interactivity.mouse.click_pos_x,n=e.y-i.interactivity.mouse.click_pos_y,r=Math.sqrt(s*s+n*n),p=((new Date).getTime()-i.interactivity.mouse.click_time)/1e3;p>i.interactivity.modes.bubble.duration&&(i.tmp.bubble_duration_end=!0),p>2*i.interactivity.modes.bubble.duration&&(i.tmp.bubble_clicking=!1,i.tmp.bubble_duration_end=!1)}i.tmp.bubble_clicking&&(t(i.interactivity.modes.bubble.size,i.particles.size.value,e.radius_bubble,e.radius,"size"),t(i.interactivity.modes.bubble.opacity,i.particles.opacity.value,e.opacity_bubble,e.opacity,"opacity"))}},i.fn.modes.repulseParticle=function(e){function a(){var a=Math.atan2(d,p);if(e.vx=u*Math.cos(a),e.vy=u*Math.sin(a),"bounce"==i.particles.move.out_mode){var t={x:e.x+e.vx,y:e.y+e.vy};t.x+e.radius>i.canvas.w?e.vx=-e.vx:t.x-e.radius<0&&(e.vx=-e.vx),t.y+e.radius>i.canvas.h?e.vy=-e.vy:t.y-e.radius<0&&(e.vy=-e.vy)}}if(i.interactivity.events.onhover.enable&&isInArray("repulse",i.interactivity.events.onhover.mode)&&"mousemove"==i.interactivity.status){var t=e.x-i.interactivity.mouse.pos_x,s=e.y-i.interactivity.mouse.pos_y,n=Math.sqrt(t*t+s*s),r={x:t/n,y:s/n},c=i.interactivity.modes.repulse.distance,o=100,l=clamp(1/c*(-1*Math.pow(n/c,2)+1)*c*o,0,50),v={x:e.x+r.x*l,y:e.y+r.y*l};"bounce"==i.particles.move.out_mode?(v.x-e.radius>0&&v.x+e.radius<i.canvas.w&&(e.x=v.x),v.y-e.radius>0&&v.y+e.radius<i.canvas.h&&(e.y=v.y)):(e.x=v.x,e.y=v.y)}else if(i.interactivity.events.onclick.enable&&isInArray("repulse",i.interactivity.events.onclick.mode))if(i.tmp.repulse_finish||(i.tmp.repulse_count++,i.tmp.repulse_count==i.particles.array.length&&(i.tmp.repulse_finish=!0)),i.tmp.repulse_clicking){var c=Math.pow(i.interactivity.modes.repulse.distance/6,3),p=i.interactivity.mouse.click_pos_x-e.x,d=i.interactivity.mouse.click_pos_y-e.y,m=p*p+d*d,u=-c/m*1;c>=m&&a()}else 0==i.tmp.repulse_clicking&&(e.vx=e.vx_i,e.vy=e.vy_i)},i.fn.modes.grabParticle=function(e){if(i.interactivity.events.onhover.enable&&"mousemove"==i.interactivity.status){var a=e.x-i.interactivity.mouse.pos_x,t=e.y-i.interactivity.mouse.pos_y,s=Math.sqrt(a*a+t*t);if(s<=i.interactivity.modes.grab.distance){var n=i.interactivity.modes.grab.line_linked.opacity-s/(1/i.interactivity.modes.grab.line_linked.opacity)/i.interactivity.modes.grab.distance;if(n>0){var r=i.particles.line_linked.color_rgb_line;i.canvas.ctx.strokeStyle="rgba("+r.r+","+r.g+","+r.b+","+n+")",i.canvas.ctx.lineWidth=i.particles.line_linked.width,i.canvas.ctx.beginPath(),i.canvas.ctx.moveTo(e.x,e.y),i.canvas.ctx.lineTo(i.interactivity.mouse.pos_x,i.interactivity.mouse.pos_y),i.canvas.ctx.stroke(),i.canvas.ctx.closePath()}}}},i.fn.vendors.eventsListeners=function(){"window"==i.interactivity.detect_on?i.interactivity.el=window:i.interactivity.el=i.canvas.el,(i.interactivity.events.onhover.enable||i.interactivity.events.onclick.enable)&&(i.interactivity.el.addEventListener("mousemove",function(e){if(i.interactivity.el==window)var a=e.clientX,t=e.clientY;else var a=e.offsetX||e.clientX,t=e.offsetY||e.clientY;i.interactivity.mouse.pos_x=a,i.interactivity.mouse.pos_y=t,i.tmp.retina&&(i.interactivity.mouse.pos_x*=i.canvas.pxratio,i.interactivity.mouse.pos_y*=i.canvas.pxratio),i.interactivity.status="mousemove"}),i.interactivity.el.addEventListener("mouseleave",function(e){i.interactivity.mouse.pos_x=null,i.interactivity.mouse.pos_y=null,i.interactivity.status="mouseleave"})),i.interactivity.events.onclick.enable&&i.interactivity.el.addEventListener("click",function(){if(i.interactivity.mouse.click_pos_x=i.interactivity.mouse.pos_x,i.interactivity.mouse.click_pos_y=i.interactivity.mouse.pos_y,i.interactivity.mouse.click_time=(new Date).getTime(),i.interactivity.events.onclick.enable)switch(i.interactivity.events.onclick.mode){case"push":i.particles.move.enable?i.fn.modes.pushParticles(i.interactivity.modes.push.particles_nb,i.interactivity.mouse):1==i.interactivity.modes.push.particles_nb?i.fn.modes.pushParticles(i.interactivity.modes.push.particles_nb,i.interactivity.mouse):i.interactivity.modes.push.particles_nb>1&&i.fn.modes.pushParticles(i.interactivity.modes.push.particles_nb);break;case"remove":i.fn.modes.removeParticles(i.interactivity.modes.remove.particles_nb);break;case"bubble":i.tmp.bubble_clicking=!0;break;case"repulse":i.tmp.repulse_clicking=!0,i.tmp.repulse_count=0,i.tmp.repulse_finish=!1,setTimeout(function(){i.tmp.repulse_clicking=!1},1e3*i.interactivity.modes.repulse.duration)}})},i.fn.vendors.densityAutoParticles=function(){if(i.particles.number.density.enable){var e=i.canvas.el.width*i.canvas.el.height/1e3;i.tmp.retina&&(e/=2*i.canvas.pxratio);var a=e*i.particles.number.value/i.particles.number.density.value_area,t=i.particles.array.length-a;0>t?i.fn.modes.pushParticles(Math.abs(t)):i.fn.modes.removeParticles(t)}},i.fn.vendors.checkOverlap=function(e,a){for(var t=0;t<i.particles.array.length;t++){var s=i.particles.array[t],n=e.x-s.x,r=e.y-s.y,c=Math.sqrt(n*n+r*r);c<=e.radius+s.radius&&(e.x=a?a.x:Math.random()*i.canvas.w,e.y=a?a.y:Math.random()*i.canvas.h,i.fn.vendors.checkOverlap(e))}},i.fn.vendors.createSvgImg=function(e){var a=i.tmp.source_svg,t=/#([0-9A-F]{3,6})/gi,s=a.replace(t,function(a,t,i,s){if(e.color.rgb)var n="rgba("+e.color.rgb.r+","+e.color.rgb.g+","+e.color.rgb.b+","+e.opacity+")";else var n="hsla("+e.color.hsl.h+","+e.color.hsl.s+"%,"+e.color.hsl.l+"%,"+e.opacity+")";return n}),n=new Blob([s],{type:"image/svg+xml;charset=utf-8"}),r=window.URL||window.webkitURL||window,c=r.createObjectURL(n),o=new Image;o.addEventListener("load",function(){e.img.obj=o,e.img.loaded=!0,r.revokeObjectURL(c),i.tmp.count_svg++}),o.src=c},i.fn.vendors.destroypJS=function(){cancelAnimationFrame(i.fn.drawAnimFrame),t.remove(),pJSDom=null},i.fn.vendors.drawShape=function(e,a,t,i,s,n){var r=s*n,c=s/n,o=180*(c-2)/c,l=Math.PI-Math.PI*o/180;e.save(),e.beginPath(),e.translate(a,t),e.moveTo(0,0);for(var v=0;r>v;v++)e.lineTo(i,0),e.translate(i,0),e.rotate(l);e.fill(),e.restore()},i.fn.vendors.exportImg=function(){window.open(i.canvas.el.toDataURL("image/png"),"_blank")},i.fn.vendors.loadImg=function(e){if(i.tmp.img_error=void 0,""!=i.particles.shape.image.src)if("svg"==e){var a=new XMLHttpRequest;a.open("GET",i.particles.shape.image.src),a.onreadystatechange=function(e){4==a.readyState&&(200==a.status?(i.tmp.source_svg=e.currentTarget.response,i.fn.vendors.checkBeforeDraw()):(console.log("Error pJS - Image not found"),i.tmp.img_error=!0))},a.send()}else{var t=new Image;t.addEventListener("load",function(){i.tmp.img_obj=t,i.fn.vendors.checkBeforeDraw()}),t.src=i.particles.shape.image.src}else console.log("Error pJS - No image.src"),i.tmp.img_error=!0},i.fn.vendors.draw=function(){"image"==i.particles.shape.type?"svg"==i.tmp.img_type?i.tmp.count_svg>=i.particles.number.value?(i.fn.particlesDraw(),i.particles.move.enable?i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw):cancelRequestAnimFrame(i.fn.drawAnimFrame)):i.tmp.img_error||(i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw)):void 0!=i.tmp.img_obj?(i.fn.particlesDraw(),i.particles.move.enable?i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw):cancelRequestAnimFrame(i.fn.drawAnimFrame)):i.tmp.img_error||(i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw)):(i.fn.particlesDraw(),i.particles.move.enable?i.fn.drawAnimFrame=requestAnimFrame(i.fn.vendors.draw):cancelRequestAnimFrame(i.fn.drawAnimFrame))},i.fn.vendors.checkBeforeDraw=function(){"image"==i.particles.shape.type?"svg"==i.tmp.img_type&&void 0==i.tmp.source_svg?i.tmp.checkAnimFrame=requestAnimFrame(check):(cancelRequestAnimFrame(i.tmp.checkAnimFrame),i.tmp.img_error||(i.fn.vendors.init(),i.fn.vendors.draw())):(i.fn.vendors.init(),i.fn.vendors.draw())},i.fn.vendors.init=function(){i.fn.retinaInit(),i.fn.canvasInit(),i.fn.canvasSize(),i.fn.canvasPaint(),i.fn.particlesCreate(),i.fn.vendors.densityAutoParticles(),i.particles.line_linked.color_rgb_line=hexToRgb(i.particles.line_linked.color)},i.fn.vendors.start=function(){isInArray("image",i.particles.shape.type)?(i.tmp.img_type=i.particles.shape.image.src.substr(i.particles.shape.image.src.length-3),i.fn.vendors.loadImg(i.tmp.img_type)):i.fn.vendors.checkBeforeDraw()},i.fn.vendors.eventsListeners(),i.fn.vendors.start()};Object.deepExtend=function(e,a){for(var t in a)a[t]&&a[t].constructor&&a[t].constructor===Object?(e[t]=e[t]||{},arguments.callee(e[t],a[t])):e[t]=a[t];return e},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)}}(),window.cancelRequestAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelRequestAnimationFrame||window.mozCancelRequestAnimationFrame||window.oCancelRequestAnimationFrame||window.msCancelRequestAnimationFrame||clearTimeout}(),window.pJSDom=[],window.particlesJS=function(e,a){"string"!=typeof e&&(a=e,e="particles-js"),e||(e="particles-js");var t=document.getElementById(e),i="particles-js-canvas-el",s=t.getElementsByClassName(i);if(s.length)for(;s.length>0;)t.removeChild(s[0]);var n=document.createElement("canvas");n.className=i,n.style.width="100%",n.style.height="100%";var r=document.getElementById(e).appendChild(n);null!=r&&pJSDom.push(new pJS(e,a))},window.particlesJS.load=function(e,a,t){var i=new XMLHttpRequest;i.open("GET",a),i.onreadystatechange=function(a){if(4==i.readyState)if(200==i.status){var s=JSON.parse(a.currentTarget.response);window.particlesJS(e,s),t&&t()}else console.log("Error pJS - XMLHttpRequest status: "+i.status),console.log("Error pJS - File config not found")},i.send()};
\ No newline at end of file diff --git a/js/loader-animation.js b/js/loader-animation.js new file mode 100644 index 0000000..ac6f9a8 --- /dev/null +++ b/js/loader-animation.js @@ -0,0 +1,4 @@ +// LOADER ANIMATION +$(window).on("load", function () { + $(".loader-wrapper").fadeOut("slow"); +})
\ No newline at end of file diff --git a/js/performance-stats.js b/js/performance-stats.js new file mode 100644 index 0000000..f9762d8 --- /dev/null +++ b/js/performance-stats.js @@ -0,0 +1,26 @@ +var stats = new Stats(); +stats.setMode(0); +document.body.appendChild(stats.domElement); + +var canvas = document.createElement('canvas'); +canvas.width = 512; +canvas.height = 512; +document.body.appendChild(canvas); + +var context = canvas.getContext('2d'); +context.fillStyle = 'rgba(127,0,255,0.05)'; +setInterval(function () { + var time = Date.now() * 0.001; + context.clearRect(0, 0, 512, 512); + stats.begin(); + for (var i = 0; i < 2000; i++) { + var x = Math.cos(time + i * 0.01) * 196 + 256; + var y = Math.sin(time + i * 0.01234) * 196 + 256; + context.beginPath(); + context.arc(x, y, 10, 0, Math.PI * 2, true); + context.fill(); + // DO NOT ENABLE THIS LMAO + // document.write("Text to display."); + } + stats.end(); +}, 1000 / 60);
\ No newline at end of file diff --git a/js/redirect-to-desktop.js b/js/redirect-to-desktop.js new file mode 100644 index 0000000..854cff9 --- /dev/null +++ b/js/redirect-to-desktop.js @@ -0,0 +1,4 @@ +// CHECKS IF USER IS ON DESKTOP +if (screen.width > 768) { + location.href = '/'; +} diff --git a/js/redirect-to-mobile.js b/js/redirect-to-mobile.js new file mode 100644 index 0000000..cae39a9 --- /dev/null +++ b/js/redirect-to-mobile.js @@ -0,0 +1,4 @@ +// CHECKS IF USER IS ON MOBILE +if (screen.width < 768) { + location.href = '/'; +} diff --git a/js/redirect-to-root.js b/js/redirect-to-root.js new file mode 100644 index 0000000..81d4873 --- /dev/null +++ b/js/redirect-to-root.js @@ -0,0 +1 @@ +location.href = "/" diff --git a/js/refresh-on-media.js b/js/refresh-on-media.js new file mode 100644 index 0000000..76bb6da --- /dev/null +++ b/js/refresh-on-media.js @@ -0,0 +1,24 @@ +var context; +var $window = $(window); + +// run this right away to set context +if ($window.width() <= 768) { + context = 'small'; +} else if (768 < $window.width() < 970) { + context = 'medium'; +} else { + context = 'large'; +} + +// refresh the page only if you're crossing into a context +// that isn't already set +$(window).resize(function() { + if(($window.width() <= 768) && (context != 'small')) { + //refresh the page + location.reload(); + } else if ((768 < $window.width() < 970) && (context != 'medium')) { + location.reload(); + } else if (context != 'large') { + location.reload(); + } +}); diff --git a/keycodes/index.html b/keycodes/index.html new file mode 100644 index 0000000..4de6118 --- /dev/null +++ b/keycodes/index.html @@ -0,0 +1,176 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - Keycodes</title> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <!-- Site metadata --> + <meta name="description" content="Keycodes"> + <meta property="og:description" content="Keycodes"> + <meta property="og:title" content="s1nical - Keycodes"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/keycodes"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/keycodes"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "Keycodes", + "headline": "Keycodes", + "url": "https://cyne.cf/keycodes", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <!-- External Libraries --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/trianglify/0.3.1/trianglify.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <!-- CSS Links --> + <link rel="stylesheet" href="/about/css/main.css"> + <link rel="stylesheet" href="/about/css/navigation-bar.css"> + <link rel="stylesheet" href="/about/css/loader-animation.css"> + <link rel="stylesheet" href="/about/css/blog-slider.css"> + <link rel="stylesheet" href="/404/css/main.css"> + <!-- Invisible Scripts --> + <script src="/js/loader-animation.js"></script> + <script src="/js/refresh-on-media.js"></script> +</head> + + <body> + <!-- Visable Scripts --> + <script src="/js/background-sparkles.js"></script> + + <!-- Navigation Bar --> + <div class="navigation-bar"> + <nav class="nav"> + <a href="/home/" class="nav-item" active-color="orange">Home</a> + <!-- Had `is-active` after it but removed it due to not highlighting. --> + <a href="/about/" class="nav-item" active-color="green">About</a> <!-- About --> + <!--<a href="https://p.s1n.pw/" class="nav-item" active-color="blue">Portfolio</a> <!-- Testimonials --> + <a href="https://cyne.cf/status" class="nav-item" active-color="red">Status</a> <!-- Blog --> + <!--<a href="/cars/" class="nav-item" active-color="rebeccapurple">Cars</a> <!-- Contact --> + <!--<a href="https://nani.s1n.pw" class="nav-item" active-color="rebeccapurple">Nani?!</a>--> + <span class="nav-indicator"></span> + </nav> + </div> + + <style> + .keycodes-parent { + height: 100%; + text-align: center; + line-height: 1.4; + font-size: 25px; + } + + pre { + text-align: left; + } + </style> + + <script> + document.addEventListener("keydown", function(event) { + + console.log(event); + + document.getElementById("keycodes").innerHTML = ` + <!-- + <b>which: ${event.which}</b> + <br> --> + <b>keyCode:</b> ${event.keyCode} + <br> + <b>shiftKey:</b> ${event.shiftKey} + </br> + <b>altKey:</b> ${event.altKey} + <br> + <b>ctrlKey:</b> ${event.ctrlKey} + <br> + <b>metaKey:</b> ${event.metaKey} + <br> + <b>key:</b> ${event.key} + `; + + }); + + $(window).on('keydown', function () { + if (event.keyCode == 123, 112, 114, 116) + return false; + else if (event.ctrlKey && event.shiftKey && event.keyCode == 73) + return false; + else if (event.ctrlKey && event.keyCode == 73) + return false; + else if (event.ctrlKey && event.shiftKey && event.keyCode == 74) + return false; + else if (event.ctrlKey && event.keyCode == 74) + return false; + }); + </script> + + <div class="bio"> + <div class="links"> + <div class="blog-slider"> + <div class="content" style="text-align: center;"> + <div class="keycodes-parent"> + <span id="keycodes"> + <b>keyCode:</b> NaN<br> + <b>shiftKey:</b> NaN<br> + <b>altKey:</b> NaN<br> + <b>ctrlKey:</b> NaN<br> + <b>metaKey:</b> NaN<br> + <b>key:</b> NaN + </span> + </div> + <a class="mobile" href="/home/">Back home</a> + <h1 class="mobile"> + <!-- Filler --> + </h1> + </div> + </div> + </div> + </div> + + <!-- Loading Animation --> + <div class="loader-wrapper"> + <div class="loader"> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + </div> + </div> + </body> + +</html> diff --git a/konami/.htaccess b/konami/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/konami/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/konami/assets/audio/midi.mp3 b/konami/assets/audio/midi.mp3 Binary files differnew file mode 100644 index 0000000..2f6bbe4 --- /dev/null +++ b/konami/assets/audio/midi.mp3 diff --git a/konami/assets/audio/midi.mp3.txt b/konami/assets/audio/midi.mp3.txt new file mode 100644 index 0000000..3b8e91b --- /dev/null +++ b/konami/assets/audio/midi.mp3.txt @@ -0,0 +1,31 @@ + // CREDITS: // + +Title: The Classics - A New Retro Synthwave Mix + +Uploader: Confused Bi-Product of a Misinformed Culture + +YouTube Video Link: https://www.youtube.com/watch?v=5WVhdmNiuuM&t=76s + +Full Credits of ALL Artists: +00:00 - LazerHawk - Space is the Place +01:57 - Tokyo Rose - Need For Speed +04:08 - Daniel Deluxe - Night Stalker +06:37 - OGRE - Negotiation's Over +07:35 - Tokyo Rose - Tokyo Burnout +09:30 - Dynatron - Rise to the Stars +13:13 - LazerHawk - Electric Groove +17:55 - Arcade High - Outrun This! +20:53 - Zombie Hyperdrive - Red Eyes +24:07 - Dynatron - Propulsion Overdrive +26:56 - d.notive - Hell's Highway +28:14 - Grum - Power +30:31 - Dynatron - Unquestionable Judgment +35:10 - OGRE - The Bench +38:07 - DANCE WITH THE DEAD - Venom +40:28 - Danger Mode - Road Rage +43:42 - LazerHawk - King of the Streets +46:27 - Wice - Cruise Control +49:41 - KN1GHT - Osaka +53:37 - Trevor Something - Miami Nights + +Note: I cut the track at 10:00 minutes, so the credits of the artists exceed my track limit, I just wanted to include everyone.
\ No newline at end of file diff --git a/konami/assets/bg/bg.gif b/konami/assets/bg/bg.gif Binary files differnew file mode 100644 index 0000000..29f21e8 --- /dev/null +++ b/konami/assets/bg/bg.gif diff --git a/konami/assets/images/Email2.gif b/konami/assets/images/Email2.gif Binary files differnew file mode 100644 index 0000000..bfbcaad --- /dev/null +++ b/konami/assets/images/Email2.gif diff --git a/konami/assets/images/bullet.png b/konami/assets/images/bullet.png Binary files differnew file mode 100644 index 0000000..d234fc2 --- /dev/null +++ b/konami/assets/images/bullet.png diff --git a/konami/assets/images/cd-rom.gif b/konami/assets/images/cd-rom.gif Binary files differnew file mode 100644 index 0000000..9bbfb95 --- /dev/null +++ b/konami/assets/images/cd-rom.gif diff --git a/konami/assets/images/geoshape.gif b/konami/assets/images/geoshape.gif Binary files differnew file mode 100644 index 0000000..2e6b5c2 --- /dev/null +++ b/konami/assets/images/geoshape.gif diff --git a/konami/assets/images/small-spinning-globe3.gif b/konami/assets/images/small-spinning-globe3.gif Binary files differnew file mode 100644 index 0000000..e562772 --- /dev/null +++ b/konami/assets/images/small-spinning-globe3.gif diff --git a/konami/assets/images/smiley face cursor.cur b/konami/assets/images/smiley face cursor.cur Binary files differnew file mode 100644 index 0000000..36fd0f2 --- /dev/null +++ b/konami/assets/images/smiley face cursor.cur diff --git a/konami/bypass/index.html b/konami/bypass/index.html new file mode 100644 index 0000000..a8d6824 --- /dev/null +++ b/konami/bypass/index.html @@ -0,0 +1,134 @@ +<!DOCTYPE html> +<html lang="en"> + + <head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <meta name="theme-color" content="#FFF"> + <title>s1nical - Landing Page</title> + <!-- External Libraries --> + <link href='https://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300,300italic,400italic' rel='stylesheet' type='text/css'> + <script src="https://cdnjs.cloudflare.com/ajax/libs/trianglify/0.3.1/trianglify.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <script src="https://rawgit.com/WeiChiaChang/Easter-egg/master/easter-eggs-collection.js"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css"></script> + <!-- CSS Links --> + <link rel="stylesheet" href="/konami/css/main.css"> + <!-- Invisable Scripts --> + <script src="/konami/js/main.js"></script> + <script src="/js/refresh-on-media.js"></script> + <!-- Site metadata --> + <meta name="description" content="Konami Archive Bypass"> + <meta property="og:description" content="Konami Archive Bypass"> + <meta property="og:title" content="s1nical - Landing Page"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/konami/bypass"> + <!-- Favicons --> + <link rel="apple-touch-icon" sizes="128x128" href="/konami/assets/images/small-spinning-globe3.gif"> + <link rel="icon" type="image/gif" href="/konami/assets/images/small-spinning-globe3.gif" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/konami/bypass"> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "Konami Archive Bypass", + "headline": "Konami Archive Bypass", + "url": "https://cyne.cf/konami/bypass", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/", + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/inter.css" + integrity="sha256-DyLTj16AbuvawyWJMPz4tJNp46iGflE/fWYAoU2IGpk=" crossorigin="anonymous"> + </head> + + <body> + + <!-- Navigation Bar --> + <div class="navigation-bar"> + <nav class="nav"> + <a href="/home/" class="nav-item" active-color="orange">Home</a> <!-- Had `is-active` after it but removed it due to not highlighting. --> + <a href="/about/" class="nav-item" active-color="green">About</a> + <a href="https://cyne.cf/status" class="nav-item" active-color="red">Status</a> + <a href="/directory/" class="nav-item" active-color="rebeccapurple">Directory</a> + <span class="nav-indicator"></span> + </nav> + </div> + + <!-- Core Site Function, Site Primer/ Base --> + <main> + <div class="links"> + <div class="email"> + <a href="mailto:[email protected]">s1nical</a><br> + Full-stack developer.<br><br> + </div> + <div class="twitter"> + Follow me on <a href="https://twitter.com/9inny">Twitter</a>. + </div> + <div class="github"> + View my code on <a href="https://github.com/8cy">GitHub</a>. + </div> + </div> + </main> + + <div class="ee"> + <!-- Toasty --> + <img class='toasty' src='https://s3-eu-west-1.amazonaws.com/wdildnproject2/toasty.png'> + <script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script> + + <!-- Marty --> + <audio class="marty" src="https://jigowatt.co.uk/wp-content/themes/client/dist/audio/marty.mp3" preload="auto"></audio> + <img class="marty" src="https://jigowatt.co.uk/wp-content/themes/client/dist/img/marty.png" alt="marty"> + + <!-- Doc --> + <audio class="docbrown" src="https://jigowatt.co.uk/wp-content/themes/client/dist/audio/docbrown.mp3" + preload="auto"></audio> + <img class="docbrown" src="https://jigowatt.co.uk/wp-content/themes/client/dist/img/docbrown.png" alt="doc"> + + <!-- Biff --> + <audio class="biff" src="https://jigowatt.co.uk/wp-content/themes/client/dist/audio/biff.mp3" preload="auto"></audio> + <img class="biff" src="https://jigowatt.co.uk/wp-content/themes/client/dist/img/biff.png" alt="biff"> + + <!-- Goldie --> + <audio class="goldie" src="https://jigowatt.co.uk/wp-content/themes/client/dist/audio/goldie.mp3" + preload="auto"></audio> + <img class="goldie" src="https://jigowatt.co.uk/wp-content/themes/client/dist/img/goldie.png" alt="goldie"> + </div> + + <!-- Background Music + // CREDITS: // + + Title: The Classics - A New Retro Synthwave Mix + + Uploader: Confused Bi-Product of a Misinformed Culture + + Full Credits: https://cyne.cf/konami/assets/audio/midi.mp3.txt + --> + <audio src="/konami/assets/audio/midi.mp3" autoplay id="music"> + <p>If you are reading this, it is because your browser does not support the audio element.</p> + <script> + var audio = document.getElementById("music"); + audio.volume = 0.1; // Volume Adjuster, might bind it to "- and +" one day if possible. + </script> + </audio> + + </body> + +</html>
\ No newline at end of file diff --git a/konami/css/main.css b/konami/css/main.css new file mode 100644 index 0000000..3826e15 --- /dev/null +++ b/konami/css/main.css @@ -0,0 +1,297 @@ +/* BACKGROUND SPARKLES CSS */ + +html, body { + margin: 0 0; + padding: 0 0; + text-align: center; + font-size: 0; + background: url(../assets/bg/bg.gif); + cursor: url(../assets/images/smiley\ face\ cursor.cur), default; + overflow-X: hidden; /* Toasty */ +} + +/* ORINGINAL SITE CSS */ +html { + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-tap-highlight-color: transparent; +} + +*, +*:before, +*:after { + -webkit-box-sizing: inherit; + box-sizing: inherit; +} + +html, body { + height: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row wrap; + flex-flow: row wrap; +} + +body { + font: normal 20px/1.4 'Inter', sans-serif; + margin: 0 1em; + padding: 1em 0; + color: red; + background: none; +} + +main { + font-size: 6vh; + line-height: 1.2; + max-width: 75vh; +} + +@media(max-width: 768px) { + main { + margin: auto; + width: 100%; + } +} + +.links a { + background-color: yellow; +} + +.email a:hover, +.email a:focus { + background: url(../assets/images/Email2.gif); + color: #fff; +} + +.twitter a:hover, +.twitter a:focus { + background: url(../assets/images/bullet.png); + color: #fff; +} + +.github a:hover, +.github a:focus { + background: url(../assets/images/geoshape.gif); + color: #fff; +} + +/* NAVIGATION MENU */ +.navigation-bar { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex: 1 0 100%; + flex: 1 0 100%; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +@media(max-width: 768px) { + .navigation-bar { + display: none; + } +} + +.nav { + overflow: hidden; + max-width: 100%; + background-image: linear-gradient(to right, red, orange, yellow, green, blue, indigo, violet); + padding: 0 20px; + position: absolute; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.nav-item { + color: none; + padding: 20px; + margin: 0 6px; + font-weight: 500; + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.nav-item:before { + content: ""; + position: absolute; + bottom: -6px; + left: 0; + width: 100%; + height: 70px; + background: url(../assets/images/cd-rom.gif); + opacity: 0; +} + +.nav-item:not(.is-active):hover:before { + opacity: 1; + bottom: 0; +} + +/* TOASTY */ + +.toasty { + position: absolute; + left: 110%; + bottom: 0; +} + +.flash { + animation: flash 1s linear infinite; +} + +.animateIn { + animation: 2s left forwards ease; +} + +.code { + text-align: center; + opacity: 0; + position: absolute; + top: calc(50% + 40px); + left: 50%; + transform: translate(-50%); + font-family: 'Open Sans Condensed', sans-serif; + font-size: 20px; + letter-spacing: 0.05em; + text-transform: uppercase; + border-bottom: 2px solid #333; + padding: 0 20px; + animation: fade 2.5s 7s forwards linear; +} + +@keyframes fade { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@keyframes left { + 0% { + left: 110%; + } + + 50% { + left: 80%; + } + + 100% { + left: 110%; + } +} + +@keyframes flash { + 0% { + border-right: none; + } + + 100% { + border-right: 0.08em solid #222; + } +} + +/* BIFF, MARTY, EMMETT, GOLDIE */ +.eggsfound { + background: red; + color: white; + font-weight: bold; + opacity: 0; + left: 50%; + position: fixed; + top: 0; + width: 300px; + margin-left: -150px; + z-index: -300; + transition: opacity 0.5s ease; + padding: 10px; + text-align: center; +} + +.eggsfound.animate { + opacity: 1; + z-index: 999; +} + +img.marty, +img.docbrown, +img.biff, +img.goldie { + bottom: -376px; + position: fixed; + right: 0; + transition: bottom 0.3s ease; + z-index: 9999; +} + +.marty-show img.marty, +.docbrown-show img.docbrown, +.biff-show img.biff, +.goldie-show img.goldie { + bottom: 0; +} + +p { + text-align: center; + font-weight: bold; + margin: 50vh 0 0 0; + font-family: sans-serif; +} + +@media(max-width: 768px) { + .ee { + display: none; + } +} + +/* To remove background sparkles on CSS switch. */ +svg { + display: none; +} + +/* CLAIRO */ +.clairo { + position: absolute; + top: 5px; + left: 5px; +} + +/* Mobile Spacing */ +@media(max-width: 411px) { + main { + margin: auto; + width: 76.21%; + } +}
\ No newline at end of file diff --git a/konami/index.html b/konami/index.html new file mode 100644 index 0000000..3e8013a --- /dev/null +++ b/konami/index.html @@ -0,0 +1,120 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - Konami</title> + <!-- Site metadata --> + <meta name="description" content="Konami Archive Bypass"> + <meta property="og:description" content="Konami Archive Bypass"> + <meta property="og:title" content="s1nical - Konami"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/konami"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/konami"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "Konami Archive Bypass", + "headline": "Konami Archive Bypass", + "url": "https://cyne.cf/konami", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <link rel="shortcut icon" href="/favicon.jpg" type="image/jpg"> + <!-- External Links --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/trianglify/0.3.1/trianglify.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <!-- CSS Links --> + <link rel="stylesheet" href="/about/css/main.css"> + <link rel="stylesheet" href="/about/css/navigation-bar.css"> + <link rel="stylesheet" href="/about/css/loader-animation.css"> + <link rel="stylesheet" href="/about/css/blog-slider.css"> + <link rel="stylesheet" href="/404/css/main.css"> + <!-- Invisible Scripts --> + <script src="/js/loader-animation.js"></script> + <script src="/js/refresh-on-media.js"></script> +</head> + + <body> + <!-- Visable Scripts --> + <script src="/js/background-sparkles.js"></script> + + <!-- Navigation Bar --> + <div class="navigation-bar"> + <nav class="nav"> + <a href="/home/" class="nav-item" active-color="orange">Home</a> + <!-- Had `is-active` after it but removed it due to not highlighting. --> + <a href="/about/" class="nav-item" active-color="green">About</a> <!-- About --> + <!--<a href="https://p.s1n.pw/" class="nav-item" active-color="blue">Portfolio</a> <!-- Testimonials --> + <a href="https://cyne.cf/status" class="nav-item" active-color="red">Status</a> <!-- Blog --> + <!--<a href="/cars/" class="nav-item" active-color="rebeccapurple">Cars</a> <!-- Contact --> + <!--<a href="https://nani.s1n.pw" class="nav-item" active-color="rebeccapurple">Nani?!</a>--> + <span class="nav-indicator"></span> + </nav> + </div> + + <div class="bio"> + <div class="links"> + <div class="blog-slider"> + <div class="content" style="text-align: center;"> + <h1>Are you sure?</h1> + <h2>You are entering a depreciated zone.</h2> + <h1> + <!-- Filler --> + </h1> + <a href="/konami/bypass/">Continue</a> + <h1> + <!-- Filler --> + </h1> + </div> + </div> + </div> + </div> + + <!-- Loading Animation --> + <div class="loader-wrapper"> + <div class="loader"> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + </div> + </div> + </body> + +</html> diff --git a/konami/js/main.js b/konami/js/main.js new file mode 100644 index 0000000..2933594 --- /dev/null +++ b/konami/js/main.js @@ -0,0 +1,220 @@ +// LOADER ANIMATION +$(window).on("load", function () { + console.log("UP, UP, DOWN, DOWN, LEFT, RIGHT, LEFT, RIGHT, B, A") + console.log("Biff, Marty, Emmett, Goldie") + console.log("pie, ufo, walk, cool, balloon, hangover, kirby, no, onmyway, haters, board, snorlax, fly, earth, thankyou, swim, penguin, handsome, tank, jump, winner, fox, mario, joker, rabbit, piggy, psyduck, dragon, salamander, airguitar, pikachu, bravo, ghost, britney, pikarun, catrun, koggy, sonic, doggy, spongebob, gun, money, bird, piqiu, lol, ohhh, nyancat") +}) + +// SCROLLING TITLE +var space = " "; +var speed = "60"; +var pos = 0; +var msg = "// s1n.ical // Landing Page "; + +function Scroll() { + document.title = msg.substring(pos, msg.length) + space + msg.substring(0, pos); + pos++; + if (pos > msg.length) pos = 0; + window.setTimeout("Scroll()", speed); +} +Scroll(); + +// KONAMI CODE FOR TOASTY + +// a key map of allowed keys +var allowedKeys = { + 37: 'left', + 38: 'up', + 39: 'right', + 40: 'down', + 65: 'a', + 66: 'b' +}; + +// the 'official' Konami Code sequence +var konamiCode = ['up', 'up', 'down', 'down', 'left', 'right', 'left', 'right', 'b', 'a']; + +// a variable to remember the 'position' the user has reached so far. +var konamiCodePosition = 0; + +// add keydown event listener +document.addEventListener('keydown', function (e) { + // get the value of the key code from the key map + var key = allowedKeys[e.keyCode]; + // get the value of the required key from the konami code + var requiredKey = konamiCode[konamiCodePosition]; + + // compare the key with the required key + if (key == requiredKey) { + + // move to the next key in the konami code sequence + konamiCodePosition++; + + // if the last key is reached, activate cheats + if (konamiCodePosition == konamiCode.length) { + activateCheats(); + konamiCodePosition = 0; + } + } else { + konamiCodePosition = 0; + } +}); + +function activateCheats() { + + var audio = new Audio('https://s3-eu-west-1.amazonaws.com/wdildnproject2/toasty.mp3'); + audio.play(); + + $('.toasty').addClass('animateIn'); + setTimeout(function () { + $('.toasty').removeClass('animateIn'); + }, 3500); +} + +var TxtRotate = function (el, toRotate, period) { + this.toRotate = toRotate; + this.el = el; + this.loopNum = 0; + this.period = parseInt(period, 10) || 2000; + this.txt = ''; + this.tick(); + this.isDeleting = false; +}; + +TxtRotate.prototype.tick = function () { + var i = this.loopNum % this.toRotate.length; + var fullTxt = this.toRotate[i]; + + if (this.isDeleting) { + this.txt = fullTxt.substring(0, this.txt.length - 1); + } else { + this.txt = fullTxt.substring(0, this.txt.length + 1); + } + + this.el.innerHTML = '<span class="wrap">' + this.txt + '</span>'; + + var that = this; + var delta = 300 - Math.random() * 100; + + + setTimeout(function () { + that.tick(); + }, delta); +}; + +window.onload = function () { + var elements = document.getElementsByClassName('txt-rotate'); + for (var i = 0; i < elements.length; i++) { + var toRotate = elements[i].getAttribute('data-rotate'); + var period = elements[i].getAttribute('data-period'); + if (toRotate) { + new TxtRotate(elements[i], JSON.parse(toRotate), period); + } + } +}; + +// BIFF, MARTY, EMMETT, GOLDIE + +// give $ to jQuery +(function ($) { + + /**============================================================== + * BTTF CHARACTER EASTER EGGS + * ============================================================== + */ + var characters = {}; + var pressedKeys = []; + + /** + * Plays the audio clip for a specific easter egg character + * @param {string} character name of character + */ + function playAudio(character) { + setTimeout(function () { + characters[character].audioFile.play(); + setTimeout(function () { + toggleShowChar(character); + updateEggs(); + }, characters[character].audioLength); + }, 300); + } + + /** + * Toggles the display of an easter egg character + * @param {string} character character name + */ + function toggleShowChar(character) { + $('body').toggleClass(characters[character].name + '-show'); + } + + /** + * Add characters' information once page loads + */ + $(document).ready(function () { + characters = { + 'guessed': [], + 'marty': { + 'name': 'marty', + 'nameKeys': "77,65,82,84,89", + 'audioFile': $('audio.marty')[0], + 'audioLength': 1300, + }, + 'docbrown': { + 'name': 'docbrown', + 'nameKeys': "69,77,77,69,84,84", + 'audioFile': $('audio.docbrown')[0], + 'audioLength': 2500, + }, + 'biff': { + 'name': 'biff', + 'nameKeys': "66,73,70,70", + 'audioFile': $('audio.biff')[0], + 'audioLength': 1100, + }, + 'goldie': { + 'name': 'goldie', + 'nameKeys': "71,79,76,68,73,69", + 'audioFile': $('audio.goldie')[0], + 'audioLength': 4000, + }, + 'toasty': { + 'name': 'toasty', + 'nameKeys': "84,79,65,83,84,89", + } + }; + }); + + /** + * Track character names being typed + */ + $(window).keydown(function (e) { + + pressedKeys.push(e.keyCode); + + // loop through characters + for (var character in characters) { + + // if the "pressedKeys" contains the current character name + if (pressedKeys.toString().indexOf(characters[character].nameKeys) >= 0) { + + // reset the pressedKeys array + pressedKeys = []; + + // add "show" class to animate the character in + toggleShowChar(character); + + if ($.inArray(character, characters.guessed) === -1) { + characters.guessed.push(character); + } + + // wait a second and play the character's audio file + playAudio(character); + } + } + + // reset pressedKeys at 50 keypresses to save memory + if (pressedKeys.length > 500) { pressedKeys = []; } + + }); + +})(jQuery);
\ No newline at end of file diff --git a/light-fluid-simulation/.htaccess b/light-fluid-simulation/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/light-fluid-simulation/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/light-fluid-simulation/css/main.css b/light-fluid-simulation/css/main.css new file mode 100644 index 0000000..32eefc3 --- /dev/null +++ b/light-fluid-simulation/css/main.css @@ -0,0 +1,25 @@ +@import url('https://fonts.googleapis.com/css?family=Open+Sans:600&display=swap'); + +* { + margin: 0; + border: 0; + box-sizing: + border-box; +} + +body { + + margin: 0; + position: fixed; + overflow: hidden; + background-color: #090d13; + user-select: none; + +} + +canvas { + + width: 100%; + height: 100%; + +}
\ No newline at end of file diff --git a/light-fluid-simulation/index.html b/light-fluid-simulation/index.html new file mode 100644 index 0000000..b6fbfa5 --- /dev/null +++ b/light-fluid-simulation/index.html @@ -0,0 +1,59 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - Light Fluid Simulation</title> + <!-- Site metadata --> + <meta name="description" content="Light Fluid Simulation"> + <meta property="og:description" content="Light Fluid Simulation"> + <meta property="og:title" content="s1nical - Light Fluid Simulation"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/light-fluid-simulation"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/light-fluid-simulation"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "Light Fluid Simulation", + "headline": "Light Fluid Simulation", + "url": "https://cyne.cf/light-fluid-simulation", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <!-- CSS Links --> + <link rel="stylesheet" href="/light-fluid-simulation/css/main.css"> + <!-- External Libraries --> + <script src="https://threejs.org/build/three.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> + <!-- Invisible Scripts --> +</head> + + <body> + <!-- Visable Scripts --> + <script src="/light-fluid-simulation/js/main.js"></script> + </body> + +</html>
\ No newline at end of file diff --git a/light-fluid-simulation/js/main.js b/light-fluid-simulation/js/main.js new file mode 100644 index 0000000..f6c81bd --- /dev/null +++ b/light-fluid-simulation/js/main.js @@ -0,0 +1,386 @@ +// +// shaders +// +const basic_vert = ` +precision highp float; + +void main() { + gl_Position = vec4( position, vec2(1.0) ); +} +`; + +const prep_frag = ` +precision highp float; + +void main() { + gl_FragColor.z = 0.012; +} +`; + +const physics_frag = ` +precision highp float; + +uniform vec3 mouse; +uniform vec3 pmouse; +uniform vec2 resolution; +uniform sampler2D texture; + +float distToSegment( vec2 x1, vec2 x2, vec2 p ) { + + vec2 v = x2 - x1; + vec2 w = p - x1; + + float c1 = dot(w,v); + float c2 = dot(v,v); + + // if c2 <= c1 == c1 + // if c2 > c1 == c2 + float div = mix( c2, c1, step( c2, c1 ) ); + + // if c1 < 0 == 0.0 + float mult = step( 0.0, c1 ); + + float b = c1 * mult / div; + vec2 pb = x1 + b*v; + + return distance( p, pb ); + +} + +vec3 computeNormal( vec4 n ) { + + // pixel scale + vec2 un = 1. / resolution; + vec2 uv = gl_FragCoord.xy * un; + + // tex sample neighbour-4; + vec3 n_r = texture2D( texture, uv + vec2( 1, 0 ) * un ).xyz; + vec3 n_l = texture2D( texture, uv - vec2( 1, 0 ) * un ).xyz; + vec3 n_u = texture2D( texture, uv + vec2( 0, 1 ) * un ).xyz; + vec3 n_d = texture2D( texture, uv - vec2( 0, 1 ) * un ).xyz; + + // partial differences n-4; + vec4 dn = vec4( n.z ); + dn -= vec4( n_r.z, n_l.z, n_u.z, n_d.z ); + + // right - left, up - down; + vec2 xy = vec2( dn.x - dn.y, dn.z - dn.w ); + xy += n_r.xy + n_l.xy + n_u.xy + n_d.xy; + xy *= 0.972; // energy dissipation + + float z; + z += dot( n_r.xy, - vec2( 1, 0 ) ); + z += dot( n_l.xy, + vec2( 1, 0 ) ); + z += dot( n_u.xy, - vec2( 0, 1 ) ); + z += dot( n_d.xy, + vec2( 0, 1 ) ); + + return vec3( xy , z ) * 0.25; + +} + + +void main() { + + vec2 uv = gl_FragCoord.xy / resolution; + float asp = resolution.x / resolution.y; // aspect + + // normal sampling + vec4 h = texture2D( texture, uv ); + + // previous velocity + float vel = h.a; + // apply elastic-viscous acceleration + // acc = - offset*elasticity - vel*viscosity + vel += - ( h.z - 0.012 ) * 0.016 - vel * 0.059; + + // compute normal advection + vec3 f = computeNormal( h ); + f.z += h.z + vel; + + // mouse interaction - continuous distance from mouse + float dist = distToSegment( + vec2( pmouse.x * asp, pmouse.y), // previous mouse + vec2( mouse.x * asp, mouse.y), // current mouse + vec2( uv.x * asp, uv.y) // fragcoord + ); + + float mSize = 0.065; // mouse radius + float peak = 0.9; // max-height + + float isDisp = step( 0.5, mouse.z ); // is displaced + + if ( mouse.z > 0.5 && dist <= mSize ) { + + float dst = ( mSize - dist ) / mSize; + f.z += pow( abs(dst), 1.9 ) * peak * 2.5; + f.xy -= f.xy * pow( abs(dst), 3.9 ) * 0.1; + f.z = min( peak, f.z ); + + } + + gl_FragColor = clamp( vec4( f, vel ), -1.0, 1.0); + +} +`; + +const light_frag = ` +precision highp float; + +#define RECIPROCAL_PI 0.31830988618 + +uniform vec2 resolution; +uniform sampler2D texture; + +float rand(vec2 co){ + return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); +} + +// based on https://www.shadertoy.com/view/MslGR8 +vec3 dithering( vec3 color ) { + //Calculate grid position + float grid_position = rand( gl_FragCoord.xy ); + //Shift the individual colors differently, thus making it even harder to see the dithering pattern + vec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 ); + //modify shift acording to grid position. + dither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position ); + //shift the color by dither_shift + return color + dither_shift_RGB; +} + +void main() { + + vec2 uv = gl_FragCoord.xy / resolution.xy; + + vec3 N = texture2D( texture, uv ).xyz; + + vec3 viewPos = vec3( 0.0, 0.0, 1.2 ); + vec3 lightPos = vec3( 0.0, 1.5, 0.98 ); + vec3 fragPos = vec3( ( 2.0 * uv - 1.0 ), N.z ); + + vec3 L = normalize( lightPos - fragPos ); + vec3 H = normalize( L + normalize( viewPos - fragPos ) ); + vec3 dN = vec3( N.xy, N.z/2.0 + 0.28 ); + + float dif = max( dot( dN, L ), 0.0 ); + float spec = clamp( dot( normalize(N), H ), 0.0, 1.0 ); + + float attenuation = 1.0 - length( lightPos - fragPos ) / 3.1; + vec3 dif_int = vec3( dif * 0.056 * attenuation ); + + float shininess = 4.8; + float ref = RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( spec, shininess ); + vec3 spec_int = vec3( ref * 0.38 * pow( attenuation, 3.0 ) ); + + vec3 col = dif_int + spec_int; + + col = pow( col, vec3( 1.0 / 2.2 ) ); + + col.r = mix( col.r * 1.28, col.r, length( dif_int ) * 1.2 / 3.0 ); + // col += 0.045; + + gl_FragColor = vec4( dithering(col), 1.0 ); + +} +`; + + +// +// three.js setup +// +const w = window.innerWidth; +const h = window.innerHeight; +const res = new THREE.Vector2(w, h); +const mousecoord = new THREE.Vector3(); +const mouse = new THREE.Vector3(); +const pmouse = new THREE.Vector3(); + +var renderer = new THREE.WebGLRenderer(); +renderer.setSize(w, h); +document.body.appendChild(renderer.domElement); + +const scene = new THREE.Scene(); +const camera = new THREE.Camera(); + + +// render targets +let rtt = new THREE.WebGLRenderTarget(w, h, { + minFilter: THREE.LinearFilter, + magFilter: THREE.LinearFilter, + format: THREE.RGBAFormat, + type: (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) ? THREE.HalfFloatType : THREE.FloatType, + depthTest: false, + depthBuffer: false, + stencilBuffer: false +}); + +let rtt2 = rtt.clone(); + + +// +// materials +// +const copyMaterial = new THREE.ShaderMaterial({ + vertexShader: basic_vert, + fragmentShader: prep_frag, + blending: THREE.NoBlending, + transparent: false, + fog: false, + lights: false, + depthWrite: false, + depthTest: false +}); + +const physicsMaterial = new THREE.ShaderMaterial({ + uniforms: { + mouse: { type: 'v3', value: mouse }, + pmouse: { type: 'v3', value: pmouse }, + resolution: { type: 'v2', value: res }, + texture: { type: 't' }, + }, + vertexShader: basic_vert, + fragmentShader: physics_frag, + blending: THREE.NoBlending, + transparent: false, + fog: false, + lights: false, + depthWrite: false, + depthTest: false +}); + +const lightsMaterial = new THREE.ShaderMaterial({ + uniforms: { + resolution: { type: 'v2', value: res }, + texture: { type: 't' }, + }, + vertexShader: basic_vert, + fragmentShader: light_frag, + blending: THREE.NoBlending, + transparent: false, + fog: false, + lights: false, + depthWrite: false, + depthTest: false +}); + + +// +// mesh setup +// +const geometry = new THREE.BufferGeometry(); +const vertices = new Float32Array([ + -1.0, -1.0, + 3.0, -1.0, + -1.0, 3.0 +]); + +geometry.addAttribute('position', new THREE.BufferAttribute(vertices, 2)); + +mesh = new THREE.Mesh(geometry, copyMaterial); +mesh.frustumCulled = false; +scene.add(mesh); + + +// +// pre-render to rtt +// + +renderer.setRenderTarget(rtt); +renderer.render(scene, camera); + +renderer.setRenderTarget(rtt2); +renderer.render(scene, camera); + +mesh.material = physicsMaterial; + + +// +// listeners +// + +renderer.domElement.addEventListener('mousemove', mousemove); +renderer.domElement.addEventListener('mouseout', mouseout); + +renderer.domElement.addEventListener('touchmove', touch); +renderer.domElement.addEventListener('touchstart', touch); +renderer.domElement.addEventListener('touchend', touchend); + +window.addEventListener('resize', resize); + +renderer.setAnimationLoop(function () { + + render(); + +}); + +function render() { + + const tmp = rtt; + rtt = rtt2; + rtt2 = tmp; + + pmouse.copy(mouse); + mouse.copy(mousecoord); + + if (pmouse.z == 0) pmouse.copy(mouse); + + mesh.material = physicsMaterial; + mesh.material.uniforms.texture.value = rtt2.texture; + + renderer.setRenderTarget(rtt); + renderer.render(scene, camera); + + mesh.material = lightsMaterial; + mesh.material.uniforms.texture.value = rtt.texture; + + renderer.setRenderTarget(null); + renderer.render(scene, camera); + +} + +function resize() { + + const h = window.innerHeight; + const w = window.innerWidth; + + res.set(w, h); + + camera.aspect = w / h; + + rtt.setSize(w, h); + rtt2.setSize(w, h); + + renderer.setSize(w, h); + +} + +function mousemove(evt) { + + mousecoord.x = evt.pageX / window.innerWidth; + mousecoord.y = 1 - (evt.pageY / window.innerHeight); + mousecoord.z = 1; + +} + + +function mouseout(evt) { + + mousecoord.z = 0; + +} + +function touch(evt) { + + evt.preventDefault(); + + mousecoord.x = evt.touches[0].pageX / window.innerWidth; + mousecoord.y = 1 - evt.touches[0].pageY / window.innerHeight; + mousecoord.z = 1; + +} + + +function touchend(evt) { + + mousecoord.z = 0; + +}
\ No newline at end of file diff --git a/links/.htaccess b/links/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/links/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/links/assets/silence.mp3 b/links/assets/silence.mp3 Binary files differnew file mode 100644 index 0000000..16de7c3 --- /dev/null +++ b/links/assets/silence.mp3 diff --git a/links/css/main.css b/links/css/main.css new file mode 100644 index 0000000..6050ca8 --- /dev/null +++ b/links/css/main.css @@ -0,0 +1,52 @@ +html { + background: black; +} + +.main { + color: #fff; + font-family: Helvetica,"Helvetica Neue",Arial,"Lucida Grande", sans-serif; + text-align: center; + z-index: 1; + margin: auto; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +a:hover { + letter-spacing: 2px; + transition: .5s +} + +#bld:hover { + letter-spacing: 4px; +} + +a { + transition: .5s; + text-decoration: none; + color: #fff; +} + +#vid { + position: fixed; + min-width: 103%; + min-height: 103%; + opacity: 1; + width: auto; + height: auto; + z-index: -100; + transform: translateX(-50%) translateY(-50%); + background-size: cover; + overflow: hidden; + -webkit-filter: blur(15px); + -moz-filter: blur(15px); + -o-filter: blur(15px); + -ms-filter: blur(15px); + filter: blur(15px); + background: rgba(7, 9, 21, .5); + filter: brightness(42.5%); + top: 50%; + left: 50% +}
\ No newline at end of file diff --git a/links/index.html b/links/index.html new file mode 100644 index 0000000..a01c81a --- /dev/null +++ b/links/index.html @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<html lang="en"> + + <head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - Links</title> + <link href="data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAAF0lEQVRIx2NgGAWjYBSMglEwCkbBSAcACBAAAeaR9cIAAAAASUVORK5CYII=" rel="icon" type="image/x-icon"> + <!-- CSS Links --> + <link rel="stylesheet" href="/links/css/main.css"> + <link rel="stylesheet" href="/css/no-text-highlighting.css"> + <!-- External Libraries --> + <script src="https://code.jquery.com/jquery-3.1.1.js"></script> + <!-- Invisible Script --> + <script src="/js/hide-context-menu.js"></script> + <script src="/links/js/main.js"></script> + </head> + + <body> + <!-- Visable Script --> + + <div class="main"> + <div class="txt"> + <a id="bld" style="font-weight: 700; font-size: 40px;" href="#">s1n</a> + + <div class="light" style="font-weight: 500;"> + <a href="/home/">/index</a><br> + <a href="/oauth2/">/oauth2</a> + </div> + </div> + </div> + + <iframe src="silence.mp3" allow="autoplay" id="audio" style="display:none"></iframe> + <video playsinline autoplay loop id="vid"> + <source src="/links/assets/vid.mp4" type="video/mp4"> + </source> + <script> + var video = document.currentScript.parentElement; + video.volume = 0.333; + </script> + </video> + </body> + +</html> diff --git a/links/js/main.js b/links/js/main.js new file mode 100644 index 0000000..49ec780 --- /dev/null +++ b/links/js/main.js @@ -0,0 +1,12 @@ +$(window).on('keydown', function () { + if (event.keyCode == 123) + return false; + else if (event.ctrlKey && event.shiftKey && event.keyCode == 73) + return false; + else if (event.ctrlKey && event.keyCode == 73) + return false; + else if (event.ctrlKey && event.shiftKey && event.keyCode == 74) + return false; + else if (event.ctrlKey && event.keyCode == 74) + return false; +});
\ No newline at end of file diff --git a/login.php b/login.php new file mode 100644 index 0000000..f736429 --- /dev/null +++ b/login.php @@ -0,0 +1,101 @@ +<?php + /* Your password */ + $password = 'KONAMI'; + + /* Redirects here after login */ + $redirect_after_login = '/'; + + /* Will not ask password again for */ + $remember_password = strtotime('+30 days'); // 30 days + + if (isset($_POST['password']) && $_POST['password'] == $password) { + setcookie("password", $password, $remember_password); + header('Location: ' . $redirect_after_login); + // include 'visitors.php'; + exit; + } +?> + +<!DOCTYPE html> +<html lang="en"> + + <head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - Login</title> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <!-- External Libraries --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/trianglify/0.3.1/trianglify.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <!-- CSS Links --> + <link rel="stylesheet" href="/about/css/main.css"> + <link rel="stylesheet" href="/about/css/navigation-bar.css"> + <link rel="stylesheet" href="/about/css/loader-animation.css"> + <link rel="stylesheet" href="/about/css/blog-slider.css"> + <link rel="stylesheet" href="/404/css/main.css"> + <!-- Invisible Scripts --> + <script src="/js/loader-animation.js"></script> + <script src="/js/refresh-on-media.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> + </head> + + <body> + <!-- Visable Scripts --> + <script src="/js/background-sparkles.js"></script> + + <!-- Navigation Bar --> + <div class="navigation-bar"> + <nav class="nav"> + <a href="/home/" class="nav-item" active-color="orange">Home</a> + <!-- Had `is-active` after it but removed it due to not highlighting. --> + <a href="/about/" class="nav-item" active-color="green">About</a> <!-- About --> + <a href="https://p.s1n.pw/" class="nav-item" active-color="blue">Portfolio</a> <!-- Testimonials --> + <a href="http://status.maldrama.ml" class="nav-item" active-color="red">Status</a> <!-- Blog --> + <!--<a href="/cars/" class="nav-item" active-color="rebeccapurple">Cars</a> <!-- Contact --> + <!--<a href="https://nani.s1n.pw" class="nav-item" active-color="rebeccapurple">Nani?!</a>--> + <span class="nav-indicator"></span> + </nav> + </div> + + <div class="bio"> + <div class="links"> + <div class="blog-slider"> + <div class="content" style="text-align: center;"> + <h2 style="font-size: 20px">You must enter the password to view this content.</h1> + <form method="POST"> + <input type="password" name="password"> + </form> + </div> + <h1><!-- Filler --></h1> + <center><a class="mobile" href="/home/">Back home</a></center> + <h1 class="mobile"><!-- Filler --></h1> + </div> + </div> + </div> + </div> + + <!-- Loading Animation --> + <div class="loader-wrapper"> + <div class="loader"> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + </div> + </div> + </body> + +</html> diff --git a/maldrama.cc/.htaccess b/maldrama.cc/.htaccess new file mode 100644 index 0000000..bb1e0d5 --- /dev/null +++ b/maldrama.cc/.htaccess @@ -0,0 +1,8 @@ +SetEnvIfNoCase User-Agent "6WBrTsAH3Bz3f!+LQk5RDEmZVFbQ%T&W&-f%smYnE$g!8CugR4h#TagFv=*$g82_DZgt+6nWS=P*Jd*3HaBzp$Cqqja5ewR?TPmgphsprUHayB%Y6G#Ad+urqBhne4cG" good_bot + <FilesMatch ".dll"> + Order Deny,Allow + Deny from All + Allow from env=good_bot + </FilesMatch> + + Options -Indexes
\ No newline at end of file diff --git a/maldrama.cc/assets/icons/maldrama.jpg b/maldrama.cc/assets/icons/maldrama.jpg Binary files differnew file mode 100644 index 0000000..2b766e6 --- /dev/null +++ b/maldrama.cc/assets/icons/maldrama.jpg diff --git a/maldrama.cc/assets/icons/roses/rose1.jpg b/maldrama.cc/assets/icons/roses/rose1.jpg Binary files differnew file mode 100644 index 0000000..568801b --- /dev/null +++ b/maldrama.cc/assets/icons/roses/rose1.jpg diff --git a/maldrama.cc/assets/icons/roses/rose2.jpg b/maldrama.cc/assets/icons/roses/rose2.jpg Binary files differnew file mode 100644 index 0000000..abdf956 --- /dev/null +++ b/maldrama.cc/assets/icons/roses/rose2.jpg diff --git a/maldrama.cc/assets/icons/roses/rose3.jpg b/maldrama.cc/assets/icons/roses/rose3.jpg Binary files differnew file mode 100644 index 0000000..9ac84bd --- /dev/null +++ b/maldrama.cc/assets/icons/roses/rose3.jpg diff --git a/maldrama.cc/assets/icons/roses/rose4.jpg b/maldrama.cc/assets/icons/roses/rose4.jpg Binary files differnew file mode 100644 index 0000000..8f26620 --- /dev/null +++ b/maldrama.cc/assets/icons/roses/rose4.jpg diff --git a/maldrama.cc/assets/icons/roses/rose5.jpg b/maldrama.cc/assets/icons/roses/rose5.jpg Binary files differnew file mode 100644 index 0000000..161673b --- /dev/null +++ b/maldrama.cc/assets/icons/roses/rose5.jpg diff --git a/maldrama.cc/assets/icons/roses/rose6.jpg b/maldrama.cc/assets/icons/roses/rose6.jpg Binary files differnew file mode 100644 index 0000000..befdce9 --- /dev/null +++ b/maldrama.cc/assets/icons/roses/rose6.jpg diff --git a/maldrama.cc/assets/icons/roses/rose7.jpg b/maldrama.cc/assets/icons/roses/rose7.jpg Binary files differnew file mode 100644 index 0000000..2b766e6 --- /dev/null +++ b/maldrama.cc/assets/icons/roses/rose7.jpg diff --git a/maldrama.cc/assets/icons/roses/rose8.jpg b/maldrama.cc/assets/icons/roses/rose8.jpg Binary files differnew file mode 100644 index 0000000..f0275ee --- /dev/null +++ b/maldrama.cc/assets/icons/roses/rose8.jpg diff --git a/maldrama.cc/assets/images/mobile-background.jpg b/maldrama.cc/assets/images/mobile-background.jpg Binary files differnew file mode 100644 index 0000000..74b03cd --- /dev/null +++ b/maldrama.cc/assets/images/mobile-background.jpg diff --git a/maldrama.cc/assets/javascript/analytics.js b/maldrama.cc/assets/javascript/analytics.js new file mode 100644 index 0000000..54da9b2 --- /dev/null +++ b/maldrama.cc/assets/javascript/analytics.js @@ -0,0 +1,7 @@ +// !function(o,b,n,x,i,u,s){o.GoogleAnalyticsObject=n;o[n]||(o[n]=function(){ +// (o[n].q=o[n].q||[]).push(arguments)});o[n].x=+new Date;u=b.createElement(x); +// s=b.getElementsByTagName(x)[0];u.src=i;s.parentNode.insertBefore(u,s)} +// (window,document,'ga','script','https://www.google-analytics.com/analytics.js'); +// +// ga('create', 'UA-122247573-1', 'maldrama.cc'); +// ga('send', 'pageview');
\ No newline at end of file diff --git a/maldrama.cc/assets/javascript/app.js b/maldrama.cc/assets/javascript/app.js new file mode 100644 index 0000000..6503739 --- /dev/null +++ b/maldrama.cc/assets/javascript/app.js @@ -0,0 +1,62 @@ +var _app = function () { + this.id = 0; + this.videoElement = null; + this.audioElement = null; + this.musicVolume = 0.12; + this.musicFadeIn = 4000; + this.skippedIntro = false; + this.backgroundToggler = false; + this.shouldIgnoreVideo = false; + this.effects = ["bounce", "flash", "pulse", "rubberBand", "shake", "swing", "tada", "wobble", "jello"]; + this.brandDescription = [ + "grinchy boys", + "11 years old kids team", + "pro roblox players", + "xane ddosers", + "trashtalkers", + "zuhn fanboys", + "hack vs hack noobs", + "paste lords", + "baimware users" + ]; + + this.titleChanger = function (text, delay) { + text = text || + ['s1nical', 's1n', 's1nny', 'sin', 'sinny', '=', 'maldrama.cc', 'Song name: KUSO GVKI - Cinnamon (feat. Apfel) (splash! Mag Premiere)']; + delay = delay || 2000; + + var counter = 0; + + setInterval(function () { + if(counter < text.length) + document.title = text[counter++]; + else + document.title = text[counter = 0]; + }, delay); + } + + this.iconChanger = function (urls, delay) { + if (!urls) + return; + + delay = delay || 2000; + + var counter = 0; + + setInterval(function () { + if(counter < urls.length) { + var link = document.querySelector("link[rel*='icon']") || document.createElement('link'); + link.type = 'image/x-icon'; + link.rel = 'shortcut icon'; + link.href = urls[counter]; + document.getElementsByTagName('head')[0].appendChild(link); + } + else + counter = 0; + + ++counter; + }, delay); + } +}; + +var app = new _app(); diff --git a/maldrama.cc/assets/javascript/lib/jquery-3.1.1.min.js b/maldrama.cc/assets/javascript/lib/jquery-3.1.1.min.js new file mode 100644 index 0000000..ff955ca --- /dev/null +++ b/maldrama.cc/assets/javascript/lib/jquery-3.1.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.1.1 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):C.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/[^\x20\t\r\n\f]+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R), +a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:X.test(a)?JSON.parse(a):a)}function $(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=Z(c)}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),$(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=$(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=V.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var _=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,aa=new RegExp("^(?:([+-])=|)("+_+")([a-z%]*)$","i"),ba=["Top","Right","Bottom","Left"],ca=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},da=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function ea(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&aa.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var fa={};function ga(a){var b,c=a.ownerDocument,d=a.nodeName,e=fa[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),fa[d]=e,e)}function ha(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ca(d)&&(e[f]=ga(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ha(this,!0)},hide:function(){return ha(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ca(this)?r(this).show():r(this).hide()})}});var ia=/^(?:checkbox|radio)$/i,ja=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ka=/^$|\/(?:java|ecma)script/i,la={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};la.optgroup=la.option,la.tbody=la.tfoot=la.colgroup=la.caption=la.thead,la.th=la.td;function ma(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function na(a,b){for(var c=0,d=a.length;c<d;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var oa=/<|&#?\w+;/;function pa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(oa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ja.exec(f)||["",""])[1].toLowerCase(),i=la[h]||la._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=ma(l.appendChild(f),"script"),j&&na(g),c){k=0;while(f=g[k++])ka.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var qa=d.documentElement,ra=/^key/,sa=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ta=/^([^.]*)(?:\.(.+)|)/;function ua(){return!0}function va(){return!1}function wa(){try{return d.activeElement}catch(a){}}function xa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)xa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=va;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(qa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==wa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===wa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&r.nodeName(this,"input"))return this.click(),!1},_default:function(a){return r.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ua:va,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:va,isPropagationStopped:va,isImmediatePropagationStopped:va,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ua,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ua,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ua,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&ra.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&sa.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return xa(this,a,b,c,d)},one:function(a,b,c,d){return xa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=va),this.each(function(){r.event.remove(this,a,c,b)})}});var ya=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,za=/<script|<style|<link/i,Aa=/checked\s*(?:[^=]|=\s*.checked.)/i,Ba=/^true\/(.*)/,Ca=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Da(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Ea(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Fa(a){var b=Ba.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ga(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ha(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ia.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ia(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Aa.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ia(f,b,c,d)});if(m&&(e=pa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(ma(e,"script"),Ea),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,ma(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Fa),l=0;l<i;l++)j=h[l],ka.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ca,""),k))}return a}function Ja(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(ma(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&na(ma(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(ya,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=ma(h),f=ma(a),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);if(b)if(c)for(f=f||ma(a),g=g||ma(h),d=0,e=f.length;d<e;d++)Ga(f[d],g[d]);else Ga(a,h);return g=ma(h,"script"),g.length>0&&na(g,!i&&ma(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ja(this,a,!0)},remove:function(a){return Ja(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.appendChild(a)}})},prepend:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(ma(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!za.test(a)&&!la[(ja.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(ma(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ia(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(ma(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ka=/^margin/,La=new RegExp("^("+_+")(?!px)[a-z%]+$","i"),Ma=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",qa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,qa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Na(a,b,c){var d,e,f,g,h=a.style;return c=c||Ma(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&La.test(g)&&Ka.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Oa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Pa=/^(none|table(?!-c[ea]).+)/,Qa={position:"absolute",visibility:"hidden",display:"block"},Ra={letterSpacing:"0",fontWeight:"400"},Sa=["Webkit","Moz","ms"],Ta=d.createElement("div").style;function Ua(a){if(a in Ta)return a;var b=a[0].toUpperCase()+a.slice(1),c=Sa.length;while(c--)if(a=Sa[c]+b,a in Ta)return a}function Va(a,b,c){var d=aa.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Wa(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ba[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ba[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ba[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ba[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ba[f]+"Width",!0,e)));return g}function Xa(a,b,c){var d,e=!0,f=Ma(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),d<=0||null==d){if(d=Na(a,b,f),(d<0||null==d)&&(d=a.style[b]),La.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Wa(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Na(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ua(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=aa.exec(c))&&e[1]&&(c=ea(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ua(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Na(a,b,d)),"normal"===e&&b in Ra&&(e=Ra[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Pa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Xa(a,b,d):da(a,Qa,function(){return Xa(a,b,d)})},set:function(a,c,d){var e,f=d&&Ma(a),g=d&&Wa(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=aa.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Va(a,c,g)}}}),r.cssHooks.marginLeft=Oa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Na(a,"marginLeft"))||a.getBoundingClientRect().left-da(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ba[d]+b]=f[d]||f[d-2]||f[0];return e}},Ka.test(a)||(r.cssHooks[a+b].set=Va)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=Ma(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Ya(a,b,c,d,e){return new Ya.prototype.init(a,b,c,d,e)}r.Tween=Ya,Ya.prototype={constructor:Ya,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Ya.propHooks[this.prop];return a&&a.get?a.get(this):Ya.propHooks._default.get(this)},run:function(a){var b,c=Ya.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ya.propHooks._default.set(this),this}},Ya.prototype.init.prototype=Ya.prototype,Ya.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Ya.propHooks.scrollTop=Ya.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Ya.prototype.init,r.fx.step={};var Za,$a,_a=/^(?:toggle|show|hide)$/,ab=/queueHooks$/;function bb(){$a&&(a.requestAnimationFrame(bb),r.fx.tick())}function cb(){return a.setTimeout(function(){Za=void 0}),Za=r.now()}function db(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ba[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function eb(a,b,c){for(var d,e=(hb.tweeners[b]||[]).concat(hb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function fb(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&ca(a),q=V.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],_a.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ha([a],!0),j=a.style.display||j,k=r.css(a,"display"),ha([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=V.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ha([a],!0),m.done(function(){p||ha([a]),V.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=eb(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function gb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],r.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function hb(a,b,c){var d,e,f=0,g=hb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Za||cb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Za||cb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(gb(k,j.opts.specialEasing);f<g;f++)if(d=hb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,eb,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(hb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return ea(c.elem,a,aa.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(K);for(var c,d=0,e=a.length;d<e;d++)c=a[d],hb.tweeners[c]=hb.tweeners[c]||[],hb.tweeners[c].unshift(b)},prefilters:[fb],prefilter:function(a,b){b?hb.prefilters.unshift(a):hb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:"number"!=typeof e.duration&&(e.duration in r.fx.speeds?e.duration=r.fx.speeds[e.duration]:e.duration=r.fx.speeds._default),null!=e.queue&&e.queue!==!0||(e.queue="fx"),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ca).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=hb(this,r.extend({},a),f);(e||V.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=V.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&ab.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=V.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(db(b,!0),a,d,e)}}),r.each({slideDown:db("show"),slideUp:db("hide"),slideToggle:db("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Za=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),Za=void 0},r.fx.timer=function(a){r.timers.push(a),a()?r.fx.start():r.timers.pop()},r.fx.interval=13,r.fx.start=function(){$a||($a=a.requestAnimationFrame?a.requestAnimationFrame(bb):a.setInterval(r.fx.tick,r.fx.interval))},r.fx.stop=function(){a.cancelAnimationFrame?a.cancelAnimationFrame($a):a.clearInterval($a),$a=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var ib,jb=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?ib:void 0)), +void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),ib={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=jb[b]||r.find.attr;jb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=jb[g],jb[g]=e,e=null!=c(a,b,d)?g:null,jb[g]=f),e}});var kb=/^(?:input|select|textarea|button)$/i,lb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):kb.test(a.nodeName)||lb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function mb(a){var b=a.match(K)||[];return b.join(" ")}function nb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,nb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,nb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,nb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=nb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(nb(c))+" ").indexOf(b)>-1)return!0;return!1}});var ob=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ob,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:mb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ia.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,"$1"),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Qb=[],Rb=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Qb.pop()||r.expando+"_"+rb++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Rb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rb.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Rb,"$1"+e):b.jsonp!==!1&&(b.url+=(sb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Qb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=B.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=pa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=mb(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length};function Sb(a){return r.isWindow(a)?a:9===a.nodeType&&a.defaultView}r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=Sb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),r.nodeName(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||qa})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return S(this,function(a,d,e){var f=Sb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Oa(o.pixelPosition,function(a,c){if(c)return c=Na(a,b),La.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return S(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.parseJSON=JSON.parse,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Tb=a.jQuery,Ub=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Ub),b&&a.jQuery===r&&(a.jQuery=Tb),r},b||(a.jQuery=a.$=r),r});
\ No newline at end of file diff --git a/maldrama.cc/assets/javascript/lib/jquery.cookie.min.js b/maldrama.cc/assets/javascript/lib/jquery.cookie.min.js new file mode 100644 index 0000000..c0f19d8 --- /dev/null +++ b/maldrama.cc/assets/javascript/lib/jquery.cookie.min.js @@ -0,0 +1,2 @@ +/*! jquery.cookie v1.4.1 | MIT */ +!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?a(require("jquery")):a(jQuery)}(function(a){function b(a){return h.raw?a:encodeURIComponent(a)}function c(a){return h.raw?a:decodeURIComponent(a)}function d(a){return b(h.json?JSON.stringify(a):String(a))}function e(a){0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return a=decodeURIComponent(a.replace(g," ")),h.json?JSON.parse(a):a}catch(b){}}function f(b,c){var d=h.raw?b:e(b);return a.isFunction(c)?c(d):d}var g=/\+/g,h=a.cookie=function(e,g,i){if(void 0!==g&&!a.isFunction(g)){if(i=a.extend({},h.defaults,i),"number"==typeof i.expires){var j=i.expires,k=i.expires=new Date;k.setTime(+k+864e5*j)}return document.cookie=[b(e),"=",d(g),i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}for(var l=e?void 0:{},m=document.cookie?document.cookie.split("; "):[],n=0,o=m.length;o>n;n++){var p=m[n].split("="),q=c(p.shift()),r=p.join("=");if(e&&e===q){l=f(r,g);break}e||void 0===(r=f(r))||(l[q]=r)}return l};h.defaults={},a.removeCookie=function(b,c){return void 0===a.cookie(b)?!1:(a.cookie(b,"",a.extend({},c,{expires:-1})),!a.cookie(b))}});
\ No newline at end of file diff --git a/maldrama.cc/assets/javascript/lib/jquery.marquee.min.js b/maldrama.cc/assets/javascript/lib/jquery.marquee.min.js new file mode 100644 index 0000000..822ec50 --- /dev/null +++ b/maldrama.cc/assets/javascript/lib/jquery.marquee.min.js @@ -0,0 +1,15 @@ +/** + * jQuery.marquee - scrolling text like old marquee element + * @author Aamir Afridi - aamirafridi(at)gmail(dot)com / http://aamirafridi.com/jquery/jquery-marquee-plugin + */ +(function(f){f.fn.marquee=function(x){return this.each(function(){var a=f.extend({},f.fn.marquee.defaults,x),b=f(this),c,h,t,u,k,e=3,y="animation-play-state",n=!1,E=function(a,b,c){for(var e=["webkit","moz","MS","o",""],d=0;d<e.length;d++)e[d]||(b=b.toLowerCase()),a.addEventListener(e[d]+b,c,!1)},F=function(a){var b=[],c;for(c in a)a.hasOwnProperty(c)&&b.push(c+":"+a[c]);b.push();return"{"+b.join(",")+"}"},p={pause:function(){n&&a.allowCss3Support?c.css(y,"paused"):f.fn.pause&&c.pause();b.data("runningStatus", +"paused");b.trigger("paused")},resume:function(){n&&a.allowCss3Support?c.css(y,"running"):f.fn.resume&&c.resume();b.data("runningStatus","resumed");b.trigger("resumed")},toggle:function(){p["resumed"==b.data("runningStatus")?"pause":"resume"]()},destroy:function(){clearTimeout(b.timer);b.find("*").andSelf().unbind();b.html(b.find(".js-marquee:first").html())}};if("string"===typeof x)f.isFunction(p[x])&&(c||(c=b.find(".js-marquee-wrapper")),!0===b.data("css3AnimationIsSupported")&&(n=!0),p[x]());else{var v; +f.each(a,function(c,d){v=b.attr("data-"+c);if("undefined"!==typeof v){switch(v){case "true":v=!0;break;case "false":v=!1}a[c]=v}});a.speed&&(a.duration=a.speed*parseInt(b.width(),10));u="up"==a.direction||"down"==a.direction;a.gap=a.duplicated?parseInt(a.gap):0;b.wrapInner('<div class="js-marquee"></div>');var l=b.find(".js-marquee").css({"margin-right":a.gap,"float":"left"});a.duplicated&&l.clone(!0).appendTo(b);b.wrapInner('<div style="width:100000px" class="js-marquee-wrapper"></div>');c=b.find(".js-marquee-wrapper"); +if(u){var m=b.height();c.removeAttr("style");b.height(m);b.find(".js-marquee").css({"float":"none","margin-bottom":a.gap,"margin-right":0});a.duplicated&&b.find(".js-marquee:last").css({"margin-bottom":0});var q=b.find(".js-marquee:first").height()+a.gap;a.startVisible&&!a.duplicated?(a._completeDuration=(parseInt(q,10)+parseInt(m,10))/parseInt(m,10)*a.duration,a.duration*=parseInt(q,10)/parseInt(m,10)):a.duration*=(parseInt(q,10)+parseInt(m,10))/parseInt(m,10)}else k=b.find(".js-marquee:first").width()+ +a.gap,h=b.width(),a.startVisible&&!a.duplicated?(a._completeDuration=(parseInt(k,10)+parseInt(h,10))/parseInt(h,10)*a.duration,a.duration*=parseInt(k,10)/parseInt(h,10)):a.duration*=(parseInt(k,10)+parseInt(h,10))/parseInt(h,10);a.duplicated&&(a.duration/=2);if(a.allowCss3Support){var l=document.body||document.createElement("div"),g="marqueeAnimation-"+Math.floor(1E7*Math.random()),A=["Webkit","Moz","O","ms","Khtml"],B="animation",d="",r="";l.style.animation&&(r="@keyframes "+g+" ",n=!0);if(!1=== +n)for(var z=0;z<A.length;z++)if(void 0!==l.style[A[z]+"AnimationName"]){l="-"+A[z].toLowerCase()+"-";B=l+B;y=l+y;r="@"+l+"keyframes "+g+" ";n=!0;break}n&&(d=g+" "+a.duration/1E3+"s "+a.delayBeforeStart/1E3+"s infinite "+a.css3easing,b.data("css3AnimationIsSupported",!0))}var C=function(){c.css("margin-top","up"==a.direction?m+"px":"-"+q+"px")},D=function(){c.css("margin-left","left"==a.direction?h+"px":"-"+k+"px")};a.duplicated?(u?a.startVisible?c.css("margin-top",0):c.css("margin-top","up"==a.direction? +m+"px":"-"+(2*q-a.gap)+"px"):a.startVisible?c.css("margin-left",0):c.css("margin-left","left"==a.direction?h+"px":"-"+(2*k-a.gap)+"px"),a.startVisible||(e=1)):a.startVisible?e=2:u?C():D();var w=function(){a.duplicated&&(1===e?(a._originalDuration=a.duration,a.duration=u?"up"==a.direction?a.duration+m/(q/a.duration):2*a.duration:"left"==a.direction?a.duration+h/(k/a.duration):2*a.duration,d&&(d=g+" "+a.duration/1E3+"s "+a.delayBeforeStart/1E3+"s "+a.css3easing),e++):2===e&&(a.duration=a._originalDuration, +d&&(g+="0",r=f.trim(r)+"0 ",d=g+" "+a.duration/1E3+"s 0s infinite "+a.css3easing),e++));u?a.duplicated?(2<e&&c.css("margin-top","up"==a.direction?0:"-"+q+"px"),t={"margin-top":"up"==a.direction?"-"+q+"px":0}):a.startVisible?2===e?(d&&(d=g+" "+a.duration/1E3+"s "+a.delayBeforeStart/1E3+"s "+a.css3easing),t={"margin-top":"up"==a.direction?"-"+q+"px":m+"px"},e++):3===e&&(a.duration=a._completeDuration,d&&(g+="0",r=f.trim(r)+"0 ",d=g+" "+a.duration/1E3+"s 0s infinite "+a.css3easing),C()):(C(),t={"margin-top":"up"== +a.direction?"-"+c.height()+"px":m+"px"}):a.duplicated?(2<e&&c.css("margin-left","left"==a.direction?0:"-"+k+"px"),t={"margin-left":"left"==a.direction?"-"+k+"px":0}):a.startVisible?2===e?(d&&(d=g+" "+a.duration/1E3+"s "+a.delayBeforeStart/1E3+"s "+a.css3easing),t={"margin-left":"left"==a.direction?"-"+k+"px":h+"px"},e++):3===e&&(a.duration=a._completeDuration,d&&(g+="0",r=f.trim(r)+"0 ",d=g+" "+a.duration/1E3+"s 0s infinite "+a.css3easing),D()):(D(),t={"margin-left":"left"==a.direction?"-"+k+"px": +h+"px"});b.trigger("beforeStarting");if(n){c.css(B,d);var l=r+" { 100% "+F(t)+"}",p=c.find("style");0!==p.length?p.filter(":last").html(l):c.append("<style>"+l+"</style>");E(c[0],"AnimationIteration",function(){b.trigger("finished")});E(c[0],"AnimationEnd",function(){w();b.trigger("finished")})}else c.animate(t,a.duration,a.easing,function(){b.trigger("finished");a.pauseOnCycle?b.timer=setTimeout(w,a.delayBeforeStart):w()});b.data("runningStatus","resumed")};b.bind("pause",p.pause);b.bind("resume", +p.resume);a.pauseOnHover&&b.bind("mouseenter mouseleave",p.toggle);n&&a.allowCss3Support?w():b.timer=setTimeout(w,a.delayBeforeStart)}})};f.fn.marquee.defaults={allowCss3Support:!0,css3easing:"linear",easing:"linear",delayBeforeStart:1E3,direction:"left",duplicated:!1,duration:5E3,gap:20,pauseOnCycle:!1,pauseOnHover:!1,startVisible:!1}})(jQuery);
\ No newline at end of file diff --git a/maldrama.cc/assets/javascript/lib/typed.min.js b/maldrama.cc/assets/javascript/lib/typed.min.js new file mode 100644 index 0000000..9fb2d3b --- /dev/null +++ b/maldrama.cc/assets/javascript/lib/typed.min.js @@ -0,0 +1,11 @@ +/*! + * + * typed.js - A JavaScript Typing Animation Library + * Author: Matt Boldt <[email protected]> + * Version: v2.0.4 + * Url: https://github.com/mattboldt/typed.js + * License(s): MIT + * + */ +(function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Typed=e():t.Typed=e()})(this,function(){return function(t){function e(n){if(s[n])return s[n].exports;var i=s[n]={exports:{},id:n,loaded:!1};return t[n].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var s={};return e.m=t,e.c=s,e.p="",e(0)}([function(t,e,s){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var i=function(){function t(t,e){for(var s=0;s<e.length;s++){var n=e[s];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,s,n){return s&&t(e.prototype,s),n&&t(e,n),e}}(),r=s(1),o=s(3),a=function(){function t(e,s){n(this,t),r.initializer.load(this,s,e),this.begin()}return i(t,[{key:"toggle",value:function(){this.pause.status?this.start():this.stop()}},{key:"stop",value:function(){this.typingComplete||this.pause.status||(this.toggleBlinking(!0),this.pause.status=!0,this.options.onStop(this.arrayPos,this))}},{key:"start",value:function(){this.typingComplete||this.pause.status&&(this.pause.status=!1,this.pause.typewrite?this.typewrite(this.pause.curString,this.pause.curStrPos):this.backspace(this.pause.curString,this.pause.curStrPos),this.options.onStart(this.arrayPos,this))}},{key:"destroy",value:function(){this.reset(!1),this.options.onDestroy(this)}},{key:"reset",value:function(){var t=arguments.length<=0||void 0===arguments[0]||arguments[0];clearInterval(this.timeout),this.replaceText(""),this.cursor&&this.cursor.parentNode&&(this.cursor.parentNode.removeChild(this.cursor),this.cursor=null),this.strPos=0,this.arrayPos=0,this.curLoop=0,t&&(this.insertCursor(),this.options.onReset(this),this.begin())}},{key:"begin",value:function(){var t=this;this.typingComplete=!1,this.shuffleStringsIfNeeded(this),this.insertCursor(),this.bindInputFocusEvents&&this.bindFocusEvents(),this.timeout=setTimeout(function(){t.currentElContent&&0!==t.currentElContent.length?t.backspace(t.currentElContent,t.currentElContent.length):t.typewrite(t.strings[t.sequence[t.arrayPos]],t.strPos)},this.startDelay)}},{key:"typewrite",value:function(t,e){var s=this;this.fadeOut&&this.el.classList.contains(this.fadeOutClass)&&(this.el.classList.remove(this.fadeOutClass),this.cursor&&this.cursor.classList.remove(this.fadeOutClass));var n=this.humanizer(this.typeSpeed),i=1;return this.pause.status===!0?void this.setPauseStatus(t,e,!0):void(this.timeout=setTimeout(function(){e=o.htmlParser.typeHtmlChars(t,e,s);var n=0,r=t.substr(e);if("^"===r.charAt(0)&&/^\^\d+/.test(r)){var a=1;r=/\d+/.exec(r)[0],a+=r.length,n=parseInt(r),s.temporaryPause=!0,s.options.onTypingPaused(s.arrayPos,s),t=t.substring(0,e)+t.substring(e+a),s.toggleBlinking(!0)}if("`"===r.charAt(0)){for(;"`"!==t.substr(e+i).charAt(0)&&(i++,!(e+i>t.length)););var u=t.substring(0,e),l=t.substring(u.length+1,e+i),c=t.substring(e+i+1);t=u+l+c,i--}s.timeout=setTimeout(function(){s.toggleBlinking(!1),e===t.length?s.doneTyping(t,e):s.keepTyping(t,e,i),s.temporaryPause&&(s.temporaryPause=!1,s.options.onTypingResumed(s.arrayPos,s))},n)},n))}},{key:"keepTyping",value:function(t,e,s){0===e&&(this.toggleBlinking(!1),this.options.preStringTyped(this.arrayPos,this)),e+=s;var n=t.substr(0,e);this.replaceText(n),this.typewrite(t,e)}},{key:"doneTyping",value:function(t,e){var s=this;this.options.onStringTyped(this.arrayPos,this),this.toggleBlinking(!0),this.arrayPos===this.strings.length-1&&(this.complete(),this.loop===!1||this.curLoop===this.loopCount)||(this.timeout=setTimeout(function(){s.backspace(t,e)},this.backDelay))}},{key:"backspace",value:function(t,e){var s=this;if(this.pause.status===!0)return void this.setPauseStatus(t,e,!0);if(this.fadeOut)return this.initFadeOut();this.toggleBlinking(!1);var n=this.humanizer(this.backSpeed);this.timeout=setTimeout(function(){e=o.htmlParser.backSpaceHtmlChars(t,e,s);var n=t.substr(0,e);if(s.replaceText(n),s.smartBackspace){var i=s.strings[s.arrayPos+1];i&&n===i.substr(0,e)?s.stopNum=e:s.stopNum=0}e>s.stopNum?(e--,s.backspace(t,e)):e<=s.stopNum&&(s.arrayPos++,s.arrayPos===s.strings.length?(s.arrayPos=0,s.options.onLastStringBackspaced(),s.shuffleStringsIfNeeded(),s.begin()):s.typewrite(s.strings[s.sequence[s.arrayPos]],e))},n)}},{key:"complete",value:function(){this.options.onComplete(this),this.loop?this.curLoop++:this.typingComplete=!0}},{key:"setPauseStatus",value:function(t,e,s){this.pause.typewrite=s,this.pause.curString=t,this.pause.curStrPos=e}},{key:"toggleBlinking",value:function(t){if(this.cursor&&!this.pause.status&&this.cursorBlinking!==t){this.cursorBlinking=t;var e=t?"infinite":0;this.cursor.style.animationIterationCount=e}}},{key:"humanizer",value:function(t){return Math.round(Math.random()*t/2)+t}},{key:"shuffleStringsIfNeeded",value:function(){this.shuffle&&(this.sequence=this.sequence.sort(function(){return Math.random()-.5}))}},{key:"initFadeOut",value:function(){var t=this;return this.el.className+=" "+this.fadeOutClass,this.cursor&&(this.cursor.className+=" "+this.fadeOutClass),setTimeout(function(){t.arrayPos++,t.replaceText(""),t.strings.length>t.arrayPos?t.typewrite(t.strings[t.sequence[t.arrayPos]],0):(t.typewrite(t.strings[0],0),t.arrayPos=0)},this.fadeOutDelay)}},{key:"replaceText",value:function(t){this.attr?this.el.setAttribute(this.attr,t):this.isInput?this.el.value=t:"html"===this.contentType?this.el.innerHTML=t:this.el.textContent=t}},{key:"bindFocusEvents",value:function(){var t=this;this.isInput&&(this.el.addEventListener("focus",function(e){t.stop()}),this.el.addEventListener("blur",function(e){t.el.value&&0!==t.el.value.length||t.start()}))}},{key:"insertCursor",value:function(){this.showCursor&&(this.cursor||(this.cursor=document.createElement("span"),this.cursor.className="typed-cursor",this.cursor.innerHTML=this.cursorChar,this.el.parentNode&&this.el.parentNode.insertBefore(this.cursor,this.el.nextSibling)))}}]),t}();e["default"]=a,t.exports=e["default"]},function(t,e,s){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var s=arguments[e];for(var n in s)Object.prototype.hasOwnProperty.call(s,n)&&(t[n]=s[n])}return t},o=function(){function t(t,e){for(var s=0;s<e.length;s++){var n=e[s];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,s,n){return s&&t(e.prototype,s),n&&t(e,n),e}}(),a=s(2),u=n(a),l=function(){function t(){i(this,t)}return o(t,[{key:"load",value:function(t,e,s){if("string"==typeof s?t.el=document.querySelector(s):t.el=s,t.options=r({},u["default"],e),t.isInput="input"===t.el.tagName.toLowerCase(),t.attr=t.options.attr,t.bindInputFocusEvents=t.options.bindInputFocusEvents,t.showCursor=!t.isInput&&t.options.showCursor,t.cursorChar=t.options.cursorChar,t.cursorBlinking=!0,t.elContent=t.attr?t.el.getAttribute(t.attr):t.el.textContent,t.contentType=t.options.contentType,t.typeSpeed=t.options.typeSpeed,t.startDelay=t.options.startDelay,t.backSpeed=t.options.backSpeed,t.smartBackspace=t.options.smartBackspace,t.backDelay=t.options.backDelay,t.fadeOut=t.options.fadeOut,t.fadeOutClass=t.options.fadeOutClass,t.fadeOutDelay=t.options.fadeOutDelay,t.isPaused=!1,t.strings=t.options.strings.map(function(t){return t.trim()}),"string"==typeof t.options.stringsElement?t.stringsElement=document.querySelector(t.options.stringsElement):t.stringsElement=t.options.stringsElement,t.stringsElement){t.strings=[],t.stringsElement.style.display="none";var n=Array.prototype.slice.apply(t.stringsElement.children),i=!0,o=!1,a=void 0;try{for(var l,c=n[Symbol.iterator]();!(i=(l=c.next()).done);i=!0){var p=l.value;t.strings.push(p.innerHTML.trim())}}catch(h){o=!0,a=h}finally{try{!i&&c["return"]&&c["return"]()}finally{if(o)throw a}}}t.strPos=0,t.arrayPos=0,t.stopNum=0,t.loop=t.options.loop,t.loopCount=t.options.loopCount,t.curLoop=0,t.shuffle=t.options.shuffle,t.sequence=[],t.pause={status:!1,typewrite:!0,curString:"",curStrPos:0},t.typingComplete=!1;for(var f in t.strings)t.sequence[f]=f;t.currentElContent=this.getCurrentElContent(t),t.autoInsertCss=t.options.autoInsertCss,this.appendAnimationCss(t)}},{key:"getCurrentElContent",value:function(t){var e="";return e=t.attr?t.el.getAttribute(t.attr):t.isInput?t.el.value:"html"===t.contentType?t.el.innerHTML:t.el.textContent}},{key:"appendAnimationCss",value:function(t){if(t.autoInsertCss&&t.showCursor&&t.fadeOut){var e=document.createElement("style");e.type="text/css";var s="";t.showCursor&&(s+="\n .typed-cursor{\n opacity: 1;\n animation: typedjsBlink 0.7s infinite;\n -webkit-animation: typedjsBlink 0.7s infinite;\n animation: typedjsBlink 0.7s infinite;\n }\n @keyframes typedjsBlink{\n 50% { opacity: 0.0; }\n }\n @-webkit-keyframes typedjsBlink{\n 0% { opacity: 1; }\n 50% { opacity: 0.0; }\n 100% { opacity: 1; }\n }\n "),t.fadeOut&&(s+="\n .typed-fade-out{\n opacity: 0;\n transition: opacity .25s;\n -webkit-animation: 0;\n animation: 0;\n }\n "),0!==e.length&&(e.innerHTML=s,document.head.appendChild(e))}}}]),t}();e["default"]=l;var c=new l;e.initializer=c},function(t,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var s={strings:["These are the default values...","You know what you should do?","Use your own!","Have a great day!"],stringsElement:null,typeSpeed:0,startDelay:0,backSpeed:0,smartBackspace:!0,shuffle:!1,backDelay:700,fadeOut:!1,fadeOutClass:"typed-fade-out",fadeOutDelay:500,loop:!1,loopCount:1/0,showCursor:!0,cursorChar:"|",autoInsertCss:!0,attr:null,bindInputFocusEvents:!1,contentType:"html",onComplete:function(t){},preStringTyped:function(t,e){},onStringTyped:function(t,e){},onLastStringBackspaced:function(t){},onTypingPaused:function(t,e){},onTypingResumed:function(t,e){},onReset:function(t){},onStop:function(t,e){},onStart:function(t,e){},onDestroy:function(t){}};e["default"]=s,t.exports=e["default"]},function(t,e){"use strict";function s(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){for(var s=0;s<e.length;s++){var n=e[s];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,s,n){return s&&t(e.prototype,s),n&&t(e,n),e}}(),i=function(){function t(){s(this,t)}return n(t,[{key:"typeHtmlChars",value:function(t,e,s){if("html"!==s.contentType)return e;var n=t.substr(e).charAt(0);if("<"===n||"&"===n){var i="";for(i="<"===n?">":";";t.substr(e+1).charAt(0)!==i&&(e++,!(e+1>t.length)););e++}return e}},{key:"backSpaceHtmlChars",value:function(t,e,s){if("html"!==s.contentType)return e;var n=t.substr(e).charAt(0);if(">"===n||";"===n){var i="";for(i=">"===n?"<":"&";t.substr(e-1).charAt(0)!==i&&(e--,!(e<0)););e--}return e}}]),t}();e["default"]=i;var r=new i;e.htmlParser=r}])}); +//# sourceMappingURL=typed.min.js.map
\ No newline at end of file diff --git a/maldrama.cc/assets/javascript/portfolio.js b/maldrama.cc/assets/javascript/portfolio.js new file mode 100644 index 0000000..09667ff --- /dev/null +++ b/maldrama.cc/assets/javascript/portfolio.js @@ -0,0 +1,325 @@ +"use scrict"; + +(function () { + var timeouts = []; + + window.mobileAndTabletCheck = function () { + var check = false; + (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera); + return check; + }; + + $(document).ready(function () { + var links = [ + //{ + // name: 's1nical', + // link: 'egirlspit' + //}, + + //{ + // name: 's1n', + // link: 'egirlspit' + //}, + + //{ + // name: 's1nny', + // link: 'egirlspit' + //}, + + //{ + // name: 'sin', + // link: 'egirlspit' + //}, + + //{ + // name: 'sinny', + // link: 'egirlspit' + //} + + { + name: 'welcome', + link: 'egirlspit' + }, + + { + name: 'to', + link: 'egirlspit' + }, + + { + name: 's1n\'s', + link: 'egirlspit' + }, + + { + name: 'prv', + link: 'egirlspit' + }, + + { + name: 'v2', + link: 'egirlspit' + }, + + { + name: '\ ', + link: 'egirlspit' + }, + + { + name: 'buy', + link: 'egirlspit' + }, + + { + name: 'from', + link: 'egirlspit' + }, + + { + name: 'sin#1337', + link: 'egirlspit' + }, + + { + name: 'on', + link: 'egirlspit' + }, + + { + name: 'discord', + link: 'egirlspit' + }, + ]; + + for (var i in links) { + var link = links[i]; + + $('#marquee').append('<a href="#">' + link.name + '</a>'); + // $('#marquee').append('<a href="https://steamcommunity.com/id/' + link.link + '" target="_BLANK">' + link.name + '</a>'); // /profiles/ + + link = $('#marquee').children('a').last(); + + if (i != links.length - 1) + $('#marquee').append(' <img class="emoticon" src="assets/others/mgh_17.png"> '); + } + + if (window.mobileAndTabletCheck()) { + $("#background").replaceWith('<div id="background" style="background-image: url(/assets/images/mobile-background.jpg);"></div>'); + + app.shouldIgnoreVideo = true; + } + + app.titleChanger(); + app.iconChanger([ + "assets/icons/roses/rose1.jpg", + "assets/icons/roses/rose2.jpg", + "assets/icons/roses/rose3.jpg", + "assets/icons/roses/rose4.jpg", + "assets/icons/roses/rose5.jpg", + "assets/icons/roses/rose6.jpg", + "assets/icons/roses/rose7.jpg", + "assets/icons/roses/rose8.jpg", + "assets/icons/roses/rose1.jpg", + ]); + }); + + if ($.cookie('videoTime')) { + app.videoElement.currentTime = $.cookie('videoTime'); + app.audioElement.currentTime = $.cookie('videoTime'); + } + + document.addEventListener('contextmenu', function (event) { + event.preventDefault() + }); + + $(window).on('keydown', function () { + if (event.keyCode == 123) + return false; + else if (event.ctrlKey && event.shiftKey && event.keyCode == 73) + return false; + else if (event.ctrlKey && event.keyCode == 73) + return false; + else if (event.ctrlKey && event.shiftKey && event.keyCode == 74) + return false; + else if (event.ctrlKey && event.keyCode == 74) + return false; + }); + + document.body.onkeyup = function (e) { + if (e.keyCode == 32 && app.skippedIntro) + { + if (app.backgroundToggler) + { + app.videoElement.play(); + app.audioElement.play(); + } + else + { + app.videoElement.pause(); + app.audioElement.pause(); + } + + return app.backgroundToggler = !app.backgroundToggler; + } + } + + $('html').on('contextmenu', function (event) { + var img = document.createElement("img"); + img.src = "assets/others/trollface.jpg"; + img.width = 64; + img.height = 64; + img.alt = "maldrama.cc"; + img.style = "position: absolute; left: " + event.pageX + "px; top: " + event.pageY + "px; z-index: 10"; + img.className = "troll" + ( (app.skippedIntro) ? "" : " trollface-light" ); + + document.body.appendChild(img); + }); + + setInterval( function () { + $(".troll").remove(); + }, 600); + + $(".skip").click(function () { + skipIntro(); + }); + + $.fn.extend({ + animateCss: function (animationName) { + var animationEnd = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend'; + this.addClass('animated ' + animationName).one(animationEnd, function () + { + $(this).removeClass('animated ' + animationName); + }); + return this; + } + }); + + var writeLine = function (text, speed, timeout, callback) { + timeout = (typeof timeout === "number") ? timeout : [0, callback = timeout]; + + setTimeout(function () { + var typed = new Typed("#line" + ((app.id !== 2) ? ++app.id : app.id += 2), + { + strings: text, + typeSpeed: speed, + onComplete: callback + }); + }, timeout); + }; + + (function () { + $.getJSON('https://api.ipdata.co/?api-key=test', function (data) { + + writeLine(["Authenticating...", "Granting access to <span style='font-size: 14px; color: #06d;'>[unknown]</span>..."], 30, function () { + + if (app.skippedIntro) + return; + + clearCursor(); + + var usernames = ["user", "dude"]; + + writeLine(["Access granted! <span style='font-size: 14px; color: #0f0;'>[success]</span>", "Welcome back, <i style='color: #0f0'>" + ((data.ip) ? data.ip : usernames[Math.floor(Math.random()*usernames.length)]) + + "</i>! By the way, nice to see someone from " + ((data.country_name) ? data.country_name : 'your country') + " here!"], 30, 500, function () { + + if (app.skippedIntro) + return; + + clearCursor(); + + writeLine(["<i style='color: #F62459'>maldrama.cc $$$</i>"], 120, 500, function () { + + timeouts.push(setTimeout(function () { + + if (app.skippedIntro) + return; + + clearCursor(); + + setTimeout(function () { + + skipIntro(); + + }, 500); + + }, 1000)); + + }); + + }); + + }); + + }); + + })() + + var skipIntro = function () { + + if (app.skippedIntro) + return; + + app.skippedIntro = true; + + timeouts.forEach(function (timeout) { + clearTimeout(timeout); + }); + + $(".top-right").remove(); + + $('#main').fadeOut(100, function () { + + $("#main").remove(); + + $('#marquee').marquee({ + duration: 15000, + gap: 420, + delayBeforeStart: 1000, + direction: 'left', + duplicated: true + }); + + setTimeout(function () { + $('.brand-header').animateCss(app.effects[ Math.floor(Math.random() * app.effects.length) ]); + }, 200); + + setTimeout(function () { + var typed = new Typed("#brand", + { + strings: app.brandDescription, + typeSpeed: 40, + onComplete: function () { + clearCursor() + } + }); + }, 1350); + + setTimeout(function () { + if (!app.shouldIgnoreVideo) { + app.videoElement.play(); + app.audioElement.play(); + } + + app.videoElement.addEventListener("timeupdate", function () { + $.cookie('videoTime', app.videoElement.currentTime, { expires: 1 }); + }, false); + + $('.marquee-container').fadeIn(100); + + $('.marquee-container').animateCss('zoomIn'); + + $('.container').fadeIn(); + + $('.background').fadeIn(200, function () { + if (!app.shouldIgnoreVideo) + $("#audio").animate({volume: app.musicVolume}, app.musicFadeIn); + }); + }, 200); + }); + }; + + var clearCursor = function () { + return $("span").siblings(".typed-cursor").css("opacity", "0"); + } +})() diff --git a/maldrama.cc/assets/others/cursor.png b/maldrama.cc/assets/others/cursor.png Binary files differnew file mode 100644 index 0000000..6e0df77 --- /dev/null +++ b/maldrama.cc/assets/others/cursor.png diff --git a/maldrama.cc/assets/others/dot.png b/maldrama.cc/assets/others/dot.png Binary files differnew file mode 100644 index 0000000..6deb6c4 --- /dev/null +++ b/maldrama.cc/assets/others/dot.png diff --git a/maldrama.cc/assets/others/mgh_17.png b/maldrama.cc/assets/others/mgh_17.png Binary files differnew file mode 100644 index 0000000..7dd74b1 --- /dev/null +++ b/maldrama.cc/assets/others/mgh_17.png diff --git a/maldrama.cc/assets/others/trollface.jpg b/maldrama.cc/assets/others/trollface.jpg Binary files differnew file mode 100644 index 0000000..71d7748 --- /dev/null +++ b/maldrama.cc/assets/others/trollface.jpg diff --git a/maldrama.cc/assets/stylesheets/stylesheet.css b/maldrama.cc/assets/stylesheets/stylesheet.css new file mode 100644 index 0000000..a6454b1 --- /dev/null +++ b/maldrama.cc/assets/stylesheets/stylesheet.css @@ -0,0 +1,183 @@ +/* Inspiration + CSS "intro" credits: bones.sesh.team */ +/* Sources used list: + - spinbot.pw (video tag, #center), + - http://static.tumblr.com/zlim8hm/29yn6561z/force-cursor.png (cursor), + - https://github.com/tsenart/sight/blob/master/fonts/Consolas.ttf (font), + - https://emerald.gg/images/dot.png (2x2 dot, inspiration and pattern CSS) +*/ + +html { + cursor:url("../others/cursor.png"), default; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +a { + color: #e4e3e3; + text-decoration: none; +} + +body, input { + color: #e4e3e3; + background-color: #000 +} + +@font-face { + font-family: courier_regular; + src: url("../others/Consolas.ttf"); +} + +* { + padding: 0; + margin: 0; + font-family: consolas, sans-serif; +} + +body { + overflow-x: hidden; +} + +input { + outline: 0; + border: none; +} + +td { + padding: 3px; +} + +hr { + margin-top: 15px; + margin-bottom: 15px; + border-style: dashed +} + +pre { + font-size: 1.15em; +} + +.box, body, input { + background-color: #000; +} + +.box { + padding: 15px; + width: 100%; + height: 100%; + overflow: auto; +} + +.top-right { + position: absolute; + top: 0; + right: 5px; +} + +.container { + position: fixed; + text-align: center; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +#brand { + margin-left: 0.65pc; +} + +.marquee-container { + position: absolute; + width: 100%; + bottom: 10%; + text-align: center; +} + +#marquee { + width: 420px; + overflow: hidden; + display: inline-block; + margin-bottom: -4.5px; + font-size: 15px; +} + +.emoticon { + vertical-align: middle; +} + +.main { + overflow: hidden; +} + +.background { + width: 100%; + height: 100%; + position: absolute; + z-index: -3; +} + +#pattern { + background: transparent url("../others/dot.png") repeat 0 0; + top: 0; + left: 0; + margin: 0; + padding: 0; + z-index: -1; + opacity: 1;; +} + +#pattern, #background { + position: absolute; + width: 100%; + height: 100%; +} + +#background { + z-index: -2; + position: fixed; + top: 50%; + left: 50%; + min-width: 135%; + min-height: 110%; + width: auto; + height: auto; + transform: translateX(-50%) translateY(-50%); + background-size: cover; + overflow: hidden; + -webkit-filter: blur(5px); + -moz-filter: blur(5px); + -o-filter: blur(5px); + -ms-filter: blur(5px); + filter: blur(5px); +} + +.footer { + position: absolute; + bottom: 0; + right: 5px; +} + +.trollface-light { + filter: invert(100%); + -webkit-filter: invert(100%); + -moz-filter: invert(100%); + -ms-filter: invert(100%); +} + +::-webkit-scrollbar { + width: 0; +} + +/* Letters go apart on hover */ +#apart:hover { + letter-spacing: 3px; + transition: .5s +} + +#apart { + transition: .5s; +}
\ No newline at end of file diff --git a/maldrama.cc/index.html b/maldrama.cc/index.html new file mode 100644 index 0000000..45ba7ff --- /dev/null +++ b/maldrama.cc/index.html @@ -0,0 +1,91 @@ +<!DOCTYPE html> +<html> +<head> + <title>maldrama.cc</title> + <meta charset="UTF-8"> + <meta name="description" content="maldrama.cc - hack vs hack team"> + <meta name="keywords" content="maldrama.cc, maldrama, club, counter-strike, csgo, hvh"> + <meta name="author" content="s1nical"> + <meta property="og:type" content="site"> + <meta property="og:title" content="maldrama.cc"> + <meta property="og:description" content="maldrama.cc - hack vs hack team"> + <meta property="og:url" content="https://maldrama.cc/"> + <meta property="og:image" content="assets/icons/maldrama.png"> + <meta itemprop="name" content="maldrama.cc"> + <meta itemprop="description" content="maldrama.c - hack vs hack team"> + <meta itemprop="image" content="assets/icons/maldrama.png"> + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> + <link rel="shortcut icon" href="/maldrama.cc/assets/icons/maldrama.jpg" type="image/x-icon"> + + <script type="text/javascript" src="/maldrama.cc/assets/javascript/app.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> +</head> + +<body> + <div id="main"> + <table class="box"> + <tbody> + <tr><td><span id="line1" style="white-space:pre;"></span></td></tr> + <tr><td><span id="line2" style="white-space:pre;"></span></td></tr> + <tr><td><span id="line3 space" style="white-space:pre;"> </span></td></tr> + <tr><td><span id="line4" style="white-space:pre;"></span></td></tr> + </tbody> + </table> + </div> + + <div class="container" style="display: none;"> + <h1 class="brand-header"> + <a href="https://steamcommunity.com/groups/maldrama" target="_BLANK" id="apart">maldrama.cc</a> + </h1> + + <p><span id="brand"></span></p> + </div> + + <div class="marquee-container" style="display: none"> + <pre>|<div id="marquee"></div>|</pre> + </div> + + <div class="background" style="display: none;"> + <div id="pattern"></div> + + <audio id="audio" loop=""> + <source src="assets/others/KUSO GVKI - Cinnamon (feat. Apfel) (splash! Mag Premiere).mp4" type="audio/mp4"> + <script> + var audio = document.getElementById("audio"); + + app.audioElement = audio; + app.audioElement.volume = 0; + </script> + </audio> + + <video id="background" loop=""> + <source src="assets/others/KUSO GVKI - Cinnamon (feat. Apfel) (splash! Mag Premiere).mp4" type="video/mp4"> + <script> + var video = document.getElementById("background"); + + app.videoElement = video; + app.videoElement.volume = 0; + </script> + </video> + </div> + + <div class="top-right"> + <i><a class="skip">skip intro</a></i> + </div> + + <!-- + <div class="footer"> + <i><a href="https://discordapp.com/invite/maldrama" target="_BLANK">Discord server</a></i> + </div> + --> + + <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.min.css"> + <link rel="stylesheet" type="text/css" href="/maldrama.cc/assets/stylesheets/stylesheet.css"> + <script type="text/javascript" src="/maldrama.cc/assets/javascript/lib/jquery-3.1.1.min.js"></script> + <script type="text/javascript" src="/maldrama.cc/assets/javascript/lib/jquery.marquee.min.js"></script> + <script type="text/javascript" src="/maldrama.cc/assets/javascript/lib/jquery.cookie.min.js"></script> + <script type="text/javascript" src="/maldrama.cc/assets/javascript/lib/typed.min.js"></script> + <script type="text/javascript" src="/maldrama.cc/assets/javascript/portfolio.js"></script> + <script type="text/javascript" src="/maldrama.cc/assets/javascript/analytics.js"></script> +</body> +</html> diff --git a/oauth2/index.html b/oauth2/index.html new file mode 100644 index 0000000..34d24bc --- /dev/null +++ b/oauth2/index.html @@ -0,0 +1,113 @@ +<!DOCTYPE html> +<body lang="en"> + <head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - Oauth2</title> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <!-- Site metadata --> + <meta name="description" content="Authentification Server"> + <meta property="og:description" content="Authentification Server"> + <meta property="og:title" content="s1nical - Oauth2"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/oauth2"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/oauth2"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "Authentification Server", + "headline": "Authentification Server", + "url": "https://cyne.cf/oauth2", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <!-- External Libraries --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/trianglify/0.3.1/trianglify.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <!-- CSS Links --> + <link rel="stylesheet" href="/about/css/main.css"> + <link rel="stylesheet" href="/about/css/navigation-bar.css"> + <link rel="stylesheet" href="/about/css/loader-animation.css"> + <link rel="stylesheet" href="/about/css/blog-slider.css"> + <link rel="stylesheet" href="/404/css/main.css"> + <!-- Invisible Scripts --> + <script src="/js/loader-animation.js"></script> + <script src="/404/js/redirect-to-mobile.js"></script> + </head> + <body> + <!-- Visable Scripts --> + <script src="/js/background-sparkles.js"></script> + + <!-- Navigation Bar --> + <div class="navigation-bar"> + <nav class="nav"> + <a href="/home/" class="nav-item" active-color="orange">Home</a> + <!-- Had `is-active` after it but removed it due to not highlighting. --> + <a href="/about/" class="nav-item" active-color="green">About</a> <!-- About --> + <!--<a href="https://p.s1n.pw/" class="nav-item" active-color="blue">Portfolio</a> <!-- Testimonials --> + <a href="https://cyne.cf/status" class="nav-item" active-color="red">Status</a> <!-- Blog --> + <!--<a href="/cars/" class="nav-item" active-color="rebeccapurple">Cars</a> <!-- Contact --> + <!--<a href="https://nani.s1n.pw" class="nav-item" active-color="rebeccapurple">Nani?!</a>--> + <span class="nav-indicator"></span> + </nav> + </div> + + <div class="bio"> + <div class="links"> + <div class="blog-slider"> + <div class="content" style="text-align: center;"> + <h1>Error</h1> + <h2>User not found</h2> + <h1> + <!-- Filler --> + </h1> + </div> + </div> + </div> + </div> + + <!-- Loading Animation --> + <div class="loader-wrapper"> + <div class="loader"> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + </div> + </div> + </body> +</html> diff --git a/pass.php b/pass.php new file mode 100644 index 0000000..6e5652c --- /dev/null +++ b/pass.php @@ -0,0 +1,10 @@ +<?php + /* Your password */ + $password = 'KONAMI'; + + if (empty($_COOKIE['password']) || $_COOKIE['password'] !== $password) { + // Password not set or incorrect. Send to login.php. + header('Location: login.php'); + exit; + } +?>
\ No newline at end of file diff --git a/path-tracer/.htaccess b/path-tracer/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/path-tracer/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/path-tracer/css/main.css b/path-tracer/css/main.css new file mode 100644 index 0000000..a163135 --- /dev/null +++ b/path-tracer/css/main.css @@ -0,0 +1,60 @@ +body { + max-width: 900px; + padding: 30px; + margin: 0 auto; + font: 14px/19px 'Lucida Grande', sans-serif; +} + +#main { + margin: 80px 0; + padding-left: 542px; + height: 512px; + position: relative; +} + +#error { + position: absolute; + left: 0; + top: 0; + width: 412px; + height: 412px; + padding: 50px; + text-align: center; + background: #DFDFDF; +} + +canvas { + position: absolute; + left: 0; + top: 0; +} + +p, +ul { + margin: 0 0 30px 0; +} + +h1 { + font: bold italic 50px Georgia; + margin: 0 0 60px 0; + text-align: center; +} + +a { + color: inherit; +} + +#footer { + text-align: center; + margin: 100px 0 0 0; +} + +#glossiness-factor { + display: none; + font-size: 12px; +} + +#glossiness-factor input { + width: 40px; + text-align: center; +}
\ No newline at end of file diff --git a/path-tracer/index.html b/path-tracer/index.html new file mode 100644 index 0000000..bf75a11 --- /dev/null +++ b/path-tracer/index.html @@ -0,0 +1,72 @@ +<!DOCTYPE html> +<html> +<head> + <title>s1nical - WebGL Path Tracing</title> + <!-- Site metadata --> + <meta name="description" content="WebGL Path Tracing"> + <meta property="og:description" content="WebGL Path Tracing"> + <meta property="og:title" content="s1nical - WebGL Path Tracing"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/path-tracer"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/path-tracer"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "WebGL Path Tracing", + "headline": "WebGL Path Tracing", + "url": "https://cyne.cf/path-tracers", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <link rel="stylesheet" href="/path-tracer/css/main.css"> + <script src="/path-tracer/js/main.js"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/97/three.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> +</head> + <body> + <div id="main"> + <canvas id="canvas" width="512" height="512"></canvas> + <div id="error"><noscript>Please enable JavaScript</noscript></div> + + <p> + <b>Material:</b> + <select id="material"> + <option value="0" selected>Diffuse</option> + <option value="1">Mirror</option> + <option value="2">Glossy</option> + </select> + <span id="glossiness-factor"> + <br>with glossiness factor: 0 < <input id="glossiness" value="0.6"> < 1 + </span> + <br> + + <b>Environment:</b> + <select id="environment"> + <option value="0" selected>Cornell Box - Yellow and Blue</option> + <option value="1">Cornell Box - Red and Green</option> + </select> + </p> + </div> + </body> +</html>
\ No newline at end of file diff --git a/path-tracer/js/main.js b/path-tracer/js/main.js new file mode 100644 index 0000000..f8ecb88 --- /dev/null +++ b/path-tracer/js/main.js @@ -0,0 +1,2655 @@ +// augment Sylvester some +Matrix.Translation = function (v) { + if (v.elements.length == 2) { + var r = Matrix.I(3); + r.elements[2][0] = v.elements[0]; + r.elements[2][1] = v.elements[1]; + return r; + } + + if (v.elements.length == 3) { + var r = Matrix.I(4); + r.elements[0][3] = v.elements[0]; + r.elements[1][3] = v.elements[1]; + r.elements[2][3] = v.elements[2]; + return r; + } + + throw "Invalid length for Translation"; +} + +Matrix.prototype.flatten = function () { + var result = []; + if (this.elements.length == 0) + return []; + + + for (var j = 0; j < this.elements[0].length; j++) + for (var i = 0; i < this.elements.length; i++) + result.push(this.elements[i][j]); + return result; +} + +Matrix.prototype.ensure4x4 = function () { + if (this.elements.length == 4 && + this.elements[0].length == 4) + return this; + + if (this.elements.length > 4 || + this.elements[0].length > 4) + return null; + + for (var i = 0; i < this.elements.length; i++) { + for (var j = this.elements[i].length; j < 4; j++) { + if (i == j) + this.elements[i].push(1); + else + this.elements[i].push(0); + } + } + + for (var i = this.elements.length; i < 4; i++) { + if (i == 0) + this.elements.push([1, 0, 0, 0]); + else if (i == 1) + this.elements.push([0, 1, 0, 0]); + else if (i == 2) + this.elements.push([0, 0, 1, 0]); + else if (i == 3) + this.elements.push([0, 0, 0, 1]); + } + + return this; +}; + +Matrix.prototype.make3x3 = function () { + if (this.elements.length != 4 || + this.elements[0].length != 4) + return null; + + return Matrix.create([[this.elements[0][0], this.elements[0][1], this.elements[0][2]], + [this.elements[1][0], this.elements[1][1], this.elements[1][2]], + [this.elements[2][0], this.elements[2][1], this.elements[2][2]]]); +}; + +Vector.prototype.flatten = function () { + return this.elements; +}; + +function mht(m) { + var s = ""; + if (m.length == 16) { + for (var i = 0; i < 4; i++) { + s += "<span style='font-family: monospace'>[" + m[i * 4 + 0].toFixed(4) + "," + m[i * 4 + 1].toFixed(4) + "," + m[i * 4 + 2].toFixed(4) + "," + m[i * 4 + 3].toFixed(4) + "]</span><br>"; + } + } else if (m.length == 9) { + for (var i = 0; i < 3; i++) { + s += "<span style='font-family: monospace'>[" + m[i * 3 + 0].toFixed(4) + "," + m[i * 3 + 1].toFixed(4) + "," + m[i * 3 + 2].toFixed(4) + "]</font><br>"; + } + } else { + return m.toString(); + } + return s; +} + +// +// gluLookAt +// +function makeLookAt(ex, ey, ez, + cx, cy, cz, + ux, uy, uz) { + var eye = $V([ex, ey, ez]); + var center = $V([cx, cy, cz]); + var up = $V([ux, uy, uz]); + + var mag; + + var z = eye.subtract(center).toUnitVector(); + var x = up.cross(z).toUnitVector(); + var y = z.cross(x).toUnitVector(); + + var m = $M([[x.e(1), x.e(2), x.e(3), 0], + [y.e(1), y.e(2), y.e(3), 0], + [z.e(1), z.e(2), z.e(3), 0], + [0, 0, 0, 1]]); + + var t = $M([[1, 0, 0, -ex], + [0, 1, 0, -ey], + [0, 0, 1, -ez], + [0, 0, 0, 1]]); + return m.x(t); +} + +// +// glOrtho +// +function makeOrtho(left, right, + bottom, top, + znear, zfar) { + var tx = -(right + left) / (right - left); + var ty = -(top + bottom) / (top - bottom); + var tz = -(zfar + znear) / (zfar - znear); + + return $M([[2 / (right - left), 0, 0, tx], + [0, 2 / (top - bottom), 0, ty], + [0, 0, -2 / (zfar - znear), tz], + [0, 0, 0, 1]]); +} + +// +// gluPerspective +// +function makePerspective(fovy, aspect, znear, zfar) { + var ymax = znear * Math.tan(fovy * Math.PI / 360.0); + var ymin = -ymax; + var xmin = ymin * aspect; + var xmax = ymax * aspect; + + return makeFrustum(xmin, xmax, ymin, ymax, znear, zfar); +} + +// +// glFrustum +// +function makeFrustum(left, right, + bottom, top, + znear, zfar) { + var X = 2 * znear / (right - left); + var Y = 2 * znear / (top - bottom); + var A = (right + left) / (right - left); + var B = (top + bottom) / (top - bottom); + var C = -(zfar + znear) / (zfar - znear); + var D = -2 * zfar * znear / (zfar - znear); + + return $M([[X, 0, A, 0], + [0, Y, B, 0], + [0, 0, C, D], + [0, 0, -1, 0]]); +} + +// +// glOrtho +// +function makeOrtho(left, right, bottom, top, znear, zfar) { + var tx = - (right + left) / (right - left); + var ty = - (top + bottom) / (top - bottom); + var tz = - (zfar + znear) / (zfar - znear); + + return $M([[2 / (right - left), 0, 0, tx], + [0, 2 / (top - bottom), 0, ty], + [0, 0, -2 / (zfar - znear), tz], + [0, 0, 0, 1]]); +} + + + +// === Sylvester === +// Vector and Matrix mathematics modules for JavaScript +// Copyright (c) 2007 James Coglan +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +var Sylvester = { + version: '0.1.3', + precision: 1e-6 +}; + +function Vector() { } +Vector.prototype = { + + // Returns element i of the vector + e: function (i) { + return (i < 1 || i > this.elements.length) ? null : this.elements[i - 1]; + }, + + // Returns the number of elements the vector has + dimensions: function () { + return this.elements.length; + }, + + // Returns the modulus ('length') of the vector + modulus: function () { + return Math.sqrt(this.dot(this)); + }, + + // Returns true iff the vector is equal to the argument + eql: function (vector) { + var n = this.elements.length; + var V = vector.elements || vector; + if (n != V.length) { return false; } + do { + if (Math.abs(this.elements[n - 1] - V[n - 1]) > Sylvester.precision) { return false; } + } while (--n); + return true; + }, + + // Returns a copy of the vector + dup: function () { + return Vector.create(this.elements); + }, + + // Maps the vector to another vector according to the given function + map: function (fn) { + var elements = []; + this.each(function (x, i) { + elements.push(fn(x, i)); + }); + return Vector.create(elements); + }, + + // Calls the iterator for each element of the vector in turn + each: function (fn) { + var n = this.elements.length, k = n, i; + do { + i = k - n; + fn(this.elements[i], i + 1); + } while (--n); + }, + + // Returns a new vector created by normalizing the receiver + toUnitVector: function () { + var r = this.modulus(); + if (r === 0) { return this.dup(); } + return this.map(function (x) { return x / r; }); + }, + + // Returns the angle between the vector and the argument (also a vector) + angleFrom: function (vector) { + var V = vector.elements || vector; + var n = this.elements.length, k = n, i; + if (n != V.length) { return null; } + var dot = 0, mod1 = 0, mod2 = 0; + // Work things out in parallel to save time + this.each(function (x, i) { + dot += x * V[i - 1]; + mod1 += x * x; + mod2 += V[i - 1] * V[i - 1]; + }); + mod1 = Math.sqrt(mod1); mod2 = Math.sqrt(mod2); + if (mod1 * mod2 === 0) { return null; } + var theta = dot / (mod1 * mod2); + if (theta < -1) { theta = -1; } + if (theta > 1) { theta = 1; } + return Math.acos(theta); + }, + + // Returns true iff the vector is parallel to the argument + isParallelTo: function (vector) { + var angle = this.angleFrom(vector); + return (angle === null) ? null : (angle <= Sylvester.precision); + }, + + // Returns true iff the vector is antiparallel to the argument + isAntiparallelTo: function (vector) { + var angle = this.angleFrom(vector); + return (angle === null) ? null : (Math.abs(angle - Math.PI) <= Sylvester.precision); + }, + + // Returns true iff the vector is perpendicular to the argument + isPerpendicularTo: function (vector) { + var dot = this.dot(vector); + return (dot === null) ? null : (Math.abs(dot) <= Sylvester.precision); + }, + + // Returns the result of adding the argument to the vector + add: function (vector) { + var V = vector.elements || vector; + if (this.elements.length != V.length) { return null; } + return this.map(function (x, i) { return x + V[i - 1]; }); + }, + + // Returns the result of subtracting the argument from the vector + subtract: function (vector) { + var V = vector.elements || vector; + if (this.elements.length != V.length) { return null; } + return this.map(function (x, i) { return x - V[i - 1]; }); + }, + + // Returns the result of multiplying the elements of the vector by the argument + multiply: function (k) { + return this.map(function (x) { return x * k; }); + }, + + x: function (k) { return this.multiply(k); }, + + // Returns the scalar product of the vector with the argument + // Both vectors must have equal dimensionality + dot: function (vector) { + var V = vector.elements || vector; + var i, product = 0, n = this.elements.length; + if (n != V.length) { return null; } + do { product += this.elements[n - 1] * V[n - 1]; } while (--n); + return product; + }, + + // Returns the vector product of the vector with the argument + // Both vectors must have dimensionality 3 + cross: function (vector) { + var B = vector.elements || vector; + if (this.elements.length != 3 || B.length != 3) { return null; } + var A = this.elements; + return Vector.create([ + (A[1] * B[2]) - (A[2] * B[1]), + (A[2] * B[0]) - (A[0] * B[2]), + (A[0] * B[1]) - (A[1] * B[0]) + ]); + }, + + // Returns the (absolute) largest element of the vector + max: function () { + var m = 0, n = this.elements.length, k = n, i; + do { + i = k - n; + if (Math.abs(this.elements[i]) > Math.abs(m)) { m = this.elements[i]; } + } while (--n); + return m; + }, + + // Returns the index of the first match found + indexOf: function (x) { + var index = null, n = this.elements.length, k = n, i; + do { + i = k - n; + if (index === null && this.elements[i] == x) { + index = i + 1; + } + } while (--n); + return index; + }, + + // Returns a diagonal matrix with the vector's elements as its diagonal elements + toDiagonalMatrix: function () { + return Matrix.Diagonal(this.elements); + }, + + // Returns the result of rounding the elements of the vector + round: function () { + return this.map(function (x) { return Math.round(x); }); + }, + + // Returns a copy of the vector with elements set to the given value if they + // differ from it by less than Sylvester.precision + snapTo: function (x) { + return this.map(function (y) { + return (Math.abs(y - x) <= Sylvester.precision) ? x : y; + }); + }, + + // Returns the vector's distance from the argument, when considered as a point in space + distanceFrom: function (obj) { + if (obj.anchor) { return obj.distanceFrom(this); } + var V = obj.elements || obj; + if (V.length != this.elements.length) { return null; } + var sum = 0, part; + this.each(function (x, i) { + part = x - V[i - 1]; + sum += part * part; + }); + return Math.sqrt(sum); + }, + + // Returns true if the vector is point on the given line + liesOn: function (line) { + return line.contains(this); + }, + + // Return true iff the vector is a point in the given plane + liesIn: function (plane) { + return plane.contains(this); + }, + + // Rotates the vector about the given object. The object should be a + // point if the vector is 2D, and a line if it is 3D. Be careful with line directions! + rotate: function (t, obj) { + var V, R, x, y, z; + switch (this.elements.length) { + case 2: + V = obj.elements || obj; + if (V.length != 2) { return null; } + R = Matrix.Rotation(t).elements; + x = this.elements[0] - V[0]; + y = this.elements[1] - V[1]; + return Vector.create([ + V[0] + R[0][0] * x + R[0][1] * y, + V[1] + R[1][0] * x + R[1][1] * y + ]); + break; + case 3: + if (!obj.direction) { return null; } + var C = obj.pointClosestTo(this).elements; + R = Matrix.Rotation(t, obj.direction).elements; + x = this.elements[0] - C[0]; + y = this.elements[1] - C[1]; + z = this.elements[2] - C[2]; + return Vector.create([ + C[0] + R[0][0] * x + R[0][1] * y + R[0][2] * z, + C[1] + R[1][0] * x + R[1][1] * y + R[1][2] * z, + C[2] + R[2][0] * x + R[2][1] * y + R[2][2] * z + ]); + break; + default: + return null; + } + }, + + // Returns the result of reflecting the point in the given point, line or plane + reflectionIn: function (obj) { + if (obj.anchor) { + // obj is a plane or line + var P = this.elements.slice(); + var C = obj.pointClosestTo(P).elements; + return Vector.create([C[0] + (C[0] - P[0]), C[1] + (C[1] - P[1]), C[2] + (C[2] - (P[2] || 0))]); + } else { + // obj is a point + var Q = obj.elements || obj; + if (this.elements.length != Q.length) { return null; } + return this.map(function (x, i) { return Q[i - 1] + (Q[i - 1] - x); }); + } + }, + + // Utility to make sure vectors are 3D. If they are 2D, a zero z-component is added + to3D: function () { + var V = this.dup(); + switch (V.elements.length) { + case 3: break; + case 2: V.elements.push(0); break; + default: return null; + } + return V; + }, + + // Returns a string representation of the vector + inspect: function () { + return '[' + this.elements.join(', ') + ']'; + }, + + // Set vector's elements from an array + setElements: function (els) { + this.elements = (els.elements || els).slice(); + return this; + } +}; + +// Constructor function +Vector.create = function (elements) { + var V = new Vector(); + return V.setElements(elements); +}; + +// i, j, k unit vectors +Vector.i = Vector.create([1, 0, 0]); +Vector.j = Vector.create([0, 1, 0]); +Vector.k = Vector.create([0, 0, 1]); + +// Random vector of size n +Vector.Random = function (n) { + var elements = []; + do { + elements.push(Math.random()); + } while (--n); + return Vector.create(elements); +}; + +// Vector filled with zeros +Vector.Zero = function (n) { + var elements = []; + do { + elements.push(0); + } while (--n); + return Vector.create(elements); +}; + + + +function Matrix() { } +Matrix.prototype = { + + // Returns element (i,j) of the matrix + e: function (i, j) { + if (i < 1 || i > this.elements.length || j < 1 || j > this.elements[0].length) { return null; } + return this.elements[i - 1][j - 1]; + }, + + // Returns row k of the matrix as a vector + row: function (i) { + if (i > this.elements.length) { return null; } + return Vector.create(this.elements[i - 1]); + }, + + // Returns column k of the matrix as a vector + col: function (j) { + if (j > this.elements[0].length) { return null; } + var col = [], n = this.elements.length, k = n, i; + do { + i = k - n; + col.push(this.elements[i][j - 1]); + } while (--n); + return Vector.create(col); + }, + + // Returns the number of rows/columns the matrix has + dimensions: function () { + return { rows: this.elements.length, cols: this.elements[0].length }; + }, + + // Returns the number of rows in the matrix + rows: function () { + return this.elements.length; + }, + + // Returns the number of columns in the matrix + cols: function () { + return this.elements[0].length; + }, + + // Returns true iff the matrix is equal to the argument. You can supply + // a vector as the argument, in which case the receiver must be a + // one-column matrix equal to the vector. + eql: function (matrix) { + var M = matrix.elements || matrix; + if (typeof (M[0][0]) == 'undefined') { M = Matrix.create(M).elements; } + if (this.elements.length != M.length || + this.elements[0].length != M[0].length) { return false; } + var ni = this.elements.length, ki = ni, i, nj, kj = this.elements[0].length, j; + do { + i = ki - ni; + nj = kj; + do { + j = kj - nj; + if (Math.abs(this.elements[i][j] - M[i][j]) > Sylvester.precision) { return false; } + } while (--nj); + } while (--ni); + return true; + }, + + // Returns a copy of the matrix + dup: function () { + return Matrix.create(this.elements); + }, + + // Maps the matrix to another matrix (of the same dimensions) according to the given function + map: function (fn) { + var els = [], ni = this.elements.length, ki = ni, i, nj, kj = this.elements[0].length, j; + do { + i = ki - ni; + nj = kj; + els[i] = []; + do { + j = kj - nj; + els[i][j] = fn(this.elements[i][j], i + 1, j + 1); + } while (--nj); + } while (--ni); + return Matrix.create(els); + }, + + // Returns true iff the argument has the same dimensions as the matrix + isSameSizeAs: function (matrix) { + var M = matrix.elements || matrix; + if (typeof (M[0][0]) == 'undefined') { M = Matrix.create(M).elements; } + return (this.elements.length == M.length && + this.elements[0].length == M[0].length); + }, + + // Returns the result of adding the argument to the matrix + add: function (matrix) { + var M = matrix.elements || matrix; + if (typeof (M[0][0]) == 'undefined') { M = Matrix.create(M).elements; } + if (!this.isSameSizeAs(M)) { return null; } + return this.map(function (x, i, j) { return x + M[i - 1][j - 1]; }); + }, + + // Returns the result of subtracting the argument from the matrix + subtract: function (matrix) { + var M = matrix.elements || matrix; + if (typeof (M[0][0]) == 'undefined') { M = Matrix.create(M).elements; } + if (!this.isSameSizeAs(M)) { return null; } + return this.map(function (x, i, j) { return x - M[i - 1][j - 1]; }); + }, + + // Returns true iff the matrix can multiply the argument from the left + canMultiplyFromLeft: function (matrix) { + var M = matrix.elements || matrix; + if (typeof (M[0][0]) == 'undefined') { M = Matrix.create(M).elements; } + // this.columns should equal matrix.rows + return (this.elements[0].length == M.length); + }, + + // Returns the result of multiplying the matrix from the right by the argument. + // If the argument is a scalar then just multiply all the elements. If the argument is + // a vector, a vector is returned, which saves you having to remember calling + // col(1) on the result. + multiply: function (matrix) { + if (!matrix.elements) { + return this.map(function (x) { return x * matrix; }); + } + var returnVector = matrix.modulus ? true : false; + var M = matrix.elements || matrix; + if (typeof (M[0][0]) == 'undefined') { M = Matrix.create(M).elements; } + if (!this.canMultiplyFromLeft(M)) { return null; } + var ni = this.elements.length, ki = ni, i, nj, kj = M[0].length, j; + var cols = this.elements[0].length, elements = [], sum, nc, c; + do { + i = ki - ni; + elements[i] = []; + nj = kj; + do { + j = kj - nj; + sum = 0; + nc = cols; + do { + c = cols - nc; + sum += this.elements[i][c] * M[c][j]; + } while (--nc); + elements[i][j] = sum; + } while (--nj); + } while (--ni); + var M = Matrix.create(elements); + return returnVector ? M.col(1) : M; + }, + + x: function (matrix) { return this.multiply(matrix); }, + + // Returns a submatrix taken from the matrix + // Argument order is: start row, start col, nrows, ncols + // Element selection wraps if the required index is outside the matrix's bounds, so you could + // use this to perform row/column cycling or copy-augmenting. + minor: function (a, b, c, d) { + var elements = [], ni = c, i, nj, j; + var rows = this.elements.length, cols = this.elements[0].length; + do { + i = c - ni; + elements[i] = []; + nj = d; + do { + j = d - nj; + elements[i][j] = this.elements[(a + i - 1) % rows][(b + j - 1) % cols]; + } while (--nj); + } while (--ni); + return Matrix.create(elements); + }, + + // Returns the transpose of the matrix + transpose: function () { + var rows = this.elements.length, cols = this.elements[0].length; + var elements = [], ni = cols, i, nj, j; + do { + i = cols - ni; + elements[i] = []; + nj = rows; + do { + j = rows - nj; + elements[i][j] = this.elements[j][i]; + } while (--nj); + } while (--ni); + return Matrix.create(elements); + }, + + // Returns true iff the matrix is square + isSquare: function () { + return (this.elements.length == this.elements[0].length); + }, + + // Returns the (absolute) largest element of the matrix + max: function () { + var m = 0, ni = this.elements.length, ki = ni, i, nj, kj = this.elements[0].length, j; + do { + i = ki - ni; + nj = kj; + do { + j = kj - nj; + if (Math.abs(this.elements[i][j]) > Math.abs(m)) { m = this.elements[i][j]; } + } while (--nj); + } while (--ni); + return m; + }, + + // Returns the indeces of the first match found by reading row-by-row from left to right + indexOf: function (x) { + var index = null, ni = this.elements.length, ki = ni, i, nj, kj = this.elements[0].length, j; + do { + i = ki - ni; + nj = kj; + do { + j = kj - nj; + if (this.elements[i][j] == x) { return { i: i + 1, j: j + 1 }; } + } while (--nj); + } while (--ni); + return null; + }, + + // If the matrix is square, returns the diagonal elements as a vector. + // Otherwise, returns null. + diagonal: function () { + if (!this.isSquare) { return null; } + var els = [], n = this.elements.length, k = n, i; + do { + i = k - n; + els.push(this.elements[i][i]); + } while (--n); + return Vector.create(els); + }, + + // Make the matrix upper (right) triangular by Gaussian elimination. + // This method only adds multiples of rows to other rows. No rows are + // scaled up or switched, and the determinant is preserved. + toRightTriangular: function () { + var M = this.dup(), els; + var n = this.elements.length, k = n, i, np, kp = this.elements[0].length, p; + do { + i = k - n; + if (M.elements[i][i] == 0) { + for (j = i + 1; j < k; j++) { + if (M.elements[j][i] != 0) { + els = []; np = kp; + do { + p = kp - np; + els.push(M.elements[i][p] + M.elements[j][p]); + } while (--np); + M.elements[i] = els; + break; + } + } + } + if (M.elements[i][i] != 0) { + for (j = i + 1; j < k; j++) { + var multiplier = M.elements[j][i] / M.elements[i][i]; + els = []; np = kp; + do { + p = kp - np; + // Elements with column numbers up to an including the number + // of the row that we're subtracting can safely be set straight to + // zero, since that's the point of this routine and it avoids having + // to loop over and correct rounding errors later + els.push(p <= i ? 0 : M.elements[j][p] - M.elements[i][p] * multiplier); + } while (--np); + M.elements[j] = els; + } + } + } while (--n); + return M; + }, + + toUpperTriangular: function () { return this.toRightTriangular(); }, + + // Returns the determinant for square matrices + determinant: function () { + if (!this.isSquare()) { return null; } + var M = this.toRightTriangular(); + var det = M.elements[0][0], n = M.elements.length - 1, k = n, i; + do { + i = k - n + 1; + det = det * M.elements[i][i]; + } while (--n); + return det; + }, + + det: function () { return this.determinant(); }, + + // Returns true iff the matrix is singular + isSingular: function () { + return (this.isSquare() && this.determinant() === 0); + }, + + // Returns the trace for square matrices + trace: function () { + if (!this.isSquare()) { return null; } + var tr = this.elements[0][0], n = this.elements.length - 1, k = n, i; + do { + i = k - n + 1; + tr += this.elements[i][i]; + } while (--n); + return tr; + }, + + tr: function () { return this.trace(); }, + + // Returns the rank of the matrix + rank: function () { + var M = this.toRightTriangular(), rank = 0; + var ni = this.elements.length, ki = ni, i, nj, kj = this.elements[0].length, j; + do { + i = ki - ni; + nj = kj; + do { + j = kj - nj; + if (Math.abs(M.elements[i][j]) > Sylvester.precision) { rank++; break; } + } while (--nj); + } while (--ni); + return rank; + }, + + rk: function () { return this.rank(); }, + + // Returns the result of attaching the given argument to the right-hand side of the matrix + augment: function (matrix) { + var M = matrix.elements || matrix; + if (typeof (M[0][0]) == 'undefined') { M = Matrix.create(M).elements; } + var T = this.dup(), cols = T.elements[0].length; + var ni = T.elements.length, ki = ni, i, nj, kj = M[0].length, j; + if (ni != M.length) { return null; } + do { + i = ki - ni; + nj = kj; + do { + j = kj - nj; + T.elements[i][cols + j] = M[i][j]; + } while (--nj); + } while (--ni); + return T; + }, + + // Returns the inverse (if one exists) using Gauss-Jordan + inverse: function () { + if (!this.isSquare() || this.isSingular()) { return null; } + var ni = this.elements.length, ki = ni, i, j; + var M = this.augment(Matrix.I(ni)).toRightTriangular(); + var np, kp = M.elements[0].length, p, els, divisor; + var inverse_elements = [], new_element; + // Matrix is non-singular so there will be no zeros on the diagonal + // Cycle through rows from last to first + do { + i = ni - 1; + // First, normalise diagonal elements to 1 + els = []; np = kp; + inverse_elements[i] = []; + divisor = M.elements[i][i]; + do { + p = kp - np; + new_element = M.elements[i][p] / divisor; + els.push(new_element); + // Shuffle of the current row of the right hand side into the results + // array as it will not be modified by later runs through this loop + if (p >= ki) { inverse_elements[i].push(new_element); } + } while (--np); + M.elements[i] = els; + // Then, subtract this row from those above it to + // give the identity matrix on the left hand side + for (j = 0; j < i; j++) { + els = []; np = kp; + do { + p = kp - np; + els.push(M.elements[j][p] - M.elements[i][p] * M.elements[j][i]); + } while (--np); + M.elements[j] = els; + } + } while (--ni); + return Matrix.create(inverse_elements); + }, + + inv: function () { return this.inverse(); }, + + // Returns the result of rounding all the elements + round: function () { + return this.map(function (x) { return Math.round(x); }); + }, + + // Returns a copy of the matrix with elements set to the given value if they + // differ from it by less than Sylvester.precision + snapTo: function (x) { + return this.map(function (p) { + return (Math.abs(p - x) <= Sylvester.precision) ? x : p; + }); + }, + + // Returns a string representation of the matrix + inspect: function () { + var matrix_rows = []; + var n = this.elements.length, k = n, i; + do { + i = k - n; + matrix_rows.push(Vector.create(this.elements[i]).inspect()); + } while (--n); + return matrix_rows.join('\n'); + }, + + // Set the matrix's elements from an array. If the argument passed + // is a vector, the resulting matrix will be a single column. + setElements: function (els) { + var i, elements = els.elements || els; + if (typeof (elements[0][0]) != 'undefined') { + var ni = elements.length, ki = ni, nj, kj, j; + this.elements = []; + do { + i = ki - ni; + nj = elements[i].length; kj = nj; + this.elements[i] = []; + do { + j = kj - nj; + this.elements[i][j] = elements[i][j]; + } while (--nj); + } while (--ni); + return this; + } + var n = elements.length, k = n; + this.elements = []; + do { + i = k - n; + this.elements.push([elements[i]]); + } while (--n); + return this; + } +}; + +// Constructor function +Matrix.create = function (elements) { + var M = new Matrix(); + return M.setElements(elements); +}; + +// Identity matrix of size n +Matrix.I = function (n) { + var els = [], k = n, i, nj, j; + do { + i = k - n; + els[i] = []; nj = k; + do { + j = k - nj; + els[i][j] = (i == j) ? 1 : 0; + } while (--nj); + } while (--n); + return Matrix.create(els); +}; + +// Diagonal matrix - all off-diagonal elements are zero +Matrix.Diagonal = function (elements) { + var n = elements.length, k = n, i; + var M = Matrix.I(n); + do { + i = k - n; + M.elements[i][i] = elements[i]; + } while (--n); + return M; +}; + +// Rotation matrix about some axis. If no axis is +// supplied, assume we're after a 2D transform +Matrix.Rotation = function (theta, a) { + if (!a) { + return Matrix.create([ + [Math.cos(theta), -Math.sin(theta)], + [Math.sin(theta), Math.cos(theta)] + ]); + } + var axis = a.dup(); + if (axis.elements.length != 3) { return null; } + var mod = axis.modulus(); + var x = axis.elements[0] / mod, y = axis.elements[1] / mod, z = axis.elements[2] / mod; + var s = Math.sin(theta), c = Math.cos(theta), t = 1 - c; + // Formula derived here: http://www.gamedev.net/reference/articles/article1199.asp + // That proof rotates the co-ordinate system so theta + // becomes -theta and sin becomes -sin here. + return Matrix.create([ + [t * x * x + c, t * x * y - s * z, t * x * z + s * y], + [t * x * y + s * z, t * y * y + c, t * y * z - s * x], + [t * x * z - s * y, t * y * z + s * x, t * z * z + c] + ]); +}; + +// Special case rotations +Matrix.RotationX = function (t) { + var c = Math.cos(t), s = Math.sin(t); + return Matrix.create([ + [1, 0, 0], + [0, c, -s], + [0, s, c] + ]); +}; +Matrix.RotationY = function (t) { + var c = Math.cos(t), s = Math.sin(t); + return Matrix.create([ + [c, 0, s], + [0, 1, 0], + [-s, 0, c] + ]); +}; +Matrix.RotationZ = function (t) { + var c = Math.cos(t), s = Math.sin(t); + return Matrix.create([ + [c, -s, 0], + [s, c, 0], + [0, 0, 1] + ]); +}; + +// Random matrix of n rows, m columns +Matrix.Random = function (n, m) { + return Matrix.Zero(n, m).map( + function () { return Math.random(); } + ); +}; + +// Matrix filled with zeros +Matrix.Zero = function (n, m) { + var els = [], ni = n, i, nj, j; + do { + i = n - ni; + els[i] = []; + nj = m; + do { + j = m - nj; + els[i][j] = 0; + } while (--nj); + } while (--ni); + return Matrix.create(els); +}; + + + +function Line() { } +Line.prototype = { + + // Returns true if the argument occupies the same space as the line + eql: function (line) { + return (this.isParallelTo(line) && this.contains(line.anchor)); + }, + + // Returns a copy of the line + dup: function () { + return Line.create(this.anchor, this.direction); + }, + + // Returns the result of translating the line by the given vector/array + translate: function (vector) { + var V = vector.elements || vector; + return Line.create([ + this.anchor.elements[0] + V[0], + this.anchor.elements[1] + V[1], + this.anchor.elements[2] + (V[2] || 0) + ], this.direction); + }, + + // Returns true if the line is parallel to the argument. Here, 'parallel to' + // means that the argument's direction is either parallel or antiparallel to + // the line's own direction. A line is parallel to a plane if the two do not + // have a unique intersection. + isParallelTo: function (obj) { + if (obj.normal) { return obj.isParallelTo(this); } + var theta = this.direction.angleFrom(obj.direction); + return (Math.abs(theta) <= Sylvester.precision || Math.abs(theta - Math.PI) <= Sylvester.precision); + }, + + // Returns the line's perpendicular distance from the argument, + // which can be a point, a line or a plane + distanceFrom: function (obj) { + if (obj.normal) { return obj.distanceFrom(this); } + if (obj.direction) { + // obj is a line + if (this.isParallelTo(obj)) { return this.distanceFrom(obj.anchor); } + var N = this.direction.cross(obj.direction).toUnitVector().elements; + var A = this.anchor.elements, B = obj.anchor.elements; + return Math.abs((A[0] - B[0]) * N[0] + (A[1] - B[1]) * N[1] + (A[2] - B[2]) * N[2]); + } else { + // obj is a point + var P = obj.elements || obj; + var A = this.anchor.elements, D = this.direction.elements; + var PA1 = P[0] - A[0], PA2 = P[1] - A[1], PA3 = (P[2] || 0) - A[2]; + var modPA = Math.sqrt(PA1 * PA1 + PA2 * PA2 + PA3 * PA3); + if (modPA === 0) return 0; + // Assumes direction vector is normalized + var cosTheta = (PA1 * D[0] + PA2 * D[1] + PA3 * D[2]) / modPA; + var sin2 = 1 - cosTheta * cosTheta; + return Math.abs(modPA * Math.sqrt(sin2 < 0 ? 0 : sin2)); + } + }, + + // Returns true iff the argument is a point on the line + contains: function (point) { + var dist = this.distanceFrom(point); + return (dist !== null && dist <= Sylvester.precision); + }, + + // Returns true iff the line lies in the given plane + liesIn: function (plane) { + return plane.contains(this); + }, + + // Returns true iff the line has a unique point of intersection with the argument + intersects: function (obj) { + if (obj.normal) { return obj.intersects(this); } + return (!this.isParallelTo(obj) && this.distanceFrom(obj) <= Sylvester.precision); + }, + + // Returns the unique intersection point with the argument, if one exists + intersectionWith: function (obj) { + if (obj.normal) { return obj.intersectionWith(this); } + if (!this.intersects(obj)) { return null; } + var P = this.anchor.elements, X = this.direction.elements, + Q = obj.anchor.elements, Y = obj.direction.elements; + var X1 = X[0], X2 = X[1], X3 = X[2], Y1 = Y[0], Y2 = Y[1], Y3 = Y[2]; + var PsubQ1 = P[0] - Q[0], PsubQ2 = P[1] - Q[1], PsubQ3 = P[2] - Q[2]; + var XdotQsubP = - X1 * PsubQ1 - X2 * PsubQ2 - X3 * PsubQ3; + var YdotPsubQ = Y1 * PsubQ1 + Y2 * PsubQ2 + Y3 * PsubQ3; + var XdotX = X1 * X1 + X2 * X2 + X3 * X3; + var YdotY = Y1 * Y1 + Y2 * Y2 + Y3 * Y3; + var XdotY = X1 * Y1 + X2 * Y2 + X3 * Y3; + var k = (XdotQsubP * YdotY / XdotX + XdotY * YdotPsubQ) / (YdotY - XdotY * XdotY); + return Vector.create([P[0] + k * X1, P[1] + k * X2, P[2] + k * X3]); + }, + + // Returns the point on the line that is closest to the given point or line + pointClosestTo: function (obj) { + if (obj.direction) { + // obj is a line + if (this.intersects(obj)) { return this.intersectionWith(obj); } + if (this.isParallelTo(obj)) { return null; } + var D = this.direction.elements, E = obj.direction.elements; + var D1 = D[0], D2 = D[1], D3 = D[2], E1 = E[0], E2 = E[1], E3 = E[2]; + // Create plane containing obj and the shared normal and intersect this with it + // Thank you: http://www.cgafaq.info/wiki/Line-line_distance + var x = (D3 * E1 - D1 * E3), y = (D1 * E2 - D2 * E1), z = (D2 * E3 - D3 * E2); + var N = Vector.create([x * E3 - y * E2, y * E1 - z * E3, z * E2 - x * E1]); + var P = Plane.create(obj.anchor, N); + return P.intersectionWith(this); + } else { + // obj is a point + var P = obj.elements || obj; + if (this.contains(P)) { return Vector.create(P); } + var A = this.anchor.elements, D = this.direction.elements; + var D1 = D[0], D2 = D[1], D3 = D[2], A1 = A[0], A2 = A[1], A3 = A[2]; + var x = D1 * (P[1] - A2) - D2 * (P[0] - A1), y = D2 * ((P[2] || 0) - A3) - D3 * (P[1] - A2), + z = D3 * (P[0] - A1) - D1 * ((P[2] || 0) - A3); + var V = Vector.create([D2 * x - D3 * z, D3 * y - D1 * x, D1 * z - D2 * y]); + var k = this.distanceFrom(P) / V.modulus(); + return Vector.create([ + P[0] + V.elements[0] * k, + P[1] + V.elements[1] * k, + (P[2] || 0) + V.elements[2] * k + ]); + } + }, + + // Returns a copy of the line rotated by t radians about the given line. Works by + // finding the argument's closest point to this line's anchor point (call this C) and + // rotating the anchor about C. Also rotates the line's direction about the argument's. + // Be careful with this - the rotation axis' direction affects the outcome! + rotate: function (t, line) { + // If we're working in 2D + if (typeof (line.direction) == 'undefined') { line = Line.create(line.to3D(), Vector.k); } + var R = Matrix.Rotation(t, line.direction).elements; + var C = line.pointClosestTo(this.anchor).elements; + var A = this.anchor.elements, D = this.direction.elements; + var C1 = C[0], C2 = C[1], C3 = C[2], A1 = A[0], A2 = A[1], A3 = A[2]; + var x = A1 - C1, y = A2 - C2, z = A3 - C3; + return Line.create([ + C1 + R[0][0] * x + R[0][1] * y + R[0][2] * z, + C2 + R[1][0] * x + R[1][1] * y + R[1][2] * z, + C3 + R[2][0] * x + R[2][1] * y + R[2][2] * z + ], [ + R[0][0] * D[0] + R[0][1] * D[1] + R[0][2] * D[2], + R[1][0] * D[0] + R[1][1] * D[1] + R[1][2] * D[2], + R[2][0] * D[0] + R[2][1] * D[1] + R[2][2] * D[2] + ]); + }, + + // Returns the line's reflection in the given point or line + reflectionIn: function (obj) { + if (obj.normal) { + // obj is a plane + var A = this.anchor.elements, D = this.direction.elements; + var A1 = A[0], A2 = A[1], A3 = A[2], D1 = D[0], D2 = D[1], D3 = D[2]; + var newA = this.anchor.reflectionIn(obj).elements; + // Add the line's direction vector to its anchor, then mirror that in the plane + var AD1 = A1 + D1, AD2 = A2 + D2, AD3 = A3 + D3; + var Q = obj.pointClosestTo([AD1, AD2, AD3]).elements; + var newD = [Q[0] + (Q[0] - AD1) - newA[0], Q[1] + (Q[1] - AD2) - newA[1], Q[2] + (Q[2] - AD3) - newA[2]]; + return Line.create(newA, newD); + } else if (obj.direction) { + // obj is a line - reflection obtained by rotating PI radians about obj + return this.rotate(Math.PI, obj); + } else { + // obj is a point - just reflect the line's anchor in it + var P = obj.elements || obj; + return Line.create(this.anchor.reflectionIn([P[0], P[1], (P[2] || 0)]), this.direction); + } + }, + + // Set the line's anchor point and direction. + setVectors: function (anchor, direction) { + // Need to do this so that line's properties are not + // references to the arguments passed in + anchor = Vector.create(anchor); + direction = Vector.create(direction); + if (anchor.elements.length == 2) { anchor.elements.push(0); } + if (direction.elements.length == 2) { direction.elements.push(0); } + if (anchor.elements.length > 3 || direction.elements.length > 3) { return null; } + var mod = direction.modulus(); + if (mod === 0) { return null; } + this.anchor = anchor; + this.direction = Vector.create([ + direction.elements[0] / mod, + direction.elements[1] / mod, + direction.elements[2] / mod + ]); + return this; + } +}; + + +// Constructor function +Line.create = function (anchor, direction) { + var L = new Line(); + return L.setVectors(anchor, direction); +}; + +// Axes +Line.X = Line.create(Vector.Zero(3), Vector.i); +Line.Y = Line.create(Vector.Zero(3), Vector.j); +Line.Z = Line.create(Vector.Zero(3), Vector.k); + + + +function Plane() { } +Plane.prototype = { + + // Returns true iff the plane occupies the same space as the argument + eql: function (plane) { + return (this.contains(plane.anchor) && this.isParallelTo(plane)); + }, + + // Returns a copy of the plane + dup: function () { + return Plane.create(this.anchor, this.normal); + }, + + // Returns the result of translating the plane by the given vector + translate: function (vector) { + var V = vector.elements || vector; + return Plane.create([ + this.anchor.elements[0] + V[0], + this.anchor.elements[1] + V[1], + this.anchor.elements[2] + (V[2] || 0) + ], this.normal); + }, + + // Returns true iff the plane is parallel to the argument. Will return true + // if the planes are equal, or if you give a line and it lies in the plane. + isParallelTo: function (obj) { + var theta; + if (obj.normal) { + // obj is a plane + theta = this.normal.angleFrom(obj.normal); + return (Math.abs(theta) <= Sylvester.precision || Math.abs(Math.PI - theta) <= Sylvester.precision); + } else if (obj.direction) { + // obj is a line + return this.normal.isPerpendicularTo(obj.direction); + } + return null; + }, + + // Returns true iff the receiver is perpendicular to the argument + isPerpendicularTo: function (plane) { + var theta = this.normal.angleFrom(plane.normal); + return (Math.abs(Math.PI / 2 - theta) <= Sylvester.precision); + }, + + // Returns the plane's distance from the given object (point, line or plane) + distanceFrom: function (obj) { + if (this.intersects(obj) || this.contains(obj)) { return 0; } + if (obj.anchor) { + // obj is a plane or line + var A = this.anchor.elements, B = obj.anchor.elements, N = this.normal.elements; + return Math.abs((A[0] - B[0]) * N[0] + (A[1] - B[1]) * N[1] + (A[2] - B[2]) * N[2]); + } else { + // obj is a point + var P = obj.elements || obj; + var A = this.anchor.elements, N = this.normal.elements; + return Math.abs((A[0] - P[0]) * N[0] + (A[1] - P[1]) * N[1] + (A[2] - (P[2] || 0)) * N[2]); + } + }, + + // Returns true iff the plane contains the given point or line + contains: function (obj) { + if (obj.normal) { return null; } + if (obj.direction) { + return (this.contains(obj.anchor) && this.contains(obj.anchor.add(obj.direction))); + } else { + var P = obj.elements || obj; + var A = this.anchor.elements, N = this.normal.elements; + var diff = Math.abs(N[0] * (A[0] - P[0]) + N[1] * (A[1] - P[1]) + N[2] * (A[2] - (P[2] || 0))); + return (diff <= Sylvester.precision); + } + }, + + // Returns true iff the plane has a unique point/line of intersection with the argument + intersects: function (obj) { + if (typeof (obj.direction) == 'undefined' && typeof (obj.normal) == 'undefined') { return null; } + return !this.isParallelTo(obj); + }, + + // Returns the unique intersection with the argument, if one exists. The result + // will be a vector if a line is supplied, and a line if a plane is supplied. + intersectionWith: function (obj) { + if (!this.intersects(obj)) { return null; } + if (obj.direction) { + // obj is a line + var A = obj.anchor.elements, D = obj.direction.elements, + P = this.anchor.elements, N = this.normal.elements; + var multiplier = (N[0] * (P[0] - A[0]) + N[1] * (P[1] - A[1]) + N[2] * (P[2] - A[2])) / (N[0] * D[0] + N[1] * D[1] + N[2] * D[2]); + return Vector.create([A[0] + D[0] * multiplier, A[1] + D[1] * multiplier, A[2] + D[2] * multiplier]); + } else if (obj.normal) { + // obj is a plane + var direction = this.normal.cross(obj.normal).toUnitVector(); + // To find an anchor point, we find one co-ordinate that has a value + // of zero somewhere on the intersection, and remember which one we picked + var N = this.normal.elements, A = this.anchor.elements, + O = obj.normal.elements, B = obj.anchor.elements; + var solver = Matrix.Zero(2, 2), i = 0; + while (solver.isSingular()) { + i++; + solver = Matrix.create([ + [N[i % 3], N[(i + 1) % 3]], + [O[i % 3], O[(i + 1) % 3]] + ]); + } + // Then we solve the simultaneous equations in the remaining dimensions + var inverse = solver.inverse().elements; + var x = N[0] * A[0] + N[1] * A[1] + N[2] * A[2]; + var y = O[0] * B[0] + O[1] * B[1] + O[2] * B[2]; + var intersection = [ + inverse[0][0] * x + inverse[0][1] * y, + inverse[1][0] * x + inverse[1][1] * y + ]; + var anchor = []; + for (var j = 1; j <= 3; j++) { + // This formula picks the right element from intersection by + // cycling depending on which element we set to zero above + anchor.push((i == j) ? 0 : intersection[(j + (5 - i) % 3) % 3]); + } + return Line.create(anchor, direction); + } + }, + + // Returns the point in the plane closest to the given point + pointClosestTo: function (point) { + var P = point.elements || point; + var A = this.anchor.elements, N = this.normal.elements; + var dot = (A[0] - P[0]) * N[0] + (A[1] - P[1]) * N[1] + (A[2] - (P[2] || 0)) * N[2]; + return Vector.create([P[0] + N[0] * dot, P[1] + N[1] * dot, (P[2] || 0) + N[2] * dot]); + }, + + // Returns a copy of the plane, rotated by t radians about the given line + // See notes on Line#rotate. + rotate: function (t, line) { + var R = Matrix.Rotation(t, line.direction).elements; + var C = line.pointClosestTo(this.anchor).elements; + var A = this.anchor.elements, N = this.normal.elements; + var C1 = C[0], C2 = C[1], C3 = C[2], A1 = A[0], A2 = A[1], A3 = A[2]; + var x = A1 - C1, y = A2 - C2, z = A3 - C3; + return Plane.create([ + C1 + R[0][0] * x + R[0][1] * y + R[0][2] * z, + C2 + R[1][0] * x + R[1][1] * y + R[1][2] * z, + C3 + R[2][0] * x + R[2][1] * y + R[2][2] * z + ], [ + R[0][0] * N[0] + R[0][1] * N[1] + R[0][2] * N[2], + R[1][0] * N[0] + R[1][1] * N[1] + R[1][2] * N[2], + R[2][0] * N[0] + R[2][1] * N[1] + R[2][2] * N[2] + ]); + }, + + // Returns the reflection of the plane in the given point, line or plane. + reflectionIn: function (obj) { + if (obj.normal) { + // obj is a plane + var A = this.anchor.elements, N = this.normal.elements; + var A1 = A[0], A2 = A[1], A3 = A[2], N1 = N[0], N2 = N[1], N3 = N[2]; + var newA = this.anchor.reflectionIn(obj).elements; + // Add the plane's normal to its anchor, then mirror that in the other plane + var AN1 = A1 + N1, AN2 = A2 + N2, AN3 = A3 + N3; + var Q = obj.pointClosestTo([AN1, AN2, AN3]).elements; + var newN = [Q[0] + (Q[0] - AN1) - newA[0], Q[1] + (Q[1] - AN2) - newA[1], Q[2] + (Q[2] - AN3) - newA[2]]; + return Plane.create(newA, newN); + } else if (obj.direction) { + // obj is a line + return this.rotate(Math.PI, obj); + } else { + // obj is a point + var P = obj.elements || obj; + return Plane.create(this.anchor.reflectionIn([P[0], P[1], (P[2] || 0)]), this.normal); + } + }, + + // Sets the anchor point and normal to the plane. If three arguments are specified, + // the normal is calculated by assuming the three points should lie in the same plane. + // If only two are sepcified, the second is taken to be the normal. Normal vector is + // normalised before storage. + setVectors: function (anchor, v1, v2) { + anchor = Vector.create(anchor); + anchor = anchor.to3D(); if (anchor === null) { return null; } + v1 = Vector.create(v1); + v1 = v1.to3D(); if (v1 === null) { return null; } + if (typeof (v2) == 'undefined') { + v2 = null; + } else { + v2 = Vector.create(v2); + v2 = v2.to3D(); if (v2 === null) { return null; } + } + var A1 = anchor.elements[0], A2 = anchor.elements[1], A3 = anchor.elements[2]; + var v11 = v1.elements[0], v12 = v1.elements[1], v13 = v1.elements[2]; + var normal, mod; + if (v2 !== null) { + var v21 = v2.elements[0], v22 = v2.elements[1], v23 = v2.elements[2]; + normal = Vector.create([ + (v12 - A2) * (v23 - A3) - (v13 - A3) * (v22 - A2), + (v13 - A3) * (v21 - A1) - (v11 - A1) * (v23 - A3), + (v11 - A1) * (v22 - A2) - (v12 - A2) * (v21 - A1) + ]); + mod = normal.modulus(); + if (mod === 0) { return null; } + normal = Vector.create([normal.elements[0] / mod, normal.elements[1] / mod, normal.elements[2] / mod]); + } else { + mod = Math.sqrt(v11 * v11 + v12 * v12 + v13 * v13); + if (mod === 0) { return null; } + normal = Vector.create([v1.elements[0] / mod, v1.elements[1] / mod, v1.elements[2] / mod]); + } + this.anchor = anchor; + this.normal = normal; + return this; + } +}; + +// Constructor function +Plane.create = function (anchor, v1, v2) { + var P = new Plane(); + return P.setVectors(anchor, v1, v2); +}; + +// X-Y-Z planes +Plane.XY = Plane.create(Vector.Zero(3), Vector.k); +Plane.YZ = Plane.create(Vector.Zero(3), Vector.i); +Plane.ZX = Plane.create(Vector.Zero(3), Vector.j); +Plane.YX = Plane.XY; Plane.ZY = Plane.YZ; Plane.XZ = Plane.ZX; + +// Utility functions +var $V = Vector.create; +var $M = Matrix.create; +var $L = Line.create; +var $P = Plane.create; + + +/* + WebGL Path Tracing (http://madebyevan.com/webgl-path-tracing/) + License: MIT License (see below) + + Copyright (c) 2010 Evan Wallace + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +*/ + +//////////////////////////////////////////////////////////////////////////////// +// shader strings +//////////////////////////////////////////////////////////////////////////////// + +// vertex shader for drawing a textured quad +var renderVertexSource = + ' attribute vec3 vertex;' + + ' varying vec2 texCoord;' + + ' void main() {' + + ' texCoord = vertex.xy * 0.5 + 0.5;' + + ' gl_Position = vec4(vertex, 1.0);' + + ' }'; + +// fragment shader for drawing a textured quad +var renderFragmentSource = + ' precision highp float;' + + ' varying vec2 texCoord;' + + ' uniform sampler2D texture;' + + ' void main() {' + + ' gl_FragColor = texture2D(texture, texCoord);' + + ' }'; + +// vertex shader for drawing a line +var lineVertexSource = + ' attribute vec3 vertex;' + + ' uniform vec3 cubeMin;' + + ' uniform vec3 cubeMax;' + + ' uniform mat4 modelviewProjection;' + + ' void main() {' + + ' gl_Position = modelviewProjection * vec4(mix(cubeMin, cubeMax, vertex), 1.0);' + + ' }'; + +// fragment shader for drawing a line +var lineFragmentSource = + ' precision highp float;' + + ' void main() {' + + ' gl_FragColor = vec4(1.0);' + + ' }'; + +// constants for the shaders +var bounces = '5'; +var epsilon = '0.0001'; +var infinity = '10000.0'; +var lightSize = 0.1; +var lightVal = 0.5; + +// vertex shader, interpolate ray per-pixel +var tracerVertexSource = + ' attribute vec3 vertex;' + + ' uniform vec3 eye, ray00, ray01, ray10, ray11;' + + ' varying vec3 initialRay;' + + ' void main() {' + + ' vec2 percent = vertex.xy * 0.5 + 0.5;' + + ' initialRay = mix(mix(ray00, ray01, percent.y), mix(ray10, ray11, percent.y), percent.x);' + + ' gl_Position = vec4(vertex, 1.0);' + + ' }'; + +// start of fragment shader +var tracerFragmentSourceHeader = + ' precision highp float;' + + ' uniform vec3 eye;' + + ' varying vec3 initialRay;' + + ' uniform float textureWeight;' + + ' uniform float timeSinceStart;' + + ' uniform sampler2D texture;' + + ' uniform float glossiness;' + + ' vec3 roomCubeMin = vec3(-1.0, -1.0, -1.0);' + + ' vec3 roomCubeMax = vec3(1.0, 1.0, 1.0);'; + +// compute the near and far intersections of the cube (stored in the x and y components) using the slab method +// no intersection means vec.x > vec.y (really tNear > tFar) +var intersectCubeSource = + ' vec2 intersectCube(vec3 origin, vec3 ray, vec3 cubeMin, vec3 cubeMax) {' + + ' vec3 tMin = (cubeMin - origin) / ray;' + + ' vec3 tMax = (cubeMax - origin) / ray;' + + ' vec3 t1 = min(tMin, tMax);' + + ' vec3 t2 = max(tMin, tMax);' + + ' float tNear = max(max(t1.x, t1.y), t1.z);' + + ' float tFar = min(min(t2.x, t2.y), t2.z);' + + ' return vec2(tNear, tFar);' + + ' }'; + +// given that hit is a point on the cube, what is the surface normal? +// TODO: do this with fewer branches +var normalForCubeSource = + ' vec3 normalForCube(vec3 hit, vec3 cubeMin, vec3 cubeMax)' + + ' {' + + ' if(hit.x < cubeMin.x + ' + epsilon + ') return vec3(-1.0, 0.0, 0.0);' + + ' else if(hit.x > cubeMax.x - ' + epsilon + ') return vec3(1.0, 0.0, 0.0);' + + ' else if(hit.y < cubeMin.y + ' + epsilon + ') return vec3(0.0, -1.0, 0.0);' + + ' else if(hit.y > cubeMax.y - ' + epsilon + ') return vec3(0.0, 1.0, 0.0);' + + ' else if(hit.z < cubeMin.z + ' + epsilon + ') return vec3(0.0, 0.0, -1.0);' + + ' else return vec3(0.0, 0.0, 1.0);' + + ' }'; + +// compute the near intersection of a sphere +// no intersection returns a value of +infinity +var intersectSphereSource = + ' float intersectSphere(vec3 origin, vec3 ray, vec3 sphereCenter, float sphereRadius) {' + + ' vec3 toSphere = origin - sphereCenter;' + + ' float a = dot(ray, ray);' + + ' float b = 2.0 * dot(toSphere, ray);' + + ' float c = dot(toSphere, toSphere) - sphereRadius*sphereRadius;' + + ' float discriminant = b*b - 4.0*a*c;' + + ' if(discriminant > 0.0) {' + + ' float t = (-b - sqrt(discriminant)) / (2.0 * a);' + + ' if(t > 0.0) return t;' + + ' }' + + ' return ' + infinity + ';' + + ' }'; + +// given that hit is a point on the sphere, what is the surface normal? +var normalForSphereSource = + ' vec3 normalForSphere(vec3 hit, vec3 sphereCenter, float sphereRadius) {' + + ' return (hit - sphereCenter) / sphereRadius;' + + ' }'; + +// use the fragment position for randomness +var randomSource = + ' float random(vec3 scale, float seed) {' + + ' return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);' + + ' }'; + +// random cosine-weighted distributed vector +// from http://www.rorydriscoll.com/2009/01/07/better-sampling/ +var cosineWeightedDirectionSource = + ' vec3 cosineWeightedDirection(float seed, vec3 normal) {' + + ' float u = random(vec3(12.9898, 78.233, 151.7182), seed);' + + ' float v = random(vec3(63.7264, 10.873, 623.6736), seed);' + + ' float r = sqrt(u);' + + ' float angle = 6.283185307179586 * v;' + + // compute basis from normal + ' vec3 sdir, tdir;' + + ' if (abs(normal.x)<.5) {' + + ' sdir = cross(normal, vec3(1,0,0));' + + ' } else {' + + ' sdir = cross(normal, vec3(0,1,0));' + + ' }' + + ' tdir = cross(normal, sdir);' + + ' return r*cos(angle)*sdir + r*sin(angle)*tdir + sqrt(1.-u)*normal;' + + ' }'; + +// random normalized vector +var uniformlyRandomDirectionSource = + ' vec3 uniformlyRandomDirection(float seed) {' + + ' float u = random(vec3(12.9898, 78.233, 151.7182), seed);' + + ' float v = random(vec3(63.7264, 10.873, 623.6736), seed);' + + ' float z = 1.0 - 2.0 * u;' + + ' float r = sqrt(1.0 - z * z);' + + ' float angle = 6.283185307179586 * v;' + + ' return vec3(r * cos(angle), r * sin(angle), z);' + + ' }'; + +// random vector in the unit sphere +// note: this is probably not statistically uniform, saw raising to 1/3 power somewhere but that looks wrong? +var uniformlyRandomVectorSource = + ' vec3 uniformlyRandomVector(float seed) {' + + ' return uniformlyRandomDirection(seed) * sqrt(random(vec3(36.7539, 50.3658, 306.2759), seed));' + + ' }'; + +// compute specular lighting contribution +var specularReflection = + ' vec3 reflectedLight = normalize(reflect(light - hit, normal));' + + ' specularHighlight = max(0.0, dot(reflectedLight, normalize(hit - origin)));'; + +// update ray using normal and bounce according to a diffuse reflection +var newDiffuseRay = + ' ray = cosineWeightedDirection(timeSinceStart + float(bounce), normal);'; + +// update ray using normal according to a specular reflection +var newReflectiveRay = + ' ray = reflect(ray, normal);' + + specularReflection + + ' specularHighlight = 2.0 * pow(specularHighlight, 20.0);'; + +// update ray using normal and bounce according to a glossy reflection +var newGlossyRay = + ' ray = normalize(reflect(ray, normal)) + uniformlyRandomVector(timeSinceStart + float(bounce)) * glossiness;' + + specularReflection + + ' specularHighlight = pow(specularHighlight, 3.0);'; + +var yellowBlueCornellBox = + ' if(hit.x < -0.9999) surfaceColor = vec3(0.1, 0.5, 1.0);' + // blue + ' else if(hit.x > 0.9999) surfaceColor = vec3(1.0, 0.9, 0.1);'; // yellow + +var redGreenCornellBox = + ' if(hit.x < -0.9999) surfaceColor = vec3(1.0, 0.3, 0.1);' + // red + ' else if(hit.x > 0.9999) surfaceColor = vec3(0.3, 1.0, 0.1);'; // green + +function makeShadow(objects) { + return '' + + ' float shadow(vec3 origin, vec3 ray) {' + + concat(objects, function (o) { return o.getShadowTestCode(); }) + + ' return 1.0;' + + ' }'; +} + +function makeCalculateColor(objects) { + return '' + + ' vec3 calculateColor(vec3 origin, vec3 ray, vec3 light) {' + + ' vec3 colorMask = vec3(1.0);' + + ' vec3 accumulatedColor = vec3(0.0);' + + + // main raytracing loop + ' for(int bounce = 0; bounce < ' + bounces + '; bounce++) {' + + // compute the intersection with everything + ' vec2 tRoom = intersectCube(origin, ray, roomCubeMin, roomCubeMax);' + + concat(objects, function (o) { return o.getIntersectCode(); }) + + + // find the closest intersection + ' float t = ' + infinity + ';' + + ' if(tRoom.x < tRoom.y) t = tRoom.y;' + + concat(objects, function (o) { return o.getMinimumIntersectCode(); }) + + + // info about hit + ' vec3 hit = origin + ray * t;' + + ' vec3 surfaceColor = vec3(0.75);' + + ' float specularHighlight = 0.0;' + + ' vec3 normal;' + + + // calculate the normal (and change wall color) + ' if(t == tRoom.y) {' + + ' normal = -normalForCube(hit, roomCubeMin, roomCubeMax);' + + [yellowBlueCornellBox, redGreenCornellBox][environment] + + newDiffuseRay + + ' } else if(t == ' + infinity + ') {' + + ' break;' + + ' } else {' + + ' if(false) ;' + // hack to discard the first 'else' in 'else if' + concat(objects, function (o) { return o.getNormalCalculationCode(); }) + + [newDiffuseRay, newReflectiveRay, newGlossyRay][material] + + ' }' + + + // compute diffuse lighting contribution + ' vec3 toLight = light - hit;' + + ' float diffuse = max(0.0, dot(normalize(toLight), normal));' + + + // trace a shadow ray to the light + ' float shadowIntensity = shadow(hit + normal * ' + epsilon + ', toLight);' + + + // do light bounce + ' colorMask *= surfaceColor;' + + ' accumulatedColor += colorMask * (' + lightVal + ' * diffuse * shadowIntensity);' + + ' accumulatedColor += colorMask * specularHighlight * shadowIntensity;' + + + // calculate next origin + ' origin = hit;' + + ' }' + + + ' return accumulatedColor;' + + ' }'; +} + +function makeMain() { + return '' + + ' void main() {' + + ' vec3 newLight = light + uniformlyRandomVector(timeSinceStart - 53.0) * ' + lightSize + ';' + + ' vec3 texture = texture2D(texture, gl_FragCoord.xy / 512.0).rgb;' + + ' gl_FragColor = vec4(mix(calculateColor(eye, initialRay, newLight), texture, textureWeight), 1.0);' + + ' }'; +} + +function makeTracerFragmentSource(objects) { + return tracerFragmentSourceHeader + + concat(objects, function (o) { return o.getGlobalCode(); }) + + intersectCubeSource + + normalForCubeSource + + intersectSphereSource + + normalForSphereSource + + randomSource + + cosineWeightedDirectionSource + + uniformlyRandomDirectionSource + + uniformlyRandomVectorSource + + makeShadow(objects) + + makeCalculateColor(objects) + + makeMain(); +} + +//////////////////////////////////////////////////////////////////////////////// +// utility functions +//////////////////////////////////////////////////////////////////////////////// + +function getEyeRay(matrix, x, y) { + return matrix.multiply(Vector.create([x, y, 0, 1])).divideByW().ensure3().subtract(eye); +} + +function setUniforms(program, uniforms) { + for (var name in uniforms) { + var value = uniforms[name]; + var location = gl.getUniformLocation(program, name); + if (location == null) continue; + if (value instanceof Vector) { + gl.uniform3fv(location, new Float32Array([value.elements[0], value.elements[1], value.elements[2]])); + } else if (value instanceof Matrix) { + gl.uniformMatrix4fv(location, false, new Float32Array(value.flatten())); + } else { + gl.uniform1f(location, value); + } + } +} + +function concat(objects, func) { + var text = ''; + for (var i = 0; i < objects.length; i++) { + text += func(objects[i]); + } + return text; +} + +Vector.prototype.ensure3 = function () { + return Vector.create([this.elements[0], this.elements[1], this.elements[2]]); +}; + +Vector.prototype.ensure4 = function (w) { + return Vector.create([this.elements[0], this.elements[1], this.elements[2], w]); +}; + +Vector.prototype.divideByW = function () { + var w = this.elements[this.elements.length - 1]; + var newElements = []; + for (var i = 0; i < this.elements.length; i++) { + newElements.push(this.elements[i] / w); + } + return Vector.create(newElements); +}; + +Vector.prototype.componentDivide = function (vector) { + if (this.elements.length != vector.elements.length) { + return null; + } + var newElements = []; + for (var i = 0; i < this.elements.length; i++) { + newElements.push(this.elements[i] / vector.elements[i]); + } + return Vector.create(newElements); +}; + +Vector.min = function (a, b) { + if (a.length != b.length) { + return null; + } + var newElements = []; + for (var i = 0; i < a.elements.length; i++) { + newElements.push(Math.min(a.elements[i], b.elements[i])); + } + return Vector.create(newElements); +}; + +Vector.max = function (a, b) { + if (a.length != b.length) { + return null; + } + var newElements = []; + for (var i = 0; i < a.elements.length; i++) { + newElements.push(Math.max(a.elements[i], b.elements[i])); + } + return Vector.create(newElements); +}; + +Vector.prototype.minComponent = function () { + var value = Number.MAX_VALUE; + for (var i = 0; i < this.elements.length; i++) { + value = Math.min(value, this.elements[i]); + } + return value; +}; + +Vector.prototype.maxComponent = function () { + var value = -Number.MAX_VALUE; + for (var i = 0; i < this.elements.length; i++) { + value = Math.max(value, this.elements[i]); + } + return value; +}; + +function compileSource(source, type) { + var shader = gl.createShader(type); + gl.shaderSource(shader, source); + gl.compileShader(shader); + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + throw 'compile error: ' + gl.getShaderInfoLog(shader); + } + return shader; +} + +function compileShader(vertexSource, fragmentSource) { + var shaderProgram = gl.createProgram(); + gl.attachShader(shaderProgram, compileSource(vertexSource, gl.VERTEX_SHADER)); + gl.attachShader(shaderProgram, compileSource(fragmentSource, gl.FRAGMENT_SHADER)); + gl.linkProgram(shaderProgram); + if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { + throw 'link error: ' + gl.getProgramInfoLog(shaderProgram); + } + return shaderProgram; +} + +//////////////////////////////////////////////////////////////////////////////// +// class Sphere +//////////////////////////////////////////////////////////////////////////////// + +function Sphere(center, radius, id) { + this.center = center; + this.radius = radius; + this.centerStr = 'sphereCenter' + id; + this.radiusStr = 'sphereRadius' + id; + this.intersectStr = 'tSphere' + id; + this.temporaryTranslation = Vector.create([0, 0, 0]); +} + +Sphere.prototype.getGlobalCode = function () { + return '' + + ' uniform vec3 ' + this.centerStr + ';' + + ' uniform float ' + this.radiusStr + ';'; +}; + +Sphere.prototype.getIntersectCode = function () { + return '' + + ' float ' + this.intersectStr + ' = intersectSphere(origin, ray, ' + this.centerStr + ', ' + this.radiusStr + ');'; +}; + +Sphere.prototype.getShadowTestCode = function () { + return '' + + this.getIntersectCode() + + ' if(' + this.intersectStr + ' < 1.0) return 0.0;'; +}; + +Sphere.prototype.getMinimumIntersectCode = function () { + return '' + + ' if(' + this.intersectStr + ' < t) t = ' + this.intersectStr + ';'; +}; + +Sphere.prototype.getNormalCalculationCode = function () { + return '' + + ' else if(t == ' + this.intersectStr + ') normal = normalForSphere(hit, ' + this.centerStr + ', ' + this.radiusStr + ');'; +}; + +Sphere.prototype.setUniforms = function (renderer) { + renderer.uniforms[this.centerStr] = this.center.add(this.temporaryTranslation); + renderer.uniforms[this.radiusStr] = this.radius; +}; + +Sphere.prototype.temporaryTranslate = function (translation) { + this.temporaryTranslation = translation; +}; + +Sphere.prototype.translate = function (translation) { + this.center = this.center.add(translation); +}; + +Sphere.prototype.getMinCorner = function () { + return this.center.add(this.temporaryTranslation).subtract(Vector.create([this.radius, this.radius, this.radius])); +}; + +Sphere.prototype.getMaxCorner = function () { + return this.center.add(this.temporaryTranslation).add(Vector.create([this.radius, this.radius, this.radius])); +}; + +Sphere.prototype.intersect = function (origin, ray) { + return Sphere.intersect(origin, ray, this.center.add(this.temporaryTranslation), this.radius); +}; + +Sphere.intersect = function (origin, ray, center, radius) { + var toSphere = origin.subtract(center); + var a = ray.dot(ray); + var b = 2 * toSphere.dot(ray); + var c = toSphere.dot(toSphere) - radius * radius; + var discriminant = b * b - 4 * a * c; + if (discriminant > 0) { + var t = (-b - Math.sqrt(discriminant)) / (2 * a); + if (t > 0) { + return t; + } + } + return Number.MAX_VALUE; +}; + +//////////////////////////////////////////////////////////////////////////////// +// class Cube +//////////////////////////////////////////////////////////////////////////////// + +function Cube(minCorner, maxCorner, id) { + this.minCorner = minCorner; + this.maxCorner = maxCorner; + this.minStr = 'cubeMin' + id; + this.maxStr = 'cubeMax' + id; + this.intersectStr = 'tCube' + id; + this.temporaryTranslation = Vector.create([0, 0, 0]); +} + +Cube.prototype.getGlobalCode = function () { + return '' + + ' uniform vec3 ' + this.minStr + ';' + + ' uniform vec3 ' + this.maxStr + ';'; +}; + +Cube.prototype.getIntersectCode = function () { + return '' + + ' vec2 ' + this.intersectStr + ' = intersectCube(origin, ray, ' + this.minStr + ', ' + this.maxStr + ');'; +}; + +Cube.prototype.getShadowTestCode = function () { + return '' + + this.getIntersectCode() + + ' if(' + this.intersectStr + '.x > 0.0 && ' + this.intersectStr + '.x < 1.0 && ' + this.intersectStr + '.x < ' + this.intersectStr + '.y) return 0.0;'; +}; + +Cube.prototype.getMinimumIntersectCode = function () { + return '' + + ' if(' + this.intersectStr + '.x > 0.0 && ' + this.intersectStr + '.x < ' + this.intersectStr + '.y && ' + this.intersectStr + '.x < t) t = ' + this.intersectStr + '.x;'; +}; + +Cube.prototype.getNormalCalculationCode = function () { + return '' + + // have to compare intersectStr.x < intersectStr.y otherwise two coplanar + // cubes will look wrong (one cube will "steal" the hit from the other) + ' else if(t == ' + this.intersectStr + '.x && ' + this.intersectStr + '.x < ' + this.intersectStr + '.y) normal = normalForCube(hit, ' + this.minStr + ', ' + this.maxStr + ');'; +}; + +Cube.prototype.setUniforms = function (renderer) { + renderer.uniforms[this.minStr] = this.getMinCorner(); + renderer.uniforms[this.maxStr] = this.getMaxCorner(); +}; + +Cube.prototype.temporaryTranslate = function (translation) { + this.temporaryTranslation = translation; +}; + +Cube.prototype.translate = function (translation) { + this.minCorner = this.minCorner.add(translation); + this.maxCorner = this.maxCorner.add(translation); +}; + +Cube.prototype.getMinCorner = function () { + return this.minCorner.add(this.temporaryTranslation); +}; + +Cube.prototype.getMaxCorner = function () { + return this.maxCorner.add(this.temporaryTranslation); +}; + +Cube.prototype.intersect = function (origin, ray) { + return Cube.intersect(origin, ray, this.getMinCorner(), this.getMaxCorner()); +}; + +Cube.intersect = function (origin, ray, cubeMin, cubeMax) { + var tMin = cubeMin.subtract(origin).componentDivide(ray); + var tMax = cubeMax.subtract(origin).componentDivide(ray); + var t1 = Vector.min(tMin, tMax); + var t2 = Vector.max(tMin, tMax); + var tNear = t1.maxComponent(); + var tFar = t2.minComponent(); + if (tNear > 0 && tNear < tFar) { + return tNear; + } + return Number.MAX_VALUE; +}; + +//////////////////////////////////////////////////////////////////////////////// +// class Light +//////////////////////////////////////////////////////////////////////////////// + +function Light() { + this.temporaryTranslation = Vector.create([0, 0, 0]); +} + +Light.prototype.getGlobalCode = function () { + return 'uniform vec3 light;'; +}; + +Light.prototype.getIntersectCode = function () { + return ''; +}; + +Light.prototype.getShadowTestCode = function () { + return ''; +}; + +Light.prototype.getMinimumIntersectCode = function () { + return ''; +}; + +Light.prototype.getNormalCalculationCode = function () { + return ''; +}; + +Light.prototype.setUniforms = function (renderer) { + renderer.uniforms.light = light.add(this.temporaryTranslation); +}; + +Light.clampPosition = function (position) { + for (var i = 0; i < position.elements.length; i++) { + position.elements[i] = Math.max(lightSize - 1, Math.min(1 - lightSize, position.elements[i])); + } +}; + +Light.prototype.temporaryTranslate = function (translation) { + var tempLight = light.add(translation); + Light.clampPosition(tempLight); + this.temporaryTranslation = tempLight.subtract(light); +}; + +Light.prototype.translate = function (translation) { + light = light.add(translation); + Light.clampPosition(light); +}; + +Light.prototype.getMinCorner = function () { + return light.add(this.temporaryTranslation).subtract(Vector.create([lightSize, lightSize, lightSize])); +}; + +Light.prototype.getMaxCorner = function () { + return light.add(this.temporaryTranslation).add(Vector.create([lightSize, lightSize, lightSize])); +}; + +Light.prototype.intersect = function (origin, ray) { + return Number.MAX_VALUE; +}; + +//////////////////////////////////////////////////////////////////////////////// +// class PathTracer +//////////////////////////////////////////////////////////////////////////////// + +function PathTracer() { + var vertices = [ + -1, -1, + -1, +1, + +1, -1, + +1, +1 + ]; + + // create vertex buffer + this.vertexBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW); + + // create framebuffer + this.framebuffer = gl.createFramebuffer(); + + // create textures + var type = gl.getExtension('OES_texture_float') ? gl.FLOAT : gl.UNSIGNED_BYTE; + this.textures = []; + for (var i = 0; i < 2; i++) { + this.textures.push(gl.createTexture()); + gl.bindTexture(gl.TEXTURE_2D, this.textures[i]); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, 512, 512, 0, gl.RGB, type, null); + } + gl.bindTexture(gl.TEXTURE_2D, null); + + // create render shader + this.renderProgram = compileShader(renderVertexSource, renderFragmentSource); + this.renderVertexAttribute = gl.getAttribLocation(this.renderProgram, 'vertex'); + gl.enableVertexAttribArray(this.renderVertexAttribute); + + // objects and shader will be filled in when setObjects() is called + this.objects = []; + this.sampleCount = 0; + this.tracerProgram = null; +} + +PathTracer.prototype.setObjects = function (objects) { + this.uniforms = {}; + this.sampleCount = 0; + this.objects = objects; + + // create tracer shader + if (this.tracerProgram != null) { + gl.deleteProgram(this.shaderProgram); + } + this.tracerProgram = compileShader(tracerVertexSource, makeTracerFragmentSource(objects)); + this.tracerVertexAttribute = gl.getAttribLocation(this.tracerProgram, 'vertex'); + gl.enableVertexAttribArray(this.tracerVertexAttribute); +}; + +PathTracer.prototype.update = function (matrix, timeSinceStart) { + // calculate uniforms + for (var i = 0; i < this.objects.length; i++) { + this.objects[i].setUniforms(this); + } + this.uniforms.eye = eye; + this.uniforms.glossiness = glossiness; + this.uniforms.ray00 = getEyeRay(matrix, -1, -1); + this.uniforms.ray01 = getEyeRay(matrix, -1, +1); + this.uniforms.ray10 = getEyeRay(matrix, +1, -1); + this.uniforms.ray11 = getEyeRay(matrix, +1, +1); + this.uniforms.timeSinceStart = timeSinceStart; + this.uniforms.textureWeight = this.sampleCount / (this.sampleCount + 1); + + // set uniforms + gl.useProgram(this.tracerProgram); + setUniforms(this.tracerProgram, this.uniforms); + + // render to texture + gl.useProgram(this.tracerProgram); + gl.bindTexture(gl.TEXTURE_2D, this.textures[0]); + gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); + gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.textures[1], 0); + gl.vertexAttribPointer(this.tracerVertexAttribute, 2, gl.FLOAT, false, 0, 0); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + // ping pong textures + this.textures.reverse(); + this.sampleCount++; +}; + +PathTracer.prototype.render = function () { + gl.useProgram(this.renderProgram); + gl.bindTexture(gl.TEXTURE_2D, this.textures[0]); + gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); + gl.vertexAttribPointer(this.renderVertexAttribute, 2, gl.FLOAT, false, 0, 0); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); +}; + +//////////////////////////////////////////////////////////////////////////////// +// class Renderer +//////////////////////////////////////////////////////////////////////////////// + +function Renderer() { + var vertices = [ + 0, 0, 0, + 1, 0, 0, + 0, 1, 0, + 1, 1, 0, + 0, 0, 1, + 1, 0, 1, + 0, 1, 1, + 1, 1, 1 + ]; + var indices = [ + 0, 1, 1, 3, 3, 2, 2, 0, + 4, 5, 5, 7, 7, 6, 6, 4, + 0, 4, 1, 5, 2, 6, 3, 7 + ]; + + // create vertex buffer + this.vertexBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW); + + // create index buffer + this.indexBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW); + + // create line shader + this.lineProgram = compileShader(lineVertexSource, lineFragmentSource); + this.vertexAttribute = gl.getAttribLocation(this.lineProgram, 'vertex'); + gl.enableVertexAttribArray(this.vertexAttribute); + + this.objects = []; + this.selectedObject = null; + this.pathTracer = new PathTracer(); +} + +Renderer.prototype.setObjects = function (objects) { + this.objects = objects; + this.selectedObject = null; + this.pathTracer.setObjects(objects); +}; + +Renderer.prototype.update = function (modelviewProjection, timeSinceStart) { + var jitter = Matrix.Translation(Vector.create([Math.random() * 2 - 1, Math.random() * 2 - 1, 0]).multiply(1 / 512)); + var inverse = jitter.multiply(modelviewProjection).inverse(); + this.modelviewProjection = modelviewProjection; + this.pathTracer.update(inverse, timeSinceStart); +}; + +Renderer.prototype.render = function () { + this.pathTracer.render(); + + if (this.selectedObject != null) { + gl.isEnabled(gl.DITHER); + gl.useProgram(this.lineProgram); + gl.bindTexture(gl.TEXTURE_2D, null); + gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); + gl.vertexAttribPointer(this.vertexAttribute, 3, gl.FLOAT, false, 0, 0); + setUniforms(this.lineProgram, { + cubeMin: this.selectedObject.getMinCorner(), + cubeMax: this.selectedObject.getMaxCorner(), + modelviewProjection: this.modelviewProjection + }); + gl.drawElements(gl.LINES, 24, gl.UNSIGNED_SHORT, 0); + gl.enable(gl.DEPTH_TEST); + } +}; + +//////////////////////////////////////////////////////////////////////////////// +// class UI +//////////////////////////////////////////////////////////////////////////////// + +function UI() { + this.renderer = new Renderer(); + this.moving = true; +} + +UI.prototype.setObjects = function (objects) { + this.objects = objects; + this.objects.splice(0, 0, new Light()); + this.renderer.setObjects(this.objects); +}; + +UI.prototype.update = function (timeSinceStart) { + this.modelview = makeLookAt(eye.elements[0], eye.elements[1], eye.elements[2], 0, 0, 0, 0, 1, 0); + this.projection = makePerspective(55, 1, 0.1, 100); + this.modelviewProjection = this.projection.multiply(this.modelview); + this.renderer.update(this.modelviewProjection, timeSinceStart); +}; + +UI.prototype.mouseDown = function (x, y) { + var t; + var origin = eye; + var ray = getEyeRay(this.modelviewProjection.inverse(), (x / 512) * 2 - 1, 1 - (y / 512) * 2); + + // test the selection box first + if (this.renderer.selectedObject != null) { + var minBounds = this.renderer.selectedObject.getMinCorner(); + var maxBounds = this.renderer.selectedObject.getMaxCorner(); + t = Cube.intersect(origin, ray, minBounds, maxBounds); + + if (t < Number.MAX_VALUE) { + var hit = origin.add(ray.multiply(t)); + + if (Math.abs(hit.elements[0] - minBounds.elements[0]) < 0.001) this.movementNormal = Vector.create([-1, 0, 0]); + else if (Math.abs(hit.elements[0] - maxBounds.elements[0]) < 0.001) this.movementNormal = Vector.create([+1, 0, 0]); + else if (Math.abs(hit.elements[1] - minBounds.elements[1]) < 0.001) this.movementNormal = Vector.create([0, -1, 0]); + else if (Math.abs(hit.elements[1] - maxBounds.elements[1]) < 0.001) this.movementNormal = Vector.create([0, +1, 0]); + else if (Math.abs(hit.elements[2] - minBounds.elements[2]) < 0.001) this.movementNormal = Vector.create([0, 0, -1]); + else this.movementNormal = Vector.create([0, 0, +1]); + + this.movementDistance = this.movementNormal.dot(hit); + this.originalHit = hit; + this.moving = true; + + return true; + } + } + + t = Number.MAX_VALUE; + this.renderer.selectedObject = null; + + for (var i = 0; i < this.objects.length; i++) { + var objectT = this.objects[i].intersect(origin, ray); + if (objectT < t) { + t = objectT; + this.renderer.selectedObject = this.objects[i]; + } + } + + return (t < Number.MAX_VALUE); +}; + +UI.prototype.mouseMove = function (x, y) { + if (this.moving) { + var origin = eye; + var ray = getEyeRay(this.modelviewProjection.inverse(), (x / 512) * 2 - 1, 1 - (y / 512) * 2); + + var t = (this.movementDistance - this.movementNormal.dot(origin)) / this.movementNormal.dot(ray); + var hit = origin.add(ray.multiply(t)); + this.renderer.selectedObject.temporaryTranslate(hit.subtract(this.originalHit)); + + // clear the sample buffer + this.renderer.pathTracer.sampleCount = 0; + } +}; + +UI.prototype.mouseUp = function (x, y) { + if (this.moving) { + var origin = eye; + var ray = getEyeRay(this.modelviewProjection.inverse(), (x / 512) * 2 - 1, 1 - (y / 512) * 2); + + var t = (this.movementDistance - this.movementNormal.dot(origin)) / this.movementNormal.dot(ray); + var hit = origin.add(ray.multiply(t)); + this.renderer.selectedObject.temporaryTranslate(Vector.create([0, 0, 0])); + this.renderer.selectedObject.translate(hit.subtract(this.originalHit)); + this.moving = false; + } +}; + +UI.prototype.render = function () { + this.renderer.render(); +}; + +UI.prototype.selectLight = function () { + this.renderer.selectedObject = this.objects[0]; +}; + +UI.prototype.addSphere = function () { + this.objects.push(new Sphere(Vector.create([0, 0, 0]), 0.25, nextObjectId++)); + this.renderer.setObjects(this.objects); +}; + +UI.prototype.addCube = function () { + this.objects.push(new Cube(Vector.create([-0.25, -0.25, -0.25]), Vector.create([0.25, 0.25, 0.25]), nextObjectId++)); + this.renderer.setObjects(this.objects); +}; + +UI.prototype.deleteSelection = function () { + for (var i = 0; i < this.objects.length; i++) { + if (this.renderer.selectedObject == this.objects[i]) { + this.objects.splice(i, 1); + this.renderer.selectedObject = null; + this.renderer.setObjects(this.objects); + break; + } + } +}; + +UI.prototype.updateMaterial = function () { + var newMaterial = parseInt(document.getElementById('material').value, 10); + if (material != newMaterial) { + material = newMaterial; + this.renderer.setObjects(this.objects); + } +}; + +UI.prototype.updateEnvironment = function () { + var newEnvironment = parseInt(document.getElementById('environment').value, 10); + if (environment != newEnvironment) { + environment = newEnvironment; + this.renderer.setObjects(this.objects); + } +}; + +UI.prototype.updateGlossiness = function () { + var newGlossiness = parseFloat(document.getElementById('glossiness').value); + if (isNaN(newGlossiness)) newGlossiness = 0; + newGlossiness = Math.max(0, Math.min(1, newGlossiness)); + if (material == MATERIAL_GLOSSY && glossiness != newGlossiness) { + this.renderer.pathTracer.sampleCount = 0; + } + glossiness = newGlossiness; +}; + +//////////////////////////////////////////////////////////////////////////////// +// main program +//////////////////////////////////////////////////////////////////////////////// + +var gl; +var ui; +var error; +var canvas; +var inputFocusCount = 0; + +var angleX = 0; +var angleY = 0; +var zoomZ = 2.5; +var eye = Vector.create([0, 0, 0]); +var light = Vector.create([0.1, 0.1, -0.16]); + +var nextObjectId = 0; + +var MATERIAL_DIFFUSE = 0; +var MATERIAL_MIRROR = 1; +var MATERIAL_GLOSSY = 2; +var material = MATERIAL_DIFFUSE; +var glossiness = 0.6; + +var YELLOW_BLUE_CORNELL_BOX = 0; +var RED_GREEN_CORNELL_BOX = 1; +var environment = YELLOW_BLUE_CORNELL_BOX; + +function tick(timeSinceStart) { + eye.elements[0] = zoomZ * Math.sin(angleY) * Math.cos(angleX); + eye.elements[1] = zoomZ * Math.sin(angleX); + eye.elements[2] = zoomZ * Math.cos(angleY) * Math.cos(angleX); + + document.getElementById('glossiness-factor').style.display = (material == MATERIAL_GLOSSY) ? 'inline' : 'none'; + + ui.updateMaterial(); + ui.updateGlossiness(); + ui.updateEnvironment(); + ui.update(timeSinceStart); + ui.render(); +} + +function makePotionBottle() { + var objects = []; + + //stem + objects.push(new Cube(Vector.create([-0.45, -0.0, -0.05]), Vector.create([-0.35, -0.5, 0.05]), nextObjectId++)); + //bottle + objects.push(new Sphere(Vector.create([-0.4, -0.6, 0]), 0.25, nextObjectId++)); + + //chest + objects.push(new Cube(Vector.create([0, -0.6, 0.0]), Vector.create([0.15, -0.8, 0.05]), nextObjectId++)); + //left leg + objects.push(new Cube(Vector.create([0, -1, 0.0]), Vector.create([0.06, -0.8, 0.05]), nextObjectId++)); + //right leg + objects.push(new Cube(Vector.create([0.15, -1, 0.0]), Vector.create([0.09, -0.8, 0.05]), nextObjectId++)); + //left arm + objects.push(new Cube(Vector.create([0, -0.65, 0.0]), Vector.create([-0.06, -0.45, 0.05]), nextObjectId++)); + //right arm + objects.push(new Cube(Vector.create([0.15, -0.6, 0.0]), Vector.create([0.21, -0.8, 0.05]), nextObjectId++)); + //head + objects.push(new Cube(Vector.create([0.04, -0.6, 0.0]), Vector.create([0.13, -0.52, 0.05]), nextObjectId++)); + //left horn + objects.push(new Cube(Vector.create([0.045, -0.52, 0.01]), Vector.create([0.06, -0.48, 0.04]), nextObjectId++)); + //right horn + objects.push(new Cube(Vector.create([0.125, -0.52, 0.01]), Vector.create([0.110, -0.48, 0.04]), nextObjectId++)); + + return objects; +} + +var XNEG = 0, XPOS = 1, YNEG = 2, YPOS = 3, ZNEG = 4, ZPOS = 5; + +function addRecursiveSpheresBranch(objects, center, radius, depth, dir) { + objects.push(new Sphere(center, radius, nextObjectId++)); + if (depth--) { + if (dir != XNEG) addRecursiveSpheresBranch(objects, center.subtract(Vector.create([radius * 1.5, 0, 0])), radius / 2, depth, XPOS); + if (dir != XPOS) addRecursiveSpheresBranch(objects, center.add(Vector.create([radius * 1.5, 0, 0])), radius / 2, depth, XNEG); + + if (dir != YNEG) addRecursiveSpheresBranch(objects, center.subtract(Vector.create([0, radius * 1.5, 0])), radius / 2, depth, YPOS); + if (dir != YPOS) addRecursiveSpheresBranch(objects, center.add(Vector.create([0, radius * 1.5, 0])), radius / 2, depth, YNEG); + + if (dir != ZNEG) addRecursiveSpheresBranch(objects, center.subtract(Vector.create([0, 0, radius * 1.5])), radius / 2, depth, ZPOS); + if (dir != ZPOS) addRecursiveSpheresBranch(objects, center.add(Vector.create([0, 0, radius * 1.5])), radius / 2, depth, ZNEG); + } +} + +function makeRecursiveSpheres() { + var objects = []; + addRecursiveSpheresBranch(objects, Vector.create([0, 0, 0]), 0.3, 2, -1); + return objects; +} + +window.onload = function () { + gl = null; + error = document.getElementById('error'); + canvas = document.getElementById('canvas'); + try { gl = canvas.getContext('experimental-webgl'); } catch (e) { } + + if (gl) { + error.innerHTML = 'Loading...'; + + // keep track of whether an <input> is focused or not (will be no only if inputFocusCount == 0) + var inputs = document.getElementsByTagName('input'); + for (var i = 0; i < inputs.length; i++) { + inputs[i].onfocus = function () { inputFocusCount++; }; + inputs[i].onblur = function () { inputFocusCount--; }; + } + + material = parseInt(document.getElementById('material').value, 10); + environment = parseInt(document.getElementById('environment').value, 10); + ui = new UI(); + ui.setObjects(makePotionBottle()); + var start = new Date(); + error.style.zIndex = -1; + setInterval(function () { tick((new Date() - start) * 0.001); }, 1000 / 60); + } else { + error.innerHTML = 'Your browser does not support WebGL.<br>Please see <a href="http://www.khronos.org/webgl/wiki/Getting_a_WebGL_Implementation">Getting a WebGL Implementation</a>.'; + } +}; + +function elementPos(element) { + var x = 0, y = 0; + while (element.offsetParent) { + x += element.offsetLeft; + y += element.offsetTop; + element = element.offsetParent; + } + return { x: x, y: y }; +} + +function eventPos(event) { + return { + x: event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft, + y: event.clientY + document.body.scrollTop + document.documentElement.scrollTop + }; +} + +function canvasMousePos(event) { + var mousePos = eventPos(event); + var canvasPos = elementPos(canvas); + return { + x: mousePos.x - canvasPos.x, + y: mousePos.y - canvasPos.y + }; +} + +var mouseDown = false, oldX, oldY; + +document.onmousedown = function (event) { + var mouse = canvasMousePos(event); + oldX = mouse.x; + oldY = mouse.y; + + if (mouse.x >= 0 && mouse.x < 512 && mouse.y >= 0 && mouse.y < 512) { + mouseDown = !ui.mouseDown(mouse.x, mouse.y); + + // disable selection because dragging is used for rotating the camera and moving objects + return false; + } + + return true; +}; + +document.onmousemove = function (event) { + var mouse = canvasMousePos(event); + + if (mouseDown) { + // update the angles based on how far we moved since last time + angleY -= (mouse.x - oldX) * 0.01; + angleX += (mouse.y - oldY) * 0.01; + + // don't go upside down + angleX = Math.max(angleX, -Math.PI / 2 + 0.01); + angleX = Math.min(angleX, Math.PI / 2 - 0.01); + + // clear the sample buffer + ui.renderer.pathTracer.sampleCount = 0; + + // remember this coordinate + oldX = mouse.x; + oldY = mouse.y; + } else { + var canvasPos = elementPos(canvas); + ui.mouseMove(mouse.x, mouse.y); + } +}; + +document.onmouseup = function (event) { + mouseDown = false; + + var mouse = canvasMousePos(event); + ui.mouseUp(mouse.x, mouse.y); +}; + +document.onkeydown = function (event) { + // if there are no <input> elements focused + if (inputFocusCount == 0) { + // if backspace or delete was pressed + if (event.keyCode == 8 || event.keyCode == 46) { + ui.deleteSelection(); + + // don't let the backspace key go back a page + return false; + } + } +}; diff --git a/random-attractors/index.html b/random-attractors/index.html new file mode 100644 index 0000000..a9834a7 --- /dev/null +++ b/random-attractors/index.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <title>s1nical - Random Attractors</title> + <script src="/random-attractors/js/main.js"></script> + <style> + html, body { + margin: 0; + height: 100vh; + overflow: hidden; + } + canvas { + background: #000; + } + + </style> + </head> + <body> + <canvas id="canvas"></canvas> + </body> +</html>
\ No newline at end of file diff --git a/random-attractors/js/main.js b/random-attractors/js/main.js new file mode 100644 index 0000000..5355c6e --- /dev/null +++ b/random-attractors/js/main.js @@ -0,0 +1,96 @@ +NUM_ATTRACTORS = 10; +const canvas = document.getElementById("canvas"); +const ctx = canvas.getContext("2d"); +const { innerWidth, innerHeight } = window; +const { random, floor, cos, sin } = Math; +canvas.width = innerWidth; +canvas.height = innerHeight; +const w = innerWidth / 2; +const h = innerHeight / 2; + +ctx.translate(w, h); +ctx.globalCompositeOperation = "lighter"; +const range = n => + Array(n) + .fill(0) + .map((_, i) => i); +const randomInt = (s, e) => s + floor((e - s) * random()); +const drawParticle = ({ x, y, c }) => { + ctx.beginPath(); + ctx.fillStyle = c; + ctx.fillRect(x, y, 0.5, 0.5); + ctx.closePath(); +}; + +const attractors = range(NUM_ATTRACTORS).map(() => ({ + x: randomInt(-w, w), + y: randomInt(-h, h), + g: randomInt(0, 30), + c: `rgba(${randomInt(0, 255)}, ${randomInt(0, 255)}, ${randomInt( + 0, + 255 + )}, ${random()})` +})); + +// https://codepen.io/ge1doot/pen/ooNvgx +class Particle { + constructor() { + this.damp = 0.00006; + this.accel = 3200; + this.x = randomInt(-w, w); + this.y = randomInt(-h, h); + this.vx = this.accel * random(); + this.vy = this.accel * random(); + this.currentColor = "#fff"; + } + draw() { + const { x, y, currentColor } = this; + drawParticle({ x, y, c: currentColor }); + } + step() { + const { x, y } = this; + + let color = 0; + let largestVal = 0; + + attractors.map(a => { + const dx = a.x - x; + const dy = a.y - y; + const d2 = (dx * dx + dy * dy) / a.g; + if (d2 > 0.1) { + this.vx += this.accel * (dx / d2); + this.vy += this.accel * (dy / d2); + } + if (d2 > largestVal) { + largestVal = d2; + color = a.c; + } + }); + this.x += this.vx; + this.y += this.vy; + + this.vx *= this.damp; + this.vy *= this.damp; + + this.currentColor = color; + this.draw(); + } +} + +const particles = range(8000).map(() => new Particle()); +const animate = () => { + particles.map(particle => { + particle.step(); + }); +}; + +let iter = 0; + +const update = () => { + animate(); + iter += 1; + if (iter < 1500) { + requestAnimationFrame(update); + } +}; +update(); diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..47a4d08 --- /dev/null +++ b/robots.txt @@ -0,0 +1,5 @@ +User-agent: * +Disallow: / + +User-agent: Googlebot +Disallow:
\ No newline at end of file diff --git a/root/.htaccess b/root/.htaccess new file mode 100644 index 0000000..0762e39 --- /dev/null +++ b/root/.htaccess @@ -0,0 +1,4 @@ +AuthUserFile /home/vol9_2/epizy.com/epiz_25275270/htdocs/assets/users/.htpasswdmufxo45v5tz7bAWr +AuthType Basic +AuthName "My restricted Area" +Require valid-user
\ No newline at end of file diff --git a/root/root.php b/root/root.php new file mode 100644 index 0000000..bd06cbd --- /dev/null +++ b/root/root.php @@ -0,0 +1,3 @@ +<?php + echo $_SERVER['DOCUMENT_ROOT']; +?>
\ No newline at end of file diff --git a/space-invaders/.htaccess b/space-invaders/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/space-invaders/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/space-invaders/favicon.png b/space-invaders/favicon.png Binary files differnew file mode 100644 index 0000000..b3b41ff --- /dev/null +++ b/space-invaders/favicon.png diff --git a/space-invaders/index.html b/space-invaders/index.html new file mode 100644 index 0000000..90aa401 --- /dev/null +++ b/space-invaders/index.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - Space Invaders</title> + <!-- Site metadata --> + <meta name="description" content="Space Invaders"> + <meta property="og:description" content="Space Invaders"> + <meta property="og:title" content="s1nical - Space Invaders"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/space-invaders"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/space-invaders"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "Space Invaders", + "headline": "Space Invaders", + "url": "https://cyne.cf/space-invaders", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <link rel="shortcut icon" href="/space-invaders/favicon.png" type="image/x-icon"> + <script src="/space-invaders/js/mobile.js"></script> +</head> + <body> + <script src="/space-invaders/js/main.js"></script> + </body> +</html>
\ No newline at end of file diff --git a/space-invaders/js/main.js b/space-invaders/js/main.js new file mode 100644 index 0000000..1fcfdf3 --- /dev/null +++ b/space-invaders/js/main.js @@ -0,0 +1 @@ +for (p = 389, L = l = m = t = 0, c = " _ ", onkeydown = function (e) { 39 == (k = e.which) ? p++ : 37 == k ? p-- : !l & (l = p) }, setInterval('_="<pre>";l&(l-=20)<0&&(l=0);m=(m+=20)>p?b[+new Date%6]:m;for(i=0;i<400;i++){if(i%20==0)_+="\\n";if(~b[n="indexOf"](l))b.splice(b[n](l),1),L+=5,l=0;if(~b[n](p)||p==m)p=n,b=[],c="xxx";_+=i==p?"oIo":~b[n](i)?".#.":i==m&&m?" * ":i==l&&l?" | ":c}document.body.innerHTML=_+="\\nP "+L;t+=o;for(i in b)b[i]+=t%5e3==0?20:t%2e3==0?1:t%1e3==0&&-1', o = 50), b = [], j = 2; 136 > j; j += 14 == j || 94 == j ? 29 : 55 == j ? 27 : 2)b.push(j);
\ No newline at end of file diff --git a/space-invaders/js/mobile.js b/space-invaders/js/mobile.js new file mode 100644 index 0000000..5807029 --- /dev/null +++ b/space-invaders/js/mobile.js @@ -0,0 +1,4 @@ +// CHECKS IF USER IS ON MOBILE +if (screen.width <= 480) { + location.href = '/mobile'; +}
\ No newline at end of file diff --git a/spike/.htaccess b/spike/.htaccess new file mode 100644 index 0000000..c736875 --- /dev/null +++ b/spike/.htaccess @@ -0,0 +1,3 @@ +RewriteRule ^.*\.txt$ - [F,L] + +Options -Indexes
\ No newline at end of file diff --git a/spike/.todo b/spike/.todo new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/spike/.todo diff --git a/spongebob.php b/spongebob.php new file mode 100644 index 0000000..58bf82f --- /dev/null +++ b/spongebob.php @@ -0,0 +1,16 @@ +<?php + // Do make a visitors.html file and set permission to 0777 + + $ip = $_SERVER['REMOTE_ADDR']; + $browser = $_SERVER['HTTP_USER_AGENT']; + date_default_timezone_set('America/Los_Angeles'); + $dateTime = date('m/d/Y G:i:s'); + $file = "visitors/index.php"; + $file = fopen($file, "a"); + $data = "<pre><b>User IP</b>: $ip <b> Browser</b>: $browser <br>on Time : $dateTime <br></pre>"; + fwrite($file, $data); + fclose($file); + /*if(preg_match("/172\.68\.174\.([0-9]{1,2}|1[0-9]{1,2}|2[0-4][0-9]|25[0-5])")) { + echo "<h1>Hi n0.0b :)</h1>"; + }*/ +?>
\ No newline at end of file diff --git a/status/index.php b/status/index.php new file mode 100644 index 0000000..ba4b739 --- /dev/null +++ b/status/index.php @@ -0,0 +1,624 @@ +<?php + $url1=$_SERVER['REQUEST_URI']; + header("Refresh: 5; URL=$url1"); +?> +<!DOCTYPE html> +<html lang="en"> + <head> + <title>s1nical - Server Status</title> + <!-- Site metadata --> + <meta name="description" content="Server Status of cyne.cf"> + <meta property="og:description" content="Server Status of cyne.cf"> + <meta property="og:title" content="s1nical - Server Status"> + <meta property="twitter:card" content="summary"> + <meta property="twitter:site" content="@9inny"> + <meta property="og:image" content=""> + <meta property="og:url" content="https://cyne.cf/status"> + <link rel="apple-touch-icon" sizes="128x128" href="/favicon.jpg"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="canonical" href="https://cyne.cf/status"> + <link rel="author" href="humans.txt" /> + <!-- Schema.org Stuff --> + <script type="application/ld+json"> + { + "name": "s1nical", + "alternateName": "s1n", + "description": "Server Status of cyne.cf", + "headline": "Server Status of cyne.cf", + "url": "https://cyne.cf/status", + "image": "", + "sameAs": [ + "https://twitter.com/9inny", + "https://github.com/8cy", + "https://www.reddit.com/user/s1nical/" + ], + "publisher": { + "@type": "Organization", + "logo": { + "@type": "ImageObject", + "url": "" + } + }, + "@type": "WebSite", + "@context": "http://schema.org" + } + </script> + <meta content="text/html" charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <link rel="icon" type="image/jpg" href="/favicon.jpg" sizes="128x128"> + <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous"> + <style> + pre { + overflow-x: auto; + max-width: 60vw; + } + + pre code { + word-wrap: normal; + white-space: pre; + } + </style> + </head> +<html> + <div class="container"> + + <?php + + /* + + * + + * @author Trường An Phạm Nguyễn + + * @copyright 2019, The authors + + * @license GNU AFFERO GENERAL PUBLIC LICENSE + + * http://www.gnu.org/licenses/agpl-3.0.html + + * + + * Jul 27, 2013 + + + + Original author: + + * Disclaimer Notice(s) + + * ex: This code is freely given to you and given "AS IS", SO if it damages + + * your computer, formats your HDs, or burns your house I am not the one to + + * blame. + + * Moreover, don't forget to include my copyright notices and name. + + * +------------------------------------------------------------------------------+ + + * Author(s): Crooty.co.uk (Adam C) + + * +------------------------------------------------------------------------------+ + + + + This program is free software: you can redistribute it and/or modify + + it under the terms of the GNU General Public License as published by + + the Free Software Foundation, either version 3 of the License, or + + (at your option) any later version. + + + + This program 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 General Public License for more details. + + + + You should have received a copy of the GNU General Public License + + along with this program. If not, see <http://www.gnu.org/licenses/>. + + */ + + $data = ""; + + $data .= ' + + <div class="card my-2"> + + <h4 class="card-header text-center"> + + Service Status + + </h4> + + <div class="card-body pb-0"> + + '; + + + + + + //configure script + + $timeout = "1"; + + + + //set service checks + + /* + + The script will open a socket to the following service to test for connection. + + Does not test the fucntionality, just the ability to connect + + Each service can have a name, port and the Unix domain it run on (default to localhost) + + */ + + $services = array(); + + + + + + $services[] = array("port" => "80", "service" => "Web Server", "ip" => "cyne.cf") ; + + $services[] = array("port" => "80", "service" => "Forums Web Server", "ip" => "cyne.cf/forums") ; + + $services[] = array("port" => "21", "service" => "FTP", "ip" => "ftpupload.net") ; + + $services[] = array("port" => "3306", "service" => "MYSQL", "ip" => "sql307.epizy.com") ; + + // $services[] = array("port" => "3000", "service" => "Mastodon web", "ip" => "") ; + + // $services[] = array("port" => "4000", "service" => "Mastodon streaming", "ip" => "") ; + + // $services[] = array("port" => "22", "service" => "Open SSH", "ip" => "") ; + + // $services[] = array("port" => "58846", "service" => "Deluge", "ip" => "") ; + + // $services[] = array("port" => "8112", "service" => "Deluge Web", "ip" => "") ; + + $services[] = array("port" => "80", "service" => "Internet Connection", "ip" => "google.com") ; + + // $services[] = array("port" => "8083", "service" => "Vesta Panel", "ip" => "") ; + + + + + + //begin table for status + + $data .= "<small><table class='table table-striped table-sm '><thead><tr><th>Service</th><th>Port</th><th>Status</th></tr></thead>"; + + foreach ($services as $service) { + + if($service['ip']==""){ + + $service['ip'] = "localhost"; + + } + + $data .= "<tr><td>" . $service['service'] . "</td><td>". $service['port']; + + + + $fp = @fsockopen($service['ip'], $service['port'], $errno, $errstr, $timeout); + + if (!$fp) { + + $data .= "</td><td class='table-danger'>Offline </td></tr>"; + + //fclose($fp); + + } else { + + $data .= "</td><td class='table-success'>Online</td></tr>"; + + fclose($fp); + + } + + + + } + + //close table + + $data .= "</table></small>"; + + $data .= ' + + </div> + + </div> + + '; + + echo $data; + + + + + + /* ===================================================================== + + // + + // ////////////////// SERVER INFORMATION ///////////////////////////////// + + // + + // + + * =======================================================================/*/ + + + + $data1 = ""; + + $data1 .= ' + + <div class="card mb-2"> + + <h4 class="card-header text-center"> + + Server Information <span style="color: red">[ERROR]</span> + + </h4> + + <div class="card-body"> + + '; + + + + $data1 .= "<table class='table table-sm mb-0'>"; + + // $data1 .= "<div class='table-responsive'><table class='table table-sm mb-0'>"; + + + + //GET SERVER LOADS + + $loadresult = @exec('uptime'); + + preg_match("/averages?: ([0-9\.]+),[\s]+([0-9\.]+),[\s]+([0-9\.]+)/",$loadresult,$avgs); + + + + + + //GET SERVER UPTIME + + $uptime = explode(' up ', $loadresult); + + $uptime = explode(',', $uptime[1]); + + $uptime = $uptime[0].', '.$uptime[1]; + + + + //Get the disk space + + function getSymbolByQuantity($bytes) { + + $symbol = array('B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'); + + $exp = floor(log($bytes)/log(1024)); + + + + return sprintf('%.2f<small>'.$symbol[$exp].'</small>', ($bytes/pow(1024, floor($exp)))); + + } + + function percent_to_color($p){ + + if($p < 30) return 'success'; + + if($p < 45) return 'info'; + + if($p < 60) return 'primary'; + + if($p < 75) return 'warning'; + + return 'danger'; + + } + + function format_storage_info($disk_space, $disk_free, $disk_name){ + + $str = ""; + + $disk_free_precent = 100 - round($disk_free*1.0 / $disk_space*100, 2); + + $str .= '<div class="col p-0 d-inline-flex">'; + + $str .= "<span class='mr-2'>" . badge($disk_name,'secondary') .' '. getSymbolByQuantity($disk_free) . '/'. getSymbolByQuantity($disk_space) ."</span>"; + + $str .= ' + + <div class="progress flex-grow-1 align-self-center"> + + <div class="progress-bar progress-bar-striped progress-bar-animated '; + + $str .= 'bg-' . percent_to_color($disk_free_precent) .' + + " role="progressbar" style="width: '.$disk_free_precent.'%;" aria-valuenow="'.$disk_free_precent.'" aria-valuemin="0" aria-valuemax="100">'.$disk_free_precent.'%</div> + + </div> + + </div> '; + + + + return $str; + + + + } + + + + function get_disk_free_status($disks){ + + $str=""; + + $max = 5; + + foreach($disks as $disk){ + + if(strlen($disk["name"]) > $max) + + $max = strlen($disk["name"]); + + } + + + + foreach($disks as $disk){ + + $disk_space = disk_total_space($disk["path"]); + + $disk_free = disk_free_space($disk["path"]); + + + + $str .= format_storage_info($disk_space, $disk_free, $disk['name']); + + + + } + + return $str; + + } + + function badge($str, $type){ + + return "<span class='badge badge-" . $type . " ' >$str</span>"; + + } + + + + //Get ram usage + + $total_mem = preg_split('/ +/', @exec('grep MemTotal /proc/meminfo')); + + $total_mem = $total_mem[1]; + + $free_mem = preg_split('/ +/', @exec('grep MemFree /proc/meminfo')); + + $cache_mem = preg_split('/ +/', @exec('grep ^Cached /proc/meminfo')); + + + + $free_mem = $free_mem[1] + $cache_mem[1]; + + + + + + //Get top mem usage + + $tom_mem_arr = array(); + + $top_cpu_use = array(); + + + + //-- The number of processes to display in Top RAM user + + $i = 5; + + + + + + /* ps command: + + -e to display process from all user + + -k to specify sorting order: - is desc order follow by column name + + -o to specify output format, it's a list of column name. = suppress the display of column name + + head to get only the first few lines + + */ + + exec("ps -e k-rss -o rss,args | head -n $i", $tom_mem_arr, $status); + + exec("ps -e k-pcpu -o pcpu,args | head -n $i", $top_cpu_use, $status); + + + + + + $top_mem = implode('<br/>', $tom_mem_arr ); + + $top_mem = "<pre class='mb-0 '><code>" . $top_mem . "</code></pre>"; + + + + $top_cpu = implode('<br/>', $top_cpu_use ); + + $top_cpu = "<pre class='mb-0 '><code>" . $top_cpu. "</code></pre>"; + + + + $data1 .= "<tr><td>Average Load</td><td><h5>". badge($avgs[1],'secondary'). ' ' .badge($avgs[2], 'secondary') . ' ' . badge( $avgs[3], 'secondary') . " </h5></td>\n"; + + $data1 .= "<tr><td>Uptime</td><td>$uptime </td></tr>"; + + + + + + $disks = array(); + + + + /* + + * The disks array list all mountpoint you wan to check freespace + + * Display name and path to the moutpoint have to be provide, you can + + */ + + $disks[] = array("name" => "local" , "path" => getcwd()) ; + + $disks[] = array("name" => "disk" , "path" => '/home/vol9_2/epizy.com/epiz_25275270') ; + + + + + + $data1 .= "<tr><td>Disk Free </td><td>" . get_disk_free_status($disks) . "</td></tr>"; + + + + $data1 .= "<tr><td>RAM Free </td><td>". format_storage_info($total_mem *1024, $free_mem *1024, '') ."</td></tr>"; + + $data1 .= "<tr><td>Top RAM User </td><td><small>$top_mem</small></td></tr>"; + + $data1 .= "<tr><td>Top CPU User </td><td><small>$top_cpu</small></td></tr>"; + + + + $data1 .= "</table>"; + + // $data1 .= ' </div></div>'; + + $data1 .= ' </div>'; + + echo $data1; + + + + /* ============================================================================= + + * + + * DISPLAY BANDWIDTH STATISTIC, REQUIRE VNSTAT INSTALLED AND PROPERLY CONFIGURED. + + * + + * ===============================================================================s + + */ + + + + + + if (!isset($_GET['showtraffic']) || $_GET['showtraffic'] == false) die(); + + + + $data2 = ""; + + $data2 .= ' + + <div class="card mb-2"> + + <h4 class="card-header text-center"> + + vnstat Network traffic + + </h4> + + <div class="card-body text-center"> + + '; + + + + + + $data2 .="<span class=' d-block'><pre class='d-inline-block text-left'><small>"; + + $traffic_arr = array(); + + exec('vnstat -' . $_GET['showtraffic'], $traffic_arr, $status); + + + + ///for testing + + $traffic = " + + enp0s20 / monthly + + + + month rx | tx | total | avg. rate + + ------------------------+-------------+-------------+--------------- + + Sep '18 36.60 GiB | 7.04 GiB | 43.64 GiB | 144.62 kbit/s + + Oct '18 400.69 GiB | 1.19 TiB | 1.58 TiB | 5.19 Mbit/s + + Nov '18 393.52 GiB | 2.19 TiB | 2.57 TiB | 8.72 Mbit/s + + Dec '18 507.28 GiB | 2.05 TiB | 2.55 TiB | 8.37 Mbit/s + + Jan '19 269.01 GiB | 1.39 TiB | 1.65 TiB | 7.51 Mbit/s + + ------------------------+-------------+-------------+--------------- + + estimated 371.92 GiB | 1.92 TiB | 2.29 TiB | + + "; + + /// for real + + $traffic = implode("\n", $traffic_arr); + + + + $data2 .="$traffic</small></pre></span>"; + + + + echo $data2; + + ?> + + </div> +</html>
\ No newline at end of file diff --git a/streaming/.htaccess b/streaming/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/streaming/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/streaming/assets/discord.png b/streaming/assets/discord.png Binary files differnew file mode 100644 index 0000000..41b1f27 --- /dev/null +++ b/streaming/assets/discord.png diff --git a/streaming/assets/donate.png b/streaming/assets/donate.png Binary files differnew file mode 100644 index 0000000..715c43b --- /dev/null +++ b/streaming/assets/donate.png diff --git a/streaming/assets/twitter.png b/streaming/assets/twitter.png Binary files differnew file mode 100644 index 0000000..b1cbbed --- /dev/null +++ b/streaming/assets/twitter.png diff --git a/streaming/assets/youtube.png b/streaming/assets/youtube.png Binary files differnew file mode 100644 index 0000000..8128c49 --- /dev/null +++ b/streaming/assets/youtube.png diff --git a/temp/debug.slog b/temp/debug.slog new file mode 100644 index 0000000..aeb63d4 --- /dev/null +++ b/temp/debug.slog @@ -0,0 +1,147 @@ +# The MIT License + +# Copyright © 2015-2020 Slog by s1nical Inc, Ltd. authors + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +# Log generated at 18:42, 2020/13/03 by ADMIN + +-- Asus APP Diagnosis -- +Item Version +---- ------- +Armoury Crate UWP App 2.6.10.0 +ROG Live Service 1.0.22.0 +AURA Service (Lighting Service) 3.03.89 +Armoury Crate lite service 2.6.13 +ASUS AIOFan HAL 1.1.2 +ASUS AURA Extension Card HAL 1.0.16 +ASUS AURA Motherboard HAL 1.0.60 +ASUS AURA Odd Component 1.0.8 +ASUS Aac_NBDT HAL 2.3.11.0 +ASUS Keyboard HAL 1.0.50 +ASUS MB Peripheral Products 1.0.32 +ASUS Mouse HAL 1.0.53 +ASUS MousePad HAL 1.0.1.2 +AacAudioHal 1.02.12 +AacDispaly 1.1.25 +AacVGA 0.0.2.3 +CosairDram 1.0.13 +KingstonDram 1.0.20 +AURA DRAM Component 1.0.37 +ENE RGB HAL 1.00.12 +ENE_DRAM_RGB_AURA42 1.00.02 +ENE_EHD_ASM_HAL 1.00.05 +ENE_EHD_M2_HAL 1.00.02 +Patriot Viper M2 SSD RGB 1.00.04 +Patriot Viper RGB 1.00.06 + +-- NVIDIA System Information -- +[Display] +Item Info/ Version +---- ------------- +Operating System: Windows 10 Pro, 64-bit +DirectX version: 12.0 +GPU processor: GeForce GTX 1660 Ti +Driver version: 442.19 +Driver Type: DCH +Direct3D API version: 12 +Direct3D feature level: 12_1 +CUDA Cores: 1536 +Core clock: 1860 MHz +Memory data rate: 12.00 Gbps +Memory interface: 192-bit +Memory bandwidth: 288.05 GB/s +Total available graphics memory: 14298 MB +Dedicated video memory: 6144 MB GDDR6 +System video memory: 0 MB +Shared system memory: 8154 MB +Video BIOS version: 90.16.20.00.F6 +IRQ: Not used +Bus: PCI Express x16 Gen3 +Device Id: 10DE 2182 86A51043 +Part Number: G161 0021 + +[Components] +Item Version Description +---- ------- ----------- +nvui.dll 8.17.14.4219 NVIDIA User Experience Driver Component +nvxdplcy.dll 8.17.14.4219 NVIDIA User Experience Driver Component +nvxdbat.dll 8.17.14.4219 NVIDIA User Experience Driver Component +nvxdapix.dll 8.17.14.4219 NVIDIA User Experience Driver Component +NVCPL.DLL 8.17.14.4219 NVIDIA User Experience Driver Component +nvCplUIR.dll 8.1.940.0 NVIDIA Control Panel +nvCplUI.exe 8.1.940.0 NVIDIA Control Panel +nvWSSR.dll 26.21.14.4219 NVIDIA Workstation Server +nvWSS.dll 26.21.14.4219 NVIDIA Workstation Server +nvViTvSR.dll 26.21.14.4219 NVIDIA Video Server +nvViTvS.dll 26.21.14.4219 NVIDIA Video Server +nvLicensingS.dll 6.14.14.4219 NVIDIA Licensing Server +nvDevToolS.dll 26.21.14.4219 NVIDIA 3D Settings Server +nvDispSR.dll 26.21.14.4219 NVIDIA Display Server +nvDispS.dll 26.21.14.4219 NVIDIA Display Server +PhysX 09.19.0218 NVIDIA PhysX +NVCUDA.DLL 26.21.14.4219 NVIDIA CUDA 10.2.131 driver +nvGameSR.dll 26.21.14.4219 NVIDIA 3D Settings Server +nvGameS.dll 26.21.14.4219 NVIDIA 3D Settings Server + +-- System Information -- +Item Info/ Version +---- ------------- +OS Name Microsoft Windows 10 Pro +Version 10.0.18363 Build 18363 +Other OS Decription Not Available +OS Manufacturer Microsoft Corperation +System Name S1N-PC +System Manufacturer System manufacturer +System Model System Product Name +System Type x64-based PC +System SKU SKU +Processor AMD Ryzen 5 2600X Six-Core Processor, 3600 Mhz, 6 Core(s), 12 Logical Processor(s) +Bios Version/Date American Megatrends Inc. 2301, 4/19/2019 +SMBIOS Version 3.1 +Embedded Controller Version 255.255 +BIOS Mode UEFI +BaseBoard Manufacturer ASUSTeK COMPUTER INC. +BaseBoard Product ROG STRIX B450-F GAMING +BaseBoard Version Rev 1.xx +Platform Role Desktop +Secure Boot State Off +PCR7 Configuration Binding Not Possible +Windows Directory C:\Windows +System Directory C:\Windows\system32 +Boot Device \Device\HarddiskVolume2 +Locale United States +Hardware Abstraction Layer Version = "10.0.18362.628" +User Name S1N-PC\S1N +Time Zone Pacific Daylight Time +Installed Physical Memory 16.0 GB +Total Physical Memory 15.9 GB +Available Physical Memory 10.6 GB +Total Virtual Memory 21.7 GB +Available Virtual Memory 14.3 GB +Page File Space 5.73 GB +Page File C:\pagefile.sys +Kernal DMA Protection Off +Virtualization-based security Not enabled +Device Encryption Support Reasons for failed automatic device encryption: TPM is not usable, PCR7 binding is not supported, Hardware Security Test Interface failed and device is not Modern Standby, Un-allowed DMA capable bus/device(s) detected, TPM is not usable +Hyper-V - VM Monitor Mode Extensions Yes +Hyper-V - Second Level Address Translation Extensions Yes +Hyper-V - Virtualization Enabled in Firmware Yes +Hyper-V - Data Execution Protection Yes
\ No newline at end of file diff --git a/to/.htaccess b/to/.htaccess new file mode 100644 index 0000000..45552cb --- /dev/null +++ b/to/.htaccess @@ -0,0 +1 @@ +Options -Indexes
\ No newline at end of file diff --git a/to/example/index.html b/to/example/index.html new file mode 100644 index 0000000..fb30391 --- /dev/null +++ b/to/example/index.html @@ -0,0 +1,84 @@ +<!DOCTYPE html> +<body lang="en"> + + <head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta http-equiv="X-UA-Compatible" content="ie=edge"> + <title>s1nical - Loading...</title> + <!-- External Libraries --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/trianglify/0.3.1/trianglify.min.js"></script> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> + <script src="https://code.jquery.com/jquery-1.10.2.js"></script> + <!-- CSS Links --> + <link rel="stylesheet" href="/about/css/main.css"> + <link rel="stylesheet" href="/about/css/navigation-bar.css"> + <link rel="stylesheet" href="/about/css/loader-animation.css"> + <link rel="stylesheet" href="/about/css/blog-slider.css"> + <link rel="stylesheet" href="/404/css/main.css"> + <!-- Invisible Scripts --> + <script src="/js/loader-animation.js"></script> + <script src="/js/refresh-on-media.js"></script> + <script> + var timer = setTimeout(function() { + window.location='http://example.com' + }, 4500); + </script> + </head> + + <body> + <!-- Visable Scripts --> + <script src="/js/background-sparkles.js"></script> + <script src="/to/js/countdown.js"></script> + + <!-- Navigation Bar --> + <div class="navigation-bar"> + <nav class="nav"> + <a href="/home/" class="nav-item" active-color="orange">Home</a> + <!-- Had `is-active` after it but removed it due to not highlighting. --> + <a href="/about/" class="nav-item" active-color="green">About</a> <!-- About --> + <!--<a href="https://p.s1n.pw/" class="nav-item" active-color="blue">Portfolio</a> <!-- Testimonials --> + <a href="https://cyne.cf/status" class="nav-item" active-color="red">Status</a> <!-- Blog --> + <!--<a href="/cars/" class="nav-item" active-color="rebeccapurple">Cars</a> <!-- Contact --> + <!--<a href="https://nani.s1n.pw" class="nav-item" active-color="rebeccapurple">Nani?!</a>--> + <span class="nav-indicator"></span> + </nav> + </div> + + <div class="bio"> + <div class="links"> + <div class="blog-slider"> + <div class="content" style="text-align: center;"> + <h1>Loading...</h1> + <h2>Redirecting in <span id="time">5</span> seconds</h2> + <h1> + <!-- Filler --> + </h1> + </div> + </div> + </div> + </div> + + <!-- Loading Animation --> + <div class="loader-wrapper"> + <div class="loader"> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + <row> + <span></span> + <span></span> + <span></span> + </row> + </div> + </div> + </body> + +</html> diff --git a/to/js/countdown.js b/to/js/countdown.js new file mode 100644 index 0000000..5fc3039 --- /dev/null +++ b/to/js/countdown.js @@ -0,0 +1,25 @@ +function startTimer(duration, display) { + var timer = duration, + minutes, seconds; + setInterval(function () { + minutes = parseInt(timer / 60, 10); + seconds = parseInt(timer % 60, 10); + + // minutes = minutes < 10 ? "0" + minutes : minutes; + seconds = seconds < 10 ? "" + seconds : seconds; // In "" should be 0 + + display.textContent = seconds; + // Original with minutes + // display.textContent = minutes + ":" + seconds; + + if (--timer < 0*60) { + timer = duration; + } + }, 1000); +} + +window.onload = function () { + var fiveMinutes = 4 * 1, // 60 * 5 + display = document.querySelector('#time'); + startTimer(fiveMinutes, display); +}; diff --git a/visitors/.htaccess b/visitors/.htaccess new file mode 100644 index 0000000..0762e39 --- /dev/null +++ b/visitors/.htaccess @@ -0,0 +1,4 @@ +AuthUserFile /home/vol9_2/epizy.com/epiz_25275270/htdocs/assets/users/.htpasswdmufxo45v5tz7bAWr +AuthType Basic +AuthName "My restricted Area" +Require valid-user
\ No newline at end of file diff --git a/visitors/index.php b/visitors/index.php new file mode 100644 index 0000000..ede3f8a --- /dev/null +++ b/visitors/index.php @@ -0,0 +1,11 @@ +<?php + //require_once('pass.php'); + + $url1=$_SERVER['REQUEST_URI']; + header("Refresh: 5; URL=$url1"); +?> +<title>s1nical - Visitors</title> +<b>Cleared On: 2020/01/13</b> +<!----> + +<pre><b>User IP</b>: 24.21.215.107 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36 <br>on Time : 03/02/2020 19:14:32 <br></pre><pre><b>User IP</b>: 24.21.215.107 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36 <br>on Time : 03/02/2020 19:17:24 <br></pre><pre><b>User IP</b>: 162.158.106.243 <b> Browser</b>: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.130 Safari/537.36 (compatible; Cloudflare SpeedTest/1.0; +https://blog.cloudflare.com/new-speed-page/) <br>on Time : 03/02/2020 19:18:59 <br></pre><pre><b>User IP</b>: 162.158.107.216 <b> Browser</b>: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.130 Safari/537.36 (compatible; Cloudflare SpeedTest/1.0; +https://blog.cloudflare.com/new-speed-page/) <br>on Time : 03/02/2020 19:18:59 <br></pre><pre><b>User IP</b>: 162.158.107.216 <b> Browser</b>: Mozilla/5.0 (compatible; CloudFlare-AlwaysOnline/1.0;+http://www.cloudflare.com/always-online) <br>on Time : 03/02/2020 20:35:17 <br></pre><pre><b>User IP</b>: 162.158.79.92 <b> Browser</b>: Mozilla/5.0 (compatible; CloudFlare-AlwaysOnline/1.0; +http://www.cloudflare.com/always-online) AppleWebKit/534.34 <br>on Time : 03/02/2020 20:35:20 <br></pre><pre><b>User IP</b>: 108.162.246.218 <b> Browser</b>: Mozilla/5.0 (compatible; CloudFlare-AlwaysOnline/1.0;+http://www.cloudflare.com/always-online) <br>on Time : 03/02/2020 20:36:00 <br></pre><pre><b>User IP</b>: 172.68.65.111 <b> Browser</b>: Mozilla/5.0 (compatible; CloudFlare-AlwaysOnline/1.0; +http://www.cloudflare.com/always-online) AppleWebKit/534.34 <br>on Time : 03/02/2020 20:36:00 <br></pre><pre><b>User IP</b>: 172.68.174.121 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36 <br>on Time : 03/02/2020 22:34:29 <br></pre><pre><b>User IP</b>: 172.69.68.21 <b> Browser</b>: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/03/2020 09:00:22 <br></pre><pre><b>User IP</b>: 108.162.246.20 <b> Browser</b>: Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Mobile/15E148 Safari/604.1 <br>on Time : 03/04/2020 14:20:54 <br></pre><pre><b>User IP</b>: 141.101.98.43 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36 <br>on Time : 03/04/2020 14:21:58 <br></pre><pre><b>User IP</b>: 162.158.107.184 <b> Browser</b>: Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Mobile/15E148 Safari/604.1 <br>on Time : 03/04/2020 14:26:28 <br></pre><pre><b>User IP</b>: 162.158.107.184 <b> Browser</b>: Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Mobile/15E148 Safari/604.1 <br>on Time : 03/04/2020 14:26:29 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36 <br>on Time : 03/04/2020 19:10:31 <br></pre><pre><b>User IP</b>: 108.162.246.164 <b> Browser</b>: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.130 Safari/537.36 (compatible; Cloudflare SpeedTest/1.0; +https://blog.cloudflare.com/new-speed-page/) <br>on Time : 03/04/2020 19:11:09 <br></pre><pre><b>User IP</b>: 162.158.107.226 <b> Browser</b>: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.130 Safari/537.36 (compatible; Cloudflare SpeedTest/1.0; +https://blog.cloudflare.com/new-speed-page/) <br>on Time : 03/04/2020 19:11:10 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36 <br>on Time : 03/04/2020 19:12:49 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36 <br>on Time : 03/04/2020 19:29:14 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36 <br>on Time : 03/04/2020 19:52:38 <br></pre><pre><b>User IP</b>: 108.162.246.164 <b> Browser</b>: Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/80.0.3987.95 Mobile/15E148 Safari/604.1 <br>on Time : 03/05/2020 12:52:31 <br></pre><pre><b>User IP</b>: 172.68.174.119 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/05/2020 15:30:36 <br></pre><pre><b>User IP</b>: 162.158.187.76 <b> Browser</b>: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/05/2020 16:35:14 <br></pre><pre><b>User IP</b>: 162.158.187.76 <b> Browser</b>: Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/05/2020 16:40:42 <br></pre><pre><b>User IP</b>: 162.158.187.76 <b> Browser</b>: Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.92 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/05/2020 16:44:09 <br></pre><pre><b>User IP</b>: 172.68.174.119 <b> Browser</b>: Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/80.0.3987.95 Mobile/15E148 Safari/604.1 <br>on Time : 03/05/2020 18:11:36 <br></pre><pre><b>User IP</b>: 162.158.107.154 <b> Browser</b>: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0 <br>on Time : 03/05/2020 20:40:06 <br></pre><pre><b>User IP</b>: 162.158.187.76 <b> Browser</b>: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/06/2020 09:00:25 <br></pre><pre><b>User IP</b>: 162.158.187.76 <b> Browser</b>: Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.92 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/06/2020 09:03:57 <br></pre><pre><b>User IP</b>: 162.158.187.76 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36 <br>on Time : 03/07/2020 06:17:03 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/80.0.3987.95 Mobile/15E148 Safari/604.1 <br>on Time : 03/07/2020 06:17:04 <br></pre><pre><b>User IP</b>: 108.162.250.114 <b> Browser</b>: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36 <br>on Time : 03/07/2020 15:41:49 <br></pre><pre><b>User IP</b>: 162.158.74.186 <b> Browser</b>: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/08/2020 17:35:16 <br></pre><pre><b>User IP</b>: 162.158.74.186 <b> Browser</b>: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/09/2020 10:00:31 <br></pre><pre><b>User IP</b>: 162.158.74.186 <b> Browser</b>: Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.92 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/09/2020 10:43:19 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/09/2020 19:21:47 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/09/2020 19:26:53 <br></pre><pre><b>User IP</b>: 162.158.92.145 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 10:31:02 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 11:46:17 <br></pre><pre><b>User IP</b>: 172.69.63.136 <b> Browser</b>: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36 <br>on Time : 03/10/2020 11:46:20 <br></pre><pre><b>User IP</b>: 108.162.246.224 <b> Browser</b>: Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 <br>on Time : 03/10/2020 12:11:54 <br></pre><pre><b>User IP</b>: 172.68.174.121 <b> Browser</b>: Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/80.0.3987.95 Mobile/15E148 Safari/604.1 <br>on Time : 03/10/2020 12:16:24 <br></pre><pre><b>User IP</b>: 172.68.174.121 <b> Browser</b>: Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/80.0.3987.95 Mobile/15E148 Safari/604.1 <br>on Time : 03/10/2020 12:16:26 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:25:45 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:35:17 <br></pre><pre><b>User IP</b>: 172.68.174.119 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:47:13 <br></pre><pre><b>User IP</b>: 172.68.174.119 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:47:21 <br></pre><pre><b>User IP</b>: 172.68.174.121 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:49:07 <br></pre><pre><b>User IP</b>: 172.68.174.121 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:49:12 <br></pre><pre><b>User IP</b>: 172.68.174.121 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:49:34 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:50:14 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:50:20 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:50:23 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:51:03 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:51:03 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:51:07 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:51:57 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:51:57 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:52:00 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:52:14 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:52:20 <br></pre><pre><b>User IP</b>: 172.68.174.119 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:53:21 <br></pre><pre><b>User IP</b>: 172.68.174.119 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:53:22 <br></pre><pre><b>User IP</b>: 172.68.174.119 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:53:27 <br></pre><pre><b>User IP</b>: 172.68.174.121 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:54:12 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:54:27 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:54:33 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/10/2020 12:54:39 <br></pre><pre><b>User IP</b>: 172.68.174.121 <b> Browser</b>: Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/80.0.3987.95 Mobile/15E148 Safari/604.1 <br>on Time : 03/10/2020 13:02:07 <br></pre><pre><b>User IP</b>: 172.68.174.119 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12607.58.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.86 Safari/537.36 <br>on Time : 03/10/2020 14:46:03 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 19:17:49 <br></pre><pre><b>User IP</b>: 172.68.174.119 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 19:42:25 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 19:54:01 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 19:58:55 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 20:04:50 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 20:52:13 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 2020/03/10 21:08:43 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 2020/03/10 21:08:58 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 2020/03/10 21:09:10 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:11:53 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:13:12 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:13:29 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:13:36 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:14:37 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:16:48 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:16:57 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:18:23 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:18:40 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:18:56 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:19:13 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:19:33 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:19:46 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:20:01 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:24:08 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:27:05 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:27:25 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:33:08 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:35:00 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:44:19 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 18:49:59 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/10/2020 19:13:12 <br></pre><pre><b>User IP</b>: 172.69.68.240 <b> Browser</b>: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36 <br>on Time : 03/11/2020 0:15:07 <br></pre><pre><b>User IP</b>: 172.69.70.212 <b> Browser</b>: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36 <br>on Time : 03/11/2020 0:15:12 <br></pre><pre><b>User IP</b>: 172.69.70.62 <b> Browser</b>: Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1 <br>on Time : 03/11/2020 0:15:25 <br></pre><pre><b>User IP</b>: 162.158.107.216 <b> Browser</b>: Mozilla/5.0 (Linux; Android 7.0; SM-G930V Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36 <br>on Time : 03/11/2020 0:15:26 <br></pre><pre><b>User IP</b>: 108.162.246.20 <b> Browser</b>: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.2) <br>on Time : 03/11/2020 0:15:26 <br></pre><pre><b>User IP</b>: 172.69.68.41 <b> Browser</b>: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36 <br>on Time : 03/11/2020 0:17:36 <br></pre><pre><b>User IP</b>: 172.69.70.14 <b> Browser</b>: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36 <br>on Time : 03/11/2020 0:17:39 <br></pre><pre><b>User IP</b>: 172.69.71.97 <b> Browser</b>: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 <br>on Time : 03/11/2020 0:42:13 <br></pre><pre><b>User IP</b>: 172.69.68.120 <b> Browser</b>: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/78.0.3904.70 Safari/537.36 <br>on Time : 03/11/2020 0:42:15 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/11/2020 8:47:48 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/11/2020 8:48:43 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/11/2020 8:49:15 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/11/2020 9:16:32 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12371.89.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 <br>on Time : 03/11/2020 9:28:57 <br></pre><pre><b>User IP</b>: 172.68.174.121 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12607.58.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.86 Safari/537.36 <br>on Time : 03/11/2020 10:11:52 <br></pre><pre><b>User IP</b>: 172.68.174.121 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12607.58.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.86 Safari/537.36 <br>on Time : 03/11/2020 10:16:59 <br></pre><pre><b>User IP</b>: 172.68.174.119 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12607.58.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.86 Safari/537.36 <br>on Time : 03/11/2020 10:17:16 <br></pre><pre><b>User IP</b>: 162.158.94.167 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36 OPR/67.0.3575.53 <br>on Time : 03/12/2020 0:22:59 <br></pre><pre><b>User IP</b>: 162.158.74.186 <b> Browser</b>: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/12/2020 7:00:39 <br></pre><pre><b>User IP</b>: 172.68.174.119 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12607.58.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.86 Safari/537.36 <br>on Time : 03/12/2020 8:38:25 <br></pre><pre><b>User IP</b>: 172.68.174.119 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12607.58.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.86 Safari/537.36 <br>on Time : 03/12/2020 8:38:50 <br></pre><pre><b>User IP</b>: 172.68.174.119 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12607.58.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.86 Safari/537.36 <br>on Time : 03/12/2020 11:20:32 <br></pre><pre><b>User IP</b>: 172.68.174.119 <b> Browser</b>: Mozilla/5.0 (X11; CrOS x86_64 12607.82.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.123 Safari/537.36 <br>on Time : 03/12/2020 13:06:25 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/12/2020 23:15:16 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/12/2020 23:30:34 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/12/2020 23:30:38 <br></pre><pre><b>User IP</b>: 172.68.174.121 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/12/2020 23:54:17 <br></pre><pre><b>User IP</b>: 172.68.174.121 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/12/2020 23:55:47 <br></pre><pre><b>User IP</b>: 172.68.174.121 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/12/2020 23:56:50 <br></pre><pre><b>User IP</b>: 172.69.24.92 <b> Browser</b>: Mozilla/5.0 (compatible; CloudFlare-AlwaysOnline/1.0;+http://www.cloudflare.com/always-online) <br>on Time : 03/12/2020 23:56:54 <br></pre><pre><b>User IP</b>: 172.69.24.202 <b> Browser</b>: Mozilla/5.0 (compatible; CloudFlare-AlwaysOnline/1.0;+http://www.cloudflare.com/always-online) <br>on Time : 03/12/2020 23:56:55 <br></pre><pre><b>User IP</b>: 172.68.174.119 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/13/2020 2:23:28 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/13/2020 2:33:23 <br></pre><pre><b>User IP</b>: 108.162.246.20 <b> Browser</b>: Mozilla/5.0 (compatible; CloudFlare-AlwaysOnline/1.0; +http://www.cloudflare.com/always-online) AppleWebKit/534.34 <br>on Time : 03/13/2020 16:45:45 <br></pre><pre><b>User IP</b>: 172.68.174.119 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/13/2020 19:53:58 <br></pre><pre><b>User IP</b>: 172.68.174.121 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/13/2020 20:22:47 <br></pre><pre><b>User IP</b>: 172.68.189.124 <b> Browser</b>: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 <br>on Time : 03/14/2020 9:58:36 <br></pre><pre><b>User IP</b>: 162.158.74.186 <b> Browser</b>: Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/15/2020 6:01:23 <br></pre><pre><b>User IP</b>: 108.162.229.135 <b> Browser</b>: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36 OPR/54.0.2952.64 (Edition Yx) <br>on Time : 03/16/2020 1:27:42 <br></pre><pre><b>User IP</b>: 108.162.229.245 <b> Browser</b>: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0 <br>on Time : 03/16/2020 11:13:49 <br></pre><pre><b>User IP</b>: 108.162.229.245 <b> Browser</b>: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0 <br>on Time : 03/16/2020 11:13:49 <br></pre><pre><b>User IP</b>: 162.158.74.14 <b> Browser</b>: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 Google Favicon <br>on Time : 03/17/2020 5:09:11 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/17/2020 7:00:22 <br></pre><pre><b>User IP</b>: 172.69.162.145 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/17/2020 7:00:28 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/17/2020 7:02:38 <br></pre><pre><b>User IP</b>: 172.68.174.121 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36 <br>on Time : 03/18/2020 17:27:51 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36 <br>on Time : 03/18/2020 22:32:14 <br></pre><pre><b>User IP</b>: 172.69.68.21 <b> Browser</b>: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 Google Favicon <br>on Time : 03/19/2020 5:36:36 <br></pre><pre><b>User IP</b>: 173.245.54.158 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 <br>on Time : 03/19/2020 11:00:24 <br></pre><pre><b>User IP</b>: 108.162.246.182 <b> Browser</b>: Mozilla/5.0 (Macintosh; PPC Mac OS X 10.12; rv:50.0) Gecko/20100101 Firefox/50.0 <br>on Time : 03/19/2020 17:17:00 <br></pre><pre><b>User IP</b>: 172.69.22.89 <b> Browser</b>: python-requests/2.21.0 <br>on Time : 03/20/2020 13:19:17 <br></pre><pre><b>User IP</b>: 162.158.122.9 <b> Browser</b>: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/21/2020 22:34:09 <br></pre><pre><b>User IP</b>: 162.158.122.33 <b> Browser</b>: Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/22/2020 10:26:19 <br></pre><pre><b>User IP</b>: 108.162.216.161 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36 <br>on Time : 03/22/2020 16:15:30 <br></pre><pre><b>User IP</b>: 172.69.68.21 <b> Browser</b>: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/22/2020 23:53:15 <br></pre><pre><b>User IP</b>: 108.162.229.135 <b> Browser</b>: Mozilla/5.0 (X11; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0 <br>on Time : 03/23/2020 20:30:19 <br></pre><pre><b>User IP</b>: 172.69.68.21 <b> Browser</b>: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/24/2020 6:23:17 <br></pre><pre><b>User IP</b>: 172.69.69.19 <b> Browser</b>: Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/24/2020 11:13:04 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36 <br>on Time : 03/24/2020 13:24:34 <br></pre><pre><b>User IP</b>: 141.101.69.52 <b> Browser</b>: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0 <br>on Time : 03/24/2020 20:59:55 <br></pre><pre><b>User IP</b>: 141.101.69.192 <b> Browser</b>: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0 <br>on Time : 03/24/2020 20:59:55 <br></pre><pre><b>User IP</b>: 172.69.69.19 <b> Browser</b>: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/24/2020 22:34:11 <br></pre><pre><b>User IP</b>: 162.158.106.39 <b> Browser</b>: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31 <br>on Time : 03/25/2020 10:43:57 <br></pre><pre><b>User IP</b>: 108.162.245.5 <b> Browser</b>: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31 <br>on Time : 03/25/2020 13:06:56 <br></pre><pre><b>User IP</b>: 172.69.68.21 <b> Browser</b>: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 Google Favicon <br>on Time : 03/25/2020 22:37:43 <br></pre><pre><b>User IP</b>: 172.69.68.21 <b> Browser</b>: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/25/2020 22:37:43 <br></pre><pre><b>User IP</b>: 162.158.122.33 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 <br>on Time : 03/25/2020 22:37:44 <br></pre><pre><b>User IP</b>: 172.68.174.7 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36 <br>on Time : 03/25/2020 22:37:48 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36 <br>on Time : 03/25/2020 22:46:51 <br></pre><pre><b>User IP</b>: 172.69.68.21 <b> Browser</b>: Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/26/2020 5:10:53 <br></pre><pre><b>User IP</b>: 162.158.187.212 <b> Browser</b>: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 Google Favicon <br>on Time : 03/26/2020 7:24:00 <br></pre><pre><b>User IP</b>: 172.69.68.21 <b> Browser</b>: Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/26/2020 8:30:55 <br></pre><pre><b>User IP</b>: 172.69.68.21 <b> Browser</b>: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/26/2020 13:07:02 <br></pre><pre><b>User IP</b>: 172.69.68.21 <b> Browser</b>: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 Google Favicon <br>on Time : 03/26/2020 21:53:31 <br></pre><pre><b>User IP</b>: 162.158.38.57 <b> Browser</b>: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 Google Favicon <br>on Time : 03/26/2020 22:39:15 <br></pre><pre><b>User IP</b>: 172.69.68.21 <b> Browser</b>: Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/27/2020 4:11:55 <br></pre><pre><b>User IP</b>: 162.158.38.57 <b> Browser</b>: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 Google Favicon <br>on Time : 03/27/2020 12:25:48 <br></pre><pre><b>User IP</b>: 108.162.246.8 <b> Browser</b>: Mozilla/5.0 (compatible; CloudFlare-AlwaysOnline/1.0; +http://www.cloudflare.com/always-online) AppleWebKit/534.34 <br>on Time : 03/27/2020 16:47:56 <br></pre><pre><b>User IP</b>: 172.69.69.19 <b> Browser</b>: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) <br>on Time : 03/27/2020 22:34:13 <br></pre><pre><b>User IP</b>: 172.68.174.19 <b> Browser</b>: Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/80.0.3987.95 Mobile/15E148 Safari/604.1 <br>on Time : 03/28/2020 5:59:42 <br></pre><pre><b>User IP</b>: 172.69.68.21 <b> Browser</b>: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 Google Favicon <br>on Time : 03/28/2020 9:35:08 <br></pre><pre><b>User IP</b>: 172.69.68.21 <b> Browser</b>: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 Google Favicon <br>on Time : 03/28/2020 9:35:08 <br></pre>
\ No newline at end of file |