text:
#!/usr/bin/env python

"""
Copyright (c) 2006-2016 sqlmap developers (http://sqlmap.org/)
See the file 'doc/COPYING' for copying permission
"""

import binascii
import compiler
import httplib
import json
import keyword
import logging
import re
import socket
import string
import struct
import time
import traceback
import urllib2
import urlparse

try:
    import websocket
    from websocket import WebSocketException
except ImportError:
    class WebSocketException(Exception):
        pass

from extra.safe2bin.safe2bin import safecharencode
from lib.core.agent import agent
from lib.core.common import asciifyUrl
from lib.core.common import calculateDeltaSeconds
from lib.core.common import clearConsoleLine
from lib.core.common import dataToStdout
from lib.core.common import evaluateCode
from lib.core.common import extractRegexResult
from lib.core.common import findMultipartPostBoundary
from lib.core.common import getCurrentThreadData
from lib.core.common import getHeader
from lib.core.common import getHostHeader
from lib.core.common import getRequestHeader
from lib.core.common import getSafeExString
from lib.core.common import getUnicode
from lib.core.common import logHTTPTraffic
from lib.core.common import pushValue
from lib.core.common import popValue
from lib.core.common import randomizeParameterValue
from lib.core.common import randomInt
from lib.core.common import randomStr
from lib.core.common import readInput
from lib.core.common import removeReflectiveValues
from lib.core.common import singleTimeLogMessage
from lib.core.common import singleTimeWarnMessage
from lib.core.common import stdev
from lib.core.common import wasLastResponseDelayed
from lib.core.common import unicodeencode
from lib.core.common import urldecode
from lib.core.common import urlencode
from lib.core.data import conf
from lib.core.data import kb
from lib.core.data import logger
from lib.core.dicts import POST_HINT_CONTENT_TYPES
from lib.core.enums import ADJUST_TIME_DELAY
from lib.core.enums import AUTH_TYPE
from lib.core.enums import CUSTOM_LOGGING
from lib.core.enums import HTTP_HEADER
from lib.core.enums import HTTPMETHOD
from lib.core.enums import NULLCONNECTION
from lib.core.enums import PAYLOAD
from lib.core.enums import PLACE
from lib.core.enums import POST_HINT
from lib.core.enums import REDIRECTION
from lib.core.enums import WEB_API
from lib.core.exception import SqlmapCompressionException
from lib.core.exception import SqlmapConnectionException
from lib.core.exception import SqlmapGenericException
from lib.core.exception import SqlmapSyntaxException
from lib.core.exception import SqlmapTokenException
from lib.core.exception import SqlmapValueException
from lib.core.settings import ASTERISK_MARKER
from lib.core.settings import BOUNDARY_BACKSLASH_MARKER
from lib.core.settings import CUSTOM_INJECTION_MARK_CHAR
from lib.core.settings import DEFAULT_CONTENT_TYPE
from lib.core.settings import DEFAULT_COOKIE_DELIMITER
from lib.core.settings import DEFAULT_GET_POST_DELIMITER
from lib.core.settings import EVALCODE_KEYWORD_SUFFIX
from lib.core.settings import HTTP_ACCEPT_HEADER_VALUE
from lib.core.settings import HTTP_ACCEPT_ENCODING_HEADER_VALUE
from lib.core.settings import MAX_CONNECTION_CHUNK_SIZE
from lib.core.settings import MAX_CONNECTIONS_REGEX
from lib.core.settings import MAX_CONNECTION_TOTAL_SIZE
from lib.core.settings import META_REFRESH_REGEX
from lib.core.settings import MIN_TIME_RESPONSES
from lib.core.settings import IS_WIN
from lib.core.settings import LARGE_CHUNK_TRIM_MARKER
from lib.core.settings import PAYLOAD_DELIMITER
from lib.core.settings import PERMISSION_DENIED_REGEX
from lib.core.settings import PLAIN_TEXT_CONTENT_TYPE
from lib.core.settings import RANDOM_INTEGER_MARKER
from lib.core.settings import RANDOM_STRING_MARKER
from lib.core.settings import REPLACEMENT_MARKER
from lib.core.settings import TEXT_CONTENT_TYPE_REGEX
from lib.core.settings import UNENCODED_ORIGINAL_VALUE
from lib.core.settings import URI_HTTP_HEADER
from lib.core.settings import WARN_TIME_STDEV
from lib.request.basic import decodePage
from lib.request.basic import forgeHeaders
from lib.request.basic import processResponse
from lib.request.direct import direct
from lib.request.comparison import comparison
from lib.request.methodrequest import MethodRequest
from thirdparty.multipart import multipartpost
from thirdparty.odict.odict import OrderedDict
from thirdparty.socks.socks import ProxyError

class Connect(object):
    """
    This class defines methods used to perform HTTP requests
    """

    @staticmethod
    def _getPageProxy(**kwargs):
        return Connect.getPage(**kwargs)

    @staticmethod
    def _retryProxy(**kwargs):
        threadData = getCurrentThreadData()
        threadData.retriesCount += 1

        if conf.proxyList and threadData.retriesCount >= conf.retries:
            warnMsg = "changing proxy"
            logger.warn(warnMsg)

            conf.proxy = None
            threadData.retriesCount = 0

            setHTTPHandlers()

        if kb.testMode and kb.previousMethod == PAYLOAD.METHOD.TIME:
            # timed based payloads can cause web server unresponsiveness
            # if the injectable piece of code is some kind of JOIN-like query
            warnMsg = "most probably web server instance hasn't recovered yet "
            warnMsg += "from previous timed based payload. If the problem "
            warnMsg += "persists please wait for few minutes and rerun "
            warnMsg += "without flag T in option '--technique' "
            warnMsg += "(e.g. '--flush-session --technique=BEUS') or try to "
            warnMsg += "lower the value of option '--time-sec' (e.g. '--time-sec=2')"
            singleTimeWarnMessage(warnMsg)

        elif kb.originalPage is None:
            if conf.tor:
                warnMsg = "please make sure that you have "
                warnMsg += "Tor installed and running so "
                warnMsg += "you could successfully use "
                warnMsg += "switch '--tor' "
                if IS_WIN:
                    warnMsg += "(e.g. 'https://www.torproject.org/download/download.html.en')"
                else:
                    warnMsg += "(e.g. 'https://help.ubuntu.com/community/Tor')"
            else:
                warnMsg = "if the problem persists please check that the provided "
                warnMsg += "target URL is valid. In case that it is, you can try to rerun "
                warnMsg += "with the switch '--random-agent' turned on "
                warnMsg += "and/or proxy switches ('--ignore-proxy', '--proxy',...)"
            singleTimeWarnMessage(warnMsg)

        elif conf.threads > 1:
            warnMsg = "if the problem persists please try to lower "
            warnMsg += "the number of used threads (option '--threads')"
            singleTimeWarnMessage(warnMsg)

        kwargs['retrying'] = True
        return Connect._getPageProxy(**kwargs)

    @staticmethod
    def _connReadProxy(conn):
        retVal = ""

        if not kb.dnsMode and conn:
            headers = conn.info()
            if headers and hasattr(headers, "getheader") and (headers.getheader(HTTP_HEADER.CONTENT_ENCODING, "").lower() in ("gzip", "deflate")\
              or "text" not in headers.getheader(HTTP_HEADER.CONTENT_TYPE, "").lower()):
                retVal = conn.read(MAX_CONNECTION_TOTAL_SIZE)
                if len(retVal) == MAX_CONNECTION_TOTAL_SIZE:
                    warnMsg = "large compressed response detected. Disabling compression"
                    singleTimeWarnMessage(warnMsg)
                    kb.pageCompress = False
            else:
                while True:
                    if not conn:
                        break
                    else:
                        _ = conn.read(MAX_CONNECTION_CHUNK_SIZE)

                    if len(_) == MAX_CONNECTION_CHUNK_SIZE:
                        warnMsg = "large response detected. This could take a while"
                        singleTimeWarnMessage(warnMsg)
                        _ = re.sub(r"(?si)%s.+?%s" % (kb.chars.stop, kb.chars.start), "%s%s%s" % (kb.chars.stop, LARGE_CHUNK_TRIM_MARKER, kb.chars.start), _)
                        retVal += _
                    else:
                        retVal += _
                        break

                    if len(retVal) > MAX_CONNECTION_TOTAL_SIZE:
                        warnMsg = "too large response detected. Automatically trimming it"
                        singleTimeWarnMessage(warnMsg)
                        break

        return retVal

    @staticmethod
    def getPage(**kwargs):
        """
        This method connects to the target URL or proxy and returns
        the target URL page content
        """

        if isinstance(conf.delay, (int, float)) and conf.delay > 0:
            time.sleep(conf.delay)

        if conf.offline:
            return None, None, None
        elif conf.dummy:
            return getUnicode(randomStr(int(randomInt()), alphabet=[chr(_) for _ in xrange(256)]), {}, int(randomInt())), None, None

        threadData = getCurrentThreadData()
        with kb.locks.request:
            kb.requestCounter += 1
            threadData.lastRequestUID = kb.requestCounter

        url = kwargs.get("url",                     None) or conf.url
        get = kwargs.get("get",                     None)
        post = kwargs.get("post",                   None)
        method = kwargs.get("method",               None)
        cookie = kwargs.get("cookie",               None)
        ua = kwargs.get("ua",                       None) or conf.agent
        referer = kwargs.get("referer",             None) or conf.referer
        host = kwargs.get("host",                   None) or conf.host
        direct_ = kwargs.get("direct",              False)
        multipart = kwargs.get("multipart",         False)
        silent = kwargs.get("silent",               False)
        raise404 = kwargs.get("raise404",           True)
        timeout = kwargs.get("timeout",             None) or conf.timeout
        auxHeaders = kwargs.get("auxHeaders",       None)
        response = kwargs.get("response",           False)
        ignoreTimeout = kwargs.get("ignoreTimeout", False) or kb.ignoreTimeout
        refreshing = kwargs.get("refreshing",       False)
        retrying = kwargs.get("retrying",           False)
        crawling = kwargs.get("crawling",           False)
        skipRead = kwargs.get("skipRead",           False)

        websocket_ = url.lower().startswith("ws")

        if not urlparse.urlsplit(url).netloc:
            url = urlparse.urljoin(conf.url, url)

        # flag to know if we are dealing with the same target host
        target = reduce(lambda x, y: x == y, map(lambda x: urlparse.urlparse(x).netloc.split(':')[0], [url, conf.url or ""]))

        if not retrying:
            # Reset the number of connection retries
            threadData.retriesCount = 0

        # fix for known issue when urllib2 just skips the other part of provided
        # url splitted with space char while urlencoding it in the later phase
        url = url.replace(" ", "%20")

        conn = None
        code = None
        page = None

        _ = urlparse.urlsplit(url)
        requestMsg = u"HTTP request [#%d]:\n%s " % (threadData.lastRequestUID, method or (HTTPMETHOD.POST if post is not None else HTTPMETHOD.GET))
        requestMsg += ("%s%s" % (_.path or "/", ("?%s" % _.query) if _.query else "")) if not any((refreshing, crawling)) else url
        responseMsg = u"HTTP response "
        requestHeaders = u""
        responseHeaders = None
        logHeaders = u""
        skipLogTraffic = False

        raise404 = raise404 and not kb.ignoreNotFound

        # support for non-latin (e.g. cyrillic) URLs as urllib/urllib2 doesn't
        # support those by default
        url = asciifyUrl(url)

        try:
            socket.setdefaulttimeout(timeout)

            if direct_:
                if '?' in url:
                    url, params = url.split('?', 1)
                    params = urlencode(params)
                    url = "%s?%s" % (url, params)

            elif multipart:
                # Needed in this form because of potential circle dependency
                # problem (option -> update -> connect -> option)
                from lib.core.option import proxyHandler

                multipartOpener = urllib2.build_opener(proxyHandler, multipartpost.MultipartPostHandler)
                conn = multipartOpener.open(unicodeencode(url), multipart)
                page = Connect._connReadProxy(conn) if not skipRead else None
                responseHeaders = conn.info()
                responseHeaders[URI_HTTP_HEADER] = conn.geturl()
                page = decodePage(page, responseHeaders.get(HTTP_HEADER.CONTENT_ENCODING), responseHeaders.get(HTTP_HEADER.CONTENT_TYPE))

                return page

            elif any((refreshing, crawling)):
                pass

            elif target:
                if conf.forceSSL and urlparse.urlparse(url).scheme != "https":
                    url = re.sub("\Ahttp:", "https:", url, re.I)
                    url = re.sub(":80/", ":443/", url, re.I)

                if PLACE.GET in conf.parameters and not get:
                    get = conf.parameters[PLACE.GET]

                    if not conf.skipUrlEncode:
                        get = urlencode(get, limit=True)

                if get:
                    if '?' in url:
                        url = "%s%s%s" % (url, DEFAULT_GET_POST_DELIMITER, get)
                        requestMsg += "%s%s" % (DEFAULT_GET_POST_DELIMITER, get)
                    else:
                        url = "%s?%s" % (url, get)
                        requestMsg += "?%s" % get

                if PLACE.POST in conf.parameters and not post and method != HTTPMETHOD.GET:
                    post = conf.parameters[PLACE.POST]

            elif get:
                url = "%s?%s" % (url, get)
                requestMsg += "?%s" % get

            requestMsg += " %s" % httplib.HTTPConnection._http_vsn_str

            # Prepare HTTP headers
            headers = forgeHeaders({HTTP_HEADER.COOKIE: cookie, HTTP_HEADER.USER_AGENT: ua, HTTP_HEADER.REFERER: referer, HTTP_HEADER.HOST: host})

            if HTTP_HEADER.COOKIE in headers:
                cookie = headers[HTTP_HEADER.COOKIE]

            if kb.authHeader:
                headers[HTTP_HEADER.AUTHORIZATION] = kb.authHeader

            if kb.proxyAuthHeader:
                headers[HTTP_HEADER.PROXY_AUTHORIZATION] = kb.proxyAuthHeader

            if not getHeader(headers, HTTP_HEADER.ACCEPT):
                headers[HTTP_HEADER.ACCEPT] = HTTP_ACCEPT_HEADER_VALUE

            if not getHeader(headers, HTTP_HEADER.HOST) or not target:
                headers[HTTP_HEADER.HOST] = getHostHeader(url)

            if not getHeader(headers, HTTP_HEADER.ACCEPT_ENCODING):
                headers[HTTP_HEADER.ACCEPT_ENCODING] = HTTP_ACCEPT_ENCODING_HEADER_VALUE if kb.pageCompress else "identity"

            if post is not None and not getHeader(headers, HTTP_HEADER.CONTENT_TYPE):
                headers[HTTP_HEADER.CONTENT_TYPE] = POST_HINT_CONTENT_TYPES.get(kb.postHint, DEFAULT_CONTENT_TYPE)

            if headers.get(HTTP_HEADER.CONTENT_TYPE) == POST_HINT_CONTENT_TYPES[POST_HINT.MULTIPART]:
                warnMsg = "missing 'boundary parameter' in '%s' header. " % HTTP_HEADER.CONTENT_TYPE
                warnMsg += "Will try to reconstruct"
                singleTimeWarnMessage(warnMsg)

                boundary = findMultipartPostBoundary(conf.data)
                if boundary:
                    headers[HTTP_HEADER.CONTENT_TYPE] = "%s; boundary=%s" % (headers[HTTP_HEADER.CONTENT_TYPE], boundary)

            if conf.keepAlive:
                headers[HTTP_HEADER.CONNECTION] = "keep-alive"

            # Reset header values to original in case of provided request file
            if target and conf.requestFile:
                headers = OrderedDict(conf.httpHeaders)
                if cookie:
                    headers[HTTP_HEADER.COOKIE] = cookie

            if auxHeaders:
                for key, value in auxHeaders.items():
                    for _ in headers.keys():
                        if _.upper() == key.upper():
                            del headers[_]
                    headers[key] = value

            for key, value in headers.items():
                del headers[key]
                value = unicodeencode(value, kb.pageEncoding)
                for char in (r"\r", r"\n"):
                    value = re.sub(r"(%s)([^ \t])" % char, r"\g<1>\t\g<2>", value)
                headers[unicodeencode(key, kb.pageEncoding)] = value.strip("\r\n")

            url = unicodeencode(url)
            post = unicodeencode(post)

            if websocket_:
                ws = websocket.WebSocket()
                ws.connect(url, header=("%s: %s" % _ for _ in headers.items() if _[0] not in ("Host",)), cookie=cookie)  # WebSocket will add Host field of headers automatically
                ws.send(urldecode(post or ""))
                page = ws.recv()
                ws.close()
                code = ws.status
                status = httplib.responses[code]
                class _(dict):
                    pass
                responseHeaders = _(ws.getheaders())
                responseHeaders.headers = ["%s: %s\r\n" % (_[0].capitalize(), _[1]) for _ in responseHeaders.items()]

                requestHeaders += "\n".join("%s: %s" % (getUnicode(key.capitalize() if isinstance(key, basestring) else key), getUnicode(value)) for (key, value) in responseHeaders.items())
                requestMsg += "\n%s" % requestHeaders

                if post is not None:
                    requestMsg += "\n\n%s" % getUnicode(post)

                requestMsg += "\n"

                threadData.lastRequestMsg = requestMsg

                logger.log(CUSTOM_LOGGING.TRAFFIC_OUT, requestMsg)
            else:
                if method and method not in (HTTPMETHOD.GET, HTTPMETHOD.POST):
                    method = unicodeencode(method)
                    req = MethodRequest(url, post, headers)
                    req.set_method(method)
                else:
                    req = urllib2.Request(url, post, headers)

                requestHeaders += "\n".join("%s: %s" % (getUnicode(key.capitalize() if isinstance(key, basestring) else key), getUnicode(value)) for (key, value) in req.header_items())

                if not getRequestHeader(req, HTTP_HEADER.COOKIE) and conf.cj:
                    conf.cj._policy._now = conf.cj._now = int(time.time())
                    cookies = conf.cj._cookies_for_request(req)
                    requestHeaders += "\n%s" % ("Cookie: %s" % ";".join("%s=%s" % (getUnicode(cookie.name), getUnicode(cookie.value)) for cookie in cookies))

                if post is not None:
                    if not getRequestHeader(req, HTTP_HEADER.CONTENT_LENGTH):
                        requestHeaders += "\n%s: %d" % (string.capwords(HTTP_HEADER.CONTENT_LENGTH), len(post))

                if not getRequestHeader(req, HTTP_HEADER.CONNECTION):
                    requestHeaders += "\n%s: close" % HTTP_HEADER.CONNECTION

                requestMsg += "\n%s" % requestHeaders

                if post is not None:
                    requestMsg += "\n\n%s" % getUnicode(post)

                requestMsg += "\n"

                threadData.lastRequestMsg = requestMsg

                logger.log(CUSTOM_LOGGING.TRAFFIC_OUT, requestMsg)

                if conf.cj:
                    for cookie in conf.cj:
                        if cookie.value is None:
                            cookie.value = ""
                        else:
                            for char in (r"\r", r"\n"):
                                cookie.value = re.sub(r"(%s)([^ \t])" % char, r"\g<1>\t\g<2>", cookie.value)

                conn = urllib2.urlopen(req)

                if not kb.authHeader and getRequestHeader(req, HTTP_HEADER.AUTHORIZATION) and (conf.authType or "").lower() == AUTH_TYPE.BASIC.lower():
                    kb.authHeader = getRequestHeader(req, HTTP_HEADER.AUTHORIZATION)

                if not kb.proxyAuthHeader and getRequestHeader(req, HTTP_HEADER.PROXY_AUTHORIZATION):
                    kb.proxyAuthHeader = getRequestHeader(req, HTTP_HEADER.PROXY_AUTHORIZATION)

                # Return response object
                if response:
                    return conn, None, None

                # Get HTTP response
                if hasattr(conn, 'redurl'):
                    page = (threadData.lastRedirectMsg[1] if kb.redirectChoice == REDIRECTION.NO\
                    else Connect._connReadProxy(conn)) if not skipRead else None
                    skipLogTraffic = kb.redirectChoice == REDIRECTION.NO
                    code = conn.redcode
                else:
                    page = Connect._connReadProxy(conn) if not skipRead else None

                code = code or conn.code
                responseHeaders = conn.info()
                responseHeaders[URI_HTTP_HEADER] = conn.geturl()
                page = decodePage(page, responseHeaders.get(HTTP_HEADER.CONTENT_ENCODING), responseHeaders.get(HTTP_HEADER.CONTENT_TYPE))
                status = getUnicode(conn.msg)

            if extractRegexResult(META_REFRESH_REGEX, page) and not refreshing:
                refresh = extractRegexResult(META_REFRESH_REGEX, page)

                debugMsg = "got HTML meta refresh header"
                logger.debug(debugMsg)

                if kb.alwaysRefresh is None:
                    msg = "sqlmap got a refresh request "
                    msg += "(redirect like response common to login pages). "
                    msg += "Do you want to apply the refresh "
                    msg += "from now on (or stay on the original page)? [Y/n]"
                    choice = readInput(msg, default="Y")

                    kb.alwaysRefresh = choice not in ("n", "N")

                if kb.alwaysRefresh:
                    if re.search(r"\Ahttps?://", refresh, re.I):
                        url = refresh
                    else:
                        url = urlparse.urljoin(url, refresh)

                    threadData.lastRedirectMsg = (threadData.lastRequestUID, page)
                    kwargs['refreshing'] = True
                    kwargs['url'] = url
                    kwargs['get'] = None
                    kwargs['post'] = None

                    try:
                        return Connect._getPageProxy(**kwargs)
                    except SqlmapSyntaxException:
                        pass

            # Explicit closing of connection object
            if conn and not conf.keepAlive:
                try:
                    if hasattr(conn.fp, '_sock'):
                        conn.fp._sock.close()
                    conn.close()
                except Exception, ex:
                    warnMsg = "problem occurred during connection closing ('%s')" % getSafeExString(ex)
                    logger.warn(warnMsg)

        except urllib2.HTTPError, ex:
            page = None
            responseHeaders = None

            try:
                page = ex.read() if not skipRead else None
                responseHeaders = ex.info()
                responseHeaders[URI_HTTP_HEADER] = ex.geturl()
                page = decodePage(page, responseHeaders.get(HTTP_HEADER.CONTENT_ENCODING), responseHeaders.get(HTTP_HEADER.CONTENT_TYPE))
            except socket.timeout:
                warnMsg = "connection timed out while trying "
                warnMsg += "to get error page information (%d)" % ex.code
                logger.warn(warnMsg)
                return None, None, None
            except KeyboardInterrupt:
                raise
            except:
                pass
            finally:
                page = page if isinstance(page, unicode) else getUnicode(page)

            code = ex.code

            kb.originalCode = kb.originalCode or code
            threadData.lastHTTPError = (threadData.lastRequestUID, code)
            kb.httpErrorCodes[code] = kb.httpErrorCodes.get(code, 0) + 1

            status = getUnicode(ex.msg)
            responseMsg += "[#%d] (%d %s):\n" % (threadData.lastRequestUID, code, status)

            if responseHeaders:
                logHeaders = "\n".join("%s: %s" % (getUnicode(key.capitalize() if isinstance(key, basestring) else key), getUnicode(value)) for (key, value) in responseHeaders.items())

            logHTTPTraffic(requestMsg, "%s%s\n\n%s" % (responseMsg, logHeaders, (page or "")[:MAX_CONNECTION_CHUNK_SIZE]))

            skipLogTraffic = True

            if conf.verbose <= 5:
                responseMsg += getUnicode(logHeaders)
            elif conf.verbose > 5:
                responseMsg += "%s\n\n%s" % (logHeaders, (page or "")[:MAX_CONNECTION_CHUNK_SIZE])

            logger.log(CUSTOM_LOGGING.TRAFFIC_IN, responseMsg)

            if ex.code == httplib.UNAUTHORIZED and not conf.ignore401:
                errMsg = "not authorized, try to provide right HTTP "
                errMsg += "authentication type and valid credentials (%d)" % code
                raise SqlmapConnectionException(errMsg)
            elif ex.code == httplib.NOT_FOUND:
                if raise404:
                    errMsg = "page not found (%d)" % code
                    raise SqlmapConnectionException(errMsg)
                else:
                    debugMsg = "page not found (%d)" % code
                    singleTimeLogMessage(debugMsg, logging.DEBUG)
                    processResponse(page, responseHeaders)
            elif ex.code == httplib.GATEWAY_TIMEOUT:
                if ignoreTimeout:
                    return None, None, None
                else:
                    warnMsg = "unable to connect to the target URL (%d - %s)" % (ex.code, httplib.responses[ex.code])
                    if threadData.retriesCount < conf.retries and not kb.threadException:
                        warnMsg += ". sqlmap is going to retry the request"
                        logger.critical(warnMsg)
                        return Connect._retryProxy(**kwargs)
                    elif kb.testMode:
                        logger.critical(warnMsg)
                        return None, None, None
                    else:
                        raise SqlmapConnectionException(warnMsg)
            else:
                debugMsg = "got HTTP error code: %d (%s)" % (code, status)
                logger.debug(debugMsg)

        except (urllib2.URLError, socket.error, socket.timeout, httplib.HTTPException, struct.error, binascii.Error, ProxyError, SqlmapCompressionException, WebSocketException, TypeError):
            tbMsg = traceback.format_exc()

            if "no host given" in tbMsg:
                warnMsg = "invalid URL address used (%s)" % repr(url)
                raise SqlmapSyntaxException(warnMsg)
            elif "forcibly closed" in tbMsg or "Connection is already closed" in tbMsg:
                warnMsg = "connection was forcibly closed by the target URL"
            elif "timed out" in tbMsg:
                if not conf.disablePrecon:
                    singleTimeWarnMessage("turning off pre-connect mechanism because of connection time out(s)")
                    conf.disablePrecon = True

                    if kb.testMode and kb.testType not in (PAYLOAD.TECHNIQUE.TIME, PAYLOAD.TECHNIQUE.STACKED):
                        kb.responseTimes.clear()

                if kb.testMode and kb.testType not in (None, PAYLOAD.TECHNIQUE.TIME, PAYLOAD.TECHNIQUE.STACKED):
                    singleTimeWarnMessage("there is a possibility that the target (or WAF) is dropping 'suspicious' requests")
                warnMsg = "connection timed out to the target URL"
            elif "URLError" in tbMsg or "error" in tbMsg:
                warnMsg = "unable to connect to the target URL"
            elif "NTLM" in tbMsg:
                warnMsg = "there has been a problem with NTLM authentication"
            elif "BadStatusLine" in tbMsg:
                warnMsg = "connection dropped or unknown HTTP "
                warnMsg += "status code received"
                if not conf.agent and not conf.randomAgent:
                    warnMsg += ". Try to force the HTTP User-Agent "
                    warnMsg += "header with option '--user-agent' or switch '--random-agent'"
            elif "IncompleteRead" in tbMsg:
                warnMsg = "there was an incomplete read error while retrieving data "
                warnMsg += "from the target URL"
            elif "Handshake status" in tbMsg:
                status = re.search("Handshake status ([\d]{3})", tbMsg)
                errMsg = "websocket handshake status %s" % status.group(1) if status else "unknown"
                raise SqlmapConnectionException(errMsg)
            else:
                warnMsg = "unable to connect to the target URL"

            if "BadStatusLine" not in tbMsg:
                warnMsg += " or proxy"

            if silent:
                return None, None, None
            elif "forcibly closed" in tbMsg:
                logger.critical(warnMsg)
                return None, None, None
            elif ignoreTimeout and any(_ in tbMsg for _ in ("timed out", "IncompleteRead")):
                return None, None, None
            elif threadData.retriesCount < conf.retries and not kb.threadException:
                warnMsg += ". sqlmap is going to retry the request"
                if not retrying:
                    warnMsg += "(s)"
                    logger.critical(warnMsg)
                else:
                    logger.debug(warnMsg)
                return Connect._retryProxy(**kwargs)
            elif kb.testMode:
                logger.critical(warnMsg)
                return None, None, None
            else:
                raise SqlmapConnectionException(warnMsg)

        finally:
            if isinstance(page, basestring) and not isinstance(page, unicode):
                if HTTP_HEADER.CONTENT_TYPE in (responseHeaders or {}) and not re.search(TEXT_CONTENT_TYPE_REGEX, responseHeaders[HTTP_HEADER.CONTENT_TYPE]):
                    page = unicode(page, errors="ignore")
                else:
                    page = getUnicode(page)
            socket.setdefaulttimeout(conf.timeout)

        processResponse(page, responseHeaders)

        if conn and getattr(conn, "redurl", None):
            _ = urlparse.urlsplit(conn.redurl)
            _ = ("%s%s" % (_.path or "/", ("?%s" % _.query) if _.query else ""))
            requestMsg = re.sub("(\n[A-Z]+ ).+?( HTTP/\d)", "\g<1>%s\g<2>" % getUnicode(_).replace("\\", "\\\\"), requestMsg, 1)

            if kb.resendPostOnRedirect is False:
                requestMsg = re.sub("(\[#\d+\]:\n)POST ", "\g<1>GET ", requestMsg)
                requestMsg = re.sub("(?i)Content-length: \d+\n", "", requestMsg)
                requestMsg = re.sub("(?s)\n\n.+", "\n", requestMsg)

            responseMsg += "[#%d] (%d %s):\n" % (threadData.lastRequestUID, conn.code, status)
        else:
            responseMsg += "[#%d] (%d %s):\n" % (threadData.lastRequestUID, code, status)

        if responseHeaders:
            logHeaders = "\n".join("%s: %s" % (getUnicode(key.capitalize() if isinstance(key, basestring) else key), getUnicode(value)) for (key, value) in responseHeaders.items())

        if not skipLogTraffic:
            logHTTPTraffic(requestMsg, "%s%s\n\n%s" % (responseMsg, logHeaders, (page or "")[:MAX_CONNECTION_CHUNK_SIZE]))

        if conf.verbose <= 5:
            responseMsg += getUnicode(logHeaders)
        elif conf.verbose > 5:
            responseMsg += "%s\n\n%s" % (logHeaders, (page or "")[:MAX_CONNECTION_CHUNK_SIZE])

        logger.log(CUSTOM_LOGGING.TRAFFIC_IN, responseMsg)

        return page, responseHeaders, code

    @staticmethod
    def queryPage(value=None, place=None, content=False, getRatioValue=False, silent=False, method=None, timeBasedCompare=False, noteResponseTime=True, auxHeaders=None, response=False, raise404=None, removeReflection=True):
        """
        This method calls a function to get the target URL page content
        and returns its page MD5 hash or a boolean value in case of
        string match check ('--string' command line parameter)
        """

        if conf.direct:
            return direct(value, content)

        get = None
        post = None
        cookie = None
        ua = None
        referer = None
        host = None
        page = None
        pageLength = None
        uri = None
        code = None

        if not place:
            place = kb.injection.place or PLACE.GET

        if not auxHeaders:
            auxHeaders = {}

        raise404 = place != PLACE.URI if raise404 is None else raise404
        method = method or conf.method

        value = agent.adjustLateValues(value)
        payload = agent.extractPayload(value)
        threadData = getCurrentThreadData()

        if conf.httpHeaders:
            headers = OrderedDict(conf.httpHeaders)
            contentType = max(headers[_] if _.upper() == HTTP_HEADER.CONTENT_TYPE.upper() else None for _ in headers.keys())

            if (kb.postHint or conf.skipUrlEncode) and kb.postUrlEncode:
                kb.postUrlEncode = False
                conf.httpHeaders = [_ for _ in conf.httpHeaders if _[1] != contentType]
                contentType = POST_HINT_CONTENT_TYPES.get(kb.postHint, PLAIN_TEXT_CONTENT_TYPE)
                conf.httpHeaders.append((HTTP_HEADER.CONTENT_TYPE, contentType))

        if payload:
            if kb.tamperFunctions:
                for function in kb.tamperFunctions:
                    try:
                        payload = function(payload=payload, headers=auxHeaders)
                    except Exception, ex:
                        errMsg = "error occurred while running tamper "
                        errMsg += "function '%s' ('%s')" % (function.func_name, getSafeExString(ex))
                        raise SqlmapGenericException(errMsg)

                    if not isinstance(payload, basestring):
                        errMsg = "tamper function '%s' returns " % function.func_name
                        errMsg += "invalid payload type ('%s')" % type(payload)
                        raise SqlmapValueException(errMsg)

                value = agent.replacePayload(value, payload)

            logger.log(CUSTOM_LOGGING.PAYLOAD, safecharencode(payload.replace('\\', BOUNDARY_BACKSLASH_MARKER)).replace(BOUNDARY_BACKSLASH_MARKER, '\\'))

            if place == PLACE.CUSTOM_POST and kb.postHint:
                if kb.postHint in (POST_HINT.SOAP, POST_HINT.XML):
                    # payloads in SOAP/XML should have chars > and < replaced
                    # with their HTML encoded counterparts
                    payload = payload.replace('>', ">").replace('<', "<")
                elif kb.postHint == POST_HINT.JSON:
                    if payload.startswith('"') and payload.endswith('"'):
                        payload = json.dumps(payload[1:-1])
                    else:
                        payload = json.dumps(payload)[1:-1]
                elif kb.postHint == POST_HINT.JSON_LIKE:
                    payload = payload.replace("'", REPLACEMENT_MARKER).replace('"', "'").replace(REPLACEMENT_MARKER, '"')
                    if payload.startswith('"') and payload.endswith('"'):
                        payload = json.dumps(payload[1:-1])
                    else:
                        payload = json.dumps(payload)[1:-1]
                    payload = payload.replace("'", REPLACEMENT_MARKER).replace('"', "'").replace(REPLACEMENT_MARKER, '"')
                value = agent.replacePayload(value, payload)
            else:
                # GET, POST, URI and Cookie payload needs to be thoroughly URL encoded
                if place in (PLACE.GET, PLACE.URI, PLACE.COOKIE) and not conf.skipUrlEncode or place in (PLACE.POST, PLACE.CUSTOM_POST) and kb.postUrlEncode:
                    payload = urlencode(payload, '%', False, place != PLACE.URI)  # spaceplus is handled down below
                    value = agent.replacePayload(value, payload)

            if conf.hpp:
                if not any(conf.url.lower().endswith(_.lower()) for _ in (WEB_API.ASP, WEB_API.ASPX)):
                    warnMsg = "HTTP parameter pollution should work only against "
                    warnMsg += "ASP(.NET) targets"
                    singleTimeWarnMessage(warnMsg)
                if place in (PLACE.GET, PLACE.POST):
                    _ = re.escape(PAYLOAD_DELIMITER)
                    match = re.search("(?P<name>\w+)=%s(?P<value>.+?)%s" % (_, _), value)
                    if match:
                        payload = match.group("value")

                        for splitter in (urlencode(' '), ' '):
                            if splitter in payload:
                                prefix, suffix = ("*/", "/*") if splitter == ' ' else (urlencode(_) for _ in ("*/", "/*"))
                                parts = payload.split(splitter)
                                parts[0] = "%s%s" % (parts[0], suffix)
                                parts[-1] = "%s%s=%s%s" % (DEFAULT_GET_POST_DELIMITER, match.group("name"), prefix, parts[-1])
                                for i in xrange(1, len(parts) - 1):
                                    parts[i] = "%s%s=%s%s%s" % (DEFAULT_GET_POST_DELIMITER, match.group("name"), prefix, parts[i], suffix)
                                payload = "".join(parts)

                        for splitter in (urlencode(','), ','):
                            payload = payload.replace(splitter, "%s%s=" % (DEFAULT_GET_POST_DELIMITER, match.group("name")))

                        value = agent.replacePayload(value, payload)
                else:
                    warnMsg = "HTTP parameter pollution works only with regular "
                    warnMsg += "GET and POST parameters"
                    singleTimeWarnMessage(warnMsg)

        if place:
            value = agent.removePayloadDelimiters(value)

        if PLACE.GET in conf.parameters:
            get = conf.parameters[PLACE.GET] if place != PLACE.GET or not value else value

        if PLACE.POST in conf.parameters:
            post = conf.parameters[PLACE.POST] if place != PLACE.POST or not value else value

        if PLACE.CUSTOM_POST in conf.parameters:
            post = conf.parameters[PLACE.CUSTOM_POST].replace(CUSTOM_INJECTION_MARK_CHAR, "") if place != PLACE.CUSTOM_POST or not value else value
            post = post.replace(ASTERISK_MARKER, '*') if post else post

        if PLACE.COOKIE in conf.parameters:
            cookie = conf.parameters[PLACE.COOKIE] if place != PLACE.COOKIE or not value else value

        if PLACE.USER_AGENT in conf.parameters:
            ua = conf.parameters[PLACE.USER_AGENT] if place != PLACE.USER_AGENT or not value else value

        if PLACE.REFERER in conf.parameters:
            referer = conf.parameters[PLACE.REFERER] if place != PLACE.REFERER or not value else value

        if PLACE.HOST in conf.parameters:
            host = conf.parameters[PLACE.HOST] if place != PLACE.HOST or not value else value

        if PLACE.URI in conf.parameters:
            uri = conf.url if place != PLACE.URI or not value else value
        else:
            uri = conf.url

        if value and place == PLACE.CUSTOM_HEADER:
            auxHeaders[value.split(',')[0]] = value.split(',', 1)[1]

        if conf.csrfToken:
            def _adjustParameter(paramString, parameter, newValue):
                retVal = paramString
                match = re.search("%s=(?P<value>[^&]*)" % re.escape(parameter), paramString)
                if match:
                    retVal = re.sub("%s=[^&]*" % re.escape(parameter), "%s=%s" % (parameter, newValue), paramString)
                return retVal

            page, headers, code = Connect.getPage(url=conf.csrfUrl or conf.url, data=conf.data if conf.csrfUrl == conf.url else None, method=conf.method if conf.csrfUrl == conf.url else None, cookie=conf.parameters.get(PLACE.COOKIE), direct=True, silent=True, ua=conf.parameters.get(PLACE.USER_AGENT), referer=conf.parameters.get(PLACE.REFERER), host=conf.parameters.get(PLACE.HOST))
            match = re.search(r"<input[^>]+name=[\"']?%s[\"']?\s[^>]*value=(\"([^\"]+)|'([^']+)|([^ >]+))" % re.escape(conf.csrfToken), page or "")
            token = (match.group(2) or match.group(3) or match.group(4)) if match else None

            if not token:
                if conf.csrfUrl != conf.url and code == httplib.OK:
                    if headers and "text/plain" in headers.get(HTTP_HEADER.CONTENT_TYPE, ""):
                        token = page

                if not token and conf.cj and any(_.name == conf.csrfToken for _ in conf.cj):
                    for _ in conf.cj:
                        if _.name == conf.csrfToken:
                            token = _.value
                            if not any (conf.csrfToken in _ for _ in (conf.paramDict.get(PLACE.GET, {}), conf.paramDict.get(PLACE.POST, {}))):
                                if post:
                                    post = "%s%s%s=%s" % (post, conf.paramDel or DEFAULT_GET_POST_DELIMITER, conf.csrfToken, token)
                                elif get:
                                    get = "%s%s%s=%s" % (get, conf.paramDel or DEFAULT_GET_POST_DELIMITER, conf.csrfToken, token)
                                else:
                                    get = "%s=%s" % (conf.csrfToken, token)
                            break

                if not token:
                    errMsg = "anti-CSRF token '%s' can't be found at '%s'" % (conf.csrfToken, conf.csrfUrl or conf.url)
                    if not conf.csrfUrl:
                        errMsg += ". You can try to rerun by providing "
                        errMsg += "a valid value for option '--csrf-url'"
                    raise SqlmapTokenException, errMsg

            if token:
                for place in (PLACE.GET, PLACE.POST):
                    if place in conf.parameters:
                        if place == PLACE.GET and get:
                            get = _adjustParameter(get, conf.csrfToken, token)
                        elif place == PLACE.POST and post:
                            post = _adjustParameter(post, conf.csrfToken, token)

                for i in xrange(len(conf.httpHeaders)):
                    if conf.httpHeaders[i][0].lower() == conf.csrfToken.lower():
                        conf.httpHeaders[i] = (conf.httpHeaders[i][0], token)

        if conf.rParam:
            def _randomizeParameter(paramString, randomParameter):
                retVal = paramString
                match = re.search(r"(\A|\b)%s=(?P<value>[^&;]+)" % re.escape(randomParameter), paramString)
                if match:
                    origValue = match.group("value")
                    retVal = re.sub(r"(\A|\b)%s=[^&;]+" % re.escape(randomParameter), "%s=%s" % (randomParameter, randomizeParameterValue(origValue)), paramString)
                return retVal

            for randomParameter in conf.rParam:
                for item in (PLACE.GET, PLACE.POST, PLACE.COOKIE, PLACE.URI, PLACE.CUSTOM_POST):
                    if item in conf.parameters:
                        if item == PLACE.GET and get:
                            get = _randomizeParameter(get, randomParameter)
                        elif item in (PLACE.POST, PLACE.CUSTOM_POST) and post:
                            post = _randomizeParameter(post, randomParameter)
                        elif item == PLACE.COOKIE and cookie:
                            cookie = _randomizeParameter(cookie, randomParameter)
                        elif item == PLACE.URI and uri:
                            uri = _randomizeParameter(uri, randomParameter)

        if conf.evalCode:
            delimiter = conf.paramDel or DEFAULT_GET_POST_DELIMITER
            variables = {"uri": uri, "lastPage": threadData.lastPage, "_locals": locals()}
            originals = {}
            keywords = keyword.kwlist

            if not get and PLACE.URI in conf.parameters:
                query = urlparse.urlsplit(uri).query or ""
            else:
                query = None

            for item in filter(None, (get, post if not kb.postHint else None, query)):
                for part in item.split(delimiter):
                    if '=' in part:
                        name, value = part.split('=', 1)
                        name = re.sub(r"[^\w]", "", name.strip())
                        if name in keywords:
                            name = "%s%s" % (name, EVALCODE_KEYWORD_SUFFIX)
                        value = urldecode(value, convall=True, plusspace=(item==post and kb.postSpaceToPlus))
                        variables[name] = value

            if cookie:
                for part in cookie.split(conf.cookieDel or DEFAULT_COOKIE_DELIMITER):
                    if '=' in part:
                        name, value = part.split('=', 1)
                        name = re.sub(r"[^\w]", "", name.strip())
                        if name in keywords:
                            name = "%s%s" % (name, EVALCODE_KEYWORD_SUFFIX)
                        value = urldecode(value, convall=True)
                        variables[name] = value

            while True:
                try:
                    compiler.parse(conf.evalCode.replace(';', '\n'))
                except SyntaxError, ex:
                    original = replacement = ex.text.strip()
                    for _ in re.findall(r"[A-Za-z_]+", original)[::-1]:
                        if _ in keywords:
                            replacement = replacement.replace(_, "%s%s" % (_, EVALCODE_KEYWORD_SUFFIX))
                            break
                    if original == replacement:
                        conf.evalCode = conf.evalCode.replace(EVALCODE_KEYWORD_SUFFIX, "")
                        break
                    else:
                        conf.evalCode = conf.evalCode.replace(ex.text.strip(), replacement)
                else:
                    break

            originals.update(variables)
            evaluateCode(conf.evalCode, variables)

            for variable in variables.keys():
                if variable.endswith(EVALCODE_KEYWORD_SUFFIX):
                    value = variables[variable]
                    del variables[variable]
                    variables[variable.replace(EVALCODE_KEYWORD_SUFFIX, "")] = value

            uri = variables["uri"]

            for name, value in variables.items():
                if name != "__builtins__" and originals.get(name, "") != value:
                    if isinstance(value, (basestring, int)):
                        found = False
                        value = getUnicode(value)

                        regex = r"((\A|%s)%s=).+?(%s|\Z)" % (re.escape(delimiter), re.escape(name), re.escape(delimiter))
                        if re.search(regex, (get or "")):
                            found = True
                            get = re.sub(regex, "\g<1>%s\g<3>" % value, get)

                        if re.search(regex, (post or "")):
                            found = True
                            post = re.sub(regex, "\g<1>%s\g<3>" % value, post)

                        if re.search(regex, (query or "")):
                            found = True
                            uri = re.sub(regex.replace(r"\A", r"\?"), "\g<1>%s\g<3>" % value, uri)

                        regex = r"((\A|%s)%s=).+?(%s|\Z)" % (re.escape(conf.cookieDel or DEFAULT_COOKIE_DELIMITER), name, re.escape(conf.cookieDel or DEFAULT_COOKIE_DELIMITER))
                        if re.search(regex, (cookie or "")):
                            found = True
                            cookie = re.sub(regex, "\g<1>%s\g<3>" % value, cookie)

                        if not found:
                            if post is not None:
                                post += "%s%s=%s" % (delimiter, name, value)
                            elif get is not None:
                                get += "%s%s=%s" % (delimiter, name, value)
                            elif cookie is not None:
                                cookie += "%s%s=%s" % (conf.cookieDel or DEFAULT_COOKIE_DELIMITER, name, value)

        if not conf.skipUrlEncode:
            get = urlencode(get, limit=True)

        if post is not None:
            if place not in (PLACE.POST, PLACE.CUSTOM_POST) and hasattr(post, UNENCODED_ORIGINAL_VALUE):
                post = getattr(post, UNENCODED_ORIGINAL_VALUE)
            elif kb.postUrlEncode:
                post = urlencode(post, spaceplus=kb.postSpaceToPlus)

        if timeBasedCompare:
            if len(kb.responseTimes.get(kb.responseTimeMode, [])) < MIN_TIME_RESPONSES:
                clearConsoleLine()

                kb.responseTimes.setdefault(kb.responseTimeMode, [])

                if conf.tor:
                    warnMsg = "it's highly recommended to avoid usage of switch '--tor' for "
                    warnMsg += "time-based injections because of its high latency time"
                    singleTimeWarnMessage(warnMsg)

                warnMsg = "[%s] [WARNING] %stime-based comparison requires " % (time.strftime("%X"), "(case) " if kb.responseTimeMode else "")
                warnMsg += "larger statistical model, please wait"
                dataToStdout(warnMsg)

                while len(kb.responseTimes[kb.responseTimeMode]) < MIN_TIME_RESPONSES:
                    value = kb.responseTimePayload.replace(RANDOM_INTEGER_MARKER, str(randomInt(6))).replace(RANDOM_STRING_MARKER, randomStr()) if kb.responseTimePayload else kb.responseTimePayload
                    Connect.queryPage(value=value, content=True, raise404=False)
                    dataToStdout('.')

                dataToStdout(" (done)\n")

            elif not kb.testMode:
                warnMsg = "it is very important to not stress the network adapter "
                warnMsg += "during usage of time-based payloads to prevent potential "
                warnMsg += "disruptions "
                singleTimeWarnMessage(warnMsg)

            if not kb.laggingChecked:
                kb.laggingChecked = True

                deviation = stdev(kb.responseTimes[kb.responseTimeMode])

                if deviation > WARN_TIME_STDEV:
                    kb.adjustTimeDelay = ADJUST_TIME_DELAY.DISABLE

                    warnMsg = "considerable lagging has been detected "
                    warnMsg += "in connection response(s). Please use as high "
                    warnMsg += "value for option '--time-sec' as possible (e.g. "
                    warnMsg += "10 or more)"
                    logger.critical(warnMsg)

        if conf.safeFreq > 0:
            kb.queryCounter += 1
            if kb.queryCounter % conf.safeFreq == 0:
                if conf.safeUrl:
                    Connect.getPage(url=conf.safeUrl, post=conf.safePost, cookie=cookie, direct=True, silent=True, ua=ua, referer=referer, host=host)
                elif kb.safeReq:
                    Connect.getPage(url=kb.safeReq.url, post=kb.safeReq.post, method=kb.safeReq.method, auxHeaders=kb.safeReq.headers)

        start = time.time()

        if kb.nullConnection and not content and not response and not timeBasedCompare:
            noteResponseTime = False

            try:
                pushValue(kb.pageCompress)
                kb.pageCompress = False

                if kb.nullConnection == NULLCONNECTION.HEAD:
                    method = HTTPMETHOD.HEAD
                elif kb.nullConnection == NULLCONNECTION.RANGE:
                    auxHeaders[HTTP_HEADER.RANGE] = "bytes=-1"

                _, headers, code = Connect.getPage(url=uri, get=get, post=post, method=method, cookie=cookie, ua=ua, referer=referer, host=host, silent=silent, auxHeaders=auxHeaders, raise404=raise404, skipRead=(kb.nullConnection == NULLCONNECTION.SKIP_READ))

                if headers:
                    if kb.nullConnection in (NULLCONNECTION.HEAD, NULLCONNECTION.SKIP_READ) and headers.get(HTTP_HEADER.CONTENT_LENGTH):
                        pageLength = int(headers[HTTP_HEADER.CONTENT_LENGTH])
                    elif kb.nullConnection == NULLCONNECTION.RANGE and headers.get(HTTP_HEADER.CONTENT_RANGE):
                        pageLength = int(headers[HTTP_HEADER.CONTENT_RANGE][headers[HTTP_HEADER.CONTENT_RANGE].find('/') + 1:])
            finally:
                kb.pageCompress = popValue()

        if not pageLength:
            try:
                page, headers, code = Connect.getPage(url=uri, get=get, post=post, method=method, cookie=cookie, ua=ua, referer=referer, host=host, silent=silent, auxHeaders=auxHeaders, response=response, raise404=raise404, ignoreTimeout=timeBasedCompare)
            except MemoryError:
                page, headers, code = None, None, None
                warnMsg = "site returned insanely large response"
                if kb.testMode:
                    warnMsg += " in testing phase. This is a common "
                    warnMsg += "behavior in custom WAF/IDS/IPS solutions"
                singleTimeWarnMessage(warnMsg)

        if conf.secondOrder:
            page, headers, code = Connect.getPage(url=conf.secondOrder, cookie=cookie, ua=ua, silent=silent, auxHeaders=auxHeaders, response=response, raise404=False, ignoreTimeout=timeBasedCompare, refreshing=True)

        threadData.lastQueryDuration = calculateDeltaSeconds(start)
        threadData.lastPage = page

        kb.originalCode = kb.originalCode or code

        if kb.testMode:
            kb.testQueryCount += 1

        if timeBasedCompare:
            return wasLastResponseDelayed()
        elif noteResponseTime:
            kb.responseTimes.setdefault(kb.responseTimeMode, [])
            kb.responseTimes[kb.responseTimeMode].append(threadData.lastQueryDuration)

        if not response and removeReflection:
            page = removeReflectiveValues(page, payload)

        kb.maxConnectionsFlag = re.search(MAX_CONNECTIONS_REGEX, page or "", re.I) is not None
        kb.permissionFlag = re.search(PERMISSION_DENIED_REGEX, page or "", re.I) is not None

        if content or response:
            return page, headers

        if getRatioValue:
            return comparison(page, headers, code, getRatioValue=False, pageLength=pageLength), comparison(page, headers, code, getRatioValue=True, pageLength=pageLength)
        else:
            return comparison(page, headers, code, getRatioValue, pageLength)

def setHTTPHandlers():  # Cross-linked function
    raise NotImplementedError


Welcome! The Quintessence Tribe is our very own collaborative of family and friends (all different ages, walks of life, men and women) who are essential oil blenders, users, lovers and perpetual creators of inventive ways to incorporate plant based wellness into every day life.
I don't know about you but the idea of living and being healthier sounds amazing but it's hard. So hard. I've been drinking green smoothies for years and trying my best to sneak chia seeds into my kids' food but let's be honest, all this chemicals in our food talk is overwhelming and even all the talk about oils can seem the same. I get you.
When you think about it thought, your sense of smell/scent is most closely connected with your memory out of all your senses, so attaching certain fragrances to routines and spaces in your life can be quite emotional. But beyond just inhaling certain scents, dōTERRA oils, because of how they are made, can also be used beyond aromatically but also topically and internally. This, for me, has been a game changer. What if I ingested the lavender? Which I began to do and watched things like my perpetual hormonal acne begin to clear. What if I used lavender topically? Which I did on my son's mysterious leg rash after camping in the mountains that the doctors could not seem to diagnose. And guess what? Two days into the application of a blend of lavender and melaleuca my son's rash was GONE after over a week of battling it. I went from just loving a scent to realizing this plant power in liquid form is THE JAM.
New members of our Tribe receive a Quintessence Tribe Burlap Goody Bag (content change monthly)!
I have so many drawers full of supplements, much to my husband's dismay and not only do I hate taking pills but I'm not sure anything I was getting from the health food stores were really doing much. I try to eat my vitamins in my food/smoothies but let's be honest, some days are coffee and pizza and wine and then what? From the time I began taking this pack faithfully I have felt increased energy, better skin, I HAVEN'T GOTTEN SICK and I could go on and on. MUST HAVES.
This is referred to as a GROUNDING BLEND. I'm not a super floral person. This scent, for me, is everything I love about oils. It's a mixture of Spruce Needle/Leaf, Ho Wood, Frankincense Resin, Blue Tansy Flower, and Blue Chamomile Flower essential oils. Diffuse it, use it topically, bathe in it, don't be without it.
It promotes a whole body sense of relaxation, may help ease anxious feelings, and evokes feelings of tranquility and balance.
Every woman on this planet should have this roller ball bottle of magic. I use this several times daily as do many of my friends and family and it's a game changer. It has helped with cramps, mood swings and balancing emotions. This is a topical blend of Clary Sage, Lavender, Bergamot, Roman Chamomile, Cedarwood, Ylang Ylang, Geranium, Fennel, Carrot Seed, Palmarosa, and Vitex. I use it on my temples, neck and even on my stomach for cramps. It's the ultimate weapon for women for sure.
Sign up with your email address to receive recipes, deals, freebies and info on healthy living monthly - all part of our BRANCHES newsletter!
Guatemala is one of the countries impacted by healing hands & it is also a place in which we have personally invested.
HOW DO I BEGIN MY OIL JOURNEY AND "JOIN THE TRIBE"?!
I can help you and provide you with an online community that we have built and bonded that will give you ideas, recipes, suggestions and personalized help! Click below to investigate your options and learn about The Quintessence Tribe burlap goody bag of the month for new tribe members (hint: GOOD STUFF)!


text:
September 30, 2021 Blog
Life After Game Websites
Nonetheless, as the sport progresses, the character may constructed up extra power and powers or otherwise. Whereas at first glance it may seem like a dogfighting recreation, Skydrift Infinity is in fact an arcade-type racer the place the aim is solely to finish first ahead of your opponents. Skydrift Infinity is a remaster of that sport, bringing a visible improve and adding a couple of new planes for good measure. In dewapoker of everything, a sport doesn't need to have been requested en masse by the gaming public to be worthwhile, and Skydrift Infinity is an ideal example of this. As well as they make use of a variety of strategies in relation to story lines and suggestions so to heighten the gaming expertise of the customers. Shares of rival NetEase Inc slumped as a lot as 15.7 p.c, while those of game developer XD Inc and cellular gaming firm GMGE Know-how Group Ltd also plunged.
We much favor a spherical of Tennis when it comes to ball-based mostly net sports, but we suppose you've acquired nothing to lose in firing up Volleyball for a match or two. Nothing groundbreaking, then, however that doesn't really matter when the precise racing feels stable sufficient, like it does here. A surprisingly strong fighter in the road Fighter II mould, maybe Tuff E Nuff's biggest situation is that it is not Street Fighter II. China's largest social media and video sport agency noticed its stock tumble more than 10 % in morning commerce, wiping almost $60bn from its market capitalisation. Additionally site has large options which cowl video blogs from real contributor everywhere in the world. Their games and content cowl a number of platforms, similar to Pc, PS3, XBox 360, 3DS, iPhone, and Android. The odd '90s mix of 12-12 months-previous boy's fantasy and technicolor on the cowl alone makes it worth investigating at least once. It is an extremely simple take on the sport, and not one that'll keep you occupied for any size of time, however at the very least it's fun to see how far we have come. An easy technique to get started with workforce building on-line is to allocate either a whole digital meeting or at the very least a portion of 1 to taking part in on-line staff games.
One of the vital irritating issues anybody can say online is: "Nobody asked for this." It's a cocky, unfairly harsh means of shutting down any new sport that isn't on a person's own particular wishlist, and not solely is it usually disrespectful, it can be totally meaningless. Also known as Operation Logic Bomb: The final word Search & Destroy, Jaleco's sequel to the Fortified Zone titles on the sport Boy is a good top-down romp that sees you gunning down enemies with a wide range of futuristic weaponry. And, since we bought a three-pronged set of protagonists last time – a first for the collection – why can't we've a bit of more selection in our lead characters for GTA 6? In a 2013 interview with The Guardian, Dan Houser explained why a lady wasn't playable in GTA V, and how the crew may make it happen sooner or later. So, as an alternative of risking your money, why don't you strive the way to free obtain these video games?
In-app purchases and micro-transactions have develop into the norm in free games nowadays, withholding content material or irritating you to attempt to make you purchase power-ups. Dare we say it, but lately some of the trials have been fairly respectable titles with relatively high profiles; in the West over the previous month or so we've had Fuser, Amongst Us and most just lately Two Level Hospital. However, not like titles similar to Dracula X: Rondo of Blood and DoReMi Fantasy: Milon's DokiDoki Adventure – each of which are import titles which noticed western release on the Wii – Psycho Dream is not quite the basic that some would have you consider. It reminds us of an airborne model of N64 and Dreamcast basic Hydro Thunder, which also offered arcade-type racing with an unconventional car (a speedboat, in its case) and found itself a cult audience for its big stunts and over-the-top races. Based mostly on the state of the game in 2006, before the Burning Crusade enlargement, WoW Basic is residence to veterans and newbies alike, enjoying the sense of neighborhood that emerges by necessity when you take away dungeon finders and quest markers.
after, websites

redpajama_set_name: RedPajamaCommonCrawl


The following is adapted from the introduction to "The Riddler: Fantastic Puzzles from FiveThirtyEight," published by W. W. Norton & Co. It is in stores today!
Those secrets were whispered in the language of mathematics.
The front of the Rhind papyrus.
The problems posed in the Rhind papyrus won't present much of a challenge to the modern reader — especially for you numerate readers of this website. One of its problems, for example, reads, "Find the volume of a cylindrical granary of diameter 9 and height 10."1 Another: "Sum the geometrical progression of five terms, of which the first term is 7 and the multiplier 7."2 But now they serve a grander purpose. The 84 problems and solutions recorded on the papyrus provide some of the clearest insights into the numerical methods of the ancient Egyptians, some of the world's earliest mathematicians.
Today, we're publishing the first-ever collection of Riddler puzzles in a book. The puzzles in the collection originated not from a dutiful ancient scribe but often from people like you. Each Friday, when the column is published, Riddler readers take to the far-flung boroughs of the internet to dissect, discuss and solve the puzzles of the week. It shows how great strides have been taken in mathematics over these past 3,000 years and the strength of technology to accelerate, combine and disseminate ideas.
That's precisely how I feel about the readers who have contributed to the column.
The Rhind papyrus is one of the oldest collection of math puzzles. This book is one of the newest.
The Riddler book is a physical testament to that collaboration. Within the book are dozens of puzzles and solutions selected to appeal to a spacious breadth of mathematical interests and a bottomless depth of mathematical skills. The simplest require a mere flash of logical insight. Others draw on the tools of trigonometry, geometry, combinatorics — and even a bit of calculus. The toughest involve deep applications of analysis and probability theory. All of them are meant to be fun. In the ancient Egyptian papyrus, the puzzles concerned the arithmetic of the practical: granaries, flour, beer, bread. The puzzles here go a bit further afield. Each has a story — perhaps set in a dystopian city, a sunny park, or a basketball arena, to name a few. (You will also find two puzzles about pizza, without which no puzzle book is complete).
As I culled the published columns and assembled brand-new Riddlers for the book, the puzzles tended to fall into three broad mathematical categories: logic, probability and geometry. In the first category, you might find yourself rigging an election, outwitting a car salesman or competing in a space race. In the second, you may be fending off an alien invasion, visiting a national park or teaching your baby to walk. And in the third, you might be baking a cake, outrunning an angry ram or fighting over pizza with your siblings.
While there may be right and wrong answers to the puzzles, there is no right or wrong way to proceed through the book. If you are presented with a problem about pizza, say, perhaps you'd do well to pull out a pencil and paper and just get to it. Or maybe you'd be more comfortable on your computer, running some pizza simulations. Or maybe you find a hands-on approach is best, and you order up some actual pizzas to test your hypotheses. In any case, I hope you buy the book and continue this digital collaboration in the physical world.
Adapted from The Riddler by Oliver Roeder. Copyright © 2018 by ESPN, Inc. Used with permission of the publisher, W.W. Norton & Company Inc. All rights reserved.
As you have no doubt already calculated, the volume is about 636 cubic units.


text:
Treasure of Monte Cristo is a 1949 American film noir crime film directed by William Berke and starring Glenn Langan, Adele Jergens and Steve Brodie.

Plot
A descendant of Edmond Dantès finds himself framed for a crime he did not commit.

Cast
 Glenn Langan as Edmund Dantes
 Adele Jergens as Jean Turner
 Steve Brodie as Earl Jackson
 Robert Jordan as Tony Torecelli
 Michael Whalen as Lt. Michael Perry
 George Davis as District Attorney
 Margia Dean as Nurse
 Sid Melton as Tyson (as Sidney Melton)
 Brian O'Hara as Jailer
 Robert Boon as Boatswain
 Jeritza Novak as Miss Jean Turner
 Jimmy O'Neil as Pawnbroker
 Curtis Jarett as Deputy Sheriff
 Charles Regan as Bailey (as Charles Reagan)
 Larry Barton as Hotel Clerk
 Charles Schaeffer as Robert (as Rube Schaeffer)
 Don Junior as Bellboy

Production
The film was entirely shot in location in San Francisco.

References

External links

1949 films
American crime films
1940s English-language films
Films directed by William A. Berke
Films scored by Albert Glasser
1940s crime films
Lippert Pictures films
American black-and-white films
Films with screenplays by Aubrey Wisberg
Films shot in San Francisco
Films based on The Count of Monte Cristo
1940s American films

redpajama_set_name: RedPajamaWikipedia


As we close out 2014 we want to bring you the final list of ships that enrolled in Amver in the past week. Help us welcome these vessels and crews and best wishes for a prosperous and safe 2015!
The Amver staff wishes everyone a happy holiday season!
It's Christmas Eve and we're still bringing the list of those ships newly enrolled in Amver. Why? Because there are thousands of seafarers at sea today. While many of us are safely on shore, please remember the many seafarers underway today and everyday.
The latest list of ships to enroll in Amver is available. You won't find this anywhere else. Every day we're honored to have more of you join and make yourselves available for search and rescue around the world. Thank you.
Here's a peek at the latest vessels to enroll in Amver. We feel its important to share this with you. To shine a light on the good things shipping does. Too often we hear bad news. Well, we're in the good news department and here are 13 reasons to recognize the good shipping provides.
If you want to see who joined Amver this week look for further. Each week we proudly bring you a list of the latest ships enrolled in the Amver system. Will you see your ship listed here?
The Amver participating bulk carrier AM Zenica rescued three Canadian sailors from their 44-foot sailboat after it caught fire approximately 250 miles north of Bermuda on Saturday, November 15, 2014.
The crew of the sailboat made a mayday call which was heard by the Marshall Island flagged ship. The 738-foot ship was on a voyage from Norfolk, Va. to Croatia when Captain Manoj Mehrotra heard the call for help, ordered the vessel to begin rescue operations and notified U.S. Coast Guard rescue personnel at the Fifth District Rescue Coordination Center.
Despite 25 knot winds and waves greater than 12 feet, Captain Mehrota's crew was able to safely embark the three Canadian yachtsmen and resumed the voyage to Croatia. "The sailor's are safely aboard our ship and have brought their distress beacon," Captain Mehrota. "They're uninjured," he added. U.S. Coast Guard officials notified their Canadian rescue counterparts who will help the sailors return home.
The AM Zenica, managed by ArcelorMittal Shipping of London, enrolled in Amver on June 2, 2014 and will earn its first Amver participation award this year.
Photo credit: Crew of the AM Zenica.


Launch A Website is a 228-page guide for non-techies that walks you through the whole process of building a website from start to finish – and includes tips and advice on researching your audience, designing your site and, of course, getting seen on Google.
Launch A Website is available at all good UK bookstores from today, Thursday 5 July 2012 for £14.99. You can also pick up a copy online on the My Favourite Magazines website.


GBD gotta step up his game now!
It seems the Spambots have found our lovely corner of the web and have been invading full force. This is just a reminder for admins and authors.
Please ban these people from TAY when you see them.
And authors you have the power to dismiss their comments if it is on your own article. I can't help you if you crosspost from your own blog or are on TAYClassic.
Also it seems they've gotten a little smarter. They make seemingly intelligent comments followed by a bit.ly link. I saw one which was an unintelligent comment with a non bitly link as well...but regardless. If the last thing in the comment is a link DO NOT CLICK IT. Dismiss the comment or try to confirm that the link is legit first.


text:
Q: Enable full performance on Sandy Bridge laptop I have 2nd gen Intel i7 laptop. I use Thermald and tlp for managing battery life (they are great!). However, sometimes I don't care about noise and power consumption, and want the CPU to run at full 3.5GHz. For some reason, this seems impossible to achieve. The fan never runs full speed, and the processor is always throttled down. When I use cpufreq-info I never see more than 2.8GHz (so turbo boost does not work), and the frequency drops down to 800Mhz when the fan starts getting "loud". This is with intel p-state and performance governor. Powersafe governor is even "worse", but that's good as it increases battery life.
Any ideas how to enable "full power"?
Thank you!

A: Yes, all you have to do is:
first, set tlp "governer" to performance for both ac and batt in your /etc/default/tlp file and while you are there, go ahead and enable turbo boost as well
then, edit /etc/default/grub and insert
intel_pstate=disable

after
GRUB_CMDLINE_LINUX_DEFAULT=

like this example
GRUB_CMDLINE_LINUX_DEFAULT="intel_pstate=disable quiet splash"

execute this command to apply the change to grub
sudo update-grub

then, install indicator-cpufreq
sudo apt-get update
sudo apt-get install indicator-cpufreq

reboot for your changes to take effect.
After you reboot, you will see an icon on your unity panel, click on this icon and you can set the cpu to performance (full), ondemand (only when needed), powersave, or conservative.

Disabling pstate may not be necessary, you can try it on and off to see if there is a difference. Make sure to update grub after making that change.
Also, indicator-cpufreq will not allow changes with pstate on (only with pstate disabled), you will still have to do that manually.
Finally, you can get better numbers from i7z:
sudo apt-get install i7z

and then, run
sudo i7z

Install lm-sensors and run sensors detect:
sudo apt-get install lm-sensors

sudo sensors-detect

Follow the prompts and select yes to everything.

finally, these links may help:
http://www.webupd8.org/2013/09/adobe-flash-player-hardware.html
Not only does this allow hardware acceleration for flash but installs VDPAU and i965
http://www.webupd8.org/2014/01/enable-hardware-acceleration-in-chrome.html
and these more recent benchmarks show a slight advantage from disabling pstate and using performance
http://www.phoronix.com/scan.php?page=article&item=intel_5960x_pstate&num=2

A: I managed to figure this out. As usually, Sony decided to do things their way and so this is specific to Vaio laptops only.
To set full performance, you need to type in terminal:
echo performance | sudo tee /sys/devices/platform/sony-laptop/thermal_control

This sets your laptop to performance mode, and no throttling happens.

redpajama_set_name: RedPajamaStackExchange


These helpful tips and tricks for winter foot care for diabetics will allow you to enjoy the holidays while staying healthy and worry-free.
When you live with diabetes, you necessarily need to make adjustments to your routine. And with the cooler temperatures approaching, the holidays and the traveling you shouldn't ignore taking extra safety measures for winter foot care for diabetics.
One of the main reasons why diabetics fear the winter season is due to the actual effect cooler temps have on their systems. Wintery months causes an increase on HbA1c levels in people with diabetes, which is why it's important to take precautionary steps to avoid any health scare.
There are many diabetic food care tips and tricks that you can start using right this minute. Not only because they are easy, but because they actually work. There are also many diabetic food care products that have made this list, cause we want to give you the best options we've found.
Cold months can lead to certain conditions in people living with diabetes. For this reason, we've created this list of useful tips of foot care for diabetics that will help you prepare for the season, while providing reassurance and the comfort your deserve.
Inspect your feet daily: checking for any sore spots, calluses, changes in coloration, sores or breaks in your skin is essential. Whether it's on your sole or between your toes, any sudden change in appliance and condition should be reported to your doctor immediately.
Keep your feel dry and warm: walking around snow, rain or the cold can lead to humidity and changes in the temperature of your body. It is essential to dry your feet thoroughly to prevent bacteria from building up, and put on dry, warm socks.
Take care of your nails: don't forget to carefully trim your nails and keep them clean. This prevents infections and ulcers that could be harmful.
Moisturize: just as important as keeping your feet dry is, keeping them moisturized helps prevent skin breakage and sores that can lead to infections.
For these diabetic foot care tips, we've rounded up a few diabetic foot care products that can be easily picked up from a store or pharmacy, and that will help you maintain a healthy routine during the winter months.
Diabetics socks: a warm pair of socks can feel like heaven in cooler temperatures. These options are not only designed for diabetics, but they also pay extra care of your circulation and the pressure your feet receive with every step you take.
Moisturizer: the right foot cream can make a huge difference in the way your feet feel. These pay are specially design to provide the right amount of moisture without feeling greasy or leaving a damp sensation.
Insoles and cushions: just like it is important to pay attention to your circulation, these items help the pressure and stability of your feet while providing relief and support during long walks.
These diabetic foot care products can be found in the pharmacy of your preference, and are also available online from high-quality sellers, so you can rest assure that they are available whenever you need them.
It is important to understand that paying an extra bit of care and attention to your health this season does not have to compromise the way you enjoy the holidays or spending time with your loved ones.
These diabetic foot care tips are aimed at helping you take care of yourself and your health, so your mind is free to enjoy and celebrate, without having to worry about anything else.


text:
OECD: Working Paper on Regional Productivity, Local Labour Markets and Migration in Australia
Read the PDF
This is the first working paper from the OECD's Migration and Regional Development Project, which was commissioned by the Centre for Population.
It describes the characteristics and geographic distribution of migrants in Australia and offers an overview of recent trends in Australia's regional employment and productivity. It also provides insights on the relationship between migration, employment, and productivity in Australia, as well as in other OECD member countries.
The key findings of this paper include:
Australia has the highest share of migrants in the OECD after Luxembourg, at 30% of the population. This is more than twice the OECD average (14%).
Australia has one of the highest educated migrant populations among OECD countries. Despite their higher level of education, migrants have lower employment rates than the native population, mainly arising from a low labour market participation of migrant women.
Similar to other OECD countries, migrants are more likely to live in areas where employment rates among native‑born workers are higher. Australian regions with higher shares of migrants also tend to have higher productivity levels.
OECD partnership series
This paper is the first of 4 papers to be produced by the OECD as part of our partnership to investigate the impacts of migration on Australia's economy, particularly on its productivity levels and labour markets:
Paper 1: Regional productivity, local labour markets, and migration in Australia
Paper 2: Impacts of migrants on Australia's productivity, using analysis of Australian microdata. Releasing in early 2023
Paper 3: Impacts of migrants on Australia's labour markets, using analysis of Australian microdata. Releasing in early 2023
Paper 4: Impacts of migrants on Australia's entrepreneurship and innovation, using analysis of Australian microdata. Releasing in mid‑2023.
Net overseas migration
Net overseas migration is the net gain or loss of population through immigration to Australia and emigration from Australia.
Overseas Migration, 2020-21
A summary of the composition of overseas migration by visa type, including a breakdown of overseas migrants by country of birth.
Centre for Population analysis of the Australian Bureau of Statistics data release


Macdonald, 1986, Hardback in Dustwrapper..
Condition: Good+ — in Good+ Dust Wrapper. Heavily faded at the spine of the dust wrapper. Bruised at the spine ends and corners with commensurate ruffling to the dust wrapper with the laminate creased.


We are preparing for this BIG weekend – "It Happened in the Country" Children's Christmas Musical. Props, practice, renting microphones, promotion, etc.
PromiseGroup organization for Trimester 1 in '09.
We can always use volunteers for any of these. If you are open…email or comment below.
Posted on December 8, 2008, in Church Business. Bookmark the permalink.	15 Comments.
When did you start doing the "cool" thing? you need to stand out! Be the one that everyone remembers!!
P.S My answered prayer, A white christmas !!!
Yes pastor it is but its kind of sick….Its kind of sad what big people will do sometimes.
Have to admit we love you any ways!!!
I may have to do a "self-portrait" soon, I wanna have a cool web profile too LOL.
I'm available to do my part, whatever that is. It may only be mopping up after a toilet overflowed or it might be praying for the staff trip. Regardless, I do want to answer God's call.
I'm kinda like Wynnel, as I get older I don't have to worry about being cool, saying stuff like LOL, etc. Sure makes life easier to get through.
Sorry, that was Bill talking about LOL. Oh well he is getting older also and knows what I'm talking about.
Rob, Bill's not "that" old. 🙂 I'm available to help, also. Love this church!!!!!!!!!
I put snow on the blog and then it snowed in Texas the next day! Pretty Cool.
. Cool.,,,,,,, And a bit cold, Wynnel again has gotten cold.
wynnel almost ran me over in the Applebees parking lot today. I thought she was….
I tryed but i missed !!!!
Is is Crazy "ol Bird" Pastor better stay out of her way!!! One of the reasons WE ALL LOVE YOU SO MUCH!!!


text:
The New Feature That Will Keep You Hooked On Tinder For Longer
Album Review: Charli XCX – Charli
Adam Lawler
What's immediately obvious upon listening to Charli XCX's long-awaited third album is that the first track is a self-aware statement of intent — "Next Level Charli" is pretty spot on. Who knew that the woman who was signed at 14, the one who wrote hits for others but never herself, the one who seemed to constantly writhe beneath the sallow skin of the pop machine, could reach such a perfect level of self-actualisation?
Charli XCX long ago gave up on the machine and began channelling its faulty mechanisms into boundary-pushing, edgy post-pop and gained a whole new lifeblood in the process. With huge critical success and die hard fans who pore over unreleased songs as if they're scripture, it's a heartening story of letting go and saying "fuck you" to convention. That isn't to say that she's let go of the idea of true worldwide success. She supports Taylor Swift on tour and moonlights with claustrophobic club shows, releases lowkey mixtapes in between mainstream hits like "Boys" and "1999".
Charli's story has always been one of conflict, and her duality is no more apparent than on Charli, an album of two halves; punishing experimentation and big pop toplines. The result is an album that plates her myth in dazzling chrome, glittering with the new vulnerability of a person growing tired of the party.
None of this to say that she's not still the person who says "party" enough to make it sound like a fake word. On "Shake It", Charli largely takes a backseat to let Big Freedia, CupcakKe, Brooke Candy and Pabllo Vittar gleefully trample all over a track that sounds like a prolonged heart attack. With "Shake It" and "Click", Charli tells us that she's very much not watering down. She's still very much trying to wrangle demonic screams out of the gays and have at least one person convulsing on the floor of a club. No one does mechanical pop hype music like Charli, and she's never done it better than on this album.
Then there's "Gone". First of all, what a song. If this album is largely split into futuristic bangers and plaintive solo self-examination, "Gone" is where she fuses the two so seamlessly you won't know why you're crying during an epic dance breakdown. The track evokes that familiar post-cry existential euphoria. With the addition of the pitch-perfect vocals and typically evocative poetry of Christine and the Queens, "Gone" may well be a holographic jewel in the Perspex crown of Charli's career.
Tracks like this sound like Charli reaching galaxy-brain-levels of creative synthesis, and there are a few moments of such transcendence scattered throughout the album. "February 2017" sounds like a treasured memory transferred to a hard drive and corrupted in the process, while "I Don't Wanna Know" is a big '80s slow jam that sounds like it could feature the 1975 if it wasn't perfect as it is. Even the relatively insubstantial "Warm" conjures an atmosphere that feels like a weighted blanket, and "Cross You Out" is just huge.
"What she's made here is a culmination of the last two plus years of sonic world-building, the Avengers Endgame of albums, dripping with gloss which coats pistons furiously working at full pelt."
This is a Charli album that, on first glance, might come off as her attempt to turn her newly-accrued cult status into true mainstream success for the first time in her career. There are big tropical bangers like "Blame It On Your Love", a song which criminally underuses the effervescent Lizzo (as if the instantly sold out Olympia show wasn't painful enough). There are overly-earnest ballads like "White Mercedes", on which the most notable sound effect is the sound of Charli kicking herself in autotune for not releasing "Issues" instead of Julia Michaels.
This could come across as bet-hedging, but it somehow doesn't. Charli's too cool to aim squarely and shamelessly at the mainstream; she knows that her style is diamond-hard and just untethered enough that it could just as easily give her a massive hit as it could gain her thousands more Fila Disruptor-wearing stans on the underground. She knows that she's miles ahead of the curve in her lavender Lamborghini and that that's enough, despite the odd moment of questioning why she isn't bigger than she is. The answer is that she deserves to be, but she probably won't be, and does she really want to thrive in a space occupied by the Post Malones of the world?
What she's made here is a culmination of the last two plus years of sonic world-building, the Avengers Endgame of albums, dripping with gloss which coats pistons furiously working at full pelt. It feels like the end of an era and the beginning of a new one, a dissonant pivot chord in the career of pop's biggest maverick. Long may she vroom.
album reviewcharli xcxpop music news
Student festival-goers targeted as "money mules"
A new blog is reviewing the best pub hand-dryers and it's hilarious


text:
Q: Laravel .htaccess not working Laravel's default .htaccess file gives an error on Php Cloud server.
Error:

Option MultiViews not allowed here

When I remove section below from .htaccess my home page work but other routes gives an 404 error.
<IfModule mod_negotiation.c>
     Options -MultiViews
</IfModule>

Original .htaccess file
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

A: Based on these Google results here  and here, I think you need to append/edit:
RewriteBase /
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

so in total:
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^.*$ - [NC,L]
    RewriteRule ^.*$ index.php [NC,L]
</IfModule>


Precious Tips To Consider When Starting Up A Business.
Many people are aspiring to start their own firms so they can be entrepreneur. One needs to know there are many niches in entrepreneurship that need to be exploited. Before you start a business, you need to do your extensive research from all areas.
There are countless experts that may offer business advice in starting your firm and advancing it to the next level. Extract more information about starting a business from the online platform where meticulous websites will enlighten you.
Since many people have started and run their firms in a successful manner, reach out to them for advice and consultations. Moreover, you need to check out the following factors as you start your enterprise. Always have an idea on the business venture you want to explore since this will now give you more details afterward.
Ensure you've consulted with knowledgeable people about business ideas, sourced pertinent ideas from the internet and also examined what your local people want and are missing. A good business plan is valuable and it will govern the process of starting and administering the firm.
Always have hints on the suitable market as you start a law practice that will aid your corporation to grow on well. Your business should be started in a precious location where the market is concentrated for it to deal with competition. To know if your business will thrive, you need to let people comment and offer you reviews about your products and business itself for this will enlighten you on the way forward.
Its professional to think of a viable pricing strategy for all the services and brands the business will be dealing with since this can attract or even keep clients away. The process of marketing your business needs to be thought well since it will show if the firm exists or not. The right marketing strategies for the business needs to be chosen like the internet marketing, personal and sales marketing strategies among others.
You need to get certification credentials for your business for this shows its real and valid. You need to get the needed insurance coverage for the business since this is one of the requirements when starting any kind of business. Have a clear understanding of where the finances for the business you are starting will come from.
Have a reliable and constant source of finance for the starting and running of your business. Aim to get requisite objectives and business culture plus the needed staffs with motivation for business development and growth.


text:
Southern Utah News Bureaus
KUER's Southeast Utah Bureau is based in San Juan County. The Southwest Utah Bureau is based in the St. George area. Both initiatives focus on local government, public lands and the environment, indigenous issues, faith and spirituality and other topics of relevance to Utahns.
Money For Utah Navajo Water Development Passed As Part Of COVID-19 Relief Package
KUER 90.1 | By Kate Groetzinger
Published December 22, 2020 at 1:13 PM MST
Kate Groetzinger
KUER
Navajo families who don't have running water use huge tanks like these to haul water to their homes. Some drive up to an hour multiple times a week to fill the tanks in Monument Valley and Bluff.
After years of negotiation and delays, the Navajo Utah Water Rights Settlement Act passed the U.S. House and Senate on Monday as part of a federal coronavirus relief package. President Donald Trump is expected to sign the bill into law on Tuesday.
The settlement act gives the Navajo Nation the right to use 81,500 acre-feet of water from Utah's Colorado River Basin apportionment each year, settling all future claims to water on the Nation in Utah.
It also includes $220 million in federal funding that will be used to treat and move the water to communities on the reservation in Utah, where over 40% of homes lack indoor plumbing.
Courtesy of the Navajo Tribal Utility Authority
Around 30% of houses on the Navajo Nation do not have running water, according to Rex Kontz with the Navajo Tribal Utility Authority. The settlement could reduce that number as well as increase economic development.
"This is a historic milestone for the Navajo people and our past and present leaders," said Navajo President Jonathan Nez. "This water settlement is one that was negotiated for many years and finally put before Congress for a vote on this day."
Utah Gov. Gary Herbert also expressed appreciation for the passage of the settlement act, adding that negotiations began before he took office.
"I'm elated to see Congress pass this historic agreement between the state of Utah and the Navajo Nation," he said. "This agreement represents more than 15 years of good faith work between our governments."
Former Republican from Utah Sen. Orrin Hatch introduced the bill in 2016, and then again in 2018. It failed both times, despite being recommended to pass in 2018 by the Senate Committee on Indian Affairs.
Sen. Mitt Romney, R-UT, reintroduced the legislation in 2019, and it passed the Senate this June as part of a bipartisan bill related to Indian water rights. But it stalled in the House this fall, worrying proponents of the bill.
Mark Maryboy, a former tribal council member and San Juan County commissioner who worked on the settlement, said the passage of the bill this week came as a surprise.
"It's kind of unbelievable that it happened," he said. "A majority of the people [on the Navajo reservation in Utah] still haul water, and we will put a stop to that once we connect them to the water system."
The Navajo Tribal Utility Authority will be in charge of connecting homes on the reservation in Utah to water. It currently provides water to around 40,000 homes and businesses with just 10,000 acre feet of water annually, according to the utility authority's general manager, Rex Kontz.
Kontz oversees the entire reservations' water system and said the 81,500 acre feet of water in the settlement is more than enough to meet the needs of the 5,000 or so residents of the Navajo Nation in Utah.
"It's a huge amount of water," Kontz said. "The next step is 'How are you going to use it?'"
But Romney's office has said the money in the settlement will help bring water to around 2,500 residents. The money is not earmarked for specific projects, and it will be up to Navajo Nation leadership to decide how to use it.
Maryboy is working on a plan to present to the Navajo Nation that includes using some of the funding to help farmers get water to their fields. He said there is a provision in the settlement agreement that allows some of the money to go toward agricultural uses.
"Most of the preliminary engineering work has been done," he said. "The next thing to do is look at some contractors, begin construction."
Before any of that happens, the state of Utah and the Navajo Nation must go through a legal process called stream adjudication, which will be handled by the Seventh Judicial District Court in Grand County.
Politics & GovernmentSoutheast Utah BureauNavajo Nation
Kate joined KUER from Austin, Texas, where she attended the University of Texas at Austin's Moody School of Journalism. She has been an intern, fellow and reporter at Texas Monthly, the Texas Observer, Quartz, the Texas Standard and Voces, an oral history project. Kate began her public radio career at Austin's NPR station, KUT, as a part-time reporter. Now, she is a corps member of Report For America, a public service program that partners with local newsrooms to bring reporters to undercovered areas across the country. She's excited to be living in and reporting on San Juan County, one of the most beautiful — and interesting — parts of the United States.
See stories by Kate Groetzinger
2021 State Of The State: Full Text Of Gov. Spencer Cox's Address
In Short Address, Utah Gov. Spencer Cox Lays Out Priorities For The State And Calls For Unity
Utah Has Used Most of Its COVID-19 Vaccine Inventory. But Federally Partnered Pharmacies Haven't.
2021 State Of The State: Full Text Of The Democratic Caucus Response
Utah Navajo Water Rights Settlement Could Help Get Farmers In San Juan County Back In Business
Support KUER
KUER is listener-supported public radio. Support this work by making a donation today.


Planning a trip or just interested to find out the flight time between Czech Republic, Czech Republic and Côte d'Ivoire, Côte d'Ivoire?
The flight time from Czech Republic to Côte d'Ivoire is 6 hours 12 minutes.
A direct flight from Czech Republic (PED) to Côte d'Ivoire (COO) has a duration of 6 hours 12 minutes.
A distance of 3,164 miles / 5,093 km.
Be prepared, as flight times can change depending on many factors such as, weather condition, wind speed, flight path and congestion in the air. Due to these factors the actual flight time could be less than 6 hours 12 minutes but on occasion could be longer than the stated time.
The total travel time of a indirect / multi-stop flight from Czech Republic to Côte d'Ivoire can vary greatly depending on what route you take to get to Côte d'Ivoire and how long you have to wait for your connecting flight.
Discover alternative routes other than Czech Republic to Côte d'Ivoire. Below is just a small selection of the most popular flight time searches from Czech Republic.
Average prices of flights to Côte d'Ivoire throughout the year.
Whether you're flying to Côte d'Ivoire for a family holiday, business trip, romantic getaway or just curious to know the flight duration from Czech Republic, Czech Republic to Côte d'Ivoire, Côte d'Ivoire the duration of the flight can be a major factor in the planning of your break. Côte d'Ivoire can be a great holiday destination for exploring, seeing the amazing sites and spending time with the family. We have sourced the latest deals on flights and hotels in the Côte d'Ivoire to help you plan your trip.