if #args == 1 and type(args[1]) == "table" and args[1].instanceOf then
            local selfClasses = extraValidClasses and table.merge(self.compatible, extraValidClasses) or self.compatible
            local _, clsMatchCnt = table.intersect(selfClasses, args[1].compatible)

            if clsMatchCnt>0 then

                if args.deepCopy then
                    args = {args[1]:get()}
                else
                    -- This is a fast path for compatible objects
                    -- TODO: check for issues caused by this change
                    local obj = args[1]
                    for i=1,#self.__meta__.order do
                        args[i] = obj[self.__meta__.order[i]]
                    end
                    return unpack(args)
                end
            else assertEx(type(propTypes[1]) == "table" and propTypes[1].instanceOf,
                          "object of class %s does not accept instances of class %s as argument.",
                          self.typeName, args[1].typeName
                 )
            end
        end

        -- TODO: check if we can get rid of either the index into the default table or the output table
        local defIdx, j, outArgs, o = 1, 1, {}, 1
        for i=1,#propNames do
            if ASS:instanceOf(propTypes[i]) then
                local argSlice, a, rawArgCnt, propRawArgCnt, defSlice = {}, 1, 0, propTypes[i].__meta__.rawArgCnt
                while rawArgCnt<propRawArgCnt do
                    argSlice[a], a = args[j], a+1
                    rawArgCnt = rawArgCnt + (type(args[j])=="table" and args[j].class and args[j].__meta__.rawArgCnt or 1)
                    j=j+1
                end

                if type(defaults) == "table" then
                    defSlice = table.sliceArray(defaults, defIdx, defIdx+propRawArgCnt-1)
                    defIdx = defIdx + propRawArgCnt
                end

                outArgs, o = table.joinInto(outArgs, {propTypes[i]:getArgs(argSlice, defSlice or defaults, coerce)})
            else
                if args[j]==nil then -- write defaults
                    outArgs[o] = type(defaults)=="table" and defaults[defIdx] or defaults
                elseif type(args[j])=="table" and args[j].class then
                    assertEx(args[j].__meta__.rawArgCnt==1, "type mismatch in argument #%d (%s). Expected a %s or a compatible object, but got a %s.",
                             i, propNames[i], propTypes[i], args[j].typeName)
                    outArgs[o] = args[j]:get()
                elseif coerce and type(args[j])~=propTypes[i] then
                    outArgs[o] = self:coerce(args[j], propTypes[i])
                else outArgs[o] = args[j] end
                j, defIdx = j+1, defIdx+1
            end
            o=o+1
        end
        return unpack(outArgs)
    end

    function Base:copy() --TODO: optimize
        local newObj, meta = {}, getmetatable(self)
        setmetatable(newObj, meta)
        for key,val in pairs(self) do
            if key=="__tag" or not meta or (meta and table.find(self.__meta__.order,key)) then   -- only deep copy registered members of the object
                if ASS:instanceOf(val) then
                    newObj[key] = val:copy()
                elseif type(val)=="table" then
                    newObj[key]=Base.copy(val)
                else newObj[key]=val end
            else newObj[key]=val end
        end
        return newObj
    end

    function Base:typeCheck(...)
        local valTypes, valNames, j, args = self.__meta__.types, self.__meta__.order, 1, {...}
        for i=1,#valNames do
            if ASS:instanceOf(valTypes[i]) then
                if ASS:instanceOf(args[j]) then   -- argument and expected type are both ASSObjects, defer type checking to object
                    self[valNames[i]]:typeCheck(args[j])
                else  -- collect expected number of arguments for target ASSObject
                    local subCnt = #valTypes[i].__meta__.order
                    valTypes[i]:typeCheck(unpack(table.sliceArray(args,j,j+subCnt-1)))
                    j=j+subCnt-1
                end
            else
                assertEx(type(args[j])==valTypes[i] or args[j]==nil or valTypes[i]=="nil",
                       "bad type for argument #%d (%s). Expected %s, got %s.", i, valNames[i], valTypes[i], type(args[j]))
            end
            j=j+1
        end
        return unpack(args)
    end

    function Base:get()
        local vals, names, valCnt = {}, self.__meta__.order, 1
        for i=1,#names do
            if ASS:instanceOf(self[names[i]]) then
                for j,subVal in pairs({self[names[i]]:get()}) do
                    vals[valCnt], valCnt = subVal, valCnt+1
                end
            else
                vals[valCnt], valCnt = self[names[i]], valCnt+1
            end
        end
        return unpack(vals)
    end

    return Base
endReceived messages of new de...
Received messages of new device connected on xfi. "Unisys-0000" and "00:00:00-0000"
Received 2 messages of new device connected. One was for "Unisys-0000". The other was for "00:00:00-0000". Neither of these were connected when I checked and I really doubt that they were an intrusion via my wifi. They look like something caused by Comcast/Xfinity. But no one at Comcast is responding to me. This isn't the first time that xfi has sent me weird messages about new devices. Earlier this month it was "ARRISGro-4FC5". Since the router is an Arris, I think that this was also caused by Comcast/Xfinity. What is going on?
Well that stinks. I want the security turned on. The router should include firewall security for my entire network.
It still does. The built in hardware firewall is still enabled unless you specifically disable it.
After a long runaround, a Comcast employee said that the problem was in Advanced Security and that they already know about it. You were right! Thank you.<commit_before>{ lib, stdenv, fetchurl, sharutils, makeWrapper }:

stdenv.mkDerivation rec {
  pname = "aespipe";
  version = "2.4f";

  src = fetchurl {
    url = "mirror://sourceforge/loop-aes/aespipe/aespipe-v${version}.tar.bz2";
    sha256 = "15pg9j27mjzl78mpzkdqd84kdafj0g6j72f8wgjrpp2qkxjy2ddi";
  };

  nativeBuildInputs = [ makeWrapper ];

  configureFlags = [ "--enable-padlock" "--enable-intelaes" ];

  postInstall = ''
    cp bz2aespipe $out/bin
    wrapProgram $out/bin/bz2aespipe \
     --prefix PATH : $out/bin:${lib.makeBinPath [ sharutils ]}
  '';

  meta = with lib; {
    description = "AES encrypting or decrypting pipe";
    homepage = "http://loop-aes.sourceforge.net/aespipe.README";
    license = licenses.gpl2;
    maintainers = [ maintainers.goibhniu ];
    platforms = platforms.linux;
  };
}<commit_msg>aespipe: expand platforms to unix<commit_after>{ lib, stdenv, fetchurl, sharutils, makeWrapper }:

stdenv.mkDerivation rec {
  pname = "aespipe";
  version = "2.4f";

  src = fetchurl {
    url = "mirror://sourceforge/loop-aes/aespipe/aespipe-v${version}.tar.bz2";
    sha256 = "15pg9j27mjzl78mpzkdqd84kdafj0