{"version":3,"file":"filesystem.cjs","names":[],"sources":["../../../../../node_modules/mock-fs/lib/filesystem.js"],"sourcesContent":["'use strict';\n\nconst os = require('os');\nconst path = require('path');\nconst Directory = require('./directory.js');\nconst File = require('./file.js');\nconst {FSError} = require('./error.js');\nconst SymbolicLink = require('./symlink.js');\n\nconst isWindows = process.platform === 'win32';\n\n// on Win32, change filepath from \\\\?\\c:\\a\\b to C:\\a\\b\nfunction getRealPath(filepath) {\n  if (isWindows && filepath.startsWith('\\\\\\\\?\\\\')) {\n    // Remove win32 file namespace prefix \\\\?\\\n    return filepath[4].toUpperCase() + filepath.slice(5);\n  }\n  return filepath;\n}\n\nfunction getPathParts(filepath) {\n  // path.toNamespacedPath is only for Win32 system.\n  // on other platform, it returns the path unmodified.\n  const parts = path.toNamespacedPath(path.resolve(filepath)).split(path.sep);\n  parts.shift();\n  if (isWindows) {\n    // parts currently looks like ['', '?', 'c:', ...]\n    parts.shift();\n    const q = parts.shift(); // should be '?'\n    // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN#win32-file-namespaces\n    // Win32 File Namespaces prefix \\\\?\\\n    const base = '\\\\\\\\' + q + '\\\\' + parts.shift().toLowerCase();\n    parts.unshift(base);\n  }\n  if (parts[parts.length - 1] === '') {\n    parts.pop();\n  }\n  return parts;\n}\n\n/**\n * Create a new file system.\n * @param {object} options Any filesystem options.\n * @param {boolean} options.createCwd Create a directory for `process.cwd()`\n *     (defaults to `true`).\n * @param {boolean} options.createTmp Create a directory for `os.tmpdir()`\n *     (defaults to `true`).\n * @class\n */\nfunction FileSystem(options) {\n  options = options || {};\n\n  const createCwd = 'createCwd' in options ? options.createCwd : true;\n  const createTmp = 'createTmp' in options ? options.createTmp : true;\n\n  const root = new Directory();\n\n  // populate with default directories\n  const defaults = [];\n  if (createCwd) {\n    defaults.push(process.cwd());\n  }\n\n  if (createTmp) {\n    defaults.push((os.tmpdir && os.tmpdir()) || os.tmpDir());\n  }\n\n  defaults.forEach(function (dir) {\n    const parts = getPathParts(dir);\n    let directory = root;\n    for (let i = 0, ii = parts.length; i < ii; ++i) {\n      const name = parts[i];\n      const candidate = directory.getItem(name);\n      if (!candidate) {\n        directory = directory.addItem(name, new Directory());\n      } else if (candidate instanceof Directory) {\n        directory = candidate;\n      } else {\n        throw new Error('Failed to create directory: ' + dir);\n      }\n    }\n  });\n\n  /**\n   * Root directory.\n   * @type {Directory}\n   */\n  this._root = root;\n}\n\n/**\n * Get the root directory.\n * @return {Directory} The root directory.\n */\nFileSystem.prototype.getRoot = function () {\n  return this._root;\n};\n\n/**\n * Get a file system item.\n * @param {string} filepath Path to item.\n * @return {Item} The item (or null if not found).\n */\nFileSystem.prototype.getItem = function (filepath) {\n  const parts = getPathParts(filepath);\n  const currentParts = getPathParts(process.cwd());\n  let item = this._root;\n  let itemPath = '/';\n  for (let i = 0, ii = parts.length; i < ii; ++i) {\n    const name = parts[i];\n    while (item instanceof SymbolicLink) {\n      // Symbolic link being traversed as a directory --- If link targets\n      // another symbolic link, resolve target's path relative to the original\n      // link's target, otherwise relative to the current item.\n      itemPath = path.resolve(path.dirname(itemPath), item.getPath());\n      item = this.getItem(itemPath);\n    }\n    if (item) {\n      if (item instanceof Directory && name !== currentParts[i]) {\n        // make sure traversal is allowed\n        // This fails for Windows directories which do not have execute permission, by default. It may be a good idea\n        // to change this logic to windows-friendly. See notes in mock.createDirectoryInfoFromPaths()\n        if (!item.canExecute()) {\n          throw new FSError('EACCES', filepath);\n        }\n      }\n      if (item instanceof File) {\n        throw new FSError('ENOTDIR', filepath);\n      }\n      item = item.getItem(name);\n    }\n    if (!item) {\n      break;\n    }\n    itemPath = path.resolve(itemPath, name);\n  }\n  return item;\n};\n\nfunction _getFilepath(item, itemPath, wanted) {\n  if (item === wanted) {\n    return itemPath;\n  }\n  if (item instanceof Directory) {\n    for (const name of item.list()) {\n      const got = _getFilepath(\n        item.getItem(name),\n        path.join(itemPath, name),\n        wanted\n      );\n      if (got) {\n        return got;\n      }\n    }\n  }\n  return null;\n}\n\n/**\n * Get file path from a file system item.\n * @param {Item} item a file system item.\n * @return {string} file path for the item (or null if not found).\n */\nFileSystem.prototype.getFilepath = function (item) {\n  const namespacedPath = _getFilepath(this._root, isWindows ? '' : '/', item);\n  return getRealPath(namespacedPath);\n};\n\n/**\n * Populate a directory with an item.\n * @param {Directory} directory The directory to populate.\n * @param {string} name The name of the item.\n * @param {string | Buffer | Function | object} obj Instructions for creating the\n *     item.\n */\nfunction populate(directory, name, obj) {\n  let item;\n  if (typeof obj === 'string' || Buffer.isBuffer(obj)) {\n    // contents for a file\n    item = new File();\n    item.setContent(obj);\n  } else if (typeof obj === 'function') {\n    // item factory\n    item = obj();\n  } else if (typeof obj === 'object') {\n    // directory with more to populate\n    item = new Directory();\n    for (const key in obj) {\n      populate(item, key, obj[key]);\n    }\n  } else {\n    throw new Error('Unsupported type: ' + typeof obj + ' of item ' + name);\n  }\n\n  /**\n   * Special exception for redundant adding of empty directories.\n   */\n  if (\n    item instanceof Directory &&\n    item.list().length === 0 &&\n    directory.getItem(name) instanceof Directory\n  ) {\n    // pass\n  } else {\n    directory.addItem(name, item);\n  }\n}\n\n/**\n * Configure a mock file system.\n * @param {object} paths Config object.\n * @param {object} options Any filesystem options.\n * @param {boolean} options.createCwd Create a directory for `process.cwd()`\n *     (defaults to `true`).\n * @param {boolean} options.createTmp Create a directory for `os.tmpdir()`\n *     (defaults to `true`).\n * @return {FileSystem} Mock file system.\n */\nFileSystem.create = function (paths, options) {\n  const system = new FileSystem(options);\n\n  for (const filepath in paths) {\n    const parts = getPathParts(filepath);\n    let directory = system._root;\n    for (let i = 0, ii = parts.length - 1; i < ii; ++i) {\n      const name = parts[i];\n      const candidate = directory.getItem(name);\n      if (!candidate) {\n        directory = directory.addItem(name, new Directory());\n      } else if (candidate instanceof Directory) {\n        directory = candidate;\n      } else {\n        throw new Error('Failed to create directory: ' + filepath);\n      }\n    }\n    populate(directory, parts[parts.length - 1], paths[filepath]);\n  }\n\n  return system;\n};\n\n/**\n * Generate a factory for new files.\n * @param {object} config File config.\n * @return {function():File} Factory that creates a new file.\n */\nFileSystem.file = function (config) {\n  config = config || {};\n  return function () {\n    const file = new File();\n    if (config.hasOwnProperty('content')) {\n      file.setContent(config.content);\n    }\n    if (config.hasOwnProperty('mode')) {\n      file.setMode(config.mode);\n    } else {\n      file.setMode(438); // 0666\n    }\n    if (config.hasOwnProperty('uid')) {\n      file.setUid(config.uid);\n    }\n    if (config.hasOwnProperty('gid')) {\n      file.setGid(config.gid);\n    }\n    if (config.hasOwnProperty('atime')) {\n      file.setATime(config.atime);\n    } else if (config.hasOwnProperty('atimeMs')) {\n      file.setATime(new Date(config.atimeMs));\n    }\n    if (config.hasOwnProperty('ctime')) {\n      file.setCTime(config.ctime);\n    } else if (config.hasOwnProperty('ctimeMs')) {\n      file.setCTime(new Date(config.ctimeMs));\n    }\n    if (config.hasOwnProperty('mtime')) {\n      file.setMTime(config.mtime);\n    } else if (config.hasOwnProperty('mtimeMs')) {\n      file.setMTime(new Date(config.mtimeMs));\n    }\n    if (config.hasOwnProperty('birthtime')) {\n      file.setBirthtime(config.birthtime);\n    } else if (config.hasOwnProperty('birthtimeMs')) {\n      file.setBirthtime(new Date(config.birthtimeMs));\n    }\n    return file;\n  };\n};\n\n/**\n * Generate a factory for new symbolic links.\n * @param {object} config File config.\n * @return {function():File} Factory that creates a new symbolic link.\n */\nFileSystem.symlink = function (config) {\n  config = config || {};\n  return function () {\n    const link = new SymbolicLink();\n    if (config.hasOwnProperty('mode')) {\n      link.setMode(config.mode);\n    } else {\n      link.setMode(438); // 0666\n    }\n    if (config.hasOwnProperty('uid')) {\n      link.setUid(config.uid);\n    }\n    if (config.hasOwnProperty('gid')) {\n      link.setGid(config.gid);\n    }\n    if (config.hasOwnProperty('path')) {\n      link.setPath(config.path);\n    } else {\n      throw new Error('Missing \"path\" property');\n    }\n    if (config.hasOwnProperty('atime')) {\n      link.setATime(config.atime);\n    } else if (config.hasOwnProperty('atimeMs')) {\n      link.setATime(new Date(config.atimeMs));\n    }\n    if (config.hasOwnProperty('ctime')) {\n      link.setCTime(config.ctime);\n    } else if (config.hasOwnProperty('ctimeMs')) {\n      link.setCTime(new Date(config.ctimeMs));\n    }\n    if (config.hasOwnProperty('mtime')) {\n      link.setMTime(config.mtime);\n    } else if (config.hasOwnProperty('mtimeMs')) {\n      link.setMTime(new Date(config.mtimeMs));\n    }\n    if (config.hasOwnProperty('birthtime')) {\n      link.setBirthtime(config.birthtime);\n    } else if (config.hasOwnProperty('birthtimeMs')) {\n      link.setBirthtime(new Date(config.birthtimeMs));\n    }\n    return link;\n  };\n};\n\n/**\n * Generate a factory for new directories.\n * @param {object} config File config.\n * @return {function():Directory} Factory that creates a new directory.\n */\nFileSystem.directory = function (config) {\n  config = config || {};\n  return function () {\n    const dir = new Directory();\n    if (config.hasOwnProperty('mode')) {\n      dir.setMode(config.mode);\n    }\n    if (config.hasOwnProperty('uid')) {\n      dir.setUid(config.uid);\n    }\n    if (config.hasOwnProperty('gid')) {\n      dir.setGid(config.gid);\n    }\n    if (config.hasOwnProperty('items')) {\n      for (const name in config.items) {\n        populate(dir, name, config.items[name]);\n      }\n    }\n    if (config.hasOwnProperty('atime')) {\n      dir.setATime(config.atime);\n    } else if (config.hasOwnProperty('atimeMs')) {\n      dir.setATime(new Date(config.atimeMs));\n    }\n    if (config.hasOwnProperty('ctime')) {\n      dir.setCTime(config.ctime);\n    } else if (config.hasOwnProperty('ctimeMs')) {\n      dir.setCTime(new Date(config.ctimeMs));\n    }\n    if (config.hasOwnProperty('mtime')) {\n      dir.setMTime(config.mtime);\n    } else if (config.hasOwnProperty('mtimeMs')) {\n      dir.setMTime(new Date(config.mtimeMs));\n    }\n    if (config.hasOwnProperty('birthtime')) {\n      dir.setBirthtime(config.birthtime);\n    } else if (config.hasOwnProperty('birthtimeMs')) {\n      dir.setBirthtime(new Date(config.birthtimeMs));\n    }\n    return dir;\n  };\n};\n\n/**\n * Module exports.\n * @type {Function}\n */\nmodule.exports = FileSystem;\nexports = module.exports;\nexports.getPathParts = getPathParts;\nexports.getRealPath = getRealPath;\n"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;CAEA,MAAM,KAAK,QAAQ,KAAK;CACxB,MAAM,OAAO,QAAQ,OAAO;CAC5B,MAAM;CACN,MAAM;CACN,MAAM,EAAC;CACP,MAAM;CAEN,MAAM,YAAY,QAAQ,aAAa;CAGvC,SAAS,YAAY,UAAU;AAC7B,MAAI,aAAa,SAAS,WAAW,UAAU,CAE7C,QAAO,SAAS,GAAG,aAAa,GAAG,SAAS,MAAM,EAAE;AAEtD,SAAO;;CAGT,SAAS,aAAa,UAAU;EAG9B,MAAM,QAAQ,KAAK,iBAAiB,KAAK,QAAQ,SAAS,CAAC,CAAC,MAAM,KAAK,IAAI;AAC3E,QAAM,OAAO;AACb,MAAI,WAAW;AAEb,SAAM,OAAO;GAIb,MAAM,OAAO,SAHH,MAAM,OAAO,GAGG,OAAO,MAAM,OAAO,CAAC,aAAa;AAC5D,SAAM,QAAQ,KAAK;;AAErB,MAAI,MAAM,MAAM,SAAS,OAAO,GAC9B,OAAM,KAAK;AAEb,SAAO;;;;;;;;;;;CAYT,SAAS,WAAW,SAAS;AAC3B,YAAU,WAAW,EAAE;EAEvB,MAAM,YAAY,eAAe,UAAU,QAAQ,YAAY;EAC/D,MAAM,YAAY,eAAe,UAAU,QAAQ,YAAY;EAE/D,MAAM,OAAO,IAAI,WAAW;EAG5B,MAAM,WAAW,EAAE;AACnB,MAAI,UACF,UAAS,KAAK,QAAQ,KAAK,CAAC;AAG9B,MAAI,UACF,UAAS,KAAM,GAAG,UAAU,GAAG,QAAQ,IAAK,GAAG,QAAQ,CAAC;AAG1D,WAAS,QAAQ,SAAU,KAAK;GAC9B,MAAM,QAAQ,aAAa,IAAI;GAC/B,IAAI,YAAY;AAChB,QAAK,IAAI,IAAI,GAAG,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,GAAG;IAC9C,MAAM,OAAO,MAAM;IACnB,MAAM,YAAY,UAAU,QAAQ,KAAK;AACzC,QAAI,CAAC,UACH,aAAY,UAAU,QAAQ,MAAM,IAAI,WAAW,CAAC;aAC3C,qBAAqB,UAC9B,aAAY;QAEZ,OAAM,IAAI,MAAM,iCAAiC,IAAI;;IAGzD;;;;;AAMF,OAAK,QAAQ;;;;;;AAOf,YAAW,UAAU,UAAU,WAAY;AACzC,SAAO,KAAK;;;;;;;AAQd,YAAW,UAAU,UAAU,SAAU,UAAU;EACjD,MAAM,QAAQ,aAAa,SAAS;EACpC,MAAM,eAAe,aAAa,QAAQ,KAAK,CAAC;EAChD,IAAI,OAAO,KAAK;EAChB,IAAI,WAAW;AACf,OAAK,IAAI,IAAI,GAAG,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,GAAG;GAC9C,MAAM,OAAO,MAAM;AACnB,UAAO,gBAAgB,cAAc;AAInC,eAAW,KAAK,QAAQ,KAAK,QAAQ,SAAS,EAAE,KAAK,SAAS,CAAC;AAC/D,WAAO,KAAK,QAAQ,SAAS;;AAE/B,OAAI,MAAM;AACR,QAAI,gBAAgB,aAAa,SAAS,aAAa,IAIrD;SAAI,CAAC,KAAK,YAAY,CACpB,OAAM,IAAI,QAAQ,UAAU,SAAS;;AAGzC,QAAI,gBAAgB,KAClB,OAAM,IAAI,QAAQ,WAAW,SAAS;AAExC,WAAO,KAAK,QAAQ,KAAK;;AAE3B,OAAI,CAAC,KACH;AAEF,cAAW,KAAK,QAAQ,UAAU,KAAK;;AAEzC,SAAO;;CAGT,SAAS,aAAa,MAAM,UAAU,QAAQ;AAC5C,MAAI,SAAS,OACX,QAAO;AAET,MAAI,gBAAgB,UAClB,MAAK,MAAM,QAAQ,KAAK,MAAM,EAAE;GAC9B,MAAM,MAAM,aACV,KAAK,QAAQ,KAAK,EAClB,KAAK,KAAK,UAAU,KAAK,EACzB,OACD;AACD,OAAI,IACF,QAAO;;AAIb,SAAO;;;;;;;AAQT,YAAW,UAAU,cAAc,SAAU,MAAM;AAEjD,SAAO,YADgB,aAAa,KAAK,OAAO,YAAY,KAAK,KAAK,KAAK,CACzC;;;;;;;;;CAUpC,SAAS,SAAS,WAAW,MAAM,KAAK;EACtC,IAAI;AACJ,MAAI,OAAO,QAAQ,YAAY,OAAO,SAAS,IAAI,EAAE;AAEnD,UAAO,IAAI,MAAM;AACjB,QAAK,WAAW,IAAI;aACX,OAAO,QAAQ,WAExB,QAAO,KAAK;WACH,OAAO,QAAQ,UAAU;AAElC,UAAO,IAAI,WAAW;AACtB,QAAK,MAAM,OAAO,IAChB,UAAS,MAAM,KAAK,IAAI,KAAK;QAG/B,OAAM,IAAI,MAAM,uBAAuB,OAAO,MAAM,cAAc,KAAK;;;;AAMzE,MACE,gBAAgB,aAChB,KAAK,MAAM,CAAC,WAAW,KACvB,UAAU,QAAQ,KAAK,YAAY,WACnC,OAGA,WAAU,QAAQ,MAAM,KAAK;;;;;;;;;;;;AAcjC,YAAW,SAAS,SAAU,OAAO,SAAS;EAC5C,MAAM,SAAS,IAAI,WAAW,QAAQ;AAEtC,OAAK,MAAM,YAAY,OAAO;GAC5B,MAAM,QAAQ,aAAa,SAAS;GACpC,IAAI,YAAY,OAAO;AACvB,QAAK,IAAI,IAAI,GAAG,KAAK,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,GAAG;IAClD,MAAM,OAAO,MAAM;IACnB,MAAM,YAAY,UAAU,QAAQ,KAAK;AACzC,QAAI,CAAC,UACH,aAAY,UAAU,QAAQ,MAAM,IAAI,WAAW,CAAC;aAC3C,qBAAqB,UAC9B,aAAY;QAEZ,OAAM,IAAI,MAAM,iCAAiC,SAAS;;AAG9D,YAAS,WAAW,MAAM,MAAM,SAAS,IAAI,MAAM,UAAU;;AAG/D,SAAO;;;;;;;AAQT,YAAW,OAAO,SAAU,QAAQ;AAClC,WAAS,UAAU,EAAE;AACrB,SAAO,WAAY;GACjB,MAAM,OAAO,IAAI,MAAM;AACvB,OAAI,OAAO,eAAe,UAAU,CAClC,MAAK,WAAW,OAAO,QAAQ;AAEjC,OAAI,OAAO,eAAe,OAAO,CAC/B,MAAK,QAAQ,OAAO,KAAK;OAEzB,MAAK,QAAQ,IAAI;AAEnB,OAAI,OAAO,eAAe,MAAM,CAC9B,MAAK,OAAO,OAAO,IAAI;AAEzB,OAAI,OAAO,eAAe,MAAM,CAC9B,MAAK,OAAO,OAAO,IAAI;AAEzB,OAAI,OAAO,eAAe,QAAQ,CAChC,MAAK,SAAS,OAAO,MAAM;YAClB,OAAO,eAAe,UAAU,CACzC,MAAK,SAAS,IAAI,KAAK,OAAO,QAAQ,CAAC;AAEzC,OAAI,OAAO,eAAe,QAAQ,CAChC,MAAK,SAAS,OAAO,MAAM;YAClB,OAAO,eAAe,UAAU,CACzC,MAAK,SAAS,IAAI,KAAK,OAAO,QAAQ,CAAC;AAEzC,OAAI,OAAO,eAAe,QAAQ,CAChC,MAAK,SAAS,OAAO,MAAM;YAClB,OAAO,eAAe,UAAU,CACzC,MAAK,SAAS,IAAI,KAAK,OAAO,QAAQ,CAAC;AAEzC,OAAI,OAAO,eAAe,YAAY,CACpC,MAAK,aAAa,OAAO,UAAU;YAC1B,OAAO,eAAe,cAAc,CAC7C,MAAK,aAAa,IAAI,KAAK,OAAO,YAAY,CAAC;AAEjD,UAAO;;;;;;;;AASX,YAAW,UAAU,SAAU,QAAQ;AACrC,WAAS,UAAU,EAAE;AACrB,SAAO,WAAY;GACjB,MAAM,OAAO,IAAI,cAAc;AAC/B,OAAI,OAAO,eAAe,OAAO,CAC/B,MAAK,QAAQ,OAAO,KAAK;OAEzB,MAAK,QAAQ,IAAI;AAEnB,OAAI,OAAO,eAAe,MAAM,CAC9B,MAAK,OAAO,OAAO,IAAI;AAEzB,OAAI,OAAO,eAAe,MAAM,CAC9B,MAAK,OAAO,OAAO,IAAI;AAEzB,OAAI,OAAO,eAAe,OAAO,CAC/B,MAAK,QAAQ,OAAO,KAAK;OAEzB,OAAM,IAAI,MAAM,4BAA0B;AAE5C,OAAI,OAAO,eAAe,QAAQ,CAChC,MAAK,SAAS,OAAO,MAAM;YAClB,OAAO,eAAe,UAAU,CACzC,MAAK,SAAS,IAAI,KAAK,OAAO,QAAQ,CAAC;AAEzC,OAAI,OAAO,eAAe,QAAQ,CAChC,MAAK,SAAS,OAAO,MAAM;YAClB,OAAO,eAAe,UAAU,CACzC,MAAK,SAAS,IAAI,KAAK,OAAO,QAAQ,CAAC;AAEzC,OAAI,OAAO,eAAe,QAAQ,CAChC,MAAK,SAAS,OAAO,MAAM;YAClB,OAAO,eAAe,UAAU,CACzC,MAAK,SAAS,IAAI,KAAK,OAAO,QAAQ,CAAC;AAEzC,OAAI,OAAO,eAAe,YAAY,CACpC,MAAK,aAAa,OAAO,UAAU;YAC1B,OAAO,eAAe,cAAc,CAC7C,MAAK,aAAa,IAAI,KAAK,OAAO,YAAY,CAAC;AAEjD,UAAO;;;;;;;;AASX,YAAW,YAAY,SAAU,QAAQ;AACvC,WAAS,UAAU,EAAE;AACrB,SAAO,WAAY;GACjB,MAAM,MAAM,IAAI,WAAW;AAC3B,OAAI,OAAO,eAAe,OAAO,CAC/B,KAAI,QAAQ,OAAO,KAAK;AAE1B,OAAI,OAAO,eAAe,MAAM,CAC9B,KAAI,OAAO,OAAO,IAAI;AAExB,OAAI,OAAO,eAAe,MAAM,CAC9B,KAAI,OAAO,OAAO,IAAI;AAExB,OAAI,OAAO,eAAe,QAAQ,CAChC,MAAK,MAAM,QAAQ,OAAO,MACxB,UAAS,KAAK,MAAM,OAAO,MAAM,MAAM;AAG3C,OAAI,OAAO,eAAe,QAAQ,CAChC,KAAI,SAAS,OAAO,MAAM;YACjB,OAAO,eAAe,UAAU,CACzC,KAAI,SAAS,IAAI,KAAK,OAAO,QAAQ,CAAC;AAExC,OAAI,OAAO,eAAe,QAAQ,CAChC,KAAI,SAAS,OAAO,MAAM;YACjB,OAAO,eAAe,UAAU,CACzC,KAAI,SAAS,IAAI,KAAK,OAAO,QAAQ,CAAC;AAExC,OAAI,OAAO,eAAe,QAAQ,CAChC,KAAI,SAAS,OAAO,MAAM;YACjB,OAAO,eAAe,UAAU,CACzC,KAAI,SAAS,IAAI,KAAK,OAAO,QAAQ,CAAC;AAExC,OAAI,OAAO,eAAe,YAAY,CACpC,KAAI,aAAa,OAAO,UAAU;YACzB,OAAO,eAAe,cAAc,CAC7C,KAAI,aAAa,IAAI,KAAK,OAAO,YAAY,CAAC;AAEhD,UAAO;;;;;;;AAQX,QAAO,UAAU;AACjB,WAAU,OAAO;AACjB,SAAQ,eAAe;AACvB,SAAQ,cAAc"}