text: "use strict";
  
  module.exports = CSSselect;
  
  var DomUtils = require("domutils");
  var falseFunc = require("boolbase").falseFunc;
  var compileRaw = require("./lib/compile.js");
  
  function wrapCompile(func) {
      return function addAdapter(selector, options, context) {
          options = options || {};
          options.adapter = options.adapter || DomUtils;
  
          return func(selector, options, context);
      };
  }
  
  var compile = wrapCompile(compileRaw);
  var compileUnsafe = wrapCompile(compileRaw.compileUnsafe);
  
  function getSelectorFunc(searchFunc) {
      return function select(query, elems, options) {
          options = options || {};
          options.adapter = options.adapter || DomUtils;
  
          if (typeof query !== "function") {
              query = compileUnsafe(query, options, elems);
          }
          if (query.shouldTestNextSiblings) {
              elems = appendNextSiblings((options && options.context) || elems, options.adapter);
          }
          if (!Array.isArray(elems)) elems = options.adapter.getChildren(elems);
          else elems = options.adapter.removeSubsets(elems);
          return searchFunc(query, elems, options);
      };
  }
  
  function getNextSiblings(elem, adapter) {
      var siblings = adapter.getSiblings(elem);
      if (!Array.isArray(siblings)) return [];
      siblings = siblings.slice(0);
      while (siblings.shift() !== elem);
      return siblings;
  }
  
  function appendNextSiblings(elems, adapter) {
      // Order matters because jQuery seems to check the children before the siblings
      if (!Array.isArray(elems)) elems = [elems];
      var newElems = elems.slice(0);
  
      for (var i = 0, len = elems.length; i < len; i++) {
          var nextSiblings = getNextSiblings(newElems[i], adapter);
          newElems.push.apply(newElems, nextSiblings);
      }
      return newElems;
  }
  
  var selectAll = getSelectorFunc(function selectAll(query, elems, options) {
      return query === falseFunc || !elems || elems.length === 0 ? [] : options.adapter.findAll(query, elems);
  });
  
  var selectOne = getSelectorFunc(function selectOne(query, elems, options) {
      return query === falseFunc || !elems || elems.length === 0 ? null : options.adapter.findOne(query, elems);
  });
  
  function is(elem, query, options) {
      options = options || {};
      options.adapter = options.adapter || DomUtils;
      return (typeof query === "function" ? query : compile(query, options))(elem);
  }
  
  /*
  	the exported interface
  */
  function CSSselect(query, elems, options) {
      return selectAll(query, elems, options);
  }
  
  CSSselect.compile = compile;
  CSSselect.filters = compileRaw.Pseudos.filters;
  CSSselect.pseudos = compileRaw.Pseudos.pseudos;
  
  CSSselect.selectAll = selectAll;
  CSSselect.selectOne = selectOne;
  
  CSSselect.is = is;
  
  //legacy methods (might be removed)
  CSSselect.parse = compile;
  CSSselect.iterate = selectAll;
  
  //hooks
  CSSselect._compileUnsafe = compileUnsafe;
  CSSselect._compileToken = compileRaw.compileToken;
  