Help
RSS
API
Feed
Maltego
Contact
Domain > www.doorhardware.co.uk
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2016-06-23
66.7.149.108
(
ClassC
)
2026-01-24
40.114.51.68
(
ClassC
)
Port 443
HTTP/1.1 200 OKContent-Length: 186790Content-Type: text/html; charsetutf-8Date: Sat, 24 Jan 2026 17:52:46 GMTServer: Microsoft-IIS/10.0Access-Control-Allow-Origin: *Cache-Control: no-cache, no-storeExpires: -1Pragma: no-cacheSet-Cookie: ASP.NET_SessionIdewf0j1f3araydez3gmthr23w; path/; HttpOnly; SameSiteLaxSet-Cookie: ASP.NET_SessionIdewf0j1f3araydez3gmthr23w; path/; HttpOnly; SameSiteLaxSet-Cookie: __RequestVerificationTokend6_U4sP6tngDxACcM_qQlpl_vOdtawbRLy20NG_h2Q5gWJG7keZW43oRtLbC7YfN1d3aMNrAWu8IyGKOhfWvUerKQGzOV0g1OCdoQ7wSS4w1; path/; HttpOnlySet-Cookie: DH_CartID6dc61ac3-89b5-4bfc-bf20-637bd1d4b5c7; path/Set-Cookie: ARRAffinity4a6eac7cd7a126800c82af8e21ebe170fc49af859faad57f486e6414349691bc;Path/;HttpOnly;Secure;Domainwww.doorhardware.co.ukSet-Cookie: ARRAffinitySameSite4a6eac7cd7a126800c82af8e21ebe170fc49af859faad57f486e6414349691bc;Path/;HttpOnly;SameSiteNone;Secure;Domainwww.doorhardware.co.ukX-AspNetMvc-Version: 5.2X-Frame-Options: SAMEORIGINX-AspNet-Version: 4.0.30319X-Powered-By: ASP.NET !DOCTYPE html>html langen>head> meta charsetutf-8> meta nameviewport contentwidthdevice-width, initial-scale1, shrink-to-fitno> link relcanonical hrefhttps://www.doorhardware.co.uk/ /> title>Premium Door & Cabinet Hardware | UK Supplier | DoorHardware/title> meta namedescription contentDiscover premium solid brass door and cabinet hardware in multiple finishes. Trusted by designers and homeowners. Fast UK delivery. Shop quality you can feel. /> meta namekeywords contentdoor hardware, hardware for doors, door hardware store, door hardware shop, door hardware uk, door hardware online, buy door hardware, buy door hardware now, decorative door hardware, door hardware center, door pull handles, door pull, flush pull handles, door knobs, cabinet pull handles, cabinet knobs, drawer cup pulls, door furniture /> !-- OG Tags --> meta nametwitter:card contentsummary /> meta nametwitter:card contentsummary_large_image /> meta propertyog:image itempropimage contenthttps://www.doorhardware.co.uk/images/pic-hm-intro.jpg /> meta propertyog:url contenthttps://www.doorhardware.co.uk/> meta propertyog:title contentPremium Door & Cabinet Hardware | UK Supplier | DoorHardware /> meta propertyog:description contentThe best door hardware store in the United Kingdom, offering top-quality decorative door hardware products for homes, shops or offices! Buy online now! /> meta propertytwitter:card contentPremium Door & Cabinet Hardware | UK Supplier | DoorHardware /> meta propertytwitter:title contentPremium Door & Cabinet Hardware | UK Supplier | DoorHardware /> meta propertytwitter:description contentThe best door hardware store in the United Kingdom, offering top-quality decorative door hardware products for homes, shops or offices! Buy online now! /> meta propertytwitter:image contenthttps://www.doorhardware.co.uk/images/pic-hm-intro.jpg /> !-- OG Tags --> link relshortcut icon typeimage/x-icon href/favicon.ico /> link href/Content/bootstrap.min.css relstylesheet /> link href/Content/main.min.css?v3 relstylesheet /> link href/Content/ds.css?v5 relstylesheet /> noscript iddeferred-styles> link href/Content/jquery.fancybox.min.css relstylesheet /> link relpreconnect hrefhttps://fonts.googleapis.com> link relpreconnect hrefhttps://fonts.gstatic.com crossorigin> link hrefhttps://fonts.googleapis.com/css2?familyRoboto:ital,wght@0,400;0,500;1,400;1,500&displayswap relstylesheet> /noscript> script> var loadDeferredStyles function () { var addStylesNode document.getElementById(deferred-styles); var replacement document.createElement(div); replacement.innerHTML addStylesNode.textContent; document.body.appendChild(replacement) addStylesNode.parentElement.removeChild(addStylesNode); }; var raf requestAnimationFrame || mozRequestAnimationFrame || webkitRequestAnimationFrame || msRequestAnimationFrame; if (raf) raf(function () { window.setTimeout(loadDeferredStyles, 0); }); else window.addEventListener(load, loadDeferredStyles); /script> !-- jquery --> script> /*! jQuery v3.2.1 | (c) JS Foundation and other contributors | 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.2.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 ? thisa + this.length : thisa }, 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 ? thisc : ) }, 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 arguments0 || {}, h 1, i arguments.length, j !1; for (boolean typeof g && (j g, g argumentsh || {}, h++), object typeof g || r.isFunction(g) || (g {}), h i && (g this, h--); h i; h++)if (null ! (a argumentsh)) for (b in a) c gb, d ab, g ! d && (j && d && (r.isPlainObject(d) || (e Array.isArray(d))) ? (e ? (e !1, f c && Array.isArray(c) ? c : ) : f c && r.isPlainObject(c) ? c : {}, gb r.extend(j, f, d)) : void 0 ! d && (gb 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) }, 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 ? jk.call(a) || object : typeof a }, globalEval: function (a) { p(a) }, camelCase: function (a) { return a.replace(t, ms-).replace(u, v) }, each: function (a, b) { var c, d 0; if (w(a)) { for (c a.length; d c; d++)if (b.call(ad, d, ad) !1) break } else for (d in a) if (b.call(ad, d, ad) !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++)ae++ bd; 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(af, f), d ! h && e.push(af); 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(af, f, c), null ! e && h.push(e); else for (f in a) e b(af, 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 ab, 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.fnSymbol.iterator cSymbol.iterator), r.each(Boolean Number String Function Array Date RegExp Object Error Symbol.split( ), function (a, b) { jobject + 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 (ac 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), Dv.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 (ac++ bd++); 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 l1) { 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 (l2) return G.apply(d, b.getElementsByTagName(a)), d; if ((f l3) && c.getElementsByClassName && b.getElementsByClassName) return G.apply(d, b.getElementsByClassName(f)), d } if (c.qsa && !Aa + && (!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--) oh # + k + + sa(oh); 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 ba.shift(), bc + e } return b } function ia(a) { return au !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.attrHandlece 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--) ce fg && (ce !(de ce)) }) }) } 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 ed++) 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 fe++) 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 disableddisabled>/a>select disableddisabled>option/>/select>; var b n.createElement(input); b.setAttribute(type, hidden), a.appendChild(b).setAttribute(name, D), a.querySelectorAll(named).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 (gd hd) d++; return d ? la(gd, hd) : gd v ? -1 : hd 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 && !Ab + && (!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.attrHandleb.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 af++) b af && (e d.push(f)); while (e--) a.splice(de, 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 ad++) 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 a1 a1.replace(_, aa), a3 (a3 || a4 || a5 || ).replace(_, aa), ~ a2 && (a3 + a3 + ), a.slice(0, 4) }, CHILD: function (a) { return a1 a1.toLowerCase(), nth a1.slice(0, 3) ? (a3 || ga.error(a0), a4 +(a4 ? a5 + (a6 || 1) : 2 * (even a3 || odd a3)), a5 +(a7 + a8 || odd a3)) : a3 && ga.error(a0), a }, PSEUDO: function (a) { var b, c !a6 && a2; return V.CHILD.test(a0) ? null : (a3 ? a2 a4 || a5 || : c && T.test(c) && (b g(c, !0)) && (b c.indexOf(), c.length - b) - c.length) && (a0 a0.slice(0, b), a2 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 ya + ; 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 mp) 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 mu || (mu {}), k lm.uniqueID || (lm.uniqueID {}), j ka || , n j0 w && j1, t n && j2, m n && q.childNodesn; while (m ++n && m && mp || (t n 0) || o.pop()) if (1 m.nodeType && ++t && m b) { ka w, n, t; break } } else if (s && (m b, l mu || (mu {}), k lm.uniqueID || (lm.uniqueID {}), j ka || , n j0 w && j1, t n), t !1) while (m ++n && m && mp || (t n 0) || o.pop()) if ((h ? m.nodeName.toLowerCase() r : 1 m.nodeType) && ++t && (s && (l mu || (mu {}), k lm.uniqueID || (lm.uniqueID {}), ka w, t), m b)) break; return t - e, t d || t % d 0 && t / d > 0 } } }, PSEUDO: function (a, b) { var c, e d.pseudosa || d.setFiltersa.toLowerCase() || ga.error(unsupported pseudo: + a); return eu ? 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, fg), ad !(cd fg) }) : function (a) { return e(a, 0, c) }) : e } }, pseudos: { not: ia(function (a) { var b , c , d h(a.replace(P, $1)); return du ? ia(function (a, b, c, e) { var f, g d(a, null, e, ), h a.length; while (h--) (f gh) && (ah !(bh f)) }) : function (a, e, f) { return b0 a, d(b, null, f, c), b0 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.pseudosb ma(b); for (b in { submit: !0, reset: !0 }) d.pseudosb 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 za + ; 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(e0.length) || h), i.push(f )), c !1, (e R.exec(h)) && (c e.shift(), f.push({ value: c, type: e0.replace(P, ) }), h h.slice(c.length)); for (g in d.filter) !(e Vg.exec(h)) || jg && !(e jg(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 + ab.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 bd) 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 bd) if ((1 b.nodeType || g) && a(b, c, i)) return !0 } else while (b bd) if (1 b.nodeType || g) if (l bu || (bu {}), k lb.uniqueID || (lb.uniqueID {}), e && e b.nodeName.toLowerCase()) b bd || b; else { if ((j kf) && j0 w && j1 h) return m2 j2; if (kf m, m2 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 (!ae(b, c, d)) return !1; return !0 } : a0 } function va(a, b, c) { for (var d 0, e b.length; d e; d++)ga(a, bd, 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 ah) && (c && !c(f, d, e) || (g.push(f), j && b.push(h))); return g } function xa(a, b, c, d, e, f) { return d && !du && (d xa(d)), e && !eu && (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 jk) && (rnk !(qnk l)) } if (f) { if (e || a) { if (e) { j , k r.length; while (k--) (l rk) && j.push(qk l); e(null, r , j, i) } k r.length; while (k--) (l rk) && (j e ? I(f, l) : mk) > -1 && (fj !(gj 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.relativea0.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.relativeai.type) m ta(ua(m), c); else { if (c d.filterai.type.apply(null, ai.matches), cu) { for (e ++i; e f; e++)if (d.relativeae.type) break; return xa(i > 1 && ua(m), i > 1 && sa(a.slice(0, i - 1).concat({ value: ai - 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 xs); s++) { if (e && l) { o 0, g || l.ownerDocument n || (m(l), h !p); while (q ao++) 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 bo++) q(t, u, g, h); if (f) { if (r > 0) while (s--) ts || us || (us 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 Aa + ; if (!f) { b || (b g(a)), c b.length; while (c--) f ya(bc), fu ? 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 n0 n0.slice(0), i.length > 2 && ID (j i0).type && 9 b.nodeType && p && d.relativei1.type) { if (b (d.find.ID(j.matches0.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 if, d.relativek j.type) break; if ((l d.findk) && (e l(j.matches0.replace(_, aa), $.test(i0.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 ab !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 ab) && 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; function B(a, b) { return a.nodeName && a.nodeName.toLowerCase() b.toLowerCase() } var C /^(a-z^\/\0>:\x20\t\r\n\f*)\x20\t\r\n\f*\/?>(?:\/\1>|)$/i, D /^.^:#\\.,*$/; function E(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 }) : D.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 b0; 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(eb, this)) return !0 })); for (c this.pushStack(), b 0; b d; b++)r.find(a, eb, c); return d > 1 ? r.uniqueSort(c) : c }, filter: function (a) { return this.pushStack(E(this, a || , !1)) }, not: function (a) { return this.pushStack(E(this, a || , !0)) }, is: function (a) { return !!E(this, string typeof a && A.test(a) ? r(a) : a || , !1).length } }); var F, G /^(?:\s*(\w\W+>)^>*|#(\w-+))$/, H r.fn.init function (a, b, c) { var e, f; if (!a) return this; if (c c || F, string typeof a) { if (e a0 && > aa.length - 1 && a.length > 3 ? null, a, null : G.exec(a), !e || !e1 && b) return !b || b.jquery ? (b || c).find(a) : this.constructor(b).find(a); if (e1) { if (b b instanceof r ? b0 : b, r.merge(this, r.parseHTML(e1, b && b.nodeType ? b.ownerDocument || b : d, !0)), C.test(e1) && r.isPlainObject(b)) for (e in b) r.isFunction(thise) ? thise(be) : this.attr(e, be); return this } return f d.getElementById(e2), f && (this0 f, this.length 1), this } return a.nodeType ? (this0 a, this.length 1, this) : r.isFunction(a) ? void 0 ! c.ready ? c.ready(a) : a(r) : r.makeArray(a, this) }; H.prototype r.fn, F r(d); var I /^(?:parents|prev(?:Until|All))/, J { 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, ba)) 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 thisd; 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), this0) : i.call(this, a.jquery ? a0 : a) : this0 && this0.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 K(a, b) { while ((a ab) && 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 K(a, nextSibling) }, prev: function (a) { return K(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 B(a, iframe) ? a.contentDocument : (B(a, template) && (a a.content || a), r.merge(, a.childNodes)) } }, function (a, b) { r.fna 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 && (Ja || r.uniqueSort(e), I.test(a) && e.reverse()), this.pushStack(e) } }); var L /^\x20\t\r\n\f+/g; function M(a) { var b {}; return r.each(a.match(L) || , function (a, c) { bc !0 }), b } r.Callbacks function (a) { a string typeof a ? M(a) : r.extend({}, a); var b, c, d, e, f , g , h -1, i function () { for (e e || a.once, d b !0; g.length; h -1) { c g.shift(); while (++h f.length) fh.apply(c0, c1) !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 N(a) { return a } function O(a) { throw a } function P(a, b, c, d) { var e; try { a && r.isFunction(e a.promise) ? e.call(a).done(b).fail(c) : a && r.isFunction(e a.then) ? e.call(a, b, c) : b.apply(void 0, a.slice(d)) } catch (a) { c.apply(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(ad4) && ad4; fd1(function () { var a e && e.apply(this, arguments); a && r.isFunction(a.promise) ? a.promise().progress(b.notify).done(b.resolve).fail(b.reject) : bd0 + 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, N, e), g(f, c, O, e)) : (f++ , j.call(a, g(f, c, N, e), g(f, c, O, e), g(f, c, N, c.notifyWith))) : (d ! N && (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 ! O && (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) { c03.add(g(0, a, r.isFunction(e) ? e : N, a.notifyWith)), c13.add(g(0, a, r.isFunction(b) ? b : N)), c23.add(g(0, a, r.isFunction(d) ? d : O)) }).promise() }, promise: function (a) { return null ! a ? r.extend(a, e) : e } }, f {}; return r.each(c, function (a, b) { var g b2, h b5; eb1 g.add, h && g.add(function () { d h }, c3 - a2.disable, c02.lock), g.add(b3.fire), fb0 function () { return fb0 + With(this f ? void 0 : this, arguments), this }, fb0 + 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) { da this, ea arguments.length > 1 ? f.call(arguments) : c, --b || g.resolveWith(d, e) } }; if (b 1 && (P(a, g.done(h(c)).resolve, g.reject, !b), pending g.state() || r.isFunction(ec && ec.then))) return g.then(); while (c--) P(ec, h(c), g.reject); return g.promise() } }); var Q /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; r.Deferred.exceptionHook function (b, c) { a.console && a.console.warn && b && Q.test(b.name) && a.console.warn(jQuery.Deferred exception: + b.message, b.stack, c) }, r.readyException function (b) { a.setTimeout(function () { throw b }) }; var R r.Deferred(); r.fn.ready function (a) { return R.then(a)catch(function (a) { r.readyException(a) }), this }, r.extend({ isReady: !1, readyWait: 1, ready: function (a) { (a !0 ? --r.readyWait : r.isReady) || (r.isReady !0, a ! !0 && --r.readyWait > 0 || R.resolveWith(d, r)) } }), r.ready.then R.then; function S() { d.removeEventListener(DOMContentLoaded, S), a.removeEventListener(load, S), r.ready() } complete d.readyState || loading ! d.readyState && !d.documentElement.doScroll ? a.setTimeout(r.ready) : (d.addEventListener(DOMContentLoaded, S), a.addEventListener(load, S)); var T 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) T(a, b, h, ch, !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(ah, c, g ? d : d.call(ah, h, b(ah, c))); return e ? a : j ? b.call(a) : i ? b(a0, c) : f }, U function (a) { return 1 a.nodeType || 9 a.nodeType || !+a.nodeType }; function V() { this.expando r.expando + V.uid++ } V.uid 1, V.prototype { cache: function (a) { var b athis.expando; return b || (b {}, U(a) && (a.nodeType ? athis.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) er.camelCase(b) c; else for (d in b) er.camelCase(d) bd; return e }, get: function (a, b) { return void 0 b ? this.cache(a) : athis.expando && athis.expandor.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 athis.expando; if (void 0 ! d) { if (void 0 ! b) { Array.isArray(b) ? b b.map(r.camelCase) : (b r.camelCase(b), b b in d ? b : b.match(L) || ), c b.length; while (c--) delete dbc } (void 0 b || r.isEmptyObject(d)) && (a.nodeType ? athis.expando void 0 : delete athis.expando) } }, hasData: function (a) { var b athis.expando; return void 0 ! b && !r.isEmptyObject(b) } }; var W new V, X new V, Y /^(?:\{\w\W*\}|\\w\W*\)$/, Z /A-Z/g; function $(a) { return true a || false ! a && (null a ? null : a +a + ? +a : Y.test(a) ? JSON.parse(a) : a) } function _(a, b, c) { var d; if (void 0 c && 1 a.nodeType) if (d data- + b.replace(Z, -$&).toLowerCase(), c a.getAttribute(d), string typeof c) { try { c $(c) } catch (e) { } X.set(a, b, c) } else c void 0; return c } r.extend({ hasData: function (a) { return X.hasData(a) || W.hasData(a) }, data: function (a, b, c) { return X.access(a, b, c) }, removeData: function (a, b) { X.remove(a, b) }, _data: function (a, b, c) { return W.access(a, b, c) }, _removeData: function (a, b) { W.remove(a, b) } }), r.fn.extend({ data: function (a, b) { var c, d, e, f this0, g f && f.attributes; if (void 0 a) { if (this.length && (e X.get(f), 1 f.nodeType && !W.get(f, hasDataAttrs))) { c g.length; while (c--) gc && (d gc.name, 0 d.indexOf(data-) && (d r.camelCase(d.slice(5)), _(f, d, ed))); W.set(f, hasDataAttrs, !0) } return e } return object typeof a ? this.each(function () { X.set(this, a) }) : T(this, function (b) { var c; if (f && void 0 b) { if (c X.get(f, a), void 0 ! c) return c; if (c _(f, a), void 0 ! c) return c } else this.each(function () { X.set(this, a, b) }) }, null, b, arguments.length > 1, null, !0) }, removeData: function (a) { return this.each(function () { X.remove(this, a) }) } }), r.extend({ queue: function (a, b, c) { var d; if (a) return b (b || fx) + queue, d W.get(a, b), c && (!d || Array.isArray(c) ? d W.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 W.get(a, c) || W.access(a, c, { empty: r.Callbacks(once memory).add(function () { W.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(this0, a) : void 0 b ? this : this.each(function () { var c r.queue(this, a, b); r._queueHooks(this, a), fx a && inprogress ! c0 && 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 W.get(fg, a + queueHooks), c && c.empty && (d++ , c.empty.add(h)); return h(), e.promise(b) } }); var aa /+-?(?:\d*\.|)\d+(?:eE+-?\d+|)/.source, ba new RegExp(^(?:(+-)|)( + aa + )(a-z%*)$, i), ca Top, Right, Bottom, Left, da function (a, b) { return a b || a, none a.style.display || a.style.display && r.contains(a.ownerDocument, a) && none r.css(a, display) }, ea function (a, b, c, d) { var e, f, g {}; for (f in b) gf a.stylef, a.stylef bf; e c.apply(a, d || ); for (f in b) a.stylef gf; return e }; function fa(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 && c3 || (r.cssNumberb ? : px), k (r.cssNumberb || px ! j && +i) && ba.exec(r.css(a, b)); if (k && k3 ! j) { j j || k3, 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 c1 ? k + (c1 + 1) * c2 : +c2, d && (d.unit j, d.start k, d.end e)), e } var ga {}; function ha(a) { var b, c a.ownerDocument, d a.nodeName, e gad; return e ? e : (b c.body.appendChild(c.createElement(d)), e r.css(b, display), b.parentNode.removeChild(b), none e && (e block), gad e, e) } function ia(a, b) { for (var c, d, e , f 0, g a.length; f g; f++)d af, d.style && (c d.style.display, b ? (none c && (ef W.get(d, display) || null, ef || (d.style.display )), d.style.display && da(d) && (ef ha(d))) : none ! c && (ef none, W.set(d, display, c))); for (f 0; f g; f++)null ! ef && (af.style.display ef); return a } r.fn.extend({ show: function () { return ia(this, !0) }, hide: function () { return ia(this) }, toggle: function (a) { return boolean typeof a ? a ? this.show() : this.hide() : this.each(function () { da(this) ? r(this).show() : r(this).hide() }) } }); var ja /^(?:checkbox|radio)$/i, ka /(a-z^\/\0>\x20\t\r\n\f+)/i, la /^$|\/(?:java|ecma)script/i, ma { option: 1, select multiplemultiple>, /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, , }; ma.optgroup ma.option, ma.tbody ma.tfoot ma.colgroup ma.caption ma.thead, ma.th ma.td; function na(a, b) { var c; return c undefined ! typeof a.getElementsByTagName ? a.getElementsByTagName(b || *) : undefined ! typeof a.querySelectorAll ? a.querySelectorAll(b || *) : , void 0 b || b && B(a, b) ? r.merge(a, c) : c } function oa(a, b) { for (var c 0, d a.length; c d; c++)W.set(ac, globalEval, !b || W.get(bc, globalEval)) } var pa /|?\w+;/; function qa(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 an, f || 0 f) if (object r.type(f)) r.merge(m, f.nodeType ? f : f); else if (pa.test(f)) { g g || l.appendChild(b.createElement(div)), h (ka.exec(f) || , )1.toLowerCase(), i mah || ma._default, g.innerHTML i1 + r.htmlPrefilter(f) + i2, k i0; 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 mn++) if (d && r.inArray(f, d) > -1) e && e.push(f); else if (j r.contains(f.ownerDocument, f), g na(l.appendChild(f), script), j && oa(g), c) { k 0; while (f gk++) la.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 ra d.documentElement, sa /^key/, ta /^(?:mouse|pointer|contextmenu|drag|drop)|click/, ua /^(^.*)(?:\.(.+)|)/; function va() { return !0 } function wa() { return !1 } function xa() { try { return d.activeElement } catch (a) { } } function ya(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) ya(a, h, c, d, bh, 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 wa; 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 W.get(a); if (q) { c.handler && (f c, c f.handler, e f.selector), e && r.find.matchesSelector(ra, 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(L) || , j b.length; while (j--) h ua.exec(bj) || , n p h1, o (h2 || ).split(.).sort(), n && (l r.event.specialn || {}, n (e ? l.delegateType : l.bindType) || n, l r.event.specialn || {}, 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 in) || (m in , 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.globaln !0) } }, remove: function (a, b, c, d, e) { var f, g, h, i, j, k, l, m, n, o, p, q W.hasData(a) && W.get(a); if (q && (i q.events)) { b (b || ).match(L) || , j b.length; while (j--) if (h ua.exec(bj) || , n p h1, o (h2 || ).split(.).sort(), n) { l r.event.specialn || {}, n (d ? l.delegateType : l.bindType) || n, m in || , h h2 && new RegExp((^|\\.) + o.join(\\.(?:.*\\.|)) + (\\.|$)), g f m.length; while (f--) k mf, !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 in) } else for (n in i) r.event.remove(a, n + bj, c, d, !0); r.isEmptyObject(i) && W.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 (W.get(this, events) || {})b.type || , k r.event.specialb.type || {}; for (i0 b, c 1; c arguments.length; c++)ic argumentsc; if (b.delegateTarget this, !k.preDispatch || k.preDispatch.call(this, b) ! !1) { h r.event.handlers.call(this, b, j), c 0; while ((f hc++) && !b.isPropagationStopped()) { b.currentTarget f.elem, d 0; while ((g f.handlersd++) && !b.isImmediatePropagationStopped()) b.rnamespace && !b.rnamespace.test(g.namespace) || (b.handleObj g, b.data g.data, e ((r.event.specialg.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 bc, e d.selector + , void 0 ge && (ge d.needsContext ? r(e, this).index(j) > -1 : r.find(e, this, null, j).length), ge && 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.originalEventa }, set: function (b) { Object.defineProperty(this, a, { enumerable: !0, configurable: !0, writable: !0, value: b }) } }) }, fix: function (a) { return ar.expando ? a : new r.Event(a) }, special: { load: { noBubble: !0 }, focus: { trigger: function () { if (this ! xa() && this.focus) return this.focus(), !1 }, delegateType: focusin }, blur: { trigger: function () { if (this xa() && this.blur) return this.blur(), !1 }, delegateType: focusout }, click: { trigger: function () { if (checkbox this.type && this.click && B(this, input)) return this.click(), !1 }, _default: function (a) { return B(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 ? va : wa, 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 (thisr.expando !0)) : new r.Event(a, b) }, r.Event.prototype { constructor: r.Event, isDefaultPrevented: wa, isPropagationStopped: wa, isImmediatePropagationStopped: wa, isSimulated: !1, preventDefault: function () { var a this.originalEvent; this.isDefaultPrevented va, a && !this.isSimulated && a.preventDefault() }, stopPropagation: function () { var a this.originalEvent; this.isPropagationStopped va, a && !this.isSimulated && a.stopPropagation() }, stopImmediatePropagation: function () { var a this.originalEvent; this.isImmediatePropagationStopped va, 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 && sa.test(a.type) ? null ! a.charCode ? a.charCode : a.keyCode : !a.which && void 0 ! b && ta.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.speciala { 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 ya(this, a, b, c, d) }, one: function (a, b, c, d) { return ya(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, ae); return this } return b ! !1 && function ! typeof b || (c b, b void 0), c !1 && (c wa), this.each(function () { r.event.remove(this, a, c, b) }) } }); var za /(?!area|br|col|embed|hr|img|input|link|meta|param)((a-z^\/\0>\x20\t\r\n\f*)^>*)\/>/gi, Aa /script|style|link/i, Ba /checked\s*(?:^|\s*.checked.)/i, Ca /^true\/(.*)/, Da /^\s*!(?:\CDATA\|--)|(?:\\|--)>\s*$/g; function Ea(a, b) { return B(a, table) && B(11 ! b.nodeType ? b : b.firstChild, tr) ? r(>tbody, a)0 || a : a } function Fa(a) { return a.type (null ! a.getAttribute(type)) + / + a.type, a } function Ga(a) { var b Ca.exec(a.type); return b ? a.type b1 : a.removeAttribute(type), a } function Ha(a, b) { var c, d, e, f, g, h, i, j; if (1 b.nodeType) { if (W.hasData(a) && (f W.access(a), g W.set(b, f), j f.events)) { delete g.handle, g.events {}; for (e in j) for (c 0, d je.length; c d; c++)r.event.add(b, e, jec) } X.hasData(a) && (h X.access(a), i r.extend({}, h), X.set(b, i)) } } function Ia(a, b) { var c b.nodeName.toLowerCase(); input c && ja.test(a.type) ? b.checked a.checked : input ! c && textarea ! c || (b.defaultValue a.defaultValue) } function Ja(a, b, c, d) { b g.apply(, b); var e, f, h, i, j, k, l 0, m a.length, n m - 1, q b0, s r.isFunction(q); if (s || m > 1 && string typeof q && !o.checkClone && Ba.test(q)) return a.each(function (e) { var f a.eq(e); s && (b0 q.call(this, e, f.html())), Ja(f, b, c, d) }); if (m && (e qa(b, a0.ownerDocument, !1, a, d), f e.firstChild, 1 e.childNodes.length && (e f), f || d)) { for (h r.map(na(e, script), Fa), i h.length; l m; l++)j e, l ! n && (j r.clone(j, !0, !0), i && r.merge(h, na(j, script))), c.call(al, j, l); if (i) for (k hh.length - 1.ownerDocument, r.map(h, Ga), l 0; l i; l++)j hl, la.test(j.type || ) && !W.access(j, globalEval) && r.contains(k, j) && (j.src ? r._evalUrl && r._evalUrl(j.src) : p(j.textContent.replace(Da, ), k)) } return a } function Ka(a, b, c) { for (var d, e b ? r.filter(b, a) : a, f 0; null ! (d ef); f++)c || 1 ! d.nodeType || r.cleanData(na(d)), d.parentNode && (c && r.contains(d.ownerDocument, d) && oa(na(d, script)), d.parentNode.removeChild(d)); return a } r.extend({ htmlPrefilter: function (a) { return a.replace(za, $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 na(h), f na(a), d 0, e f.length; d e; d++)Ia(fd, gd); if (b) if (c) for (f f || na(a), g g || na(h), d 0, e f.length; d e; d++)Ha(fd, gd); else Ha(a, h); return g na(h, script), g.length > 0 && oa(g, !i && na(a, script)), h }, cleanData: function (a) { for (var b, c, d, e r.event.special, f 0; void 0 ! (c af); f++)if (U(c)) { if (b cW.expando) { if (b.events) for (d in b.events) ed ? r.event.remove(c, d) : r.removeEvent(c, d, b.handle); cW.expando void 0 } cX.expando && (cX.expando void 0) } } }), r.fn.extend({ detach: function (a) { return Ka(this, a, !0) }, remove: function (a) { return Ka(this, a) }, text: function (a) { return T(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 Ja(this, arguments, function (a) { if (1 this.nodeType || 11 this.nodeType || 9 this.nodeType) { var b Ea(this, a); b.appendChild(a) } }) }, prepend: function () { return Ja(this, arguments, function (a) { if (1 this.nodeType || 11 this.nodeType || 9 this.nodeType) { var b Ea(this, a); b.insertBefore(a, b.firstChild) } }) }, before: function () { return Ja(this, arguments, function (a) { this.parentNode && this.parentNode.insertBefore(a, this) }) }, after: function () { return Ja(this, arguments, function (a) { this.parentNode && this.parentNode.insertBefore(a, this.nextSibling) }) }, empty: function () { for (var a, b 0; null ! (a thisb); b++)1 a.nodeType && (r.cleanData(na(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 T(this, function (a) { var b this0 || {}, c 0, d this.length; if (void 0 a && 1 b.nodeType) return b.innerHTML; if (string typeof a && !Aa.test(a) && !ma(ka.exec(a) || , )1.toLowerCase()) { a r.htmlPrefilter(a); try { for (; c d; c++)b thisc || {}, 1 b.nodeType && (r.cleanData(na(b, !1)), b.innerHTML a); b 0 } catch (e) { } } b && this.empty().append(a) }, null, a, arguments.length) }, replaceWith: function () { var a ; return Ja(this, arguments, function (b) { var c this.parentNode; r.inArray(this, a) 0 && (r.cleanData(na(this)), c && c.replaceChild(b, this)) }, a) } }), r.each({ appendTo: append, prependTo: prepend, insertBefore: before, insertAfter: after, replaceAll: replaceWith }, function (a, b) { r.fna 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(eg)b(c), h.apply(d, c.get()); return this.pushStack(d) } }); var La /^margin/, Ma new RegExp(^( + aa + )(?!px)a-z%+$, i), Na 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 , ra.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, ra.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 Oa(a, b, c) { var d, e, f, g, h a.style; return c c || Na(a), c && (g c.getPropertyValue(b) || cb, ! g || r.contains(a.ownerDocument, a) || (g r.style(a, b)), !o.pixelMarginRight() && Ma.test(g) && La.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 Pa(a, b) { return { get: function () { return a() ? void delete this.get : (this.get b).apply(this, arguments) } } } var Qa /^(none|table(?!-cea).+)/, Ra /^--/, Sa { position: absolute, visibility: hidden, display: block }, Ta { letterSpacing: 0, fontWeight: 400 }, Ua Webkit, Moz, ms, Va d.createElement(div).style; function Wa(a) { if (a in Va) return a; var b a0.toUpperCase() + a.slice(1), c Ua.length; while (c--) if (a Uac + b, a in Va) return a } function Xa(a) { var b r.cssPropsa; return b || (b r.cssPropsa Wa(a) || a), b } function Ya(a, b, c) { var d ba.exec(b); return d ? Math.max(0, d2 - (c || 0)) + (d3 || px) : b } function Za(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 + caf, !0, e)), d ? (content c && (g - r.css(a, padding + caf, !0, e)), margin ! c && (g - r.css(a, border + caf + Width, !0, e))) : (g + r.css(a, padding + caf, !0, e), padding ! c && (g + r.css(a, border + caf + Width, !0, e))); return g } function $a(a, b, c) { var d, e Na(a), f Oa(a, b, e), g border-box r.css(a, boxSizing, !1, e); return Ma.test(f) ? f : (d g && (o.boxSizingReliable() || f a.styleb), auto f && (f aoffset + b0.toUpperCase() + b.slice(1)), f parseFloat(f) || 0, f + Za(a, b, c || (g ? border : content), d, e) + px) } r.extend({ cssHooks: { opacity: { get: function (a, b) { if (b) { var c Oa(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 Ra.test(b), j a.style; return i || (b Xa(h)), g r.cssHooksb || r.cssHooksh, void 0 c ? g && get in g && void 0 ! (e g.get(a, !1, d)) ? e : jb : (f typeof c, string f && (e ba.exec(c)) && e1 && (c fa(a, b, e), f number), null ! c && c c && (number f && (c + e && e3 || (r.cssNumberh ? : px)), o.clearCloneStyle || ! c || 0 ! b.indexOf(background) || (jb inherit), g && set in g && void 0 (c g.set(a, c, d)) || (i ? j.setProperty(b, c) : jb c)), void 0) } }, css: function (a, b, c, d) { var e, f, g, h r.camelCase(b), i Ra.test(b); return i || (b Xa(h)), g r.cssHooksb || r.cssHooksh, g && get in g && (e g.get(a, !0, c)), void 0 e && (e Oa(a, b, d)), normal e && b in Ta && (e Tab), c || c ? (f parseFloat(e), c !0 || isFinite(f) ? f || 0 : e) : e } }), r.each(height, width, function (a, b) { r.cssHooksb { get: function (a, c, d) { if (c) return !Qa.test(r.css(a, display)) || a.getClientRects().length && a.getBoundingClientRect().width ? $a(a, b, d) : ea(a, Sa, function () { return $a(a, b, d) }) }, set: function (a, c, d) { var e, f d && Na(a), g d && Za(a, b, d, border-box r.css(a, boxSizing, !1, f), f); return g && (e ba.exec(c)) && px ! (e3 || px) && (a.styleb c, c r.css(a, b)), Ya(a, c, g) } } }), r.cssHooks.marginLeft Pa(o.reliableMarginLeft, function (a, b) { if (b) return (parseFloat(Oa(a, marginLeft)) || a.getBoundingClientRect().left - ea(a, { marginLeft: 0 }, function () { return a.getBoundingClientRect().left })) + px }), r.each({ margin: , padding: , border: Width }, function (a, b) { r.cssHooksa + b { expand: function (c) { for (var d 0, e {}, f string typeof c ? c.split( ) : c; d 4; d++)ea + cad + b fd || fd - 2 || f0; return e } }, La.test(a) || (r.cssHooksa + b.set Ya) }), r.fn.extend({ css: function (a, b) { return T(this, function (a, b, c) { var d, e, f {}, g 0; if (Array.isArray(b)) { for (d Na(a), e b.length; g e; g++)fbg r.css(a, bg, !1, d); return f } return void 0 ! c ? r.style(a, b, c) : r.css(a, b) }, a, b, arguments.length > 1) } }); function _a(a, b, c, d, e) { return new _a.prototype.init(a, b, c, d, e) } r.Tween _a, _a.prototype { constructor: _a, 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.cssNumberc ? : px) }, cur: function () { var a _a.propHooksthis.prop; return a && a.get ? a.get(this) : _a.propHooks._default.get(this) }, run: function (a) { var b, c _a.propHooksthis.prop; return this.options.duration ? this.pos b r.easingthis.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) : _a.propHooks._default.set(this), this } }, _a.prototype.init.prototype _a.prototype, _a.propHooks { _default: { get: function (a) { var b; return 1 ! a.elem.nodeType || null ! a.elema.prop && null a.elem.stylea.prop ? a.elema.prop : (b r.css(a.elem, a.prop, ), b && auto ! b ? b : 0) }, set: function (a) { r.fx.stepa.prop ? r.fx.stepa.prop(a) : 1 ! a.elem.nodeType || null a.elem.styler.cssPropsa.prop && !r.cssHooksa.prop ? a.elema.prop a.now : r.style(a.elem, a.prop, a.now + a.unit) } } }, _a.propHooks.scrollTop _a.propHooks.scrollLeft { set: function (a) { a.elem.nodeType && a.elem.parentNode && (a.elema.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 _a.prototype.init, r.fx.step {}; var ab, bb, cb /^(?:toggle|show|hide)$/, db /queueHooks$/; function eb() { bb && (d.hidden !1 && a.requestAnimationFrame ? a.requestAnimationFrame(eb) : a.setTimeout(eb, r.fx.interval), r.fx.tick()) } function fb() { return a.setTimeout(function () { ab void 0 }), ab r.now() } function gb(a, b) { var c, d 0, e { height: a }; for (b b ? 1 : 0; d 4; d + 2 - b)c cad, emargin + c epadding + c a; return b && (e.opacity e.width a), e } function hb(a, b, c) { for (var d, e (kb.tweenersb || ).concat(kb.tweeners*), f 0, g e.length; f g; f++)if (d ef.call(c, b, a)) return d } function ib(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 && da(a), q W.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 bd, cb.test(e)) { if (delete bd, f f || toggle e, e (p ? hide : show)) { if (show ! e || !q || void 0 qd) continue; p !0 } nd q && qd || 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 W.get(a, display)), k r.css(a, display), none k && (j ? k j : (ia(a, !0), j a.style.display || j, k r.css(a, display), ia(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.overflow0, o.overflowX c.overflow1, o.overflowY c.overflow2 })), i !1; for (d in n) i || (q ? hidden in q && (p q.hidden) : q W.access(a, fxshow, { display: j }), f && (q.hidden !p), p && ia(a, !0), m.done(function () { p || ia(a), W.remove(a, fxshow); for (d in n) r.style(a, d, nd) })), i hb(p ? qd : 0, d, m), d in q || (qd i.start, p && (i.end i.start, i.start 0)) } } function jb(a, b) { var c, d, e, f, g; for (c in a) if (d r.camelCase(c), e bd, f ac, Array.isArray(f) && (e f1, f ac f0), c ! d && (ad f, delete ac), g r.cssHooksd, g && expand in g) { f g.expand(f), delete ad; for (c in f) c in a || (ac fc, bc e) } else bd e } function kb(a, b, c) { var d, e, f 0, g kb.prefilters.length, h r.Deferred().always(function () { delete i.elem }), i function () { if (e) return !1; for (var b ab || fb(), 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.tweensg.run(f); return h.notifyWith(a, j, f, c), f 1 && i ? c : (i || h.notifyWith(a, j, 1, 0), 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: ab || fb(), duration: c.duration, tweens: , createTween: function (b, c) { var d r.Tween(a, j.opts, b, c, j.opts.specialEasingb || 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.tweensc.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 (jb(k, j.opts.specialEasing); f g; f++)if (d kb.prefiltersf.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, hb, j), r.isFunction(j.opts.start) && j.opts.start.call(a, j), j.progress(j.opts.progress).done(j.opts.done, j.opts.complete).fail(j.opts.fail).always(j.opts.always), r.fx.timer(r.extend(i, { elem: a, anim: j, queue: j.opts.queue })), j } r.Animation r.extend(kb, { tweeners: { *: function (a, b) { var c this.createTween(a, b); return fa(c.elem, a, ba.exec(b), c), c } }, tweener: function (a, b) { r.isFunction(a) ? (b a, a *) : a a.match(L); for (var c, d 0, e a.length; d e; d++)c ad, kb.tweenersc kb.tweenersc || , kb.tweenersc.unshift(b) }, prefilters: ib, prefilter: function (a, b) { b ? kb.prefilters.unshift(a) : kb.prefilters.push(a) } }), r.speed function (a, b, c) { var d 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.duration 0 : number ! typeof d.duration && (d.duration in r.fx.speeds ? d.duration r.fx.speedsd.duration : d.duration r.fx.speeds._default), null ! d.queue && d.queue ! !0 || (d.queue fx), d.old d.complete, d.complete function () { r.isFunction(d.old) && d.old.call(this), d.queue && r.dequeue(this, d.queue) }, d }, r.fn.extend({ fadeTo: function (a, b, c, d) { return this.filter(da).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 kb(this, r.extend({}, a), f); (e || W.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 W.get(this); if (e) ge && ge.stop && d(ge); else for (e in g) ge && ge.stop && db.test(e) && d(ge); for (e f.length; e--;)fe.elem ! this || null ! a && fe.queue ! a || (fe.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 W.get(this), d ca + queue, e ca + 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--;)fb.elem this && fb.queue a && (fb.anim.stop(!0), f.splice(b, 1)); for (b 0; b g; b++)db && db.finish && db.finish.call(this); delete c.finish }) } }), r.each(toggle, show, hide, function (a, b) { var c r.fnb; r.fnb function (a, d, e) { return null a || boolean typeof a ? c.apply(this, arguments) : this.animate(gb(b, !0), a, d, e) } }), r.each({ slideDown: gb(show), slideUp: gb(hide), slideToggle: gb(toggle), fadeIn: { opacity: show }, fadeOut: { opacity: hide }, fadeToggle: { opacity: toggle } }, function (a, b) { r.fna 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 (ab r.now(); b c.length; b++)a cb, a() || cb ! a || c.splice(b--, 1); c.length || r.fx.stop(), ab void 0 }, r.fx.timer function (a) { r.timers.push(a), r.fx.start() }, r.fx.interval 13, r.fx.start function () { bb || (bb !0, eb()) }, r.fx.stop function () { bb null }, r.fx.speeds { slow: 600, fast: 200, _default: 400 }, r.fn.delay function (b, c) { return b r.fx ? r.fx.speedsb || 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 lb, mb r.expr.attrHandle; r.fn.extend({ attr: function (a, b) { return T(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.attrHooksb.toLowerCase() || (r.expr.match.bool.test(b) ? lb : 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 && B(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(L); if (e && 1 a.nodeType) while (c ed++) a.removeAttribute(c) } }), lb { 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 mbb || r.find.attr; mbb function (a, b, d) { var e, f, g b.toLowerCase(); return d || (f mbg, mbg e, e null ! c(a, b, d) ? g : null, mbg f), e } }); var nb /^(?:input|select|textarea|button)$/i, ob /^(?:a|area)$/i; r.fn.extend({ prop: function (a, b) { return T(this, r.prop, a, b, arguments.length > 1) }, removeProp: function (a) { return this.each(function () { delete thisr.propFixa || 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.propFixb || b, e r.propHooksb), void 0 ! c ? e && set in e && void 0 ! (d e.set(a, c, b)) ? d : ab c : e && get in e && null ! (d e.get(a, b)) ? d : ab }, propHooks: { tabIndex: { get: function (a) { var b r.find.attr(a, tabindex); return b ? parseInt(b, 10) : nb.test(a.nodeName) || ob.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.propFixthis.toLowerCase() this }); function pb(a) { var b a.match(L) || ; return b.join( ) } function qb(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, qb(this))) }); if (string typeof a && a) { b a.match(L) || ; while (c thisi++) if (e qb(c), d 1 c.nodeType && + pb(e) + ) { g 0; while (f bg++) d.indexOf( + f + ) 0 && (d + f + ); h pb(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, qb(this))) }); if (!arguments.length) return this.attr(class, ); if (string typeof a && a) { b a.match(L) || ; while (c thisi++) if (e qb(c), d 1 c.nodeType && + pb(e) + ) { g 0; while (f bg++) while (d.indexOf( + f + ) > -1) d d.replace( + f + , ); h pb(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, qb(this), b), b) }) : this.each(function () { var b, d, e, f; if (string c) { d 0, e r(this), f a.match(L) || ; while (b fd++) e.hasClass(b) ? e.removeClass(b) : e.addClass(b) } else void 0 ! a && boolean ! c || (b qb(this), b && W.set(this, __className__, b), this.setAttribute && this.setAttribute(class, b || a !1 ? : W.get(this, __className__) || )) }) }, hasClass: function (a) { var b, c, d 0; b + a + ; while (c thisd++) if (1 c.nodeType && ( + pb(qb(c)) + ).indexOf(b) > -1) return !0; return !1 } }); var rb /\r/g; r.fn.extend({ val: function (a) { var b, c, d, e this0; { 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 + : Array.isArray(e) && (e r.map(e, function (a) { return null a ? : a + })), b r.valHooksthis.type || r.valHooksthis.nodeName.toLowerCase(), b && set in b && void 0 ! b.set(this, e, value) || (this.value e)) }); if (e) return b r.valHookse.type || r.valHookse.nodeName.toLowerCase(), b && get in b && void 0 ! (c b.get(e, value)) ? c : (c e.value, string typeof c ? c.replace(rb, ) : null c ? : c) } } }), r.extend({ valHooks: { option: { get: function (a) { var b r.find.attr(a, value); return null ! b ? b : pb(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 ed, (c.selected || d f) && !c.disabled && (!c.parentNode.disabled || !B(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 eg, (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.valHooksthis { set: function (a, b) { if (Array.isArray(b)) return a.checked r.inArray(r(a).val(), b) > -1 } }, o.checkOn || (r.valHooksthis.get function (a) { return null a.getAttribute(value) ? on : a.value }) }); var sb /^(?: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 && !sb.test(p + r.event.triggered) && (p.indexOf(.) > -1 && (q p.split(.), p q.shift(), q.sort()), k p.indexOf(:) 0 && on + p, b br.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.specialp || {}, f || !n.trigger || n.trigger.apply(e, c) ! !1)) { if (!f && !n.noBubble && !r.isWindow(e)) { for (j n.delegateType || p, sb.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 og++) && !b.isPropagationStopped()) b.type g > 1 ? j : n.bindType || p, m (W.get(h, events) || {})b.type && W.get(h, handle), m && m.apply(h, c), m k && hk, m && m.apply && U(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 || !U(e) || k && r.isFunction(ep) && !r.isWindow(e) && (i ek, i && (ek null), r.event.triggered p, ep(), r.event.triggered void 0, i && (ek 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 this0; 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.fnb 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.specialb { setup: function () { var d this.ownerDocument || this, e W.access(d, b); e || d.addEventListener(a, c, !0), W.access(d, b, (e || 0) + 1) }, teardown: function () { var d this.ownerDocument || this, e W.access(d, b) - 1; e ? W.access(d, b, e) : (d.removeEventListener(a, c, !0), W.remove(d, b)) } } }); var tb a.location, ub r.now(), vb /\?/; 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 wb /\\$/, xb /\r?\n/g, yb /^(?:submit|button|image|reset|file)$/i, zb /^(?:input|select|textarea|keygen)/i; function Ab(a, b, c, d) { var e; if (Array.isArray(b)) r.each(b, function (b, e) { c || wb.test(a) ? d(a, e) : Ab(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) Ab(a + + e + , be, c, d) } r.param function (a, b) { var c, d , e function (a, b) { var c r.isFunction(b) ? b() : b; dd.length encodeURIComponent(a) + + encodeURIComponent(null c ? : c) }; if (Array.isArray(a) || a.jquery && !r.isPlainObject(a)) r.each(a, function () { e(this.name, this.value) }); else for (c in a) Ab(c, ac, 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) && zb.test(this.nodeName) && !yb.test(a) && (this.checked || !ja.test(a)) }).map(function (a, b) { var c r(this).val(); return null c ? null : Array.isArray(c) ? r.map(c, function (a) { return { name: b.name, value: a.replace(xb, \r\n) } }) : { name: b.name, value: c.replace(xb, \r\n) } }).get() } }); var Bb /%20/g, Cb /#.*$/, Db /(?&)_^&*/, Eb /^(.*?): \t*(^\r\n*)$/gm, Fb /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, Gb /^(?:GET|HEAD)$/, Hb /^\/\//, Ib {}, Jb {}, Kb */.concat(*), Lb d.createElement(a); Lb.href tb.href; function Mb(a) { return function (b, c) { string ! typeof b && (c b, b *); var d, e 0, f b.toLowerCase().match(L) || ; if (r.isFunction(c)) while (d fe++) + d0 ? (d d.slice(1) || *, (ad ad || ).unshift(c)) : (ad ad || ).push(c) } } function Nb(a, b, c, d) { var e {}, f a Jb; function g(h) { var i; return eh !0, r.each(ah || , function (a, h) { var j h(b, c, d); return string ! typeof j || f || ej ? f ? !(i j) : void 0 : (b.dataTypes.unshift(j), g(j), !1) }), i } return g(b.dataTypes0) || !e* && g(*) } function Ob(a, b) { var c, d, e r.ajaxSettings.flatOptions || {}; for (c in b) void 0 ! bc && ((ec ? a : d || (d {}))c bc); return d && r.extend(!0, a, d), a } function Pb(a, b, c) { var d, e, f, g, h a.contents, i a.dataTypes; while (* i0) i.shift(), void 0 d && (d a.mimeType || b.getResponseHeader(Content-Type)); if (d) for (e in h) if (he && he.test(d)) { i.unshift(e); break } if (i0 in c) f i0; else { for (e in c) { if (!i0 || a.converterse + + i0) { f e; break } g || (g e) } f f || g } if (f) return f ! i0 && i.unshift(f), cf } function Qb(a, b, c, d) { var e, f, g, h, i, j {}, k a.dataTypes.slice(); if (k1) for (g in a.converters) jg.toLowerCase() a.convertersg; f k.shift(); while (f) if (a.responseFieldsf && (ca.responseFieldsf 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 ji + + f || j* + f, !g) for (e in j) if (h e.split( ), h1 f && (g ji + + h0 || j* + h0)) { g !0 ? g je : je ! !0 && (f h0, k.unshift(h1)); break } if (g ! !0) if (g && athrows) 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: tb.href, type: GET, isLocal: Fb.test(tb.protocol), global: !0, processData: !0, async: !0, contentType: application/x-www-form-urlencoded; charsetUTF-8, accepts: { *: Kb, 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 ? Ob(Ob(a, r.ajaxSettings), b) : Ob(r.ajaxSettings, a) }, ajaxPrefilter: Mb(Ib), ajaxTransport: Mb(Jb), 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 Eb.exec(g)) hb1.toLowerCase() b2 } b ha.toLowerCase() } return null b ? null : b }, getAllResponseHeaders: function () { return k ? g : null }, setRequestHeader: function (a, b) { return null k && (a wa.toLowerCase() wa.toLowerCase() || a, va b), this }, overrideMimeType: function (a) { return null k && (o.mimeType a), this }, statusCode: function (a) { var b; if (a) if (k) y.always(ay.status); else for (b in a) ub ub, ab; 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 || tb.href) + ).replace(Hb, tb.protocol + //), o.type c.method || c.type || o.method || o.type, o.dataTypes (o.dataType || *).toLowerCase().match(L) || , null o.crossDomain) { j d.createElement(a); try { j.href o.url, j.href j.href, o.crossDomain Lb.protocol + // + Lb.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)), Nb(Ib, 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 !Gb.test(o.type), f o.url.replace(Cb, ), o.hasContent ? o.data && o.processData && 0 (o.contentType || ).indexOf(application/x-www-form-urlencoded) && (o.data o.data.replace(Bb, +)) : (n o.url.slice(f.length), o.data && (f + (vb.test(f) ? & : ?) + o.data, delete o.data), o.cache !1 && (f f.replace(Db, $1), n (vb.test(f) ? & : ?) + _ + ub++ + n), o.url f + n), o.ifModified && (r.lastModifiedf && y.setRequestHeader(If-Modified-Since, r.lastModifiedf), r.etagf && y.setRequestHeader(If-None-Match, r.etagf)), (o.data && o.hasContent && o.contentType ! !1 || c.contentType) && y.setRequestHeader(Content-Type, o.contentType), y.setRequestHeader(Accept, o.dataTypes0 && o.acceptso.dataTypes0 ? o.acceptso.dataTypes0 + (* ! o.dataTypes0 ? , + Kb + ; q0.01 : ) : o.accepts*); for (m in o.headers) y.setRequestHeader(m, o.headersm); 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 Nb(Jb, 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 Pb(o, y, d)), v Qb(o, v, y, j), j ? (o.ifModified && (w y.getResponseHeader(Last-Modified), w && (r.lastModifiedf w), w y.getResponseHeader(etag), w && (r.etagf 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) { rb 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 this0 && (r.isFunction(a) && (a a.call(this0)), b r(a, this0.ownerDocument).eq(0).clone(!0), this0.parentNode && b.insertBefore(this0), 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 Rb { 0: 200, 1223: 204 }, Sb r.ajaxSettings.xhr(); o.cors !!Sb && withCredentials in Sb, o.ajax Sb !!Sb, r.ajaxTransport(function (b) { var c, d; if (o.cors || Sb && !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) hg b.xhrFieldsg; b.mimeType && h.overrideMimeType && h.overrideMimeType(b.mimeType), b.crossDomain || eX-Requested-With || (eX-Requested-With XMLHttpRequest); for (g in e) h.setRequestHeader(g, eg); 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(Rbh.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(b0) }, abort: function () { c && c() } } } }); var Tb , Ub /()\?(?&|$)|\?\?/; r.ajaxSetup({ jsonp: callback, jsonpCallback: function () { var a Tb.pop() || r.expando + _ + ub++; return thisa !0, a } }), r.ajaxPrefilter(json jsonp, function (b, c, d) { var e, f, g, h b.jsonp ! !1 && (Ub.test(b.url) ? url : string typeof b.data && 0 (b.contentType || ).indexOf(application/x-www-form-urlencoded) && Ub.test(b.data) && data); if (h || jsonp b.dataTypes0) return e b.jsonpCallback r.isFunction(b.jsonpCallback) ? b.jsonpCallback() : b.jsonpCallback, h ? bh bh.replace(Ub, $1 + e) : b.jsonp ! !1 && (b.url + (vb.test(b.url) ? & : ?) + b.jsonp + + e), b.convertersscript json function () { return g || r.error(e + was not called), g0 }, b.dataTypes0 json, f ae, ae function () { g arguments }, d.always(function () { void 0 f ? r(a).removeProp(e) : ae f, be && (b.jsonpCallback c.jsonpCallback, Tb.push(e)), g && r.isFunction(f) && f(g0), 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 C.exec(a), g !c && , f ? b.createElement(f1) : (f qa(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 pb(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.fnb 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 }, 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 this0; if (f) return f.getClientRects().length ? (d f.getBoundingClientRect(), b f.ownerDocument, c b.documentElement, e b.defaultView, { top: d.top + e.pageYOffset - c.clientTop, left: d.left + e.pageXOffset - c.clientLeft }) : { top: 0, left: 0 } }, position: function () { if (this0) { var a, b, c this0, d { top: 0, left: 0 }; return fixed r.css(c, position) ? b c.getBoundingClientRect() : (a this.offsetParent(), b this.offset(), B(a0, html) || (d a.offset()), d { top: d.top + r.css(a0, borderTopWidth, !0), left: d.left + r.css(a0, 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 || ra }) } }), r.each({ scrollLeft: pageXOffset, scrollTop: pageYOffset }, function (a, b) { var c pageYOffset b; r.fna function (d) { return T(this, function (a, d, e) { var f; return r.isWindow(a) ? f a : 9 a.nodeType && (f a.defaultView), void 0 e ? f ? fb : ad : void (f ? f.scrollTo(c ? f.pageXOffset : e, c ? e : f.pageYOffset) : ad e) }, a, d, arguments.length) } }), r.each(top, left, function (a, b) { r.cssHooksb Pa(o.pixelPosition, function (a, c) { if (c) return c Oa(a, b), Ma.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.fnd function (e, f) { var g arguments.length && (c || boolean ! typeof e), h c || (e !0 || f !0 ? margin : border); return T(this, function (b, c, e) { var f; return r.isWindow(b) ? 0 d.indexOf(outer) ? binner + a : b.document.documentElementclient + a : 9 b.nodeType ? (f b.documentElement, Math.max(b.bodyscroll + a, fscroll + a, b.bodyoffset + a, foffset + a, fclient + 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.holdReady function (a) { a ? r.readyWait++ : r.ready(!0) }, r.isArray Array.isArray, r.parseJSON JSON.parse, r.nodeName B, function typeof define && define.amd && define(jquery, , function () { return r }); var Vb a.jQuery, Wb a.$; return r.noConflict function (b) { return a.$ r && (a.$ Wb), b && a.jQuery r && (a.jQuery Vb), r }, b || (a.jQuery a.$ r), r }); /script> script src/js_functions/CommonFunction.js>/script> !-- Google Analytics Code --> !-- Google Tag Manager -->script>(function(w,d,s,l,i){wlwl||;wl.push({gtm.start:new Date().getTime(),event:gtm.js});var fd.getElementsByTagName(s)0,jd.createElement(s),dll!dataLayer?&l+l:;j.asynctrue;j.srchttps://www.googletagmanager.com/gtm.js?id+i+dl;f.parentNode.insertBefore(j,f);})(window,document,script,dataLayer,GTM-T6XLSBT);/script>!-- End Google Tag Manager --> !-- Global site tag (gtag.js) - Google Ads: 844748994 -->script async srchttps://www.googletagmanager.com/gtag/js?idAW-844748994>/script>script deferdefer> window.dataLayer window.dataLayer || ; function gtag(){dataLayer.push(arguments);} gtag(js, new Date()); gtag(config, AW-844748994);/script> !-- Google Analytics Code --> script typeapplication/ld+json> { @context:http://schema.org, @type:WebSite, url:https://www.doorhardware.co.uk/, name:Door Hardware / Ashley Andrews Ltd., about:Online Store for Door Handles, Door Knobs, Pull Handles, Cabinet Handles, Cabinet Knobs, Cabinet Pulls, Window Hardware, Door Accessories, External Door Hardware, Door Security Products } /script> script typeapplication/ld+json> { @context: http://schema.org/, @type:HardwareStore, name:doorhardware.co.uk, image: https://www.doorhardware.co.uk/images/logo.png, description:Heritage Brass, Tudor, Sorrento, M-marcus Architectural Door Hardware Products and Door Accessories, telephone: +44 (0)1384 247805, email: info@doorhardware.co.uk, address: { @type:PostalAddress, addressLocality:11a Narrowboat Way, addressRegion:Dudley, postalCode:DY2 OXQ } } /script>script idmcjs>!function(c,h,i,m,p){mc.createElement(h),pc.getElementsByTagName(h)0,m.async1,m.srci,p.parentNode.insertBefore(m,p)}(document,script,https://chimpstatic.com/mcjs-connected/js/users/e83cfd9e191b44509ff4798fd/3442d3dc1a77d96f2725bfd1a.js);/script> !-- TrustBox script --> script typetext/javascript src//widget.trustpilot.com/bootstrap/v5/tp.widget.bootstrap.min.js async> /script> style> body { opacity: 0; } .text-center { text-align: center !important; } /style> !-- End TrustBox script --> script> var jcookie ; jcookie ; if (jcookie ) { localStorage.removeItem(compare); } /script> script> (function (w, d, s, r, n) { w.TrustpilotObject n; wn wn || function () { (wn.q wn.q || ).push(arguments) }; a d.createElement(s); a.async 1; a.src r; a.type text/java + s; f d.getElementsByTagName(s)0; f.parentNode.insertBefore(a, f) })(window, document, script, https://invitejs.trustpilot.com/tp.min.js, tp); tp(register, SEnaG0WkQ6R0et8g); /script>/head>body> !-- Google Tag Manager (noscript) --> noscript> iframe srchttps://www.googletagmanager.com/ns.html?idGTM-T6XLSBT height0 width0 styledisplay:none;visibility:hidden>/iframe> /noscript> !-- End Google Tag Manager (noscript) --> div classwrapper> !-- :: HEADER :: --> header idheaderpan classnavbar p-0 d-lg-block navbar-dark navbar-expand-lg fixed-top> div idoffcanvas-overlay>/div>div classcontainer hdr-top> div classnavbar-brand> a hrefhttps://www.doorhardware.co.uk/> picture classd-none d-lg-block> source typeimage/webp srcset/images/logo.webp width195 height66 loadinglazy /> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-srcimages/logo.png width195 height66 loadinglazy altDoor Hardware titleDoor Hardware /> /picture> picture classd-lg-none> source typeimage/webp srcset/images/logo-xs.webp width250 height30 loadinglazy /> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-srcimages/logo-xs.png width250 height30 loadinglazy altDoor Hardware titleDoor Hardware /> /picture> /a> button classoffcanvas-toggle ml-auto idoffcanvas-toggle typebutton data-toggleoffcanvas aria-expandedfalse aria-labelToggle navigation> span classicon-bar>/span> span classicon-bar>/span> span classicon-bar>/span> /button> /div> div classhdr-right> !-- TrustBox widget - Mini --> div classtrustpilot-widget hdr-tpw data-localeen-GB data-template-id53aa8807dec7e10d38f59f32 data-businessunit-id5ce74ccec165250001e45785 data-style-height80px data-style-width100% data-themelight> a hrefhttps://uk.trustpilot.com/review/doorhardware.co.uk target_blank relnoopener>Trustpilot/a> /div> !-- End TrustBox widget --> ul> li classd-none d-md-inline-block>a hrefhttps://www.facebook.com/Ashley-Andrews-Limited-100772111969492 target_blank relnoopener>i classfa fa-facebook aria-hiddentrue>/i>/a>/li> li classd-none d-md-inline-block>a hrefhttps://www.instagram.com/doorhardware.co.uk/ target_blank relnoopener>i classfa fa-instagram aria-hiddentrue>/i>/a>/li> li classd-none d-xl-inline-block>a hrefmailto:info@doorhardware.co.uk>i classfa fa-envelope mr-2 aria-hiddentrue>/i>info@doorhardware.co.uk/a>/li> li classnav-item dropdown> /li> li classnav-item dropdown> a classnav-link dropdown-toggle href# data-toggledropdown aria-haspopuptrue aria-expandedfalse>i classfa fa-user aria-hiddentrue>/i>span classhead>My Account/span>/a> div classdropdown-menu> ul classlist-unstyled list-dropdown mb-0> li classfa-icon>a href/Registration/Login>i classfa fa-lock aria-hiddentrue>/i>Login/a>/li> li classfa-icon>a href/Registration/Register>i classfa fa-pencil aria-hiddentrue>/i>Register/a>/li> li classfa-icon>a href/Registration/Trade>i classfa fa-pencil aria-hiddentrue>/i>Trade/a>/li> /ul> /div> /li> li classcart-btn> a href/cart>i classfa fa-shopping-cart aria-hiddentrue>/i>span>span classhead>Cart/span> sup classcartcount>(0)/sup>/span> span classcartprice>/span>small classcartvat styledisplay:none;>(Excl. VAT:)/small>/a> /li> /ul> a href/productdetail/CompareProducts classhdr-compare-btn lnkcompare stylepointer-events:none;cursor:default>i classfa fa-exchange aria-hiddentrue>/i>span classml-2 d-none d-md-inline-block>Compare/span>small classml-2 badge badge-info p-1 p-lg-2 idcomparecount>0/small>/a> div classbtn-search>i classfa fa-search aria-hiddentrue>/i>i classfa fa-times aria-hiddentrue>/i>/div> div classsearchbar> div classhdr-search d-md-flex w-100> div classd-flex flex-column text-left position-relative w-50> div classinput-group> input classform-control typetext idtxtSearch placeholderSearch Hardware Products aria-labelSearch> div classinput-group-append> a idbtnsearch classbtn input-group-text>i classfa fa-search aria-hiddentrue>/i>/a> /div> /div> span idsearcherr classerr-msg-search text-danger small>/span> /div> div classml-md-3 d-flex flex-column text-left position-relative w-50> div classinput-group> input classform-control typetext idtxtelecSearch placeholderSearch Electrical Products aria-labelSearch> div classinput-group-append> a idbtnelecsearch classbtn input-group-text>i classfa fa-search aria-hiddentrue>/i>/a> /div> /div> span idsearchelecerr classerr-msg-search text-danger small>/span> /div> /div> /div> /div>/div>div classhdr-menu> div classcontainer-fluid> div classnavbar-collapse offcanvas-collapse idnavbarHeader> ul classnav navbar-nav position-relative> li classnav-item dropdown> a classnav-link dropdown-toggle href/category/door-handles.aspx data-toggledropdown aria-haspopuptrue aria-expandedfalse>Door Handles/a> div classdropdown-menu dropdown-menu-lg> a classdropdown-item href/products/door-handles-on-plate.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/door-handles-on-plate-1.jpg width50 height50 altDoor Handles on Plate titleDoor Handles on Plate classicon-cat-drop loadinglazy />span>Door Handles on Plate/span>/a> a classdropdown-item href/products/door-handles-on-rose.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/door-handles-on-round-rose-2.jpg width50 height50 altDoor Handles on Round Rose titleDoor Handles on Round Rose classicon-cat-drop loadinglazy />span>Door Handles on Round Rose/span>/a> a classdropdown-item href/products/door-handles-on-square-rose.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/door-handles-on-square-rose-42.jpg width50 height50 altDoor Handles on Square Rose titleDoor Handles on Square Rose classicon-cat-drop loadinglazy />span>Door Handles on Square Rose/span>/a> a classdropdown-item href/products/multipoint-handles.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/multipoint-handles-52.jpg width50 height50 altMultipoint Handles titleMultipoint Handles classicon-cat-drop loadinglazy />span>Multipoint Handles/span>/a> /div> /li> li classnav-item dropdown> a classnav-link dropdown-toggle href/category/door-knobs.aspx data-toggledropdown aria-haspopuptrue aria-expandedfalse>Door Knobs/a> div classdropdown-menu dropdown-menu-lg> a classdropdown-item href/products/door-knobs-on-plate.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/door-knobs-on-plate-3.jpg width50 height50 altDoor Knobs on Plate titleDoor Knobs on Plate classicon-cat-drop loadinglazy />span>Door Knobs on Plate/span>/a> a classdropdown-item href/products/door-knobs-on-rose.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/door-knobs-on-rose-4.jpg width50 height50 altDoor Knobs on Rose titleDoor Knobs on Rose classicon-cat-drop loadinglazy />span>Door Knobs on Rose/span>/a> /div> /li> li classnav-item dropdown> a classnav-link dropdown-toggle href/category/cabinet-handles.aspx data-toggledropdown aria-haspopuptrue aria-expandedfalse>Cabinet Pulls/a> div classdropdown-menu dropdown-menu-lg> a classdropdown-item href/products/cabinet-pulls.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/cabinet-pull-handles-15.jpg width50 height50 altCabinet Pull Handles titleCabinet Pull Handles classicon-cat-drop loadinglazy />span>Cabinet Pull Handles/span>/a> a classdropdown-item href/products/cabinet-drops.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/cabinet-ring--drop-pulls-38.jpg width50 height50 altCabinet Ring / Drop Pulls titleCabinet Ring / Drop Pulls classicon-cat-drop loadinglazy />span>Cabinet Ring / Drop Pulls/span>/a> a classdropdown-item href/products/drawer-cup-pulls.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/drawer-cup-pulls-43.jpg width50 height50 altDrawer Cup Pulls titleDrawer Cup Pulls classicon-cat-drop loadinglazy />span>Drawer Cup Pulls/span>/a> a classdropdown-item href/products/cabinet-knobs.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/cabinet-knobs-16.jpg width50 height50 altCabinet Knobs titleCabinet Knobs classicon-cat-drop loadinglazy />span>Cabinet Knobs/span>/a> /div> /li> li classnav-item dropdown> a classnav-link dropdown-toggle href/category/cabinet-knobs.aspx data-toggledropdown aria-haspopuptrue aria-expandedfalse>Cabinet Knobs/a> div classdropdown-menu dropdown-menu-lg> a classdropdown-item href/products/cabinet-knobs.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/cabinet-knobs-16.jpg width50 height50 altCabinet Knobs titleCabinet Knobs classicon-cat-drop loadinglazy />span>Cabinet Knobs/span>/a> a classdropdown-item href/products/cabinet-pulls.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/cabinet-pull-handles-15.jpg width50 height50 altCabinet Pull Handles titleCabinet Pull Handles classicon-cat-drop loadinglazy />span>Cabinet Pull Handles/span>/a> a classdropdown-item href/products/cabinet-drops.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/cabinet-ring--drop-pulls-38.jpg width50 height50 altCabinet Ring / Drop Pulls titleCabinet Ring / Drop Pulls classicon-cat-drop loadinglazy />span>Cabinet Ring / Drop Pulls/span>/a> a classdropdown-item href/products/drawer-cup-pulls.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/drawer-cup-pulls-43.jpg width50 height50 altDrawer Cup Pulls titleDrawer Cup Pulls classicon-cat-drop loadinglazy />span>Drawer Cup Pulls/span>/a> /div> /li> li classnav-item> a classnav-link href/category/flush-pulls.aspx>Flush Pulls/a> /li> li classnav-item dropdown> a classnav-link dropdown-toggle href/category/pull-handles.aspx data-toggledropdown aria-haspopuptrue aria-expandedfalse>Door Pulls/a> div classdropdown-menu dropdown-menu-lg> a classdropdown-item href/products/pull-handles.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/door-pull-handles-17.jpg width50 height50 altDoor Pull Handles titleDoor Pull Handles classicon-cat-drop loadinglazy />span>Door Pull Handles/span>/a> a classdropdown-item href/products/door-pull-handles-on-plate.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/door-pull-handles-on-plate-44.jpg width50 height50 altDoor Pull Handles on Plate titleDoor Pull Handles on Plate classicon-cat-drop loadinglazy />span>Door Pull Handles on Plate/span>/a> /div> /li> li classnav-item dropdown> a classnav-link dropdown-toggle href/category/external-door-hardware.aspx data-toggledropdown aria-haspopuptrue aria-expandedfalse>Door Furniture/a> div classdropdown-menu dropdown-menu-lg> a classdropdown-item href/products/letter-plates.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/letter-plates-5.jpg width50 height50 altLetter Plates titleLetter Plates classicon-cat-drop loadinglazy />span>Letter Plates/span>/a> a classdropdown-item href/products/door-knockers.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/door-knockers-33.jpg width50 height50 altDoor Knockers titleDoor Knockers classicon-cat-drop loadinglazy />span>Door Knockers/span>/a> a classdropdown-item href/products/door-knobs.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/front-door-centre-knobs-7.jpg width50 height50 altFront Door Centre Knobs titleFront Door Centre Knobs classicon-cat-drop loadinglazy />span>Front Door Centre Knobs/span>/a> a classdropdown-item href/products/bell-pushes.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/bell-pushes-9.jpg width50 height50 altBell Pushes titleBell Pushes classicon-cat-drop loadinglazy />span>Bell Pushes/span>/a> a classdropdown-item href/products/door-numerals.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/door-numerals-10.jpg width50 height50 altDoor Numerals titleDoor Numerals classicon-cat-drop loadinglazy />span>Door Numerals/span>/a> a classdropdown-item href/products/escutcheon.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/escutcheons-32.jpg width50 height50 altEscutcheons titleEscutcheons classicon-cat-drop loadinglazy />span>Escutcheons/span>/a> a classdropdown-item href/products/turn-release.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/turn--release-22.jpg width50 height50 altTurn & Release titleTurn & Release classicon-cat-drop loadinglazy />span>Turn & Release/span>/a> a classdropdown-item href/products/door-stops.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/door-stops-24.jpg width50 height50 altDoor Stops titleDoor Stops classicon-cat-drop loadinglazy />span>Door Stops/span>/a> a classdropdown-item href/products/door-hooks.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/coat-hooks-25.jpg width50 height50 altCoat Hooks titleCoat Hooks classicon-cat-drop loadinglazy />span>Coat Hooks/span>/a> a classdropdown-item href/products/finger-plate.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/finger-plate-18.jpg width50 height50 altFinger Plate titleFinger Plate classicon-cat-drop loadinglazy />span>Finger Plate/span>/a> a classdropdown-item href/products/door-bolts.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/door-bolts-26.jpg width50 height50 altDoor Bolts titleDoor Bolts classicon-cat-drop loadinglazy />span>Door Bolts/span>/a> a classdropdown-item href/products/door-chain.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/door-chain-6.jpg width50 height50 altDoor Chain titleDoor Chain classicon-cat-drop loadinglazy />span>Door Chain/span>/a> a classdropdown-item href/products/gate-latch.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/gate-latch-30.jpg width50 height50 altGate Latch titleGate Latch classicon-cat-drop loadinglazy />span>Gate Latch/span>/a> a classdropdown-item href/products/cabin-hook.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/cabin-hooks-27.jpg width50 height50 altCabin Hooks titleCabin Hooks classicon-cat-drop loadinglazy />span>Cabin Hooks/span>/a> a classdropdown-item href/products/cylinder-pull.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/cylinder-pulls-8.jpg width50 height50 altCylinder Pulls titleCylinder Pulls classicon-cat-drop loadinglazy />span>Cylinder Pulls/span>/a> a classdropdown-item href/products/door-signs.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/signs-28.jpg width50 height50 altDoor Signs titleDoor Signs classicon-cat-drop loadinglazy />span>Door Signs/span>/a> a classdropdown-item href/products/handrail-brackets.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/handrail-brackets-23.jpg width50 height50 altHandrail Brackets titleHandrail Brackets classicon-cat-drop loadinglazy />span>Handrail Brackets/span>/a> a classdropdown-item href/products/strap-hinges.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/strap-hinges--clavos-11.jpg width50 height50 altStrap Hinges & Clavos titleStrap Hinges & Clavos classicon-cat-drop loadinglazy />span>Strap Hinges & Clavos/span>/a> a classdropdown-item href/products/pole-hook.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/pole-hook-53.jpg width50 height50 altPole Hook titlePole Hook classicon-cat-drop loadinglazy />span>Pole Hook/span>/a> /div> /li> li classnav-item dropdown> a classnav-link dropdown-toggle href/category/window-hardware.aspx data-toggledropdown aria-haspopuptrue aria-expandedfalse>Window Hardware/a> div classdropdown-menu dropdown-menu-lg> a classdropdown-item href/products/casement-stay.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/casement-stay-12.jpg width50 height50 altCasement Stay titleCasement Stay classicon-cat-drop loadinglazy />span>Casement Stay/span>/a> a classdropdown-item href/products/casement-fastener.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/casement-fastener-13.jpg width50 height50 altCasement Fastener titleCasement Fastener classicon-cat-drop loadinglazy />span>Casement Fastener/span>/a> a classdropdown-item href/products/sash-fasteners.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/sash-fasteners--lifts-14.jpg width50 height50 altSash Fasteners & Lifts titleSash Fasteners & Lifts classicon-cat-drop loadinglazy />span>Sash Fasteners & Lifts/span>/a> /div> /li> li classnav-item> a classnav-link href/category/hinges.aspx>Hinges/a> /li> li classnav-item dropdown> a classnav-link dropdown-toggle href/category/door-security-products.aspx data-toggledropdown aria-haspopuptrue aria-expandedfalse>Locks & Latches/a> div classdropdown-menu dropdown-menu-lg> a classdropdown-item href/products/sashlocks.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/sashlocks-19.jpg width50 height50 altSashlocks titleSashlocks classicon-cat-drop loadinglazy />span>Sashlocks/span>/a> a classdropdown-item href/products/tubular-latches.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/tubular-latches-31.jpg width50 height50 altTubular Latches titleTubular Latches classicon-cat-drop loadinglazy />span>Tubular Latches/span>/a> a classdropdown-item href/products/bathroom-locks.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/bathroom-locks-21.jpg width50 height50 altBathroom Locks titleBathroom Locks classicon-cat-drop loadinglazy />span>Bathroom Locks/span>/a> a classdropdown-item href/products/nightlatches.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/night-latches-35.jpg width50 height50 altNight Latches titleNight Latches classicon-cat-drop loadinglazy />span>Night Latches/span>/a> a classdropdown-item href/products/deadbolts.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/deadbolts-36.jpg width50 height50 altDeadbolts titleDeadbolts classicon-cat-drop loadinglazy />span>Deadbolts/span>/a> a classdropdown-item href/products/deadlocks.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/deadlocks-37.jpg width50 height50 altDeadlocks titleDeadlocks classicon-cat-drop loadinglazy />span>Deadlocks/span>/a> /div> /li> li classnav-item dropdown> a classnav-link dropdown-toggle href/category/bathroom-fittings.aspx data-toggledropdown aria-haspopuptrue aria-expandedfalse>Bathroom/a> div classdropdown-menu dropdown-menu-lg> a classdropdown-item href/products/robe-hook.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/robe-hook-45.jpg width50 height50 altRobe Hook titleRobe Hook classicon-cat-drop loadinglazy />span>Robe Hook/span>/a> a classdropdown-item href/products/toilet-roll-holder.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/toilet-roll-holder-46.jpg width50 height50 altToilet Roll Holder titleToilet Roll Holder classicon-cat-drop loadinglazy />span>Toilet Roll Holder/span>/a> a classdropdown-item href/products/towel-bar-rail.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/towel-bar-rail-47.jpg width50 height50 altTowel Bar Rail titleTowel Bar Rail classicon-cat-drop loadinglazy />span>Towel Bar Rail/span>/a> a classdropdown-item href/products/toothbrush-holder.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/tumbler-holder-48.jpg width50 height50 altToothbrush Holder titleToothbrush Holder classicon-cat-drop loadinglazy />span>Toothbrush Holder/span>/a> a classdropdown-item href/products/soap-dispenser.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/soap-dispenser-49.jpg width50 height50 altSoap Dispenser titleSoap Dispenser classicon-cat-drop loadinglazy />span>Soap Dispenser/span>/a> a classdropdown-item href/products/toilet-brush-and-holder-set.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/toilet-brush-and-holder-set-50.jpg width50 height50 altToilet Brush and Holder Set titleToilet Brush and Holder Set classicon-cat-drop loadinglazy />span>Toilet Brush and Holder Set/span>/a> a classdropdown-item href/products/towel-ring.aspx>img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/DLL/image.ashx?imagepathsubcategory/icon/towel-ring-51.jpg width50 height50 altTowel Ring titleTowel Ring classicon-cat-drop loadinglazy />span>Towel Ring/span>/a> /div> /li> li classnav-item> a classnav-link href/ElectricalAccessory/>Switches & Sockets/a> /li> li classnav-item dropdown> a classnav-link dropdown-toggle href# data-toggledropdown aria-haspopuptrue aria-expandedfalse>About/a> div classdropdown-menu dropdown-menu-right dropdown-small> a classdropdown-item href/door-furniture-accessories-about-us>img src/images/icon-dh.png classicon-cat-drop width32 height32 altAbout Us titleAbout Us />span>About Us/span>/a> a classdropdown-item href/contact-us>img src/images/icon-contact.png classicon-cat-drop width32 height32 altContact Us titleContact Us />span>Contact Us/span>/a> a classdropdown-item href/faqs>img src/images/icon-faqs.png classicon-cat-drop width32 height32 altFAQs titleFAQs />span>FAQs/span>/a> a classdropdown-item href/technical-information>img src/images/icon-tech-info.png classicon-cat-drop width32 height32 altTechnical Information titleTechnical Information />span>Technical Information/span>/a> a classdropdown-item href/testimonials>img src/images/icon-review.png classicon-cat-drop width32 height32 altCustomer Reviews titleCustomer Reviews />span>Customer Reviews/span>/a> a classdropdown-item href/inspiration>img src/images/icon-inspiration.png classicon-cat-drop width32 height32 altInspiration titleInspiration />span>Inspiration/span>/a> /div> /li> /ul> /div> /div>/div>script typetext/javascript src/js_functions/Header.js?v6>/script> /header> !-- :: HEADER :: --> div classclearfix w-100>/div> !-- :: BODY :: --> script> function NewsletterValidations() { var firstname $(#mail_first_name).val(); var lastname $(#mail_last_name).val(); var email $(#mail_email).val(); var captcha $(#CaptchaInputText).val(); var result true; // required fields if (firstname ) { $(#error_First_Name).html(Enter First Name); $(#error_First_Name).show(); result false; } else { $(#error_First_Name).html(); $(#error_First_Name).hide(); } if (lastname ) { $(#error_Last_Name).html(Enter Last Name); $(#error_Last_Name).show(); result false; } else { $(#error_Last_Name).html(); $(#error_Last_Name).hide(); } if (email ) { $(#error_Email).html(Enter Email ID); $(#error_Email).show(); result false; } // regular expression for email id var email_reg_expression /^(0-9a-zA-Z(-.\w*0-9a-zA-Z)*\u0040(0-9a-zA-Z-\w*0-9a-zA-Z\.)+a-zA-Z{2,9})$/; // apply validators if (email ! ) { if (email_reg_expression.test(email)) { $(#error_Email).html(); $(#error_Email).hide(); } else { $(#error_Email).html(Email Id is not valid); $(#error_Email).show(); result false; } } if (captcha ) { $(#error_captcha).html(Enter Verification Code); $(#error_captcha).show(); result false; } else { $(#error_captcha).html(); $(#error_captcha).hide(); } return result; }/script>link href/Content/jquery-confirm.css relstylesheet />link href/Content/fakeloader.css relstylesheet />div iddivLoader styledisplay: none;>/div>form action/ idformadd methodpost>input name__RequestVerificationToken typehidden value5QaVOP1FPBd0JR9wbb6CcepjxlUdTmTtML3ztNDI3Xn31TRlMiMS74UzLNZJtNwP8Ox4zq2YQ-NA9LqMouBjcS4eqG3qb-b2gpytur3WHsg1 /> !-- Visual Panel --> div idvisual-wrapper> !-- START REVOLUTION SLIDER --> div idvisual_container classtp-banner-container d-none d-md-block> div classtp-banner> ul> li data-transitionfade data-slotamount1 data-masterspeed500> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-lazyload/DLL/image.ashx?imagepathvisualpanel/new-135.jpg alt title data-bgpositioncenter center data-bgfitcover data-bgrepeatno-repeat /> div classtp-caption sft tp-resizeme bg-tp-caption text-right data-xright data-hoffset0 data-ycenter data-voffset0 data-speed600 data-start800 data-easingPower4.easeOut data-splitinnone data-splitoutnone data-elementdelay0.01 data-endelementdelay0.1 data-endspeed600 data-endeasingPower4.easeIn stylez-index: 2;> /div> /li> li data-transitionfade data-slotamount1 data-masterspeed500> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-lazyload/DLL/image.ashx?imagepathvisualpanel/Website banner - cabinet hardware 1920x390 px56.jpg alt title data-bgpositioncenter center data-bgfitcover data-bgrepeatno-repeat /> div classtp-caption sft tp-resizeme bg-tp-caption text-right data-xright data-hoffset0 data-ycenter data-voffset0 data-speed600 data-start800 data-easingPower4.easeOut data-splitinnone data-splitoutnone data-elementdelay0.01 data-endelementdelay0.1 data-endspeed600 data-endeasingPower4.easeIn stylez-index: 2;> /div> /li> li data-transitionfade data-slotamount1 data-masterspeed500> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-lazyload/DLL/image.ashx?imagepathvisualpanel/pic-mortice-knobs-55.jpg alt title data-bgpositioncenter center data-bgfitcover data-bgrepeatno-repeat /> div classtp-caption sft tp-resizeme bg-tp-caption text-right data-xright data-hoffset0 data-ycenter data-voffset0 data-speed600 data-start800 data-easingPower4.easeOut data-splitinnone data-splitoutnone data-elementdelay0.01 data-endelementdelay0.1 data-endspeed600 data-endeasingPower4.easeIn stylez-index: 2;> /div> /li> /ul> div classtp-bannertimer> /div> /div> /div> div classd-md-none> div classvisual-mobile d-flex align-items-center> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/images/slider/visual-mobile.jpg classimg-fluid d-block mx-auto width767 height400 loadinglazy altDoor Hardware titleDoor Hardware /> /div> /div> /div> div classclearfix>/div> !-- Visual Panel --> !-- Body Panel --> div classcontainer pt-3 pt-md-5> div classhome-intro-panel card> div classcard-body card-intro py-md-5> div classheading> h1 classh2> The No.1 Door Hardware Store in the UK/h1> /div> p>Want to purchase top-quality window and door hardware online at a reasonable cost to renew the interior? Need to carry out scheduled repairs of your home, shop, or office? Our door hardware shop is pleased to serve you. We offer a wide range of high-grade hardware for doors and windows at the most attractive prices. Whether you’re looking for beautiful and durable door hardware for living-rooms, bedrooms, bathrooms, or kitchens, we are here to provide you with the best solutions. With our door hardware UK, you’ll give your house that particular renovated look you are dreaming of in no time. /p> /div> /div> /div> div classcontainer py-5> div classrow prod-cards> div classcol-6 col-sm-6 col-md-4 col-lg-3> a classcard href/category/door-handles.aspx> div classcard-body> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-srchttps://www.doorhardware.co.uk/DLL/image.ashx?imagepathcategory/pic/door-handles-1.jpg altDoor Handles titleDoor Handles classimg-fluid width275 height250 loadinglazy> div classcard-caption> We offer an extensive range of decorative door handles on plate, round rose and square rose. Our rich collection offers door handles in various functions, finishes and materials. /div> /div> div classcard-footer> h2>Door Handles/h2> /div> /a> /div> div classcol-6 col-sm-6 col-md-4 col-lg-3> a classcard href/category/door-knobs.aspx> div classcard-body> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-srchttps://www.doorhardware.co.uk/DLL/image.ashx?imagepathcategory/pic/door-knobs-9.jpg altDoor Knobs titleDoor Knobs classimg-fluid width275 height250 loadinglazy> div classcard-caption> Whether you are looking for something traditional or contemporary, our broad catalogue of solid door knobs includes numerous styles and designs for knobs on plate and on rose. /div> /div> div classcard-footer> h2>Door Knobs/h2> /div> /a> /div> div classcol-6 col-sm-6 col-md-4 col-lg-3> a classcard href/category/cabinet-handles.aspx> div classcard-body> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-srchttps://www.doorhardware.co.uk/DLL/image.ashx?imagepathcategory/pic/cabinet-pulls-4.jpg altCabinet Pulls titleCabinet Pulls classimg-fluid width275 height250 loadinglazy> div classcard-caption> Our collection of cabinet pull handles are attractive and functional at the same time. Our range includes cup pulls, ring pulls drop pulls, and bar handles. Cabinet pull handles are available in 3 to 4 sizes, multiple finishes, and materials. /div> /div> div classcard-footer> h2>Cabinet Pulls/h2> /div> /a> /div> div classcol-6 col-sm-6 col-md-4 col-lg-3> a classcard href/products/cabinet-knobs.aspx> div classcard-body> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-srchttps://www.doorhardware.co.uk/DLL/image.ashx?imagepathcategory/pic/cabinet-knobs-13.jpg altCabinet Knobs titleCabinet Knobs classimg-fluid width275 height250 loadinglazy> div classcard-caption> Our collection of cabinet knobs includes over 30 unique designs available in multiple sizes and finishes. Browse the range and find the one to perfectly suit your interior. /div> /div> div classcard-footer> h2>Cabinet Knobs/h2> /div> /a> /div> div classcol-6 col-sm-6 col-md-4 col-lg-3> a classcard href/products/flush-pulls.aspx> div classcard-body> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-srchttps://www.doorhardware.co.uk/DLL/image.ashx?imagepathcategory/pic/flush-pulls-6.jpg altFlush Pulls titleFlush Pulls classimg-fluid width275 height250 loadinglazy> div classcard-caption> Our collection of Flush Pulls offers a wide range of designs and sizes available in 8 finishes. Our range includes circular and rectangular shapes with classical and contemporary designs suitable for all decors. /div> /div> div classcard-footer> h2>Flush Pulls/h2> /div> /a> /div> div classcol-6 col-sm-6 col-md-4 col-lg-3> a classcard href/category/pull-handles.aspx> div classcard-body> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-srchttps://www.doorhardware.co.uk/DLL/image.ashx?imagepathcategory/pic/door-pull-handles-5.jpg altDoor Pulls titleDoor Pulls classimg-fluid width275 height250 loadinglazy> div classcard-caption> Browse our comprehensive range of quality door pull handles which includes classic door pull handles, contemporary door pull handles, flush pull handles, and a variety of pull handles on plate. /div> /div> div classcard-footer> h2>Door Pulls/h2> /div> /a> /div> div classcol-6 col-sm-6 col-md-4 col-lg-3> a classcard href/category/external-door-hardware.aspx> div classcard-body> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-srchttps://www.doorhardware.co.uk/DLL/image.ashx?imagepathcategory/pic/door-furniture-2.jpg altDoor Furniture titleDoor Furniture classimg-fluid width275 height250 loadinglazy> div classcard-caption> We offer an extensive catalogue of premium-quality door furniture from door knockers, letter plates, numerals, bell pushes, door hooks, door stops, escutcheons, turn and release and much more. /div> /div> div classcard-footer> h2>Door Furniture/h2> /div> /a> /div> div classcol-6 col-sm-6 col-md-4 col-lg-3> a classcard href/category/window-hardware.aspx> div classcard-body> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-srchttps://www.doorhardware.co.uk/DLL/image.ashx?imagepathcategory/pic/window-hardware-3.jpg altWindow Hardware titleWindow Hardware classimg-fluid width275 height250 loadinglazy> div classcard-caption> Whether you are looking for an antique or modern finishing touch for your windows, browse our vast collection of casement stays, fasteners, and lifts. /div> /div> div classcard-footer> h2>Window Hardware/h2> /div> /a> /div> div classcol-6 col-sm-6 col-md-4 col-lg-3> a classcard href/products/hinges.aspx> div classcard-body> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-srchttps://www.doorhardware.co.uk/DLL/image.ashx?imagepathcategory/pic/hinges-7.jpg altHinges titleHinges classimg-fluid width275 height250 loadinglazy> div classcard-caption> We have a wide range of quality interior door hinges. Our selection offers you the opportunity to match the finish of the hinge to the finish of your door hardware. /div> /div> div classcard-footer> h2>Hinges/h2> /div> /a> /div> div classcol-6 col-sm-6 col-md-4 col-lg-3> a classcard href/category/door-security-products.aspx> div classcard-body> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-srchttps://www.doorhardware.co.uk/DLL/image.ashx?imagepathcategory/pic/locks---latches-8.jpg altLocks & Latches titleLocks & Latches classimg-fluid width275 height250 loadinglazy> div classcard-caption> Safety is a priority. Keep your doors secure with our collection of sashlocks, deadbolts, tubular latches, bathroom locks and more. /div> /div> div classcard-footer> h2>Locks & Latches/h2> /div> /a> /div> div classcol-6 col-sm-6 col-md-4 col-lg-3> a classcard href/category/bathroom-fittings.aspx> div classcard-body> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-srchttps://www.doorhardware.co.uk/DLL/image.ashx?imagepathcategory/pic/bathroom-fittings-14.jpg altBathroom titleBathroom classimg-fluid width275 height250 loadinglazy> div classcard-caption> Renovating or redecorating your bathroom, browse our complete collection of bathroom hardware which includes towel rails, robe hooks, soap dispensers and much more to create a cohesive look. /div> /div> div classcard-footer> h2>Bathroom/h2> /div> /a> /div> div classcol-6 col-sm-6 col-md-4 col-lg-3> a classcard href/ElectricalAccessory> div classcard-body> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/images/prod-electrical.jpg altElectrical titleElectrical classimg-fluid width275 height250 loadinglazy /> div classcard-caption> Browse our range of electrical accessories and complete the look for your home or office. /div> /div> div classcard-footer> h2>Switches & Sockets/h2> /div> /a> /div> div classcol-6 col-sm-6 col-md-4 col-lg-3> a classcard href/metal-finishes-for-door-hardware> div classcard-body> img srcdata:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs data-src/images/brass-finish-samples-10.jpg altFinish Chips titleFinish Chips classimg-fluid width275 height250 loadinglazy /> div classcard-caption> Unsure about which finish you want; we offer samples of our brass finishes for door and cabinet hardware to assist you in making the right choice. /div> /div> div classcard-footer> h2>Brass Finish Samples/h2> /div> /a> /div> /div> /div> div classintro-panel pt-5 mb-5> div classcontainer> div classrow> div classcol-12 col-lg-8 text-white> div classheading text-white> h2>DOOR HARDWARE STORE FORMED FOR CUSTOMERS’ NEEDS/h2> /div> p>The website doorhardware.co.uk was formed to provide a dependable online source for those wishing to purchase decorative door hardware. All products are distributed from our own warehouse where we operate both an ISO 9001:2008 quality management system and an ISO14001:2004 environmental management system./p>p>We are highly selective in the door hardware products that we offer for sale so you will only find well-made and durable products at doorhardware.co.uk/p>p>We have designed our site to make the selection of window and door hardware as easy as possible. You may search & filter product pages by style & finish so whether you are a Homeowner, Designer or Architect we are sure that you will enjoy browsing our site and will find just the right products for your Home, Shop or Offices./p>p>Thank you for choosing to visit us./p> p>a hrefhttps://www.doorhardware.co.uk/door-furniture-accessories-about-us classbtn btn-outline-light>Read More/a> /p> /div> div classcol-12 col-lg-4> div classnewsletter-panel p-4> h2>The Broadest Choice of Door Hardware/h2> p>Our door hardware center offers a full set of first-class hardware for doors and windows. We provide everything from door handles and knobs to hinges and locks. Our decorative door hardware products are available in various sizes, materials, and finishes. In case you can’t decide on the right finish, we can provide you with finish samples that will help you choose the best variant for your personal design./p> p>There’s no doubt that with our large assortment, you’ll easily find and buy door hardware that will perfectly suit your overall design./p> /div> /div> /div> /div> /div> div classcontainer pb-5> div classrow> div classcol-lg-9 mx-auto> div classcta-panel card text-center p-3> h2>Buy Door Hardware Now/h2> p>Have you already made a choice and want to purchase the high-quality door hardware at doorhardware.co.uk? Still have questions related to our door hardware products or terms of delivery? Don’t hesitate to contact us right away to get the comprehensive answers from our experienced team and make an order without further ado!/p> div classcard-footer> a href/contact-us classbtn btn-primary d-inline-block>Contact Us/a> /div> /div> /div> /div> /div> div classpy-5 bg-light> div classcontainer> div classrow> div classcol-lg-12 mx-auto> h2 styletext-align:center>Customer Reviews/h2> !-- TrustBox widget - Slider --> div classtrustpilot-widget data-localeen-GB data-template-id54ad5defc6454f065c28af8b data-businessunit-id5ce74ccec165250001e45785 data-style-height240px data-style-width100% data-themelight data-stars1,2,3,4,5 data-review-languagesen> a hrefhttps://uk.trustpilot.com/review/doorhardware.co.uk target_blank relnoopener>Trustpilot/a> /div> !-- End TrustBox widget --> /div> /div> /div> /div> div classintro-panel py-5> div classcontainer text-center text-white> div iddivmail namedivmail> input name_mailSubject typehidden valueSubscription Request from www.doorhardware.co.uk /> input name_recipients typehidden valuenamita@m-marcus.com /> input name_headline typehidden valueSubscription Request from www.doorhardware.co.uk /> input name_cc typehidden value /> input name_FromEmail typehidden valueinfo@doorhardware.co.uk /> h2>Join our mailing list/h2> p> Want to be the first to know everything about our newest cabinet, window & door hardware products?br /> Sign up to our newsletter for product updates and launches to get the most recent information right into your inbox. /p> div classrow justify-content-center align-items-center> div classform-group col-lg-3> input classform-control data-valtrue data-val-requiredEnter First Name idmail_first_name maxlength150 name-First_Name placeholderFirst Name * typetext value /> label iderror_First_Name classtext-white>/label> /div> div classform-group col-lg-3> input classform-control data-valtrue data-val-requiredEnter Last Name idmail_last_name maxlength150 name-Last_Name placeholderLast Name * typetext value /> label iderror_Last_Name classtext-white>/label> /div> div classform-group col-lg-3> input classform-control data-valtrue data-val-emailPlease Enter Valid Email Id data-val-requiredEnter Email Id idmail_email maxlength150 name-Email placeholderEmail Id * typetext value /> label iderror_Email classtext-white>/label> /div> div classclearfix w-100>/div> div classform-group col-lg-3> div classd-block>div classd-inline-block>div classmvc-captcha bg-light justify-content-center>script typetext/javascript>$(function () {$(#1388efcc2734435fb914f96d3543a185).show();});function ______d27d423afa5645c78a5cd8af054d01db________() { $(#1388efcc2734435fb914f96d3543a185).hide(); $.post(/DefaultCaptcha/Refresh, { t: $(#CaptchaDeText).val() }, function(){$(#1388efcc2734435fb914f96d3543a185).show();}); return false; }/script> br/>img idCaptchaImage src/DefaultCaptcha/Generate?t0e0399f2f3d34eb8b4fe307796c34473/>input idCaptchaDeText nameCaptchaDeText typehidden value0e0399f2f3d34eb8b4fe307796c34473 /> br/>a href#CaptchaImage id1388efcc2734435fb914f96d3543a185 onclick______d27d423afa5645c78a5cd8af054d01db________() styledisplay:none;>Refresh/a>br/>br/>input autocompleteoff autocorrectoff data-valtrue data-val-requiredPlease Enter Captcha. idCaptchaInputText nameCaptchaInputText typetext value />br/>/div>/div>/div> span classfield-validation-valid text-white data-valmsg-forCaptchaInputText data-valmsg-replacetrue>/span> label iderror_captcha classtext-white styledisplay:none>/label> /div> div classform-group col-lg-3> button classbtn btn-outline-light btn-lg typesubmit idbtnmail1 onclickreturn NewsletterValidations();>i classfa fa-paper-plane mr-2 aria-hiddentrue>/i>Sign Up/button> /div> div classclearfix w-100>/div> p classtext-center>By joining our mailing list you agree to our a hrefpolicies/privacy-policy classtext-white>u>privacy policy/u>/a>./p> /div> /div> /div> /div> !-- Body Panel --> div classclearfix>/div>/form>!-- Slider -->link href/slider/css/style.css relstylesheet mediascreen and (min-width:767px) />script src/slider/js/jquery.themepunch.tools.min.js deferdefer>/script>script> if ($(window).width() > 767) { // document.write(script srcslider/js/jquery.themepunch.tools.min.js deferdefer>\/script>); jQuery(document).ready(function () { jQuery(.tp-banner).show().revolution({ dottedOverlay: none, delay: 6000, startwidth: 1600, startheight: 390, autoHeight: on, fullWidth: off, fullScreen: off, fullScreenAlignForce: off, navigationType: none, hideThumbs: 200, hideThumbsOnMobile: on, hideBulletsOnMobile: on, hideArrowsOnMobile: off, hideThumbsUnderResoluition: 787, navigationStyle: round, navigationType: bullet, navigationArrows: round, navigationHAlign: center, navigationVAlign: bottom, navigationHOffset: 0, navigationVOffset: 20, touchenabled: on, onHoverStop: on, keyboardNavigation: on, spinner: off, hideTimerBar: on, fullScreenOffsetContainer: #headerpan }); }); } else { $(.tp-banner).remove(); }/script>!-- Popup Roadblock -->!-- Cookies Popup -->link href/Content/cookies.css relstylesheet />script src/Scripts/cookiepopup.js>/script>script typetext/javascript> $(document).ready(function () { // Cookies var options { title: This website uses cookies to improve your experience. Well assume youre ok with this, but you can opt-out if you wish., //text: By using this site, you agree to our use of cookies., theme: dark, learnMore: More info, position: bottom, learnMore: false, onAccept: acceptCallbackFunction }; var cookie setTimeout(function () { ($.acceptCookies(options)) }, 1500); }); var acceptCallbackFunction function () { $(.cookie-indicator).removeClass(badge-danger).addClass(badge-success).text(Cookie saved); }/script>!-- Video -->script src/Scripts/jquery.ytplayer.min.js deferdefer>/script>script> if ($(window).width() > 767) { // document.write(script srcScripts/jquery.ytplayer.min.js deferdefer>\/script>); $(document).ready(function () { $(.player).mb_YTPlayer(); }); }/script>script src/Scripts/jquery.validate.min.js>/script>script src/Scripts/jquery.validate.unobtrusive.min.js>/script>script src/Scripts/jquery-confirm.js>/script>script src/Scripts/fakeloader.js>/script>script src/js_functions/Home.js>/script>script typetext/javascript> $(#btnmail).on(click, function () { if ($(#formadd).valid()) { // do something here when the form is valid } else { $.alert({ title: , content: $(.validation-summary-errors).html(), onAction: function () { } }); } });/script> !-- :: BODY :: --> div classpush>/div> /div> !-- :: FOOTER :: --> footer classfooter> a href# classscrollup titleScroll Back to Top>i classfa fa-arrow-up aria-hiddentrue>/i>/a> div classftr-top d-none d-md-block> div classcontainer> div classrow align-items-center> div classcol-12 col-lg-4> div classftr-icon d-flex align-items-center> div classicon> img src/images/icon-delivery.png width128 height128 loadinglazy classimg-fluid altDelivery titleDelivery /> /div> div classicon-text> b>UK Mainland Delivery:/b>br /> £5.50 delivery on orders under b>£50/b>.br /> /div> /div> /div> div classcol-12 col-lg-4> a hrefhttps://doorhardware.co.uk/policies/delivery-policy classftr-icon d-flex align-items-center> div classicon> img src/images/icon-worldwide.png width128 height128 loadinglazy classimg-fluid altShipping Rates titleShipping Rates /> /div> div classicon-text> b>International Delivery:/b>br /> View Shipping Rates for Northern Ireland, Scottish Highlands, Republic of Ireland and other countries /div> /a> /div> div classcol-12 col-lg-4> div classimg-payment> img src/images/icon-pay-options-ftr.png width360 height64 loadinglazy altPayment Options titlePayment Options classimg-fluid /> /div> /div> /div> /div> /div> div classftr-middle> div classcontainer> div classrow> div classcol-12 col-lg-9 col-xl-8 order-lg-2> div classd-sm-flex ftr-link-panel justify-content-between> ul classlist-unstyled ftr-links ftr-link d-none d-sm-block> li classfhead >Product Categories/li> li>a href/category/door-handles.aspx>p>Door Handles/p>/a>/li> li>a href/category/door-knobs.aspx>p>Door Knobs/p>/a>/li> li>a href/category/cabinet-handles.aspx>p>Cabinet Pulls/p>/a>/li> li>a href/products/cabinet-knobs.aspx>p>Cabinet Knobs/p>/a>/li> li>a href/products/flush-pulls.aspx>p>Flush Pulls/p>/a>/li> li>a href/category/pull-handles.aspx>p>Door Pulls/p>/a>/li> li>a href/category/external-door-hardware.aspx>p>Door Furniture/p>/a>/li> li>a href/category/window-hardware.aspx>p>Window Hardware/p>/a>/li> li>a href/products/hinges.aspx>p>Hinges/p>/a>/li> li>a href/category/door-security-products.aspx>p>Locks & Latches/p>/a>/li> li>a href/category/bathroom-fittings.aspx>p>Bathroom/p>/a>/li> li>a href/doorhardware-uses/kitchen-door-hardware.aspx>p>Kitchen/p>/a>/li> li>a href/ElectricalAccessory>p>Switches & Sockets/p>/a>/li> /ul> ul classlist-unstyled ftr-links ftr-link d-none d-md-block> li classfhead>View Products/li> li>a href/material>View by Material/a>/li> li>a href/finish>View by Finish/a>/li> li>a href/brand>View by Brand/a>/li> li>a href/collections>View by Collection/a>/li> /ul> ul classlist-unstyled ftr-links ftr-link> li classfhead>Policies/li> li>a href/policies/privacy-policy>Privacy Policy/a>/li> li>a href/policies/refund-policy>Returns and Refund Policy/a>/li> li>a href/policies/delivery-policy>Delivery Policy/a>/li> li>a href/policies/cookies-policy>Cookies Policy/a>/li> li>a href/policies/terms-conditions>Terms & Conditions/a>/li> /ul> ul classlist-unstyled ftr-links ftr-link> li classfhead>Quick Links/li> li>a hrefhttps://www.doorhardware.co.uk/>Home/a>/li> li>a href/door-furniture-accessories-about-us>About Us/a>/li> li>a href/contact-us>Contact Us/a>/li> li>a href/faqs>FAQs/a>/li> li>a href/technical-information>Technical Information/a>/li> li>a href/testimonials>Customer Reviews/a>/li> li>a href/inspiration>Inspiration/a>/li> li>a href/Sitemap>Sitemap/a>/li> /ul> /div> /div> div classcol-12 col-lg-3 col-xl-4 order-lg-1> ul classlist-inline ftr-links ftr-link> li classfhead d-none d-lg-block>Ashley Andrews Limited/li> li classpb-2 d-none d-lg-block>11a Narrowboat Way, Dudley DY2 OXQ,br />United Kingdom/li> li classlist-inline-item d-lg-block fa-icon>i classfa fa-envelope aria-hiddentrue>/i>a hrefmailto:info@doorhardware.co.uk>info@doorhardware.co.uk/a>/li> li classlist-inline-item d-lg-block fa-icon>i classfa fa-phone fa-lg aria-hiddentrue>/i>+44 (0)1384 247805br />(Mon-Fri : 08:30 - 4:30 pm)/li> li classlist-inline-item d-lg-block fa-icon>i classfa fa-file-text fa-lg aria-hiddentrue>/i>VAT Registration No:br />194 6739 56/li> /ul> ul classsocial-media d-none d-md-inline-block align-top> li>a hrefhttps://www.facebook.com/Ashley-Andrews-Limited-100772111969492 target_blank relnoopener>i classfa fa-facebook aria-hiddentrue>/i>/a>/li> li>a hrefhttps://www.instagram.com/doorhardware.co.uk/ target_blank relnoopener>i classfa fa-instagram aria-hiddentrue>/i>/a>/li> /ul> !-- TrustBox widget - Review Collector --> div classtrustpilot-widget text-left d-inline-block alignleft data-localeen-GB data-template-id56278e9abfbbba0bdcd568bc data-businessunit-id5ce74ccec165250001e45785 data-style-height52px data-style-width250px data-style-margin0px> a hrefhttps://uk.trustpilot.com/review/doorhardware.co.uk target_blank relnoopener classfloat-left text-left>Trustpilot/a> /div> !-- End TrustBox widget --> div classclearfix w-100>/div> /div> /div> /div> /div> div classftr-bottom> div classcontainer text-center> p classm-0>© doorhardware.co.uk. All rights reserved. /p> /div> /div>/footer>style> .trustpilot-widget .tp-widget-wrapper { text-align: left !important; }/style> !-- :: FOOTER :: --> script src/Scripts/bootstrap.bundle.min.js>/script> script src/Scripts/main.min.js>/script> script src/Scripts/scripts.min.js deferdefer>/script> script src/Scripts/jquery.fancybox.pack.js>/script> script src/js_functions/compare.js?v1>/script> !-- :: review widget :: --> !-- :: review widget :: --> !-- doo finder --> !-- doo finder --> !-- BEGIN GCR Badge Code --> !-- END GCR Badge Code --> !-- BEGIN GCR Language Code --> !-- END GCR Language Code --> /body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]