· 5 years ago · Jun 08, 2020, 09:08 AM
1
2
3
4<!DOCTYPE html>
5<html lang="en-us">
6<head>
7
8 <link rel="shortcut icon" href="//a.disquscdn.com/1587400073/img/favicon16-32.ico" type="image/vnd.microsoft.icon">
9
10
11 <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
12 <meta http-equiv="Content-Language" content="en-us">
13 <meta name="keywords" content="Disqus, disqus.com, comments, blog, blogs, discussion">
14 <meta name="google" value="notranslate" />
15 <title>
16
17 Permission Denied - Disqus
18
19 </title>
20
21 <meta name="description" content="Disqus is a global comment system that improves discussion on websites and connects conversations across the web.">
22
23
24 <script type="text/javascript" charset="utf-8">
25 document.domain = 'disqus.com';
26 if (window.context === undefined) {
27 var context = {};
28 }
29 context.disqusUrl = 'https://disqus.com';
30 context.revealUrl = 'http://hubspot.disqus.biz/reveal-by-disqus-organic';
31 context.disqusDomain = 'disqus.com';
32 context.mediaUrl = '//a.disquscdn.com/1587400073/';
33 context.uploadsUrl = '//a.disquscdn.com/uploads';
34 context.sslUploadsUrl = '//a.disquscdn.com/uploads';
35 context.loginUrl = 'https://disqus.com/profile/login/';
36 context.signupUrl = 'https://disqus.com/profile/signup/';
37 context.apiUrl = '//disqus.com/api/3.0/';
38 context.apiPublicKey = 'Y1S1wGIzdc63qnZ5rhHfjqEABGA4ZTDncauWFFWWTUBqkmLjdxloTb7ilhGnZ7z1';
39
40 context.forum = null;
41 context.adminUrl = 'https://disqus.com';
42
43 context.urlMap = {
44 'signup': 'http://disqus.com/admin/signup/',
45 'dashboard': 'http://disqus.com/dashboard/',
46 'admin': 'https://disqus.com/admin/',
47
48 'logout': '//disqus.com/logout/',
49 'home': 'https://disqus.com',
50 'home_settings_profile': 'https://disqus.com/home/settings/profile/',
51 'for_websites': 'http://disqus.com/websites/',
52 'for_publishers': 'http://hubspot.disqus.biz/reveal-by-disqus-organic',
53 'login': 'https://disqus.com/profile/login/'
54 };
55 context.navMap = {
56 'signup': '',
57 'dashboard': '',
58 'admin': '',
59 'addons': ''
60 };
61</script>
62
63 <script src="//a.disquscdn.com/1587400073/js/src/auth_context.js" type="text/javascript" charset="utf-8"></script>
64
65
66
67 <link href="//a.disquscdn.com/1587400073/css/base-old.css" type="text/css" rel="stylesheet" />
68 <link rel="stylesheet" href="//a.disquscdn.com/1587400073/build/css/6b1628fb5ca5.css" type="text/css" />
69 <link href="//a.disquscdn.com/1587400073/css/facebox.css" type="text/css" rel="stylesheet" />
70
71
72<link rel="stylesheet" href="//ssl.typography.com/797702/686420/css/fonts.css" type="text/css" />
73
74
75
76 <!--[if lte IE 9 ]>
77 <link rel="stylesheet" href="//a.disquscdn.com/1587400073/build/css/811e9f0806ab.css" type="text/css" />
78 <![endif]-->
79
80
81
82
83
84
85
86
87
88
89
90
91<script type="text/javascript" src="//a.disquscdn.com/1587400073/build/js/abadd50d331d.js"></script>
92
93<script>
94//
95// shared/foundation.js
96//
97// This file contains the absolute minimum code necessary in order
98// to create a new application in the DISQUS namespace.
99//
100// You should load this file *before* anything that modifies the DISQUS global.
101//
102
103/*jshint browser:true, undef:true, strict:true, expr:true, white:true */
104/*global DISQUS:true */
105
106var DISQUS = (function (window, undefined) {
107 "use strict";
108
109 var DISQUS = window.DISQUS || {};
110
111 // Exception thrown from DISQUS.assert method on failure
112 DISQUS.AssertionError = function (message) {
113 this.message = message;
114 };
115
116 DISQUS.AssertionError.prototype.toString = function () {
117 return 'Assertion Error: ' + (this.message || '[no message]');
118 };
119
120
121 // Raises a DISQUS.AssertionError if value is falsy
122 DISQUS.assert = function (value, message, soft) {
123 if (value)
124 return;
125
126 if (soft)
127 window.console && window.console.log("DISQUS assertion failed: " + message);
128 else
129 throw new DISQUS.AssertionError(message);
130 };
131
132
133 // Functions to clean attached modules (used by define and cleanup)
134 var cleanFuncs = [];
135
136 // Attaches a new public interface (module) to the DISQUS namespace.
137 // For example, if DISQUS object is { 'a': { 'b': {} } }:
138 //
139 // DISQUS.define('a.b.c', function () { return { 'd': 'hello' }; }); will transform it into
140 // -> { 'a': { 'b': { 'c': { 'd' : hello' }}}}
141 //
142 // and DISQUS.define('a', function () { return { 'x': 'world' }; }); will transform it into
143 // -> { 'a': { 'b': {}}, 'x': 'world' }
144 //
145 // Attach modules to DISQUS using only this function.
146
147 DISQUS.define = function (name, fn) {
148 /*jshint loopfunc:true */
149 if (typeof name === 'function') {
150 fn = name;
151 name = '';
152 }
153
154 var parts = name.split('.');
155 var part = parts.shift();
156 var cur = DISQUS;
157
158 var exports = (fn || function () { return {}; }).call({
159 overwrites: function (obj) {
160 obj.__overwrites__ = true;
161 return obj;
162 }
163 }, window);
164
165 while (part) {
166 cur = (cur[part] ? cur[part] : cur[part] = {});
167 part = parts.shift();
168 }
169
170 for (var key in exports) {
171 if (!exports.hasOwnProperty(key))
172 continue;
173
174 /*jshint eqnull:true */
175 if (!exports.__overwrites__ && cur[key] !== null) {
176 DISQUS.assert(!cur.hasOwnProperty(key),
177 'Unsafe attempt to redefine existing module: ' + key,
178 true /* soft assertion */);
179 }
180
181 cur[key] = exports[key];
182 cleanFuncs.push(function (cur, key) {
183 return function () { delete cur[key]; };
184 }(cur, key));
185 }
186 return cur;
187 };
188
189
190 // Alias for DISQUS.define for the sake of semantics.
191 // You should use it when you need to get a reference to another
192 // DISQUS module before that module is defined:
193 //
194 // var collections = DISQUS.use('lounge.collections');
195 //
196 // DISQUS.use is a single argument function because we don't
197 // want to encourage people to use it instead of DISQUS.define.
198
199 DISQUS.use = function (name) {
200 return DISQUS.define(name);
201 };
202
203 DISQUS.cleanup = function () {
204 for (var i = 0; i < cleanFuncs.length; i++) {
205 cleanFuncs[i]();
206 }
207 };
208
209 return DISQUS;
210})(window);
211
212/*jshint expr:true, undef:true, strict:true, white:true, browser:true */
213/*global DISQUS:false*/
214//
215// shared/corefuncs.js
216//
217
218DISQUS.define(function (window, undefined) {
219 "use strict";
220
221 var DISQUS = window.DISQUS;
222 var document = window.document;
223 var head = document.getElementsByTagName('head')[0] ||
224 document.body;
225 var jobs = { running: false, timer: null, queue: [] };
226 var uid = 0;
227
228 // Taken from _.uniqueId
229 DISQUS.getUid = function (prefix) {
230 var id = ++uid + '';
231 return prefix ? prefix + id : id;
232 };
233
234 /* Defers func() execution until cond() is true */
235 DISQUS.defer = function (cond, func) {
236 function beat() {
237 /*jshint boss:true */
238 var queue = jobs.queue;
239
240 if (queue.length === 0) {
241 jobs.running = false;
242 clearInterval(jobs.timer);
243 }
244
245 for (var i = 0, pair; pair = queue[i]; i++) {
246 if (pair[0]()) {
247 queue.splice(i--, 1);
248 pair[1]();
249 }
250 }
251 }
252
253 jobs.queue.push([cond, func]);
254 beat();
255
256 if (!jobs.running) {
257 jobs.running = true;
258 jobs.timer = setInterval(beat, 100);
259 }
260 };
261
262 DISQUS.isOwn = function (obj, key) {
263 // The object.hasOwnProperty method fails when the
264 // property under consideration is named 'hasOwnProperty'.
265 return Object.prototype.hasOwnProperty.call(obj, key);
266 };
267
268 DISQUS.isString = function (str) {
269 return Object.prototype.toString.call(str) === "[object String]";
270 };
271
272 /*
273 * Iterates over an object or a collection and calls a callback
274 * function with each item as a parameter.
275 */
276 DISQUS.each = function (collection, callback) {
277 var length = collection.length,
278 forEach = Array.prototype.forEach;
279
280 if (!isNaN(length)) {
281 // Treat collection as an array
282 if (forEach) {
283 forEach.call(collection, callback);
284 } else {
285 for (var i = 0; i < length; i++) {
286 callback(collection[i], i, collection);
287 }
288 }
289 } else {
290 // Treat collection as an object
291 for (var key in collection) {
292 if (DISQUS.isOwn(collection, key)) {
293 callback(collection[key], key, collection);
294 }
295 }
296 }
297 };
298
299 // Borrowed from underscore
300 DISQUS.extend = function (obj) {
301 DISQUS.each(Array.prototype.slice.call(arguments, 1), function (source) {
302 for (var prop in source) {
303 obj[prop] = source[prop];
304 }
305 });
306 return obj;
307 };
308
309 DISQUS.serializeArgs = function (params) {
310 var pcs = [];
311 DISQUS.each(params, function (val, key) {
312 if (val !== undefined) {
313 pcs.push(key + (val !== null ? '=' + encodeURIComponent(val) : ''));
314 }
315 });
316 return pcs.join('&');
317 };
318
319 DISQUS.serialize = function (url, params, nocache) {
320 if (params) {
321 url += (~url.indexOf('?') ?
322 (url.charAt(url.length - 1) == '&' ? '': '&') : '?');
323 url += DISQUS.serializeArgs(params);
324 }
325
326 if (nocache) {
327 var ncp = {};
328 ncp[(new Date()).getTime()] = null;
329 return DISQUS.serialize(url, ncp);
330 }
331
332 var len = url.length;
333 return (url.charAt(len - 1) == "&" ? url.slice(0, len - 1) : url);
334 };
335
336 var TIMEOUT_DURATION = 2e4; // 20 seconds
337 var addEvent, removeEvent;
338
339 // select the correct event listener function. all of our supported
340 // browsers will use one of these
341 if ('addEventListener' in window) {
342 addEvent = function (node, event, handler) {
343 node.addEventListener(event, handler, false);
344 };
345 removeEvent = function (node, event, handler) {
346 node.removeEventListener(event, handler, false);
347 };
348 }
349 else {
350 addEvent = function (node, event, handler) {
351 node.attachEvent('on' + event, handler);
352 };
353 removeEvent = function (node, event, handler) {
354 node.detachEvent('on' + event, handler);
355 };
356 }
357
358 DISQUS.require = function (url, params, nocache, success, failure) {
359 var script = document.createElement('script');
360 var evName = script.addEventListener ? 'load' : 'readystatechange';
361 var timeout = null;
362
363 script.src = DISQUS.serialize(url, params, nocache);
364 script.async = true;
365 script.charset = 'UTF-8';
366
367 function handler(ev) {
368 ev = ev || window.event;
369 if (!ev.target) {
370 ev.target = ev.srcElement;
371 }
372
373 if (ev.type != 'load' && !/^(complete|loaded)$/.test(ev.target.readyState)) {
374 return; // Not ready yet
375 }
376
377 if (success) {
378 success();
379 }
380
381 if (timeout) {
382 clearTimeout(timeout);
383 }
384
385 removeEvent(ev.target, evName, handler);
386 }
387
388 if (success || failure) {
389 addEvent(script, evName, handler);
390 }
391
392 if (failure) {
393 timeout = setTimeout(function () {
394 failure();
395 }, TIMEOUT_DURATION);
396 }
397
398 head.appendChild(script);
399 return DISQUS;
400 };
401
402 DISQUS.requireStylesheet = function (url, params, nocache) {
403 var link = document.createElement('link');
404 link.rel = 'stylesheet';
405 link.type = 'text/css';
406 link.href = DISQUS.serialize(url, params, nocache);
407 head.appendChild(link);
408 return DISQUS;
409 };
410
411 DISQUS.requireSet = function (urls, nocache, callback) {
412 var remaining = urls.length;
413 DISQUS.each(urls, function (url) {
414 DISQUS.require(url, {}, nocache, function () {
415 if (--remaining === 0) { callback(); }
416 });
417 });
418 };
419
420 DISQUS.injectCss = function (css) {
421 var style = document.createElement('style');
422 style.setAttribute('type', 'text/css');
423
424 // Make inline CSS more readable by splitting each rule onto a separate line
425 css = css.replace(/\}/g, "}\n");
426
427 if (window.location.href.match(/^https/))
428 css = css.replace(/http:\/\//g, 'https://');
429
430 if (style.styleSheet) { // Internet Explorer only
431 style.styleSheet.cssText = css;
432 } else {
433 style.appendChild(document.createTextNode(css));
434 }
435
436 head.appendChild(style);
437 };
438
439 DISQUS.isString = function (val) {
440 return Object.prototype.toString.call(val) === '[object String]';
441 };
442});
443
444/*jshint boss:true*/
445/*global DISQUS */
446DISQUS.define('Events', function (window, undefined) {
447 "use strict";
448
449 // Returns a function that will be executed at most one time, no matter how
450 // often you call it. Useful for lazy initialization.
451 var once = function (func) {
452 var ran = false, memo;
453 return function () {
454 if (ran) return memo;
455 ran = true;
456 memo = func.apply(this, arguments);
457 func = null;
458 return memo;
459 };
460 };
461 var has = DISQUS.isOwn;
462 var keys = Object.keys || function (obj) {
463 if (obj !== Object(obj)) throw new TypeError('Invalid object');
464 var keys = [];
465 for (var key in obj) if (has(obj, key)) keys[keys.length] = key;
466 return keys;
467 };
468 var slice = [].slice;
469
470 // Backbone.Events
471 // ---------------
472
473 // A module that can be mixed in to *any object* in order to provide it with
474 // custom events. You may bind with `on` or remove with `off` callback
475 // functions to an event; `trigger`-ing an event fires all callbacks in
476 // succession.
477 //
478 // var object = {};
479 // _.extend(object, Backbone.Events);
480 // object.on('expand', function(){ alert('expanded'); });
481 // object.trigger('expand');
482 //
483 var Events = {
484
485 // Bind an event to a `callback` function. Passing `"all"` will bind
486 // the callback to all events fired.
487 on: function (name, callback, context) {
488 if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;
489 this._events = this._events || {};
490 var events = this._events[name] || (this._events[name] = []);
491 events.push({callback: callback, context: context, ctx: context || this});
492 return this;
493 },
494
495 // Bind an event to only be triggered a single time. After the first time
496 // the callback is invoked, it will be removed.
497 once: function (name, callback, context) {
498 if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this;
499 var self = this;
500 var onced = once(function () {
501 self.off(name, onced);
502 callback.apply(this, arguments);
503 });
504 onced._callback = callback;
505 return this.on(name, onced, context);
506 },
507
508 // Remove one or many callbacks. If `context` is null, removes all
509 // callbacks with that function. If `callback` is null, removes all
510 // callbacks for the event. If `name` is null, removes all bound
511 // callbacks for all events.
512 off: function (name, callback, context) {
513 var retain, ev, events, names, i, l, j, k;
514 if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this;
515 if (!name && !callback && !context) {
516 this._events = {};
517 return this;
518 }
519
520 names = name ? [name] : keys(this._events);
521 for (i = 0, l = names.length; i < l; i++) {
522 name = names[i];
523 if (events = this._events[name]) {
524 this._events[name] = retain = [];
525 if (callback || context) {
526 for (j = 0, k = events.length; j < k; j++) {
527 ev = events[j];
528 if ((callback && callback !== ev.callback && callback !== ev.callback._callback) ||
529 (context && context !== ev.context)) {
530 retain.push(ev);
531 }
532 }
533 }
534 if (!retain.length) delete this._events[name];
535 }
536 }
537
538 return this;
539 },
540
541 // Trigger one or many events, firing all bound callbacks. Callbacks are
542 // passed the same arguments as `trigger` is, apart from the event name
543 // (unless you're listening on `"all"`, which will cause your callback to
544 // receive the true name of the event as the first argument).
545 trigger: function (name) {
546 if (!this._events) return this;
547 var args = slice.call(arguments, 1);
548 if (!eventsApi(this, 'trigger', name, args)) return this;
549 var events = this._events[name];
550 var allEvents = this._events.all;
551 if (events) triggerEvents(events, args);
552 if (allEvents) triggerEvents(allEvents, arguments);
553 return this;
554 },
555
556 // Tell this object to stop listening to either specific events ... or
557 // to every object it's currently listening to.
558 stopListening: function (obj, name, callback) {
559 var listeners = this._listeners;
560 if (!listeners) return this;
561 var deleteListener = !name && !callback;
562 if (typeof name === 'object') callback = this;
563 if (obj) (listeners = {})[obj._listenerId] = obj;
564 for (var id in listeners) {
565 listeners[id].off(name, callback, this);
566 if (deleteListener) delete this._listeners[id];
567 }
568 return this;
569 }
570
571 };
572
573 // Regular expression used to split event strings.
574 var eventSplitter = /\s+/;
575
576 // Implement fancy features of the Events API such as multiple event
577 // names `"change blur"` and jQuery-style event maps `{change: action}`
578 // in terms of the existing API.
579 var eventsApi = function (obj, action, name, rest) {
580 if (!name) return true;
581
582 // Handle event maps.
583 if (typeof name === 'object') {
584 for (var key in name) {
585 obj[action].apply(obj, [key, name[key]].concat(rest));
586 }
587 return false;
588 }
589
590 // Handle space separated event names.
591 if (eventSplitter.test(name)) {
592 var names = name.split(eventSplitter);
593 for (var i = 0, l = names.length; i < l; i++) {
594 obj[action].apply(obj, [names[i]].concat(rest));
595 }
596 return false;
597 }
598
599 return true;
600 };
601
602 // A difficult-to-believe, but optimized internal dispatch function for
603 // triggering events. Tries to keep the usual cases speedy (most internal
604 // Backbone events have 3 arguments).
605 var triggerEvents = function (events, args) {
606 var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];
607 switch (args.length) {
608 case 0:
609 while (++i < l) {
610 (ev = events[i]).callback.call(ev.ctx);
611 }
612 return;
613 case 1:
614 while (++i < l) {
615 (ev = events[i]).callback.call(ev.ctx, a1);
616 }
617 return;
618 case 2:
619 while (++i < l) {
620 (ev = events[i]).callback.call(ev.ctx, a1, a2);
621 }
622 return;
623 case 3:
624 while (++i < l) {
625 (ev = events[i]).callback.call(ev.ctx, a1, a2, a3);
626 }
627 return;
628 default:
629 while (++i < l) {
630 (ev = events[i]).callback.apply(ev.ctx, args);
631 }
632 }
633 };
634
635 var listenMethods = {listenTo: 'on', listenToOnce: 'once'};
636
637 // Inversion-of-control versions of `on` and `once`. Tell *this* object to
638 // listen to an event in another object ... keeping track of what it's
639 // listening to.
640 DISQUS.each(listenMethods, function (implementation, method) {
641 Events[method] = function (obj, name, callback) {
642 var listeners = this._listeners || (this._listeners = {});
643 var id = obj._listenerId || (obj._listenerId = DISQUS.getUid('l'));
644 listeners[id] = obj;
645 if (typeof name === 'object') callback = this;
646 obj[implementation](name, callback, this);
647 return this;
648 };
649 });
650
651 // Aliases for backwards compatibility.
652 Events.bind = Events.on;
653 Events.unbind = Events.off;
654
655 return Events;
656});
657 // used for /follow/ /login/ /signup/ social oauth dialogs
658// faking the bus
659DISQUS.use('Bus');
660_.extend(DISQUS.Bus, DISQUS.Events);
661</script>
662
663
664
665
666
667
668 <script src="//a.disquscdn.com/1587400073/js/src/global.js" charset="utf-8"></script>
669 <script type="text/javascript">
670 if (window.AB_TESTS === undefined) {
671 var AB_TESTS = {};
672 }
673</script>
674<script type="text/javascript" charset="utf-8">
675 // Global tests
676 $(document).ready(function() {
677 $('a[rel*=facebox]').facebox();
678 });
679</script>
680
681 <script type="text/x-underscore-template" data-template-name="global-nav">
682
683<% var has_custom_avatar = data.avatar_url && data.avatar_url.indexOf('noavatar') < 0; %>
684<% var has_custom_username = data.username && data.username.indexOf('disqus_') < 0; %>
685<% if (data.username) { %>
686 <% if (data.has_forums) { %>
687 <li class="admin<% if (has_custom_avatar || !has_custom_username) { %> avatar-menu-admin<% } %>" data-analytics="header admin"><a href="<%= data.urlMap.admin %>"><strong>Admin</strong></a></li>
688 <% } %>
689 <li class="user-dropdown dropdown-toggle<% if (has_custom_avatar || !has_custom_username) { %> avatar-menu<% } else { %> username-menu<% } %>" data-analytics="header username dropdown" data-floater-marker="<% if (has_custom_avatar || !has_custom_username) { %>square<% } %>">
690 <a href="<%= data.urlMap.home %>/<%= data.username %>/">
691 <% if (has_custom_avatar) { %>
692 <img src="<%= data.avatar_url %>" class="avatar">
693 <% } else if (has_custom_username) { %>
694 <%= data.username %>
695 <% } else { %>
696 <img src="<%= data.avatar_url %>" class="avatar">
697 <% } %>
698 <span class="caret"></span>
699 </a>
700 <ul class="clearfix dropdown">
701 <li data-analytics="header view profile"><a href="<%= data.urlMap.home %>/<%= data.username %>/">View Profile</a></li>
702 <li class="js-edit-profile" data-analytics="header edit profile"><a href="<%= data.urlMap.home_settings_profile %>">Edit Profile</a></li>
703 <li class="logout" data-analytics="header logout"><a href="<%= data.urlMap.logout %>">Logout</a></li>
704 </ul>
705 </li>
706<% } else { %>
707 <li class="link-login" data-analytics="header login"><a href="<%= data.urlMap.login %>?next=<%= encodeURIComponent(document.location.href) %>">Log in</a></li>
708<% } %>
709
710
711</script>
712
713 <!--[if lte IE 7]>
714 <script src="//a.disquscdn.com/1587400073/js/src/border_box_model.js"></script>
715<![endif]-->
716<!--[if lte IE 8]>
717 <script src="//cdnjs.cloudflare.com/ajax/libs/modernizr/2.5.3/modernizr.min.js"></script>
718 <script src="//a.disquscdn.com/1587400073/js/src/selectivizr.js"></script>
719<![endif]-->
720
721
722
723
724
725
726
727 <script type="text/javascript" charset="utf-8">
728 // Global tests
729 $(document).ready(function() {
730 $('a[rel*=facebox]').facebox();
731 });
732 </script>
733
734
735
736</head>
737<body class="" id="">
738
739
740 <header class="global-header">
741 <nav class="global-nav">
742
743 <a href="/" class="logo" data-analytics="site logo"><img src="//a.disquscdn.com/1587400073/img/disqus-logo-alt-hidpi.png" width="102" height="20" alt="Disqus" title="Disqus - Discover your community"/></a>
744
745
746 <ul class="nav pills" style="position: relative;">
747 <script type="text/x-underscore-template" class="js-inline-template">
748
749 <%= template.loadById('global-nav') %>
750
751 </script>
752 <noscript>
753 <li data-analytics="header for websites"><a href="http://disqus.com/websites/">Features</a></li>
754 <li class="link-login" data-analytics="header login"><a href="https://disqus.com/profile/login/">Log in</a></li>
755 </noscript>
756 </ul>
757
758 </nav>
759 </header>
760
761
762
763<div id="content">
764 <div class="container">
765 <div class="box">
766 <div class="main">
767 <h3>You do not have sufficient privileges.</h3>
768 <p>You cannot access this page because you do not have sufficient privileges.</p>
769 <ul class="site-map">
770 <li>
771
772 <a href="https://disqus.com/">Return to your Disqus Home</a>.
773
774 </li>
775 <li>Need some help? <a href="https://disqus.com/help/">Visit the help page</a>.</li>
776 </ul>
777 </div>
778 </div>
779 </div>
780</div>
781
782
783 <footer class="global-footer">
784 <nav class="footer-nav">
785 <ul>
786 <li data-analytics="footer for websties"><a href="http://disqus.com/features/">Features</a></li>
787 <li data-analytics="footer about"><a href="http://disqus.com/about/">How Disqus Works</a></li>
788 <li data-analytics="footer brand"><a href="http://disqus.com/pages/style-guide/">Logos</a></li>
789 <li data-analytics="footer docs"><a href="https://help.disqus.com">Help</a></li>
790 <li data-analytics="footer blog"><a href="http://blog.disqus.com">Blog</a></li>
791 <li data-analytics="footer api"><a href="https://disqus.com/api/docs/">API</a></li>
792 <li data-analytics="footer data"><a href="https://data.disqus.com/">Data Services</a></li>
793 <li data-analytics="footer jobs"><a href="https://disqus.com/jobs/">Jobs</a></li>
794 <li data-analytics="footer terms"><a href="https://docs.disqus.com/kb/terms-and-policies/">Terms & Policies</a></li>
795 </ul>
796 <span class="copyright">© 2020 · <a href="/"class="disqus">Disqus</a></span>
797 </nav>
798</footer>
799
800
801
802
803
804
805
806
807 <script>
808 (function (){
809 // adds a classname for css to target the current page without passing in special things from the server or wherever
810 // replacing all characters not allowable in classnames
811 var newLocation = encodeURIComponent(window.location.pathname).replace(/[\.!~*'\(\)]/g, '_');
812 // cleaning up remaining url-encoded symbols for clarity sake
813 newLocation = newLocation.replace(/%2F/g, '-').replace(/^-/, '').replace(/-$/, '');
814 if (newLocation === '') {
815 newLocation = 'homepage';
816 }
817 $('body').addClass('' + newLocation);
818 }());
819
820 $(function ($) {
821 // adds 'page-active' class to links matching the page url
822 $('a[href="' + window.location.pathname + '"]').addClass('page-active');
823 });
824
825 $(document).delegate('[data-toggle-selector]', 'click', function (e) {
826 var $this = $(this);
827 $($this.attr('data-toggle-selector')).toggle();
828 e.preventDefault();
829 });
830 </script>
831
832
833
834 <!-- helper jQuery tmpl partials -->
835 <script type="text/x-jquery-tmpl" id="profile-metadata-tmpl">
836
837 data-profile-username="${username}" data-profile-hash="${emailHash}" href="/${username}"
838
839 </script>
840 <script type="text/x-jquery-tmpl" id="profile-link-tmpl">
841
842 <a class="profile-launcher" {{tmpl "#profile-metadata-tmpl"}} href="/${username}">${name}</a>
843
844 </script>
845
846 <script src="//a.disquscdn.com/1587400073/js/src/templates.js"></script>
847
848
849 <script src="//a.disquscdn.com/1587400073/js/src/modals.js"></script>
850<script>
851 DISQUS.ui.config({
852 disqusUrl: 'https://disqus.com',
853 mediaUrl: '//a.disquscdn.com/1587400073/'
854 });
855</script>
856
857</body>
858</html>