pax_global_header00006660000000000000000000000064152307044460014517gustar00rootroot0000000000000052 comment=2a22bfc5d3a432a606d9da0e2d87ba634aa3b1cb isaacs-node-tar-8a4b548/000077500000000000000000000000001523070444600150325ustar00rootroot00000000000000isaacs-node-tar-8a4b548/.github/000077500000000000000000000000001523070444600163725ustar00rootroot00000000000000isaacs-node-tar-8a4b548/.github/workflows/000077500000000000000000000000001523070444600204275ustar00rootroot00000000000000isaacs-node-tar-8a4b548/.github/workflows/ci.yml000066400000000000000000000017341523070444600215520ustar00rootroot00000000000000name: CI on: push: branches: ["main"] pull_request: paths: - 'src/**' - 'test/**' - '*.json' - '*.js' - '*.ts' - 'lib/**' - 'scripts/**' - '.github/workflows/ci.yml' - 'package.json' workflow_dispatch: permissions: contents: read jobs: build: strategy: matrix: node-version: [22.x, 24.x, 26.x] platform: - os: ubuntu-latest shell: bash - os: macos-latest shell: bash fail-fast: false runs-on: ${{ matrix.platform.os }} defaults: run: shell: ${{ matrix.platform.shell }} steps: - name: Checkout Repository uses: actions/checkout@v6 - name: Use Nodejs ${{ matrix.node-version }} uses: actions/setup-node@v6 with: node-version: ${{ matrix.node-version }} - name: Install dependencies run: npm install - name: Run Tests run: npm test -- -c -t0 isaacs-node-tar-8a4b548/.github/workflows/typedoc.yml000066400000000000000000000016461523070444600226300ustar00rootroot00000000000000name: typedoc on: push: branches: ["main"] workflow_dispatch: permissions: contents: read pages: write id-token: write concurrency: group: "pages" cancel-in-progress: true jobs: deploy: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v6 - name: Use Nodejs ${{ matrix.node-version }} uses: actions/setup-node@v6 with: node-version: 20.x - name: Install dependencies run: npm install - name: Generate typedocs run: npm run typedoc - name: Setup Pages uses: actions/configure-pages@v5 - name: Upload artifact uses: actions/upload-pages-artifact@v4 with: path: './docs' - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 isaacs-node-tar-8a4b548/.gitignore000066400000000000000000000010301523070444600170140ustar00rootroot00000000000000# This file is automatically added by @npmcli/template-oss. Do not edit. # ignore everything in the root /* # keep these !**/.gitignore !/.prettierignore !/.prettierrc.json !/.taprc !/src !/.tshy !/.commitlintrc.js !/tsconfig.json !/.eslintrc.js !/.eslintrc.local.* !/.github/ !/.gitignore !/.npmrc !/.release-please-manifest.json !/bin/ !/CHANGELOG* !/CODE_OF_CONDUCT.md !/index.js !/lib/ !/LICENSE* !/map.js !/package.json !/package-lock.json !/README* !/release-please-config.json !/scripts/ !/SECURITY.md !/tap-snapshots/ !/test/ isaacs-node-tar-8a4b548/.prettierignore000066400000000000000000000003111523070444600200700ustar00rootroot00000000000000/node_modules /tsconfig.json /package-lock.json /package.json /LICENSE.md /example /.github /dist /.env /tap-snapshots /.nyc_output /coverage /benchmark /.tap /test/fixture /test/fixtures /.tshy /docs isaacs-node-tar-8a4b548/.prettierrc.json000066400000000000000000000003521523070444600201660ustar00rootroot00000000000000{ "experimentalTernaries": true, "semi": false, "printWidth": 75, "tabWidth": 2, "useTabs": false, "singleQuote": true, "jsxSingleQuote": false, "bracketSameLine": true, "arrowParens": "avoid", "endOfLine": "lf" } isaacs-node-tar-8a4b548/.taprc000066400000000000000000000001151523070444600161410ustar00rootroot00000000000000# vim: set filetype=yaml : coverage-map: "map.js" timeout: 0 typecheck: true isaacs-node-tar-8a4b548/.tshy/000077500000000000000000000000001523070444600160775ustar00rootroot00000000000000isaacs-node-tar-8a4b548/.tshy/build.json000066400000000000000000000002261523070444600200710ustar00rootroot00000000000000{ "extends": "../tsconfig.json", "compilerOptions": { "rootDir": "../src", "module": "nodenext", "moduleResolution": "nodenext" } } isaacs-node-tar-8a4b548/.tshy/commonjs.json000066400000000000000000000004301523070444600206140ustar00rootroot00000000000000{ "extends": "./build.json", "include": [ "../src/**/*.ts", "../src/**/*.cts", "../src/**/*.tsx", "../src/**/*.json" ], "exclude": [ "../src/**/*.mts", "../src/package.json" ], "compilerOptions": { "outDir": "../.tshy-build/commonjs" } } isaacs-node-tar-8a4b548/.tshy/esm.json000066400000000000000000000003741523070444600175620ustar00rootroot00000000000000{ "extends": "./build.json", "include": [ "../src/**/*.ts", "../src/**/*.mts", "../src/**/*.tsx", "../src/**/*.json" ], "exclude": [ "../src/package.json" ], "compilerOptions": { "outDir": "../.tshy-build/esm" } } isaacs-node-tar-8a4b548/CHANGELOG.md000066400000000000000000000067061523070444600166540ustar00rootroot00000000000000# Changelog ## 7.5 - Added `zstd` compression support. - Consistent TOCTOU behavior in sync t.list - Only read from ustar block if not specified in Pax - Fix sync tar.list when file size reduces while reading - Sanitize absolute linkpaths properly - Prevent writing hardlink entries to the archive ahead of their file target ## 7.4 - Deprecate `onentry` in favor of `onReadEntry` for clarity. ## 7.3 - Add `onWriteEntry` option ## 7.2 - DRY the command definitions into a single `makeCommand` method, and update the type signatures to more appropriately infer the return type from the options and arguments provided. ## 7.1 - Update minipass to v7.1.0 - Update the type definitions of `write()` and `end()` methods on `Unpack` and `Parser` classes to be compatible with the NodeJS.WritableStream type in the latest versions of `@types/node`. ## 7.0 - Drop support for node <18 - Rewrite in TypeScript, provide ESM and CommonJS hybrid interface - Add tree-shake friendly exports, like `import('tar/create')` and `import('tar/read-entry')` to get individual functions or classes. - Add `chmod` option that defaults to false, and deprecate `noChmod`. That is, reverse the default option regarding explicitly setting file system modes to match tar entry settings. - Add `processUmask` option to avoid having to call `process.umask()` when `chmod: true` (or `noChmod: false`) is set. ## 6.2 - Add support for brotli compression - Add `maxDepth` option to prevent extraction into excessively deep folders. ## 6.1 - remove dead link to benchmarks (#313) (@yetzt) - add examples/explanation of using tar.t (@isaacs) - ensure close event is emitted after stream has ended (@webark) - replace deprecated String.prototype.substr() (@CommanderRoot, @lukekarrys) ## 6.0 - Drop support for node 6 and 8 - fix symlinks and hardlinks on windows being packed with `\`-style path targets ## 5.0 - Address unpack race conditions using path reservations - Change large-numbers errors from TypeError to Error - Add `TAR_*` error codes - Raise `TAR_BAD_ARCHIVE` warning/error when there are no valid entries found in an archive - do not treat ignored entries as an invalid archive - drop support for node v4 - unpack: conditionally use a file mapping to write files on Windows - Set more portable 'mode' value in portable mode - Set `portable` gzip option in portable mode ## 4.4 - Add 'mtime' option to tar creation to force mtime - unpack: only reuse file fs entries if nlink = 1 - unpack: rename before unlinking files on Windows - Fix encoding/decoding of base-256 numbers - Use `stat` instead of `lstat` when checking CWD - Always provide a callback to fs.close() ## 4.3 - Add 'transform' unpack option ## 4.2 - Fail when zlib fails ## 4.1 - Add noMtime flag for tar creation ## 4.0 - unpack: raise error if cwd is missing or not a dir - pack: don't drop dots from dotfiles when prefixing ## 3.1 - Support `@file.tar` as an entry argument to copy entries from one tar file to another. - Add `noPax` option - `noResume` option for tar.t - win32: convert `>| All interactions in this repo are covered by the [npm Code of Conduct](https://docs.npmjs.com/policies/conduct) The npm cli team may, at its own discretion, moderate, remove, or edit any interactions such as pull requests, issues, and comments. isaacs-node-tar-8a4b548/LICENSE.md000066400000000000000000000030201523070444600164310ustar00rootroot00000000000000# Blue Oak Model License Version 1.0.0 ## Purpose This license gives everyone as much permission to work with this software as possible, while protecting contributors from liability. ## Acceptance In order to receive this license, you must agree to its rules. The rules of this license are both obligations under that agreement and conditions to your license. You must not do anything with this software that triggers a rule that you cannot or will not follow. ## Copyright Each contributor licenses you to do everything with this software that would otherwise infringe that contributor's copyright in it. ## Notices You must ensure that everyone who gets a copy of any part of this software from you, with or without changes, also gets the text of this license or a link to . ## Excuse If anyone notifies you in writing that you have not complied with [Notices](#notices), you can keep your license by taking all practical steps to comply within 30 days after the notice. If you do not do so, your license ends immediately. ## Patent Each contributor licenses you to do everything with this software that would otherwise infringe any patent claims they can license or become able to license. ## Reliability No contributor can revoke this license. ## No Liability ***As far as the law allows, this software comes as is, without any warranty or condition, and no contributor will be liable to anyone for any damages related to this software or this license, under any kind of legal claim.*** isaacs-node-tar-8a4b548/README.md000066400000000000000000001461751523070444600163270ustar00rootroot00000000000000# node-tar Fast and full-featured Tar for Node.js The API is designed to mimic the behavior of `tar(1)` on unix systems. If you are familiar with how tar works, most of this will hopefully be straightforward for you. If not, then hopefully this module can teach you useful unix skills that may come in handy someday :) ## Security Information Significant efforts have been taken to harden this library against a wide variety of filesystem based attacks, especially as it is used to unpack packages that are published by unknown agents to [the npm registry](https://npmjs.com/). A brief overview of some of the hardening that has gone into this implementation. (Note that most of these are disabled if `preservePaths: true` is set in the options.) - Paths that attempt to walk up outside of the extraction target are ignored, and a warning is raised. - `Link` and `SymbolicLink` entries are not allowed to target locations outside of the extraction folder. - Extraction is not allowed through a symbolic link that appears within the extraction target. - Absolute paths are turned into relative paths underneath the extraction target. - Character Device, Block Device, and FIFO entries are never extracted. - File and directory ownership is not mutated unless `forceChown` is set, or the extraction is run as root. - File and directory modes in the archive are ignored, unless the `chmod: true` option is set. - A path-reservation system is used to ensure that even when multiple entries are being extracted in parallel, subsequent entries with the same filename will not interfere with one another (for example, exchanging a file with a symbolic link while it is being written to). - Unicode characters in path names are fully normalized, to prevent evading these protections with unicode equivalences. It is frankly unlikely that any tar implementation in JavaScript is going to be as secure as this one, unless a similar amount of work is put into it, putting it to the test over many years of intensive use and scrutiny. You can vibe-code a tar extractor in an afternoon, but you'll regret it. > [!WARNING] > > **However**, all that being said, _care must still be taken_ > when dealing with data from unknown sources, especially when > extracting files, with this or any library, no matter how > hardened it may be. It is _your_ responsibility to use this > library safely. 1. **NEVER** extract tarball data into a folder that could be potentially controlled by an unknown actor. A clever attacker can swap out the target of an extracted file with a symbolic link to some location of their choosing, resulting in writing files outside the target folder. There is no reasonable way to harden against this category of attack, and security reports about it will be closed. [TOCTOU](https://cwe.mitre.org/data/definitions/367.html) exposure is unavoidable when creating files based on entries in an archive file. 2. If you are unpacking tarballs that may come from an unknown source, it is **highly recommended** that you use a filter function that rejects all hardlinks and symbolic links. Link files are historically the root of nearly every file extraction vulnerability. (npm filters links out of package artifacts for this reason.) 3. If you are extracting tarballs that are compressed (eg, with gzip, brotli, or zstd), then it is a very good idea to also filter out any files that are excessively large. Even if you are restricting the size of the archive file itself, an excessively large file of repetitive data can compress down very small, and extract to take up a lot of disk space. 4. **Stay up to date.** Old versions of tar are not maintained or tested for newly discovered security advisories, and should be assumed to contain every known security vulnerability, and many that are unknown. If you find a security vulnerability in node-tar, where it is not properly enforcing the intended security protections, then please report it using the GitHub Security Advisories system, where it will be triaged and corrected if possible. ## Background A "tar file" or "tarball" is an archive of file system entries (directories, files, links, etc.) The name comes from "tape archive". If you run `man tar` on almost any Unix command line, you'll learn quite a bit about what it can do, and its history. Tar has 5 main top-level commands: - `c` Create an archive - `r` Replace entries within an archive - `u` Update entries within an archive (ie, replace if they're newer) - `t` List out the contents of an archive - `x` Extract an archive to disk The other flags and options modify how this top level function works. ## High-Level API These 5 functions are the high-level API. All of them have a single-character name (for unix nerds familiar with `tar(1)`) as well as a long name (for everyone else). All the high-level functions take the following arguments, all three of which are optional and may be omitted. 1. `options` - An optional object specifying various options 2. `paths` - An array of paths to add or extract 3. `callback` - Called when the command is completed, if async. (If sync or no file specified, providing a callback throws a `TypeError`.) If the command is sync (ie, if `options.sync=true`), then the callback is not allowed, since the action will be completed immediately. If a `file` argument is specified, and the command is async, then a `Promise` is returned. In this case, if async, a callback may be provided which is called when the command is completed. If a `file` option is not specified, then a stream is returned. For `create`, this is a readable stream of the generated archive. For `list` and `extract` this is a writable stream that an archive should be written into. If a file is not specified, then a callback is not allowed, because you're already getting a stream to work with. `replace` and `update` only work on existing archives, and so require a `file` argument. Sync commands without a file argument return a stream that acts on its input immediately in the same tick. For readable streams, this means that all of the data is immediately available by calling `stream.read()`. For writable streams, it will be acted upon as soon as it is provided, but this can be at any time. ### Warnings and Errors Tar emits warnings and errors for recoverable and unrecoverable situations, respectively. In many cases, a warning only affects a single entry in an archive, or is simply informing you that it's modifying an entry to comply with the settings provided. Unrecoverable warnings will always raise an error (ie, emit `'error'` on streaming actions, throw for non-streaming sync actions, reject the returned Promise for non-streaming async operations, or call a provided callback with an `Error` as the first argument). Recoverable errors will raise an error only if `strict: true` is set in the options. Respond to (recoverable) warnings by listening to the `warn` event. Handlers receive 3 arguments: - `code` String. One of the error codes below. This may not match `data.code`, which preserves the original error code from fs and zlib. - `message` String. More details about the error. - `data` Metadata about the error. An `Error` object for errors raised by fs and zlib. All fields are attached to errors raisd by tar. Typically contains the following fields, as relevant: - `tarCode` The tar error code. - `code` Either the tar error code, or the error code set by the underlying system. - `file` The archive file being read or written. - `cwd` Working directory for creation and extraction operations. - `entry` The entry object (if it could be created) for `TAR_ENTRY_INFO`, `TAR_ENTRY_INVALID`, and `TAR_ENTRY_ERROR` warnings. - `header` The header object (if it could be created, and the entry could not be created) for `TAR_ENTRY_INFO` and `TAR_ENTRY_INVALID` warnings. - `recoverable` Boolean. If `false`, then the warning will emit an `error`, even in non-strict mode. #### Error Codes - `TAR_ENTRY_INFO` An informative error indicating that an entry is being modified, but otherwise processed normally. For example, removing `/` or `C:\` from absolute paths if `preservePaths` is not set. - `TAR_ENTRY_INVALID` An indication that a given entry is not a valid tar archive entry, and will be skipped. This occurs when: - a checksum fails, - a `linkpath` is missing for a link type, or - a `linkpath` is provided for a non-link type. If every entry in a parsed archive raises an `TAR_ENTRY_INVALID` error, then the archive is presumed to be unrecoverably broken, and `TAR_BAD_ARCHIVE` will be raised. - `TAR_ENTRY_ERROR` The entry appears to be a valid tar archive entry, but encountered an error which prevented it from being unpacked. This occurs when: - an unrecoverable fs error happens during unpacking, - an entry is trying to extract into an excessively deep location (by default, limited to 1024 subfolders), - an entry has `..` in the path and `preservePaths` is not set, or - an entry is extracting through a symbolic link, when `preservePaths` is not set. - `TAR_ENTRY_UNSUPPORTED` An indication that a given entry is a valid archive entry, but of a type that is unsupported, and so will be skipped in archive creation or extracting. - `TAR_ABORT` When parsing gzipped-encoded archives, the parser will abort the parse process raise a warning for any zlib errors encountered. Aborts are considered unrecoverable for both parsing and unpacking. - `TAR_BAD_ARCHIVE` The archive file is totally hosed. This can happen for a number of reasons, and always occurs at the end of a parse or extract: - An entry body was truncated before seeing the full number of bytes. - The archive contained only invalid entries, indicating that it is likely not an archive, or at least, not an archive this library can parse. `TAR_BAD_ARCHIVE` is considered informative for parse operations, but unrecoverable for extraction. Note that, if encountered at the end of an extraction, tar WILL still have extracted as much it could from the archive, so there may be some garbage files to clean up. Errors that occur deeper in the system (ie, either the filesystem or zlib) will have their error codes left intact, and a `tarCode` matching one of the above will be added to the warning metadata or the raised error object. Errors generated by tar will have one of the above codes set as the `error.code` field as well, but since errors originating in zlib or fs will have their original codes, it's better to read `error.tarCode` if you wish to see how tar is handling the issue. ### Examples The API mimics the `tar(1)` command line functionality, with aliases for more human-readable option and function names. The goal is that if you know how to use `tar(1)` in Unix, then you know how to use `import('tar')` in JavaScript. To replicate `tar czf my-tarball.tgz files and folders`, you'd do: ```js import { create } from 'tar' create( { gzip: , file: 'my-tarball.tgz' }, ['some', 'files', 'and', 'folders'] ).then(_ => { .. tarball has been created .. }) ``` To replicate `tar cz files and folders > my-tarball.tgz`, you'd do: ```js // if you're familiar with the tar(1) cli flags, this can be nice import * as tar from 'tar' tar.c( { // 'z' is alias for 'gzip' option z: }, ['some', 'files', 'and', 'folders'] ).pipe(fs.createWriteStream('my-tarball.tgz')) ``` To replicate `tar xf my-tarball.tgz` you'd do: ```js tar.x( // or `tar.extract` { // or `file:` f: 'my-tarball.tgz' } ).then(_=> { .. tarball has been dumped in cwd .. }) ``` To replicate `cat my-tarball.tgz | tar x -C some-dir --strip=1`: ```js fs.createReadStream('my-tarball.tgz').pipe( tar.x({ strip: 1, C: 'some-dir', // alias for cwd:'some-dir', also ok }), ) ``` To replicate `tar tf my-tarball.tgz`, do this: ```js tar.t({ file: 'my-tarball.tgz', onReadEntry: entry => { .. do whatever with it .. } }) ``` For example, to just get the list of filenames from an archive: ```js const getEntryFilenames = async tarballFilename => { const filenames = [] await tar.t({ file: tarballFilename, onReadEntry: entry => filenames.push(entry.path), }) return filenames } ``` To replicate `cat my-tarball.tgz | tar t` do: ```js fs.createReadStream('my-tarball.tgz') .pipe(tar.t()) .on('entry', entry => { .. do whatever with it .. }) ``` To do anything synchronous, add `sync: true` to the options. Note that sync functions don't take a callback and don't return a promise. When the function returns, it's already done. Sync methods without a file argument return a sync stream, which flushes immediately. But, of course, it still won't be done until you `.end()` it. ```js const getEntryFilenamesSync = tarballFilename => { const filenames = [] tar.t({ file: tarballFilename, onReadEntry: entry => filenames.push(entry.path), sync: true, }) return filenames } ``` To filter entries, add `filter: ` to the options. Tar-creating methods call the filter with `filter(path, stat)`. Tar-reading methods (including extraction) call the filter with `filter(path, entry)`. The filter is called in the `this`-context of the `Pack` or `Unpack` stream object. The arguments list to `tar t` and `tar x` specify a list of filenames to extract or list, so they're equivalent to a filter that tests if the file is in the list. For those who _aren't_ fans of tar's single-character command names: ``` tar.c === tar.create tar.r === tar.replace (appends to archive, file is required) tar.u === tar.update (appends if newer, file is required) tar.x === tar.extract tar.t === tar.list ``` Keep reading for all the command descriptions and options, as well as the low-level API that they are built on. ### tar.c(options, fileList, callback) [alias: tar.create] Create a tarball archive. The `fileList` is an array of paths to add to the tarball. Adding a directory also adds its children recursively. An entry in `fileList` that starts with an `@` symbol is a tar archive whose entries will be added. To add a file that starts with `@`, prepend it with `./`. The following options are supported: - `file` Write the tarball archive to the specified filename. If this is specified, then the callback will be fired when the file has been written, and a promise will be returned that resolves when the file is written. If a filename is not specified, then a Readable Stream will be returned which will emit the file data. [Alias: `f`] - `sync` Act synchronously. If this is set, then any provided file will be fully written after the call to `tar.c`. If this is set, and a file is not provided, then the resulting stream will already have the data ready to `read` or `emit('data')` as soon as you request it. - `onwarn` A function that will get called with `(code, message, data)` for any warnings encountered. (See "Warnings and Errors") - `strict` Treat warnings as crash-worthy errors. Default false. - `cwd` The current working directory for creating the archive. Defaults to `process.cwd()`. [Alias: `C`] - `prefix` A path portion to prefix onto the entries in the archive. - `gzip` Set to any truthy value to create a gzipped archive, or an object with settings for `zlib.Gzip()` [Alias: `z`] - `filter` A function that gets called with `(path, stat)` for each entry being added. Return `true` to add the entry to the archive, or `false` to omit it. - `portable` Omit metadata that is system-specific: `ctime`, `atime`, `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note that `mtime` is still included, because this is necessary for other time-based operations. Additionally, `mode` is set to a "reasonable default" for most unix systems, based on a `umask` value of `0o22`. - `preservePaths` Allow absolute paths. By default, `/` is stripped from absolute paths. [Alias: `P`] - `mode` The mode to set on the created file archive - `noDirRecurse` Do not recursively archive the contents of directories. [Alias: `n`] - `follow` Set to true to pack the targets of symbolic links. Without this option, symbolic links are archived as such. [Alias: `L`, `h`] - `noPax` Suppress pax extended headers. Note that this means that long paths and linkpaths will be truncated, and large or negative numeric values may be interpreted incorrectly. - `noMtime` Set to true to omit writing `mtime` values for entries. Note that this prevents using other mtime-based features like `tar.update` or the `keepNewer` option with the resulting tar archive. [Alias: `m`, `no-mtime`] - `mtime` Set to a `Date` object to force a specific `mtime` for everything added to the archive. Overridden by `noMtime`. - `onWriteEntry` Called with each `WriteEntry` or `WriteEntrySync` that is created in the course of writing the archive. The following options are mostly internal, but can be modified in some advanced use cases, such as re-using caches between runs. - `linkCache` A Map object containing the device and inode value for any file whose nlink is > 1, to identify hard links. - `statCache` A Map object that caches calls `lstat`. - `readdirCache` A Map object that caches calls to `readdir`. - `jobs` A number specifying how many concurrent jobs to run. Defaults to 4. - `maxReadSize` The maximum buffer size for `fs.read()` operations. Defaults to 16 MB. #### Using `onWriteEntry` to alter entries The `onWriteEntry` function, if provided, will get a reference to each `entry` object on its way into the archive. If any fields on this entry are changed, then these changes will be reflected in the entry that is written to the archive. The return value of the function is ignored. All that matters is the final state of the entry object. This can also be used to track the files added to an archive, for example. ```js import * as tar from 'tar' const filesAdded = [] tar.c( { sync: true, file: 'lowercase-executable.tar', onWriteEntry(entry) { // initially, it's uppercase and 0o644 console.log('adding', entry.path, entry.stat.mode.toString(8)) // make all the paths lowercase entry.path = entry.path.toLowerCase() // make the entry executable entry.stat.mode = 0o755 // in the archive, it's lowercase and 0o755 filesAdded.push([entry.path, entry.stat.mode.toString(8)]) }, }, ['./bin'], ) console.log('added', filesAdded) ``` Then, if the `./bin` directory contained `SOME-BIN`, it would show up in the archive as: ``` $ node create-lowercase-executable.js adding ./bin/SOME-BIN 644 added [[ './bin/some-bin', '755' ]] $ tar cvf lowercase-executable.tar -rwxr-xr-x 0 isaacs 20 47731 Aug 14 08:56 ./bin/some-bin ``` with a lowercase name and a mode of `0o755`. ### tar.x(options, fileList, callback) [alias: tar.extract] Extract a tarball archive. The `fileList` is an array of paths to extract from the tarball. If no paths are provided, then all the entries are extracted. If the archive is gzipped, then tar will detect this and unzip it. Note that all directories that are created will be forced to be writable, readable, and listable by their owner, to avoid cases where a directory prevents extraction of child entries by virtue of its mode. Most extraction errors will cause a `warn` event to be emitted. If the `cwd` is missing, or not a directory, then the extraction will fail completely. The following options are supported: - `cwd` Extract files relative to the specified directory. Defaults to `process.cwd()`. If provided, this must exist and must be a directory. [Alias: `C`] - `file` The archive file to extract. If not specified, then a Writable stream is returned where the archive data should be written. [Alias: `f`] - `sync` Create files and directories synchronously. - `strict` Treat warnings as crash-worthy errors. Default false. - `filter` A function that gets called with `(path, entry)` for each entry being unpacked. Return `true` to unpack the entry from the archive, or `false` to skip it. - `newer` Set to true to keep the existing file on disk if it's newer than the file in the archive. [Alias: `keep-newer`, `keep-newer-files`] - `keep` Do not overwrite existing files. In particular, if a file appears more than once in an archive, later copies will not overwrite earlier copies. [Alias: `k`, `keep-existing`] - `preservePaths` Allow absolute paths, paths containing `..`, and extracting through symbolic links. By default, `/` is stripped from absolute paths, `..` paths are not extracted, and any file whose location would be modified by a symbolic link is not extracted. [Alias: `P`] - `unlink` Unlink files before creating them. Without this option, tar overwrites existing files, which preserves existing hardlinks. With this option, existing hardlinks will be broken, as will any symlink that would affect the location of an extracted file. [Alias: `U`] - `strip` Remove the specified number of leading path elements. Pathnames with fewer elements will be silently skipped. Note that the pathname is edited after applying the filter, but before security checks. [Alias: `strip-components`, `stripComponents`] - `preserveOwner` If true, tar will set the `uid` and `gid` of extracted entries to the `uid` and `gid` fields in the archive. This defaults to true when run as root, and false otherwise. If false, then files and directories will be set with the owner and group of the user running the process. This is similar to `-p` in `tar(1)`, but ACLs and other system-specific data is never unpacked in this implementation, and modes are set by default already. [Alias: `p`] - `uid` Set to a number to force ownership of all extracted files and folders, and all implicitly created directories, to be owned by the specified user id, regardless of the `uid` field in the archive. Cannot be used along with `preserveOwner`. Requires also setting a `gid` option. - `gid` Set to a number to force ownership of all extracted files and folders, and all implicitly created directories, to be owned by the specified group id, regardless of the `gid` field in the archive. Cannot be used along with `preserveOwner`. Requires also setting a `uid` option. - `noMtime` Set to true to omit writing `mtime` value for extracted entries. [Alias: `m`, `no-mtime`] - `transform` Provide a function that takes an `entry` object, and returns a stream, or any falsey value. If a stream is provided, then that stream's data will be written instead of the contents of the archive entry. If a falsey value is provided, then the entry is written to disk as normal. (To exclude items from extraction, use the `filter` option described above.) - `onReadEntry` A function that gets called with `(entry)` for each entry that passes the filter. - `onwarn` A function that will get called with `(code, message, data)` for any warnings encountered. (See "Warnings and Errors") - `chmod` Set to true to call `fs.chmod()` to ensure that the extracted file matches the entry mode. This may necessitate a call to the deprecated and thread-unsafe `process.umask()` method to determine the default umask value, unless a `processUmask` options is also provided. Otherwise tar will extract with whatever mode is provided, and let the process `umask` apply normally. - `processUmask` Set to an explicit numeric value to avoid calling `process.umask()` when `chmod: true` is set. - `maxDepth` The maximum depth of subfolders to extract into. This defaults to 1024. Anything deeper than the limit will raise a warning and skip the entry. Set to `Infinity` to remove the limitation. - `maxDecompressionRatio` Defaults to 1000. The maximum ratio of decommpressed bytes to compressed bytes, in a compressed archive. Set to `Infinity` to allow explosive decompression. The following options are mostly internal, but can be modified in some advanced use cases, such as re-using caches between runs. - `maxReadSize` The maximum buffer size for `fs.read()` operations. Defaults to 16 MB. - `umask` Filter the modes of entries like `process.umask()`. - `dmode` Default mode for directories - `fmode` Default mode for files - `maxMetaEntrySize` The maximum size of meta entries that is supported. Defaults to 1 MB. Note that using an asynchronous stream type with the `transform` option will cause undefined behavior in sync extractions. [MiniPass](http://npm.im/minipass)-based streams are designed for this use case. ### tar.t(options, fileList, callback) [alias: tar.list] List the contents of a tarball archive. The `fileList` is an array of paths to list from the tarball. If no paths are provided, then all the entries are listed. If the archive is gzipped, then tar will detect this and unzip it. If the `file` option is _not_ provided, then returns an event emitter that emits `entry` events with `tar.ReadEntry` objects. However, they don't emit `'data'` or `'end'` events. (If you want to get actual readable entries, use the `tar.Parser` class instead.) If a `file` option _is_ provided, then the return value will be a promise that resolves when the file has been fully traversed in async mode, or `undefined` if `sync: true` is set. Thus, you _must_ specify an `onReadEntry` method in order to do anything useful with the data it parses. The following options are supported: - `file` The archive file to list. If not specified, then a Writable stream is returned where the archive data should be written. [Alias: `f`] - `sync` Read the specified file synchronously. (This has no effect when a file option isn't specified, because entries are emitted as fast as they are parsed from the stream anyway.) - `strict` Treat warnings as crash-worthy errors. Default false. - `filter` A function that gets called with `(path, entry)` for each entry being listed. Return `true` to emit the entry from the archive, or `false` to skip it. - `onReadEntry` A function that gets called with `(entry)` for each entry that passes the filter. This is important for when `file` is set, because there is no other way to do anything useful with this method. - `maxReadSize` The maximum buffer size for `fs.read()` operations. Defaults to 16 MB. - `noResume` By default, `entry` streams are resumed immediately after the call to `onReadEntry`. Set `noResume: true` to suppress this behavior. Note that by opting into this, the stream will never complete until the entry data is consumed. - `onwarn` A function that will get called with `(code, message, data)` for any warnings encountered. (See "Warnings and Errors") - `maxDecompressionRatio` Defaults to 1000. The maximum ratio of decommpressed bytes to compressed bytes, in a compressed archive. Set to `Infinity` to allow explosive decompression. ### tar.u(options, fileList, callback) [alias: tar.update] Add files to an archive if they are newer than the entry already in the tarball archive. The `fileList` is an array of paths to add to the tarball. Adding a directory also adds its children recursively. An entry in `fileList` that starts with an `@` symbol is a tar archive whose entries will be added. To add a file that starts with `@`, prepend it with `./`. The following options are supported: - `file` Required. Write the tarball archive to the specified filename. [Alias: `f`] - `sync` Act synchronously. If this is set, then any provided file will be fully written after the call to `tar.c`. - `onwarn` A function that will get called with `(code, message, data)` for any warnings encountered. (See "Warnings and Errors") - `strict` Treat warnings as crash-worthy errors. Default false. - `cwd` The current working directory for adding entries to the archive. Defaults to `process.cwd()`. [Alias: `C`] - `prefix` A path portion to prefix onto the entries in the archive. - `gzip` Set to any truthy value to create a gzipped archive, or an object with settings for `zlib.Gzip()` [Alias: `z`] - `filter` A function that gets called with `(path, stat)` for each entry being added. Return `true` to add the entry to the archive, or `false` to omit it. - `portable` Omit metadata that is system-specific: `ctime`, `atime`, `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note that `mtime` is still included, because this is necessary for other time-based operations. Additionally, `mode` is set to a "reasonable default" for most unix systems, based on a `umask` value of `0o22`. - `preservePaths` Allow absolute paths. By default, `/` is stripped from absolute paths. [Alias: `P`] - `maxReadSize` The maximum buffer size for `fs.read()` operations. Defaults to 16 MB. - `noDirRecurse` Do not recursively archive the contents of directories. [Alias: `n`] - `follow` Set to true to pack the targets of symbolic links. Without this option, symbolic links are archived as such. [Alias: `L`, `h`] - `noPax` Suppress pax extended headers. Note that this means that long paths and linkpaths will be truncated, and large or negative numeric values may be interpreted incorrectly. - `noMtime` Set to true to omit writing `mtime` values for entries. Note that this prevents using other mtime-based features like `tar.update` or the `keepNewer` option with the resulting tar archive. [Alias: `m`, `no-mtime`] - `mtime` Set to a `Date` object to force a specific `mtime` for everything added to the archive. Overridden by `noMtime`. - `onWriteEntry` Called with each `WriteEntry` or `WriteEntrySync` that is created in the course of writing the archive. ### tar.r(options, fileList, callback) [alias: tar.replace] Add files to an existing archive. Because later entries override earlier entries, this effectively replaces any existing entries. The `fileList` is an array of paths to add to the tarball. Adding a directory also adds its children recursively. An entry in `fileList` that starts with an `@` symbol is a tar archive whose entries will be added. To add a file that starts with `@`, prepend it with `./`. The following options are supported: - `file` Required. Write the tarball archive to the specified filename. [Alias: `f`] - `sync` Act synchronously. If this is set, then any provided file will be fully written after the call to `tar.c`. - `onwarn` A function that will get called with `(code, message, data)` for any warnings encountered. (See "Warnings and Errors") - `strict` Treat warnings as crash-worthy errors. Default false. - `cwd` The current working directory for adding entries to the archive. Defaults to `process.cwd()`. [Alias: `C`] - `prefix` A path portion to prefix onto the entries in the archive. - `gzip` Set to any truthy value to create a gzipped archive, or an object with settings for `zlib.Gzip()` [Alias: `z`] - `filter` A function that gets called with `(path, stat)` for each entry being added. Return `true` to add the entry to the archive, or `false` to omit it. - `portable` Omit metadata that is system-specific: `ctime`, `atime`, `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note that `mtime` is still included, because this is necessary for other time-based operations. Additionally, `mode` is set to a "reasonable default" for most unix systems, based on a `umask` value of `0o22`. - `preservePaths` Allow absolute paths. By default, `/` is stripped from absolute paths. [Alias: `P`] - `maxReadSize` The maximum buffer size for `fs.read()` operations. Defaults to 16 MB. - `noDirRecurse` Do not recursively archive the contents of directories. [Alias: `n`] - `follow` Set to true to pack the targets of symbolic links. Without this option, symbolic links are archived as such. [Alias: `L`, `h`] - `noPax` Suppress pax extended headers. Note that this means that long paths and linkpaths will be truncated, and large or negative numeric values may be interpreted incorrectly. - `noMtime` Set to true to omit writing `mtime` values for entries. Note that this prevents using other mtime-based features like `tar.update` or the `keepNewer` option with the resulting tar archive. [Alias: `m`, `no-mtime`] - `mtime` Set to a `Date` object to force a specific `mtime` for everything added to the archive. Overridden by `noMtime`. - `onWriteEntry` Called with each `WriteEntry` or `WriteEntrySync` that is created in the course of writing the archive. ## Low-Level API ### class Pack A readable tar stream. Has all the standard readable stream interface stuff. `'data'` and `'end'` events, `read()` method, `pause()` and `resume()`, etc. #### constructor(options) The following options are supported: - `onwarn` A function that will get called with `(code, message, data)` for any warnings encountered. (See "Warnings and Errors") - `strict` Treat warnings as crash-worthy errors. Default false. - `cwd` The current working directory for creating the archive. Defaults to `process.cwd()`. - `prefix` A path portion to prefix onto the entries in the archive. - `gzip` Set to any truthy value to create a gzipped archive, or an object with settings for `zlib.Gzip()` - `filter` A function that gets called with `(path, stat)` for each entry being added. Return `true` to add the entry to the archive, or `false` to omit it. - `portable` Omit metadata that is system-specific: `ctime`, `atime`, `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note that `mtime` is still included, because this is necessary for other time-based operations. Additionally, `mode` is set to a "reasonable default" for most unix systems, based on a `umask` value of `0o22`. - `preservePaths` Allow absolute paths. By default, `/` is stripped from absolute paths. - `linkCache` A Map object containing the device and inode value for any file whose nlink is > 1, to identify hard links. - `statCache` A Map object that caches calls `lstat`. - `readdirCache` A Map object that caches calls to `readdir`. - `jobs` A number specifying how many concurrent jobs to run. Defaults to 4. - `maxReadSize` The maximum buffer size for `fs.read()` operations. Defaults to 16 MB. - `noDirRecurse` Do not recursively archive the contents of directories. - `follow` Set to true to pack the targets of symbolic links. Without this option, symbolic links are archived as such. - `noPax` Suppress pax extended headers. Note that this means that long paths and linkpaths will be truncated, and large or negative numeric values may be interpreted incorrectly. - `noMtime` Set to true to omit writing `mtime` values for entries. Note that this prevents using other mtime-based features like `tar.update` or the `keepNewer` option with the resulting tar archive. - `mtime` Set to a `Date` object to force a specific `mtime` for everything added to the archive. Overridden by `noMtime`. - `onWriteEntry` Called with each `WriteEntry` or `WriteEntrySync` that is created in the course of writing the archive. #### add(path) Adds an entry to the archive. Returns the Pack stream. #### write(path) Adds an entry to the archive. Returns true if flushed. #### end() Finishes the archive. ### class PackSync Synchronous version of `Pack`. ### class Unpack A writable stream that unpacks a tar archive onto the file system. All the normal writable stream stuff is supported. `write()` and `end()` methods, `'drain'` events, etc. Note that all directories that are created will be forced to be writable, readable, and listable by their owner, to avoid cases where a directory prevents extraction of child entries by virtue of its mode. `'close'` is emitted when it's done writing stuff to the file system. Most unpack errors will cause a `warn` event to be emitted. If the `cwd` is missing, or not a directory, then an error will be emitted. #### constructor(options) - `cwd` Extract files relative to the specified directory. Defaults to `process.cwd()`. If provided, this must exist and must be a directory. - `filter` A function that gets called with `(path, entry)` for each entry being unpacked. Return `true` to unpack the entry from the archive, or `false` to skip it. - `newer` Set to true to keep the existing file on disk if it's newer than the file in the archive. - `keep` Do not overwrite existing files. In particular, if a file appears more than once in an archive, later copies will not overwrite earlier copies. - `preservePaths` Allow absolute paths, paths containing `..`, and extracting through symbolic links. By default, `/` is stripped from absolute paths, `..` paths are not extracted, and any file whose location would be modified by a symbolic link is not extracted. - `unlink` Unlink files before creating them. Without this option, tar overwrites existing files, which preserves existing hardlinks. With this option, existing hardlinks will be broken, as will any symlink that would affect the location of an extracted file. - `strip` Remove the specified number of leading path elements. Pathnames with fewer elements will be silently skipped. Note that the pathname is edited after applying the filter, but before security checks. - `umask` Filter the modes of entries like `process.umask()`. - `dmode` Default mode for directories - `fmode` Default mode for files - `maxMetaEntrySize` The maximum size of meta entries that is supported. Defaults to 1 MB. - `preserveOwner` If true, tar will set the `uid` and `gid` of extracted entries to the `uid` and `gid` fields in the archive. This defaults to true when run as root, and false otherwise. If false, then files and directories will be set with the owner and group of the user running the process. This is similar to `-p` in `tar(1)`, but ACLs and other system-specific data is never unpacked in this implementation, and modes are set by default already. - `win32` True if on a windows platform. Causes behavior where filenames containing `<|>?` chars are converted to windows-compatible values while being unpacked. - `uid` Set to a number to force ownership of all extracted files and folders, and all implicitly created directories, to be owned by the specified user id, regardless of the `uid` field in the archive. Cannot be used along with `preserveOwner`. Requires also setting a `gid` option. - `gid` Set to a number to force ownership of all extracted files and folders, and all implicitly created directories, to be owned by the specified group id, regardless of the `gid` field in the archive. Cannot be used along with `preserveOwner`. Requires also setting a `uid` option. - `noMtime` Set to true to omit writing `mtime` value for extracted entries. - `transform` Provide a function that takes an `entry` object, and returns a stream, or any falsey value. If a stream is provided, then that stream's data will be written instead of the contents of the archive entry. If a falsey value is provided, then the entry is written to disk as normal. (To exclude items from extraction, use the `filter` option described above.) - `strict` Treat warnings as crash-worthy errors. Default false. - `onReadEntry` A function that gets called with `(entry)` for each entry that passes the filter. - `onwarn` A function that will get called with `(code, message, data)` for any warnings encountered. (See "Warnings and Errors") - `chmod` Set to true to call `fs.chmod()` to ensure that the extracted file matches the entry mode. This may necessitate a call to the deprecated and thread-unsafe `process.umask()` method to determine the default umask value, unless a `processUmask` options is also provided. Otherwise tar will extract with whatever mode is provided, and let the process `umask` apply normally. - `processUmask` Set to an explicit numeric value to avoid calling `process.umask()` when `chmod: true` is set. - `maxDepth` The maximum depth of subfolders to extract into. This defaults to 1024. Anything deeper than the limit will raise a warning and skip the entry. Set to `Infinity` to remove the limitation. - `maxDecompressionRatio` Defaults to 1000. The maximum ratio of decommpressed bytes to compressed bytes, in a compressed archive. Set to `Infinity` to allow explosive decompression. ### class UnpackSync Synchronous version of `Unpack`. Note that using an asynchronous stream type with the `transform` option will cause undefined behavior in sync unpack streams. [MiniPass](http://npm.im/minipass)-based streams are designed for this use case. ### class tar.Parser A writable stream that parses a tar archive stream. All the standard writable stream stuff is supported. If the archive is gzipped, then tar will detect this and unzip it. Emits `'entry'` events with `tar.ReadEntry` objects, which are themselves readable streams that you can pipe wherever. Each `entry` will not emit until the one before it is flushed through, so make sure to either consume the data (with `on('data', ...)` or `.pipe(...)`) or throw it away with `.resume()` to keep the stream flowing. #### constructor(options) Returns an event emitter that emits `entry` events with `tar.ReadEntry` objects. The following options are supported: - `strict` Treat warnings as crash-worthy errors. Default false. - `filter` A function that gets called with `(path, entry)` for each entry being listed. Return `true` to emit the entry from the archive, or `false` to skip it. - `onReadEntry` A function that gets called with `(entry)` for each entry that passes the filter. - `onwarn` A function that will get called with `(code, message, data)` for any warnings encountered. (See "Warnings and Errors") #### abort(error) Stop all parsing activities. This is called when there are zlib errors. It also emits an unrecoverable warning with the error provided. ### class tar.ReadEntry extends [MiniPass](http://npm.im/minipass) A representation of an entry that is being read out of a tar archive. It has the following fields: - `extended` The extended metadata object provided to the constructor. - `globalExtended` The global extended metadata object provided to the constructor. - `remain` The number of bytes remaining to be written into the stream. - `blockRemain` The number of 512-byte blocks remaining to be written into the stream. - `ignore` Whether this entry should be ignored. - `meta` True if this represents metadata about the next entry, false if it represents a filesystem object. - All the fields from the header, extended header, and global extended header are added to the ReadEntry object. So it has `path`, `type`, `size`, `mode`, and so on. #### constructor(header, extended, globalExtended) Create a new ReadEntry object with the specified header, extended header, and global extended header values. ### class tar.WriteEntry extends [MiniPass](http://npm.im/minipass) A representation of an entry that is being written from the file system into a tar archive. Emits data for the Header, and for the Pax Extended Header if one is required, as well as any body data. Creating a WriteEntry for a directory does not also create WriteEntry objects for all of the directory contents. It has the following fields: - `path` The path field that will be written to the archive. By default, this is also the path from the cwd to the file system object. - `portable` Omit metadata that is system-specific: `ctime`, `atime`, `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note that `mtime` is still included, because this is necessary for other time-based operations. Additionally, `mode` is set to a "reasonable default" for most unix systems, based on a `umask` value of `0o22`. - `myuid` If supported, the uid of the user running the current process. - `myuser` The `env.USER` string if set, or `''`. Set as the entry `uname` field if the file's `uid` matches `this.myuid`. - `maxReadSize` The maximum buffer size for `fs.read()` operations. Defaults to 1 MB. - `linkCache` A Map object containing the device and inode value for any file whose nlink is > 1, to identify hard links. - `statCache` A Map object that caches calls `lstat`. - `preservePaths` Allow absolute paths. By default, `/` is stripped from absolute paths. - `cwd` The current working directory for creating the archive. Defaults to `process.cwd()`. - `absolute` The absolute path to the entry on the filesystem. By default, this is `path.resolve(this.cwd, this.path)`, but it can be overridden explicitly. - `strict` Treat warnings as crash-worthy errors. Default false. - `win32` True if on a windows platform. Causes behavior where paths replace `\` with `/` and filenames containing the windows-compatible forms of `<|>?:` characters are converted to actual `<|>?:` characters in the archive. - `noPax` Suppress pax extended headers. Note that this means that long paths and linkpaths will be truncated, and large or negative numeric values may be interpreted incorrectly. - `noMtime` Set to true to omit writing `mtime` values for entries. Note that this prevents using other mtime-based features like `tar.update` or the `keepNewer` option with the resulting tar archive. #### constructor(path, options) `path` is the path of the entry as it is written in the archive. The following options are supported: - `portable` Omit metadata that is system-specific: `ctime`, `atime`, `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note that `mtime` is still included, because this is necessary for other time-based operations. Additionally, `mode` is set to a "reasonable default" for most unix systems, based on a `umask` value of `0o22`. - `maxReadSize` The maximum buffer size for `fs.read()` operations. Defaults to 1 MB. - `linkCache` A Map object containing the device and inode value for any file whose nlink is > 1, to identify hard links. - `statCache` A Map object that caches calls `lstat`. - `preservePaths` Allow absolute paths. By default, `/` is stripped from absolute paths. - `cwd` The current working directory for creating the archive. Defaults to `process.cwd()`. - `absolute` The absolute path to the entry on the filesystem. By default, this is `path.resolve(this.cwd, this.path)`, but it can be overridden explicitly. - `strict` Treat warnings as crash-worthy errors. Default false. - `win32` True if on a windows platform. Causes behavior where paths replace `\` with `/`. - `onwarn` A function that will get called with `(code, message, data)` for any warnings encountered. (See "Warnings and Errors") - `noMtime` Set to true to omit writing `mtime` values for entries. Note that this prevents using other mtime-based features like `tar.update` or the `keepNewer` option with the resulting tar archive. - `umask` Set to restrict the modes on the entries in the archive, somewhat like how umask works on file creation. Defaults to `process.umask()` on unix systems, or `0o22` on Windows. #### warn(message, data) If strict, emit an error with the provided message. Otherwise, emit a `'warn'` event with the provided message and data. ### class tar.WriteEntry.Sync Synchronous version of tar.WriteEntry ### class tar.WriteEntry.Tar A version of tar.WriteEntry that gets its data from a tar.ReadEntry instead of from the filesystem. #### constructor(readEntry, options) `readEntry` is the entry being read out of another archive. The following options are supported: - `portable` Omit metadata that is system-specific: `ctime`, `atime`, `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note that `mtime` is still included, because this is necessary for other time-based operations. Additionally, `mode` is set to a "reasonable default" for most unix systems, based on a `umask` value of `0o22`. - `preservePaths` Allow absolute paths. By default, `/` is stripped from absolute paths. - `strict` Treat warnings as crash-worthy errors. Default false. - `onwarn` A function that will get called with `(code, message, data)` for any warnings encountered. (See "Warnings and Errors") - `noMtime` Set to true to omit writing `mtime` values for entries. Note that this prevents using other mtime-based features like `tar.update` or the `keepNewer` option with the resulting tar archive. ### class tar.Header A class for reading and writing header blocks. It has the following fields: - `nullBlock` True if decoding a block which is entirely composed of `0x00` null bytes. (Useful because tar files are terminated by at least 2 null blocks.) - `cksumValid` True if the checksum in the header is valid, false otherwise. - `needPax` True if the values, as encoded, will require a Pax extended header. - `path` The path of the entry. - `mode` The 4 lowest-order octal digits of the file mode. That is, read/write/execute permissions for world, group, and owner, and the setuid, setgid, and sticky bits. - `uid` Numeric user id of the file owner - `gid` Numeric group id of the file owner - `size` Size of the file in bytes - `mtime` Modified time of the file - `cksum` The checksum of the header. This is generated by adding all the bytes of the header block, treating the checksum field itself as all ascii space characters (that is, `0x20`). - `type` The human-readable name of the type of entry this represents, or the alphanumeric key if unknown. - `typeKey` The alphanumeric key for the type of entry this header represents. - `linkpath` The target of Link and SymbolicLink entries. - `uname` Human-readable user name of the file owner - `gname` Human-readable group name of the file owner - `devmaj` The major portion of the device number. Always `0` for files, directories, and links. - `devmin` The minor portion of the device number. Always `0` for files, directories, and links. - `atime` File access time. - `ctime` File change time. #### constructor(data, [offset=0]) `data` is optional. It is either a Buffer that should be interpreted as a tar Header starting at the specified offset and continuing for 512 bytes, or a data object of keys and values to set on the header object, and eventually encode as a tar Header. #### decode(block, offset) Decode the provided buffer starting at the specified offset. Buffer length must be greater than 512 bytes. #### set(data) Set the fields in the data object. #### encode(buffer, offset) Encode the header fields into the buffer at the specified offset. Returns `this.needPax` to indicate whether a Pax Extended Header is required to properly encode the specified data. ### class tar.Pax An object representing a set of key-value pairs in an Pax extended header entry. It has the following fields. Where the same name is used, they have the same semantics as the tar.Header field of the same name. - `global` True if this represents a global extended header, or false if it is for a single entry. - `atime` - `charset` - `comment` - `ctime` - `gid` - `gname` - `linkpath` - `mtime` - `path` - `size` - `uid` - `uname` - `dev` - `ino` - `nlink` #### constructor(object, global) Set the fields set in the object. `global` is a boolean that defaults to false. #### encode() Return a Buffer containing the header and body for the Pax extended header entry, or `null` if there is nothing to encode. #### encodeBody() Return a string representing the body of the pax extended header entry. #### encodeField(fieldName) Return a string representing the key/value encoding for the specified fieldName, or `''` if the field is unset. ### tar.Pax.parse(string, extended, global) Return a new Pax object created by parsing the contents of the string provided. If the `extended` object is set, then also add the fields from that object. (This is necessary because multiple metadata entries can occur in sequence.) ### tar.types A translation table for the `type` field in tar headers. #### tar.types.name.get(code) Get the human-readable name for a given alphanumeric code. #### tar.types.code.get(name) Get the alphanumeric code for a given human-readable name. isaacs-node-tar-8a4b548/map.js000066400000000000000000000004001523070444600161370ustar00rootroot00000000000000import { basename } from 'path' const map = test => test === 'map.js' ? test : test === 'unpack.js' ? ['src/unpack.ts', 'src/mkdir.ts'] : test === 'load-all.js' ? [] : `src/${test.replace(/js$/, 'ts')}` export default test => map(basename(test)) isaacs-node-tar-8a4b548/package-lock.json000066400000000000000000005634631523070444600202670ustar00rootroot00000000000000{ "name": "tar", "version": "7.5.22", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "tar", "version": "7.5.22", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "devDependencies": { "@types/node": "^25.9.1", "chmodr": "^2.0.2", "end-of-stream": "^1.4.3", "esbuild": "^0.28.0", "events-to-array": "^2.0.3", "mutate-fs": "^2.1.1", "nock": "^13.5.4", "oxlint": "^1.67.0", "oxlint-tsgolint": "^0.23.0", "prettier": "^3.8.3", "rimraf": "^6.1.2", "tap": "^21.7.4", "tshy": "^4.1.2", "typedoc": "^0.28.19" }, "engines": { "node": ">=18" } }, "node_modules/@alcalzone/ansi-tokenize": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.1.3.tgz", "integrity": "sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw==", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^4.0.0" }, "engines": { "node": ">=14.13.1" } }, "node_modules/@base2/pretty-print-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz", "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/@bcoe/v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", "dev": true, "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, "engines": { "node": ">=12" } }, "node_modules/@esbuild/aix-ppc64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", "cpu": [ "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "aix" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-arm": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", "cpu": [ "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "android" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "android" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "android" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", "cpu": [ "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", "cpu": [ "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", "cpu": [ "loong64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", "cpu": [ "mips64el" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", "cpu": [ "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", "cpu": [ "riscv64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", "cpu": [ "s390x" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/netbsd-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "netbsd" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "netbsd" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/openbsd-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "openbsd" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "openbsd" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/openharmony-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "openharmony" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "sunos" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", "cpu": [ "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { "node": ">=18" } }, "node_modules/@gar/promise-retry": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.3.tgz", "integrity": "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==", "dev": true, "license": "MIT", "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@gerrit0/mini-shiki": { "version": "3.23.0", "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.23.0.tgz", "integrity": "sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg==", "dev": true, "license": "MIT", "dependencies": { "@shikijs/engine-oniguruma": "^3.23.0", "@shikijs/langs": "^3.23.0", "@shikijs/themes": "^3.23.0", "@shikijs/types": "^3.23.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "node_modules/@isaacs/cliui": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "license": "ISC", "dependencies": { "minipass": "^7.0.4" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@isaacs/ts-node-temp-fork-for-pr-2009": { "version": "10.9.7", "resolved": "https://registry.npmjs.org/@isaacs/ts-node-temp-fork-for-pr-2009/-/ts-node-temp-fork-for-pr-2009-10.9.7.tgz", "integrity": "sha512-9f0bhUr9TnwwpgUhEpr3FjxSaH/OHaARkE2F9fM0lS4nIs2GNerrvGwQz493dk0JKlTaGYVrKbq36vA/whZ34g==", "dev": true, "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node14": "*", "@tsconfig/node16": "*", "@tsconfig/node18": "*", "@tsconfig/node20": "*", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1" }, "bin": { "ts-node": "dist/bin.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=4.2" }, "peerDependenciesMeta": { "@swc/core": { "optional": true }, "@swc/wasm": { "optional": true } } }, "node_modules/@isaacs/ts-node-temp-fork-for-pr-2009/node_modules/diff": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/@isaacs/which": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/@isaacs/which/-/which-7.0.4.tgz", "integrity": "sha512-qXToWZFY9CKvWsveV3R5VHNJLQkHTIJXO9J4Xa1UgNwVCRA2LEsmvWC84MIdnezFLsjn2Q+GzbL/8yVF1/ozJw==", "dev": true, "license": "ISC", "dependencies": { "isexe": "^4.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@istanbuljs/schema": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/@npmcli/agent": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.2.tgz", "integrity": "sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg==", "dev": true, "license": "ISC", "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^11.2.1", "socks-proxy-agent": "^8.0.3" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/fs": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz", "integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==", "dev": true, "license": "ISC", "dependencies": { "semver": "^7.3.5" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/git": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-7.0.2.tgz", "integrity": "sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg==", "dev": true, "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/promise-spawn": "^9.0.0", "ini": "^6.0.0", "lru-cache": "^11.2.1", "npm-pick-manifest": "^11.0.1", "proc-log": "^6.0.0", "semver": "^7.3.5", "which": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/installed-package-contents": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz", "integrity": "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==", "dev": true, "license": "ISC", "dependencies": { "npm-bundled": "^5.0.0", "npm-normalize-package-bin": "^5.0.0" }, "bin": { "installed-package-contents": "bin/index.js" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/node-gyp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-5.0.0.tgz", "integrity": "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==", "dev": true, "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/package-json": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.5.tgz", "integrity": "sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==", "dev": true, "license": "ISC", "dependencies": { "@npmcli/git": "^7.0.0", "glob": "^13.0.0", "hosted-git-info": "^9.0.0", "json-parse-even-better-errors": "^5.0.0", "proc-log": "^6.0.0", "semver": "^7.5.3", "spdx-expression-parse": "^4.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/promise-spawn": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", "integrity": "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==", "dev": true, "license": "ISC", "dependencies": { "which": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/redact": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz", "integrity": "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==", "dev": true, "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@npmcli/run-script": { "version": "10.0.4", "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.4.tgz", "integrity": "sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==", "dev": true, "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^5.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "node-gyp": "^12.1.0", "proc-log": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@oxlint-tsgolint/darwin-arm64": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.23.0.tgz", "integrity": "sha512-gOs9PVr2wEg4ox9z0aJo+RKhhImW86YL5N6yav8BK/rgPsIrwN/igSZ+pbRr723NFvUNKde9fgMhRA6JrXAOZw==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@oxlint-tsgolint/darwin-x64": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-0.23.0.tgz", "integrity": "sha512-kjJ8B+7n4tB9VJdxS5A9GdJt6/bYpzbu4lXp2uO1S3sRmCB5gDEABlGoiePNApRWaW+xqL4b4xgiE727jSLhuA==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@oxlint-tsgolint/linux-arm64": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-0.23.0.tgz", "integrity": "sha512-6dCZuKNu135seMXilkRk9SpCx6i1XgmiipYGalLij5WVRX6ZYS8c4xI7preN/zv9fCXhsQclTIMDu2Y/cytTjw==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@oxlint-tsgolint/linux-x64": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-0.23.0.tgz", "integrity": "sha512-3bdilnyA7kmSTjK27rvjIjSxL5SIg3wt7vwNiRkouWB83ytssyKnuGvxSYJxgMEmFpSutzaBzcCUM2jDtPGcgA==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@oxlint-tsgolint/win32-arm64": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-0.23.0.tgz", "integrity": "sha512-j+OEp44SVYiQ+ZD+uttsX7u6L9SvmbbQ77SO1pSFCcJlsVMeCk8qZsjhKfGKuT/jIA+ipOJMVs/+pqUfObBWNw==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@oxlint-tsgolint/win32-x64": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-0.23.0.tgz", "integrity": "sha512-5MyjFuqf+g8OUPJBSGWHJtmoWnzFJYyOg4To9WMQshZYEWig/vtu7JtJ03VWnzHv9LJkAUeApY0gVCOywFR/iQ==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@oxlint/binding-android-arm-eabi": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.67.0.tgz", "integrity": "sha512-VrSi571rDv1N8HaEDM+DEX8nmT0y9jJo8tzzW13vsOWTx59xQczCIJx68n2zWOXRT5YKZsOZXp4qkHN/10x4mw==", "cpu": [ "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "android" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxlint/binding-android-arm64": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.67.0.tgz", "integrity": "sha512-l6+NdYxMoRohix5r5bbigW16LPicceCwGcQ6LKKuE1kUdjgFfQolJjrJsQYPFetIs78Gxj/G/f5TEGoTCwj9nQ==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "android" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxlint/binding-darwin-arm64": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.67.0.tgz", "integrity": "sha512-jOzXxS1AxFxhImLIRbtGIMrEwaXcgMw3gR57WB1cRk8ai+vpr6726kxXqVvlNsrXtJ/FrmOm8RxlC0m8SW24Qg==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxlint/binding-darwin-x64": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.67.0.tgz", "integrity": "sha512-3DFAVY94OqjIZHXIPz37yGRSWwOFTAqChQ64/M69GYLawzP0KiwdhDNfqdKKYT0bTR/DNxmMnQsj3ns+8+X/Lg==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxlint/binding-freebsd-x64": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.67.0.tgz", "integrity": "sha512-e4dDKZuLu8TR9DEBssWSDahlPgZBwojTTHZUvnjBRJfJJbpxYCjfjKfi0Z1+CSLMiJBwI2yCDtRM1XJQaARjmg==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxlint/binding-linux-arm-gnueabihf": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.67.0.tgz", "integrity": "sha512-BKytFdcQzbITV3xlnzDUDTEDtbUMCCiC4EaNTDZ4FyT8gdNvBC4gfiLucXp/sQl0XU3p7syTlorUWVVVBZab2g==", "cpu": [ "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxlint/binding-linux-arm-musleabihf": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.67.0.tgz", "integrity": "sha512-XYAv0esBDX7BpTzRDjVX2Vdj+zndd8ll2dFQiaeQ6zTZr7A8GRDTN7fH3FP3jU+O0vCDx85oH/EtG7BzPgAXuw==", "cpu": [ "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxlint/binding-linux-arm64-gnu": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.67.0.tgz", "integrity": "sha512-zizRMjA0i6u/2B0evgda04iycu+MoNuf1pBy6Eh+1CjC5wMEG7qN5zdDKTCvFc0KSYSDM9QTG3gjZHirgtQuKg==", "cpu": [ "arm64" ], "dev": true, "libc": [ "glibc" ], "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxlint/binding-linux-arm64-musl": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.67.0.tgz", "integrity": "sha512-zB/Tf6sUjmmvvbva9Gj3JTJ8rJ9t4I8/U0o6vSRtd0DRIsIuyegBwJAzhSUFQHdMijIRJkW0exs/yBhpw2S20w==", "cpu": [ "arm64" ], "dev": true, "libc": [ "musl" ], "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxlint/binding-linux-ppc64-gnu": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.67.0.tgz", "integrity": "sha512-kgU40Gt74CK0TCsF51KZymkIwN9U0BajKsMijB52zPqOeZU9NAHkA/NSQkZDHEaCakx42DxhXkODiAqf2b4Gug==", "cpu": [ "ppc64" ], "dev": true, "libc": [ "glibc" ], "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxlint/binding-linux-riscv64-gnu": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.67.0.tgz", "integrity": "sha512-tOYhkk/iaG9aD3FvGpBFd1Lrw0x0RaVoJBxjUkfNzS50rC5NS5BteNCwgr8A2zCdADrIIoze6D7u6U5Ic++/iQ==", "cpu": [ "riscv64" ], "dev": true, "libc": [ "glibc" ], "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxlint/binding-linux-riscv64-musl": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.67.0.tgz", "integrity": "sha512-sEtywrPb+0b+tHYl1SDCrw903fiC4eyKoNqzP3v+f2JT3Xcv4NEYG+P8rj+eEnX7IWhqV/xj8/JmcmVj21CXaA==", "cpu": [ "riscv64" ], "dev": true, "libc": [ "musl" ], "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxlint/binding-linux-s390x-gnu": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.67.0.tgz", "integrity": "sha512-BvR8Moa0zCLxroOx4vZaZN9nUfwAUpSTwjZdxZyKy4bv3PrzrXrxKR/ZQ0L9wNSvlPhnMJeZfa3q5w6ZCTuN6Q==", "cpu": [ "s390x" ], "dev": true, "libc": [ "glibc" ], "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxlint/binding-linux-x64-gnu": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.67.0.tgz", "integrity": "sha512-mm2cxM6fksOpq6l0uFws8BUGKAR4dNa/cZCn37Npq7PFbhD5HDJqWfnoIvTaeRKMy5XdS2tO0MA0qbHDrnXAAA==", "cpu": [ "x64" ], "dev": true, "libc": [ "glibc" ], "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxlint/binding-linux-x64-musl": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.67.0.tgz", "integrity": "sha512-WmbMuLapKyDlobMkXAaAL0Y+Uczh4LETfIfQsUpbId4Ip8Ai82/jqeYTOoUCkuuhBFapgqP253+d83tLKOksJg==", "cpu": [ "x64" ], "dev": true, "libc": [ "musl" ], "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxlint/binding-openharmony-arm64": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.67.0.tgz", "integrity": "sha512-9g/PqxYJelzzTAOR5Y+RiRqdeydhEuXv2KxNeFcAKQ7UsvnWSY1OP4MsuPMbTO2Pf70tz7mFhl1j13H3fyh+8g==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "openharmony" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxlint/binding-win32-arm64-msvc": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.67.0.tgz", "integrity": "sha512-2VhwE6Gatb0vJGnN0TBuQMbKCOiZlSQ/zJvVWYLK4a9d4iDiJOen/yVQkGpmsJ90MuH66fzi0kEKI0jRQMDxGA==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxlint/binding-win32-ia32-msvc": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.67.0.tgz", "integrity": "sha512-EQ3VExXfeM1InbE5+JjufhZZTWy+kHUwgt3yZR7gQ47Je/mE0WspQPan0OJznh493L5anM210YNJtH1PXjTSFg==", "cpu": [ "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@oxlint/binding-win32-x64-msvc": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.67.0.tgz", "integrity": "sha512-bw24y+/1MHS4QDkons3YyHkPT9uCMoLHHgQhb+mb8NOjTYwub1CZ+K9Ngr8aO5DMrDrkqHwTzlTwFP2vS8Y/ZQ==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "license": "MIT", "optional": true, "engines": { "node": ">=14" } }, "node_modules/@shikijs/engine-oniguruma": { "version": "3.23.0", "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz", "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", "dev": true, "license": "MIT", "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "node_modules/@shikijs/langs": { "version": "3.23.0", "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.23.0.tgz", "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", "dev": true, "license": "MIT", "dependencies": { "@shikijs/types": "3.23.0" } }, "node_modules/@shikijs/themes": { "version": "3.23.0", "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.23.0.tgz", "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", "dev": true, "license": "MIT", "dependencies": { "@shikijs/types": "3.23.0" } }, "node_modules/@shikijs/types": { "version": "3.23.0", "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.23.0.tgz", "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", "dev": true, "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "node_modules/@shikijs/vscode-textmate": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "dev": true, "license": "MIT" }, "node_modules/@sigstore/bundle": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", "dev": true, "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@sigstore/core": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.2.1.tgz", "integrity": "sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g==", "dev": true, "license": "Apache-2.0", "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@sigstore/protobuf-specs": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.1.tgz", "integrity": "sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g==", "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.17.0 || >=20.5.0" } }, "node_modules/@sigstore/sign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-4.1.1.tgz", "integrity": "sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@gar/promise-retry": "^1.0.2", "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.2.0", "@sigstore/protobuf-specs": "^0.5.0", "make-fetch-happen": "^15.0.4", "proc-log": "^6.1.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@sigstore/tuf": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.2.tgz", "integrity": "sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.5.0", "tuf-js": "^4.1.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@sigstore/verify": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.1.tgz", "integrity": "sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.2.1", "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@tapjs/after": { "version": "3.3.10", "resolved": "https://registry.npmjs.org/@tapjs/after/-/after-3.3.10.tgz", "integrity": "sha512-zAeZAUZ9Su5PgTvczJLzlbUObpAMSFqnd+mIVp1TpgVn6Hc/elPEzZ9oe1hWdz8bInKdisdcx0LK0sv2qJO/dQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "is-actual-promise": "^1.0.1" }, "engines": { "node": "20 || >=22" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tapjs/after-each": { "version": "4.3.10", "resolved": "https://registry.npmjs.org/@tapjs/after-each/-/after-each-4.3.10.tgz", "integrity": "sha512-KxcIPOOQ9NtH84kiKfT1bFvRH5b3mJxjv7YP4f5hDxMp5Vqw2BzRW/Rq1StpXKCa+simwEUAu+8wINHXhRSOCQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "function-loop": "^4.0.0" }, "engines": { "node": "20 || >=22" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tapjs/asserts": { "version": "4.3.10", "resolved": "https://registry.npmjs.org/@tapjs/asserts/-/asserts-4.3.10.tgz", "integrity": "sha512-3MkErdpu7U6AdFzHVChOu0oaN+1ZmbPXOhpangZEdtMtSxYVV9H2Nxc8b4VDCImOgwexBs8LBrOOz58/x3JmUg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@tapjs/stack": "4.3.3", "is-actual-promise": "^1.0.1", "tcompare": "9.3.2", "trivial-deferred": "^2.0.0" }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tapjs/before": { "version": "4.3.10", "resolved": "https://registry.npmjs.org/@tapjs/before/-/before-4.3.10.tgz", "integrity": "sha512-PEdVsfd8kmihyhgTN2YAAysdw1ZVFszQEClc66dyxN+0OSh9KvVxHFWITEj6JfMPi64ciiS+eyk7SKHfdRp08Q==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "is-actual-promise": "^1.0.1" }, "engines": { "node": "20 || >=22" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tapjs/before-each": { "version": "4.3.10", "resolved": "https://registry.npmjs.org/@tapjs/before-each/-/before-each-4.3.10.tgz", "integrity": "sha512-ND90VdYmN4jURtcNXC+BuH+hXr4tFecXHrJq8yM6/ns6Qa4jsBvkQdUv4Ct19rqOAzGidie41ro3Kq0V/KTonw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "function-loop": "^4.0.0" }, "engines": { "node": "20 || >=22" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tapjs/chdir": { "version": "3.3.10", "resolved": "https://registry.npmjs.org/@tapjs/chdir/-/chdir-3.3.10.tgz", "integrity": "sha512-taCFaRSlIZzs9b0HYGstsukl/mn5In6XBoaX3XssIivGMR0fPzjb3CKB7fA+tYUYTn+BZ14OJxwWb2FGx9sOGA==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tapjs/config": { "version": "5.6.4", "resolved": "https://registry.npmjs.org/@tapjs/config/-/config-5.6.4.tgz", "integrity": "sha512-mLUpuW4rtPYoLXGBxd8SoUQRVvNmudL+8FlZXV2N1pVPjEt9xDZNtqslDGcueVYMzT8nM5xZlSOeCJL0WUf5mg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@tapjs/core": "4.5.8", "@tapjs/test": "4.4.8", "chalk": "^5.6.2", "jackspeak": "^4.2.3", "polite-json": "^5.0.0", "tap-yaml": "4.4.2", "walk-up-path": "^4.0.0" }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { "@tapjs/core": "4.5.8", "@tapjs/test": "4.4.8" } }, "node_modules/@tapjs/core": { "version": "4.5.8", "resolved": "https://registry.npmjs.org/@tapjs/core/-/core-4.5.8.tgz", "integrity": "sha512-A6RTyqbkpYAZoJkmg3T8mgaHe6hx0ROjomfAGkjjRcvASInzN0dCG0Ynu1rP2YWGGSFGXV8UqWUMIVGBrtQTqw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@tapjs/processinfo": "^3.1.12", "@tapjs/stack": "4.3.3", "@tapjs/test": "4.4.8", "async-hook-domain": "^4.0.1", "diff": "^8.0.2", "is-actual-promise": "^1.0.1", "minipass": "^7.0.4", "signal-exit": "4.1", "tap-parser": "18.3.4", "tap-yaml": "4.4.2", "tcompare": "9.3.2", "trivial-deferred": "^2.0.0" }, "engines": { "node": "20 || >=22" } }, "node_modules/@tapjs/error-serdes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/@tapjs/error-serdes/-/error-serdes-4.3.2.tgz", "integrity": "sha512-NNJTvozk0rY4Vhf94SECEYSO38/eQvbZvZSrmzrmD2cj5YYx7l+7qQC0fcgYpIzwlA31kciesbhnV8rINiKejg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "minipass": "^7.0.4" }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@tapjs/filter": { "version": "4.3.10", "resolved": "https://registry.npmjs.org/@tapjs/filter/-/filter-4.3.10.tgz", "integrity": "sha512-89tnzQDXrsKGxKozQ4IzX8XwqaBoINnapky8YFjmiYBEFXo3kYZJtr3m/ppEaDkzgJyb3kUFyF7ZqJQjlbg2CQ==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tapjs/fixture": { "version": "4.3.10", "resolved": "https://registry.npmjs.org/@tapjs/fixture/-/fixture-4.3.10.tgz", "integrity": "sha512-5DelAGzyrOci4Axaqo846+53EANoTgyPXAu2eO8qGNN/RSQeerWpH0x6H/vd3s0QevusWTw1X+KzGzx7pyusgg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "mkdirp": "^3.0.0", "rimraf": "^6.0.0" }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tapjs/intercept": { "version": "4.3.10", "resolved": "https://registry.npmjs.org/@tapjs/intercept/-/intercept-4.3.10.tgz", "integrity": "sha512-99uzsc6VRpsUbbwsuWv9HjMF2QAce+daKbCrKg8Z8JvZ5Mg1bBR9PNXjG12NnZjljlTA3k+aJ+bs8umdu6kEUg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@tapjs/after": "3.3.10", "@tapjs/stack": "4.3.3" }, "engines": { "node": "20 || >=22" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tapjs/mock": { "version": "4.4.8", "resolved": "https://registry.npmjs.org/@tapjs/mock/-/mock-4.4.8.tgz", "integrity": "sha512-MRxOLJYGKQ0dyONymPZS7i7Z/re5vz+OO/Ik44lUGx82VWZ2J3I1ldquEKGm7aq4RGIjf666jgHa9wrgUmhJiA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@tapjs/after": "3.3.10", "@tapjs/stack": "4.3.3", "resolve-import": "^2.4.0", "walk-up-path": "^4.0.0" }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tapjs/node-serialize": { "version": "4.3.10", "resolved": "https://registry.npmjs.org/@tapjs/node-serialize/-/node-serialize-4.3.10.tgz", "integrity": "sha512-obAwYrhwqMR1szqctPFF3bpkw/1jBXU2A7F2a8MLirII3+/VcyR4cEb8nSCUSCjNvzPHX1vhmQ8lUADB0+1Xxg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@tapjs/error-serdes": "4.3.2", "@tapjs/stack": "4.3.3", "tap-parser": "18.3.4" }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tapjs/processinfo": { "version": "3.1.12", "resolved": "https://registry.npmjs.org/@tapjs/processinfo/-/processinfo-3.1.12.tgz", "integrity": "sha512-ZkYxCTEDL2ZEvvPHyZK1kvqm1t5mjRrwaGKRGFAhKh/qqaSSklk7fasqpX6fE4XLYpGf4J01C/sMztz+DkY0dg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "node-options-to-argv": "^1.0.0", "pirates": "^4.0.5", "process-on-spawn": "^1.0.0", "signal-exit": "^4.0.2", "uuid": "^14.0.0" }, "engines": { "node": ">=16.17" } }, "node_modules/@tapjs/reporter": { "version": "4.4.10", "resolved": "https://registry.npmjs.org/@tapjs/reporter/-/reporter-4.4.10.tgz", "integrity": "sha512-E3Xtk5e3k76woEOvAUayfXLZUN+u2rErwBI0RXHpAUyx97cH4rFdtOgNU6spFJD4w4TDhuJrnoCsEpHC9P7sGA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@tapjs/config": "5.6.4", "@tapjs/stack": "4.3.3", "chalk": "^5.6.2", "ink": "^5.2.1", "minipass": "^7.0.4", "ms": "^2.1.3", "patch-console": "^2.0.0", "prismjs-terminal": "^1.2.3", "react": "^18.2.0", "string-length": "^6.0.0", "tap-parser": "18.3.4", "tap-yaml": "4.4.2", "tcompare": "9.3.2" }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tapjs/run": { "version": "4.5.8", "resolved": "https://registry.npmjs.org/@tapjs/run/-/run-4.5.8.tgz", "integrity": "sha512-CZFa9qBEcMjZIbDX12rbuGFGQ3Ct7N/Bn7Lk3/kQWe9tR/l05oFvp7zn/2YyjkRvZv2a5YxvhHZ7Hv3Mk5tr0w==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/which": "^7.0.4", "@tapjs/after": "3.3.10", "@tapjs/before": "4.3.10", "@tapjs/config": "5.6.4", "@tapjs/processinfo": "^3.1.12", "@tapjs/reporter": "4.4.10", "@tapjs/spawn": "4.3.10", "@tapjs/stdin": "4.3.10", "@tapjs/test": "4.4.8", "c8": "^10.1.3", "chalk": "^5.6.2", "chokidar": "^4.0.2", "foreground-child": "^4.0.0", "glob": "^13.0.2", "minipass": "^7.0.4", "mkdirp": "^3.0.1", "node-options-to-argv": "^1.0.0", "opener": "^1.5.2", "pacote": "^21.0.4", "path-scurry": "^2.0.0", "resolve-import": "^2.4.0", "rimraf": "^6.0.0", "semver": "^7.7.2", "signal-exit": "^4.1.0", "tap-parser": "18.3.4", "tap-yaml": "4.4.2", "tcompare": "9.3.2", "trivial-deferred": "^2.0.0" }, "bin": { "tap-run": "dist/esm/index.js" }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tapjs/snapshot": { "version": "4.3.10", "resolved": "https://registry.npmjs.org/@tapjs/snapshot/-/snapshot-4.3.10.tgz", "integrity": "sha512-N08scJXaqX5WG6lWgw2bieVprcavSO+MAfnvCkP/G5wPOFgvzgbMh1/EFRpJvIlvwCXmdvqsU79Ka5fjkkVtLA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "is-actual-promise": "^1.0.1", "tcompare": "9.3.2", "trivial-deferred": "^2.0.0" }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tapjs/spawn": { "version": "4.3.10", "resolved": "https://registry.npmjs.org/@tapjs/spawn/-/spawn-4.3.10.tgz", "integrity": "sha512-xXQJ5H7xNYwYUcho6c9ErBuQLTQ2KFjEkn5fuMs/1IKKqf8JJ9zZQlPzNhfytendw6Bv14PxS9kjVrvvozbnSA==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tapjs/stack": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tapjs/stack/-/stack-4.3.3.tgz", "integrity": "sha512-7T64b+OIyU0WitBzu8ksfwt+EvtSrh6aHYhQD0lImrDqxw2Jdwvd43F6sEFXiAA+sO/d0ERUn+OJW3zYNpygTg==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@tapjs/stdin": { "version": "4.3.10", "resolved": "https://registry.npmjs.org/@tapjs/stdin/-/stdin-4.3.10.tgz", "integrity": "sha512-vip3JDKW6BumPL9LTE25pMiw4sbsNHMvhSUK4T4SfEbZ/7mmRudtSMrozSiqUzcQKNyNR9A8bQM2pOe8uWwXmQ==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tapjs/test": { "version": "4.4.8", "resolved": "https://registry.npmjs.org/@tapjs/test/-/test-4.4.8.tgz", "integrity": "sha512-h9VUaICX+bo3KBHCf5Ky6buo3OaGS+HrUghjMcXB//m24MKfKBd00EOWznhIqwmppDWoapVJ0BZuL6KnyKPGjg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.7", "@tapjs/after": "3.3.10", "@tapjs/after-each": "4.3.10", "@tapjs/asserts": "4.3.10", "@tapjs/before": "4.3.10", "@tapjs/before-each": "4.3.10", "@tapjs/chdir": "3.3.10", "@tapjs/filter": "4.3.10", "@tapjs/fixture": "4.3.10", "@tapjs/intercept": "4.3.10", "@tapjs/mock": "4.4.8", "@tapjs/node-serialize": "4.3.10", "@tapjs/snapshot": "4.3.10", "@tapjs/spawn": "4.3.10", "@tapjs/stdin": "4.3.10", "@tapjs/typescript": "3.5.10", "@tapjs/worker": "4.3.10", "glob": "^13.0.2", "jackspeak": "^4.2.3", "mkdirp": "^3.0.0", "package-json-from-dist": "^1.0.0", "resolve-import": "^2.4.0", "rimraf": "^6.0.0", "sync-content": "^2.0.4", "tap-parser": "18.3.4", "tshy": "^3.3.2", "typescript": "5.9", "walk-up-path": "^4.0.0" }, "bin": { "generate-tap-test-class": "dist/esm/build.mjs" }, "engines": { "node": "20 || >=22" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tapjs/test/node_modules/tshy": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/tshy/-/tshy-3.3.2.tgz", "integrity": "sha512-vOIXkqMtBWNjKUR/c99+6N50LhWdnKG1xE3+5wf8IPdzxx2lcIFPvbGgFdBBgoTMbdNb8mz06MUm7hY+TFnJcw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@typescript/native-preview": "^7.0.0-dev.20260218.1", "chalk": "^5.6.2", "chokidar": "^4.0.3", "foreground-child": "^4.0.0", "jsonc-simple-parser": "^3.0.0", "minimatch": "^10.0.3", "mkdirp": "^3.0.1", "polite-json": "^5.0.0", "resolve-import": "^2.4.0", "rimraf": "^6.1.2", "sync-content": "^2.0.3", "typescript": "^5.9.3", "walk-up-path": "^4.0.0" }, "bin": { "tshy": "dist/esm/bin-min.mjs" }, "engines": { "node": "20 || >=22" } }, "node_modules/@tapjs/test/node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { "node": ">=14.17" } }, "node_modules/@tapjs/typescript": { "version": "3.5.10", "resolved": "https://registry.npmjs.org/@tapjs/typescript/-/typescript-3.5.10.tgz", "integrity": "sha512-Z6abXH2P+WSXTWXCtqc6ly3SzwTwFSFsUlLCmOGIiaVvVluABK5/Ylz4HkKJw+2yWLZN0pVrx+inpt3Hjjm2oQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/ts-node-temp-fork-for-pr-2009": "^10.9.7" }, "engines": { "node": "20 || >=22" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tapjs/worker": { "version": "4.3.10", "resolved": "https://registry.npmjs.org/@tapjs/worker/-/worker-4.3.10.tgz", "integrity": "sha512-rp3n35xbO34xo/hSrWOs2Dsb2nxDrSdVzGvJEa7/KCA+X59+Vjb/lS8W6lSDLPtgH5LVNMxyJ1URG71K1+b33Q==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" }, "peerDependencies": { "@tapjs/core": "4.5.8" } }, "node_modules/@tsconfig/node14": { "version": "14.1.8", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-14.1.8.tgz", "integrity": "sha512-SjGT+qPvh8Uhc849yNMD0ZIPr69AyB7Z46nMqhrI3gCVocd6mhI0jP4YE4onO/ufpmengRfTxNMpdpKEp2xRIg==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "16.1.8", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-16.1.8.tgz", "integrity": "sha512-T/CfdwFry660WjZor56z0F3pxeCllt8KOxWcHFW6ZEuULKUObTDEMdgtctyuJPxwqyWDsvHRfxHaJ4FIICyoqQ==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node18": { "version": "18.2.6", "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.6.tgz", "integrity": "sha512-eAWQzAjPj18tKnDzmWstz4OyWewLUNBm9tdoN9LayzoboRktYx3Enk1ZXPmThj55L7c4VWYq/Bzq0A51znZfhw==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node20": { "version": "20.1.9", "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.9.tgz", "integrity": "sha512-IjlTv1RsvnPtUcjTqtVsZExKVq+KQx4g5pCP5tI7rAs6Xesl2qFwSz/tPDBC4JajkL/MlezBu3gPUwqRHl+RIg==", "dev": true, "license": "MIT" }, "node_modules/@tufjs/canonical-json": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", "dev": true, "license": "MIT", "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@tufjs/models": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.1.0.tgz", "integrity": "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==", "dev": true, "license": "MIT", "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^10.1.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "*" } }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { "version": "25.9.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", "dev": true, "license": "MIT", "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "dev": true, "license": "MIT" }, "node_modules/@typescript/native-preview": { "version": "7.0.0-dev.20260527.2", "resolved": "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20260527.2.tgz", "integrity": "sha512-piqkDwikVeizCFqA1lcwI5F4wOAtBdxuliWe77ApBNRyBPPvfCJB+u/HYi9/8t5nd0sWvFs6/qt/AzJ1CCoykQ==", "dev": true, "license": "Apache-2.0", "bin": { "tsgo": "bin/tsgo.js" }, "engines": { "node": ">=16.20.0" }, "optionalDependencies": { "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20260527.2", "@typescript/native-preview-darwin-x64": "7.0.0-dev.20260527.2", "@typescript/native-preview-linux-arm": "7.0.0-dev.20260527.2", "@typescript/native-preview-linux-arm64": "7.0.0-dev.20260527.2", "@typescript/native-preview-linux-x64": "7.0.0-dev.20260527.2", "@typescript/native-preview-win32-arm64": "7.0.0-dev.20260527.2", "@typescript/native-preview-win32-x64": "7.0.0-dev.20260527.2" } }, "node_modules/@typescript/native-preview-darwin-arm64": { "version": "7.0.0-dev.20260527.2", "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20260527.2.tgz", "integrity": "sha512-3LqSu4DlxkEfeC/Z/29QMCJn5jjkDtXI7LYuxfmjdmAatS6umDKqm8J17fnP/7fyrZUMBTIYRwSDpChGV3G1ew==", "cpu": [ "arm64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "darwin" ], "engines": { "node": ">=16.20.0" } }, "node_modules/@typescript/native-preview-darwin-x64": { "version": "7.0.0-dev.20260527.2", "resolved": "https://registry.npmjs.org/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20260527.2.tgz", "integrity": "sha512-H4+sxE9qaBbLF83wMdWE0FsgfK0Pom+/O+/oxqyGzhVkDJlNt3vfpgQZMit48/Gm44AacGfBggJ9Dhbi3aeSFw==", "cpu": [ "x64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "darwin" ], "engines": { "node": ">=16.20.0" } }, "node_modules/@typescript/native-preview-linux-arm": { "version": "7.0.0-dev.20260527.2", "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20260527.2.tgz", "integrity": "sha512-6I9Cv9ozwfS9zB9vRQDPIYseLX3artEO9jl3yVgLj4ishwlSF4cWAbIsjl5IztPaEgHv8coej/6tX1D0uaBzXg==", "cpu": [ "arm" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { "node": ">=16.20.0" } }, "node_modules/@typescript/native-preview-linux-arm64": { "version": "7.0.0-dev.20260527.2", "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20260527.2.tgz", "integrity": "sha512-BGUDMjC2Z3TTdZRkGGwhBLelkP5UYgO2rbep8aF4dS3fu7T5lFPPrnfS6EgqJgie+cF5Fsev7xEq8wWyBDM+lg==", "cpu": [ "arm64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { "node": ">=16.20.0" } }, "node_modules/@typescript/native-preview-linux-x64": { "version": "7.0.0-dev.20260527.2", "resolved": "https://registry.npmjs.org/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20260527.2.tgz", "integrity": "sha512-vpazOu+ozlxBo8U57YJMzsOPuxAV8H7fu36KJ8ea8At/D8pdGmOAy5TuB+9OBQV9JDe0OXJMy2kmbhOpmkTAmA==", "cpu": [ "x64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { "node": ">=16.20.0" } }, "node_modules/@typescript/native-preview-win32-arm64": { "version": "7.0.0-dev.20260527.2", "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20260527.2.tgz", "integrity": "sha512-DBFnFE3V6AITkPO1K1VxXf3yEZKjU2FwtXlNwRqhzDu0rrL2SsJHOSrBDX+OacTxQFzZMxFcpiuhV8jHZALPEg==", "cpu": [ "arm64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "win32" ], "engines": { "node": ">=16.20.0" } }, "node_modules/@typescript/native-preview-win32-x64": { "version": "7.0.0-dev.20260527.2", "resolved": "https://registry.npmjs.org/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20260527.2.tgz", "integrity": "sha512-1tBlErMvQgcMqqYwsx4tytupcjCJcOUXD3vBn1Wb/kAvus1FzWQAFE0fcKBvLfcqLQfTiiEwKKEtbLjGmakqqg==", "cpu": [ "x64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "win32" ], "engines": { "node": ">=16.20.0" } }, "node_modules/abbrev": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", "dev": true, "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/acorn-walk": { "version": "8.3.5", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "dev": true, "license": "MIT", "dependencies": { "acorn": "^8.11.0" }, "engines": { "node": ">=0.4.0" } }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, "license": "MIT", "engines": { "node": ">= 14" } }, "node_modules/ansi-escapes": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "dev": true, "license": "MIT", "dependencies": { "environment": "^1.0.0" }, "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true, "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/async-hook-domain": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-4.0.1.tgz", "integrity": "sha512-bSktexGodAjfHWIrSrrqxqWzf1hWBZBpmPNZv+TYUMyWa2eoefFc6q6H1+KtdHYSz35lrhWdmXt/XK9wNEZvww==", "dev": true, "license": "ISC", "engines": { "node": ">=16" } }, "node_modules/auto-bind": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", "engines": { "node": "18 || 20 || >=22" } }, "node_modules/brace-expansion": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { "node": "18 || 20 || >=22" } }, "node_modules/c8": { "version": "10.1.3", "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.3.tgz", "integrity": "sha512-LvcyrOAaOnrrlMpW22n690PUvxiq4Uf9WMhQwNJ9vgagkL/ph1+D4uvjvDA5XCbykrc0sx+ay6pVi9YZ1GnhyA==", "dev": true, "license": "ISC", "dependencies": { "@bcoe/v8-coverage": "^1.0.1", "@istanbuljs/schema": "^0.1.3", "find-up": "^5.0.0", "foreground-child": "^3.1.1", "istanbul-lib-coverage": "^3.2.0", "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.1.6", "test-exclude": "^7.0.1", "v8-to-istanbul": "^9.0.0", "yargs": "^17.7.2", "yargs-parser": "^21.1.1" }, "bin": { "c8": "bin/c8.js" }, "engines": { "node": ">=18" }, "peerDependencies": { "monocart-coverage-reports": "^2" }, "peerDependenciesMeta": { "monocart-coverage-reports": { "optional": true } } }, "node_modules/c8/node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, "license": "ISC", "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/cacache": { "version": "20.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.4.tgz", "integrity": "sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==", "dev": true, "license": "ISC", "dependencies": { "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", "glob": "^13.0.0", "lru-cache": "^11.1.0", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", "ssri": "^13.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/chalk": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/chmodr": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/chmodr/-/chmodr-2.0.2.tgz", "integrity": "sha512-LTdYP5BGT+a0Gca7XDJDr6/jUZHW33hBd4hqds8dX6ALH20xFNaa6yqNUTKR9grIw35RzxTsgnWaR5lQrq7a1Q==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, "engines": { "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/chownr": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } }, "node_modules/cli-boxes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "license": "MIT", "dependencies": { "restore-cursor": "^4.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-truncate": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, "license": "MIT", "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" }, "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-truncate/node_modules/slice-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" }, "engines": { "node": ">=12" } }, "node_modules/cliui/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/cliui/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, "node_modules/cliui/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/cliui/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/cliui/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/code-excerpt": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", "dev": true, "license": "MIT", "dependencies": { "convert-to-spaces": "^2.0.1" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, "node_modules/convert-to-spaces": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" }, "engines": { "node": ">= 8" } }, "node_modules/cross-spawn/node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" }, "engines": { "node": ">= 8" } }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/diff": { "version": "8.0.4", "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, "license": "MIT" }, "node_modules/emoji-regex": { "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "dev": true, "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/environment": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, "license": "MIT", "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/es-toolkit": { "version": "1.47.0", "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.47.0.tgz", "integrity": "sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw==", "dev": true, "license": "MIT", "workspaces": [ "docs", "benchmarks" ] }, "node_modules/esbuild": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { "node": ">=18" }, "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.0", "@esbuild/android-arm": "0.28.0", "@esbuild/android-arm64": "0.28.0", "@esbuild/android-x64": "0.28.0", "@esbuild/darwin-arm64": "0.28.0", "@esbuild/darwin-x64": "0.28.0", "@esbuild/freebsd-arm64": "0.28.0", "@esbuild/freebsd-x64": "0.28.0", "@esbuild/linux-arm": "0.28.0", "@esbuild/linux-arm64": "0.28.0", "@esbuild/linux-ia32": "0.28.0", "@esbuild/linux-loong64": "0.28.0", "@esbuild/linux-mips64el": "0.28.0", "@esbuild/linux-ppc64": "0.28.0", "@esbuild/linux-riscv64": "0.28.0", "@esbuild/linux-s390x": "0.28.0", "@esbuild/linux-x64": "0.28.0", "@esbuild/netbsd-arm64": "0.28.0", "@esbuild/netbsd-x64": "0.28.0", "@esbuild/openbsd-arm64": "0.28.0", "@esbuild/openbsd-x64": "0.28.0", "@esbuild/openharmony-arm64": "0.28.0", "@esbuild/sunos-x64": "0.28.0", "@esbuild/win32-arm64": "0.28.0", "@esbuild/win32-ia32": "0.28.0", "@esbuild/win32-x64": "0.28.0" } }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/events-to-array": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-2.0.3.tgz", "integrity": "sha512-f/qE2gImHRa4Cp2y1stEOSgw8wTFyUdVJX7G//bMwbaV9JqISFxg99NbmVQeP7YLnDUZ2un851jlaDrlpmGehQ==", "dev": true, "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/exponential-backoff": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "dev": true, "license": "Apache-2.0" }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { "node": ">=12.0.0" }, "peerDependencies": { "picomatch": "^3 || ^4" }, "peerDependenciesMeta": { "picomatch": { "optional": true } } }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/foreground-child": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-4.0.3.tgz", "integrity": "sha512-yeXZaNbCBGaT9giTpLPBdtedzjwhlJBUoL/R4BVQU5mn0TQXOHwVIl1Q2DMuBIdNno4ktA1abZ7dQFVxD6uHxw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "signal-exit": "^4.0.1" }, "engines": { "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/fromentries": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "license": "MIT" }, "node_modules/fs-minipass": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/function-loop": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-4.0.0.tgz", "integrity": "sha512-f34iQBedYF3XcI93uewZZOnyscDragxgTK/eTvVB74k3fCD0ZorOi5BV9GS4M8rz/JoNi0Kl3qX5Y9MH3S/CLQ==", "dev": true, "license": "ISC" }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-east-asian-width": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "dev": true, "license": "MIT", "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/glob": { "version": "13.0.6", "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" }, "engines": { "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/hosted-git-info": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz", "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==", "dev": true, "license": "ISC", "dependencies": { "lru-cache": "^11.1.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "node_modules/http-cache-semantics": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" }, "engines": { "node": ">= 14" } }, "node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "4" }, "engines": { "node": ">= 14" } }, "node_modules/iconv-lite": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "dev": true, "license": "MIT", "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" } }, "node_modules/ignore-walk": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", "dev": true, "license": "ISC", "dependencies": { "minimatch": "^10.0.3" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ini": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", "dev": true, "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/ink": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/ink/-/ink-5.2.1.tgz", "integrity": "sha512-BqcUyWrG9zq5HIwW6JcfFHsIYebJkWWb4fczNah1goUO0vv5vneIlfwuS85twyJ5hYR/y18FlAYUxrO9ChIWVg==", "dev": true, "license": "MIT", "dependencies": { "@alcalzone/ansi-tokenize": "^0.1.3", "ansi-escapes": "^7.0.0", "ansi-styles": "^6.2.1", "auto-bind": "^5.0.1", "chalk": "^5.3.0", "cli-boxes": "^3.0.0", "cli-cursor": "^4.0.0", "cli-truncate": "^4.0.0", "code-excerpt": "^4.0.0", "es-toolkit": "^1.22.0", "indent-string": "^5.0.0", "is-in-ci": "^1.0.0", "patch-console": "^2.0.0", "react-reconciler": "^0.29.0", "scheduler": "^0.23.0", "signal-exit": "^3.0.7", "slice-ansi": "^7.1.0", "stack-utils": "^2.0.6", "string-width": "^7.2.0", "type-fest": "^4.27.0", "widest-line": "^5.0.0", "wrap-ansi": "^9.0.0", "ws": "^8.18.0", "yoga-layout": "~3.2.1" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/react": ">=18.0.0", "react": ">=18.0.0", "react-devtools-core": "^4.19.1" }, "peerDependenciesMeta": { "@types/react": { "optional": true }, "react-devtools-core": { "optional": true } } }, "node_modules/ink/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, "license": "ISC" }, "node_modules/ip-address": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", "dev": true, "license": "MIT", "engines": { "node": ">= 12" } }, "node_modules/is-actual-promise": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-actual-promise/-/is-actual-promise-1.0.2.tgz", "integrity": "sha512-xsFiO1of0CLsQnPZ1iXHNTyR9YszOeWKYv+q6n8oSFW3ipooFJ1j1lbRMgiMCr+pp2gLruESI4zb5Ak6eK5OnQ==", "dev": true, "license": "BlueOak-1.0.0" }, "node_modules/is-fullwidth-code-point": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-in-ci": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-1.0.0.tgz", "integrity": "sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==", "dev": true, "license": "MIT", "bin": { "is-in-ci": "cli.js" }, "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/isexe": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": ">=20" } }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" } }, "node_modules/istanbul-reports": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jackspeak": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^9.0.0" }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz", "integrity": "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==", "dev": true, "license": "MIT", "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true, "license": "ISC" }, "node_modules/jsonc-simple-parser": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/jsonc-simple-parser/-/jsonc-simple-parser-3.0.0.tgz", "integrity": "sha512-0qi9Kuj4JPar4/3b9wZteuPZrTeFzXsQyOZj7hksnReCZN3Vr17Doz7w/i3E9XH7vRkVTHhHES+r1h97I+hfww==", "dev": true, "dependencies": { "reghex": "^3.0.2" } }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" ], "license": "MIT" }, "node_modules/linkify-it": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.1.tgz", "integrity": "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/puzrin" }, { "type": "github", "url": "https://github.com/sponsors/markdown-it" } ], "license": "MIT", "dependencies": { "uc.micro": "^2.0.0" } }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "node_modules/lru-cache": { "version": "11.5.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, "node_modules/lunr": { "version": "2.3.9", "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true, "license": "MIT" }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { "semver": "^7.5.3" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true, "license": "ISC" }, "node_modules/make-fetch-happen": { "version": "15.0.6", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.6.tgz", "integrity": "sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw==", "dev": true, "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/agent": "^4.0.0", "@npmcli/redact": "^4.0.0", "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", "minipass-fetch": "^5.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", "proc-log": "^6.0.0", "ssri": "^13.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/markdown-it": { "version": "14.2.0", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.2.0.tgz", "integrity": "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/puzrin" }, { "type": "github", "url": "https://github.com/sponsors/markdown-it" } ], "license": "MIT", "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", "linkify-it": "^5.0.1", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true, "license": "MIT" }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/minimatch": { "version": "10.2.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minipass": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-collect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-fetch": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz", "integrity": "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==", "dev": true, "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^2.0.0", "minizlib": "^3.0.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" }, "optionalDependencies": { "iconv-lite": "^0.7.2" } }, "node_modules/minipass-flush": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "minipass": "^3.0.0" }, "engines": { "node": ">= 8" } }, "node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/minipass-flush/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "license": "ISC" }, "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/minipass-pipeline/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/minipass-pipeline/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "license": "ISC" }, "node_modules/minipass-sized": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz", "integrity": "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==", "dev": true, "license": "ISC", "dependencies": { "minipass": "^7.1.2" }, "engines": { "node": ">=8" } }, "node_modules/minizlib": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "license": "MIT", "dependencies": { "minipass": "^7.1.2" }, "engines": { "node": ">= 18" } }, "node_modules/mkdirp": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, "license": "MIT", "bin": { "mkdirp": "dist/cjs/src/bin.js" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, "node_modules/mutate-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/mutate-fs/-/mutate-fs-2.1.1.tgz", "integrity": "sha512-WI5pPPUNiWqaK2XdK94AVpxIc8GmZEXYlLfFbWuc4gUtBGHTK92jdPqFdx/lilxgb5Ep7tQ15NqCcJEOeq6wdA==", "dev": true, "license": "ISC" }, "node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/nock": { "version": "13.5.6", "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.6.tgz", "integrity": "sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ==", "dev": true, "license": "MIT", "dependencies": { "debug": "^4.1.0", "json-stringify-safe": "^5.0.1", "propagate": "^2.0.0" }, "engines": { "node": ">= 10.13" } }, "node_modules/node-gyp": { "version": "12.3.0", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.3.0.tgz", "integrity": "sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg==", "dev": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", "nopt": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "tar": "^7.5.4", "tinyglobby": "^0.2.12", "undici": "^6.25.0", "which": "^6.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/node-options-to-argv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-options-to-argv/-/node-options-to-argv-1.0.0.tgz", "integrity": "sha512-99rLlP+Cn/FsSV9kjpk2UmF2Ltmrpv/L9U7fUfws/MVXkeZWPpPDsQkMr79qCvSF/oTKVVJBTm5sHzmK2j6IIg==", "dev": true, "license": "BlueOak-1.0.0" }, "node_modules/nopt": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", "dev": true, "license": "ISC", "dependencies": { "abbrev": "^4.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-bundled": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz", "integrity": "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==", "dev": true, "license": "ISC", "dependencies": { "npm-normalize-package-bin": "^5.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-install-checks": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-8.0.0.tgz", "integrity": "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-normalize-package-bin": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==", "dev": true, "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-package-arg": { "version": "13.0.2", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz", "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==", "dev": true, "license": "ISC", "dependencies": { "hosted-git-info": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^7.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-packlist": { "version": "10.0.4", "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.4.tgz", "integrity": "sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==", "dev": true, "license": "ISC", "dependencies": { "ignore-walk": "^8.0.0", "proc-log": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-pick-manifest": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz", "integrity": "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==", "dev": true, "license": "ISC", "dependencies": { "npm-install-checks": "^8.0.0", "npm-normalize-package-bin": "^5.0.0", "npm-package-arg": "^13.0.0", "semver": "^7.3.5" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-registry-fetch": { "version": "19.1.1", "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.1.1.tgz", "integrity": "sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==", "dev": true, "license": "ISC", "dependencies": { "@npmcli/redact": "^4.0.0", "jsonparse": "^1.3.1", "make-fetch-happen": "^15.0.0", "minipass": "^7.0.2", "minipass-fetch": "^5.0.0", "minizlib": "^3.0.1", "npm-package-arg": "^13.0.0", "proc-log": "^6.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true, "license": "(WTFPL OR MIT)", "bin": { "opener": "bin/opener-bin.js" } }, "node_modules/oxlint": { "version": "1.67.0", "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.67.0.tgz", "integrity": "sha512-blwwaHPdoH8piQ5/z0KHeoHFR7FZgl12WluKJfu4qFLPkZl6mK04PkLE45Fw1NxfBRSlh40Gu7MkxHUw++ociQ==", "dev": true, "license": "MIT", "bin": { "oxlint": "bin/oxlint" }, "engines": { "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/sponsors/Boshen" }, "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.67.0", "@oxlint/binding-android-arm64": "1.67.0", "@oxlint/binding-darwin-arm64": "1.67.0", "@oxlint/binding-darwin-x64": "1.67.0", "@oxlint/binding-freebsd-x64": "1.67.0", "@oxlint/binding-linux-arm-gnueabihf": "1.67.0", "@oxlint/binding-linux-arm-musleabihf": "1.67.0", "@oxlint/binding-linux-arm64-gnu": "1.67.0", "@oxlint/binding-linux-arm64-musl": "1.67.0", "@oxlint/binding-linux-ppc64-gnu": "1.67.0", "@oxlint/binding-linux-riscv64-gnu": "1.67.0", "@oxlint/binding-linux-riscv64-musl": "1.67.0", "@oxlint/binding-linux-s390x-gnu": "1.67.0", "@oxlint/binding-linux-x64-gnu": "1.67.0", "@oxlint/binding-linux-x64-musl": "1.67.0", "@oxlint/binding-openharmony-arm64": "1.67.0", "@oxlint/binding-win32-arm64-msvc": "1.67.0", "@oxlint/binding-win32-ia32-msvc": "1.67.0", "@oxlint/binding-win32-x64-msvc": "1.67.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.22.1", "vite-plus": "*" }, "peerDependenciesMeta": { "oxlint-tsgolint": { "optional": true }, "vite-plus": { "optional": true } } }, "node_modules/oxlint-tsgolint": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.23.0.tgz", "integrity": "sha512-3mBv3CoPbh8dFbzfDGIWa2ytZjn2v+3EX4aKRXjIhsoGFzG8GCjfRirz3rwZf1wYbZzsNLTSgpw8VjQuWdp/jA==", "dev": true, "license": "MIT", "bin": { "tsgolint": "bin/tsgolint.js" }, "optionalDependencies": { "@oxlint-tsgolint/darwin-arm64": "0.23.0", "@oxlint-tsgolint/darwin-x64": "0.23.0", "@oxlint-tsgolint/linux-arm64": "0.23.0", "@oxlint-tsgolint/linux-x64": "0.23.0", "@oxlint-tsgolint/win32-arm64": "0.23.0", "@oxlint-tsgolint/win32-x64": "0.23.0" } }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "dev": true, "license": "MIT", "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, "license": "BlueOak-1.0.0" }, "node_modules/pacote": { "version": "21.5.0", "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.5.0.tgz", "integrity": "sha512-VtZ0SB8mb5Tzw3dXDfVAIjhyVKUHZkS/ZH9/5mpKenwC9sFOXNI0JI7kEF7IMkwOnsWMFrvAZHzx1T5fmrp9FQ==", "dev": true, "license": "ISC", "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/git": "^7.0.0", "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "@npmcli/run-script": "^10.0.0", "cacache": "^20.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^13.0.0", "npm-packlist": "^10.0.1", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "proc-log": "^6.0.0", "sigstore": "^4.0.0", "ssri": "^13.0.0", "tar": "^7.4.3" }, "bin": { "pacote": "bin/index.js" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/patch-console": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-2.0.0.tgz", "integrity": "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==", "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-scurry": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" }, "engines": { "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pirates": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/polite-json": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/polite-json/-/polite-json-5.0.0.tgz", "integrity": "sha512-OLS/0XeUAcE8a2fdwemNja+udKgXNnY6yKVIXqAD2zVRx1KvY6Ato/rZ2vdzbxqYwPW0u6SCNC/bAMPNzpzxbw==", "dev": true, "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/prettier": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", "dev": true, "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/prismjs": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/prismjs-terminal": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/prismjs-terminal/-/prismjs-terminal-1.2.4.tgz", "integrity": "sha512-S2nsjy6s2x2jF4uTW8ulX19rvmRfe9R1wmnNwI5wmBgQEErB0vuKueVPMzN6KsFRCCJ2IQrWUS0BqhcNsrR9xg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "chalk": "^5.2.0", "prismjs": "^1.30.0", "string-length": "^6.0.0" }, "engines": { "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/proc-log": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", "dev": true, "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/process-on-spawn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", "dev": true, "license": "MIT", "dependencies": { "fromentries": "^1.2.0" }, "engines": { "node": ">=8" } }, "node_modules/propagate": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", "dev": true, "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/punycode.js": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "node_modules/react-element-to-jsx-string": { "version": "15.0.0", "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz", "integrity": "sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==", "dev": true, "license": "MIT", "dependencies": { "@base2/pretty-print-object": "1.0.1", "is-plain-object": "5.0.0", "react-is": "18.1.0" }, "peerDependencies": { "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0", "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0" } }, "node_modules/react-is": { "version": "18.1.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", "dev": true, "license": "MIT" }, "node_modules/react-reconciler": { "version": "0.29.2", "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.2.tgz", "integrity": "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==", "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "engines": { "node": ">=0.10.0" }, "peerDependencies": { "react": "^18.3.1" } }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { "node": ">= 14.18.0" }, "funding": { "type": "individual", "url": "https://paulmillr.com/funding/" } }, "node_modules/reghex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/reghex/-/reghex-3.0.2.tgz", "integrity": "sha512-Zb9DJ5u6GhgqRSBnxV2QSnLqEwcKxHWFA1N2yUa4ZUAO1P8jlWKYtWZ6/ooV6yylspGXJX0O/uNzEv0xrCtwaA==", "dev": true, "license": "MIT" }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/resolve-import": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/resolve-import/-/resolve-import-2.4.0.tgz", "integrity": "sha512-gLWKdA5tiv5j/D7ipR47u3ovbVfzFPrctTdw2Ulnpmr6PPVVSvPKGNWu09jXVNlOSLLAeD6CA13bjIelpWttSw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "glob": "^13.0.0", "walk-up-path": "^4.0.0" }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/restore-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/restore-cursor/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, "license": "ISC" }, "node_modules/rimraf": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "glob": "^13.0.3", "package-json-from-dist": "^1.0.1" }, "bin": { "rimraf": "dist/esm/bin.mjs" }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "license": "MIT", "optional": true }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } }, "node_modules/semver": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/sigstore": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.1.1.tgz", "integrity": "sha512-endqECJkfhozrXMK5ngu/UAA0xVcVEFdnHJCElGaExypjW+HK5i6zu3NteLoaX/iFbRUbC3+DjttQs0GARr+5w==", "dev": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.2.1", "@sigstore/protobuf-specs": "^0.5.0", "@sigstore/sign": "^4.1.1", "@sigstore/tuf": "^4.0.2", "@sigstore/verify": "^3.1.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/slice-ansi": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" }, "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, "license": "MIT", "dependencies": { "get-east-asian-width": "^1.3.1" }, "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" } }, "node_modules/socks": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", "dev": true, "license": "MIT", "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" }, "engines": { "node": ">= 10.0.0", "npm": ">= 3.0.0" } }, "node_modules/socks-proxy-agent": { "version": "8.0.5", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" }, "engines": { "node": ">= 14" } }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true, "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { "version": "3.0.23", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", "dev": true, "license": "CC0-1.0" }, "node_modules/ssri": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==", "dev": true, "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, "engines": { "node": ">=10" } }, "node_modules/string-length": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz", "integrity": "sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==", "dev": true, "license": "MIT", "dependencies": { "strip-ansi": "^7.1.0" }, "engines": { "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" }, "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/string-width-cjs/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-ansi": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/sync-content": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/sync-content/-/sync-content-2.0.4.tgz", "integrity": "sha512-w3ioiBmbaogob33WdLnuwFk+8tpePI58CTWKqtdAgEqc2hfGuSwP02gPETqNX/3PLS5skv5a1wQR0gbaa2W0XQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "glob": "^13.0.1", "mkdirp": "^3.0.1", "path-scurry": "^2.0.0", "rimraf": "^6.0.0" }, "bin": { "sync-content": "dist/esm/bin.mjs" }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/tap": { "version": "21.7.4", "resolved": "https://registry.npmjs.org/tap/-/tap-21.7.4.tgz", "integrity": "sha512-Snv6jL5USfHTW9PmlEWuqaxoxVpmQYYOlFzUS/p1vOrNUeg6FCSWQFQuLNwljV1DYFy0jATq+gAy6vAVdXeR3A==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@tapjs/after": "3.3.10", "@tapjs/after-each": "4.3.10", "@tapjs/asserts": "4.3.10", "@tapjs/before": "4.3.10", "@tapjs/before-each": "4.3.10", "@tapjs/chdir": "3.3.10", "@tapjs/core": "4.5.8", "@tapjs/filter": "4.3.10", "@tapjs/fixture": "4.3.10", "@tapjs/intercept": "4.3.10", "@tapjs/mock": "4.4.8", "@tapjs/node-serialize": "4.3.10", "@tapjs/run": "4.5.8", "@tapjs/snapshot": "4.3.10", "@tapjs/spawn": "4.3.10", "@tapjs/stdin": "4.3.10", "@tapjs/test": "4.4.8", "@tapjs/typescript": "3.5.10", "@tapjs/worker": "4.3.10", "resolve-import": "^2.4.0" }, "bin": { "tap": "dist/esm/run.mjs" }, "engines": { "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/tap-parser": { "version": "18.3.4", "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-18.3.4.tgz", "integrity": "sha512-CiqzdpWn2CvONcWp7UNMF9/rCPJwCz0es+qykkgJruu1Y/rAS8A5MEQujmjx9NErfst3dGiZJU3lDS2jBsgbPA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "events-to-array": "^2.0.3", "tap-yaml": "4.4.2" }, "bin": { "tap-parser": "bin/cmd.cjs" }, "engines": { "node": "20 || >=22" } }, "node_modules/tap-yaml": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-4.4.2.tgz", "integrity": "sha512-03mQI7QhfVZHJqGgFyxNTgUbgsG41ZzpWSb7k1Gangmf9hF71Jpb0Fczs7KtOdUDaHx+KxlPUdM2pQJaijebGA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "yaml": "^2.8.3", "yaml-types": "^0.4.0" }, "engines": { "node": "20 || >=22" } }, "node_modules/tar": { "version": "7.5.15", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz", "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "engines": { "node": ">=18" } }, "node_modules/tcompare": { "version": "9.3.2", "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-9.3.2.tgz", "integrity": "sha512-jSZmZPiMTBDZkV0Li/nNeOkCLtOViC/xgWdvzYheSU9RJt6F1EVUKZUJuH+QqN6tjVJrUXAeWpPNy+aLzfAjCQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "diff": "^8.0.2", "react-element-to-jsx-string": "^15.0.0" }, "engines": { "node": "20 || >=22" } }, "node_modules/test-exclude": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.2.tgz", "integrity": "sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==", "dev": true, "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^10.4.1", "minimatch": "^10.2.2" }, "engines": { "node": ">=18" } }, "node_modules/test-exclude/node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { "node": ">=12" } }, "node_modules/test-exclude/node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/test-exclude/node_modules/brace-expansion": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/test-exclude/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "license": "MIT" }, "node_modules/test-exclude/node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, "license": "ISC", "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/test-exclude/node_modules/glob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/test-exclude/node_modules/glob/node_modules/minimatch": { "version": "9.0.9", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/test-exclude/node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/test-exclude/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, "license": "ISC" }, "node_modules/test-exclude/node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/test-exclude/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/test-exclude/node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/tinyglobby": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" }, "funding": { "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/trivial-deferred": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-2.0.0.tgz", "integrity": "sha512-iGbM7X2slv9ORDVj2y2FFUq3cP/ypbtu2nQ8S38ufjL0glBABvmR9pTdsib1XtS2LUhhLMbelaBUaf/s5J3dSw==", "dev": true, "license": "ISC", "engines": { "node": ">= 8" } }, "node_modules/tshy": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/tshy/-/tshy-4.1.2.tgz", "integrity": "sha512-pOXcuOznFx65bKGYBue4PaJ561tARAmCTm2RgImKPtad24PNmkXClVzF/x7GI2LLs+niJpehR/K+ngBhvqq6Sg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@typescript/native-preview": "^7.0.0-dev.20260218.1", "chalk": "^5.6.2", "chokidar": "^4.0.3", "foreground-child": "^4.0.0", "jsonc-simple-parser": "^3.0.0", "minimatch": "^10.0.3", "mkdirp": "^3.0.1", "polite-json": "^5.0.0", "resolve-import": "^2.4.0", "rimraf": "^6.1.2", "sync-content": "^2.0.3", "typescript": "^6.0.2", "walk-up-path": "^4.0.0" }, "bin": { "tshy": "dist/esm/bin-min.mjs" }, "engines": { "node": "20 || >=22" } }, "node_modules/tuf-js": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.1.0.tgz", "integrity": "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==", "dev": true, "license": "MIT", "dependencies": { "@tufjs/models": "4.1.0", "debug": "^4.4.3", "make-fetch-happen": "^15.0.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/type-fest": { "version": "4.41.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typedoc": { "version": "0.28.19", "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.19.tgz", "integrity": "sha512-wKh+lhdmMFivMlc6vRRcMGXeGEHGU2g8a2CkPTJjJlwRf1iXbimWIPcFolCqe4E0d/FRtGszpIrsp3WLpDB8Pw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@gerrit0/mini-shiki": "^3.23.0", "lunr": "^2.3.9", "markdown-it": "^14.1.1", "minimatch": "^10.2.5", "yaml": "^2.8.3" }, "bin": { "typedoc": "bin/typedoc" }, "engines": { "node": ">= 18", "pnpm": ">= 10" }, "peerDependencies": { "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x || 6.0.x" } }, "node_modules/typescript": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { "node": ">=14.17" } }, "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true, "license": "MIT" }, "node_modules/undici": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/undici/-/undici-6.26.0.tgz", "integrity": "sha512-4yqz8a3n5HmGTlsbADNtr/dJlhkh/55Rq798G6ibiULcXbDtaLpTl1pvdqcbFfeoj3iSi52lePFM7h9H21cw/A==", "dev": true, "license": "MIT", "engines": { "node": ">=18.17" } }, "node_modules/undici-types": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", "dev": true, "license": "MIT" }, "node_modules/uuid": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==", "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", "bin": { "uuid": "dist-node/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true, "license": "MIT" }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" }, "engines": { "node": ">=10.12.0" } }, "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/validate-npm-package-name": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==", "dev": true, "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/walk-up-path": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz", "integrity": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==", "dev": true, "license": "ISC", "engines": { "node": "20 || >=22" } }, "node_modules/which": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", "dev": true, "license": "ISC", "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/widest-line": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", "dev": true, "license": "MIT", "dependencies": { "string-width": "^7.0.0" }, "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/wrap-ansi": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" }, "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true, "license": "ISC" }, "node_modules/ws": { "version": "8.21.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { "optional": true }, "utf-8-validate": { "optional": true } } }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "license": "BlueOak-1.0.0", "engines": { "node": ">=18" } }, "node_modules/yaml": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { "node": ">= 14.6" }, "funding": { "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yaml-types": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/yaml-types/-/yaml-types-0.4.0.tgz", "integrity": "sha512-XfbA30NUg4/LWUiplMbiufUiwYhgB9jvBhTWel7XQqjV+GaB79c2tROu/8/Tu7jO0HvDvnKWtBk5ksWRrhQ/0g==", "dev": true, "license": "ISC", "engines": { "node": ">= 16", "npm": ">= 7" }, "peerDependencies": { "yaml": "^2.3.0" } }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" } }, "node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/yargs/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, "node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/yoga-layout": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", "dev": true, "license": "MIT" } } } isaacs-node-tar-8a4b548/package.json000066400000000000000000000172371523070444600173320ustar00rootroot00000000000000{ "author": "Isaac Z. Schlueter", "name": "tar", "description": "tar for node", "version": "7.5.22", "repository": { "type": "git", "url": "https://github.com/isaacs/node-tar.git" }, "scripts": { "genparse": "node scripts/generate-parse-fixtures.js", "snap": "tap", "test": "tap", "pretest": "npm run prepare", "presnap": "npm run prepare", "prepare": "tshy && bash scripts/build.sh", "preversion": "npm test", "postversion": "npm publish", "prepublishOnly": "git push origin --follow-tags", "format": "prettier --write . --log-level warn", "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts", "lint": "oxlint --fix src test", "postsnap": "npm run lint", "postlint": "npm run format" }, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "devDependencies": { "@types/node": "^25.9.1", "chmodr": "^2.0.2", "end-of-stream": "^1.4.3", "esbuild": "^0.28.0", "events-to-array": "^2.0.3", "mutate-fs": "^2.1.1", "nock": "^13.5.4", "oxlint": "^1.67.0", "oxlint-tsgolint": "^0.23.0", "prettier": "^3.8.3", "rimraf": "^6.1.2", "tap": "^21.7.4", "tshy": "^4.1.2", "typedoc": "^0.28.19" }, "license": "BlueOak-1.0.0", "engines": { "node": ">=18" }, "files": [ "dist" ], "tshy": { "exports": { "./package.json": "./package.json", ".": { "import": { "types": "./dist/esm/index.d.ts", "default": "./dist/esm/index.min.js" }, "require": { "types": "./dist/commonjs/index.d.ts", "default": "./dist/commonjs/index.min.js" } }, "./raw": "./src/index.ts", "./c": "./src/create.ts", "./create": "./src/create.ts", "./replace": "./src/create.ts", "./r": "./src/create.ts", "./list": "./src/list.ts", "./t": "./src/list.ts", "./update": "./src/update.ts", "./u": "./src/update.ts", "./extract": "./src/extract.ts", "./x": "./src/extract.ts", "./pack": "./src/pack.ts", "./unpack": "./src/unpack.ts", "./parse": "./src/parse.ts", "./read-entry": "./src/read-entry.ts", "./write-entry": "./src/write-entry.ts", "./header": "./src/header.ts", "./pax": "./src/pax.ts", "./types": "./src/types.ts" }, "selfLink": false }, "exports": { "./package.json": "./package.json", ".": { "import": { "types": "./dist/esm/index.d.ts", "default": "./dist/esm/index.min.js" }, "require": { "types": "./dist/commonjs/index.d.ts", "default": "./dist/commonjs/index.min.js" } }, "./raw": { "import": { "types": "./dist/esm/index.d.ts", "default": "./dist/esm/index.js" }, "require": { "types": "./dist/commonjs/index.d.ts", "default": "./dist/commonjs/index.js" } }, "./c": { "import": { "types": "./dist/esm/create.d.ts", "default": "./dist/esm/create.js" }, "require": { "types": "./dist/commonjs/create.d.ts", "default": "./dist/commonjs/create.js" } }, "./create": { "import": { "types": "./dist/esm/create.d.ts", "default": "./dist/esm/create.js" }, "require": { "types": "./dist/commonjs/create.d.ts", "default": "./dist/commonjs/create.js" } }, "./replace": { "import": { "types": "./dist/esm/create.d.ts", "default": "./dist/esm/create.js" }, "require": { "types": "./dist/commonjs/create.d.ts", "default": "./dist/commonjs/create.js" } }, "./r": { "import": { "types": "./dist/esm/create.d.ts", "default": "./dist/esm/create.js" }, "require": { "types": "./dist/commonjs/create.d.ts", "default": "./dist/commonjs/create.js" } }, "./list": { "import": { "types": "./dist/esm/list.d.ts", "default": "./dist/esm/list.js" }, "require": { "types": "./dist/commonjs/list.d.ts", "default": "./dist/commonjs/list.js" } }, "./t": { "import": { "types": "./dist/esm/list.d.ts", "default": "./dist/esm/list.js" }, "require": { "types": "./dist/commonjs/list.d.ts", "default": "./dist/commonjs/list.js" } }, "./update": { "import": { "types": "./dist/esm/update.d.ts", "default": "./dist/esm/update.js" }, "require": { "types": "./dist/commonjs/update.d.ts", "default": "./dist/commonjs/update.js" } }, "./u": { "import": { "types": "./dist/esm/update.d.ts", "default": "./dist/esm/update.js" }, "require": { "types": "./dist/commonjs/update.d.ts", "default": "./dist/commonjs/update.js" } }, "./extract": { "import": { "types": "./dist/esm/extract.d.ts", "default": "./dist/esm/extract.js" }, "require": { "types": "./dist/commonjs/extract.d.ts", "default": "./dist/commonjs/extract.js" } }, "./x": { "import": { "types": "./dist/esm/extract.d.ts", "default": "./dist/esm/extract.js" }, "require": { "types": "./dist/commonjs/extract.d.ts", "default": "./dist/commonjs/extract.js" } }, "./pack": { "import": { "types": "./dist/esm/pack.d.ts", "default": "./dist/esm/pack.js" }, "require": { "types": "./dist/commonjs/pack.d.ts", "default": "./dist/commonjs/pack.js" } }, "./unpack": { "import": { "types": "./dist/esm/unpack.d.ts", "default": "./dist/esm/unpack.js" }, "require": { "types": "./dist/commonjs/unpack.d.ts", "default": "./dist/commonjs/unpack.js" } }, "./parse": { "import": { "types": "./dist/esm/parse.d.ts", "default": "./dist/esm/parse.js" }, "require": { "types": "./dist/commonjs/parse.d.ts", "default": "./dist/commonjs/parse.js" } }, "./read-entry": { "import": { "types": "./dist/esm/read-entry.d.ts", "default": "./dist/esm/read-entry.js" }, "require": { "types": "./dist/commonjs/read-entry.d.ts", "default": "./dist/commonjs/read-entry.js" } }, "./write-entry": { "import": { "types": "./dist/esm/write-entry.d.ts", "default": "./dist/esm/write-entry.js" }, "require": { "types": "./dist/commonjs/write-entry.d.ts", "default": "./dist/commonjs/write-entry.js" } }, "./header": { "import": { "types": "./dist/esm/header.d.ts", "default": "./dist/esm/header.js" }, "require": { "types": "./dist/commonjs/header.d.ts", "default": "./dist/commonjs/header.js" } }, "./pax": { "import": { "types": "./dist/esm/pax.d.ts", "default": "./dist/esm/pax.js" }, "require": { "types": "./dist/commonjs/pax.d.ts", "default": "./dist/commonjs/pax.js" } }, "./types": { "import": { "types": "./dist/esm/types.d.ts", "default": "./dist/esm/types.js" }, "require": { "types": "./dist/commonjs/types.d.ts", "default": "./dist/commonjs/types.js" } } }, "type": "module", "main": "./dist/commonjs/index.min.js", "types": "./dist/commonjs/index.d.ts", "module": "./dist/esm/index.min.js" } isaacs-node-tar-8a4b548/scripts/000077500000000000000000000000001523070444600165215ustar00rootroot00000000000000isaacs-node-tar-8a4b548/scripts/build.sh000066400000000000000000000004721523070444600201570ustar00rootroot00000000000000#!/usr/bin/env bash esbuild \ --minify \ --platform=node \ --sourcemap \ --bundle dist/commonjs/index.js \ --outfile=dist/commonjs/index.min.js \ --format=cjs esbuild \ --minify \ --platform=node \ --sourcemap \ --bundle dist/esm/index.js \ --outfile=dist/esm/index.min.js \ --format=esm isaacs-node-tar-8a4b548/scripts/generate-parse-fixtures.js000066400000000000000000000063321523070444600236340ustar00rootroot00000000000000import { Parser } from '../dist/esm/parse.js' import fs from 'fs' import path, { dirname, resolve } from 'path' import { fileURLToPath } from 'url' const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename) const tardir = resolve(__dirname, '../test/fixtures/tars') const parsedir = resolve(__dirname, '../test/fixtures/parse') const maxMetaOpt = [250, null] const filterOpt = [true, false] const strictOpt = [true, false] const makeTest = (tarfile, tardata, maxMeta, filter, strict) => { const o = (maxMeta ? '-meta-' + maxMeta : '') + (filter ? '-filter' : '') + (strict ? '-strict' : '') const tail = (o ? '-' + o : '') + '.json' const eventsfile = parsedir + '/' + path.basename(tarfile, '.tar') + tail const p = new Parser({ maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : null, strict: strict, }) const events = [] const pushEntry = type => entry => { events.push([ type, { extended: entry.extended, globalExtended: entry.globalExtended, type: entry.type, meta: entry.meta, ignore: entry.ignore, path: entry.path, mode: entry.mode, uid: entry.uid, gid: entry.gid, uname: entry.uname, gname: entry.gname, size: entry.size, mtime: entry.mtime, atime: entry.atime, ctime: entry.ctime, linkpath: entry.linkpath, header: { cksumValid: entry.header.cksumValid, needPax: entry.header.needPax, path: entry.header.path, mode: entry.header.mode, uid: entry.header.uid, gid: entry.header.gid, size: entry.header.size, mtime: entry.header.mtime, cksum: entry.header.cksum, linkpath: entry.header.linkpath, ustar: entry.header.ustar, ustarver: entry.header.ustarver, uname: entry.header.uname, gname: entry.header.gname, devmaj: entry.header.devmaj, devmin: entry.header.devmin, ustarPrefix: entry.header.ustarPrefix, xstarPrefix: entry.header.xstarPrefix, prefixTerminator: entry.header.prefixTerminator, atime: entry.header.atime, ctime: entry.header.atime, }, }, ]) entry.resume() } p.on('entry', pushEntry('entry')) p.on('ignoredEntry', pushEntry('ignoredEntry')) p.on('warn', (code, message, _data) => events.push(['warn', code, message]), ) p.on('error', er => events.push([ 'error', { message: er.message, code: er.code, }, ]), ) p.on('end', _ => events.push(['end'])) p.on('nullBlock', _ => events.push(['nullBlock'])) p.on('eof', _ => events.push(['eof'])) p.on('meta', meta => events.push(['meta', meta])) p.end(tardata) console.log(eventsfile) fs.writeFileSync(eventsfile, JSON.stringify(events, null, 2) + '\n') } fs.readdirSync(tardir).forEach(tar => { const tarfile = tardir + '/' + tar const tardata = fs.readFileSync(tarfile) maxMetaOpt.forEach(maxMeta => filterOpt.forEach(filter => strictOpt.forEach(strict => makeTest(tarfile, tardata, maxMeta, filter, strict), ), ), ) }) isaacs-node-tar-8a4b548/src/000077500000000000000000000000001523070444600156215ustar00rootroot00000000000000isaacs-node-tar-8a4b548/src/create.ts000066400000000000000000000043501523070444600174360ustar00rootroot00000000000000import { WriteStream, WriteStreamSync } from '@isaacs/fs-minipass' import type { Minipass } from 'minipass' import path from 'node:path' import { list } from './list.js' import { makeCommand } from './make-command.js' import type { TarOptions, TarOptionsFile, TarOptionsSync, TarOptionsSyncFile, } from './options.js' import { Pack, PackSync } from './pack.js' const createFileSync = (opt: TarOptionsSyncFile, files: string[]) => { const p = new PackSync(opt) const stream = new WriteStreamSync(opt.file, { mode: opt.mode || 0o666, }) p.pipe(stream as unknown as Minipass.Writable) addFilesSync(p, files) } const createFile = (opt: TarOptionsFile, files: string[]) => { const p = new Pack(opt) const stream = new WriteStream(opt.file, { mode: opt.mode || 0o666, }) p.pipe(stream as unknown as Minipass.Writable) const promise = new Promise((res, rej) => { stream.on('error', rej) stream.on('close', res) p.on('error', rej) }) addFilesAsync(p, files).catch(er => p.emit('error', er)) return promise } const addFilesSync = (p: PackSync, files: string[]) => { files.forEach(file => { if (file.charAt(0) === '@') { list({ file: path.resolve(p.cwd, file.slice(1)), sync: true, noResume: true, onReadEntry: entry => p.add(entry), }) } else { p.add(file) } }) p.end() } const addFilesAsync = async (p: Pack, files: string[]): Promise => { for (const file of files) { if (file.charAt(0) === '@') { await list({ file: path.resolve(String(p.cwd), file.slice(1)), noResume: true, onReadEntry: entry => { p.add(entry) }, }) } else { p.add(file) } } p.end() } const createSync = (opt: TarOptionsSync, files: string[]) => { const p = new PackSync(opt) addFilesSync(p, files) return p } const createAsync = (opt: TarOptions, files: string[]) => { const p = new Pack(opt) addFilesAsync(p, files).catch(er => p.emit('error', er)) return p } export const create = makeCommand( createFileSync, createFile, createSync, createAsync, (_opt, files) => { if (!files?.length) { throw new TypeError('no paths specified to add to archive') } }, ) isaacs-node-tar-8a4b548/src/cwd-error.ts000066400000000000000000000004271523070444600201000ustar00rootroot00000000000000export class CwdError extends Error { path: string code: string syscall = 'chdir' as const constructor(path: string, code: string) { super(`${code}: Cannot cd into '${path}'`) this.path = path this.code = code } get name() { return 'CwdError' } } isaacs-node-tar-8a4b548/src/extract.ts000066400000000000000000000031421523070444600176430ustar00rootroot00000000000000// tar -x import * as fsm from '@isaacs/fs-minipass' import fs from 'node:fs' import { filesFilter } from './list.js' import { makeCommand } from './make-command.js' import type { TarOptionsFile, TarOptionsSyncFile } from './options.js' import { Unpack, UnpackSync } from './unpack.js' const extractFileSync = (opt: TarOptionsSyncFile) => { const u = new UnpackSync(opt) const file = opt.file const stat = fs.statSync(file) // This trades a zero-byte read() syscall for a stat // However, it will usually result in less memory allocation const readSize = opt.maxReadSize || 16 * 1024 * 1024 const stream = new fsm.ReadStreamSync(file, { readSize: readSize, size: stat.size, }) stream.pipe(u) } const extractFile = (opt: TarOptionsFile, _?: string[]) => { const u = new Unpack(opt) const readSize = opt.maxReadSize || 16 * 1024 * 1024 const file = opt.file const p = new Promise((resolve, reject) => { u.on('error', reject) u.on('close', resolve) // This trades a zero-byte read() syscall for a stat // However, it will usually result in less memory allocation fs.stat(file, (er, stat) => { if (er) { reject(er) } else { const stream = new fsm.ReadStream(file, { readSize: readSize, size: stat.size, }) stream.on('error', reject) stream.pipe(u) } }) }) return p } export const extract = makeCommand( extractFileSync, extractFile, opt => new UnpackSync(opt), opt => new Unpack(opt), (opt, files) => { if (files?.length) filesFilter(opt, files) }, ) isaacs-node-tar-8a4b548/src/get-write-flag.ts000066400000000000000000000022051523070444600210060ustar00rootroot00000000000000// Get the appropriate flag to use for creating files // We use fmap on Windows platforms for files less than // 512kb. This is a fairly low limit, but avoids making // things slower in some cases. Since most of what this // library is used for is extracting tarballs of many // relatively small files in npm packages and the like, // it can be a big boost on Windows platforms. import fs from 'fs' const platform = process.env.__FAKE_PLATFORM__ || process.platform const isWindows = platform === 'win32' /* c8 ignore start */ const { O_CREAT, O_NOFOLLOW, O_TRUNC, O_WRONLY } = fs.constants const UV_FS_O_FILEMAP = Number(process.env.__FAKE_FS_O_FILENAME__) || fs.constants.UV_FS_O_FILEMAP || 0 /* c8 ignore stop */ const fMapEnabled = isWindows && !!UV_FS_O_FILEMAP const fMapLimit = 512 * 1024 const fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY const noFollowFlag = !isWindows && typeof O_NOFOLLOW === 'number' ? O_NOFOLLOW | O_TRUNC | O_CREAT | O_WRONLY : null export const getWriteFlag = noFollowFlag !== null ? () => noFollowFlag : !fMapEnabled ? () => 'w' : (size: number) => (size < fMapLimit ? fMapFlag : 'w') isaacs-node-tar-8a4b548/src/header.ts000066400000000000000000000310601523070444600174210ustar00rootroot00000000000000// parse a 512-byte header block to a data object, or vice-versa // encode returns `true` if a pax extended header is needed, because // the data could not be faithfully encoded in a simple header. // (Also, check header.needPax to see if it needs a pax header.) import { posix as pathModule } from 'node:path' import * as large from './large-numbers.js' import type { EntryTypeCode, EntryTypeName } from './types.js' import * as types from './types.js' const notNegative = (n?: number): number | undefined => n === undefined || n < 0 ? undefined : n export type HeaderData = { path?: string mode?: number uid?: number gid?: number size?: number cksum?: number type?: EntryTypeName | 'Unsupported' linkpath?: string uname?: string gname?: string devmaj?: number devmin?: number atime?: Date ctime?: Date mtime?: Date // fields that are common in extended PAX headers, but not in the // "standard" tar header block charset?: string comment?: string dev?: number ino?: number nlink?: number } export class Header implements HeaderData { cksumValid: boolean = false needPax: boolean = false nullBlock: boolean = false block?: Buffer path?: string mode?: number uid?: number gid?: number size?: number cksum?: number #type: EntryTypeCode | 'Unsupported' = 'Unsupported' linkpath?: string uname?: string gname?: string devmaj: number = 0 devmin: number = 0 atime?: Date ctime?: Date mtime?: Date charset?: string comment?: string constructor( data?: Buffer | HeaderData, off: number = 0, ex?: HeaderData, gex?: HeaderData, ) { if (Buffer.isBuffer(data)) { this.decode(data, off || 0, ex, gex) } else if (data) { this.#slurp(data) } } decode(buf: Buffer, off: number, ex?: HeaderData, gex?: HeaderData) { if (!off) { off = 0 } if (!buf || !(buf.length >= off + 512)) { throw new Error('need 512 bytes for header') } // Decode the typeflag (independent of any pending PAX/GNU extended header) // up front so we can tell whether THIS block is itself an intermediary // extension header (PAX `x`/`g`, GNU long-name `L`, GNU long-link `K`). // Per POSIX pax, a PAX extended header describes the *next file entry*, not // the extension headers that may sit between it and that file. Applying the // pending PAX overrides (notably `size`) to an intervening `L`/`K`/`x`/`g` // header desynchronizes the stream relative to other tar implementations // and enables tar interpretation-conflict / file-smuggling attacks. const t = decString(buf, off + 156, 1) const isNormalFS = types.normalFsTypes.has(t as EntryTypeCode) const exForFields = isNormalFS ? ex : undefined const gexForFields = isNormalFS ? gex : undefined this.path = exForFields?.path ?? decString(buf, off, 100) this.mode = exForFields?.mode ?? gexForFields?.mode ?? decNumber(buf, off + 100, 8) this.uid = exForFields?.uid ?? gexForFields?.uid ?? decNumber(buf, off + 108, 8) this.gid = exForFields?.gid ?? gexForFields?.gid ?? decNumber(buf, off + 116, 8) this.size = notNegative( exForFields?.size ?? gexForFields?.size ?? decNumber(buf, off + 124, 12), ) this.mtime = exForFields?.mtime ?? gexForFields?.mtime ?? decDate(buf, off + 136, 12) this.cksum = decNumber(buf, off + 148, 12) // if we have extended or global extended headers, apply them now // See https://github.com/npm/node-tar/pull/187 // Apply global before local, so it overrides. Never slurp the pending // extended-header fields onto an intermediary extension header. if (gexForFields) this.#slurp(gexForFields, true) if (exForFields) this.#slurp(exForFields) // old tar versions marked dirs as a file with a trailing / if (types.isCode(t)) { this.#type = t || '0' } if (this.#type === '0' && this.path.slice(-1) === '/') { this.#type = '5' } // tar implementations sometimes incorrectly put the stat(dir).size // as the size in the tarball, even though Directory entries are // not able to have any body at all. In the very rare chance that // it actually DOES have a body, we weren't going to do anything with // it anyway, and it'll just be a warning about an invalid header. if (this.#type === '5') { this.size = 0 } this.linkpath = decString(buf, off + 157, 100) if ( buf.subarray(off + 257, off + 265).toString() === 'ustar\u000000' ) { /* c8 ignore start */ this.uname = exForFields?.uname ?? gexForFields?.uname ?? decString(buf, off + 265, 32) this.gname = exForFields?.gname ?? gexForFields?.gname ?? decString(buf, off + 297, 32) this.devmaj = exForFields?.devmaj ?? gexForFields?.devmaj ?? decNumber(buf, off + 329, 8) ?? 0 this.devmin = exForFields?.devmin ?? gexForFields?.devmin ?? decNumber(buf, off + 337, 8) ?? 0 /* c8 ignore stop */ if (buf[off + 475] !== 0) { // definitely a prefix, definitely >130 chars. const prefix = decString(buf, off + 345, 155) this.path = prefix + '/' + this.path } else { const prefix = decString(buf, off + 345, 130) if (prefix) { this.path = prefix + '/' + this.path } /* c8 ignore start */ this.atime = ex?.atime ?? gex?.atime ?? decDate(buf, off + 476, 12) this.ctime = ex?.ctime ?? gex?.ctime ?? decDate(buf, off + 488, 12) /* c8 ignore stop */ } } let sum = 8 * 0x20 for (let i = off; i < off + 148; i++) { sum += buf[i] as number } for (let i = off + 156; i < off + 512; i++) { sum += buf[i] as number } this.cksumValid = sum === this.cksum if (this.cksum === undefined && sum === 8 * 0x20) { this.nullBlock = true } } #slurp(ex: HeaderData, gex: boolean = false) { Object.assign( this, Object.fromEntries( Object.entries(ex).filter(([k, v]) => { // we slurp in everything except for the path attribute in // a global extended header, because that's weird. Also, any // null/undefined values are ignored. return !( v === null || v === undefined || (k === 'size' && Number(v) < 0) || (k === 'path' && gex) || (k === 'linkpath' && gex) || k === 'global' ) }), ), ) } encode(buf?: Buffer, off: number = 0) { if (!buf) { buf = this.block = Buffer.alloc(512) } if (this.#type === 'Unsupported') { this.#type = '0' } if (!(buf.length >= off + 512)) { throw new Error('need 512 bytes for header') } const prefixSize = this.ctime || this.atime ? 130 : 155 const split = splitPrefix(this.path || '', prefixSize) const path = split[0] const prefix = split[1] this.needPax = !!split[2] this.needPax = encString(buf, off, 100, path) || this.needPax this.needPax = encNumber(buf, off + 100, 8, this.mode) || this.needPax this.needPax = encNumber(buf, off + 108, 8, this.uid) || this.needPax this.needPax = encNumber(buf, off + 116, 8, this.gid) || this.needPax this.needPax = encNumber(buf, off + 124, 12, this.size) || this.needPax this.needPax = encDate(buf, off + 136, 12, this.mtime) || this.needPax buf[off + 156] = Number(this.#type.codePointAt(0)) this.needPax = encString(buf, off + 157, 100, this.linkpath) || this.needPax buf.write('ustar\u000000', off + 257, 8) this.needPax = encString(buf, off + 265, 32, this.uname) || this.needPax this.needPax = encString(buf, off + 297, 32, this.gname) || this.needPax this.needPax = encNumber(buf, off + 329, 8, this.devmaj) || this.needPax this.needPax = encNumber(buf, off + 337, 8, this.devmin) || this.needPax this.needPax = encString(buf, off + 345, prefixSize, prefix) || this.needPax if (buf[off + 475] !== 0) { this.needPax = encString(buf, off + 345, 155, prefix) || this.needPax } else { this.needPax = encString(buf, off + 345, 130, prefix) || this.needPax this.needPax = encDate(buf, off + 476, 12, this.atime) || this.needPax this.needPax = encDate(buf, off + 488, 12, this.ctime) || this.needPax } let sum = 8 * 0x20 for (let i = off; i < off + 148; i++) { sum += buf[i] as number } for (let i = off + 156; i < off + 512; i++) { sum += buf[i] as number } this.cksum = sum encNumber(buf, off + 148, 8, this.cksum) this.cksumValid = true return this.needPax } get type(): EntryTypeName { return ( this.#type === 'Unsupported' ? this.#type : types.name.get(this.#type)) as EntryTypeName } get typeKey(): EntryTypeCode | 'Unsupported' { return this.#type } set type(type: EntryTypeCode | EntryTypeName | 'Unsupported') { const c = String(types.code.get(type as EntryTypeName)) if (types.isCode(c) || c === 'Unsupported') { this.#type = c } else if (types.isCode(type)) { this.#type = type } else { throw new TypeError('invalid entry type: ' + type) } } } const splitPrefix = ( p: string, prefixSize: number, ): [string, string, boolean] => { const pathSize = 100 let pp = p let prefix = '' let ret: undefined | [string, string, boolean] = undefined const root = pathModule.parse(p).root || '.' if (Buffer.byteLength(pp) < pathSize) { ret = [pp, prefix, false] } else { // first set prefix to the dir, and path to the base prefix = pathModule.dirname(pp) pp = pathModule.basename(pp) do { if ( Buffer.byteLength(pp) <= pathSize && Buffer.byteLength(prefix) <= prefixSize ) { // both fit! ret = [pp, prefix, false] } else if ( Buffer.byteLength(pp) > pathSize && Buffer.byteLength(prefix) <= prefixSize ) { // prefix fits in prefix, but path doesn't fit in path ret = [pp.slice(0, pathSize - 1), prefix, true] } else { // make path take a bit from prefix pp = pathModule.join(pathModule.basename(prefix), pp) prefix = pathModule.dirname(prefix) } } while (prefix !== root && ret === undefined) // at this point, found no resolution, just truncate if (!ret) { ret = [p.slice(0, pathSize - 1), '', true] } } return ret } const decString = (buf: Buffer, off: number, size: number) => buf .subarray(off, off + size) .toString('utf8') .replace(/\0.*/, '') const decDate = (buf: Buffer, off: number, size: number) => numToDate(decNumber(buf, off, size)) const numToDate = (num?: number) => num === undefined ? undefined : new Date(num * 1000) const decNumber = (buf: Buffer, off: number, size: number) => Number(buf[off]) & 0x80 ? large.parse(buf.subarray(off, off + size)) : decSmallNumber(buf, off, size) const nanUndef = (value: number) => (isNaN(value) ? undefined : value) const decSmallNumber = (buf: Buffer, off: number, size: number) => nanUndef( parseInt( buf .subarray(off, off + size) .toString('utf8') .replace(/\0.*$/, '') .trim(), 8, ), ) // the maximum encodable as a null-terminated octal, by field size const MAXNUM = { 12: 0o77777777777, 8: 0o7777777, } const encNumber = ( buf: Buffer, off: number, size: 12 | 8, num?: number, ) => num === undefined ? false : num > MAXNUM[size] || num < 0 ? (large.encode(num, buf.subarray(off, off + size)), true) : (encSmallNumber(buf, off, size, num), false) const encSmallNumber = ( buf: Buffer, off: number, size: number, num: number, ) => buf.write(octalString(num, size), off, size, 'ascii') const octalString = (num: number, size: number) => padOctal(Math.floor(num).toString(8), size) const padOctal = (str: string, size: number) => (str.length === size - 1 ? str : new Array(size - str.length - 1).join('0') + str + ' ') + '\0' const encDate = (buf: Buffer, off: number, size: 8 | 12, date?: Date) => date === undefined ? false : ( encNumber(buf, off, size, date.getTime() / 1000) ) // enough to fill the longest string we've got const NULLS = new Array(156).join('\0') // pad with nulls, return true if it's longer or non-ascii const encString = ( buf: Buffer, off: number, size: number, str?: string, ) => str === undefined ? false : ( (buf.write(str + NULLS, off, size, 'utf8'), str.length !== Buffer.byteLength(str) || str.length > size) ) isaacs-node-tar-8a4b548/src/index.ts000066400000000000000000000016271523070444600173060ustar00rootroot00000000000000export { type TarOptionsWithAliasesAsync, type TarOptionsWithAliasesAsyncFile, type TarOptionsWithAliasesAsyncNoFile, type TarOptionsWithAliasesSyncNoFile, type TarOptionsWithAliases, type TarOptionsWithAliasesFile, type TarOptionsWithAliasesSync, type TarOptionsWithAliasesSyncFile, } from './options.js' export * from './create.js' export { create as c } from './create.js' export * from './extract.js' export { extract as x } from './extract.js' export * from './header.js' export * from './list.js' export { list as t } from './list.js' // classes export * from './pack.js' export * from './parse.js' export * from './pax.js' export * from './read-entry.js' export * from './replace.js' export { replace as r } from './replace.js' export * as types from './types.js' export * from './unpack.js' export * from './update.js' export { update as u } from './update.js' export * from './write-entry.js' isaacs-node-tar-8a4b548/src/large-numbers.ts000066400000000000000000000044251523070444600207410ustar00rootroot00000000000000// Tar can encode large and negative numbers using a leading byte of // 0xff for negative, and 0x80 for positive. export const encode = (num: number, buf: Buffer) => { if (!Number.isSafeInteger(num)) { // The number is so large that javascript cannot represent it with integer // precision. throw Error( 'cannot encode number outside of javascript safe integer range', ) } else if (num < 0) { encodeNegative(num, buf) } else { encodePositive(num, buf) } return buf } const encodePositive = (num: number, buf: Buffer) => { buf[0] = 0x80 for (var i = buf.length; i > 1; i--) { buf[i - 1] = num & 0xff num = Math.floor(num / 0x100) } } const encodeNegative = (num: number, buf: Buffer) => { buf[0] = 0xff var flipped = false num = num * -1 for (var i = buf.length; i > 1; i--) { var byte = num & 0xff num = Math.floor(num / 0x100) if (flipped) { buf[i - 1] = onesComp(byte) } else if (byte === 0) { buf[i - 1] = 0 } else { flipped = true buf[i - 1] = twosComp(byte) } } } export const parse = (buf: Buffer) => { const pre = buf[0] const value = pre === 0x80 ? pos(buf.subarray(1, buf.length)) : pre === 0xff ? twos(buf) : null if (value === null) { throw Error('invalid base256 encoding') } if (!Number.isSafeInteger(value)) { // The number is so large that javascript cannot represent it with integer // precision. throw Error('parsed number outside of javascript safe integer range') } return value } const twos = (buf: Buffer) => { var len = buf.length var sum = 0 var flipped = false for (var i = len - 1; i > -1; i--) { var byte = Number(buf[i]) var f if (flipped) { f = onesComp(byte) } else if (byte === 0) { f = byte } else { flipped = true f = twosComp(byte) } if (f !== 0) { sum -= f * Math.pow(256, len - i - 1) } } return sum } const pos = (buf: Buffer) => { var len = buf.length var sum = 0 for (var i = len - 1; i > -1; i--) { var byte = Number(buf[i]) if (byte !== 0) { sum += byte * Math.pow(256, len - i - 1) } } return sum } const onesComp = (byte: number) => (0xff ^ byte) & 0xff const twosComp = (byte: number) => ((0xff ^ byte) + 1) & 0xff isaacs-node-tar-8a4b548/src/list.ts000066400000000000000000000064701523070444600171530ustar00rootroot00000000000000// tar -t import * as fsm from '@isaacs/fs-minipass' import fs from 'node:fs' import { dirname, parse } from 'path' import { makeCommand } from './make-command.js' import type { TarOptions, TarOptionsFile, TarOptionsSyncFile, } from './options.js' import { Parser } from './parse.js' import { stripTrailingSlashes } from './strip-trailing-slashes.js' const onReadEntryFunction = (opt: TarOptions) => { const onReadEntry = opt.onReadEntry opt.onReadEntry = onReadEntry ? e => { onReadEntry(e) e.resume() } : e => e.resume() } // construct a filter that limits the file entries listed // include child entries if a dir is included export const filesFilter = (opt: TarOptions, files: string[]) => { const map = new Map( files.map(f => [stripTrailingSlashes(f), true]), ) const filter = opt.filter // limit recursion to 100 levels const MAX = 100 const mapHas = (file: string, r: string = '', depth = 0): boolean => { /* c8 ignore start - excessive caution */ if (depth >= MAX) { map.set(file, false) return false } /* c8 ignore stop */ const root = r || parse(file).root || '.' let ret: boolean if (file === root) ret = false else { const m = map.get(file) ret = m !== undefined ? m : mapHas(dirname(file), root, depth + 1) } map.set(file, ret) return ret } opt.filter = filter ? (file, entry) => filter(file, entry) && mapHas(stripTrailingSlashes(file)) : file => mapHas(stripTrailingSlashes(file)) } const listFileSync = (opt: TarOptionsSyncFile) => { const p = new Parser(opt) const file = opt.file let fd: number | undefined try { fd = fs.openSync(file, 'r') const stat: fs.Stats = fs.fstatSync(fd) const readSize: number = opt.maxReadSize || 16 * 1024 * 1024 if (stat.size < readSize) { const buf = Buffer.allocUnsafe(stat.size) const read = fs.readSync(fd, buf, 0, stat.size, 0) p.end(read === buf.byteLength ? buf : buf.subarray(0, read)) } else { let pos = 0 const buf = Buffer.allocUnsafe(readSize) while (pos < stat.size) { const bytesRead = fs.readSync(fd, buf, 0, readSize, pos) if (bytesRead === 0) break pos += bytesRead p.write(buf.subarray(0, bytesRead)) } p.end() } } finally { if (typeof fd === 'number') { try { fs.closeSync(fd) /* c8 ignore next */ } catch {} } } } const listFile = ( opt: TarOptionsFile, _files: string[], ): Promise => { const parse = new Parser(opt) const readSize = opt.maxReadSize || 16 * 1024 * 1024 const file = opt.file const p = new Promise((resolve, reject) => { parse.on('error', reject) parse.on('end', resolve) fs.stat(file, (er, stat) => { if (er) { reject(er) } else { const stream = new fsm.ReadStream(file, { readSize: readSize, size: stat.size, }) stream.on('error', reject) stream.pipe(parse) } }) }) return p } export const list = makeCommand( listFileSync, listFile, opt => new Parser(opt) as Parser & { sync: true }, opt => new Parser(opt), (opt, files) => { if (files?.length) filesFilter(opt, files) if (!opt.noResume) onReadEntryFunction(opt) }, ) isaacs-node-tar-8a4b548/src/make-command.ts000066400000000000000000000151041523070444600205230ustar00rootroot00000000000000import type { TarOptions, TarOptionsAsyncFile, TarOptionsAsyncNoFile, TarOptionsSyncFile, TarOptionsSyncNoFile, TarOptionsWithAliases, TarOptionsWithAliasesAsync, TarOptionsWithAliasesAsyncFile, TarOptionsWithAliasesAsyncNoFile, TarOptionsWithAliasesFile, TarOptionsWithAliasesNoFile, TarOptionsWithAliasesSync, TarOptionsWithAliasesSyncFile, TarOptionsWithAliasesSyncNoFile, } from './options.js' import { dealias, isAsyncFile, isAsyncNoFile, isSyncFile, isSyncNoFile, } from './options.js' export type CB = (er?: Error) => unknown export type TarCommand = { // async and no file specified (): AsyncClass (opt: TarOptionsWithAliasesAsyncNoFile): AsyncClass (entries: string[]): AsyncClass (opt: TarOptionsWithAliasesAsyncNoFile, entries: string[]): AsyncClass } & { // sync and no file (opt: TarOptionsWithAliasesSyncNoFile): SyncClass (opt: TarOptionsWithAliasesSyncNoFile, entries: string[]): SyncClass } & { // async and file (opt: TarOptionsWithAliasesAsyncFile): Promise (opt: TarOptionsWithAliasesAsyncFile, entries: string[]): Promise (opt: TarOptionsWithAliasesAsyncFile, cb: CB): Promise ( opt: TarOptionsWithAliasesAsyncFile, entries: string[], cb: CB, ): Promise } & { // sync and file (opt: TarOptionsWithAliasesSyncFile): void (opt: TarOptionsWithAliasesSyncFile, entries: string[]): void } & { // sync, maybe file (opt: TarOptionsWithAliasesSync): typeof opt extends ( TarOptionsWithAliasesFile ) ? void : typeof opt extends TarOptionsWithAliasesNoFile ? SyncClass : void | SyncClass ( opt: TarOptionsWithAliasesSync, entries: string[], ): typeof opt extends TarOptionsWithAliasesFile ? void : typeof opt extends TarOptionsWithAliasesNoFile ? SyncClass : void | SyncClass } & { // async, maybe file (opt: TarOptionsWithAliasesAsync): typeof opt extends ( TarOptionsWithAliasesFile ) ? Promise : typeof opt extends TarOptionsWithAliasesNoFile ? AsyncClass : Promise | AsyncClass ( opt: TarOptionsWithAliasesAsync, entries: string[], ): typeof opt extends TarOptionsWithAliasesFile ? Promise : typeof opt extends TarOptionsWithAliasesNoFile ? AsyncClass : Promise | AsyncClass (opt: TarOptionsWithAliasesAsync, cb: CB): Promise ( opt: TarOptionsWithAliasesAsync, entries: string[], cb: CB, ): typeof opt extends TarOptionsWithAliasesFile ? Promise : typeof opt extends TarOptionsWithAliasesNoFile ? never : Promise } & { // maybe sync, file (opt: TarOptionsWithAliasesFile): Promise | void ( opt: TarOptionsWithAliasesFile, entries: string[], ): typeof opt extends TarOptionsWithAliasesSync ? void : typeof opt extends TarOptionsWithAliasesAsync ? Promise : Promise | void (opt: TarOptionsWithAliasesFile, cb: CB): Promise ( opt: TarOptionsWithAliasesFile, entries: string[], cb: CB, ): typeof opt extends TarOptionsWithAliasesSync ? never : typeof opt extends TarOptionsWithAliasesAsync ? Promise : Promise } & { // maybe sync, no file (opt: TarOptionsWithAliasesNoFile): typeof opt extends ( TarOptionsWithAliasesSync ) ? SyncClass : typeof opt extends TarOptionsWithAliasesAsync ? AsyncClass : SyncClass | AsyncClass ( opt: TarOptionsWithAliasesNoFile, entries: string[], ): typeof opt extends TarOptionsWithAliasesSync ? SyncClass : typeof opt extends TarOptionsWithAliasesAsync ? AsyncClass : SyncClass | AsyncClass } & { // maybe sync, maybe file (opt: TarOptionsWithAliases): typeof opt extends ( TarOptionsWithAliasesFile ) ? typeof opt extends TarOptionsWithAliasesSync ? void : typeof opt extends TarOptionsWithAliasesAsync ? Promise : void | Promise : typeof opt extends TarOptionsWithAliasesNoFile ? typeof opt extends TarOptionsWithAliasesSync ? SyncClass : typeof opt extends TarOptionsWithAliasesAsync ? AsyncClass : SyncClass | AsyncClass : typeof opt extends TarOptionsWithAliasesSync ? SyncClass | void : typeof opt extends TarOptionsWithAliasesAsync ? AsyncClass | Promise : SyncClass | void | AsyncClass | Promise } & { // extras syncFile: (opt: TarOptionsSyncFile, entries: string[]) => void asyncFile: ( opt: TarOptionsAsyncFile, entries: string[], cb?: CB, ) => Promise syncNoFile: (opt: TarOptionsSyncNoFile, entries: string[]) => SyncClass asyncNoFile: ( opt: TarOptionsAsyncNoFile, entries: string[], ) => AsyncClass validate?: (opt: TarOptions, entries?: string[]) => void } export const makeCommand = ( syncFile: (opt: TarOptionsSyncFile, entries: string[]) => void, asyncFile: ( opt: TarOptionsAsyncFile, entries: string[], cb?: CB, ) => Promise, syncNoFile: (opt: TarOptionsSyncNoFile, entries: string[]) => SyncClass, asyncNoFile: ( opt: TarOptionsAsyncNoFile, entries: string[], ) => AsyncClass, validate?: (opt: TarOptions, entries?: string[]) => void, ): TarCommand => { return Object.assign( ( opt_: TarOptionsWithAliases | string[] = [], entries?: string[] | CB, cb?: CB, ) => { if (Array.isArray(opt_)) { entries = opt_ opt_ = {} } if (typeof entries === 'function') { cb = entries entries = undefined } entries = !entries ? [] : Array.from(entries) const opt = dealias(opt_) validate?.(opt, entries) if (isSyncFile(opt)) { if (typeof cb === 'function') { throw new TypeError( 'callback not supported for sync tar functions', ) } return syncFile(opt, entries) } else if (isAsyncFile(opt)) { const p = asyncFile(opt, entries) return cb ? p.then(() => cb(), cb) : p } else if (isSyncNoFile(opt)) { if (typeof cb === 'function') { throw new TypeError( 'callback not supported for sync tar functions', ) } return syncNoFile(opt, entries) } else if (isAsyncNoFile(opt)) { if (typeof cb === 'function') { throw new TypeError('callback only supported with file option') } return asyncNoFile(opt, entries) /* c8 ignore start */ } throw new Error('impossible options??') /* c8 ignore stop */ }, { syncFile, asyncFile, syncNoFile, asyncNoFile, validate, }, ) as TarCommand } isaacs-node-tar-8a4b548/src/mkdir.ts000066400000000000000000000135231523070444600173030ustar00rootroot00000000000000import { chownr, chownrSync } from 'chownr' import fs from 'node:fs' import fsp from 'node:fs/promises' import path from 'node:path' import { CwdError } from './cwd-error.js' import { normalizeWindowsPath } from './normalize-windows-path.js' import { SymlinkError } from './symlink-error.js' export type MkdirOptions = { uid?: number gid?: number processUid?: number processGid?: number umask?: number preserve: boolean unlink: boolean cwd: string mode: number } export type MkdirError = NodeJS.ErrnoException | CwdError | SymlinkError const checkCwd = ( dir: string, cb: (er?: null | MkdirError) => unknown, ) => { fs.stat(dir, (er, st) => { if (er || !st.isDirectory()) { er = new CwdError( dir, (er as NodeJS.ErrnoException)?.code || 'ENOTDIR', ) } cb(er) }) } /** * Wrapper around fs/promises.mkdir for tar's needs. * * The main purpose is to avoid creating directories if we know that * they already exist (and track which ones exist for this purpose), * and prevent entries from being extracted into symlinked folders, * if `preservePaths` is not set. */ export const mkdir = ( dir: string, opt: MkdirOptions, cb: (er?: null | MkdirError, made?: string) => void, ) => { dir = normalizeWindowsPath(dir) // if there's any overlap between mask and mode, // then we'll need an explicit chmod /* c8 ignore next */ const umask = opt.umask ?? 0o22 const mode = opt.mode | 0o0700 const needChmod = (mode & umask) !== 0 const uid = opt.uid const gid = opt.gid const doChown = typeof uid === 'number' && typeof gid === 'number' && (uid !== opt.processUid || gid !== opt.processGid) const preserve = opt.preserve const unlink = opt.unlink const cwd = normalizeWindowsPath(opt.cwd) const done = (er?: null | MkdirError, created?: string) => { if (er) { cb(er) } else { if (created && doChown) { chownr(created, uid, gid, er => done(er as NodeJS.ErrnoException)) } else if (needChmod) { fs.chmod(dir, mode, cb) } else { cb() } } } if (dir === cwd) { return checkCwd(dir, done) } if (preserve) { return fsp.mkdir(dir, { mode, recursive: true }).then( made => done(null, made ?? undefined), // oh, ts done, ) } const sub = normalizeWindowsPath(path.relative(cwd, dir)) const parts = sub.split('/') mkdir_(cwd, parts, mode, unlink, cwd, undefined, done) } const mkdir_ = ( base: string, parts: string[], mode: number, unlink: boolean, cwd: string, created: string | undefined, cb: (er?: null | MkdirError, made?: string) => void, ): void => { if (parts.length === 0) { return cb(null, created) } const p = parts.shift() const part = normalizeWindowsPath(path.resolve(base + '/' + p)) fs.mkdir( part, mode, onmkdir(part, parts, mode, unlink, cwd, created, cb), ) } const onmkdir = ( part: string, parts: string[], mode: number, unlink: boolean, cwd: string, created: string | undefined, cb: (er?: null | MkdirError, made?: string) => void, ) => (er?: null | NodeJS.ErrnoException) => { if (er) { fs.lstat(part, (statEr, st) => { if (statEr) { statEr.path = statEr.path && normalizeWindowsPath(statEr.path) cb(statEr) } else if (st.isDirectory()) { mkdir_(part, parts, mode, unlink, cwd, created, cb) } else if (unlink) { fs.unlink(part, er => { if (er) { return cb(er) } fs.mkdir( part, mode, onmkdir(part, parts, mode, unlink, cwd, created, cb), ) }) } else if (st.isSymbolicLink()) { return cb(new SymlinkError(part, part + '/' + parts.join('/'))) } else { cb(er) } }) } else { created = created || part mkdir_(part, parts, mode, unlink, cwd, created, cb) } } const checkCwdSync = (dir: string) => { let ok = false let code try { ok = fs.statSync(dir).isDirectory() } catch (er) { code = (er as NodeJS.ErrnoException)?.code } finally { if (!ok) { throw new CwdError(dir, code ?? 'ENOTDIR') } } } export const mkdirSync = (dir: string, opt: MkdirOptions) => { dir = normalizeWindowsPath(dir) // if there's any overlap between mask and mode, // then we'll need an explicit chmod /* c8 ignore next */ const umask = opt.umask ?? 0o22 const mode = opt.mode | 0o700 const needChmod = (mode & umask) !== 0 const uid = opt.uid const gid = opt.gid const doChown = typeof uid === 'number' && typeof gid === 'number' && (uid !== opt.processUid || gid !== opt.processGid) const preserve = opt.preserve const unlink = opt.unlink const cwd = normalizeWindowsPath(opt.cwd) const done = (created?: string | undefined) => { if (created && doChown) { chownrSync(created, uid, gid) } if (needChmod) { fs.chmodSync(dir, mode) } } if (dir === cwd) { checkCwdSync(cwd) return done() } if (preserve) { return done(fs.mkdirSync(dir, { mode, recursive: true }) ?? undefined) } const sub = normalizeWindowsPath(path.relative(cwd, dir)) const parts = sub.split('/') let created for ( let p = parts.shift(), part = cwd; p && (part += '/' + p); p = parts.shift() ) { part = normalizeWindowsPath(path.resolve(part)) try { fs.mkdirSync(part, mode) created = created || part } catch { const st = fs.lstatSync(part) if (st.isDirectory()) { continue } else if (unlink) { fs.unlinkSync(part) fs.mkdirSync(part, mode) created = created || part continue } else if (st.isSymbolicLink()) { return new SymlinkError(part, part + '/' + parts.join('/')) } } } return done(created) } isaacs-node-tar-8a4b548/src/mode-fix.ts000066400000000000000000000012451523070444600177030ustar00rootroot00000000000000export const modeFix = ( mode: number, isDir: boolean, portable: boolean, ) => { mode &= 0o7777 // in portable mode, use the minimum reasonable umask // if this system creates files with 0o664 by default // (as some linux distros do), then we'll write the // archive with 0o644 instead. Also, don't ever create // a file that is not readable/writable by the owner. if (portable) { mode = (mode | 0o600) & ~0o22 } // if dirs are readable, then they should be listable if (isDir) { if (mode & 0o400) { mode |= 0o100 } if (mode & 0o40) { mode |= 0o10 } if (mode & 0o4) { mode |= 0o1 } } return mode } isaacs-node-tar-8a4b548/src/normalize-unicode.ts000066400000000000000000000016251523070444600216210ustar00rootroot00000000000000// warning: extremely hot code path. // This has been meticulously optimized for use // within npm install on large package trees. // Do not edit without careful benchmarking. const normalizeCache: Record = Object.create(null) // Limit the size of this. Very low-sophistication LRU cache const MAX = 10000 const cache = new Set() export const normalizeUnicode = (s: string): string => { if (!cache.has(s)) { // shake out identical accents and ligatures normalizeCache[s] = s .normalize('NFD') .toLocaleLowerCase('en') .toLocaleUpperCase('en') } else { cache.delete(s) } cache.add(s) const ret = normalizeCache[s] as string let i = cache.size - MAX // only prune when we're 10% over the max if (i > MAX / 10) { for (const s of cache) { cache.delete(s) delete normalizeCache[s] if (--i <= 0) break } } return ret } isaacs-node-tar-8a4b548/src/normalize-windows-path.ts000066400000000000000000000007601523070444600226160ustar00rootroot00000000000000// on windows, either \ or / are valid directory separators. // on unix, \ is a valid character in filenames. // so, on windows, and only on windows, we replace all \ chars with /, // so that we can use / as our one and only directory separator char. const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform export const normalizeWindowsPath: (p: unknown) => string = platform !== 'win32' ? (p: unknown) => String(p) : (p: unknown) => String(p).replaceAll(/\\/g, '/') isaacs-node-tar-8a4b548/src/options.ts000066400000000000000000000575201523070444600176750ustar00rootroot00000000000000// turn tar(1) style args like `C` into the more verbose things like `cwd` import { type GzipOptions, type ZlibOptions } from 'minizlib' import { type Stats } from 'node:fs' import { type ReadEntry } from './read-entry.js' import { type WarnData } from './warn-method.js' import type { WriteEntry } from './write-entry.js' const argmap = new Map([ ['C', 'cwd'], ['f', 'file'], ['z', 'gzip'], ['P', 'preservePaths'], ['U', 'unlink'], ['strip-components', 'strip'], ['stripComponents', 'strip'], ['keep-newer', 'newer'], ['keepNewer', 'newer'], ['keep-newer-files', 'newer'], ['keepNewerFiles', 'newer'], ['k', 'keep'], ['keep-existing', 'keep'], ['keepExisting', 'keep'], ['m', 'noMtime'], ['no-mtime', 'noMtime'], ['p', 'preserveOwner'], ['L', 'follow'], ['h', 'follow'], ['onentry', 'onReadEntry'], ]) /** * The options that can be provided to tar commands. * * Note that some of these are only relevant for certain commands, since * they are specific to reading or writing. * * Aliases are provided in the {@link TarOptionsWithAliases} type. */ export interface TarOptions { ////////////////////////// // shared options /** * Perform all I/O operations synchronously. If the stream is ended * immediately, then it will be processed entirely synchronously. */ sync?: boolean /** * The tar file to be read and/or written. When this is set, a stream * is not returned. Asynchronous commands will return a promise indicating * when the operation is completed, and synchronous commands will return * immediately. */ file?: string /** * Treat warnings as crash-worthy errors. Defaults false. */ strict?: boolean /** * The effective current working directory for this tar command */ cwd?: string /** * When creating a tar archive, this can be used to compress it as well. * Set to `true` to use the default gzip options, or customize them as * needed. * * When reading, if this is unset, then the compression status will be * inferred from the archive data. This is generally best, unless you are * sure of the compression settings in use to create the archive, and want to * fail if the archive doesn't match expectations. */ gzip?: boolean | GzipOptions /** * When creating archives, preserve absolute and `..` paths in the archive, * rather than sanitizing them under the cwd. * * When extracting, allow absolute paths, paths containing `..`, and * extracting through symbolic links. By default, the root `/` is stripped * from absolute paths (eg, turning `/x/y/z` into `x/y/z`), paths containing * `..` are not extracted, and any file whose location would be modified by a * symbolic link is not extracted. * * **WARNING** This is almost always unsafe, and must NEVER be used on * archives from untrusted sources, such as user input, and every entry must * be validated to ensure it is safe to write. Even if the input is not * malicious, mistakes can cause a lot of damage! */ preservePaths?: boolean /** * When extracting, do not set the `mtime` value for extracted entries to * match the `mtime` in the archive. * * When creating archives, do not store the `mtime` value in the entry. Note * that this prevents properly using other mtime-based features (such as * `tar.update` or the `newer` option) with the resulting archive. */ noMtime?: boolean /** * Set to `true` or an object with settings for `zlib.BrotliCompress()` to * create a brotli-compressed archive * * When extracting, this will cause the archive to be treated as a * brotli-compressed file if set to `true` or a ZlibOptions object. * * If set `false`, then brotli options will not be used. * * If this, the `gzip`, and `zstd` options are left `undefined`, then tar * will attempt to infer the brotli compression status, but can only do so * based on the filename. If the filename ends in `.tbr` or `.tar.br`, and * the first 512 bytes are not a valid tar header, then brotli decompression * will be attempted. */ brotli?: boolean | ZlibOptions /** * Set to `true` or an object with settings for `zstd.compress()` to * create a zstd-compressed archive * * When extracting, this will cause the archive to be treated as a * zstd-compressed file if set to `true` or a ZlibOptions object. * * If set `false`, then zstd options will not be used. * * If this, the `gzip`, and `brotli` options are left `undefined`, then tar * will attempt to infer the zstd compression status, but can only do so * based on the filename. If the filename ends in `.tzst` or `.tar.zst`, and * the first 512 bytes are not a valid tar header, then zstd decompression * will be attempted. */ zstd?: boolean | ZlibOptions /** * A function that is called with `(path, stat)` when creating an archive, or * `(path, entry)` when extracting. Return true to process the file/entry, or * false to exclude it. */ filter?: (path: string, entry: Stats | ReadEntry) => boolean /** * A function that gets called for any warning encountered. * * Note: if `strict` is set, then the warning will throw, and this method * will not be called. */ onwarn?: (code: string, message: string, data: WarnData) => unknown /** * The maximum allowed ratio of decompressed bytes to compressed bytes when * reading gzip, brotli, or zstd-compressed archives. * * This defaults to `1000` and aborts extraction or parsing when exceeded. * Set to `Infinity` to disable the limit. */ maxDecompressionRatio?: number ////////////////////////// // extraction options /** * When extracting, unlink files before creating them. Without this option, * tar overwrites existing files, which preserves existing hardlinks. With * this option, existing hardlinks will be broken, as will any symlink that * would affect the location of an extracted file. */ unlink?: boolean /** * When extracting, strip the specified number of path portions from the * entry path. For example, with `{strip: 2}`, the entry `a/b/c/d` would be * extracted to `{cwd}/c/d`. * * Any entry whose entire path is stripped will be excluded. */ strip?: number /** * When extracting, keep the existing file on disk if it's newer than the * file in the archive. */ newer?: boolean /** * When extracting, do not overwrite existing files at all. */ keep?: boolean /** * When extracting, set the `uid` and `gid` of extracted entries to the `uid` * and `gid` fields in the archive. Defaults to true when run as root, and * false otherwise. * * If false, then files and directories will be set with the owner and group * of the user running the process. This is similar to `-p` in `tar(1)`, but * ACLs and other system-specific data is never unpacked in this * implementation, and modes are set by default already. */ preserveOwner?: boolean /** * The maximum depth of subfolders to extract into. This defaults to 1024. * Anything deeper than the limit will raise a warning and skip the entry. * Set to `Infinity` to remove the limitation. */ maxDepth?: number /** * When extracting, force all created files and directories, and all * implicitly created directories, to be owned by the specified user id, * regardless of the `uid` field in the archive. * * Cannot be used along with `preserveOwner`. Requires also setting the `gid` * option. */ uid?: number /** * When extracting, force all created files and directories, and all * implicitly created directories, to be owned by the specified group id, * regardless of the `gid` field in the archive. * * Cannot be used along with `preserveOwner`. Requires also setting the `uid` * option. */ gid?: number /** * When extracting, provide a function that takes an `entry` object, and * returns a stream, or any falsey value. If a stream is provided, then that * stream's data will be written instead of the contents of the archive * entry. If a falsey value is provided, then the entry is written to disk as * normal. * * To exclude items from extraction, use the `filter` option. * * Note that using an asynchronous stream type with the `transform` option * will cause undefined behavior in synchronous extractions. * [MiniPass](http://npm.im/minipass)-based streams are designed for this use * case. */ transform?: ( entry: ReadEntry, ) => ReadEntry | null | undefined | false | 0 | '' /** * Call `chmod()` to ensure that extracted files match the entry's mode * field. Without this field set, all mode fields in archive entries are a * best effort attempt only. * * Setting this necessitates a call to the deprecated `process.umask()` * method to determine the default umask value, unless a `processUmask` * config is provided as well. * * If not set, tar will attempt to create file system entries with whatever * mode is provided, and let the implicit process `umask` apply normally, but * if a file already exists to be written to, then its existing mode will not * be modified. * * When setting `chmod: true`, it is highly recommend to set the * {@link TarOptions#processUmask} option as well, to avoid the call to the * deprecated (and thread-unsafe) `process.umask()` method. */ chmod?: boolean /** * When setting the {@link TarOptions#chmod} option to `true`, you may * provide a value here to avoid having to call the deprecated and * thread-unsafe `process.umask()` method. * * This has no effect with `chmod` is not set to true, as mode values are not * set explicitly anyway. If `chmod` is set to `true`, and a value is not * provided here, then `process.umask()` must be called, which will result in * deprecation warnings. * * The most common values for this are `0o22` (resulting in directories * created with mode `0o755` and files with `0o644` by default) and `0o2` * (resulting in directores created with mode `0o775` and files `0o664`, so * they are group-writable). */ processUmask?: number ////////////////////////// // archive creation options /** * When parsing/listing archives, `entry` streams are by default resumed * (set into "flowing" mode) immediately after the call to `onReadEntry()`. * Set `noResume: true` to suppress this behavior. * * Note that when this is set, the stream will never complete until the * data is consumed somehow. * * Set automatically in extract operations, since the entry is piped to * a file system entry right away. Only relevant when parsing. */ noResume?: boolean /** * When creating, updating, or replacing within archives, this method will * be called with each WriteEntry that is created. */ onWriteEntry?: (entry: WriteEntry) => unknown /** * When extracting or listing archives, this method will be called with * each entry that is not excluded by a `filter`. * * Important when listing archives synchronously from a file, because there * is otherwise no way to interact with the data! */ onReadEntry?: (entry: ReadEntry) => unknown /** * Pack the targets of symbolic links rather than the link itself. */ follow?: boolean /** * When creating archives, omit any metadata that is system-specific: * `ctime`, `atime`, `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and * `nlink`. Note that `mtime` is still included, because this is necessary * for other time-based operations such as `tar.update`. Additionally, `mode` * is set to a "reasonable default" for mose unix systems, based on an * effective `umask` of `0o22`. * * This also defaults the `portable` option in the gzip configs when creating * a compressed archive, in order to produce deterministic archives that are * not operating-system specific. */ portable?: boolean /** * When creating archives, do not recursively archive the contents of * directories. By default, archiving a directory archives all of its * contents as well. */ noDirRecurse?: boolean /** * Suppress Pax extended headers when creating archives. Note that this means * long paths and linkpaths will be truncated, and large or negative numeric * values may be interpreted incorrectly. */ noPax?: boolean /** * Set to a `Date` object to force a specific `mtime` value for everything * written to an archive. * * This is useful when creating archives that are intended to be * deterministic based on their contents, irrespective of the file's last * modification time. * * Overridden by `noMtime`. */ mtime?: Date /** * A path portion to prefix onto the entries added to an archive. */ prefix?: string /** * The mode to set on any created file archive, defaults to 0o666 * masked by the process umask, often resulting in 0o644. * * This does *not* affect the mode fields of individual entries, or the * mode status of extracted entries on the filesystem. */ mode?: number ////////////////////////// // internal options /** * A cache of mtime values, to avoid having to stat the same file repeatedly. * * @internal */ mtimeCache?: Map /** * maximum buffer size for `fs.read()` operations. * * @internal */ maxReadSize?: number /** * Filter modes of entries being unpacked, like `process.umask()` * * @internal */ umask?: number /** * Default mode for directories. Used for all implicitly created directories, * and any directories in the archive that do not have a mode field. * * @internal */ dmode?: number /** * default mode for files * * @internal */ fmode?: number /** * Map that tracks which directories already exist, for extraction * * @internal */ dirCache?: Map /** * maximum supported size of meta entries. Defaults to 1MB * * @internal */ maxMetaEntrySize?: number /** * A Map object containing the device and inode value for any file whose * `nlink` value is greater than 1, to identify hard links when creating * archives. * * @internal */ linkCache?: Map /** * A map object containing the results of `fs.readdir()` calls. * * @internal */ readdirCache?: Map /** * A cache of all `lstat` results, for use in creating archives. * * @internal */ statCache?: Map /** * Number of concurrent jobs to run when creating archives. * * Defaults to 4. * * @internal */ jobs?: number /** * Automatically set to true on Windows systems. * * When extracting, causes behavior where filenames containing `<|>?:` * characters are converted to windows-compatible escape sequences in the * created filesystem entries. * * When packing, causes behavior where paths replace `\` with `/`, and * filenames containing the windows-compatible escaped forms of `<|>?:` are * converted to actual `<|>?:` characters in the archive. * * @internal */ win32?: boolean /** * For `WriteEntry` objects, the absolute path to the entry on the * filesystem. By default, this is `resolve(cwd, entry.path)`, but it can be * overridden explicitly. * * @internal */ absolute?: string /** * Used with Parser stream interface, to attach and take over when the * stream is completely parsed. If this is set, then the prefinish, * finish, and end events will not fire, and are the responsibility of * the ondone method to emit properly. * * @internal */ ondone?: () => void /** * Mostly for testing, but potentially useful in some cases. * Forcibly trigger a chown on every entry, no matter what. */ forceChown?: boolean /** * ambiguous deprecated name for {@link onReadEntry} * * @deprecated */ onentry?: (entry: ReadEntry) => unknown } export type TarOptionsSync = TarOptions & { sync: true } export type TarOptionsAsync = TarOptions & { sync?: false } export type TarOptionsFile = TarOptions & { file: string } export type TarOptionsNoFile = TarOptions & { file?: undefined } export type TarOptionsSyncFile = TarOptionsSync & TarOptionsFile export type TarOptionsAsyncFile = TarOptionsAsync & TarOptionsFile export type TarOptionsSyncNoFile = TarOptionsSync & TarOptionsNoFile export type TarOptionsAsyncNoFile = TarOptionsAsync & TarOptionsNoFile export type LinkCacheKey = `${number}:${number}` export interface TarOptionsWithAliases extends TarOptions { /** * The effective current working directory for this tar command */ C?: TarOptions['cwd'] /** * The tar file to be read and/or written. When this is set, a stream * is not returned. Asynchronous commands will return a promise indicating * when the operation is completed, and synchronous commands will return * immediately. */ f?: TarOptions['file'] /** * When creating a tar archive, this can be used to compress it as well. * Set to `true` to use the default gzip options, or customize them as * needed. * * When reading, if this is unset, then the compression status will be * inferred from the archive data. This is generally best, unless you are * sure of the compression settings in use to create the archive, and want to * fail if the archive doesn't match expectations. */ z?: TarOptions['gzip'] /** * When creating archives, preserve absolute and `..` paths in the archive, * rather than sanitizing them under the cwd. * * When extracting, allow absolute paths, paths containing `..`, and * extracting through symbolic links. By default, the root `/` is stripped * from absolute paths (eg, turning `/x/y/z` into `x/y/z`), paths containing * `..` are not extracted, and any file whose location would be modified by a * symbolic link is not extracted. * * **WARNING** This is almost always unsafe, and must NEVER be used on * archives from untrusted sources, such as user input, and every entry must * be validated to ensure it is safe to write. Even if the input is not * malicious, mistakes can cause a lot of damage! */ P?: TarOptions['preservePaths'] /** * When extracting, unlink files before creating them. Without this option, * tar overwrites existing files, which preserves existing hardlinks. With * this option, existing hardlinks will be broken, as will any symlink that * would affect the location of an extracted file. */ U?: TarOptions['unlink'] /** * When extracting, strip the specified number of path portions from the * entry path. For example, with `{strip: 2}`, the entry `a/b/c/d` would be * extracted to `{cwd}/c/d`. */ 'strip-components'?: TarOptions['strip'] /** * When extracting, strip the specified number of path portions from the * entry path. For example, with `{strip: 2}`, the entry `a/b/c/d` would be * extracted to `{cwd}/c/d`. */ stripComponents?: TarOptions['strip'] /** * When extracting, keep the existing file on disk if it's newer than the * file in the archive. */ 'keep-newer'?: TarOptions['newer'] /** * When extracting, keep the existing file on disk if it's newer than the * file in the archive. */ keepNewer?: TarOptions['newer'] /** * When extracting, keep the existing file on disk if it's newer than the * file in the archive. */ 'keep-newer-files'?: TarOptions['newer'] /** * When extracting, keep the existing file on disk if it's newer than the * file in the archive. */ keepNewerFiles?: TarOptions['newer'] /** * When extracting, do not overwrite existing files at all. */ k?: TarOptions['keep'] /** * When extracting, do not overwrite existing files at all. */ 'keep-existing'?: TarOptions['keep'] /** * When extracting, do not overwrite existing files at all. */ keepExisting?: TarOptions['keep'] /** * When extracting, do not set the `mtime` value for extracted entries to * match the `mtime` in the archive. * * When creating archives, do not store the `mtime` value in the entry. Note * that this prevents properly using other mtime-based features (such as * `tar.update` or the `newer` option) with the resulting archive. */ m?: TarOptions['noMtime'] /** * When extracting, do not set the `mtime` value for extracted entries to * match the `mtime` in the archive. * * When creating archives, do not store the `mtime` value in the entry. Note * that this prevents properly using other mtime-based features (such as * `tar.update` or the `newer` option) with the resulting archive. */ 'no-mtime'?: TarOptions['noMtime'] /** * When extracting, set the `uid` and `gid` of extracted entries to the `uid` * and `gid` fields in the archive. Defaults to true when run as root, and * false otherwise. * * If false, then files and directories will be set with the owner and group * of the user running the process. This is similar to `-p` in `tar(1)`, but * ACLs and other system-specific data is never unpacked in this * implementation, and modes are set by default already. */ p?: TarOptions['preserveOwner'] /** * Pack the targets of symbolic links rather than the link itself. */ L?: TarOptions['follow'] /** * Pack the targets of symbolic links rather than the link itself. */ h?: TarOptions['follow'] /** * Deprecated option. Set explicitly false to set `chmod: true`. Ignored * if {@link TarOptions#chmod} is set to any boolean value. * * @deprecated */ noChmod?: boolean } export type TarOptionsWithAliasesSync = TarOptionsWithAliases & { sync: true } export type TarOptionsWithAliasesAsync = TarOptionsWithAliases & { sync?: false } export type TarOptionsWithAliasesFile = | (TarOptionsWithAliases & { file: string }) | (TarOptionsWithAliases & { f: string }) export type TarOptionsWithAliasesSyncFile = TarOptionsWithAliasesSync & TarOptionsWithAliasesFile export type TarOptionsWithAliasesAsyncFile = TarOptionsWithAliasesAsync & TarOptionsWithAliasesFile export type TarOptionsWithAliasesNoFile = TarOptionsWithAliases & { f?: undefined file?: undefined } export type TarOptionsWithAliasesSyncNoFile = TarOptionsWithAliasesSync & TarOptionsWithAliasesNoFile export type TarOptionsWithAliasesAsyncNoFile = TarOptionsWithAliasesAsync & TarOptionsWithAliasesNoFile export const isSyncFile = ( o: O, ): o is O & TarOptionsSyncFile => !!o.sync && !!o.file export const isAsyncFile = ( o: O, ): o is O & TarOptionsAsyncFile => !o.sync && !!o.file export const isSyncNoFile = ( o: O, ): o is O & TarOptionsSyncNoFile => !!o.sync && !o.file export const isAsyncNoFile = ( o: O, ): o is O & TarOptionsAsyncNoFile => !o.sync && !o.file export const isSync = ( o: O, ): o is O & TarOptionsSync => !!o.sync export const isAsync = ( o: O, ): o is O & TarOptionsAsync => !o.sync export const isFile = ( o: O, ): o is O & TarOptionsFile => !!o.file export const isNoFile = ( o: O, ): o is O & TarOptionsNoFile => !o.file const dealiasKey = (k: keyof TarOptionsWithAliases): keyof TarOptions => { const d = argmap.get(k) if (d) return d return k as keyof TarOptions } export const dealias = (opt: TarOptionsWithAliases = {}): TarOptions => { if (!opt) return {} const result: Record = {} for (const [key, v] of Object.entries(opt) as [ keyof TarOptionsWithAliases, unknown, ][]) { // TS doesn't know that aliases are going to always be the same type const k = dealiasKey(key) result[k] = v } // affordance for deprecated noChmod -> chmod if (result.chmod === undefined && result.noChmod === false) { result.chmod = true } delete result.noChmod return result as TarOptions } isaacs-node-tar-8a4b548/src/pack.ts000066400000000000000000000346731523070444600171240ustar00rootroot00000000000000// A readable tar stream creator // Technically, this is a transform stream that you write paths into, // and tar format comes out of. // The `add()` method is like `write()` but returns this, // and end() return `this` as well, so you can // do `new Pack(opt).add('files').add('dir').end().pipe(output) // You could also do something like: // streamOfPaths().pipe(new Pack()).pipe(new fs.WriteStream('out.tar')) import fs, { type Stats } from 'fs' import { WriteEntry, WriteEntrySync, WriteEntryTar, } from './write-entry.js' export class PackJob { path: string absolute: string entry?: WriteEntry | WriteEntryTar stat?: Stats readdir?: string[] pending: boolean = false pendingLink: boolean = false ignore: boolean = false piped: boolean = false constructor(path: string, absolute: string) { this.path = path || './' this.absolute = absolute } } import { Minipass } from 'minipass' import * as zlib from 'minizlib' import { Yallist } from 'yallist' import type { ReadEntry } from './read-entry.js' import type { WarnEvent } from './warn-method.js' import { warnMethod, type WarnData, type Warner } from './warn-method.js' const EOF = Buffer.alloc(1024) const ONSTAT = Symbol('onStat') const ENDED = Symbol('ended') const QUEUE = Symbol('queue') const PENDINGLINKS = Symbol('pendingLinks') const CURRENT = Symbol('current') const PROCESS = Symbol('process') const PROCESSING = Symbol('processing') const PROCESSJOB = Symbol('processJob') const JOBS = Symbol('jobs') const JOBDONE = Symbol('jobDone') const ADDFSENTRY = Symbol('addFSEntry') const ADDTARENTRY = Symbol('addTarEntry') const STAT = Symbol('stat') const READDIR = Symbol('readdir') const ONREADDIR = Symbol('onreaddir') const PIPE = Symbol('pipe') const ENTRY = Symbol('entry') const ENTRYOPT = Symbol('entryOpt') const WRITEENTRYCLASS = Symbol('writeEntryClass') const WRITE = Symbol('write') const ONDRAIN = Symbol('ondrain') import path from 'path' import { normalizeWindowsPath } from './normalize-windows-path.js' import type { LinkCacheKey, TarOptions } from './options.js' export class Pack extends Minipass> implements Warner { sync: boolean = false opt: TarOptions cwd: string maxReadSize?: number preservePaths: boolean strict: boolean noPax: boolean prefix: string linkCache: Exclude statCache: Exclude file: string portable: boolean zip?: zlib.BrotliCompress | zlib.Gzip | zlib.ZstdCompress readdirCache: Exclude noDirRecurse: boolean follow: boolean noMtime: boolean mtime?: Date filter: Exclude jobs: number; [WRITEENTRYCLASS]: typeof WriteEntry | typeof WriteEntrySync onWriteEntry?: (entry: WriteEntry) => void; // Note: we actually DO need a linked list here, because we // shift() to update the head of the list where we start, but still // while that happens, need to know what the next item in the queue // will be. Since we do multiple jobs in parallel, it's not as simple // as just an Array.shift(), since that would lose the information about // the next job in the list. We could add a .next field on the PackJob // class, but then we'd have to be tracking the tail of the queue the // whole time, and Yallist just does that for us anyway. [QUEUE]: Yallist; [PENDINGLINKS] = new Map(); [JOBS]: number = 0; [PROCESSING]: boolean = false; [ENDED]: boolean = false constructor(opt: TarOptions = {}) { super() this.opt = opt this.file = opt.file || '' this.cwd = opt.cwd || process.cwd() this.maxReadSize = opt.maxReadSize this.preservePaths = !!opt.preservePaths this.strict = !!opt.strict this.noPax = !!opt.noPax this.prefix = normalizeWindowsPath(opt.prefix || '') this.linkCache = opt.linkCache || new Map() this.statCache = opt.statCache || new Map() this.readdirCache = opt.readdirCache || new Map() this.onWriteEntry = opt.onWriteEntry this[WRITEENTRYCLASS] = WriteEntry if (typeof opt.onwarn === 'function') { this.on('warn', opt.onwarn) } this.portable = !!opt.portable if (opt.gzip || opt.brotli || opt.zstd) { if ( (opt.gzip ? 1 : 0) + (opt.brotli ? 1 : 0) + (opt.zstd ? 1 : 0) > 1 ) { throw new TypeError('gzip, brotli, zstd are mutually exclusive') } if (opt.gzip) { if (typeof opt.gzip !== 'object') { opt.gzip = {} } if (this.portable) { opt.gzip.portable = true } this.zip = new zlib.Gzip(opt.gzip) } if (opt.brotli) { if (typeof opt.brotli !== 'object') { opt.brotli = {} } this.zip = new zlib.BrotliCompress(opt.brotli) } if (opt.zstd) { if (typeof opt.zstd !== 'object') { opt.zstd = {} } this.zip = new zlib.ZstdCompress(opt.zstd) } /* c8 ignore next */ if (!this.zip) throw new Error('impossible') const zip = this.zip zip.on('data', chunk => super.write(chunk as unknown as string)) zip.on('end', () => super.end()) zip.on('drain', () => this[ONDRAIN]()) this.on('resume', () => zip.resume()) } else { this.on('drain', this[ONDRAIN]) } this.noDirRecurse = !!opt.noDirRecurse this.follow = !!opt.follow this.noMtime = !!opt.noMtime if (opt.mtime) this.mtime = opt.mtime this.filter = typeof opt.filter === 'function' ? opt.filter : () => true this[QUEUE] = new Yallist() this[JOBS] = 0 this.jobs = Number(opt.jobs) || 4 this[PROCESSING] = false this[ENDED] = false } [WRITE](chunk: Buffer) { return super.write(chunk as unknown as string) } add(path: string | ReadEntry) { this.write(path) return this } end(cb?: () => void): this end(path: string | ReadEntry, cb?: () => void): this end( path: string | ReadEntry, encoding?: Minipass.Encoding, cb?: () => void, ): this end( path?: string | ReadEntry | (() => void), encoding?: Minipass.Encoding | (() => void), cb?: () => void, ) { /* c8 ignore start */ if (typeof path === 'function') { cb = path path = undefined } if (typeof encoding === 'function') { cb = encoding encoding = undefined } /* c8 ignore stop */ if (path) { this.add(path) } this[ENDED] = true this[PROCESS]() /* c8 ignore next */ if (cb) cb() return this } write(path: string | ReadEntry) { if (this[ENDED]) { throw new Error('write after end') } if (typeof path === 'string') { this[ADDFSENTRY](path) } else { this[ADDTARENTRY](path) } return this.flowing } [ADDTARENTRY](p: ReadEntry) { const absolute = normalizeWindowsPath(path.resolve(this.cwd, p.path)) // in this case, we don't have to wait for the stat if (!this.filter(p.path, p)) { p.resume() } else { const job = new PackJob(p.path, absolute) job.entry = new WriteEntryTar(p, this[ENTRYOPT](job)) job.entry.on('end', () => this[JOBDONE](job)) this[JOBS] += 1 this[QUEUE].push(job) } this[PROCESS]() } [ADDFSENTRY](p: string) { const absolute = normalizeWindowsPath(path.resolve(this.cwd, p)) this[QUEUE].push(new PackJob(p, absolute)) this[PROCESS]() } [STAT](job: PackJob) { job.pending = true this[JOBS] += 1 const stat = this.follow ? 'stat' : 'lstat' fs[stat](job.absolute, (er, stat) => { job.pending = false this[JOBS] -= 1 if (er) { this.emit('error', er) } else { this[ONSTAT](job, stat) } }) } [ONSTAT](job: PackJob, stat: Stats) { this.statCache.set(job.absolute, stat) job.stat = stat // now we have the stat, we can filter it. if (!this.filter(job.path, stat)) { job.ignore = true } else if ( stat.isFile() && stat.nlink > 1 && !this.linkCache.get(`${stat.dev}:${stat.ino}`) && !this.sync ) { // if it's not filtered, and it's a new File entry, and next anyway // process right away in case any pending Link entries are about // to try to link to it. if (job === this[CURRENT]) { this[PROCESSJOB](job) } else { // if it's NOT the current entry, it needs to be deferred, // so that the link target can be built first. const key: LinkCacheKey = `${stat.dev}:${stat.ino}` const pending = this[PENDINGLINKS].get(key) if (pending) pending.push(job) else this[PENDINGLINKS].set(key, [job]) job.pendingLink = true job.pending = true } } this[PROCESS]() } [READDIR](job: PackJob) { job.pending = true this[JOBS] += 1 fs.readdir(job.absolute, (er, entries) => { job.pending = false this[JOBS] -= 1 if (er) { return this.emit('error', er) } this[ONREADDIR](job, entries) }) } [ONREADDIR](job: PackJob, entries: string[]) { this.readdirCache.set(job.absolute, entries) job.readdir = entries this[PROCESS]() } [PROCESS]() { if (this[PROCESSING]) { return } this[PROCESSING] = true for ( let w = this[QUEUE].head; !!w && this[JOBS] < this.jobs; w = w.next ) { this[PROCESSJOB](w.value) if (w.value.ignore) { const p = w.next this[QUEUE].removeNode(w) w.next = p } } this[PROCESSING] = false if (this[ENDED] && this[QUEUE].length === 0 && this[JOBS] === 0) { if (this.zip) { this.zip.end(EOF) } else { super.write(EOF as unknown as string) super.end() } } } get [CURRENT]() { return this[QUEUE] && this[QUEUE].head && this[QUEUE].head.value } [JOBDONE](job: PackJob) { this[QUEUE].shift() this[JOBS] -= 1 const { stat } = job if (stat && stat.isFile() && stat.nlink > 1) { // might be a file with pending links const key: LinkCacheKey = `${stat.dev}:${stat.ino}` const pending = this[PENDINGLINKS].get(key) if (pending) { this[PENDINGLINKS].delete(key) for (const job of pending) { job.pending = false this[PROCESSJOB](job) } } } this[PROCESS]() } [PROCESSJOB](job: PackJob) { if (job.pending && job.pendingLink && job === this[CURRENT]) { // At least one of the links to this file are not being included // in the tarball, so we need to just proceed. job.pending = false job.pendingLink = false } if (job.pending) { return } if (job.entry) { if (job === this[CURRENT] && !job.piped) { this[PIPE](job) } return } if (!job.stat) { const sc = this.statCache.get(job.absolute) if (sc) { this[ONSTAT](job, sc) } else { this[STAT](job) } } if (!job.stat) { return } // filtered out! if (job.ignore) { return } if (!this.noDirRecurse && job.stat.isDirectory() && !job.readdir) { const rc = this.readdirCache.get(job.absolute) if (rc) { this[ONREADDIR](job, rc) } else { this[READDIR](job) } if (!job.readdir) { return } } // we know it doesn't have an entry, because that got checked above job.entry = this[ENTRY](job) if (!job.entry) { job.ignore = true return } if (job === this[CURRENT] && !job.piped) { this[PIPE](job) } } [ENTRYOPT](job: PackJob): TarOptions { return { onwarn: (code, msg, data) => this.warn(code, msg, data), noPax: this.noPax, cwd: this.cwd, absolute: job.absolute, preservePaths: this.preservePaths, maxReadSize: this.maxReadSize, strict: this.strict, portable: this.portable, linkCache: this.linkCache, statCache: this.statCache, noMtime: this.noMtime, mtime: this.mtime, prefix: this.prefix, onWriteEntry: this.onWriteEntry, } } [ENTRY](job: PackJob) { this[JOBS] += 1 try { const e = new this[WRITEENTRYCLASS](job.path, this[ENTRYOPT](job)) return e .on('end', () => this[JOBDONE](job)) .on('error', er => this.emit('error', er)) } catch (er) { this.emit('error', er) } } [ONDRAIN]() { if (this[CURRENT] && this[CURRENT].entry) { this[CURRENT].entry.resume() } } // like .pipe() but using super, because our write() is special [PIPE](job: PackJob) { job.piped = true if (job.readdir) { job.readdir.forEach(entry => { const p = job.path const base = p === './' ? '' : p.replace(/\/*$/, '/') this[ADDFSENTRY](base + entry) }) } const source = job.entry const zip = this.zip /* c8 ignore start */ if (!source) throw new Error('cannot pipe without source') /* c8 ignore stop */ if (zip) { source.on('data', chunk => { if (!zip.write(chunk)) { source.pause() } }) } else { source.on('data', chunk => { if (!super.write(chunk as unknown as string)) { source.pause() } }) } } pause() { if (this.zip) { this.zip.pause() } return super.pause() } warn(code: string, message: string | Error, data: WarnData = {}): void { warnMethod(this, code, message, data) } } export class PackSync extends Pack { sync: true = true constructor(opt: TarOptions) { super(opt) this[WRITEENTRYCLASS] = WriteEntrySync } // pause/resume are no-ops in sync streams. pause() {} resume() {} [STAT](job: PackJob) { const stat = this.follow ? 'statSync' : 'lstatSync' this[ONSTAT](job, fs[stat](job.absolute)) } [READDIR](job: PackJob) { this[ONREADDIR](job, fs.readdirSync(job.absolute)) } // gotta get it all in this tick [PIPE](job: PackJob) { const source = job.entry const zip = this.zip if (job.readdir) { job.readdir.forEach(entry => { const p = job.path const base = p === './' ? '' : p.replace(/\/*$/, '/') this[ADDFSENTRY](base + entry) }) } /* c8 ignore start */ if (!source) throw new Error('Cannot pipe without source') /* c8 ignore stop */ if (zip) { source.on('data', chunk => { zip.write(chunk) }) } else { source.on('data', chunk => { super[WRITE](chunk) }) } } } isaacs-node-tar-8a4b548/src/parse.ts000066400000000000000000000523471523070444600173160ustar00rootroot00000000000000// this[BUFFER] is the remainder of a chunk if we're waiting for // the full 512 bytes of a header to come in. We will Buffer.concat() // it to the next write(), which is a mem copy, but a small one. // // this[QUEUE] is a list of entries that haven't been emitted // yet this can only get filled up if the user keeps write()ing after // a write() returns false, or does a write() with more than one entry // // We don't buffer chunks, we always parse them and either create an // entry, or push it into the active entry. The ReadEntry class knows // to throw data away if .ignore=true // // Shift entry off the buffer when it emits 'end', and emit 'entry' for // the next one in the list. // // At any time, we're pushing body chunks into the entry at WRITEENTRY, // and waiting for 'end' on the entry at READENTRY // // ignored entries get .resume() called on them straight away import { EventEmitter as EE } from 'events' import { BrotliDecompress, Unzip, ZstdDecompress } from 'minizlib' import { Header } from './header.js' import type { TarOptions } from './options.js' import { Pax } from './pax.js' import { ReadEntry } from './read-entry.js' import { warnMethod, type WarnData, type Warner } from './warn-method.js' const maxMetaEntrySize = 1024 * 1024 const gzipHeader = Buffer.from([0x1f, 0x8b]) const zstdHeader = Buffer.from([0x28, 0xb5, 0x2f, 0xfd]) const ZIP_HEADER_LEN = Math.max(gzipHeader.length, zstdHeader.length) const STATE = Symbol('state') const WRITEENTRY = Symbol('writeEntry') const READENTRY = Symbol('readEntry') const NEXTENTRY = Symbol('nextEntry') const PROCESSENTRY = Symbol('processEntry') const EX = Symbol('extendedHeader') const GEX = Symbol('globalExtendedHeader') const META = Symbol('meta') const EMITMETA = Symbol('emitMeta') const BUFFER = Symbol('buffer') const QUEUE = Symbol('queue') const ENDED = Symbol('ended') const EMITTEDEND = Symbol('emittedEnd') const EMIT = Symbol('emit') const UNZIP = Symbol('unzip') const CONSUMECHUNK = Symbol('consumeChunk') const CONSUMECHUNKSUB = Symbol('consumeChunkSub') const CONSUMEBODY = Symbol('consumeBody') const CONSUMEMETA = Symbol('consumeMeta') const CONSUMEHEADER = Symbol('consumeHeader') const CONSUMING = Symbol('consuming') const BUFFERCONCAT = Symbol('bufferConcat') const MAYBEEND = Symbol('maybeEnd') const WRITING = Symbol('writing') const ABORTED = Symbol('aborted') const DONE = Symbol('onDone') const SAW_VALID_ENTRY = Symbol('sawValidEntry') const SAW_NULL_BLOCK = Symbol('sawNullBlock') const SAW_EOF = Symbol('sawEOF') const CLOSESTREAM = Symbol('closeStream') const MAX_DECOMPRESSION_RATIO = 1000 const COMPRESSEDBYTESREAD = Symbol('compressedBytesRead') const DECOMPRESSEDBYTESREAD = Symbol('decompressedBytesRead') const CHECKDECOMPRESSIONRATIO = Symbol('checkDecompressionRatio') const noop = () => true export type State = 'begin' | 'header' | 'ignore' | 'meta' | 'body' export class Parser extends EE implements Warner { file: string strict: boolean maxMetaEntrySize: number filter: Exclude brotli?: TarOptions['brotli'] zstd?: TarOptions['zstd'] maxDecompressionRatio: number writable: true = true readable: false = false; [QUEUE]: (ReadEntry | [string | symbol, unknown, unknown])[] = []; [BUFFER]?: Buffer; [READENTRY]?: ReadEntry; [WRITEENTRY]?: ReadEntry; [STATE]: State = 'begin'; [META]: string = ''; [EX]?: Pax; [GEX]?: Pax; [ENDED]: boolean = false; [UNZIP]?: false | Unzip | BrotliDecompress | ZstdDecompress; [ABORTED]: boolean = false; [SAW_VALID_ENTRY]?: boolean; [SAW_NULL_BLOCK]: boolean = false; [SAW_EOF]: boolean = false; [WRITING]: boolean = false; [CONSUMING]: boolean = false; [EMITTEDEND]: boolean = false; [COMPRESSEDBYTESREAD]: number = 0; [DECOMPRESSEDBYTESREAD]: number = 0 constructor(opt: TarOptions = {}) { super() this.file = opt.file || '' // these BADARCHIVE errors can't be detected early. listen on DONE. this.on(DONE, () => { if (this[STATE] === 'begin' || this[SAW_VALID_ENTRY] === false) { // either less than 1 block of data, or all entries were invalid. // Either way, probably not even a tarball. this.warn('TAR_BAD_ARCHIVE', 'Unrecognized archive format') } }) if (opt.ondone) { this.on(DONE, opt.ondone) } else { this.on(DONE, () => { this.emit('prefinish') this.emit('finish') this.emit('end') }) } this.strict = !!opt.strict this.maxDecompressionRatio = typeof opt.maxDecompressionRatio === 'number' ? opt.maxDecompressionRatio : MAX_DECOMPRESSION_RATIO this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize this.filter = typeof opt.filter === 'function' ? opt.filter : noop // Unlike gzip, brotli doesn't have any magic bytes to identify it // Users need to explicitly tell us they're extracting a brotli file // Or we infer from the file extension const isTBR = opt.file && (opt.file.endsWith('.tar.br') || opt.file.endsWith('.tbr')) // if it's a tbr file it MIGHT be brotli, but we don't know until // we look at it and verify it's not a valid tar file. this.brotli = !(opt.gzip || opt.zstd) && opt.brotli !== undefined ? opt.brotli : isTBR ? undefined : false // zstd has magic bytes to identify it, but we also support explicit options // and file extension detection const isTZST = opt.file && (opt.file.endsWith('.tar.zst') || opt.file.endsWith('.tzst')) this.zstd = !(opt.gzip || opt.brotli) && opt.zstd !== undefined ? opt.zstd : isTZST ? true : undefined // have to set this so that streams are ok piping into it this.on('end', () => this[CLOSESTREAM]()) if (typeof opt.onwarn === 'function') { this.on('warn', opt.onwarn) } if (typeof opt.onReadEntry === 'function') { this.on('entry', opt.onReadEntry) } } warn(code: string, message: string | Error, data: WarnData = {}): void { warnMethod(this, code, message, data) } [CONSUMEHEADER](chunk: Buffer, position: number) { if (this[SAW_VALID_ENTRY] === undefined) { this[SAW_VALID_ENTRY] = false } let header try { header = new Header(chunk, position, this[EX], this[GEX]) } catch (er) { return this.warn('TAR_ENTRY_INVALID', er as Error) } if (header.nullBlock) { if (this[SAW_NULL_BLOCK]) { this[SAW_EOF] = true // ending an archive with no entries. pointless, but legal. if (this[STATE] === 'begin') { this[STATE] = 'header' } this[EMIT]('eof') } else { this[SAW_NULL_BLOCK] = true this[EMIT]('nullBlock') } } else { this[SAW_NULL_BLOCK] = false if (!header.cksumValid) { this.warn('TAR_ENTRY_INVALID', 'checksum failure', { header }) } else if (!header.path) { this.warn('TAR_ENTRY_INVALID', 'path is required', { header }) } else { const type = header.type if (/^(Symbolic)?Link$/.test(type) && !header.linkpath) { this.warn('TAR_ENTRY_INVALID', 'linkpath required', { header, }) } else if ( !/^(Symbolic)?Link$/.test(type) && !/^(Global)?ExtendedHeader$/.test(type) && header.linkpath ) { this.warn('TAR_ENTRY_INVALID', 'linkpath forbidden', { header, }) } else { const entry = (this[WRITEENTRY] = new ReadEntry( header, this[EX], this[GEX], )) // we do this for meta & ignored entries as well, because they // are still valid tar, or else we wouldn't know to ignore them if (!this[SAW_VALID_ENTRY]) { if (entry.remain) { // this might be the one! const onend = () => { if (!entry.invalid) { this[SAW_VALID_ENTRY] = true } } entry.on('end', onend) } else { this[SAW_VALID_ENTRY] = true } } if (entry.meta) { if (entry.size > this.maxMetaEntrySize) { entry.ignore = true this[EMIT]('ignoredEntry', entry) this[STATE] = 'ignore' entry.resume() } else if (entry.size > 0) { this[META] = '' entry.on('data', c => (this[META] += c)) this[STATE] = 'meta' } } else { this[EX] = undefined entry.ignore = entry.ignore || !this.filter(entry.path, entry) if (entry.ignore) { // probably valid, just not something we care about this[EMIT]('ignoredEntry', entry) this[STATE] = entry.remain ? 'ignore' : 'header' entry.resume() } else { if (entry.remain) { this[STATE] = 'body' } else { this[STATE] = 'header' entry.end() } if (!this[READENTRY]) { this[QUEUE].push(entry) this[NEXTENTRY]() } else { this[QUEUE].push(entry) } } } } } } } [CLOSESTREAM]() { queueMicrotask(() => this.emit('close')) } [PROCESSENTRY](entry?: ReadEntry | [string | symbol, unknown, unknown]) { let go = true if (!entry) { this[READENTRY] = undefined go = false } else if (Array.isArray(entry)) { const [ev, ...args]: [string | symbol, unknown, unknown] = entry this.emit(ev, ...args) } else { this[READENTRY] = entry this.emit('entry', entry) if (!entry.emittedEnd) { entry.on('end', () => this[NEXTENTRY]()) go = false } } return go } [NEXTENTRY]() { do {} while (this[PROCESSENTRY](this[QUEUE].shift())) if (this[QUEUE].length === 0) { // At this point, there's nothing in the queue, but we may have an // entry which is being consumed (readEntry). // If we don't, then we definitely can handle more data. // If we do, and either it's flowing, or it has never had any data // written to it, then it needs more. // The only other possibility is that it has returned false from a // write() call, so we wait for the next drain to continue. const re = this[READENTRY] const drainNow = !re || re.flowing || re.size === re.remain if (drainNow) { if (!this[WRITING]) { this.emit('drain') } } else { re.once('drain', () => this.emit('drain')) } } } [CONSUMEBODY](chunk: Buffer, position: number) { // write up to but no more than writeEntry.blockRemain const entry = this[WRITEENTRY] /* c8 ignore start */ if (!entry) { throw new Error('attempt to consume body without entry??') } const br = entry.blockRemain ?? 0 /* c8 ignore stop */ const c = br >= chunk.length && position === 0 ? chunk : chunk.subarray(position, position + br) entry.write(c) if (!entry.blockRemain) { this[STATE] = 'header' this[WRITEENTRY] = undefined entry.end() } return c.length } [CONSUMEMETA](chunk: Buffer, position: number) { const entry = this[WRITEENTRY] const ret = this[CONSUMEBODY](chunk, position) // if we finished, then the entry is reset if (!this[WRITEENTRY] && entry) { this[EMITMETA](entry) } return ret } [EMIT](ev: string | symbol, data?: unknown, extra?: unknown) { if (this[QUEUE].length === 0 && !this[READENTRY]) { this.emit(ev, data, extra) } else { this[QUEUE].push([ev, data, extra]) } } [EMITMETA](entry: ReadEntry) { this[EMIT]('meta', this[META]) switch (entry.type) { case 'ExtendedHeader': case 'OldExtendedHeader': this[EX] = Pax.parse(this[META], this[EX], false) break case 'GlobalExtendedHeader': this[GEX] = Pax.parse(this[META], this[GEX], true) break case 'NextFileHasLongPath': case 'OldGnuLongPath': { const ex: Pax = this[EX] ?? Object.create(null) this[EX] = ex ex.path = this[META].replace(/\0.*/, '') break } case 'NextFileHasLongLinkpath': { const ex: Pax = this[EX] || Object.create(null) this[EX] = ex ex.linkpath = this[META].replace(/\0.*/, '') break } /* c8 ignore start */ default: throw new Error('unknown meta: ' + entry.type) /* c8 ignore stop */ } } abort(error: Error) { if (this[ABORTED]) { return } if (this[UNZIP]) { // fully nerf the decompressor and close its underlying binding const u = this[UNZIP] /* c8 ignore start */ u.write = () => true u.end = () => u u.emit = () => false /* c8 ignore stop */ u.destroy?.() } this[ABORTED] = true this.emit('abort', error) // always throws, even in non-strict mode this.warn('TAR_ABORT', error, { recoverable: false }) } [CHECKDECOMPRESSIONRATIO](chunk: Buffer) { this[DECOMPRESSEDBYTESREAD] += chunk.length const ratio = this[DECOMPRESSEDBYTESREAD] / this[COMPRESSEDBYTESREAD] if (ratio > this.maxDecompressionRatio) { this.abort( new Error( `max decompression ratio exceeded: ${ratio.toFixed(2)} > ${ this.maxDecompressionRatio }`, ), ) return false } return true } write( buffer: Uint8Array | string, cb?: (err?: Error | null) => void, ): boolean write( str: string, encoding?: BufferEncoding, cb?: (err?: Error | null) => void, ): boolean write( chunk: Buffer | string, encoding?: BufferEncoding | (() => unknown), cb?: () => unknown, ): boolean { if (typeof encoding === 'function') { cb = encoding encoding = undefined } if (typeof chunk === 'string') { chunk = Buffer.from( chunk, /* c8 ignore next */ typeof encoding === 'string' ? encoding : 'utf8', ) } if (this[ABORTED]) { /* c8 ignore next */ cb?.() return false } // first write, might be gzipped, zstd, or brotli compressed const needSniff = this[UNZIP] === undefined || (this.brotli === undefined && this[UNZIP] === false) if (needSniff && chunk) { if (this[BUFFER]) { chunk = Buffer.concat([this[BUFFER], chunk]) this[BUFFER] = undefined } if (chunk.length < ZIP_HEADER_LEN) { this[BUFFER] = chunk /* c8 ignore next */ cb?.() return true } // look for gzip header for ( let i = 0; this[UNZIP] === undefined && i < gzipHeader.length; i++ ) { if (chunk[i] !== gzipHeader[i]) { this[UNZIP] = false } } // look for zstd header if gzip header not found let isZstd = false if (this[UNZIP] === false && this.zstd !== false) { isZstd = true for (let i = 0; i < zstdHeader.length; i++) { if (chunk[i] !== zstdHeader[i]) { isZstd = false break } } } const maybeBrotli = this.brotli === undefined && !isZstd if (this[UNZIP] === false && maybeBrotli) { // read the first header to see if it's a valid tar file. If so, // we can safely assume that it's not actually brotli, despite the // .tbr or .tar.br file extension. // if we ended before getting a full chunk, yes, def brotli if (chunk.length < 512) { if (this[ENDED]) { this.brotli = true } else { this[BUFFER] = chunk /* c8 ignore next */ cb?.() return true } } else { // if it's tar, it's pretty reliably not brotli, chances of // that happening are astronomical. try { new Header(chunk.subarray(0, 512)) this.brotli = false } catch (_) { this.brotli = true } } } if ( this[UNZIP] === undefined || (this[UNZIP] === false && (this.brotli || isZstd)) ) { const ended = this[ENDED] this[ENDED] = false this[UNZIP] = this[UNZIP] === undefined ? new Unzip({}) : isZstd ? new ZstdDecompress({}) : new BrotliDecompress({}) this[UNZIP].on('data', chunk => { if (this[CHECKDECOMPRESSIONRATIO](chunk)) { this[CONSUMECHUNK](chunk) } }) this[UNZIP].on('error', er => { if (!this[ABORTED]) { this.abort(er as Error) } }) this[UNZIP].on('end', () => { this[ENDED] = true this[CONSUMECHUNK]() }) this[WRITING] = true this[COMPRESSEDBYTESREAD] += chunk.length const ret = !!this[UNZIP][ended ? 'end' : 'write'](chunk) this[WRITING] = false cb?.() return ret } } this[WRITING] = true if (this[UNZIP]) { this[COMPRESSEDBYTESREAD] += chunk.length this[UNZIP].write(chunk) } else { this[CONSUMECHUNK](chunk) } this[WRITING] = false // return false if there's a queue, or if the current entry isn't flowing const ret = this[QUEUE].length > 0 ? false : this[READENTRY] ? this[READENTRY].flowing : true // if we have no queue, then that means a clogged READENTRY if (!ret && this[QUEUE].length === 0) { this[READENTRY]?.once('drain', () => this.emit('drain')) } /* c8 ignore next */ cb?.() return ret } [BUFFERCONCAT](c: Buffer) { if (c && !this[ABORTED]) { this[BUFFER] = this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c } } [MAYBEEND]() { if ( this[ENDED] && !this[EMITTEDEND] && !this[ABORTED] && !this[CONSUMING] ) { this[EMITTEDEND] = true const entry = this[WRITEENTRY] if (entry?.blockRemain) { // truncated, likely a damaged file const have = this[BUFFER] ? this[BUFFER].length : 0 this.warn( 'TAR_BAD_ARCHIVE', `Truncated input (needed ${entry.blockRemain} more bytes, only ${have} available)`, { entry }, ) if (this[BUFFER]) { entry.write(this[BUFFER]) } entry.end() } this[EMIT](DONE) } } [CONSUMECHUNK](chunk?: Buffer) { if (this[CONSUMING] && chunk) { this[BUFFERCONCAT](chunk) } else if (!chunk && !this[BUFFER]) { this[MAYBEEND]() } else if (chunk) { this[CONSUMING] = true if (this[BUFFER]) { this[BUFFERCONCAT](chunk) const c = this[BUFFER] this[BUFFER] = undefined this[CONSUMECHUNKSUB](c) } else { this[CONSUMECHUNKSUB](chunk) } while ( this[BUFFER] && (this[BUFFER] as Buffer)?.length >= 512 && !this[ABORTED] && !this[SAW_EOF] ) { const c = this[BUFFER] this[BUFFER] = undefined this[CONSUMECHUNKSUB](c) } this[CONSUMING] = false } if (!this[BUFFER] || this[ENDED]) { this[MAYBEEND]() } } [CONSUMECHUNKSUB](chunk: Buffer) { // we know that we are in CONSUMING mode, so anything written goes into // the buffer. Advance the position and put any remainder in the buffer. let position = 0 const length = chunk.length while (position + 512 <= length && !this[ABORTED] && !this[SAW_EOF]) { switch (this[STATE]) { case 'begin': case 'header': this[CONSUMEHEADER](chunk, position) position += 512 break case 'ignore': case 'body': position += this[CONSUMEBODY](chunk, position) break case 'meta': position += this[CONSUMEMETA](chunk, position) break /* c8 ignore start */ default: throw new Error('invalid state: ' + this[STATE]) /* c8 ignore stop */ } } if (position < length) { this[BUFFER] = this[BUFFER] ? Buffer.concat([chunk.subarray(position), this[BUFFER]]) : chunk.subarray(position) } } end(cb?: () => void): this end(data: string | Buffer, cb?: () => void): this end(str: string, encoding?: BufferEncoding, cb?: () => void): this end( chunk?: string | Buffer | (() => void), encoding?: BufferEncoding | (() => void), cb?: () => void, ) { if (typeof chunk === 'function') { cb = chunk encoding = undefined chunk = undefined } if (typeof encoding === 'function') { cb = encoding encoding = undefined } if (typeof chunk === 'string') { chunk = Buffer.from(chunk, encoding) } if (cb) this.once('finish', cb) if (!this[ABORTED]) { if (this[UNZIP]) { /* c8 ignore start */ if (chunk) { this[COMPRESSEDBYTESREAD] += chunk.length this[UNZIP].write(chunk) } /* c8 ignore stop */ this[UNZIP].end() } else { this[ENDED] = true if (this.brotli === undefined || this.zstd === undefined) chunk = chunk || Buffer.alloc(0) if (chunk) this.write(chunk) this[MAYBEEND]() } } return this } } isaacs-node-tar-8a4b548/src/path-reservations.ts000066400000000000000000000116211523070444600216500ustar00rootroot00000000000000// A path exclusive reservation system // reserve([list, of, paths], fn) // When the fn is first in line for all its paths, it // is called with a cb that clears the reservation. // // Used by async unpack to avoid clobbering paths in use, // while still allowing maximal safe parallelization. import { join } from 'node:path' import { normalizeUnicode } from './normalize-unicode.js' import { stripTrailingSlashes } from './strip-trailing-slashes.js' const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform const isWindows = platform === 'win32' export type Reservation = { paths: string[] dirs: Set } export type Handler = (clear: () => void) => void // return a set of parent dirs for a given path // '/a/b/c/d' -> ['/', '/a', '/a/b', '/a/b/c', '/a/b/c/d'] const getDirs = (path: string) => { const dirs = path .split('/') .slice(0, -1) .reduce((set: string[], path) => { const s = set.at(-1) if (s !== undefined) { path = join(s, path) } set.push(path || '/') return set }, []) return dirs } export class PathReservations { // path => [function or Set] // A Set object means a directory reservation // A fn is a direct reservation on that path #queues = new Map)[]>() // fn => {paths:[path,...], dirs:[path, ...]} #reservations = new Map() // functions currently running #running = new Set() reserve(paths: string[], fn: Handler) { paths = isWindows ? ['win32 parallelization disabled'] : paths.map(p => { // don't need normPath, because we skip this entirely for windows return stripTrailingSlashes(join(normalizeUnicode(p))) }) const dirs = new Set( paths.map(path => getDirs(path)).reduce((a, b) => a.concat(b)), ) this.#reservations.set(fn, { dirs, paths }) for (const p of paths) { const q = this.#queues.get(p) if (!q) { this.#queues.set(p, [fn]) } else { q.push(fn) } } for (const dir of dirs) { const q = this.#queues.get(dir) if (!q) { this.#queues.set(dir, [new Set([fn])]) } else { const l = q.at(-1) if (l instanceof Set) { l.add(fn) } else { q.push(new Set([fn])) } } } return this.#run(fn) } // return the queues for each path the function cares about // fn => {paths, dirs} #getQueues(fn: Handler): { paths: Handler[][] dirs: (Handler | Set)[][] } { const res = this.#reservations.get(fn) /* c8 ignore start */ if (!res) { throw new Error('function does not have any path reservations') } /* c8 ignore stop */ return { paths: res.paths.map((path: string) => this.#queues.get(path), ) as Handler[][], dirs: [...res.dirs].map(path => this.#queues.get(path)) as ( | Handler | Set )[][], } } // check if fn is first in line for all its paths, and is // included in the first set for all its dir queues check(fn: Handler) { const { paths, dirs } = this.#getQueues(fn) return ( paths.every(q => q && q[0] === fn) && dirs.every(q => q && q[0] instanceof Set && q[0].has(fn)) ) } // run the function if it's first in line and not already running #run(fn: Handler) { if (this.#running.has(fn) || !this.check(fn)) { return false } this.#running.add(fn) fn(() => this.#clear(fn)) return true } #clear(fn: Handler) { if (!this.#running.has(fn)) { return false } const res = this.#reservations.get(fn) /* c8 ignore start */ if (!res) { throw new Error('invalid reservation') } /* c8 ignore stop */ const { paths, dirs } = res const next = new Set() for (const path of paths) { const q = this.#queues.get(path) /* c8 ignore start */ if (!q || q?.[0] !== fn) { continue } /* c8 ignore stop */ const q0 = q[1] if (!q0) { this.#queues.delete(path) continue } q.shift() if (typeof q0 === 'function') { next.add(q0) } else { for (const f of q0) { next.add(f) } } } for (const dir of dirs) { const q = this.#queues.get(dir) const q0 = q?.[0] /* c8 ignore next - type safety only */ if (!q || !(q0 instanceof Set)) continue if (q0.size === 1 && q.length === 1) { this.#queues.delete(dir) continue } else if (q0.size === 1) { q.shift() // next one must be a function, // or else the Set would've been reused const n = q[0] if (typeof n === 'function') { next.add(n) } } else { q0.delete(fn) } } this.#running.delete(fn) next.forEach(fn => this.#run(fn)) return true } } isaacs-node-tar-8a4b548/src/pax.ts000066400000000000000000000113641523070444600167660ustar00rootroot00000000000000import { basename } from 'node:path' import type { HeaderData } from './header.js' import { Header } from './header.js' export class Pax implements HeaderData { atime?: Date mtime?: Date ctime?: Date charset?: string comment?: string gid?: number uid?: number gname?: string uname?: string linkpath?: string dev?: number ino?: number nlink?: number path?: string size?: number mode?: number global: boolean constructor(obj: HeaderData, global: boolean = false) { this.atime = obj.atime this.charset = obj.charset this.comment = obj.comment this.ctime = obj.ctime this.dev = obj.dev this.gid = obj.gid this.global = global this.gname = obj.gname this.ino = obj.ino this.linkpath = obj.linkpath this.mtime = obj.mtime this.nlink = obj.nlink this.path = obj.path this.size = obj.size this.uid = obj.uid this.uname = obj.uname } encode() { const body = this.encodeBody() if (body === '') { return Buffer.allocUnsafe(0) } const bodyLen = Buffer.byteLength(body) // round up to 512 bytes // add 512 for header const bufLen = 512 * Math.ceil(1 + bodyLen / 512) const buf = Buffer.allocUnsafe(bufLen) // 0-fill the header section, it might not hit every field for (let i = 0; i < 512; i++) { buf[i] = 0 } new Header({ // XXX split the path // then the path should be PaxHeader + basename, but less than 99, // prepend with the dirname /* c8 ignore start */ path: ('PaxHeader/' + basename(this.path ?? '')).slice(0, 99), /* c8 ignore stop */ mode: this.mode || 0o644, uid: this.uid, gid: this.gid, size: bodyLen, mtime: this.mtime, type: this.global ? 'GlobalExtendedHeader' : 'ExtendedHeader', linkpath: '', uname: this.uname || '', gname: this.gname || '', devmaj: 0, devmin: 0, atime: this.atime, ctime: this.ctime, }).encode(buf) buf.write(body, 512, bodyLen, 'utf8') // null pad after the body for (let i = bodyLen + 512; i < buf.length; i++) { buf[i] = 0 } return buf } encodeBody() { return ( this.encodeField('path') + this.encodeField('ctime') + this.encodeField('atime') + this.encodeField('dev') + this.encodeField('ino') + this.encodeField('nlink') + this.encodeField('charset') + this.encodeField('comment') + this.encodeField('gid') + this.encodeField('gname') + this.encodeField('linkpath') + this.encodeField('mtime') + this.encodeField('size') + this.encodeField('uid') + this.encodeField('uname') ) } encodeField(field: keyof Pax): string { if (this[field] === undefined) { return '' } const r = this[field] const v = r instanceof Date ? r.getTime() / 1000 : r const s = ' ' + (field === 'dev' || field === 'ino' || field === 'nlink' ? 'SCHILY.' : '') + field + '=' + v + '\n' const byteLen = Buffer.byteLength(s) // the digits includes the length of the digits in ascii base-10 // so if it's 9 characters, then adding 1 for the 9 makes it 10 // which makes it 11 chars. let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1 if (byteLen + digits >= Math.pow(10, digits)) { digits += 1 } const len = digits + byteLen return len + s } static parse(str: string, ex?: HeaderData, g: boolean = false) { return new Pax(merge(parseKV(str), ex), g) } } const merge = (a: HeaderData, b?: HeaderData) => b ? Object.assign({}, b, a) : a const parseKV = (str: string) => str .replace(/\n$/, '') .split('\n') .reduce(parseKVLine, Object.create(null)) const parseKVLine = ( set: Record, line: string, ) => { const n = parseInt(line, 10) // XXX Values with \n in them will fail this. // Refactor to not be a naive line-by-line parse. if (n !== Buffer.byteLength(line) + 1) { return set } line = line.slice((n + ' ').length) const kv = line.split('=') const r = kv.shift() if (!r) { return set } const k = r.replace(/^SCHILY\.(dev|ino|nlink)/, '$1') const v = kv.join('=').replace(/\0.*/, '') switch (k) { case 'path': case 'linkpath': case 'type': case 'charset': case 'comment': case 'gname': case 'uname': set[k] = v break case 'ctime': case 'atime': case 'mtime': set[k] = new Date(Number(v) * 1000) break case 'size': const s = +v if (s >= 0) set[k] = s break case 'gid': case 'uid': case 'dev': case 'ino': case 'nlink': case 'mode': set[k] = +v break } return set } isaacs-node-tar-8a4b548/src/process-umask.ts000066400000000000000000000001621523070444600207640ustar00rootroot00000000000000// separate file so I stop getting nagged in vim about deprecated API. export const umask = () => process.umask() isaacs-node-tar-8a4b548/src/read-entry.ts000066400000000000000000000075551523070444600202570ustar00rootroot00000000000000import { Minipass } from 'minipass' import type { Header } from './header.js' import { normalizeWindowsPath } from './normalize-windows-path.js' import type { Pax } from './pax.js' import type { EntryTypeName } from './types.js' export class ReadEntry extends Minipass { extended?: Pax globalExtended?: Pax header: Header startBlockSize: number blockRemain: number remain: number type: EntryTypeName meta: boolean = false ignore: boolean = false path: string mode?: number uid?: number gid?: number uname?: string gname?: string size: number = 0 mtime?: Date atime?: Date ctime?: Date linkpath?: string dev?: number ino?: number nlink?: number invalid: boolean = false absolute?: string unsupported: boolean = false constructor(header: Header, ex?: Pax, gex?: Pax) { super({}) // read entries always start life paused. this is to avoid the // situation where Minipass's auto-ending empty streams results // in an entry ending before we're ready for it. this.pause() this.extended = ex this.globalExtended = gex this.header = header /* c8 ignore start */ this.remain = header.size ?? 0 /* c8 ignore stop */ this.startBlockSize = 512 * Math.ceil(this.remain / 512) this.blockRemain = this.startBlockSize this.type = header.type switch (this.type) { case 'File': case 'OldFile': case 'Link': case 'SymbolicLink': case 'CharacterDevice': case 'BlockDevice': case 'Directory': case 'FIFO': case 'ContiguousFile': case 'GNUDumpDir': break case 'NextFileHasLongLinkpath': case 'NextFileHasLongPath': case 'OldGnuLongPath': case 'GlobalExtendedHeader': case 'ExtendedHeader': case 'OldExtendedHeader': this.meta = true break // NOTE: gnutar and bsdtar treat unrecognized types as 'File' // it may be worth doing the same, but with a warning. default: this.ignore = true } /* c8 ignore start */ if (!header.path) { throw new Error('no path provided for tar.ReadEntry') } /* c8 ignore stop */ this.path = normalizeWindowsPath(header.path) as string this.mode = header.mode if (this.mode) { this.mode = this.mode & 0o7777 } this.uid = header.uid this.gid = header.gid this.uname = header.uname this.gname = header.gname this.size = this.remain this.mtime = header.mtime this.atime = header.atime this.ctime = header.ctime /* c8 ignore start */ this.linkpath = header.linkpath ? normalizeWindowsPath(header.linkpath) : undefined /* c8 ignore stop */ this.uname = header.uname this.gname = header.gname if (ex) { this.#slurp(ex) } if (gex) { this.#slurp(gex, true) } } write(data: Buffer) { const writeLen = data.length if (writeLen > this.blockRemain) { throw new Error('writing more to entry than is appropriate') } const r = this.remain const br = this.blockRemain this.remain = Math.max(0, r - writeLen) this.blockRemain = Math.max(0, br - writeLen) if (this.ignore) { return true } if (r >= writeLen) { return super.write(data) } // r < writeLen return super.write(data.subarray(0, r)) } #slurp(ex: Pax, gex: boolean = false) { if (ex.path) ex.path = normalizeWindowsPath(ex.path) if (ex.linkpath) ex.linkpath = normalizeWindowsPath(ex.linkpath) Object.assign( this, Object.fromEntries( Object.entries(ex).filter(([k, v]) => { // we slurp in everything except for the path attribute in // a global extended header, because that's weird. Also, any // null/undefined values are ignored. return !(v === null || v === undefined || (k === 'path' && gex)) }), ), ) } } isaacs-node-tar-8a4b548/src/replace.ts000066400000000000000000000150331523070444600176060ustar00rootroot00000000000000// tar -r import { WriteStream, WriteStreamSync } from '@isaacs/fs-minipass' import type { Minipass } from 'minipass' import fs from 'node:fs' import path from 'node:path' import { Header } from './header.js' import { list } from './list.js' import { makeCommand } from './make-command.js' import type { TarOptionsFile, TarOptionsSyncFile } from './options.js' import { isFile } from './options.js' import { Pack, PackSync } from './pack.js' // starting at the head of the file, read a Header // If the checksum is invalid, that's our position to start writing // If it is, jump forward by the specified size (round up to 512) // and try again. // Write the new Pack stream starting there. const replaceSync = (opt: TarOptionsSyncFile, files: string[]) => { const p = new PackSync(opt) let threw = true let fd let position try { try { fd = fs.openSync(opt.file, 'r+') } catch (er) { if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') { fd = fs.openSync(opt.file, 'w+') } else { throw er } } const st = fs.fstatSync(fd) const headBuf = Buffer.alloc(512) POSITION: for (position = 0; position < st.size; position += 512) { for (let bufPos = 0, bytes = 0; bufPos < 512; bufPos += bytes) { bytes = fs.readSync( fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos, ) if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b) { throw new Error('cannot append to compressed archives') } if (!bytes) { break POSITION } } const h = new Header(headBuf) if (!h.cksumValid) { break } const entryBlockSize = 512 * Math.ceil((h.size || 0) / 512) if (position + entryBlockSize + 512 > st.size) { break } // the 512 for the header we just parsed will be added as well // also jump ahead all the blocks for the body position += entryBlockSize if (opt.mtimeCache && h.mtime) { opt.mtimeCache.set(String(h.path), h.mtime) } } threw = false streamSync(opt, p, position, fd, files) } finally { if (threw) { try { fs.closeSync(fd as number) } catch {} } } } const streamSync = ( opt: TarOptionsSyncFile, p: Pack, position: number, fd: number, files: string[], ) => { const stream = new WriteStreamSync(opt.file, { fd: fd, start: position, }) p.pipe(stream as unknown as Minipass.Writable) addFilesSync(p, files) } const replaceAsync = ( opt: TarOptionsFile, files: string[], ): Promise => { files = Array.from(files) const p = new Pack(opt) const getPos = ( fd: number, size: number, cb_: (er?: null | Error, pos?: number) => void, ) => { const cb = (er?: Error | null, pos?: number) => { if (er) { fs.close(fd, _ => cb_(er)) } else { cb_(null, pos) } } let position = 0 if (size === 0) { return cb(null, 0) } let bufPos = 0 const headBuf = Buffer.alloc(512) const onread = (er?: null | Error, bytes?: number): void => { if (er || bytes === undefined) { return cb(er) } bufPos += bytes if (bufPos < 512 && bytes) { return fs.read( fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos, onread, ) } if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b) { return cb(new Error('cannot append to compressed archives')) } // truncated header if (bufPos < 512) { return cb(null, position) } const h = new Header(headBuf) if (!h.cksumValid) { return cb(null, position) } /* c8 ignore next */ const entryBlockSize = 512 * Math.ceil((h.size ?? 0) / 512) if (position + entryBlockSize + 512 > size) { return cb(null, position) } position += entryBlockSize + 512 if (position >= size) { return cb(null, position) } if (opt.mtimeCache && h.mtime) { opt.mtimeCache.set(String(h.path), h.mtime) } bufPos = 0 fs.read(fd, headBuf, 0, 512, position, onread) } fs.read(fd, headBuf, 0, 512, position, onread) } const promise = new Promise((resolve, reject) => { p.on('error', reject) let flag = 'r+' const onopen = (er?: NodeJS.ErrnoException | null, fd?: number) => { if (er && er.code === 'ENOENT' && flag === 'r+') { flag = 'w+' return fs.open(opt.file, flag, onopen) } if (er || !fd) { return reject(er) } fs.fstat(fd, (er, st) => { if (er) { return fs.close(fd, () => reject(er)) } getPos(fd, st.size, (er, position) => { if (er) { return reject(er) } const stream = new WriteStream(opt.file, { fd: fd, start: position, }) p.pipe(stream as unknown as Minipass.Writable) stream.on('error', reject) stream.on('close', resolve) addFilesAsync(p, files) }) }) } fs.open(opt.file, flag, onopen) }) return promise } const addFilesSync = (p: Pack, files: string[]) => { files.forEach(file => { if (file.charAt(0) === '@') { list({ file: path.resolve(p.cwd, file.slice(1)), sync: true, noResume: true, onReadEntry: entry => p.add(entry), }) } else { p.add(file) } }) p.end() } const addFilesAsync = async (p: Pack, files: string[]): Promise => { for (const file of files) { if (file.charAt(0) === '@') { await list({ file: path.resolve(String(p.cwd), file.slice(1)), noResume: true, onReadEntry: entry => p.add(entry), }) } else { p.add(file) } } p.end() } export const replace = makeCommand( replaceSync, replaceAsync, /* c8 ignore start */ (): never => { throw new TypeError('file is required') }, (): never => { throw new TypeError('file is required') }, /* c8 ignore stop */ (opt, entries) => { if (!isFile(opt)) { throw new TypeError('file is required') } if ( opt.gzip || opt.brotli || opt.zstd || opt.file.endsWith('.br') || opt.file.endsWith('.tbr') ) { throw new TypeError('cannot append to compressed archives') } if (!entries?.length) { throw new TypeError('no paths specified to add/replace') } }, ) isaacs-node-tar-8a4b548/src/strip-absolute-path.ts000066400000000000000000000017411523070444600221030ustar00rootroot00000000000000// unix absolute paths are also absolute on win32, so we use this for both import { win32 } from 'node:path' const { isAbsolute, parse } = win32 // returns [root, stripped] // Note that windows will think that //x/y/z/a has a "root" of //x/y, and in // those cases, we want to sanitize it to x/y/z/a, not z/a, so we strip / // explicitly if it's the first character. // drive-specific relative paths on Windows get their root stripped off even // though they are not absolute, so `c:../foo` becomes ['c:', '../foo'] export const stripAbsolutePath = (path: string): [string, string] => { let r = '' let parsed = parse(path) while (isAbsolute(path) || parsed.root) { // windows will think that //x/y/z has a "root" of //x/y/ // but strip the //?/C:/ off of //?/C:/path const root = path.charAt(0) === '/' && path.slice(0, 4) !== '//?/' ? '/' : parsed.root path = path.slice(root.length) r += root parsed = parse(path) } return [r, path] } isaacs-node-tar-8a4b548/src/strip-trailing-slashes.ts000066400000000000000000000006471523070444600226100ustar00rootroot00000000000000// warning: extremely hot code path. // This has been meticulously optimized for use // within npm install on large package trees. // Do not edit without careful benchmarking. export const stripTrailingSlashes = (str: string) => { let i = str.length - 1 let slashesStart = -1 while (i > -1 && str.charAt(i) === '/') { slashesStart = i i-- } return slashesStart === -1 ? str : str.slice(0, slashesStart) } isaacs-node-tar-8a4b548/src/symlink-error.ts000066400000000000000000000005471523070444600210140ustar00rootroot00000000000000export class SymlinkError extends Error { path: string symlink: string syscall = 'symlink' as const code = 'TAR_SYMLINK_ERROR' as const constructor(symlink: string, path: string) { super('TAR_SYMLINK_ERROR: Cannot extract through symbolic link') this.symlink = symlink this.path = path } get name() { return 'SymlinkError' } } isaacs-node-tar-8a4b548/src/types.ts000066400000000000000000000044711523070444600173430ustar00rootroot00000000000000export const isCode = (c: string): c is EntryTypeCode => name.has(c as EntryTypeCode) export const isName = (c: string): c is EntryTypeName => code.has(c as EntryTypeName) export type EntryTypeCode = | '0' | '' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | 'g' | 'x' | 'A' | 'D' | 'I' | 'K' | 'L' | 'M' | 'N' | 'S' | 'V' | 'X' export type EntryTypeName = | 'File' | 'OldFile' | 'Link' | 'SymbolicLink' | 'CharacterDevice' | 'BlockDevice' | 'Directory' | 'FIFO' | 'ContiguousFile' | 'GlobalExtendedHeader' | 'ExtendedHeader' | 'SolarisACL' | 'GNUDumpDir' | 'Inode' | 'NextFileHasLongLinkpath' | 'NextFileHasLongPath' | 'ContinuationFile' | 'OldGnuLongPath' | 'SparseFile' | 'TapeVolumeHeader' | 'OldExtendedHeader' | 'Unsupported' /** * types that are a normal file system entry, not metadata. * * These can be the subject of extended/globalExtended headers, long path * names, long linkpath names, etc. * * Any other types are meta, and cannot be targetted by extended PAX headers. */ export const normalFsTypes = new Set([ '0', '', '1', '2', '3', '4', '5', '6', '7', 'D', ]) // map types from key to human-friendly name export const name = new Map([ ['0', 'File'], // same as File ['', 'OldFile'], ['1', 'Link'], ['2', 'SymbolicLink'], // Devices and FIFOs aren't fully supported // they are parsed, but skipped when unpacking ['3', 'CharacterDevice'], ['4', 'BlockDevice'], ['5', 'Directory'], ['6', 'FIFO'], // same as File ['7', 'ContiguousFile'], // pax headers ['g', 'GlobalExtendedHeader'], ['x', 'ExtendedHeader'], // vendor-specific stuff // skip ['A', 'SolarisACL'], // like 5, but with data, which should be skipped ['D', 'GNUDumpDir'], // metadata only, skip ['I', 'Inode'], // data = link path of next file ['K', 'NextFileHasLongLinkpath'], // data = path of next file ['L', 'NextFileHasLongPath'], // skip ['M', 'ContinuationFile'], // like L ['N', 'OldGnuLongPath'], // skip ['S', 'SparseFile'], // skip ['V', 'TapeVolumeHeader'], // like x ['X', 'OldExtendedHeader'], ]) // map the other direction export const code = new Map( Array.from(name).map(kv => [kv[1], kv[0]]), ) isaacs-node-tar-8a4b548/src/unpack.ts000066400000000000000000000743131523070444600174620ustar00rootroot00000000000000// the PEND/UNPEND stuff tracks whether we're ready to emit end/close yet. // but the path reservations are required to avoid race conditions where // parallelized unpack ops may mess with one another, due to dependencies // (like a Link depending on its target) or destructive operations (like // clobbering an fs object to create one of a different type.) import * as fsm from '@isaacs/fs-minipass' import assert from 'node:assert' import { randomBytes } from 'node:crypto' import fs, { type Stats } from 'node:fs' import path from 'node:path' import { getWriteFlag } from './get-write-flag.js' import type { MkdirError } from './mkdir.js' import { mkdir, mkdirSync } from './mkdir.js' import { normalizeWindowsPath } from './normalize-windows-path.js' import { Parser } from './parse.js' import { stripAbsolutePath } from './strip-absolute-path.js' import * as wc from './winchars.js' import type { TarOptions } from './options.js' import { PathReservations } from './path-reservations.js' import type { ReadEntry } from './read-entry.js' import type { WarnData } from './warn-method.js' import { SymlinkError } from './symlink-error.js' import { umask } from './process-umask.js' const ONENTRY = Symbol('onEntry') const CHECKFS = Symbol('checkFs') const CHECKFS2 = Symbol('checkFs2') const ISREUSABLE = Symbol('isReusable') const MAKEFS = Symbol('makeFs') const FILE = Symbol('file') const DIRECTORY = Symbol('directory') const LINK = Symbol('link') const SYMLINK = Symbol('symlink') const HARDLINK = Symbol('hardlink') const ENSURE_NO_SYMLINK = Symbol('ensureNoSymlink') const UNSUPPORTED = Symbol('unsupported') const CHECKPATH = Symbol('checkPath') const STRIPABSOLUTEPATH = Symbol('stripAbsolutePath') const MKDIR = Symbol('mkdir') const ONERROR = Symbol('onError') const PENDING = Symbol('pending') const PEND = Symbol('pend') const UNPEND = Symbol('unpend') const ENDED = Symbol('ended') const MAYBECLOSE = Symbol('maybeClose') const SKIP = Symbol('skip') const DOCHOWN = Symbol('doChown') const UID = Symbol('uid') const GID = Symbol('gid') const CHECKED_CWD = Symbol('checkedCwd') const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform const isWindows = platform === 'win32' const DEFAULT_MAX_DEPTH = 1024 // Unlinks on Windows are not atomic. // // This means that if you have a file entry, followed by another // file entry with an identical name, and you cannot re-use the file // (because it's a hardlink, or because unlink:true is set, or it's // Windows, which does not have useful nlink values), then the unlink // will be committed to the disk AFTER the new file has been written // over the old one, deleting the new file. // // To work around this, on Windows systems, we rename the file and then // delete the renamed file. It's a sloppy kludge, but frankly, I do not // know of a better way to do this, given windows' non-atomic unlink // semantics. // // See: https://github.com/npm/node-tar/issues/183 /* c8 ignore start */ const unlinkFile = (path: string, cb: (er?: Error | null) => void) => { if (!isWindows) { return fs.unlink(path, cb) } const name = path + '.DELETE.' + randomBytes(16).toString('hex') fs.rename(path, name, er => { if (er) { return cb(er) } fs.unlink(name, cb) }) } /* c8 ignore stop */ /* c8 ignore start */ const unlinkFileSync = (path: string) => { if (!isWindows) { return fs.unlinkSync(path) } const name = path + '.DELETE.' + randomBytes(16).toString('hex') fs.renameSync(path, name) fs.unlinkSync(name) } /* c8 ignore stop */ // this.gid, entry.gid, this.processUid const uint32 = ( a: number | undefined, b: number | undefined, c: number | undefined, ) => a !== undefined && a === a >>> 0 ? a : b !== undefined && b === b >>> 0 ? b : c export class Unpack extends Parser { [ENDED]: boolean = false; [CHECKED_CWD]: boolean = false; [PENDING]: number = 0 reservations: PathReservations = new PathReservations() transform?: TarOptions['transform'] writable: true = true readable: false = false uid?: number gid?: number setOwner: boolean preserveOwner: boolean processGid?: number processUid?: number maxDepth: number forceChown: boolean win32: boolean newer: boolean keep: boolean noMtime: boolean preservePaths: boolean unlink: boolean cwd: string strip: number processUmask: number umask: number dmode: number fmode: number chmod: boolean constructor(opt: TarOptions = {}) { opt.ondone = () => { this[ENDED] = true this[MAYBECLOSE]() } super(opt) this.transform = opt.transform this.chmod = !!opt.chmod if (typeof opt.uid === 'number' || typeof opt.gid === 'number') { // need both or neither if (typeof opt.uid !== 'number' || typeof opt.gid !== 'number') { throw new TypeError('cannot set owner without number uid and gid') } if (opt.preserveOwner) { throw new TypeError( 'cannot preserve owner in archive and also set owner explicitly', ) } this.uid = opt.uid this.gid = opt.gid this.setOwner = true } else { this.uid = undefined this.gid = undefined this.setOwner = false } // default true for root this.preserveOwner = opt.preserveOwner === undefined && typeof opt.uid !== 'number' ? !!(process.getuid?.() === 0) : !!opt.preserveOwner this.processUid = (this.preserveOwner || this.setOwner) && process.getuid ? process.getuid() : undefined this.processGid = (this.preserveOwner || this.setOwner) && process.getgid ? process.getgid() : undefined // prevent excessively deep nesting of subfolders // set to `Infinity` to remove this restriction this.maxDepth = typeof opt.maxDepth === 'number' ? opt.maxDepth : DEFAULT_MAX_DEPTH // mostly just for testing, but useful in some cases. // Forcibly trigger a chown on every entry, no matter what this.forceChown = opt.forceChown === true // turn > this[ONENTRY](entry)) } // a bad or damaged archive is a warning for Parser, but an error // when extracting. Mark those errors as unrecoverable, because // the Unpack contract cannot be met. warn(code: string, msg: string | Error, data: WarnData = {}) { if (code === 'TAR_BAD_ARCHIVE' || code === 'TAR_ABORT') { data.recoverable = false } return super.warn(code, msg, data) } [MAYBECLOSE]() { if (this[ENDED] && this[PENDING] === 0) { this.emit('prefinish') this.emit('finish') this.emit('end') } } // return false if we need to skip this file // return true if the field was successfully sanitized [STRIPABSOLUTEPATH]( entry: ReadEntry, field: 'path' | 'linkpath', ): boolean { const p = entry[field] const { type } = entry if (!p || this.preservePaths) return true // strip off the root const [root, stripped] = stripAbsolutePath(p) const parts = stripped.replaceAll(/\\/g, '/').split('/') if ( parts.includes('..') || /* c8 ignore next */ (isWindows && /^[a-z]:\.\.$/i.test(parts[0] ?? '')) ) { // For linkpath, check if the resolved path escapes cwd rather than // just rejecting any path with '..' - relative symlinks like // '../sibling/file' are valid if they resolve within the cwd. // For paths, they just simply may not ever use .. at all. if (field === 'path' || type === 'Link') { this.warn('TAR_ENTRY_ERROR', `${field} contains '..'`, { entry, [field]: p, }) // not ok! return false } // Resolve linkpath relative to the entry's directory. // `path.posix` is safe to use because we're operating on // tar paths, not a filesystem. const entryDir = path.posix.dirname(entry.path) const resolved = path.posix.normalize( path.posix.join(entryDir, parts.join('/')), ) // If the resolved path escapes (starts with ..), reject it if (resolved.startsWith('../') || resolved === '..') { this.warn( 'TAR_ENTRY_ERROR', `${field} escapes extraction directory`, { entry, [field]: p, }, ) return false } } if (root) { // ok, but triggers warning about stripping root entry[field] = String(stripped) this.warn( 'TAR_ENTRY_INFO', `stripping ${root} from absolute ${field}`, { entry, [field]: p, }, ) } return true } // no IO, just string checking for absolute indicators [CHECKPATH](entry: ReadEntry) { const p = normalizeWindowsPath(entry.path) const parts = p.split('/') if (this.strip) { if (parts.length < this.strip) { return false } if (entry.type === 'Link') { const linkparts = normalizeWindowsPath( String(entry.linkpath), ).split('/') if (linkparts.length >= this.strip) { entry.linkpath = linkparts.slice(this.strip).join('/') } else { return false } } parts.splice(0, this.strip) entry.path = parts.join('/') } if (isFinite(this.maxDepth) && parts.length > this.maxDepth) { this.warn('TAR_ENTRY_ERROR', 'path excessively deep', { entry, path: p, depth: parts.length, maxDepth: this.maxDepth, }) return false } if ( !this[STRIPABSOLUTEPATH](entry, 'path') || !this[STRIPABSOLUTEPATH](entry, 'linkpath') ) { return false } entry.absolute = path.isAbsolute(entry.path) ? normalizeWindowsPath(path.resolve(entry.path)) : normalizeWindowsPath(path.resolve(this.cwd, entry.path)) // if we somehow ended up with a path that escapes the cwd, and we are // not in preservePaths mode, then something is fishy! This should have // been prevented above, so ignore this for coverage. /* c8 ignore start - defense in depth */ if ( !this.preservePaths && typeof entry.absolute === 'string' && entry.absolute.indexOf(this.cwd + '/') !== 0 && entry.absolute !== this.cwd ) { this.warn('TAR_ENTRY_ERROR', 'path escaped extraction target', { entry, path: normalizeWindowsPath(entry.path), resolvedPath: entry.absolute, cwd: this.cwd, }) return false } /* c8 ignore stop */ // an archive can set properties on the extraction directory, but it // may not replace the cwd with a different kind of thing entirely. if ( entry.absolute === this.cwd && entry.type !== 'Directory' && entry.type !== 'GNUDumpDir' ) { return false } // only encode : chars that aren't drive letter indicators if (this.win32) { const { root: aRoot } = path.win32.parse(String(entry.absolute)) entry.absolute = aRoot + wc.encode(String(entry.absolute).slice(aRoot.length)) const { root: pRoot } = path.win32.parse(entry.path) entry.path = pRoot + wc.encode(entry.path.slice(pRoot.length)) } return true } [ONENTRY](entry: ReadEntry) { if (!this[CHECKPATH](entry)) { return entry.resume() } assert.equal(typeof entry.absolute, 'string') switch (entry.type) { case 'Directory': case 'GNUDumpDir': if (entry.mode) { entry.mode = entry.mode | 0o700 } // eslint-disable-next-line no-fallthrough case 'File': case 'OldFile': case 'ContiguousFile': case 'Link': case 'SymbolicLink': return this[CHECKFS](entry) case 'CharacterDevice': case 'BlockDevice': case 'FIFO': default: return this[UNSUPPORTED](entry) } } [ONERROR](er: Error, entry: ReadEntry) { // Cwd has to exist, or else nothing works. That's serious. // Other errors are warnings, which raise the error in strict // mode, but otherwise continue on. if (er.name === 'CwdError') { this.emit('error', er) } else { this.warn('TAR_ENTRY_ERROR', er, { entry }) this[UNPEND]() entry.resume() } } [MKDIR]( dir: string, mode: number, cb: (er?: null | MkdirError, made?: string) => void, ) { void mkdir( normalizeWindowsPath(dir), { uid: this.uid, gid: this.gid, processUid: this.processUid, processGid: this.processGid, umask: this.processUmask, preserve: this.preservePaths, unlink: this.unlink, cwd: this.cwd, mode: mode, }, cb, ) } [DOCHOWN](entry: ReadEntry) { // in preserve owner mode, chown if the entry doesn't match process // in set owner mode, chown if setting doesn't match process return ( this.forceChown || (this.preserveOwner && ((typeof entry.uid === 'number' && entry.uid !== this.processUid) || (typeof entry.gid === 'number' && entry.gid !== this.processGid))) || (typeof this.uid === 'number' && this.uid !== this.processUid) || (typeof this.gid === 'number' && this.gid !== this.processGid) ) } [UID](entry: ReadEntry) { return uint32(this.uid, entry.uid, this.processUid) } [GID](entry: ReadEntry) { return uint32(this.gid, entry.gid, this.processGid) } [FILE](entry: ReadEntry, fullyDone: () => void) { const mode = typeof entry.mode === 'number' ? entry.mode & 0o7777 : this.fmode const stream = new fsm.WriteStream(String(entry.absolute), { // slight lie, but it can be numeric flags flags: getWriteFlag(entry.size) as string, mode: mode, autoClose: false, }) stream.on('error', (er: Error) => { if (stream.fd) { fs.close(stream.fd, () => {}) } // flush all the data out so that we aren't left hanging // if the error wasn't actually fatal. otherwise the parse // is blocked, and we never proceed. stream.write = () => true this[ONERROR](er, entry) fullyDone() }) let actions = 1 const done = (er?: null | Error) => { if (er) { /* c8 ignore start - we should always have a fd by now */ if (stream.fd) { fs.close(stream.fd, () => {}) } /* c8 ignore stop */ this[ONERROR](er, entry) fullyDone() return } if (--actions === 0) { if (stream.fd !== undefined) { fs.close(stream.fd, er => { if (er) { this[ONERROR](er, entry) } else { this[UNPEND]() } fullyDone() }) } } } stream.on('finish', () => { // if futimes fails, try utimes // if utimes fails, fail with the original error // same for fchown/chown const abs = String(entry.absolute) const fd = stream.fd if (typeof fd === 'number' && entry.mtime && !this.noMtime) { actions++ const atime = entry.atime || new Date() const mtime = entry.mtime fs.futimes(fd, atime, mtime, er => er ? fs.utimes(abs, atime, mtime, er2 => done(er2 && er)) : done(), ) } if (typeof fd === 'number' && this[DOCHOWN](entry)) { actions++ const uid = this[UID](entry) const gid = this[GID](entry) if (typeof uid === 'number' && typeof gid === 'number') { fs.fchown(fd, uid, gid, er => er ? fs.chown(abs, uid, gid, er2 => done(er2 && er)) : done(), ) } } done() }) const tx = this.transform ? this.transform(entry) || entry : entry if (tx !== entry) { tx.on('error', er => { this[ONERROR](er as Error, entry) fullyDone() }) entry.pipe(tx) } tx.pipe(stream) } [DIRECTORY](entry: ReadEntry, fullyDone: () => void) { const mode = typeof entry.mode === 'number' ? entry.mode & 0o7777 : this.dmode this[MKDIR](String(entry.absolute), mode, er => { if (er) { this[ONERROR](er, entry) fullyDone() return } let actions = 1 const done = () => { if (--actions === 0) { fullyDone() this[UNPEND]() entry.resume() } } if (entry.mtime && !this.noMtime) { actions++ fs.utimes( String(entry.absolute), entry.atime || new Date(), entry.mtime, done, ) } if (this[DOCHOWN](entry)) { actions++ fs.chown( String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry)), done, ) } done() }) } [UNSUPPORTED](entry: ReadEntry) { entry.unsupported = true this.warn( 'TAR_ENTRY_UNSUPPORTED', `unsupported entry type: ${entry.type}`, { entry }, ) entry.resume() } [SYMLINK](entry: ReadEntry, done: () => void) { const parts = normalizeWindowsPath( path.relative( this.cwd, path.resolve( path.dirname(String(entry.absolute)), String(entry.linkpath), ), ), ).split('/') this[ENSURE_NO_SYMLINK]( entry, this.cwd, parts, () => this[LINK](entry, String(entry.linkpath), 'symlink', done), er => { this[ONERROR](er, entry) done() }, ) } [HARDLINK](entry: ReadEntry, done: () => void) { const linkpath = normalizeWindowsPath( path.resolve(this.cwd, String(entry.linkpath)), ) const parts = normalizeWindowsPath(String(entry.linkpath)).split('/') this[ENSURE_NO_SYMLINK]( entry, this.cwd, parts, () => this[LINK](entry, linkpath, 'link', done), er => { this[ONERROR](er, entry) done() }, ) } [ENSURE_NO_SYMLINK]( entry: ReadEntry, cwd: string, parts: string[], done: () => void, onError: (er: SymlinkError) => void, ) { const p = parts.shift() if (this.preservePaths || p === undefined) return done() const t = path.resolve(cwd, p) fs.lstat(t, (er, st) => { if (er) return done() if (st?.isSymbolicLink()) { return onError( new SymlinkError(t, path.resolve(t, parts.join('/'))), ) } this[ENSURE_NO_SYMLINK](entry, t, parts, done, onError) }) } [PEND]() { this[PENDING]++ } [UNPEND]() { this[PENDING]-- this[MAYBECLOSE]() } [SKIP](entry: ReadEntry) { this[UNPEND]() entry.resume() } // Check if we can reuse an existing filesystem entry safely and // overwrite it, rather than unlinking and recreating // Windows doesn't report a useful nlink, so we just never reuse entries [ISREUSABLE](entry: ReadEntry, st: Stats) { return ( entry.type === 'File' && !this.unlink && st.isFile() && st.nlink <= 1 && !isWindows ) } // check if a thing is there, and if so, try to clobber it [CHECKFS](entry: ReadEntry) { this[PEND]() const paths = [entry.path] if (entry.linkpath) { paths.push(entry.linkpath) } this.reservations.reserve(paths, done => this[CHECKFS2](entry, done)) } [CHECKFS2](entry: ReadEntry, fullyDone: (er?: Error) => void) { const done = (er?: Error) => { fullyDone(er) } const checkCwd = () => { this[MKDIR](this.cwd, this.dmode, er => { if (er) { this[ONERROR](er, entry) done() return } this[CHECKED_CWD] = true start() }) } const start = () => { if (entry.absolute !== this.cwd) { const parent = normalizeWindowsPath( path.dirname(String(entry.absolute)), ) if (parent !== this.cwd) { return this[MKDIR](parent, this.dmode, er => { if (er) { this[ONERROR](er, entry) done() return } afterMakeParent() }) } } afterMakeParent() } const afterMakeParent = () => { fs.lstat(String(entry.absolute), (lstatEr, st) => { if ( st && (this.keep || /* c8 ignore next */ (this.newer && st.mtime > (entry.mtime ?? st.mtime))) ) { this[SKIP](entry) done() return } if (lstatEr || this[ISREUSABLE](entry, st)) { return this[MAKEFS](null, entry, done) } if (st.isDirectory()) { if (entry.type === 'Directory') { const needChmod = this.chmod && entry.mode && (st.mode & 0o7777) !== entry.mode const afterChmod = (er?: Error | null | undefined) => this[MAKEFS](er ?? null, entry, done) if (!needChmod) { return afterChmod() } return fs.chmod( String(entry.absolute), Number(entry.mode), afterChmod, ) } // Not a dir entry, have to remove it. // NB: the only way to end up with an entry that is the cwd // itself, in such a way that == does not detect, is a // tricky windows absolute path with UNC or 8.3 parts (and // preservePaths:true, or else it will have been stripped). // In that case, the user has opted out of path protections // explicitly, so if they blow away the cwd, c'est la vie. if (entry.absolute !== this.cwd) { return fs.rmdir(String(entry.absolute), (er?: null | Error) => this[MAKEFS](er ?? null, entry, done), ) } } // not a dir, and not reusable // don't remove if the cwd, we want that error if (entry.absolute === this.cwd) { return this[MAKEFS](null, entry, done) } unlinkFile(String(entry.absolute), er => this[MAKEFS](er ?? null, entry, done), ) }) } if (this[CHECKED_CWD]) { start() } else { checkCwd() } } [MAKEFS]( er: null | undefined | Error, entry: ReadEntry, done: () => void, ) { if (er) { this[ONERROR](er, entry) done() return } switch (entry.type) { case 'File': case 'OldFile': case 'ContiguousFile': return this[FILE](entry, done) case 'Link': return this[HARDLINK](entry, done) case 'SymbolicLink': return this[SYMLINK](entry, done) case 'Directory': case 'GNUDumpDir': return this[DIRECTORY](entry, done) } } [LINK]( entry: ReadEntry, linkpath: string, link: 'link' | 'symlink', done: () => void, ) { fs[link](linkpath, String(entry.absolute), er => { if (er) { this[ONERROR](er, entry) } else { this[UNPEND]() entry.resume() } done() }) } } const callSync = ( fn: () => T, ): [null, T] | [NodeJS.ErrnoException, null] => { try { return [null, fn()] } catch (er) { return [er as NodeJS.ErrnoException, null] } } export class UnpackSync extends Unpack { sync: true = true; [MAKEFS](er: null | Error | undefined, entry: ReadEntry) { return super[MAKEFS](er, entry, () => {}) } [CHECKFS](entry: ReadEntry) { if (!this[CHECKED_CWD]) { const er = this[MKDIR](this.cwd, this.dmode) if (er) { return this[ONERROR](er as Error, entry) } this[CHECKED_CWD] = true } // don't bother to make the parent if the current entry is the cwd, // we've already checked it. if (entry.absolute !== this.cwd) { const parent = normalizeWindowsPath( path.dirname(String(entry.absolute)), ) if (parent !== this.cwd) { const mkParent = this[MKDIR](parent, this.dmode) if (mkParent) { return this[ONERROR](mkParent as Error, entry) } } } const [lstatEr, st] = callSync(() => fs.lstatSync(String(entry.absolute)), ) if ( st && (this.keep || /* c8 ignore next */ (this.newer && st.mtime > (entry.mtime ?? st.mtime))) ) { return this[SKIP](entry) } if (lstatEr || this[ISREUSABLE](entry, st)) { return this[MAKEFS](null, entry) } if (st.isDirectory()) { if (entry.type === 'Directory') { const needChmod = this.chmod && entry.mode && (st.mode & 0o7777) !== entry.mode const [er] = needChmod ? callSync(() => { fs.chmodSync(String(entry.absolute), Number(entry.mode)) }) : [] return this[MAKEFS](er, entry) } // not a dir entry, have to remove it const [er] = callSync(() => fs.rmdirSync(String(entry.absolute))) this[MAKEFS](er, entry) } // not a dir, and not reusable. // don't remove if it's the cwd, since we want that error. const [er] = entry.absolute === this.cwd ? [] : callSync(() => unlinkFileSync(String(entry.absolute))) this[MAKEFS](er, entry) } [FILE](entry: ReadEntry, done: () => void) { const mode = typeof entry.mode === 'number' ? entry.mode & 0o7777 : this.fmode const oner = (er?: null | Error | undefined) => { let closeError try { fs.closeSync(fd) } catch (e) { closeError = e } if (er || closeError) { this[ONERROR]((er as Error) || closeError, entry) } done() } let fd: number try { fd = fs.openSync( String(entry.absolute), getWriteFlag(entry.size), mode, ) /* c8 ignore start - This is only a problem if the file was successfully * statted, BUT failed to open. Testing this is annoying, and we * already have ample testint for other uses of oner() methods. */ } catch (er) { return oner(er as Error) } /* c8 ignore stop */ const tx = this.transform ? this.transform(entry) || entry : entry if (tx !== entry) { tx.on('error', er => this[ONERROR](er as Error, entry)) entry.pipe(tx) } tx.on('data', (chunk: Buffer) => { try { fs.writeSync(fd, chunk, 0, chunk.length) } catch (er) { oner(er as Error) } }) tx.on('end', () => { let er = null // try both, falling futimes back to utimes // if either fails, handle the first error if (entry.mtime && !this.noMtime) { const atime = entry.atime || new Date() const mtime = entry.mtime try { fs.futimesSync(fd, atime, mtime) } catch (futimeser) { try { fs.utimesSync(String(entry.absolute), atime, mtime) } catch { er = futimeser } } } if (this[DOCHOWN](entry)) { const uid = this[UID](entry) const gid = this[GID](entry) try { fs.fchownSync(fd, Number(uid), Number(gid)) } catch (fchowner) { try { fs.chownSync(String(entry.absolute), Number(uid), Number(gid)) } catch { er = er || fchowner } } } oner(er as Error) }) } [DIRECTORY](entry: ReadEntry, done: () => void) { const mode = typeof entry.mode === 'number' ? entry.mode & 0o7777 : this.dmode const er = this[MKDIR](String(entry.absolute), mode) if (er) { this[ONERROR](er as Error, entry) done() return } if (entry.mtime && !this.noMtime) { try { fs.utimesSync( String(entry.absolute), entry.atime || new Date(), entry.mtime, ) /* c8 ignore next */ } catch {} } if (this[DOCHOWN](entry)) { try { fs.chownSync( String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry)), ) } catch {} } done() entry.resume() } [MKDIR](dir: string, mode: number) { try { return mkdirSync(normalizeWindowsPath(dir), { uid: this.uid, gid: this.gid, processUid: this.processUid, processGid: this.processGid, umask: this.processUmask, preserve: this.preservePaths, unlink: this.unlink, cwd: this.cwd, mode: mode, }) } catch (er) { return er } } [ENSURE_NO_SYMLINK]( _entry: ReadEntry, cwd: string, parts: string[], done: () => void, onError: (er: SymlinkError) => void, ) { if (this.preservePaths || parts.length === 0) return done() let t = cwd for (const p of parts) { t = path.resolve(t, p) const [er, st] = callSync(() => fs.lstatSync(t)) if (er) return done() if (st.isSymbolicLink()) { return onError( new SymlinkError(t, path.resolve(cwd, parts.join('/'))), ) } } done() } [LINK]( entry: ReadEntry, linkpath: string, link: 'link' | 'symlink', done: () => void, ) { const linkSync: `${typeof link}Sync` = `${link}Sync` try { fs[linkSync](linkpath, String(entry.absolute)) done() entry.resume() } catch (er) { return this[ONERROR](er as Error, entry) } } } isaacs-node-tar-8a4b548/src/update.ts000066400000000000000000000020231523070444600174500ustar00rootroot00000000000000// tar -u import { makeCommand } from './make-command.js' import { type TarOptionsWithAliases } from './options.js' import { replace as r } from './replace.js' // just call tar.r with the filter and mtimeCache export const update = makeCommand( r.syncFile, r.asyncFile, r.syncNoFile, r.asyncNoFile, (opt, entries = []) => { r.validate?.(opt, entries) mtimeFilter(opt) }, ) const mtimeFilter = (opt: TarOptionsWithAliases) => { const filter = opt.filter if (!opt.mtimeCache) { opt.mtimeCache = new Map() } opt.filter = filter ? (path, stat) => filter(path, stat) && !( /* c8 ignore start */ ( (opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) > (stat.mtime ?? 0) ) /* c8 ignore stop */ ) : (path, stat) => !( /* c8 ignore start */ ( (opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) > (stat.mtime ?? 0) ) /* c8 ignore stop */ ) } isaacs-node-tar-8a4b548/src/warn-method.ts000066400000000000000000000025601523070444600204210ustar00rootroot00000000000000import { type Minipass } from 'minipass' /** has a warn method */ export type Warner = { warn(code: string, message: string | Error, data: unknown): void file?: string cwd?: string strict?: boolean emit(event: 'warn', code: string, message: string, data?: WarnData): void emit(event: 'error', error: TarError): void } export type WarnEvent = Minipass.Events & { warn: [code: string, message: string, data: WarnData] } export type WarnData = { file?: string cwd?: string code?: string tarCode?: string recoverable?: boolean [k: string]: unknown } export type TarError = Error & WarnData export const warnMethod = ( self: Warner, code: string, message: string | Error, data: WarnData = {}, ) => { if (self.file) { data.file = self.file } if (self.cwd) { data.cwd = self.cwd } data.code = (message instanceof Error && (message as NodeJS.ErrnoException).code) || code data.tarCode = code if (!self.strict && data.recoverable !== false) { if (message instanceof Error) { data = Object.assign(message, data) message = message.message } self.emit('warn', code, message, data) } else if (message instanceof Error) { self.emit('error', Object.assign(message, data)) } else { self.emit( 'error', Object.assign(new Error(`${code}: ${message}`), data), ) } } isaacs-node-tar-8a4b548/src/winchars.ts000066400000000000000000000010411523070444600200030ustar00rootroot00000000000000// When writing files on Windows, translate the characters to their // 0xf000 higher-encoded versions. const raw = ['|', '<', '>', '?', ':'] const win = raw.map(char => String.fromCodePoint(0xf000 + Number(char.codePointAt(0))), ) const toWin = new Map(raw.map((char, i) => [char, win[i]])) const toRaw = new Map(win.map((char, i) => [char, raw[i]])) export const encode = (s: string) => raw.reduce((s, c) => s.split(c).join(toWin.get(c)), s) export const decode = (s: string) => win.reduce((s, c) => s.split(c).join(toRaw.get(c)), s) isaacs-node-tar-8a4b548/src/write-entry.ts000066400000000000000000000537011523070444600204700ustar00rootroot00000000000000import fs, { type Stats } from 'fs' import { Minipass } from 'minipass' import path from 'path' import { Header } from './header.js' import { modeFix } from './mode-fix.js' import { normalizeWindowsPath } from './normalize-windows-path.js' import type { LinkCacheKey, TarOptions, TarOptionsWithAliases, } from './options.js' import { dealias } from './options.js' import { Pax } from './pax.js' import type { ReadEntry } from './read-entry.js' import { stripAbsolutePath } from './strip-absolute-path.js' import { stripTrailingSlashes } from './strip-trailing-slashes.js' import type { EntryTypeName } from './types.js' import type { WarnData, Warner, WarnEvent } from './warn-method.js' import { warnMethod } from './warn-method.js' import * as winchars from './winchars.js' const prefixPath = (path: string, prefix?: string) => { if (!prefix) { return normalizeWindowsPath(path) } path = normalizeWindowsPath(path).replace(/^\.(\/|$)/, '') return stripTrailingSlashes(prefix) + '/' + path } const maxReadSize = 16 * 1024 * 1024 const PROCESS = Symbol('process') const FILE = Symbol('file') const DIRECTORY = Symbol('directory') const SYMLINK = Symbol('symlink') const HARDLINK = Symbol('hardlink') const HEADER = Symbol('header') const READ = Symbol('read') const LSTAT = Symbol('lstat') const ONLSTAT = Symbol('onlstat') const ONREAD = Symbol('onread') const ONREADLINK = Symbol('onreadlink') const OPENFILE = Symbol('openfile') const ONOPENFILE = Symbol('onopenfile') const CLOSE = Symbol('close') const MODE = Symbol('mode') const AWAITDRAIN = Symbol('awaitDrain') const ONDRAIN = Symbol('ondrain') const PREFIX = Symbol('prefix') export class WriteEntry extends Minipass implements Warner { path: string portable: boolean myuid: number = (process.getuid && process.getuid()) || 0 // until node has builtin pwnam functions, this'll have to do myuser: string = process.env.USER || '' maxReadSize: number linkCache: Exclude statCache: Exclude preservePaths: boolean cwd: string strict: boolean mtime?: Date noPax: boolean noMtime: boolean prefix?: string fd?: number blockLen: number = 0 blockRemain: number = 0 buf?: Buffer pos: number = 0 remain: number = 0 length: number = 0 offset: number = 0 win32: boolean absolute: string header?: Header type?: EntryTypeName | 'Unsupported' linkpath?: string stat?: Stats onWriteEntry?: (entry: WriteEntry) => unknown #hadError: boolean = false constructor(p: string, opt_: TarOptionsWithAliases = {}) { const opt = dealias(opt_) super() this.path = normalizeWindowsPath(p) // suppress atime, ctime, uid, gid, uname, gname this.portable = !!opt.portable this.maxReadSize = opt.maxReadSize || maxReadSize this.linkCache = opt.linkCache || new Map() this.statCache = opt.statCache || new Map() this.preservePaths = !!opt.preservePaths this.cwd = normalizeWindowsPath(opt.cwd || process.cwd()) this.strict = !!opt.strict this.noPax = !!opt.noPax this.noMtime = !!opt.noMtime this.mtime = opt.mtime this.prefix = opt.prefix ? normalizeWindowsPath(opt.prefix) : undefined this.onWriteEntry = opt.onWriteEntry if (typeof opt.onwarn === 'function') { this.on('warn', opt.onwarn) } let pathWarn: string | boolean = false if (!this.preservePaths) { const [root, stripped] = stripAbsolutePath(this.path) if (root && typeof stripped === 'string') { this.path = stripped pathWarn = root } } this.win32 = !!opt.win32 || process.platform === 'win32' if (this.win32) { // force the \ to / normalization, since we might not *actually* // be on windows, but want \ to be considered a path separator. this.path = winchars.decode(this.path.replaceAll(/\\/g, '/')) p = p.replaceAll(/\\/g, '/') } this.absolute = normalizeWindowsPath( opt.absolute || path.resolve(this.cwd, p), ) if (this.path === '') { this.path = './' } if (pathWarn) { this.warn( 'TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, { entry: this, path: pathWarn + this.path, }, ) } const cs = this.statCache.get(this.absolute) if (cs) { this[ONLSTAT](cs) } else { this[LSTAT]() } } warn(code: string, message: string | Error, data: WarnData = {}) { return warnMethod(this, code, message, data) } emit(ev: keyof WarnEvent, ...data: unknown[]) { if (ev === 'error') { this.#hadError = true } return super.emit(ev, ...data) } [LSTAT]() { fs.lstat(this.absolute, (er, stat) => { if (er) { return this.emit('error', er) } this[ONLSTAT](stat) }) } [ONLSTAT](stat: Stats) { this.statCache.set(this.absolute, stat) this.stat = stat if (!stat.isFile()) { stat.size = 0 } this.type = getType(stat) this.emit('stat', stat) this[PROCESS]() } [PROCESS]() { switch (this.type) { case 'File': return this[FILE]() case 'Directory': return this[DIRECTORY]() case 'SymbolicLink': return this[SYMLINK]() // unsupported types are ignored. default: return this.end() } } [MODE](mode: number) { return modeFix(mode, this.type === 'Directory', this.portable) } [PREFIX](path: string) { return prefixPath(path, this.prefix) } [HEADER]() { /* c8 ignore start */ if (!this.stat) { throw new Error('cannot write header before stat') } /* c8 ignore stop */ if (this.type === 'Directory' && this.portable) { this.noMtime = true } this.onWriteEntry?.(this) this.header = new Header({ path: this[PREFIX](this.path), // only apply the prefix to hard links. linkpath: this.type === 'Link' && this.linkpath !== undefined ? this[PREFIX](this.linkpath) : this.linkpath, // only the permissions and setuid/setgid/sticky bitflags // not the higher-order bits that specify file type mode: this[MODE](this.stat.mode), uid: this.portable ? undefined : this.stat.uid, gid: this.portable ? undefined : this.stat.gid, size: this.stat.size, mtime: this.noMtime ? undefined : this.mtime || this.stat.mtime, /* c8 ignore next */ type: this.type === 'Unsupported' ? undefined : this.type, uname: this.portable ? undefined : this.stat.uid === this.myuid ? this.myuser : '', atime: this.portable ? undefined : this.stat.atime, ctime: this.portable ? undefined : this.stat.ctime, }) if (this.header.encode() && !this.noPax) { super.write( new Pax({ atime: this.portable ? undefined : this.header.atime, ctime: this.portable ? undefined : this.header.ctime, gid: this.portable ? undefined : this.header.gid, mtime: this.noMtime ? undefined : this.mtime || this.header.mtime, path: this[PREFIX](this.path), linkpath: this.type === 'Link' && this.linkpath !== undefined ? this[PREFIX](this.linkpath) : this.linkpath, size: this.header.size, uid: this.portable ? undefined : this.header.uid, uname: this.portable ? undefined : this.header.uname, dev: this.portable ? undefined : this.stat.dev, ino: this.portable ? undefined : this.stat.ino, nlink: this.portable ? undefined : this.stat.nlink, }).encode(), ) } const block = this.header?.block /* c8 ignore start */ if (!block) { throw new Error('failed to encode header') } /* c8 ignore stop */ super.write(block) } [DIRECTORY]() { /* c8 ignore start */ if (!this.stat) { throw new Error('cannot create directory entry without stat') } /* c8 ignore stop */ if (this.path.slice(-1) !== '/') { this.path += '/' } this.stat.size = 0 this[HEADER]() this.end() } [SYMLINK]() { fs.readlink(this.absolute, (er, linkpath) => { if (er) { return this.emit('error', er) } this[ONREADLINK](linkpath) }) } [ONREADLINK](linkpath: string) { this.linkpath = normalizeWindowsPath(linkpath) this[HEADER]() this.end() } [HARDLINK](linkpath: string) { /* c8 ignore start */ if (!this.stat) { throw new Error('cannot create link entry without stat') } /* c8 ignore stop */ this.type = 'Link' this.linkpath = normalizeWindowsPath(path.relative(this.cwd, linkpath)) this.stat.size = 0 this[HEADER]() this.end() } [FILE]() { /* c8 ignore start */ if (!this.stat) { throw new Error('cannot create file entry without stat') } /* c8 ignore stop */ if (this.stat.nlink > 1) { const linkKey = `${this.stat.dev}:${this.stat.ino}` as LinkCacheKey const linkpath = this.linkCache.get(linkKey) if (linkpath?.indexOf(this.cwd) === 0) { return this[HARDLINK](linkpath) } this.linkCache.set(linkKey, this.absolute) } this[HEADER]() if (this.stat.size === 0) { return this.end() } this[OPENFILE]() } [OPENFILE]() { fs.open(this.absolute, 'r', (er, fd) => { if (er) { return this.emit('error', er) } this[ONOPENFILE](fd) }) } [ONOPENFILE](fd: number) { this.fd = fd if (this.#hadError) { return this[CLOSE]() } /* c8 ignore start */ if (!this.stat) { throw new Error('should stat before calling onopenfile') } /* c8 ignore start */ this.blockLen = 512 * Math.ceil(this.stat.size / 512) this.blockRemain = this.blockLen const bufLen = Math.min(this.blockLen, this.maxReadSize) this.buf = Buffer.allocUnsafe(bufLen) this.offset = 0 this.pos = 0 this.remain = this.stat.size this.length = this.buf.length this[READ]() } [READ]() { const { fd, buf, offset, length, pos } = this if (fd === undefined || buf === undefined) { throw new Error('cannot read file without first opening') } fs.read(fd, buf, offset, length, pos, (er, bytesRead) => { if (er) { // ignoring the error from close(2) is a bad practice, but at // this point we already have an error, don't need another one return this[CLOSE](() => this.emit('error', er)) } this[ONREAD](bytesRead) }) } /* c8 ignore start */ [CLOSE]( cb: (er?: null | Error | NodeJS.ErrnoException) => unknown = () => {}, ) { /* c8 ignore stop */ if (this.fd !== undefined) fs.close(this.fd, cb) } [ONREAD](bytesRead: number) { if (bytesRead <= 0 && this.remain > 0) { const er = Object.assign(new Error('encountered unexpected EOF'), { path: this.absolute, syscall: 'read', code: 'EOF', }) return this[CLOSE](() => this.emit('error', er)) } if (bytesRead > this.remain) { const er = Object.assign( new Error('did not encounter expected EOF'), { path: this.absolute, syscall: 'read', code: 'EOF', }, ) return this[CLOSE](() => this.emit('error', er)) } /* c8 ignore start */ if (!this.buf) { throw new Error('should have created buffer prior to reading') } /* c8 ignore stop */ // null out the rest of the buffer, if we could fit the block padding // at the end of this loop, we've incremented bytesRead and this.remain // to be incremented up to the blockRemain level, as if we had expected // to get a null-padded file, and read it until the end. then we will // decrement both remain and blockRemain by bytesRead, and know that we // reached the expected EOF, without any null buffer to append. if (bytesRead === this.remain) { for ( let i = bytesRead; i < this.length && bytesRead < this.blockRemain; i++ ) { this.buf[i + this.offset] = 0 bytesRead++ this.remain++ } } const chunk = this.offset === 0 && bytesRead === this.buf.length ? this.buf : this.buf.subarray(this.offset, this.offset + bytesRead) const flushed = this.write(chunk) if (!flushed) { this[AWAITDRAIN](() => this[ONDRAIN]()) } else { this[ONDRAIN]() } } [AWAITDRAIN](cb: () => unknown) { this.once('drain', cb) } write(buffer: Buffer | string, cb?: () => void): boolean write( str: Buffer | string, encoding?: BufferEncoding | null, cb?: () => void, ): boolean write( chunk: Buffer | string, encoding?: BufferEncoding | (() => unknown) | null, cb?: () => unknown, ): boolean { /* c8 ignore start - just junk to comply with NodeJS.WritableStream */ if (typeof encoding === 'function') { cb = encoding encoding = undefined } if (typeof chunk === 'string') { chunk = Buffer.from( chunk, typeof encoding === 'string' ? encoding : 'utf8', ) } /* c8 ignore stop */ if (this.blockRemain < chunk.length) { const er = Object.assign( new Error('writing more data than expected'), { path: this.absolute, }, ) return this.emit('error', er) } this.remain -= chunk.length this.blockRemain -= chunk.length this.pos += chunk.length this.offset += chunk.length return super.write(chunk, null, cb) } [ONDRAIN]() { if (!this.remain) { if (this.blockRemain) { super.write(Buffer.alloc(this.blockRemain)) } return this[CLOSE](er => (er ? this.emit('error', er) : this.end())) } /* c8 ignore start */ if (!this.buf) { throw new Error('buffer lost somehow in ONDRAIN') } /* c8 ignore stop */ if (this.offset >= this.length) { // if we only have a smaller bit left to read, alloc a smaller buffer // otherwise, keep it the same length it was before. this.buf = Buffer.allocUnsafe( Math.min(this.blockRemain, this.buf.length), ) this.offset = 0 } this.length = this.buf.length - this.offset this[READ]() } } export class WriteEntrySync extends WriteEntry implements Warner { sync: true = true; [LSTAT]() { this[ONLSTAT](fs.lstatSync(this.absolute)) } [SYMLINK]() { this[ONREADLINK](fs.readlinkSync(this.absolute)) } [OPENFILE]() { this[ONOPENFILE](fs.openSync(this.absolute, 'r')) } [READ]() { let threw = true try { const { fd, buf, offset, length, pos } = this /* c8 ignore start */ if (fd === undefined || buf === undefined) { throw new Error('fd and buf must be set in READ method') } /* c8 ignore stop */ const bytesRead = fs.readSync(fd, buf, offset, length, pos) this[ONREAD](bytesRead) threw = false } finally { // ignoring the error from close(2) is a bad practice, but at // this point we already have an error, don't need another one if (threw) { try { this[CLOSE](() => {}) } catch {} } } } [AWAITDRAIN](cb: () => unknown) { cb() } /* c8 ignore start */ [CLOSE]( cb: (er?: null | Error | NodeJS.ErrnoException) => unknown = () => {}, ) { /* c8 ignore stop */ if (this.fd !== undefined) fs.closeSync(this.fd) cb() } } export class WriteEntryTar extends Minipass implements Warner { blockLen: number = 0 blockRemain: number = 0 buf: number = 0 pos: number = 0 remain: number = 0 length: number = 0 preservePaths: boolean portable: boolean strict: boolean noPax: boolean noMtime: boolean readEntry: ReadEntry type: EntryTypeName prefix?: string path: string mode?: number uid?: number gid?: number uname?: string gname?: string header?: Header mtime?: Date atime?: Date ctime?: Date linkpath?: string size: number onWriteEntry?: (entry: WriteEntry) => unknown warn(code: string, message: string | Error, data: WarnData = {}) { return warnMethod(this, code, message, data) } constructor(readEntry: ReadEntry, opt_: TarOptionsWithAliases = {}) { const opt = dealias(opt_) super() this.preservePaths = !!opt.preservePaths this.portable = !!opt.portable this.strict = !!opt.strict this.noPax = !!opt.noPax this.noMtime = !!opt.noMtime this.onWriteEntry = opt.onWriteEntry this.readEntry = readEntry const { type } = readEntry /* c8 ignore start */ if (type === 'Unsupported') { throw new Error('writing entry that should be ignored') } /* c8 ignore stop */ this.type = type if (this.type === 'Directory' && this.portable) { this.noMtime = true } this.prefix = opt.prefix this.path = normalizeWindowsPath(readEntry.path) this.mode = readEntry.mode !== undefined ? this[MODE](readEntry.mode) : undefined this.uid = this.portable ? undefined : readEntry.uid this.gid = this.portable ? undefined : readEntry.gid this.uname = this.portable ? undefined : readEntry.uname this.gname = this.portable ? undefined : readEntry.gname this.size = readEntry.size this.mtime = this.noMtime ? undefined : opt.mtime || readEntry.mtime this.atime = this.portable ? undefined : readEntry.atime this.ctime = this.portable ? undefined : readEntry.ctime this.linkpath = readEntry.linkpath !== undefined ? normalizeWindowsPath(readEntry.linkpath) : undefined if (typeof opt.onwarn === 'function') { this.on('warn', opt.onwarn) } let pathWarn: false | string = false if (!this.preservePaths) { const [root, stripped] = stripAbsolutePath(this.path) if (root && typeof stripped === 'string') { this.path = stripped pathWarn = root } } this.remain = readEntry.size this.blockRemain = readEntry.startBlockSize this.onWriteEntry?.(this as unknown as WriteEntry) this.header = new Header({ path: this[PREFIX](this.path), linkpath: this.type === 'Link' && this.linkpath !== undefined ? this[PREFIX](this.linkpath) : this.linkpath, // only the permissions and setuid/setgid/sticky bitflags // not the higher-order bits that specify file type mode: this.mode, uid: this.portable ? undefined : this.uid, gid: this.portable ? undefined : this.gid, size: this.size, mtime: this.noMtime ? undefined : this.mtime, type: this.type, uname: this.portable ? undefined : this.uname, atime: this.portable ? undefined : this.atime, ctime: this.portable ? undefined : this.ctime, }) if (pathWarn) { this.warn( 'TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, { entry: this, path: pathWarn + this.path, }, ) } if (this.header.encode() && !this.noPax) { super.write( new Pax({ atime: this.portable ? undefined : this.atime, ctime: this.portable ? undefined : this.ctime, gid: this.portable ? undefined : this.gid, mtime: this.noMtime ? undefined : this.mtime, path: this[PREFIX](this.path), linkpath: this.type === 'Link' && this.linkpath !== undefined ? this[PREFIX](this.linkpath) : this.linkpath, size: this.size, uid: this.portable ? undefined : this.uid, uname: this.portable ? undefined : this.uname, dev: this.portable ? undefined : this.readEntry.dev, ino: this.portable ? undefined : this.readEntry.ino, nlink: this.portable ? undefined : this.readEntry.nlink, }).encode(), ) } const b = this.header?.block /* c8 ignore start */ if (!b) throw new Error('failed to encode header') /* c8 ignore stop */ super.write(b) readEntry.pipe(this) } [PREFIX](path: string) { return prefixPath(path, this.prefix) } [MODE](mode: number) { return modeFix(mode, this.type === 'Directory', this.portable) } write(buffer: Buffer | string, cb?: () => void): boolean write( str: Buffer | string, encoding?: BufferEncoding | null, cb?: () => void, ): boolean write( chunk: Buffer | string, encoding?: BufferEncoding | (() => unknown) | null, cb?: () => unknown, ): boolean { /* c8 ignore start - just junk to comply with NodeJS.WritableStream */ if (typeof encoding === 'function') { cb = encoding encoding = undefined } if (typeof chunk === 'string') { chunk = Buffer.from( chunk, typeof encoding === 'string' ? encoding : 'utf8', ) } /* c8 ignore stop */ const writeLen = chunk.length if (writeLen > this.blockRemain) { throw new Error('writing more to entry than is appropriate') } this.blockRemain -= writeLen return super.write(chunk, cb) } end(cb?: () => void): this end(chunk: Buffer | string, cb?: () => void): this end( chunk: Buffer | string, encoding?: BufferEncoding, cb?: () => void, ): this end( chunk?: Buffer | string | (() => void), encoding?: BufferEncoding | (() => void), cb?: () => void, ): this { if (this.blockRemain) { super.write(Buffer.alloc(this.blockRemain)) } /* c8 ignore start - just junk to comply with NodeJS.WritableStream */ if (typeof chunk === 'function') { cb = chunk encoding = undefined chunk = undefined } if (typeof encoding === 'function') { cb = encoding encoding = undefined } if (typeof chunk === 'string') { chunk = Buffer.from(chunk, encoding ?? 'utf8') } if (cb) this.once('finish', cb) if (chunk) super.end(chunk, cb) else super.end(cb) /* c8 ignore stop */ return this } } const getType = (stat: Stats): EntryTypeName | 'Unsupported' => stat.isFile() ? 'File' : stat.isDirectory() ? 'Directory' : stat.isSymbolicLink() ? 'SymbolicLink' : 'Unsupported' isaacs-node-tar-8a4b548/tap-snapshots/000077500000000000000000000000001523070444600176365ustar00rootroot00000000000000isaacs-node-tar-8a4b548/tap-snapshots/test/000077500000000000000000000000001523070444600206155ustar00rootroot00000000000000isaacs-node-tar-8a4b548/tap-snapshots/test/ghsa-8qq5-rm4j-mr97.ts.test.cjs000066400000000000000000000017751523070444600261170ustar00rootroot00000000000000/* IMPORTANT * This snapshot file is auto-generated, but designed for humans. * It should be checked into source control and tracked carefully. * Re-generate by setting TAP_SNAPSHOT=1 and running tests. * Make sure to inspect the output below. Do not ignore changes! */ 'use strict' exports[`test/ghsa-8qq5-rm4j-mr97.ts > TAP > warnings > must match snapshot 1`] = ` Array [ Array [ "TAR_ENTRY_INFO", "stripping / from absolute linkpath", ], Array [ "TAR_ENTRY_ERROR", "ENOENT: no such file or directory, link", ], Array [ "TAR_ENTRY_ERROR", "linkpath contains '..'", ], Array [ "TAR_ENTRY_INFO", "stripping / from absolute linkpath", ], Array [ "TAR_ENTRY_ERROR", "linkpath escapes extraction directory", ], Array [ "TAR_ENTRY_INFO", "stripping / from absolute linkpath", ], Array [ "TAR_ENTRY_INFO", "stripping c: from absolute linkpath", ], Array [ "TAR_ENTRY_ERROR", "linkpath escapes extraction directory", ], ] ` isaacs-node-tar-8a4b548/tap-snapshots/test/normalize-unicode.js-win32.test.cjs000066400000000000000000000021661523070444600273000ustar00rootroot00000000000000/* IMPORTANT * This snapshot file is auto-generated, but designed for humans. * It should be checked into source control and tracked carefully. * Re-generate by setting TAP_SNAPSHOT=1 and running tests. * Make sure to inspect the output below. Do not ignore changes! */ 'use strict' exports[`test/normalize-unicode.js win32 > TAP > normalize with strip slashes > "\\\\\eee\\\\\\" > normalized 1`] = ` \\\\\EEE\\\\\\ ` exports[`test/normalize-unicode.js win32 > TAP > normalize with strip slashes > "\\\\a\\\\b\\\\c\\\\d\\\\" > normalized 1`] = ` /A/B/C/D ` exports[`test/normalize-unicode.js win32 > TAP > normalize with strip slashes > "﹨aaaa﹨dddd﹨" > normalized 1`] = ` ﹨AAAA﹨DDDD﹨ ` exports[`test/normalize-unicode.js win32 > TAP > normalize with strip slashes > "ï¼¼bbbï¼¼eeeï¼¼" > normalized 1`] = ` ï¼¼BBBï¼¼EEEï¼¼ ` exports[`test/normalize-unicode.js win32 > TAP > normalize with strip slashes > "1/4foo.txt" > normalized 1`] = ` 1/4FOO.TXT ` exports[`test/normalize-unicode.js win32 > TAP > normalize with strip slashes > "¼foo.txt" > normalized 1`] = ` ¼FOO.TXT ` isaacs-node-tar-8a4b548/tap-snapshots/test/unpack.js.test.cjs000066400000000000000000000016771523070444600242030ustar00rootroot00000000000000/* IMPORTANT * This snapshot file is auto-generated, but designed for humans. * It should be checked into source control and tracked carefully. * Re-generate by setting TAP_SNAPSHOT=1 and running tests. * Make sure to inspect the output below. Do not ignore changes! */ 'use strict' exports[`test/unpack.js > TAP > ignore self-referential hardlinks > async > must match snapshot 1`] = ` Array [ "ENOENT: no such file or directory, link '{CWD}/.tap/fixtures/test-unpack.js-ignore-self-referential-hardlinks-async/autolink' -> '{CWD}/.tap/fixtures/test-unpack.js-ignore-self-referential-hardlinks-async/autolink'", ] ` exports[`test/unpack.js > TAP > ignore self-referential hardlinks > sync > must match snapshot 1`] = ` Array [ "ENOENT: no such file or directory, link '{CWD}/.tap/fixtures/test-unpack.js-ignore-self-referential-hardlinks-sync/autolink' -> '{CWD}/.tap/fixtures/test-unpack.js-ignore-self-referential-hardlinks-sync/autolink'", ] ` isaacs-node-tar-8a4b548/test/000077500000000000000000000000001523070444600160115ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/create.ts000066400000000000000000000175571523070444600176430ustar00rootroot00000000000000import fs from 'node:fs' import fsp from 'node:fs/promises' import { mkdirp } from 'mkdirp' import path from 'node:path' import { rimraf } from 'rimraf' import type { Test } from 'tap' import t from 'tap' import { c, list, Pack, PackSync } from '../dist/esm/index.js' import { spawn } from 'child_process' import { fileURLToPath } from 'url' const isWindows = process.platform === 'win32' const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) const dir = path.resolve(__dirname, 'fixtures/create') const tars = path.resolve(__dirname, 'fixtures/tars') const readtar = ( file: string, cb: ( code: number | null, signal: null | NodeJS.Signals, output: string, ) => any, ) => { const child = spawn('tar', ['tf', file]) const out: Buffer[] = [] child.stdout.on('data', c => out.push(c)) child.on('close', (code, signal) => cb(code, signal, Buffer.concat(out).toString()), ) } t.teardown(() => rimraf(dir)) t.before(async () => { await rimraf(dir) await mkdirp(dir) }) t.test('no cb if sync or without file', t => { //@ts-expect-error t.throws(() => c({ sync: true }, ['asdf'], () => {})) //@ts-expect-error t.throws(() => c(() => {})) t.throws(() => c({}, () => {})) t.throws(() => c({}, ['asdf'], () => {})) t.end() }) t.test('create file', t => { const files = [path.basename(__filename)] t.test('sync', t => { const file = path.resolve(dir, 'sync.tar') c( { file: file, cwd: __dirname, sync: true, }, files, ) readtar(file, (code, signal, list) => { t.equal(code, 0) t.equal(signal, null) t.equal(list.trim(), 'create.ts') t.end() }) }) t.test('async', t => { const file = path.resolve(dir, 'async.tar') c( { file: file, cwd: __dirname, }, files, er => { if (er) { throw er } readtar(file, (code, signal, list) => { t.equal(code, 0) t.equal(signal, null) t.equal(list.trim(), 'create.ts') t.end() }) }, ) }) t.test('async promise only', t => { const file = path.resolve(dir, 'promise.tar') c( { file: file, cwd: __dirname, }, files, ).then(() => { readtar(file, (code, signal, list) => { t.equal(code, 0) t.equal(signal, null) t.equal(list.trim(), 'create.ts') t.end() }) }) }) t.test('with specific mode', t => { const mode = isWindows ? 0o666 : 0o740 t.test('sync', t => { const file = path.resolve(dir, 'sync-mode.tar') c( { mode: mode, file: file, cwd: __dirname, sync: true, }, files, ) readtar(file, (code, signal, list) => { t.equal(code, 0) t.equal(signal, null) t.equal(list.trim(), 'create.ts') t.equal(fs.lstatSync(file).mode & 0o7777, mode) t.end() }) }) t.test('async', t => { const file = path.resolve(dir, 'async-mode.tar') c( { mode: mode, file: file, cwd: __dirname, }, files, er => { if (er) { throw er } readtar(file, (code, signal, list) => { t.equal(code, 0) t.equal(signal, null) t.equal(list.trim(), 'create.ts') t.equal(fs.lstatSync(file).mode & 0o7777, mode) t.end() }) }, ) }) t.end() }) t.end() }) t.test('create', t => { const ps = c({ sync: true }, ['README.md']) t.equal(ps.sync, true) t.type(ps, PackSync) const p = c(['README.md']) //@ts-expect-error p.then p.sync t.type(c(['README.md']), Pack) t.end() }) t.test('open fails', async t => { const poop = new Error('poop') const file = path.resolve(dir, 'throw-open.tar') const cbFail = (...args: any[]) => (args[args.length - 1] as Function)(poop) const syncFail = () => { throw poop } const asyncFail = async () => syncFail() const { create } = await t.mockImport( '../src/create.js', { fs: t.createMock(fs, { open: cbFail, stat: cbFail, lstat: cbFail, fstat: cbFail, openSync: syncFail, statSync: syncFail, lstatSync: syncFail, fstatSync: syncFail, }), 'fs/promises': t.createMock(fsp, { open: asyncFail, stat: asyncFail, lstat: asyncFail, fstat: asyncFail, }), }, ) t.throws( () => create( { file, sync: true, cwd: __dirname, }, [path.basename(__filename)], ), poop, ) t.throws(() => fs.lstatSync(file)) t.end() }) t.test('gzipped tarball that makes some drain/resume stuff', t => { const cwd = path.dirname(__dirname) const out = path.resolve(dir, 'package.tgz') // don't include node_modules/.cache, since that gets written to // by nyc during tests, and can result in spurious errors. const entries = fs .readdirSync(`${cwd}/node_modules`) .filter(e => !/^[@.]/.test(e)) .map(e => `node_modules/${e}`) const stream = c({ z: true, C: cwd }, entries) const outStream = fs.createWriteStream(out) outStream.on('drain', () => { stream.resume() }) stream.pipe(outStream).on('finish', () => { const child = spawn('tar', ['tf', out], { stdio: ['ignore', 'ignore', 'pipe'], }) child.stderr.on('data', c => { t.fail(c + '') }) child.on('close', (code, signal) => { t.equal(code, 0) t.equal(signal, null) t.end() }) }) }) t.test('create tarball out of another tarball', t => { const out = path.resolve(dir, 'out.tar') const check = (t: Test) => { const expect = [ 'dir/', 'Ω.txt', '🌟.txt', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', 'hardlink-1', 'hardlink-2', 'symlink', ] list({ f: out, sync: true, onReadEntry: entry => { if (entry.path === 'hardlink-2') { t.equal(entry.type, 'Link') } else if (entry.path === 'symlink') { t.equal(entry.type, 'SymbolicLink') } else if (entry.path === 'dir/') { t.equal(entry.type, 'Directory') } else { t.equal(entry.type, 'File') } t.equal(entry.path, expect.shift()) }, }) t.same(expect, []) t.end() } t.test('sync', t => { c( { f: out, cwd: tars, sync: true, }, ['@dir.tar', '@utf8.tar', '@links.tar'], ) check(t) }) t.test('async', async t => { await c( { f: out, cwd: tars, }, ['@dir.tar', '@utf8.tar', '@links.tar'], ) check(t) }) t.end() }) t.test('must specify some files', t => { t.throws(() => c({}), 'no paths specified to add to archive') t.end() }) t.test('error from @ file entry should be catchable', t => { t.test('async with file option', t => { const file = path.resolve(dir, 'at-error-file.tar') t.rejects( c( { file: file, cwd: __dirname, }, ['@nonexistent.tar'], ), ).then(() => t.end()) }) t.test('async without file option', t => { const stream = c( { cwd: __dirname, }, ['@nonexistent.tar'], ) stream.on('error', er => { t.match(er, { code: 'ENOENT' }) t.end() }) stream.resume() }) t.end() }) t.test('transform a filename', async t => { const cwd = t.testdir({ 'README.md': 'hello, world', }) const data = await c( { cwd, onWriteEntry: entry => { entry.path = 'bloorg.md' }, sync: true, }, ['README.md'], ).concat() t.equal(data.subarray(0, 'bloorg.md'.length).toString(), 'bloorg.md') }) isaacs-node-tar-8a4b548/test/cwd-error.js000066400000000000000000000003461523070444600202560ustar00rootroot00000000000000import t from 'tap' import { CwdError } from '../dist/esm/cwd-error.js' t.match(new CwdError('path', 'code'), { name: 'CwdError', path: 'path', code: 'code', syscall: 'chdir', message: `code: Cannot cd into 'path'`, }) isaacs-node-tar-8a4b548/test/dir-normalization.tar000066400000000000000000000110001523070444600221530ustar00rootroot00000000000000fixtures/000755 057761 000024 00000000000 12511342154 013343 5ustar00isaacsstaff000000 000000 fixtures/a/000755 057761 000024 00000000000 12511342040 013555 5ustar00isaacsstaff000000 000000 fixtures/the-chumbler000755 057761 000024 00000000000 12505125041 021322 2/a/b/c/d/the-chumblerustar00isaacsstaff000000 000000 fixtures/a/b/000755 057761 000024 00000000000 12511342030 013775 5ustar00isaacsstaff000000 000000 fixtures/a/x000644 057761 000024 00000000000 12511342040 013735 0ustar00isaacsstaff000000 000000 fixtures/a/b/c/000755 057761 000024 00000000000 12511342055 014226 5ustar00isaacsstaff000000 000000 fixtures/a/b/c/y000755 057761 000024 00000000000 12511342055 015232 2../../xustar00isaacsstaff000000 000000 isaacs-node-tar-8a4b548/test/extract.ts000066400000000000000000000360001523070444600200320ustar00rootroot00000000000000import fs, { readFileSync } from 'fs' import http from 'http' import { mkdirp } from 'mkdirp' import nock from 'nock' import path from 'path' import { rimraf } from 'rimraf' import { pipeline as PL } from 'stream' import type { Test } from 'tap' import t from 'tap' import { fileURLToPath } from 'url' import { promisify } from 'util' import zlib from 'zlib' import { extract as x } from '../dist/esm/extract.js' import { Unpack, UnpackSync } from '../dist/esm/unpack.js' import { makeTar } from './fixtures/make-tar.js' import { Pax } from '../src/pax.js' const pipeline = promisify(PL) const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) const extractdir = path.resolve(__dirname, 'fixtures/extract') const tars = path.resolve(__dirname, 'fixtures/tars') const makeCompressedBomb = () => { const payload = Buffer.alloc(8 * 1024 * 1024) return zlib.gzipSync( makeTar([ { path: 'bomb', size: payload.length, type: 'File', }, payload, '', '', ]), ) } const tnock = (t: Test, host: string, opts?: nock.Options) => { nock.disableNetConnect() const server = nock(host, opts) t.teardown(function () { nock.enableNetConnect() server.done() }) return server } t.teardown(() => rimraf(extractdir)) t.test('basic extracting', t => { const file = path.resolve(tars, 'utf8.tar') const dir = path.resolve(extractdir, 'basic') t.beforeEach(async () => { await rimraf(dir) await mkdirp(dir) }) const check = async (t: Test) => { fs.lstatSync(dir + '/Ω.txt') fs.lstatSync(dir + '/🌟.txt') t.throws(() => fs.lstatSync( dir + '/long-path/r/e/a/l/l/y/-/d/e/e/p/-' + '/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', ), ) await rimraf(dir) } const files = ['🌟.txt', 'Ω.txt'] t.test('sync', t => { x({ file, sync: true, C: dir }, files) return check(t) }) t.test('async promisey', async t => { const p = x({ file, cwd: dir }, files) //@ts-expect-error p.sync //@ts-expect-error p.write await p return check(t) }) t.test('async cb', async t => { const p = x({ file, cwd: dir }, files, er => { if (er) { throw er } return check(t) }) //@ts-expect-error p.sync //@ts-expect-error p.write await p }) t.test('stream sync', t => { const ups = x({ cwd: dir, sync: true }, files) ups.end(fs.readFileSync(file)) //@ts-expect-error ups.then t.equal(ups.sync, true) return check(t) }) t.test('stream async', async t => { const up = x({ cwd: dir }, files) //@ts-expect-error up.then //@ts-expect-error up.sync await new Promise(r => up.end(fs.readFileSync(file)).on('end', r), ) return check(t) }) t.end() }) t.test('ensure an open stream is not prematurely closed', t => { t.plan(1) const file = path.resolve(tars, 'long-paths.tar') const dir = t.testdir({}) t.beforeEach(async () => { await rimraf(dir) await mkdirp(dir) }) const check = async (t: Test) => { t.ok(fs.lstatSync(dir + '/long-path')) await rimraf(dir) t.end() } t.test('async promisey', async t => { const stream = fs.createReadStream(file, { highWaterMark: 1, }) await pipeline(stream, x({ cwd: dir })) return check(t) }) t.end() }) t.test('ensure an open stream is not prematuraly closed http', t => { t.plan(1) const file = path.resolve(tars, 'long-paths.tar') const dir = path.resolve(extractdir, 'basic-with-stream-http') t.beforeEach(async () => { await rimraf(dir) await mkdirp(dir) }) const check = async (t: Test) => { t.ok(fs.lstatSync(dir + '/long-path')) await rimraf(dir) t.end() } t.test('async promisey', t => { tnock(t, 'http://codeload.github.com/') .get('/npm/node-tar/tar.gz/main') .delay(250) .reply(200, () => fs.createReadStream(file)) http.get( 'http://codeload.github.com/npm/node-tar/tar.gz/main', async stream => { await pipeline(stream, x({ cwd: dir })) return check(t) }, ) }) t.end() }) t.test('file list and filter', t => { const file = path.resolve(tars, 'utf8.tar') const dir = path.resolve(extractdir, 'filter') t.beforeEach(async () => { await rimraf(dir) await mkdirp(dir) }) const check = async (t: Test) => { fs.lstatSync(dir + '/Ω.txt') t.throws(() => fs.lstatSync(dir + '/🌟.txt')) t.throws(() => fs.lstatSync( dir + '/long-path/r/e/a/l/l/y/-/d/e/e/p/-' + '/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', ), ) await rimraf(dir) } const filter = (path: string) => path === 'Ω.txt' t.test('sync file', t => { x({ filter, file, sync: true, C: dir }, ['🌟.txt', 'Ω.txt']) return check(t) }) t.test('async file', async t => { await x({ filter, file, cwd: dir }, ['🌟.txt', 'Ω.txt']) check(t) }) t.test('async cb', t => { return x({ filter, file, cwd: dir }, ['🌟.txt', 'Ω.txt'], er => { if (er) { throw er } return check(t) }) }) t.end() }) t.test('no file list', t => { const file = path.resolve(tars, 'body-byte-counts.tar') const dir = path.resolve(extractdir, 'no-list') t.beforeEach(async () => { await rimraf(dir) await mkdirp(dir) }) const check = async (t: Test) => { t.equal(fs.lstatSync(path.resolve(dir, '1024-bytes.txt')).size, 1024) t.equal(fs.lstatSync(path.resolve(dir, '512-bytes.txt')).size, 512) t.equal(fs.lstatSync(path.resolve(dir, 'one-byte.txt')).size, 1) t.equal(fs.lstatSync(path.resolve(dir, 'zero-byte.txt')).size, 0) await rimraf(dir) } t.test('sync file', t => { x({ file, sync: true, C: dir }) return check(t) }) t.test('async promisey file', async t => { await x({ file, cwd: dir }) return check(t) }) t.test('async cb', t => { return x({ file: file, cwd: dir }, er => { if (er) { throw er } return check(t) }) }) t.test('sync stream', t => { const up = x({ sync: true, C: dir }) t.equal(up.sync, true) t.type(up, UnpackSync) //@ts-expect-error up.then up.end(fs.readFileSync(file)) return check(t) }) t.test('async stream', t => { const up = x({ C: dir }) t.type(up, Unpack) //@ts-expect-error up.sync //@ts-expect-error up.then up.end(fs.readFileSync(file)) return new Promise(r => up.on('close', () => r(check(t)))) }) t.end() }) t.test('read in itty bits', t => { const maxReadSize = 1000 const file = path.resolve(tars, 'body-byte-counts.tar') const dir = path.resolve(extractdir, 'no-list') t.beforeEach(async () => { await rimraf(dir) await mkdirp(dir) }) const check = async (t: Test) => { t.equal(fs.lstatSync(path.resolve(dir, '1024-bytes.txt')).size, 1024) t.equal(fs.lstatSync(path.resolve(dir, '512-bytes.txt')).size, 512) t.equal(fs.lstatSync(path.resolve(dir, 'one-byte.txt')).size, 1) t.equal(fs.lstatSync(path.resolve(dir, 'zero-byte.txt')).size, 0) await rimraf(dir) } t.test('sync', t => { x({ file: file, sync: true, C: dir, maxReadSize: maxReadSize }) return check(t) }) t.test('async promisey', async t => { await x({ file: file, cwd: dir, maxReadSize: maxReadSize }) return check(t) }) t.test('async cb', t => { return x({ file: file, cwd: dir, maxReadSize: maxReadSize }, er => { if (er) { throw er } return check(t) }) }) t.end() }) t.test('bad calls', t => { t.throws(() => x({}, () => {})) t.throws(() => x({}, [], () => {})) //@ts-expect-error t.throws(() => x({ sync: true }, () => {})) //@ts-expect-error t.throws(() => x({ sync: true }, [], () => {})) t.end() }) t.test('no file', t => { const up = x() t.type(up, Unpack) //@ts-expect-error up.then //@ts-expect-error up.sync const upf = x(['asdf']) //@ts-expect-error upf.then //@ts-expect-error upf.sync t.type(upf, Unpack) const ups = x({ sync: true }) //@ts-expect-error ups.then t.equal(ups.sync, true) t.type(ups, UnpackSync) t.end() }) t.test('nonexistent', async t => { t.throws(() => x({ sync: true, file: 'does not exist' })) await t.rejects(x({ file: 'does not exist' })) }) t.test('read fail', async t => { const poop = new Error('poop') const { extract } = await t.mockImport< typeof import('../src/extract.js') >('../src/extract.js', { fs: t.createMock(fs, { readSync: () => { throw poop }, }), }) t.throws( () => extract({ maxReadSize: 10, sync: true, file: __filename }), poop, ) }) t.test('sync gzip error edge case test', async t => { const file = path.resolve(__dirname, 'fixtures/sync-gzip-fail.tgz') const dir = path.resolve(__dirname, 'sync-gzip-fail') const cwd = process.cwd() await mkdirp(dir + '/x') process.chdir(dir) t.teardown(async () => { process.chdir(cwd) await rimraf(dir) }) x({ sync: true, file: file, onwarn: (_c: any, _m: any, er) => { throw er }, }) t.same(fs.readdirSync(dir + '/x').sort(), [ '1', '10', '2', '3', '4', '5', '6', '7', '8', '9', ]) t.end() }) t.test('max decompression ratio', async t => { const file = path.resolve(extractdir, 'bomb.tgz') const bomb = makeCompressedBomb() await mkdirp(extractdir) fs.writeFileSync(file, bomb) t.teardown(() => rimraf(file)) t.test('file extraction aborts by default', async t => { const cwd = t.testdir({}) t.throws( () => x({ sync: true, file, cwd }), { tarCode: 'TAR_ABORT', recoverable: false, message: /max decompression ratio exceeded/, }, 'sync throws', ) await t.rejects(x({ file, cwd }), { tarCode: 'TAR_ABORT', recoverable: false, message: /max decompression ratio exceeded/, }) }) t.test('file extraction can disable the limit explicitly', async t => { const cwd = t.testdir({}) await x({ file, cwd, maxDecompressionRatio: Infinity, }) t.equal(fs.statSync(path.resolve(cwd, 'bomb')).size, 8 * 1024 * 1024) }) t.end() }) t.test('brotli', async t => { const file = path.resolve(__dirname, 'fixtures/example.tbr') const dir = path.resolve(__dirname, 'brotli') t.beforeEach(async () => { await mkdirp(dir) }) t.afterEach(async () => { await rimraf(dir) }) t.test('fails if unknown file extension', async t => { const filename = path.resolve(__dirname, 'brotli/example.unknown') const f = fs.openSync(filename, 'a') fs.closeSync(f) const expect = new Error( 'TAR_BAD_ARCHIVE: Unrecognized archive format', ) t.throws(() => x({ sync: true, file: filename }), expect) }) t.test('succeeds based on file extension', t => { x({ sync: true, file: file, C: dir }) t.same(fs.readdirSync(dir + '/x').sort(), [ '1', '10', '2', '3', '4', '5', '6', '7', '8', '9', ]) t.end() }) t.test('succeeds when passed explicit option', t => { x({ sync: true, file: file, C: dir, brotli: true }) t.same(fs.readdirSync(dir + '/x').sort(), [ '1', '10', '2', '3', '4', '5', '6', '7', '8', '9', ]) t.end() }) }) t.test('zstd', async t => { const file = path.resolve(__dirname, 'fixtures/example.tzst') const dir = path.resolve(__dirname, 'zstd') t.beforeEach(async () => { await mkdirp(dir) }) t.afterEach(async () => { await rimraf(dir) }) t.test('succeeds based on magic bytes', async t => { // copy the file to a new location with a different extension const unknownExtension = path.resolve( __dirname, 'zstd/example.unknown', ) fs.copyFileSync(file, unknownExtension) x({ sync: true, file: unknownExtension, C: dir }) t.same(fs.readdirSync(dir + '/x').sort(), [ '1', '10', '2', '3', '4', '5', '6', '7', '8', '9', ]) t.end() }) t.test('succeeds based on file extension', t => { x({ sync: true, file: file, C: dir }) t.same(fs.readdirSync(dir + '/x').sort(), [ '1', '10', '2', '3', '4', '5', '6', '7', '8', '9', ]) t.end() }) t.test('succeeds when passed explicit option', t => { x({ sync: true, file: file, C: dir, brotli: true }) t.same(fs.readdirSync(dir + '/x').sort(), [ '1', '10', '2', '3', '4', '5', '6', '7', '8', '9', ]) t.end() }) }) t.test('verify long linkname is not a problem', async t => { // See: https://github.com/isaacs/node-tar/issues/312 const file = path.resolve(__dirname, 'fixtures/long-linkname.tar') t.test('sync', t => { const cwd = t.testdir({}) const result = x({ sync: true, strict: true, file, cwd }) t.equal(result, undefined) t.ok(fs.lstatSync(cwd + '/test').isSymbolicLink()) t.end() }) t.test('async', async t => { await x({ file, C: t.testdir({}), strict: true }) t.ok(fs.lstatSync(t.testdirName + '/test').isSymbolicLink()) }) }) t.test('numeric pax/entry name discernment', t => { const numericName = '12345' const alphaName = 'abcde' for (const strict of [true, false]) { t.test('strict=' + strict, t => { for (const paxName of [numericName, alphaName]) { t.test('paxName=' + paxName, t => { for (const entryName of [numericName, alphaName]) { t.test('entryName=' + entryName, t => { const paxHeader = new Pax( { path: paxName, size: '12345\n'.length, }, false, ) const paxData = paxHeader.encode() const data = makeTar([ paxData, { type: 'File', path: entryName, mode: 0o755, ctime: new Date('2000-01-01T00:00:00.000Z'), mtime: new Date('2000-01-01T00:00:00.000Z'), size: '12345\n'.length, }, '12345\n', '', '', ]) t.test('sync', t => { const dir = t.testdir({ tarFile: data }) x({ strict, sync: true, cwd: dir, file: dir + '/tarFile' }) t.equal( readFileSync(dir + '/' + paxName, 'utf8'), '12345\n', ) t.end() }) t.test('async', async t => { const dir = t.testdir({ tarFile: data }) await x({ strict, cwd: dir, file: dir + '/tarFile' }) t.equal( readFileSync(dir + '/' + paxName, 'utf8'), '12345\n', ) t.end() }) t.end() }) } t.end() }) } t.end() }) t.end() } }) isaacs-node-tar-8a4b548/test/fixtures/000077500000000000000000000000001523070444600176625ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/.gitattributes000066400000000000000000000000251523070444600225520ustar00rootroot00000000000000files/** text eol=lf isaacs-node-tar-8a4b548/test/fixtures/.taprc.win32000066400000000000000000000000641523070444600217350ustar00rootroot00000000000000lines: 98 branches: 98 statements: 98 functions: 98 isaacs-node-tar-8a4b548/test/fixtures/example.tbr000066400000000000000000000003111523070444600220210ustar00rootroot00000000000000ÿO ŽÔaMGRm±jŒz!Û®Ûþ¥@@‚$¹z ón¦Pš… 'žØœQÀ6æï5ö�%xDܼ—hŒh,Eºí�¥¸Ý`¨!G�J‚ðPÌyÉ´—øë¬®Fâÿ¡â…ïßç g™úüôa`™t’-À8¥¬éI%ø¨ÑA¯[¿…‡�µ# �]¡gì ìzbÑÂn,\$_Ù'€W¬fèY;ˆ »‹ž²ƒh`·ÐsÛA\°{#¨ @»� Gò¹�F· isaacs-node-tar-8a4b548/test/fixtures/example.tzst000066400000000000000000000003401523070444600222400ustar00rootroot00000000000000(µ/ýX�’Ȱ'݈"�u˜)!r§$¥¼åÈ#šfl†nÊ¡mE¢T¶RÝUXñÞ°qu^9$Ìž­TÚfsCeIJMÛÒåB8 …OhW¥²W7G¶‰ýQ[þ×¶,'/ °ƒ*ý%<ð«wLE Åü«bLE�¡óDû¨€L�Èý”õ«ŽŒÚñSô¯²1µI(ñWoŒÊ&”ø«7VeJüÕ£² %þêƒ*f€3ôD™Uàfþ |¬³ò û9ÓÑlL^`\õ »u¢�Àisaacs-node-tar-8a4b548/test/fixtures/excessively-deep.tar000066400000000000000000015600001523070444600236520ustar00rootroot00000000000000././@PaxHeader0000000000000000000000000154456400000000000010240 xustar00444762 path=./a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/foo.txt 26 mtime=1707023544.23104 ./a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/0000644000000000000000000000000314557616270023771 0ustar00fooisaacs-node-tar-8a4b548/test/fixtures/files/000077500000000000000000000000001523070444600207645ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/.dotfile000066400000000000000000000000021523070444600224030ustar00rootroot00000000000000. 100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc000066400000000000000000000001441523070444600436110ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/filesccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccisaacs-node-tar-8a4b548/test/fixtures/files/1024-bytes.txt000066400000000000000000000020001523070444600232270ustar00rootroot00000000000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 5a5d18e29413674effba80fa9253094e0c07ee15.paxheader00006660000000000000000000000256152307044460020445xustar00rootroot00000000000000174 path=isaacs-node-tar-8a4b548/test/fixtures/files/120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 5a5d18e29413674effba80fa9253094e0c07ee15.data000066400000000000000000000001441523070444600172770ustar00rootroot00000000000000cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc5a5d18e29413674effba80fa9253094e0c07ee15.paxheader00006660000000000000000000000340152307044460020437xustar00rootroot00000000000000224 path=isaacs-node-tar-8a4b548/test/fixtures/files/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 5a5d18e29413674effba80fa9253094e0c07ee15.data000066400000000000000000000001441523070444600172770ustar00rootroot00000000000000ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccisaacs-node-tar-8a4b548/test/fixtures/files/512-bytes.txt000066400000000000000000000010001523070444600231470ustar00rootroot00000000000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/000077500000000000000000000000001523070444600436325ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/filesa-truly-unlucky-file-beyond-130-byte-path-length.txt000066400000000000000000000010601523070444600553230ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/99-byte-dirname-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccBehold! I am a text file and NOT a tar header. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx some-unlucky-file.txt000066400000000000000000000010601523070444600477400ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/99-byte-dirname-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccBehold! I am a text file and NOT a tar header. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx isaacs-node-tar-8a4b548/test/fixtures/files/dir/000077500000000000000000000000001523070444600215425ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/dir/x000066400000000000000000000000001523070444600217220ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/hardlink-1000066400000000000000000000000321523070444600226340ustar00rootroot00000000000000this link is like diamond isaacs-node-tar-8a4b548/test/fixtures/files/hardlink-2000066400000000000000000000000321523070444600226350ustar00rootroot00000000000000this link is like diamond isaacs-node-tar-8a4b548/test/fixtures/files/long-path/000077500000000000000000000000001523070444600226555ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/000077500000000000000000000000001523070444600231165ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/000077500000000000000000000000001523070444600233425ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/000077500000000000000000000000001523070444600235625ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/000077500000000000000000000000001523070444600240155ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/000077500000000000000000000000001523070444600242505ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/000077500000000000000000000000001523070444600245205ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/000077500000000000000000000000001523070444600246545ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/000077500000000000000000000000001523070444600250775ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/000077500000000000000000000000001523070444600253235ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/000077500000000000000000000000001523070444600255475ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/000077500000000000000000000000001523070444600260065ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/000077500000000000000000000000001523070444600261425ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/000077500000000000000000000000001523070444600263675ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/000077500000000000000000000000001523070444600266255ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/000077500000000000000000000000001523070444600270605ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/000077500000000000000000000000001523070444600273035ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/000077500000000000000000000000001523070444600275275ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/000077500000000000000000000000001523070444600277705ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/000077500000000000000000000000001523070444600301245ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/000077500000000000000000000000001523070444600303635ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/000077500000000000000000000000001523070444600306035ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/000077500000000000000000000000001523070444600310465ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/000077500000000000000000000000001523070444600312755ustar00rootroot00000000000000a.txt000066400000000000000000000000061523070444600321730ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/hshort cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc000066400000000000000000000001441523070444600544730ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111e5a9d5e2742f65d797cb32c0290856afc604b356.paxheader00006660000000000000000000000346152307044460020376xustar00rootroot00000000000000230 path=isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc e5a9d5e2742f65d797cb32c0290856afc604b356.data000066400000000000000000000001441523070444600172300ustar00rootroot0000000000000022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222225a5d18e29413674effba80fa9253094e0c07ee15.paxheader00006660000000000000000000000430152307044460020437xustar00rootroot00000000000000280 path=isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 5a5d18e29413674effba80fa9253094e0c07ee15.data000066400000000000000000000001441523070444600172770ustar00rootroot00000000000000ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccΩ.txt000066400000000000000000000000021523070444600326150ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/hΩc3b17d6c8b29cc71aca2454383b1cf9123b3e172.paxheader00006660000000000000000000000270152307044460020477xustar00rootroot00000000000000184 linkpath=170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc isaacs-node-tar-8a4b548/test/fixtures/files/longlink000077700000000000000000000000001523070444600325572see c3b17d6c8b29cc71aca2454383b1cf9123b3e172.paxheaderustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/one-byte.txt000066400000000000000000000000011523070444600232360ustar00rootroot00000000000000aisaacs-node-tar-8a4b548/test/fixtures/files/strip-dir/000077500000000000000000000000001523070444600227015ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/strip-dir/1/000077500000000000000000000000001523070444600230415ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/strip-dir/1/2/000077500000000000000000000000001523070444600232025ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/strip-dir/1/2/3/000077500000000000000000000000001523070444600233445ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/strip-dir/1/2/3/hardlink-3000066400000000000000000000000321523070444600252160ustar00rootroot00000000000000this link is like diamond isaacs-node-tar-8a4b548/test/fixtures/files/strip-dir/hardlink-1000066400000000000000000000000321523070444600245510ustar00rootroot00000000000000this link is like diamond isaacs-node-tar-8a4b548/test/fixtures/files/strip-dir/hardlink-2000066400000000000000000000000321523070444600245520ustar00rootroot00000000000000this link is like diamond isaacs-node-tar-8a4b548/test/fixtures/files/strip-dir/symlink000077700000000000000000000000001523070444600261632hardlink-2ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/symlink000077700000000000000000000000001523070444600242462hardlink-2ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/zero-byte.txt000066400000000000000000000000001523070444600234330ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/files/Ω.txt000066400000000000000000000000021523070444600223630ustar00rootroot00000000000000Ωisaacs-node-tar-8a4b548/test/fixtures/files/🌟.txt000066400000000000000000000001521523070444600230740ustar00rootroot00000000000000🌟✧✩â­�︎✪✫✬✭✮âš�✯✰✵✶✷✸✹â�‚⭑⭒★☆✡☪✴︎✦✡ï¸�🔯✴ï¸�🌠 isaacs-node-tar-8a4b548/test/fixtures/long-linkname.tar000066400000000000000000000050001523070444600231200ustar00rootroot00000000000000PaxHeader000644 000000 000000 00000000253 14605546654 012721 xPaxHeaderustar00000000 000000 13 path=test 158 linkpath=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaverylongname PaxHeader000644 000000 000000 00000000000 14605546654 012601 2PaxHeaderustar00000000 000000 isaacs-node-tar-8a4b548/test/fixtures/make-tar.js000066400000000000000000000011511523070444600217170ustar00rootroot00000000000000import { Header } from '../../dist/esm/header.js' export const makeTar = chunks => { let dataLen = 0 return Buffer.concat( chunks.map(chunk => { if (Buffer.isBuffer(chunk)) { dataLen += chunk.length return chunk } const size = Math.max( typeof chunk === 'string' ? 512 * Math.ceil(chunk.length / 512) : 512, ) dataLen += size const buf = Buffer.alloc(size) if (typeof chunk === 'string') { buf.write(chunk) } else { new Header(chunk).encode(buf, 0) } return buf }), dataLen, ) } isaacs-node-tar-8a4b548/test/fixtures/make-tar.ts000066400000000000000000000012661523070444600217400ustar00rootroot00000000000000import { Header, HeaderData } from '../../dist/esm/header.js' export type Chunks = (Buffer | string | HeaderData)[] export const makeTar = (chunks: Chunks) => { let dataLen = 0 return Buffer.concat( chunks.map(chunk => { if (Buffer.isBuffer(chunk)) { dataLen += chunk.length return chunk } const size = Math.max( typeof chunk === 'string' ? 512 * Math.ceil(chunk.length / 512) : 512, ) dataLen += size const buf = Buffer.alloc(size) if (typeof chunk === 'string') { buf.write(chunk) } else { new Header(chunk).encode(buf, 0) } return buf }), dataLen, ) } isaacs-node-tar-8a4b548/test/fixtures/parse/000077500000000000000000000000001523070444600207745ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/parse/bad-cksum--filter-strict.json000066400000000000000000000017301523070444600264040ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "error", { "message": "TAR_ENTRY_INVALID: checksum failure", "code": "TAR_ENTRY_INVALID" } ], [ "error", { "message": "TAR_ENTRY_INVALID: checksum failure", "code": "TAR_ENTRY_INVALID" } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/bad-cksum--filter.json000066400000000000000000000015521523070444600251000ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "warn", "TAR_ENTRY_INVALID", "checksum failure" ], [ "warn", "TAR_ENTRY_INVALID", "checksum failure" ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/bad-cksum--meta-250-filter-strict.json000066400000000000000000000017301523070444600276340ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "error", { "message": "TAR_ENTRY_INVALID: checksum failure", "code": "TAR_ENTRY_INVALID" } ], [ "error", { "message": "TAR_ENTRY_INVALID: checksum failure", "code": "TAR_ENTRY_INVALID" } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/bad-cksum--meta-250-filter.json000066400000000000000000000015521523070444600263300ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "warn", "TAR_ENTRY_INVALID", "checksum failure" ], [ "warn", "TAR_ENTRY_INVALID", "checksum failure" ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/bad-cksum--meta-250-strict.json000066400000000000000000000017301523070444600263510ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "error", { "message": "TAR_ENTRY_INVALID: checksum failure", "code": "TAR_ENTRY_INVALID" } ], [ "error", { "message": "TAR_ENTRY_INVALID: checksum failure", "code": "TAR_ENTRY_INVALID" } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/bad-cksum--meta-250.json000066400000000000000000000015521523070444600250450ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "warn", "TAR_ENTRY_INVALID", "checksum failure" ], [ "warn", "TAR_ENTRY_INVALID", "checksum failure" ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/bad-cksum--strict.json000066400000000000000000000017301523070444600251210ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "error", { "message": "TAR_ENTRY_INVALID: checksum failure", "code": "TAR_ENTRY_INVALID" } ], [ "error", { "message": "TAR_ENTRY_INVALID: checksum failure", "code": "TAR_ENTRY_INVALID" } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/bad-cksum.json000066400000000000000000000015521523070444600235400ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "warn", "TAR_ENTRY_INVALID", "checksum failure" ], [ "warn", "TAR_ENTRY_INVALID", "checksum failure" ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/body-byte-counts--filter-strict.json000066400000000000000000000053361523070444600277530ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "header": { "cksumValid": true, "needPax": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "cksum": 6109, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "header": { "cksumValid": true, "needPax": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "cksum": 6064, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "header": { "cksumValid": true, "needPax": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "cksum": 6246, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/body-byte-counts--filter.json000066400000000000000000000053361523070444600264450ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "header": { "cksumValid": true, "needPax": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "cksum": 6109, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "header": { "cksumValid": true, "needPax": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "cksum": 6064, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "header": { "cksumValid": true, "needPax": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "cksum": 6246, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/body-byte-counts--meta-250-filter-strict.json000066400000000000000000000053361523070444600312030ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "header": { "cksumValid": true, "needPax": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "cksum": 6109, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "header": { "cksumValid": true, "needPax": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "cksum": 6064, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "header": { "cksumValid": true, "needPax": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "cksum": 6246, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/body-byte-counts--meta-250-filter.json000066400000000000000000000053361523070444600276750ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "header": { "cksumValid": true, "needPax": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "cksum": 6109, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "header": { "cksumValid": true, "needPax": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "cksum": 6064, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "header": { "cksumValid": true, "needPax": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "cksum": 6246, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/body-byte-counts--meta-250-strict.json000066400000000000000000000053141523070444600277140ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "header": { "cksumValid": true, "needPax": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "cksum": 6109, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "header": { "cksumValid": true, "needPax": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "cksum": 6064, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "header": { "cksumValid": true, "needPax": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "cksum": 6246, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/body-byte-counts--meta-250.json000066400000000000000000000053141523070444600264060ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "header": { "cksumValid": true, "needPax": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "cksum": 6109, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "header": { "cksumValid": true, "needPax": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "cksum": 6064, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "header": { "cksumValid": true, "needPax": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "cksum": 6246, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/body-byte-counts--strict.json000066400000000000000000000053141523070444600264640ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "header": { "cksumValid": true, "needPax": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "cksum": 6109, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "header": { "cksumValid": true, "needPax": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "cksum": 6064, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "header": { "cksumValid": true, "needPax": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "cksum": 6246, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/body-byte-counts.json000066400000000000000000000053141523070444600251010ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "header": { "cksumValid": true, "needPax": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "cksum": 6109, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "header": { "cksumValid": true, "needPax": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "cksum": 6064, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "header": { "cksumValid": true, "needPax": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "cksum": 6246, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/dir--filter-strict.json000066400000000000000000000013331523070444600253130ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "header": { "cksumValid": true, "needPax": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "cksum": 5284, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/dir--filter.json000066400000000000000000000013331523070444600240050ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "header": { "cksumValid": true, "needPax": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "cksum": 5284, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/dir--meta-250-filter-strict.json000066400000000000000000000013331523070444600265430ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "header": { "cksumValid": true, "needPax": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "cksum": 5284, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/dir--meta-250-filter.json000066400000000000000000000013331523070444600252350ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "header": { "cksumValid": true, "needPax": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "cksum": 5284, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/dir--meta-250-strict.json000066400000000000000000000013251523070444600252610ustar00rootroot00000000000000[ [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "header": { "cksumValid": true, "needPax": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "cksum": 5284, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/dir--meta-250.json000066400000000000000000000013251523070444600237530ustar00rootroot00000000000000[ [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "header": { "cksumValid": true, "needPax": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "cksum": 5284, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/dir--strict.json000066400000000000000000000013251523070444600240310ustar00rootroot00000000000000[ [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "header": { "cksumValid": true, "needPax": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "cksum": 5284, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/dir.json000066400000000000000000000013251523070444600224460ustar00rootroot00000000000000[ [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "header": { "cksumValid": true, "needPax": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "cksum": 5284, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/emptypax--filter-strict.json000066400000000000000000000034101523070444600264020ustar00rootroot00000000000000[ [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:33:21.000Z", "dev": 16777220, "ino": 9836716, "nlink": 1, "path": "🌟.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:33:21.000Z", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/emptypax--filter.json000066400000000000000000000034101523070444600250740ustar00rootroot00000000000000[ [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:33:21.000Z", "dev": 16777220, "ino": 9836716, "nlink": 1, "path": "🌟.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:33:21.000Z", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/emptypax--meta-250-filter-strict.json000066400000000000000000000034101523070444600276320ustar00rootroot00000000000000[ [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:33:21.000Z", "dev": 16777220, "ino": 9836716, "nlink": 1, "path": "🌟.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:33:21.000Z", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/emptypax--meta-250-filter.json000066400000000000000000000034101523070444600263240ustar00rootroot00000000000000[ [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:33:21.000Z", "dev": 16777220, "ino": 9836716, "nlink": 1, "path": "🌟.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:33:21.000Z", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/emptypax--meta-250-strict.json000066400000000000000000000034021523070444600263500ustar00rootroot00000000000000[ [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:33:21.000Z", "dev": 16777220, "ino": 9836716, "nlink": 1, "path": "🌟.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:33:21.000Z", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/emptypax--meta-250.json000066400000000000000000000034021523070444600250420ustar00rootroot00000000000000[ [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:33:21.000Z", "dev": 16777220, "ino": 9836716, "nlink": 1, "path": "🌟.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:33:21.000Z", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/emptypax--strict.json000066400000000000000000000034021523070444600251200ustar00rootroot00000000000000[ [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:33:21.000Z", "dev": 16777220, "ino": 9836716, "nlink": 1, "path": "🌟.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:33:21.000Z", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/emptypax.json000066400000000000000000000034021523070444600235350ustar00rootroot00000000000000[ [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:33:21.000Z", "dev": 16777220, "ino": 9836716, "nlink": 1, "path": "🌟.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:33:21.000Z", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/file--filter-strict.json000066400000000000000000000013401523070444600254520ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/file--filter.json000066400000000000000000000013401523070444600241440ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/file--meta-250-filter-strict.json000066400000000000000000000013401523070444600267020ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/file--meta-250-filter.json000066400000000000000000000013401523070444600253740ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/file--meta-250-strict.json000066400000000000000000000013401523070444600254170ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/file--meta-250.json000066400000000000000000000013401523070444600241110ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/file--strict.json000066400000000000000000000013401523070444600241670ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/file.json000066400000000000000000000013401523070444600226040ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/global-header--filter-strict.json000066400000000000000000000015301523070444600272220ustar00rootroot00000000000000[ [ "meta", "11 path=ab\n" ], [ "entry", { "globalExtended": { "path": "ab", "global": true }, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/global-header--filter.json000066400000000000000000000015301523070444600257140ustar00rootroot00000000000000[ [ "meta", "11 path=ab\n" ], [ "entry", { "globalExtended": { "path": "ab", "global": true }, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/global-header--meta-250-filter-strict.json000066400000000000000000000015301523070444600304520ustar00rootroot00000000000000[ [ "meta", "11 path=ab\n" ], [ "entry", { "globalExtended": { "path": "ab", "global": true }, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/global-header--meta-250-filter.json000066400000000000000000000015301523070444600271440ustar00rootroot00000000000000[ [ "meta", "11 path=ab\n" ], [ "entry", { "globalExtended": { "path": "ab", "global": true }, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/global-header--meta-250-strict.json000066400000000000000000000015301523070444600271670ustar00rootroot00000000000000[ [ "meta", "11 path=ab\n" ], [ "entry", { "globalExtended": { "path": "ab", "global": true }, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/global-header--meta-250.json000066400000000000000000000015301523070444600256610ustar00rootroot00000000000000[ [ "meta", "11 path=ab\n" ], [ "entry", { "globalExtended": { "path": "ab", "global": true }, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/global-header--strict.json000066400000000000000000000015301523070444600257370ustar00rootroot00000000000000[ [ "meta", "11 path=ab\n" ], [ "entry", { "globalExtended": { "path": "ab", "global": true }, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/global-header.json000066400000000000000000000015301523070444600243540ustar00rootroot00000000000000[ [ "meta", "11 path=ab\n" ], [ "entry", { "globalExtended": { "path": "ab", "global": true }, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links--filter-strict.json000066400000000000000000000041721523070444600256610ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5856, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Link", "meta": false, "ignore": true, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "linkpath": "hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 6792, "linkpath": "hardlink-1", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "SymbolicLink", "meta": false, "ignore": true, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links--filter.json000066400000000000000000000041721523070444600243530ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5856, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Link", "meta": false, "ignore": true, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "linkpath": "hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 6792, "linkpath": "hardlink-1", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "SymbolicLink", "meta": false, "ignore": true, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links--meta-250-filter-strict.json000066400000000000000000000041721523070444600271110ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5856, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Link", "meta": false, "ignore": true, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "linkpath": "hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 6792, "linkpath": "hardlink-1", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "SymbolicLink", "meta": false, "ignore": true, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links--meta-250-filter.json000066400000000000000000000041721523070444600256030ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5856, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Link", "meta": false, "ignore": true, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "linkpath": "hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 6792, "linkpath": "hardlink-1", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "SymbolicLink", "meta": false, "ignore": true, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links--meta-250-strict.json000066400000000000000000000041501523070444600256220ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5856, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Link", "meta": false, "ignore": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "linkpath": "hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 6792, "linkpath": "hardlink-1", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "SymbolicLink", "meta": false, "ignore": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links--meta-250.json000066400000000000000000000041501523070444600243140ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5856, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Link", "meta": false, "ignore": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "linkpath": "hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 6792, "linkpath": "hardlink-1", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "SymbolicLink", "meta": false, "ignore": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links--strict.json000066400000000000000000000041501523070444600243720ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5856, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Link", "meta": false, "ignore": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "linkpath": "hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 6792, "linkpath": "hardlink-1", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "SymbolicLink", "meta": false, "ignore": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links-invalid--filter-strict.json000066400000000000000000000022051523070444600273000ustar00rootroot00000000000000[ [ "error", { "message": "TAR_ENTRY_INVALID: linkpath forbidden", "code": "TAR_ENTRY_INVALID" } ], [ "error", { "message": "TAR_ENTRY_INVALID: checksum failure", "code": "TAR_ENTRY_INVALID" } ], [ "error", { "message": "TAR_ENTRY_INVALID: linkpath required", "code": "TAR_ENTRY_INVALID" } ], [ "ignoredEntry", { "type": "SymbolicLink", "meta": false, "ignore": true, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links-invalid--filter.json000066400000000000000000000017401523070444600257750ustar00rootroot00000000000000[ [ "warn", "TAR_ENTRY_INVALID", "linkpath forbidden" ], [ "warn", "TAR_ENTRY_INVALID", "checksum failure" ], [ "warn", "TAR_ENTRY_INVALID", "linkpath required" ], [ "ignoredEntry", { "type": "SymbolicLink", "meta": false, "ignore": true, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links-invalid--meta-250-filter-strict.json000066400000000000000000000022051523070444600305300ustar00rootroot00000000000000[ [ "error", { "message": "TAR_ENTRY_INVALID: linkpath forbidden", "code": "TAR_ENTRY_INVALID" } ], [ "error", { "message": "TAR_ENTRY_INVALID: checksum failure", "code": "TAR_ENTRY_INVALID" } ], [ "error", { "message": "TAR_ENTRY_INVALID: linkpath required", "code": "TAR_ENTRY_INVALID" } ], [ "ignoredEntry", { "type": "SymbolicLink", "meta": false, "ignore": true, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links-invalid--meta-250-filter.json000066400000000000000000000017401523070444600272250ustar00rootroot00000000000000[ [ "warn", "TAR_ENTRY_INVALID", "linkpath forbidden" ], [ "warn", "TAR_ENTRY_INVALID", "checksum failure" ], [ "warn", "TAR_ENTRY_INVALID", "linkpath required" ], [ "ignoredEntry", { "type": "SymbolicLink", "meta": false, "ignore": true, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links-invalid--meta-250-strict.json000066400000000000000000000021771523070444600272550ustar00rootroot00000000000000[ [ "error", { "message": "TAR_ENTRY_INVALID: linkpath forbidden", "code": "TAR_ENTRY_INVALID" } ], [ "error", { "message": "TAR_ENTRY_INVALID: checksum failure", "code": "TAR_ENTRY_INVALID" } ], [ "error", { "message": "TAR_ENTRY_INVALID: linkpath required", "code": "TAR_ENTRY_INVALID" } ], [ "entry", { "type": "SymbolicLink", "meta": false, "ignore": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links-invalid--meta-250.json000066400000000000000000000017321523070444600257430ustar00rootroot00000000000000[ [ "warn", "TAR_ENTRY_INVALID", "linkpath forbidden" ], [ "warn", "TAR_ENTRY_INVALID", "checksum failure" ], [ "warn", "TAR_ENTRY_INVALID", "linkpath required" ], [ "entry", { "type": "SymbolicLink", "meta": false, "ignore": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links-invalid--strict.json000066400000000000000000000021771523070444600260250ustar00rootroot00000000000000[ [ "error", { "message": "TAR_ENTRY_INVALID: linkpath forbidden", "code": "TAR_ENTRY_INVALID" } ], [ "error", { "message": "TAR_ENTRY_INVALID: checksum failure", "code": "TAR_ENTRY_INVALID" } ], [ "error", { "message": "TAR_ENTRY_INVALID: linkpath required", "code": "TAR_ENTRY_INVALID" } ], [ "entry", { "type": "SymbolicLink", "meta": false, "ignore": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links-invalid.json000066400000000000000000000017321523070444600244360ustar00rootroot00000000000000[ [ "warn", "TAR_ENTRY_INVALID", "linkpath forbidden" ], [ "warn", "TAR_ENTRY_INVALID", "checksum failure" ], [ "warn", "TAR_ENTRY_INVALID", "linkpath required" ], [ "entry", { "type": "SymbolicLink", "meta": false, "ignore": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links-strip--filter-strict.json000066400000000000000000000066651523070444600270310ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 4708, "linkpath": "", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 26, "mtime": "2018-11-06T01:45:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 0, "gid": 0, "size": 26, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 5644, "linkpath": "", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Link", "meta": false, "ignore": true, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 7553, "linkpath": "strip-dir/hardlink-1", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Link", "meta": false, "ignore": true, "path": "strip-dir/1/2/3/hardlink-3", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/1/2/3/hardlink-3", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 7845, "linkpath": "strip-dir/hardlink-1", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "SymbolicLink", "meta": false, "ignore": true, "path": "strip-dir/symlink", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/symlink", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 6417, "linkpath": "hardlink-2", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links-strip--filter.json000066400000000000000000000066651523070444600255230ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 4708, "linkpath": "", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 26, "mtime": "2018-11-06T01:45:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 0, "gid": 0, "size": 26, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 5644, "linkpath": "", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Link", "meta": false, "ignore": true, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 7553, "linkpath": "strip-dir/hardlink-1", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Link", "meta": false, "ignore": true, "path": "strip-dir/1/2/3/hardlink-3", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/1/2/3/hardlink-3", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 7845, "linkpath": "strip-dir/hardlink-1", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "SymbolicLink", "meta": false, "ignore": true, "path": "strip-dir/symlink", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/symlink", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 6417, "linkpath": "hardlink-2", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links-strip--meta-250-filter-strict.json000066400000000000000000000066651523070444600302610ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 4708, "linkpath": "", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 26, "mtime": "2018-11-06T01:45:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 0, "gid": 0, "size": 26, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 5644, "linkpath": "", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Link", "meta": false, "ignore": true, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 7553, "linkpath": "strip-dir/hardlink-1", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Link", "meta": false, "ignore": true, "path": "strip-dir/1/2/3/hardlink-3", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/1/2/3/hardlink-3", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 7845, "linkpath": "strip-dir/hardlink-1", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "SymbolicLink", "meta": false, "ignore": true, "path": "strip-dir/symlink", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/symlink", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 6417, "linkpath": "hardlink-2", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links-strip--meta-250-filter.json000066400000000000000000000066651523070444600267530ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 4708, "linkpath": "", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 26, "mtime": "2018-11-06T01:45:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 0, "gid": 0, "size": 26, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 5644, "linkpath": "", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Link", "meta": false, "ignore": true, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 7553, "linkpath": "strip-dir/hardlink-1", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Link", "meta": false, "ignore": true, "path": "strip-dir/1/2/3/hardlink-3", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/1/2/3/hardlink-3", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 7845, "linkpath": "strip-dir/hardlink-1", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "SymbolicLink", "meta": false, "ignore": true, "path": "strip-dir/symlink", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/symlink", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 6417, "linkpath": "hardlink-2", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links-strip--meta-250-strict.json000066400000000000000000000066271523070444600267740ustar00rootroot00000000000000[ [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 4708, "linkpath": "", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 26, "mtime": "2018-11-06T01:45:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 0, "gid": 0, "size": 26, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 5644, "linkpath": "", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Link", "meta": false, "ignore": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 7553, "linkpath": "strip-dir/hardlink-1", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Link", "meta": false, "ignore": false, "path": "strip-dir/1/2/3/hardlink-3", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/1/2/3/hardlink-3", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 7845, "linkpath": "strip-dir/hardlink-1", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "SymbolicLink", "meta": false, "ignore": false, "path": "strip-dir/symlink", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/symlink", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 6417, "linkpath": "hardlink-2", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links-strip--meta-250.json000066400000000000000000000066271523070444600254660ustar00rootroot00000000000000[ [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 4708, "linkpath": "", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 26, "mtime": "2018-11-06T01:45:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 0, "gid": 0, "size": 26, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 5644, "linkpath": "", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Link", "meta": false, "ignore": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 7553, "linkpath": "strip-dir/hardlink-1", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Link", "meta": false, "ignore": false, "path": "strip-dir/1/2/3/hardlink-3", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/1/2/3/hardlink-3", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 7845, "linkpath": "strip-dir/hardlink-1", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "SymbolicLink", "meta": false, "ignore": false, "path": "strip-dir/symlink", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/symlink", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 6417, "linkpath": "hardlink-2", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links-strip--strict.json000066400000000000000000000066271523070444600255440ustar00rootroot00000000000000[ [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 4708, "linkpath": "", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 26, "mtime": "2018-11-06T01:45:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 0, "gid": 0, "size": 26, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 5644, "linkpath": "", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Link", "meta": false, "ignore": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 7553, "linkpath": "strip-dir/hardlink-1", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Link", "meta": false, "ignore": false, "path": "strip-dir/1/2/3/hardlink-3", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/1/2/3/hardlink-3", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 7845, "linkpath": "strip-dir/hardlink-1", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "SymbolicLink", "meta": false, "ignore": false, "path": "strip-dir/symlink", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/symlink", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 6417, "linkpath": "hardlink-2", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links-strip.json000066400000000000000000000066271523070444600241610ustar00rootroot00000000000000[ [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 4708, "linkpath": "", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 26, "mtime": "2018-11-06T01:45:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 0, "gid": 0, "size": 26, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 5644, "linkpath": "", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Link", "meta": false, "ignore": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 7553, "linkpath": "strip-dir/hardlink-1", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Link", "meta": false, "ignore": false, "path": "strip-dir/1/2/3/hardlink-3", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/1/2/3/hardlink-3", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 7845, "linkpath": "strip-dir/hardlink-1", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "SymbolicLink", "meta": false, "ignore": false, "path": "strip-dir/symlink", "mode": 420, "uid": 0, "gid": 0, "uname": "", "gname": "", "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/symlink", "mode": 420, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-11-06T01:45:25.000Z", "cksum": 6417, "linkpath": "hardlink-2", "uname": "", "gname": "", "devmaj": 0, "devmin": 0 } } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/links.json000066400000000000000000000041501523070444600230070ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5856, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Link", "meta": false, "ignore": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "linkpath": "hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 6792, "linkpath": "hardlink-1", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "SymbolicLink", "meta": false, "ignore": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/long-paths--filter-strict.json000066400000000000000000000672261523070444600266260ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "header": { "cksumValid": true, "needPax": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "cksum": 14592, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836297, "nlink": 1, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "180 path=170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843378\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836326\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836326, "nlink": 1, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 5870, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6031, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6179, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6323, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6478, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6633, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6801, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6893, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7040, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7188, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7336, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7587, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7736, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7894, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8049, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8196, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8344, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8505, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8597, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8756, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8900, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 9063, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9223, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "cksum": 9714, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19068, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "186 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836253\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836253, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18969, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "236 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836254\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836254, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 20019, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:07:25.000Z", "dev": 16777220, "ino": 9836396, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:07:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/long-paths--filter.json000066400000000000000000000672261523070444600253200ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "header": { "cksumValid": true, "needPax": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "cksum": 14592, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836297, "nlink": 1, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "180 path=170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843378\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836326\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836326, "nlink": 1, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 5870, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6031, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6179, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6323, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6478, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6633, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6801, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6893, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7040, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7188, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7336, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7587, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7736, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7894, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8049, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8196, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8344, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8505, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8597, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8756, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8900, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 9063, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9223, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "cksum": 9714, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19068, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "186 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836253\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836253, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18969, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "236 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836254\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836254, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 20019, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:07:25.000Z", "dev": 16777220, "ino": 9836396, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:07:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/long-paths--meta-250-filter-strict.json000066400000000000000000000673671523070444600300640ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "header": { "cksumValid": true, "needPax": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "cksum": 14592, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836297, "nlink": 1, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 283, "mtime": "2017-04-10T16:56:18.000Z", "header": { "cksumValid": true, "needPax": false, "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 283, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14413, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 5870, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6031, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6179, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6323, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6478, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6633, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6801, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6893, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7040, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7188, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7336, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7587, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7736, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7894, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8049, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8196, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8344, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8505, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8597, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8756, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8900, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 9063, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9223, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "cksum": 9714, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19068, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 289, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 289, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18881, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18969, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 339, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 339, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19932, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 20019, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:07:25.000Z", "dev": 16777220, "ino": 9836396, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:07:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/long-paths--meta-250-filter.json000066400000000000000000000673671523070444600265560ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "header": { "cksumValid": true, "needPax": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "cksum": 14592, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836297, "nlink": 1, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 283, "mtime": "2017-04-10T16:56:18.000Z", "header": { "cksumValid": true, "needPax": false, "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 283, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14413, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 5870, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6031, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6179, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6323, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6478, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6633, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6801, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6893, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7040, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7188, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7336, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7587, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7736, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7894, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8049, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8196, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8344, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8505, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8597, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8756, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8900, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 9063, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9223, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "cksum": 9714, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19068, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 289, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 289, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18881, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18969, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 339, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 339, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19932, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 20019, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:07:25.000Z", "dev": 16777220, "ino": 9836396, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:07:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/long-paths--meta-250-strict.json000066400000000000000000000670671523070444600265760ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "header": { "cksumValid": true, "needPax": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "cksum": 14592, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836297, "nlink": 1, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 283, "mtime": "2017-04-10T16:56:18.000Z", "header": { "cksumValid": true, "needPax": false, "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 283, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14413, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 5870, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6031, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6179, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6323, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6478, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6633, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6801, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6893, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7040, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7188, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7336, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7587, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7736, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7894, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8049, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8196, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8344, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8505, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8597, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8756, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8900, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 9063, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9223, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "cksum": 9714, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19068, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 289, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 289, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18881, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18969, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 339, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 339, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19932, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 20019, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:07:25.000Z", "dev": 16777220, "ino": 9836396, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:07:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/long-paths--meta-250.json000066400000000000000000000670671523070444600252700ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "header": { "cksumValid": true, "needPax": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "cksum": 14592, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836297, "nlink": 1, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 283, "mtime": "2017-04-10T16:56:18.000Z", "header": { "cksumValid": true, "needPax": false, "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 283, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14413, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 5870, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6031, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6179, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6323, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6478, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6633, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6801, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6893, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7040, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7188, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7336, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7587, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7736, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7894, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8049, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8196, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8344, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8505, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8597, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8756, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8900, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 9063, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9223, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "cksum": 9714, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19068, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 289, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 289, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18881, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18969, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 339, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 339, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19932, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 20019, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:07:25.000Z", "dev": 16777220, "ino": 9836396, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:07:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/long-paths--strict.json000066400000000000000000000667261523070444600253470ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "header": { "cksumValid": true, "needPax": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "cksum": 14592, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836297, "nlink": 1, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "180 path=170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843378\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836326\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836326, "nlink": 1, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 5870, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6031, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6179, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6323, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6478, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6633, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6801, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6893, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7040, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7188, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7336, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7587, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7736, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7894, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8049, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8196, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8344, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8505, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8597, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8756, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8900, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 9063, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9223, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "cksum": 9714, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19068, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "186 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836253\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836253, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18969, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "236 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836254\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836254, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 20019, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:07:25.000Z", "dev": 16777220, "ino": 9836396, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:07:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/long-paths.json000066400000000000000000000667261523070444600237640ustar00rootroot00000000000000[ [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "header": { "cksumValid": true, "needPax": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "cksum": 14592, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836297, "nlink": 1, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "180 path=170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843378\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836326\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836326, "nlink": 1, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 5870, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6031, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6179, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6323, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6478, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6633, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6801, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6893, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7040, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7188, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7336, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7587, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7736, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7894, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8049, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8196, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8344, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8505, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8597, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8756, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8900, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 9063, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9223, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "cksum": 9714, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19068, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "186 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836253\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836253, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18969, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "236 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836254\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "dev": 16777220, "ino": 9836254, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": "2017-04-10T17:01:57.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 20019, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:07:25.000Z", "dev": 16777220, "ino": 9836396, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:07:25.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/long-pax--filter-strict.json000066400000000000000000000071221523070444600262640ustar00rootroot00000000000000[ [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n1069 comment=all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy\n9 gid=20\n15 gname=staff\n20 mtime=1491843252\n12 size=100\n11 uid=501\n16 uname=isaacs\n" ], [ "ignoredEntry", { "extended": { "mtime": "2017-04-10T16:54:12.000Z", "comment": "all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy", "gid": 20, "uid": 501, "gname": "staff", "uname": "isaacs", "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": 100, "global": false }, "type": "File", "meta": false, "ignore": true, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/long-pax--filter.json000066400000000000000000000071221523070444600247560ustar00rootroot00000000000000[ [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n1069 comment=all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy\n9 gid=20\n15 gname=staff\n20 mtime=1491843252\n12 size=100\n11 uid=501\n16 uname=isaacs\n" ], [ "ignoredEntry", { "extended": { "mtime": "2017-04-10T16:54:12.000Z", "comment": "all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy", "gid": 20, "uid": 501, "gname": "staff", "uname": "isaacs", "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": 100, "global": false }, "type": "File", "meta": false, "ignore": true, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/long-pax--meta-250-filter-strict.json000066400000000000000000000033171523070444600275160ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1282, "mtime": "2017-04-10T16:54:12.000Z", "header": { "cksumValid": true, "needPax": false, "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 1282, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14425, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/long-pax--meta-250-filter.json000066400000000000000000000033171523070444600262100ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1282, "mtime": "2017-04-10T16:54:12.000Z", "header": { "cksumValid": true, "needPax": false, "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 1282, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14425, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "ignoredEntry", { "type": "File", "meta": false, "ignore": true, "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/long-pax--meta-250-strict.json000066400000000000000000000033111523070444600262250ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1282, "mtime": "2017-04-10T16:54:12.000Z", "header": { "cksumValid": true, "needPax": false, "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 1282, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14425, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/long-pax--meta-250.json000066400000000000000000000033111523070444600247170ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1282, "mtime": "2017-04-10T16:54:12.000Z", "header": { "cksumValid": true, "needPax": false, "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 1282, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14425, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "entry", { "type": "File", "meta": false, "ignore": false, "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/long-pax--strict.json000066400000000000000000000071141523070444600250020ustar00rootroot00000000000000[ [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n1069 comment=all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy\n9 gid=20\n15 gname=staff\n20 mtime=1491843252\n12 size=100\n11 uid=501\n16 uname=isaacs\n" ], [ "entry", { "extended": { "mtime": "2017-04-10T16:54:12.000Z", "comment": "all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy", "gid": 20, "uid": 501, "gname": "staff", "uname": "isaacs", "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": 100, "global": false }, "type": "File", "meta": false, "ignore": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/long-pax.json000066400000000000000000000071141523070444600234170ustar00rootroot00000000000000[ [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n1069 comment=all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy\n9 gid=20\n15 gname=staff\n20 mtime=1491843252\n12 size=100\n11 uid=501\n16 uname=isaacs\n" ], [ "entry", { "extended": { "mtime": "2017-04-10T16:54:12.000Z", "comment": "all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy", "gid": 20, "uid": 501, "gname": "staff", "uname": "isaacs", "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": 100, "global": false }, "type": "File", "meta": false, "ignore": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/next-file-has-long--filter-strict.json000066400000000000000000000053371523070444600301460ustar00rootroot00000000000000[ [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "ignoredEntry", { "extended": { "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "type": "File", "meta": false, "ignore": true, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "ignoredEntry", { "extended": { "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "header": { "cksumValid": true, "needPax": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "cksum": 7135, "linkpath": "././@LongSymLink", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/next-file-has-long--filter.json000066400000000000000000000053371523070444600266400ustar00rootroot00000000000000[ [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "ignoredEntry", { "extended": { "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "type": "File", "meta": false, "ignore": true, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "ignoredEntry", { "extended": { "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "header": { "cksumValid": true, "needPax": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "cksum": 7135, "linkpath": "././@LongSymLink", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/next-file-has-long--meta-250-filter-strict.json000066400000000000000000000053371523070444600313760ustar00rootroot00000000000000[ [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "ignoredEntry", { "extended": { "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "type": "File", "meta": false, "ignore": true, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "ignoredEntry", { "extended": { "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "header": { "cksumValid": true, "needPax": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "cksum": 7135, "linkpath": "././@LongSymLink", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/next-file-has-long--meta-250-filter.json000066400000000000000000000053371523070444600300700ustar00rootroot00000000000000[ [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "ignoredEntry", { "extended": { "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "type": "File", "meta": false, "ignore": true, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "ignoredEntry", { "extended": { "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "header": { "cksumValid": true, "needPax": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "cksum": 7135, "linkpath": "././@LongSymLink", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/next-file-has-long--meta-250-strict.json000066400000000000000000000053231523070444600301060ustar00rootroot00000000000000[ [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "entry", { "extended": { "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "type": "File", "meta": false, "ignore": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "entry", { "extended": { "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "header": { "cksumValid": true, "needPax": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "cksum": 7135, "linkpath": "././@LongSymLink", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/next-file-has-long--meta-250.json000066400000000000000000000053231523070444600266000ustar00rootroot00000000000000[ [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "entry", { "extended": { "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "type": "File", "meta": false, "ignore": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "entry", { "extended": { "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "header": { "cksumValid": true, "needPax": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "cksum": 7135, "linkpath": "././@LongSymLink", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/next-file-has-long--strict.json000066400000000000000000000053231523070444600266560ustar00rootroot00000000000000[ [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "entry", { "extended": { "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "type": "File", "meta": false, "ignore": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "entry", { "extended": { "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "header": { "cksumValid": true, "needPax": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "cksum": 7135, "linkpath": "././@LongSymLink", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/next-file-has-long.json000066400000000000000000000053231523070444600252730ustar00rootroot00000000000000[ [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "entry", { "extended": { "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "type": "File", "meta": false, "ignore": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "entry", { "extended": { "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "header": { "cksumValid": true, "needPax": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "cksum": 7135, "linkpath": "././@LongSymLink", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/null-byte--filter-strict.json000066400000000000000000000035271523070444600264570ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "cksum": 11228, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" ], [ "ignoredEntry", { "extended": { "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" }, "type": "File", "meta": false, "ignore": true, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "cksum": 15210, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/null-byte--filter.json000066400000000000000000000035271523070444600251510ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "cksum": 11228, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" ], [ "ignoredEntry", { "extended": { "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" }, "type": "File", "meta": false, "ignore": true, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "cksum": 15210, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/null-byte--meta-250-filter-strict.json000066400000000000000000000035271523070444600277070ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "cksum": 11228, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" ], [ "ignoredEntry", { "extended": { "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" }, "type": "File", "meta": false, "ignore": true, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "cksum": 15210, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/null-byte--meta-250-filter.json000066400000000000000000000035271523070444600264010ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "cksum": 11228, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" ], [ "ignoredEntry", { "extended": { "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" }, "type": "File", "meta": false, "ignore": true, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "cksum": 15210, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/null-byte--meta-250-strict.json000066400000000000000000000035131523070444600264170ustar00rootroot00000000000000[ [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "cksum": 11228, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" ], [ "entry", { "extended": { "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" }, "type": "File", "meta": false, "ignore": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "cksum": 15210, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/null-byte--meta-250.json000066400000000000000000000035131523070444600251110ustar00rootroot00000000000000[ [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "cksum": 11228, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" ], [ "entry", { "extended": { "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" }, "type": "File", "meta": false, "ignore": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "cksum": 15210, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/null-byte--strict.json000066400000000000000000000035131523070444600251670ustar00rootroot00000000000000[ [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "cksum": 11228, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" ], [ "entry", { "extended": { "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" }, "type": "File", "meta": false, "ignore": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "cksum": 15210, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/null-byte.json000066400000000000000000000035131523070444600236040ustar00rootroot00000000000000[ [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "cksum": 11228, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" ], [ "entry", { "extended": { "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" }, "type": "File", "meta": false, "ignore": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "cksum": 15210, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/path-missing--filter-strict.json000066400000000000000000000006751523070444600271500ustar00rootroot00000000000000[ [ "error", { "message": "TAR_ENTRY_INVALID: path is required", "code": "TAR_ENTRY_INVALID" } ], [ "error", { "message": "TAR_ENTRY_INVALID: checksum failure", "code": "TAR_ENTRY_INVALID" } ], [ "nullBlock" ], [ "eof" ], [ "error", { "message": "TAR_BAD_ARCHIVE: Unrecognized archive format", "code": "TAR_BAD_ARCHIVE" } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/path-missing--filter.json000066400000000000000000000004321523070444600256310ustar00rootroot00000000000000[ [ "warn", "TAR_ENTRY_INVALID", "path is required" ], [ "warn", "TAR_ENTRY_INVALID", "checksum failure" ], [ "nullBlock" ], [ "eof" ], [ "warn", "TAR_BAD_ARCHIVE", "Unrecognized archive format" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/path-missing--meta-250-filter-strict.json000066400000000000000000000006751523070444600304000ustar00rootroot00000000000000[ [ "error", { "message": "TAR_ENTRY_INVALID: path is required", "code": "TAR_ENTRY_INVALID" } ], [ "error", { "message": "TAR_ENTRY_INVALID: checksum failure", "code": "TAR_ENTRY_INVALID" } ], [ "nullBlock" ], [ "eof" ], [ "error", { "message": "TAR_BAD_ARCHIVE: Unrecognized archive format", "code": "TAR_BAD_ARCHIVE" } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/path-missing--meta-250-filter.json000066400000000000000000000004321523070444600270610ustar00rootroot00000000000000[ [ "warn", "TAR_ENTRY_INVALID", "path is required" ], [ "warn", "TAR_ENTRY_INVALID", "checksum failure" ], [ "nullBlock" ], [ "eof" ], [ "warn", "TAR_BAD_ARCHIVE", "Unrecognized archive format" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/path-missing--meta-250-strict.json000066400000000000000000000006751523070444600271150ustar00rootroot00000000000000[ [ "error", { "message": "TAR_ENTRY_INVALID: path is required", "code": "TAR_ENTRY_INVALID" } ], [ "error", { "message": "TAR_ENTRY_INVALID: checksum failure", "code": "TAR_ENTRY_INVALID" } ], [ "nullBlock" ], [ "eof" ], [ "error", { "message": "TAR_BAD_ARCHIVE: Unrecognized archive format", "code": "TAR_BAD_ARCHIVE" } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/path-missing--meta-250.json000066400000000000000000000004321523070444600255760ustar00rootroot00000000000000[ [ "warn", "TAR_ENTRY_INVALID", "path is required" ], [ "warn", "TAR_ENTRY_INVALID", "checksum failure" ], [ "nullBlock" ], [ "eof" ], [ "warn", "TAR_BAD_ARCHIVE", "Unrecognized archive format" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/path-missing--strict.json000066400000000000000000000006751523070444600256650ustar00rootroot00000000000000[ [ "error", { "message": "TAR_ENTRY_INVALID: path is required", "code": "TAR_ENTRY_INVALID" } ], [ "error", { "message": "TAR_ENTRY_INVALID: checksum failure", "code": "TAR_ENTRY_INVALID" } ], [ "nullBlock" ], [ "eof" ], [ "error", { "message": "TAR_BAD_ARCHIVE: Unrecognized archive format", "code": "TAR_BAD_ARCHIVE" } ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/path-missing.json000066400000000000000000000004321523070444600242710ustar00rootroot00000000000000[ [ "warn", "TAR_ENTRY_INVALID", "path is required" ], [ "warn", "TAR_ENTRY_INVALID", "checksum failure" ], [ "nullBlock" ], [ "eof" ], [ "warn", "TAR_BAD_ARCHIVE", "Unrecognized archive format" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/trailing-slash-corner-case--filter-strict.json000066400000000000000000000061641523070444600316640ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13612, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" ], [ "ignoredEntry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" }, "type": "File", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13611, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" ], [ "ignoredEntry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" }, "type": "File", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "cksum": 13602, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/trailing-slash-corner-case--filter.json000066400000000000000000000061641523070444600303560ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13612, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" ], [ "ignoredEntry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" }, "type": "File", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13611, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" ], [ "ignoredEntry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" }, "type": "File", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "cksum": 13602, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/trailing-slash-corner-case--meta-250-filter-strict.json000066400000000000000000000061641523070444600331140ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13612, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" ], [ "ignoredEntry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" }, "type": "File", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13611, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" ], [ "ignoredEntry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" }, "type": "File", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "cksum": 13602, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/trailing-slash-corner-case--meta-250-filter.json000066400000000000000000000061641523070444600316060ustar00rootroot00000000000000[ [ "ignoredEntry", { "type": "Directory", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13612, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" ], [ "ignoredEntry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" }, "type": "File", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13611, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" ], [ "ignoredEntry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" }, "type": "File", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "cksum": 13602, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/trailing-slash-corner-case--meta-250-strict.json000066400000000000000000000061421523070444600316250ustar00rootroot00000000000000[ [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13612, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" ], [ "entry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" }, "type": "File", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13611, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" ], [ "entry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" }, "type": "File", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "cksum": 13602, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/trailing-slash-corner-case--meta-250.json000066400000000000000000000061421523070444600303170ustar00rootroot00000000000000[ [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13612, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" ], [ "entry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" }, "type": "File", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13611, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" ], [ "entry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" }, "type": "File", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "cksum": 13602, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/trailing-slash-corner-case--strict.json000066400000000000000000000061421523070444600303750ustar00rootroot00000000000000[ [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13612, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" ], [ "entry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" }, "type": "File", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13611, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" ], [ "entry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" }, "type": "File", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "cksum": 13602, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/trailing-slash-corner-case.json000066400000000000000000000061421523070444600270120ustar00rootroot00000000000000[ [ "entry", { "type": "Directory", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13612, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" ], [ "entry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" }, "type": "File", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13611, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" ], [ "entry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" }, "type": "File", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "cksum": 13602, "linkpath": "", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/utf8--filter-strict.json000066400000000000000000000066021523070444600254270ustar00rootroot00000000000000[ [ "meta", "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "dev": 16777220, "ino": 9836217, "nlink": 1, "path": "Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "atime": "2017-04-10T17:02:38.000Z", "header": { "cksumValid": true, "needPax": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "cksum": 5688, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:06:33.000Z", "dev": 16777220, "ino": 9836716, "nlink": 1, "path": "🌟.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:06:33.000Z", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "dev": 16777220, "ino": 9836396, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:02:38.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/utf8--filter.json000066400000000000000000000066021523070444600241210ustar00rootroot00000000000000[ [ "meta", "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "dev": 16777220, "ino": 9836217, "nlink": 1, "path": "Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "atime": "2017-04-10T17:02:38.000Z", "header": { "cksumValid": true, "needPax": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "cksum": 5688, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:06:33.000Z", "dev": 16777220, "ino": 9836716, "nlink": 1, "path": "🌟.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:06:33.000Z", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "dev": 16777220, "ino": 9836396, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:02:38.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/utf8--meta-250-filter-strict.json000066400000000000000000000066021523070444600266570ustar00rootroot00000000000000[ [ "meta", "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "dev": 16777220, "ino": 9836217, "nlink": 1, "path": "Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "atime": "2017-04-10T17:02:38.000Z", "header": { "cksumValid": true, "needPax": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "cksum": 5688, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:06:33.000Z", "dev": 16777220, "ino": 9836716, "nlink": 1, "path": "🌟.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:06:33.000Z", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "dev": 16777220, "ino": 9836396, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:02:38.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/utf8--meta-250-filter.json000066400000000000000000000066021523070444600253510ustar00rootroot00000000000000[ [ "meta", "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "dev": 16777220, "ino": 9836217, "nlink": 1, "path": "Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "atime": "2017-04-10T17:02:38.000Z", "header": { "cksumValid": true, "needPax": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "cksum": 5688, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:06:33.000Z", "dev": 16777220, "ino": 9836716, "nlink": 1, "path": "🌟.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:06:33.000Z", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "dev": 16777220, "ino": 9836396, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:02:38.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/utf8--meta-250-strict.json000066400000000000000000000065601523070444600253770ustar00rootroot00000000000000[ [ "meta", "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "dev": 16777220, "ino": 9836217, "nlink": 1, "path": "Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "atime": "2017-04-10T17:02:38.000Z", "header": { "cksumValid": true, "needPax": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "cksum": 5688, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:06:33.000Z", "dev": 16777220, "ino": 9836716, "nlink": 1, "path": "🌟.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:06:33.000Z", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "dev": 16777220, "ino": 9836396, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:02:38.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/utf8--meta-250.json000066400000000000000000000065601523070444600240710ustar00rootroot00000000000000[ [ "meta", "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "dev": 16777220, "ino": 9836217, "nlink": 1, "path": "Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "atime": "2017-04-10T17:02:38.000Z", "header": { "cksumValid": true, "needPax": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "cksum": 5688, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:06:33.000Z", "dev": 16777220, "ino": 9836716, "nlink": 1, "path": "🌟.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:06:33.000Z", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "dev": 16777220, "ino": 9836396, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:02:38.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/utf8--strict.json000066400000000000000000000065601523070444600241470ustar00rootroot00000000000000[ [ "meta", "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "dev": 16777220, "ino": 9836217, "nlink": 1, "path": "Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "atime": "2017-04-10T17:02:38.000Z", "header": { "cksumValid": true, "needPax": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "cksum": 5688, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:06:33.000Z", "dev": 16777220, "ino": 9836716, "nlink": 1, "path": "🌟.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:06:33.000Z", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "dev": 16777220, "ino": 9836396, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:02:38.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parse/utf8.json000066400000000000000000000065601523070444600225640ustar00rootroot00000000000000[ [ "meta", "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "dev": 16777220, "ino": 9836217, "nlink": 1, "path": "Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "atime": "2017-04-10T17:02:38.000Z", "header": { "cksumValid": true, "needPax": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "cksum": 5688, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:06:33.000Z", "dev": 16777220, "ino": 9836716, "nlink": 1, "path": "🌟.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:06:33.000Z", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "dev": 16777220, "ino": 9836396, "nlink": 1, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "global": false }, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:02:38.000Z", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0 } } ], [ "nullBlock" ], [ "eof" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/parses.tar000066400000000000000000024240001523070444600216710ustar00rootroot00000000000000test/fixtures/parse/0000755000000000000000000000000013334177733013531 5ustar rootroottest/fixtures/parse/bad-cksum--filter-strict.json0000644000000000000000000000202013334202347021120 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "error", { "message": "invalid entry" } ], [ "error", { "message": "invalid entry" } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/bad-cksum--filter.json0000644000000000000000000000173413334202347017625 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "warn", "invalid entry" ], [ "warn", "invalid entry" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/bad-cksum--meta-250-filter-strict.json0000644000000000000000000000202013334202347022350 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "error", { "message": "invalid entry" } ], [ "error", { "message": "invalid entry" } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/bad-cksum--meta-250-filter.json0000644000000000000000000000173413334202347021055 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "warn", "invalid entry" ], [ "warn", "invalid entry" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/bad-cksum--meta-250-strict.json0000644000000000000000000000202013334202347021065 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "error", { "message": "invalid entry" } ], [ "error", { "message": "invalid entry" } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/bad-cksum--meta-250.json0000644000000000000000000000173413334202347017572 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "warn", "invalid entry" ], [ "warn", "invalid entry" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/bad-cksum--strict.json0000644000000000000000000000202013334202347017635 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "error", { "message": "invalid entry" } ], [ "error", { "message": "invalid entry" } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/bad-cksum.json0000644000000000000000000000173413334202347016265 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "warn", "invalid entry" ], [ "warn", "invalid entry" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/body-byte-counts--filter-strict.json0000644000000000000000000000656413334202347022502 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "cksum": 6109, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "cksum": 6064, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "cksum": 6246, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/body-byte-counts--filter.json0000644000000000000000000000656413334202347021174 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "cksum": 6109, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "cksum": 6064, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "cksum": 6246, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/body-byte-counts--meta-250-filter-strict.json0000644000000000000000000000656413334202347023732 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "cksum": 6109, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "cksum": 6064, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "cksum": 6246, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/body-byte-counts--meta-250-filter.json0000644000000000000000000000656413334202347022424 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "cksum": 6109, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "cksum": 6064, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "cksum": 6246, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/body-byte-counts--meta-250-strict.json0000644000000000000000000000654213334202347022443 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "cksum": 6109, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "cksum": 6064, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "cksum": 6246, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/body-byte-counts--meta-250.json0000644000000000000000000000654213334202347021135 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "cksum": 6109, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "cksum": 6064, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "cksum": 6246, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/body-byte-counts--strict.json0000644000000000000000000000654213334202347021213 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "cksum": 6109, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "cksum": 6064, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "cksum": 6246, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/body-byte-counts.json0000644000000000000000000000654213334202347017630 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "1024-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1024, "mtime": "2017-04-10T16:57:47.000Z", "cksum": 6109, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "512-bytes.txt", "mode": 420, "uid": 501, "gid": 20, "size": 512, "mtime": "2017-04-10T17:08:55.000Z", "cksum": 6064, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "zero-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:08:01.000Z", "cksum": 6246, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/dir--filter-strict.json0000644000000000000000000000160513334202347020040 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "cksum": 5284, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/dir--filter.json0000644000000000000000000000160513334202347016532 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "cksum": 5284, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/dir--meta-250-filter-strict.json0000644000000000000000000000160513334202347021270 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "cksum": 5284, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/dir--meta-250-filter.json0000644000000000000000000000160513334202347017762 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "cksum": 5284, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/dir--meta-250-strict.json0000644000000000000000000000157713334202347020015 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "cksum": 5284, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/dir--meta-250.json0000644000000000000000000000157713334202347016507 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "cksum": 5284, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/dir--strict.json0000644000000000000000000000157713334202347016565 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "cksum": 5284, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/dir.json0000644000000000000000000000157713334202347015202 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "dir/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T17:00:17.000Z", "cksum": 5284, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/emptypax--filter-strict.json0000644000000000000000000000447513334202347021141 0ustar rootroot[ [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:33:21.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T17:05:56.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "🌟.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836716, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:33:21.000Z", "ctime": "2017-04-10T17:05:56.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/emptypax--filter.json0000644000000000000000000000447513334202347017633 0ustar rootroot[ [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:33:21.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T17:05:56.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "🌟.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836716, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:33:21.000Z", "ctime": "2017-04-10T17:05:56.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/emptypax--meta-250-filter-strict.json0000644000000000000000000000447513334202347022371 0ustar rootroot[ [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:33:21.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T17:05:56.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "🌟.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836716, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:33:21.000Z", "ctime": "2017-04-10T17:05:56.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/emptypax--meta-250-filter.json0000644000000000000000000000447513334202347021063 0ustar rootroot[ [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:33:21.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T17:05:56.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "🌟.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836716, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:33:21.000Z", "ctime": "2017-04-10T17:05:56.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/emptypax--meta-250-strict.json0000644000000000000000000000446713334202347021107 0ustar rootroot[ [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:33:21.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T17:05:56.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "🌟.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836716, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:33:21.000Z", "ctime": "2017-04-10T17:05:56.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/emptypax--meta-250.json0000644000000000000000000000446713334202347017601 0ustar rootroot[ [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:33:21.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T17:05:56.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "🌟.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836716, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:33:21.000Z", "ctime": "2017-04-10T17:05:56.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/emptypax--strict.json0000644000000000000000000000446713334202347017657 0ustar rootroot[ [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:33:21.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T17:05:56.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "🌟.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836716, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:33:21.000Z", "ctime": "2017-04-10T17:05:56.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/emptypax.json0000644000000000000000000000446713334202347016274 0ustar rootroot[ [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:33:21.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T17:05:56.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "🌟.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836716, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:33:21.000Z", "ctime": "2017-04-10T17:05:56.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/file--filter-strict.json0000644000000000000000000000161213334202347020177 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/file--filter.json0000644000000000000000000000161213334202347016671 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/file--meta-250-filter-strict.json0000644000000000000000000000161213334202347021427 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/file--meta-250-filter.json0000644000000000000000000000161213334202347020121 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/file--meta-250-strict.json0000644000000000000000000000161213334202347020144 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/file--meta-250.json0000644000000000000000000000161213334202347016636 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/file--strict.json0000644000000000000000000000161213334202347016714 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/file.json0000644000000000000000000000161213334202347015331 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/global-header--filter-strict.json0000644000000000000000000000244413334202347021752 0ustar rootroot[ [ "meta", "11 path=ab\n" ], [ "entry", { "extended": null, "globalExtended": { "atime": null, "charset": null, "comment": null, "ctime": null, "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "ab", "size": null, "uid": null, "uname": null, "dev": null, "ino": null, "nlink": null, "global": true }, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/global-header--filter.json0000644000000000000000000000244413334202347020444 0ustar rootroot[ [ "meta", "11 path=ab\n" ], [ "entry", { "extended": null, "globalExtended": { "atime": null, "charset": null, "comment": null, "ctime": null, "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "ab", "size": null, "uid": null, "uname": null, "dev": null, "ino": null, "nlink": null, "global": true }, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/global-header--meta-250-filter-strict.json0000644000000000000000000000244413334202347023202 0ustar rootroot[ [ "meta", "11 path=ab\n" ], [ "entry", { "extended": null, "globalExtended": { "atime": null, "charset": null, "comment": null, "ctime": null, "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "ab", "size": null, "uid": null, "uname": null, "dev": null, "ino": null, "nlink": null, "global": true }, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/global-header--meta-250-filter.json0000644000000000000000000000244413334202347021674 0ustar rootroot[ [ "meta", "11 path=ab\n" ], [ "entry", { "extended": null, "globalExtended": { "atime": null, "charset": null, "comment": null, "ctime": null, "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "ab", "size": null, "uid": null, "uname": null, "dev": null, "ino": null, "nlink": null, "global": true }, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/global-header--meta-250-strict.json0000644000000000000000000000244413334202347021717 0ustar rootroot[ [ "meta", "11 path=ab\n" ], [ "entry", { "extended": null, "globalExtended": { "atime": null, "charset": null, "comment": null, "ctime": null, "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "ab", "size": null, "uid": null, "uname": null, "dev": null, "ino": null, "nlink": null, "global": true }, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/global-header--meta-250.json0000644000000000000000000000244413334202347020411 0ustar rootroot[ [ "meta", "11 path=ab\n" ], [ "entry", { "extended": null, "globalExtended": { "atime": null, "charset": null, "comment": null, "ctime": null, "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "ab", "size": null, "uid": null, "uname": null, "dev": null, "ino": null, "nlink": null, "global": true }, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/global-header--strict.json0000644000000000000000000000244413334202347020467 0ustar rootroot[ [ "meta", "11 path=ab\n" ], [ "entry", { "extended": null, "globalExtended": { "atime": null, "charset": null, "comment": null, "ctime": null, "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "ab", "size": null, "uid": null, "uname": null, "dev": null, "ino": null, "nlink": null, "global": true }, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/global-header.json0000644000000000000000000000244413334202347017104 0ustar rootroot[ [ "meta", "11 path=ab\n" ], [ "entry", { "extended": null, "globalExtended": { "atime": null, "charset": null, "comment": null, "ctime": null, "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "ab", "size": null, "uid": null, "uname": null, "dev": null, "ino": null, "nlink": null, "global": true }, "type": "File", "meta": false, "ignore": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "one-byte.txt", "mode": 420, "uid": 501, "gid": 20, "size": 1, "mtime": "2017-04-10T16:58:20.000Z", "cksum": 6121, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links--filter-strict.json0000644000000000000000000000510013334202347020374 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5856, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Link", "meta": false, "ignore": true, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 6792, "linkpath": "hardlink-1", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links--filter.json0000644000000000000000000000510013334202347017066 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5856, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Link", "meta": false, "ignore": true, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 6792, "linkpath": "hardlink-1", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links--meta-250-filter-strict.json0000644000000000000000000000510013334202347021624 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5856, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Link", "meta": false, "ignore": true, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 6792, "linkpath": "hardlink-1", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links--meta-250-filter.json0000644000000000000000000000510013334202347020316 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5856, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Link", "meta": false, "ignore": true, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 6792, "linkpath": "hardlink-1", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links--meta-250-strict.json0000644000000000000000000000505613334202347020353 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5856, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Link", "meta": false, "ignore": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 6792, "linkpath": "hardlink-1", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links--meta-250.json0000644000000000000000000000505613334202347017045 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5856, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Link", "meta": false, "ignore": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 6792, "linkpath": "hardlink-1", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links--strict.json0000644000000000000000000000505613334202347017123 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5856, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Link", "meta": false, "ignore": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 6792, "linkpath": "hardlink-1", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links-invalid--filter-strict.json0000644000000000000000000000220613334202347022024 0ustar rootroot[ [ "error", { "message": "invalid: linkpath forbidden" } ], [ "error", { "message": "invalid entry" } ], [ "error", { "message": "invalid: linkpath required" } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links-invalid--filter.json0000644000000000000000000000207013334202347020515 0ustar rootroot[ [ "warn", "invalid: linkpath forbidden" ], [ "warn", "invalid entry" ], [ "warn", "invalid: linkpath required" ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links-invalid--meta-250-filter-strict.json0000644000000000000000000000220613334202347023254 0ustar rootroot[ [ "error", { "message": "invalid: linkpath forbidden" } ], [ "error", { "message": "invalid entry" } ], [ "error", { "message": "invalid: linkpath required" } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links-invalid--meta-250-filter.json0000644000000000000000000000207013334202347021745 0ustar rootroot[ [ "warn", "invalid: linkpath forbidden" ], [ "warn", "invalid entry" ], [ "warn", "invalid: linkpath required" ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links-invalid--meta-250-strict.json0000644000000000000000000000220013334202347021763 0ustar rootroot[ [ "error", { "message": "invalid: linkpath forbidden" } ], [ "error", { "message": "invalid entry" } ], [ "error", { "message": "invalid: linkpath required" } ], [ "entry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links-invalid--meta-250.json0000644000000000000000000000206213334202347020463 0ustar rootroot[ [ "warn", "invalid: linkpath forbidden" ], [ "warn", "invalid entry" ], [ "warn", "invalid: linkpath required" ], [ "entry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links-invalid--strict.json0000644000000000000000000000220013334202347020533 0ustar rootroot[ [ "error", { "message": "invalid: linkpath forbidden" } ], [ "error", { "message": "invalid entry" } ], [ "error", { "message": "invalid: linkpath required" } ], [ "entry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links-invalid.json0000644000000000000000000000206213334202347017156 0ustar rootroot[ [ "warn", "invalid: linkpath forbidden" ], [ "warn", "invalid entry" ], [ "warn", "invalid: linkpath required" ], [ "entry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links.json0000644000000000000000000000505613334202347015540 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-1", "mode": 420, "uid": 501, "gid": 20, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5856, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Link", "meta": false, "ignore": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "hardlink-2", "mode": 420, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 6792, "linkpath": "hardlink-1", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "symlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6639, "linkpath": "hardlink-2", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/long-paths--filter-strict.json0000644000000000000000000010363713334202347021346 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "cksum": 14592, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:54:12.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836297, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:54:12.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "180 path=170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843378\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836326\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:56:18.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836326, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:56:18.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 5870, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6031, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6179, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6323, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6478, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6633, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6801, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6893, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7040, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7188, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7336, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7587, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7736, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7894, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8049, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8196, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8344, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8505, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8597, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8756, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8900, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 9063, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9223, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "cksum": 9714, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19068, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "186 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836253\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:52:20.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836253, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:52:20.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18969, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "236 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836254\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:52:20.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836254, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:52:20.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 20019, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:07:25.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:58:47.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836396, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:07:25.000Z", "ctime": "2017-04-10T16:58:47.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/long-paths--filter.json0000644000000000000000000010363713334202347020040 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "cksum": 14592, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:54:12.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836297, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:54:12.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "180 path=170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843378\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836326\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:56:18.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836326, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:56:18.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 5870, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6031, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6179, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6323, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6478, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6633, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6801, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6893, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7040, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7188, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7336, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7587, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7736, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7894, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8049, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8196, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8344, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8505, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8597, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8756, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8900, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 9063, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9223, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "cksum": 9714, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19068, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "186 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836253\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:52:20.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836253, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:52:20.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18969, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "236 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836254\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:52:20.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836254, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:52:20.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 20019, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:07:25.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:58:47.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836396, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:07:25.000Z", "ctime": "2017-04-10T16:58:47.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/long-paths--meta-250-filter-strict.json0000644000000000000000000010346713334202347022577 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "cksum": 14592, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:54:12.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836297, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:54:12.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 283, "mtime": "2017-04-10T16:56:18.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 283, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14413, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 5870, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6031, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6179, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6323, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6478, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6633, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6801, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6893, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7040, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7188, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7336, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7587, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7736, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7894, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8049, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8196, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8344, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8505, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8597, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8756, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8900, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 9063, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9223, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "cksum": 9714, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19068, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 289, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 289, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18881, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18969, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 339, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 339, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19932, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 20019, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:07:25.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:58:47.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836396, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:07:25.000Z", "ctime": "2017-04-10T16:58:47.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/long-paths--meta-250-filter.json0000644000000000000000000010346713334202347021271 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "cksum": 14592, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:54:12.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836297, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:54:12.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 283, "mtime": "2017-04-10T16:56:18.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 283, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14413, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 5870, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6031, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6179, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6323, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6478, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6633, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6801, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6893, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7040, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7188, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7336, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7587, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7736, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7894, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8049, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8196, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8344, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8505, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8597, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8756, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8900, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 9063, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9223, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "cksum": 9714, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19068, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 289, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 289, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18881, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18969, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 339, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 339, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19932, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 20019, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:07:25.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:58:47.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836396, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:07:25.000Z", "ctime": "2017-04-10T16:58:47.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/long-paths--meta-250-strict.json0000644000000000000000000010316713334202347021311 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "cksum": 14592, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:54:12.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836297, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:54:12.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 283, "mtime": "2017-04-10T16:56:18.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 283, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14413, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 5870, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6031, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6179, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6323, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6478, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6633, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6801, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6893, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7040, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7188, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7336, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7587, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7736, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7894, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8049, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8196, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8344, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8505, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8597, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8756, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8900, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 9063, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9223, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "cksum": 9714, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19068, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 289, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 289, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18881, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18969, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 339, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 339, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19932, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 20019, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:07:25.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:58:47.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836396, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:07:25.000Z", "ctime": "2017-04-10T16:58:47.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/long-paths--meta-250.json0000644000000000000000000010316713334202347020003 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "cksum": 14592, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:54:12.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836297, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:54:12.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 283, "mtime": "2017-04-10T16:56:18.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 283, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14413, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 5870, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6031, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6179, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6323, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6478, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6633, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6801, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6893, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7040, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7188, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7336, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7587, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7736, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7894, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8049, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8196, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8344, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8505, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8597, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8756, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8900, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 9063, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9223, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "cksum": 9714, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19068, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 289, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 289, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18881, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18969, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 339, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 339, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19932, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 20019, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:07:25.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:58:47.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836396, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:07:25.000Z", "ctime": "2017-04-10T16:58:47.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/long-paths--strict.json0000644000000000000000000010333713334202347020060 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "cksum": 14592, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:54:12.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836297, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:54:12.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "180 path=170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843378\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836326\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:56:18.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836326, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:56:18.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 5870, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6031, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6179, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6323, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6478, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6633, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6801, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6893, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7040, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7188, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7336, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7587, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7736, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7894, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8049, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8196, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8344, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8505, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8597, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8756, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8900, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 9063, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9223, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "cksum": 9714, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19068, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "186 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836253\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:52:20.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836253, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:52:20.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18969, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "236 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836254\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:52:20.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836254, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:52:20.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 20019, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:07:25.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:58:47.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836396, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:07:25.000Z", "ctime": "2017-04-10T16:58:47.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/long-paths.json0000644000000000000000000010333713334202347016475 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:53:02.000Z", "cksum": 14592, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:54:12.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836297, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:54:12.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "180 path=170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843378\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836326\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:56:18.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836326, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:56:18.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 5870, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6031, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6179, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6323, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6478, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6633, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6801, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 6893, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7040, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7188, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7336, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7587, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7736, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 7894, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8049, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8196, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8344, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8505, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8597, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8756, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 8900, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 9063, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9223, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", "mode": 420, "uid": 501, "gid": 20, "size": 6, "mtime": "2017-04-10T16:56:46.000Z", "cksum": 9714, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 19068, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "186 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836253\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:52:20.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836253, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:52:20.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 18969, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "236 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836254\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:01:57.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:52:20.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836254, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "atime": "2017-04-10T17:01:57.000Z", "ctime": "2017-04-10T16:52:20.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:52:20.000Z", "cksum": 20019, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:07:25.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:58:47.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836396, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:07:25.000Z", "ctime": "2017-04-10T16:58:47.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/long-pax--filter-strict.json0000644000000000000000000000760013334202347021010 0ustar rootroot[ [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n1069 comment=all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy\n9 gid=20\n15 gname=staff\n20 mtime=1491843252\n12 size=100\n11 uid=501\n16 uname=isaacs\n" ], [ "ignoredEntry", { "extended": { "atime": null, "charset": null, "comment": "all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy", "ctime": null, "gid": 20, "gname": "staff", "linkpath": null, "mtime": "2017-04-10T16:54:12.000Z", "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": 100, "uid": 501, "uname": "isaacs", "dev": null, "ino": null, "nlink": null, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "end" ] ] test/fixtures/parse/long-pax--filter.json0000644000000000000000000000760013334202347017502 0ustar rootroot[ [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n1069 comment=all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy\n9 gid=20\n15 gname=staff\n20 mtime=1491843252\n12 size=100\n11 uid=501\n16 uname=isaacs\n" ], [ "ignoredEntry", { "extended": { "atime": null, "charset": null, "comment": "all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy", "ctime": null, "gid": 20, "gname": "staff", "linkpath": null, "mtime": "2017-04-10T16:54:12.000Z", "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": 100, "uid": 501, "uname": "isaacs", "dev": null, "ino": null, "nlink": null, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "end" ] ] test/fixtures/parse/long-pax--meta-250-filter-strict.json0000644000000000000000000000402713334202347022240 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1282, "mtime": "2017-04-10T16:54:12.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 1282, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14425, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "end" ] ] test/fixtures/parse/long-pax--meta-250-filter.json0000644000000000000000000000402713334202347020732 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1282, "mtime": "2017-04-10T16:54:12.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 1282, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14425, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "end" ] ] test/fixtures/parse/long-pax--meta-250-strict.json0000644000000000000000000000402113334202347020747 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1282, "mtime": "2017-04-10T16:54:12.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 1282, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14425, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "end" ] ] test/fixtures/parse/long-pax--meta-250.json0000644000000000000000000000402113334202347017441 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "ExtendedHeader", "meta": true, "ignore": true, "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 1282, "mtime": "2017-04-10T16:54:12.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 1282, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14425, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "end" ] ] test/fixtures/parse/long-pax--strict.json0000644000000000000000000000757213334202347017535 0ustar rootroot[ [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n1069 comment=all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy\n9 gid=20\n15 gname=staff\n20 mtime=1491843252\n12 size=100\n11 uid=501\n16 uname=isaacs\n" ], [ "entry", { "extended": { "atime": null, "charset": null, "comment": "all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy", "ctime": null, "gid": 20, "gname": "staff", "linkpath": null, "mtime": "2017-04-10T16:54:12.000Z", "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": 100, "uid": 501, "uname": "isaacs", "dev": null, "ino": null, "nlink": null, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "end" ] ] test/fixtures/parse/long-pax.json0000644000000000000000000000757213334202347016152 0ustar rootroot[ [ "meta", "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n1069 comment=all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy\n9 gid=20\n15 gname=staff\n20 mtime=1491843252\n12 size=100\n11 uid=501\n16 uname=isaacs\n" ], [ "entry", { "extended": { "atime": null, "charset": null, "comment": "all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy", "ctime": null, "gid": 20, "gname": "staff", "linkpath": null, "mtime": "2017-04-10T16:54:12.000Z", "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "size": 100, "uid": 501, "uname": "isaacs", "dev": null, "ino": null, "nlink": null, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:54:12.000Z", "cksum": 14495, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "end" ] ] test/fixtures/parse/next-file-has-long--filter-strict.json0000644000000000000000000000574713334202347022676 0ustar rootroot[ [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "ignoredEntry", { "extended": { "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "ignoredEntry", { "extended": { "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "atime": null, "ctime": null, "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "header": { "cksumValid": true, "needPax": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "cksum": 7135, "linkpath": "././@LongSymLink", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/next-file-has-long--filter.json0000644000000000000000000000574713334202347021370 0ustar rootroot[ [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "ignoredEntry", { "extended": { "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "ignoredEntry", { "extended": { "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "atime": null, "ctime": null, "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "header": { "cksumValid": true, "needPax": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "cksum": 7135, "linkpath": "././@LongSymLink", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/next-file-has-long--meta-250-filter-strict.json0000644000000000000000000000574713334202347024126 0ustar rootroot[ [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "ignoredEntry", { "extended": { "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "ignoredEntry", { "extended": { "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "atime": null, "ctime": null, "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "header": { "cksumValid": true, "needPax": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "cksum": 7135, "linkpath": "././@LongSymLink", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/next-file-has-long--meta-250-filter.json0000644000000000000000000000574713334202347022620 0ustar rootroot[ [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "ignoredEntry", { "extended": { "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "ignoredEntry", { "extended": { "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "atime": null, "ctime": null, "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "header": { "cksumValid": true, "needPax": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "cksum": 7135, "linkpath": "././@LongSymLink", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/next-file-has-long--meta-250-strict.json0000644000000000000000000000573313334202347022636 0ustar rootroot[ [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "entry", { "extended": { "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "entry", { "extended": { "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "atime": null, "ctime": null, "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "header": { "cksumValid": true, "needPax": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "cksum": 7135, "linkpath": "././@LongSymLink", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/next-file-has-long--meta-250.json0000644000000000000000000000573313334202347021330 0ustar rootroot[ [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "entry", { "extended": { "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "entry", { "extended": { "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "atime": null, "ctime": null, "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "header": { "cksumValid": true, "needPax": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "cksum": 7135, "linkpath": "././@LongSymLink", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/next-file-has-long--strict.json0000644000000000000000000000573313334202347021406 0ustar rootroot[ [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "entry", { "extended": { "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "entry", { "extended": { "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "atime": null, "ctime": null, "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "header": { "cksumValid": true, "needPax": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "cksum": 7135, "linkpath": "././@LongSymLink", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/next-file-has-long.json0000644000000000000000000000573313334202347020023 0ustar rootroot[ [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "entry", { "extended": { "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "mode": 420, "uid": 501, "gid": 20, "size": 100, "mtime": "2017-04-10T16:56:18.000Z", "cksum": 14500, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" ], [ "entry", { "extended": { "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" }, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "atime": null, "ctime": null, "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "header": { "cksumValid": true, "needPax": false, "path": "longlink", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2017-04-10T23:22:33.000Z", "cksum": 7135, "linkpath": "././@LongSymLink", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/null-byte--filter-strict.json0000644000000000000000000000520213334202347021172 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "uname": null, "gname": null, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "cksum": 11228, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" ], [ "ignoredEntry", { "extended": { "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "uname": null, "gname": null, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "cksum": 15210, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/null-byte--filter.json0000644000000000000000000000520213334202347017664 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "uname": null, "gname": null, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "cksum": 11228, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" ], [ "ignoredEntry", { "extended": { "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "uname": null, "gname": null, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "cksum": 15210, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/null-byte--meta-250-filter-strict.json0000644000000000000000000000520213334202347022422 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "uname": null, "gname": null, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "cksum": 11228, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" ], [ "ignoredEntry", { "extended": { "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "uname": null, "gname": null, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "cksum": 15210, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/null-byte--meta-250-filter.json0000644000000000000000000000520213334202347021114 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "uname": null, "gname": null, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "cksum": 11228, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" ], [ "ignoredEntry", { "extended": { "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "uname": null, "gname": null, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "cksum": 15210, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/null-byte--meta-250-strict.json0000644000000000000000000000516613334202347021150 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "uname": null, "gname": null, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "cksum": 11228, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" ], [ "entry", { "extended": { "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "uname": null, "gname": null, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "cksum": 15210, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/null-byte--meta-250.json0000644000000000000000000000516613334202347017642 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "uname": null, "gname": null, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "cksum": 11228, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" ], [ "entry", { "extended": { "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "uname": null, "gname": null, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "cksum": 15210, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/null-byte--strict.json0000644000000000000000000000516613334202347017720 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "uname": null, "gname": null, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "cksum": 11228, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" ], [ "entry", { "extended": { "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "uname": null, "gname": null, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "cksum": 15210, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/null-byte.json0000644000000000000000000000516613334202347016335 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "uname": null, "gname": null, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", "mode": 509, "uid": 1000, "gid": 1000, "size": 0, "mtime": "2017-07-31T22:21:58.000Z", "cksum": 11228, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" ], [ "entry", { "extended": { "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "uname": null, "gname": null, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", "mode": 436, "uid": 1000, "gid": 1000, "size": 200, "mtime": "2017-07-31T22:21:53.000Z", "cksum": 15210, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/path-missing--filter-strict.json0000644000000000000000000000033213334202347021661 0ustar rootroot[ [ "error", { "message": "invalid: path is required" } ], [ "error", { "message": "invalid entry" } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/path-missing--filter.json0000644000000000000000000000024613334202347020357 0ustar rootroot[ [ "warn", "invalid: path is required" ], [ "warn", "invalid entry" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/path-missing--meta-250-filter-strict.json0000644000000000000000000000033213334202347023111 0ustar rootroot[ [ "error", { "message": "invalid: path is required" } ], [ "error", { "message": "invalid entry" } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/path-missing--meta-250-filter.json0000644000000000000000000000024613334202347021607 0ustar rootroot[ [ "warn", "invalid: path is required" ], [ "warn", "invalid entry" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/path-missing--meta-250-strict.json0000644000000000000000000000033213334202347021626 0ustar rootroot[ [ "error", { "message": "invalid: path is required" } ], [ "error", { "message": "invalid entry" } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/path-missing--meta-250.json0000644000000000000000000000024613334202347020324 0ustar rootroot[ [ "warn", "invalid: path is required" ], [ "warn", "invalid entry" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/path-missing--strict.json0000644000000000000000000000033213334202347020376 0ustar rootroot[ [ "error", { "message": "invalid: path is required" } ], [ "error", { "message": "invalid entry" } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/path-missing.json0000644000000000000000000000024613334202347017017 0ustar rootroot[ [ "warn", "invalid: path is required" ], [ "warn", "invalid entry" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/trailing-slash-corner-case--filter-strict.json0000644000000000000000000000775513334202347024416 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13612, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" ], [ "ignoredEntry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13611, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" ], [ "ignoredEntry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "cksum": 13602, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/trailing-slash-corner-case--filter.json0000644000000000000000000000775513334202347023110 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13612, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" ], [ "ignoredEntry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13611, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" ], [ "ignoredEntry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "cksum": 13602, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/trailing-slash-corner-case--meta-250-filter-strict.json0000644000000000000000000000775513334202347025646 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13612, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" ], [ "ignoredEntry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13611, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" ], [ "ignoredEntry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "cksum": 13602, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/trailing-slash-corner-case--meta-250-filter.json0000644000000000000000000000775513334202347024340 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13612, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" ], [ "ignoredEntry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13611, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" ], [ "ignoredEntry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "cksum": 13602, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/trailing-slash-corner-case--meta-250-strict.json0000644000000000000000000000773313334202347024357 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13612, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" ], [ "entry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13611, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" ], [ "entry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "cksum": 13602, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/trailing-slash-corner-case--meta-250.json0000644000000000000000000000773313334202347023051 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13612, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" ], [ "entry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13611, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" ], [ "entry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "cksum": 13602, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/trailing-slash-corner-case--strict.json0000644000000000000000000000773313334202347023127 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13612, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" ], [ "entry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13611, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" ], [ "entry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "cksum": 13602, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/trailing-slash-corner-case.json0000644000000000000000000000773313334202347021544 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", "mode": 493, "uid": 501, "gid": 20, "size": 0, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13612, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" ], [ "entry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-19T00:03:11.000Z", "cksum": 13611, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" ], [ "entry", { "extended": { "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "uname": null, "gname": null, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", "mode": 420, "uid": 501, "gid": 20, "size": 560, "mtime": "2018-06-18T23:49:44.000Z", "cksum": 13602, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/utf8--filter-strict.json0000644000000000000000000001105113334202347020144 0ustar rootroot[ [ "meta", "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:51:42.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836217, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "atime": "2017-04-10T17:02:38.000Z", "ctime": "2017-04-10T16:51:42.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "cksum": 5688, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:06:33.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T17:05:56.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "🌟.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836716, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:06:33.000Z", "ctime": "2017-04-10T17:05:56.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:58:47.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836396, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:02:38.000Z", "ctime": "2017-04-10T16:58:47.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/utf8--filter.json0000644000000000000000000001105113334202347016636 0ustar rootroot[ [ "meta", "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:51:42.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836217, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "atime": "2017-04-10T17:02:38.000Z", "ctime": "2017-04-10T16:51:42.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "cksum": 5688, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:06:33.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T17:05:56.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "🌟.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836716, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:06:33.000Z", "ctime": "2017-04-10T17:05:56.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:58:47.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836396, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:02:38.000Z", "ctime": "2017-04-10T16:58:47.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/utf8--meta-250-filter-strict.json0000644000000000000000000001105113334202347021374 0ustar rootroot[ [ "meta", "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:51:42.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836217, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "atime": "2017-04-10T17:02:38.000Z", "ctime": "2017-04-10T16:51:42.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "cksum": 5688, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:06:33.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T17:05:56.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "🌟.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836716, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:06:33.000Z", "ctime": "2017-04-10T17:05:56.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:58:47.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836396, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:02:38.000Z", "ctime": "2017-04-10T16:58:47.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/utf8--meta-250-filter.json0000644000000000000000000001105113334202347020066 0ustar rootroot[ [ "meta", "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:51:42.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836217, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "atime": "2017-04-10T17:02:38.000Z", "ctime": "2017-04-10T16:51:42.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "cksum": 5688, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:06:33.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T17:05:56.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "🌟.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836716, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:06:33.000Z", "ctime": "2017-04-10T17:05:56.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "ignoredEntry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:58:47.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836396, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:02:38.000Z", "ctime": "2017-04-10T16:58:47.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/utf8--meta-250-strict.json0000644000000000000000000001102713334202347020114 0ustar rootroot[ [ "meta", "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:51:42.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836217, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "atime": "2017-04-10T17:02:38.000Z", "ctime": "2017-04-10T16:51:42.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "cksum": 5688, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:06:33.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T17:05:56.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "🌟.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836716, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:06:33.000Z", "ctime": "2017-04-10T17:05:56.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:58:47.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836396, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:02:38.000Z", "ctime": "2017-04-10T16:58:47.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/utf8--meta-250.json0000644000000000000000000001102713334202347016606 0ustar rootroot[ [ "meta", "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:51:42.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836217, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "atime": "2017-04-10T17:02:38.000Z", "ctime": "2017-04-10T16:51:42.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "cksum": 5688, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:06:33.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T17:05:56.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "🌟.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836716, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:06:33.000Z", "ctime": "2017-04-10T17:05:56.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:58:47.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836396, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:02:38.000Z", "ctime": "2017-04-10T16:58:47.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/utf8--strict.json0000644000000000000000000001102713334202347016664 0ustar rootroot[ [ "meta", "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:51:42.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836217, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "atime": "2017-04-10T17:02:38.000Z", "ctime": "2017-04-10T16:51:42.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "cksum": 5688, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:06:33.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T17:05:56.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "🌟.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836716, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:06:33.000Z", "ctime": "2017-04-10T17:05:56.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:58:47.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836396, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:02:38.000Z", "ctime": "2017-04-10T16:58:47.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/utf8.json0000644000000000000000000001102713334202347015301 0ustar rootroot[ [ "meta", "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:51:42.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836217, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "atime": "2017-04-10T17:02:38.000Z", "ctime": "2017-04-10T16:51:42.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:51:42.000Z", "cksum": 5688, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:06:33.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T17:05:56.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "🌟.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836716, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "atime": "2017-04-10T17:06:33.000Z", "ctime": "2017-04-10T17:05:56.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "🌟.txt", "mode": 420, "uid": 501, "gid": 20, "size": 106, "mtime": "2017-04-10T17:05:55.000Z", "cksum": 6023, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "meta", "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" ], [ "entry", { "extended": { "atime": "2017-04-10T17:02:38.000Z", "charset": null, "comment": null, "ctime": "2017-04-10T16:58:47.000Z", "gid": null, "gname": null, "linkpath": null, "mtime": null, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "size": null, "uid": null, "uname": null, "dev": 16777220, "ino": 9836396, "nlink": 1, "global": false }, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "uname": "isaacs", "gname": "staff", "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "atime": "2017-04-10T17:02:38.000Z", "ctime": "2017-04-10T16:58:47.000Z", "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", "mode": 420, "uid": 501, "gid": 20, "size": 2, "mtime": "2017-04-10T16:58:47.000Z", "cksum": 9990, "linkpath": "", "uname": "isaacs", "gname": "staff", "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links-strip--meta-250-filter-strict.json0000644000000000000000000000734013334202347022773 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "uname": null, "gname": null, "size": 0, "mtime": "2018-08-13T04:10:48.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-08-13T04:10:48.000Z", "cksum": 4912, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 501, "gid": 50, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5515, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Link", "meta": false, "ignore": true, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 501, "gid": 50, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 7424, "linkpath": "strip-dir/hardlink-1", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "strip-dir/symlink", "mode": 511, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/symlink", "mode": 511, "uid": 501, "gid": 50, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6302, "linkpath": "hardlink-2", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links-strip--meta-250-filter.json0000644000000000000000000000734013334202347021465 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "uname": null, "gname": null, "size": 0, "mtime": "2018-08-13T04:10:48.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-08-13T04:10:48.000Z", "cksum": 4912, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 501, "gid": 50, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5515, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Link", "meta": false, "ignore": true, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 501, "gid": 50, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 7424, "linkpath": "strip-dir/hardlink-1", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "strip-dir/symlink", "mode": 511, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/symlink", "mode": 511, "uid": 501, "gid": 50, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6302, "linkpath": "hardlink-2", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links-strip--meta-250-strict.json0000644000000000000000000000731013334202347021505 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "uname": null, "gname": null, "size": 0, "mtime": "2018-08-13T04:10:48.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-08-13T04:10:48.000Z", "cksum": 4912, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 501, "gid": 50, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5515, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Link", "meta": false, "ignore": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 501, "gid": 50, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 7424, "linkpath": "strip-dir/hardlink-1", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "strip-dir/symlink", "mode": 511, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/symlink", "mode": 511, "uid": 501, "gid": 50, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6302, "linkpath": "hardlink-2", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links-strip--meta-250.json0000644000000000000000000000731013334202347020177 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "uname": null, "gname": null, "size": 0, "mtime": "2018-08-13T04:10:48.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-08-13T04:10:48.000Z", "cksum": 4912, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 501, "gid": 50, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5515, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Link", "meta": false, "ignore": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 501, "gid": 50, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 7424, "linkpath": "strip-dir/hardlink-1", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "strip-dir/symlink", "mode": 511, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/symlink", "mode": 511, "uid": 501, "gid": 50, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6302, "linkpath": "hardlink-2", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links-strip--filter-strict.json0000644000000000000000000000734013334202347021543 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "uname": null, "gname": null, "size": 0, "mtime": "2018-08-13T04:10:48.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-08-13T04:10:48.000Z", "cksum": 4912, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 501, "gid": 50, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5515, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Link", "meta": false, "ignore": true, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 501, "gid": 50, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 7424, "linkpath": "strip-dir/hardlink-1", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "strip-dir/symlink", "mode": 511, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/symlink", "mode": 511, "uid": 501, "gid": 50, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6302, "linkpath": "hardlink-2", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links-strip--filter.json0000644000000000000000000000734013334202347020235 0ustar rootroot[ [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": true, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "uname": null, "gname": null, "size": 0, "mtime": "2018-08-13T04:10:48.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-08-13T04:10:48.000Z", "cksum": 4912, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": true, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 501, "gid": 50, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5515, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "Link", "meta": false, "ignore": true, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 501, "gid": 50, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 7424, "linkpath": "strip-dir/hardlink-1", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "ignoredEntry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": true, "path": "strip-dir/symlink", "mode": 511, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/symlink", "mode": 511, "uid": 501, "gid": 50, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6302, "linkpath": "hardlink-2", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links-strip--strict.json0000644000000000000000000000731013334202347020255 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "uname": null, "gname": null, "size": 0, "mtime": "2018-08-13T04:10:48.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-08-13T04:10:48.000Z", "cksum": 4912, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 501, "gid": 50, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5515, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Link", "meta": false, "ignore": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 501, "gid": 50, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 7424, "linkpath": "strip-dir/hardlink-1", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "strip-dir/symlink", "mode": 511, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/symlink", "mode": 511, "uid": 501, "gid": 50, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6302, "linkpath": "hardlink-2", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] test/fixtures/parse/links-strip.json0000644000000000000000000000731013334202347016672 0ustar rootroot[ [ "entry", { "extended": null, "globalExtended": null, "type": "Directory", "meta": false, "ignore": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "uname": null, "gname": null, "size": 0, "mtime": "2018-08-13T04:10:48.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/", "mode": 493, "uid": 0, "gid": 0, "size": 0, "mtime": "2018-08-13T04:10:48.000Z", "cksum": 4912, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "File", "meta": false, "ignore": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-1", "mode": 420, "uid": 501, "gid": 50, "size": 26, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 5515, "linkpath": "", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "Link", "meta": false, "ignore": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "atime": null, "ctime": null, "linkpath": "strip-dir/hardlink-1", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/hardlink-2", "mode": 420, "uid": 501, "gid": 50, "size": 0, "mtime": "2017-04-10T19:27:05.000Z", "cksum": 7424, "linkpath": "strip-dir/hardlink-1", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "entry", { "extended": null, "globalExtended": null, "type": "SymbolicLink", "meta": false, "ignore": false, "path": "strip-dir/symlink", "mode": 511, "uid": 501, "gid": 50, "uname": null, "gname": null, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "atime": null, "ctime": null, "linkpath": "hardlink-2", "header": { "cksumValid": true, "needPax": false, "path": "strip-dir/symlink", "mode": 511, "uid": 501, "gid": 50, "size": 0, "mtime": "2017-04-10T19:27:33.000Z", "cksum": 6302, "linkpath": "hardlink-2", "uname": null, "gname": null, "devmaj": 0, "devmin": 0, "atime": null, "ctime": null } } ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "nullBlock" ], [ "end" ] ] isaacs-node-tar-8a4b548/test/fixtures/sync-gzip-fail.tgz000066400000000000000000000004501523070444600232430ustar00rootroot00000000000000‹†ë:ZíÚÍj1@á¬ûó7?7‰>ÎPºí(äñ;Té¢E �‘œo“Íà�†££ØÄ™óÞל—ïµ\WõºÞ,!ÅPrѤºøª&·dû­9wÙÎë羕�m]ß·û×í—�Nçö<~ÖÑäh>c=Šê£ó�¿Î?úXÜâÍwæ¦?ÿãÛ³w€gjRÍgtõ¯ô?B¥ÿ©5)æ3ºúOô?B¡ÿ©5 æ3zúÜÿèj{ÿæ™ýßúÓ­ô?Bð¼̬ÉÁ|F×ý¦ÿä?µ&j>£«ÿ@ÿ#(ýO­I2ŸÑÕ¿§ÿýO­I4ŸÑõûßÿ‡ˆô?µ&öÿ²êúü�ô?B¦^ÎB¢æPisaacs-node-tar-8a4b548/test/fixtures/tars/000077500000000000000000000000001523070444600206335ustar00rootroot00000000000000isaacs-node-tar-8a4b548/test/fixtures/tars/bad-cksum.tar000066400000000000000000000060001523070444600232050ustar00rootroot00000000000000one-byte.txt000644 000765 000024 00000000001 13072734654 013751 0ustar00isaacsstaff000000 000000 anne-byte.txt000644 000765 000024 00000000001 13072734654 013751 0ustar00isaacsstaff000000 000000 aisaacs-node-tar-8a4b548/test/fixtures/tars/body-byte-counts.tar000066400000000000000000000120001523070444600245430ustar00rootroot000000000000001024-bytes.txt000644 000765 000024 00000002000 13072734613 013735 0ustar00isaacsstaff000000 000000 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 512-bytes.txt000644 000765 000024 00000001000 13072736047 013660 0ustar00isaacsstaff000000 000000 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx one-byte.txt000644 000765 000024 00000000001 13072734654 013751 0ustar00isaacsstaff000000 000000 azero-byte.txt000644 000765 000024 00000000000 13072735761 014146 0ustar00isaacsstaff000000 000000 isaacs-node-tar-8a4b548/test/fixtures/tars/dir.tar000066400000000000000000000030001523070444600221120ustar00rootroot00000000000000dir/000755 000765 000024 00000000000 13072735041 012244 5ustar00isaacsstaff000000 000000 isaacs-node-tar-8a4b548/test/fixtures/tars/emptypax.tar000066400000000000000000000110001523070444600232020ustar00rootroot00000000000000PaxHeader/🌟.txt000644 000765 000024 00000000170 13072735563 015560 xustar00isaacsstaff000000 000000 17 path=🌟.txt 20 ctime=1491843956 20 atime=1491845601 23 SCHILY.dev=16777220 22 SCHILY.ino=9836716 18 SCHILY.nlink=1 🌟.txt000644 000765 000024 00000000152 13072735563 013607 0ustar00isaacsstaff000000 000000 🌟✧✩â­�︎✪✫✬✭✮âš�✯✰✵✶✷✸✹â�‚⭑⭒★☆✡☪✴︎✦✡ï¸�🔯✴ï¸�🌠 PaxHeader/🌟.txt000644 000765 000024 0000000000 13072735563015430 xustar00isaacsstaff000000 000000 one-byte.txt000644 000765 000024 00000000001 13072734654 013751 0ustar00isaacsstaff000000 000000 aisaacs-node-tar-8a4b548/test/fixtures/tars/file.tar000066400000000000000000000040001523070444600222540ustar00rootroot00000000000000one-byte.txt000644 000765 000024 00000000001 13072734654 013751 0ustar00isaacsstaff000000 000000 aisaacs-node-tar-8a4b548/test/fixtures/tars/global-header.tar000066400000000000000000000060001523070444600240250ustar00rootroot00000000000000PaxHeader/ab000644 0000000013 007054 gustar00000000 000000 11 path=ab one-byte.txt000644 000765 000024 00000000001 13072734654 013751 0ustar00isaacsstaff000000 000000 aisaacs-node-tar-8a4b548/test/fixtures/tars/links-invalid.tar000066400000000000000000000060001523070444600241030ustar00rootroot00000000000000hardlink-1000644 000765 000024 0000000032 13072756211015074 0hardlink-2ustar00isaacsstaff000000 000000 this link is like diamond hardlink-2000644 000765 000024 0000000000 13072756211013215 1ustar00isaacsstaff000000 000000 symlink000755 000765 000024 00000000000 13072756245 014757 2hardlink-2ustar00isaacsstaff000000 000000 isaacs-node-tar-8a4b548/test/fixtures/tars/links-strip.tar000066400000000000000000000060001523070444600236160ustar00rootroot00000000000000strip-dir/000755 000000 000000 00000000000 13370171065 011144 5ustar00000000 000000 strip-dir/hardlink-1000644 000000 000000 00000000032 13370171065 013014 0ustar00000000 000000 this link is like diamond strip-dir/hardlink-2000644 000000 000000 00000000000 13370171065 016601 1strip-dir/hardlink-1ustar00000000 000000 strip-dir/1/2/3/hardlink-3000644 000000 000000 00000000000 13370171065 017245 1strip-dir/hardlink-1ustar00000000 000000 strip-dir/symlink000644 000000 000000 00000000000 13370171065 014421 2hardlink-2ustar00000000 000000 isaacs-node-tar-8a4b548/test/fixtures/tars/links.tar000066400000000000000000000060001523070444600224570ustar00rootroot00000000000000hardlink-1000644 000765 000024 00000000032 13072756211 013340 0ustar00isaacsstaff000000 000000 this link is like diamond hardlink-2000644 000765 000024 00000000000 13072756211 015210 1hardlink-1ustar00isaacsstaff000000 000000 symlink000755 000765 000024 00000000000 13072756245 014757 2hardlink-2ustar00isaacsstaff000000 000000 isaacs-node-tar-8a4b548/test/fixtures/tars/long-paths.tar000066400000000000000000000640001523070444600234170ustar00rootroot00000000000000100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc000644 000765 000024 00000000144 13072734156 034400 0ustar00isaacsstaff000000 000000 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccPaxHeader/120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc000644 000765 000024 00000000351 13072734264 034107 xustar00isaacsstaff000000 000000 130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 20 ctime=1491843252 20 atime=1491843717 23 SCHILY.dev=16777220 22 SCHILY.ino=9836297 18 SCHILY.nlink=1 120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc000644 000765 000024 00000000144 13072734264 034237 0ustar00isaacsstaff000000 000000 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccPaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc000644 000765 000024 00000000433 13072734462 034115 xustar00isaacsstaff000000 000000 180 path=170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 20 ctime=1491843378 20 atime=1491843717 23 SCHILY.dev=16777220 22 SCHILY.ino=9836326 18 SCHILY.nlink=1 170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc000644 000765 000024 00000000144 13072734462 034244 0ustar00isaacsstaff000000 000000 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclong-path/000755 000765 000024 00000000000 13072734104 013356 5ustar00isaacsstaff000000 000000 long-path/r/000755 000765 000024 00000000000 13072734104 013617 5ustar00isaacsstaff000000 000000 long-path/r/e/000755 000765 000024 00000000000 13072734104 014043 5ustar00isaacsstaff000000 000000 long-path/r/e/a/000755 000765 000024 00000000000 13072734104 014263 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/000755 000765 000024 00000000000 13072734104 014516 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/000755 000765 000024 00000000000 13072734104 014751 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/000755 000765 000024 00000000000 13072734104 015221 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/000755 000765 000024 00000000000 13072734104 015355 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/000755 000765 000024 00000000000 13072734104 015600 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/000755 000765 000024 00000000000 13072734104 016024 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/000755 000765 000024 00000000000 13072734104 016250 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/000755 000765 000024 00000000000 13072734104 016507 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/-/000755 000765 000024 00000000000 13072734104 016643 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/000755 000765 000024 00000000000 13072734104 017070 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/000755 000765 000024 00000000000 13072734104 017326 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/000755 000765 000024 00000000000 13072734104 017561 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/000755 000765 000024 00000000000 13072734104 020004 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/000755 000765 000024 00000000000 13072734104 020230 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/000755 000765 000024 00000000000 13072734104 020471 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/000755 000765 000024 00000000000 13072734104 020625 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/000755 000765 000024 00000000000 13072734104 021064 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/000755 000765 000024 00000000000 13072734104 021304 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/000755 000765 000024 00000000000 13072734104 021547 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/000755 000765 000024 00000000000 13072734707 022007 5ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt000644 000765 000024 00000000006 13072734516 022762 0ustar00isaacsstaff000000 000000 short cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc000644 000765 000024 00000000144 13072734104 045174 0ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/hcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccch/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc000644 000765 000024 00000000441 13072734104 044701 xustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t186 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 20 ctime=1491843140 20 atime=1491843717 23 SCHILY.dev=16777220 22 SCHILY.ino=9836253 18 SCHILY.nlink=1 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc000644 000765 000024 00000000144 13072734104 045031 0ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/hcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccch/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc000644 000765 000024 00000000523 13072734104 046734 xustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t236 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 20 ctime=1491843140 20 atime=1491843717 23 SCHILY.dev=16777220 22 SCHILY.ino=9836254 18 SCHILY.nlink=1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc000644 000765 000024 00000000144 13072734104 047063 0ustar00isaacsstaff000000 000000 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/hcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclong-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/Ω.txt000644 000765 000024 00000000256 13072734707 025372 xustar00isaacsstaff000000 000000 71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt 20 ctime=1491843527 20 atime=1491844045 23 SCHILY.dev=16777220 22 SCHILY.ino=9836396 18 SCHILY.nlink=1 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt000644 000765 000024 00000000002 13072734707 023406 0ustar00isaacsstaff000000 000000 Ωisaacs-node-tar-8a4b548/test/fixtures/tars/long-pax.tar000066400000000000000000000060001523070444600230640ustar00rootroot00000000000000PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc000644 000765 000024 0000002402 13072734264034131 xustar00isaacsstaff000000 000000 130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 1069 comment=all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy 9 gid=20 15 gname=staff 20 mtime=1491843252 12 size=100 11 uid=501 16 uname=isaacs 120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc000644 000765 000024 00000000144 13072734264 034237 0ustar00isaacsstaff000000 000000 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccisaacs-node-tar-8a4b548/test/fixtures/tars/next-file-has-long.tar000066400000000000000000000110001523070444600247340ustar00rootroot00000000000000NextFileHasLongPath0000000252 007674 Lustar00000000 000000 170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc000644 000765 000024 00000000144 13072734462 034244 0ustar00isaacsstaff000000 000000 ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccNextFileHasLongLinkpath0000000252 010551 Kustar00000000 000000 170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclonglink000755 000765 000024 00000000000 13073011671 015737 2././@LongSymLinkustar00isaacsstaff000000 000000 isaacs-node-tar-8a4b548/test/fixtures/tars/null-byte.tar000066400000000000000000000240001523070444600232520ustar00rootroot00000000000000this_is_a_really_long_directory_name_with_a_lot_of_characters/0000775000175000017500000000000013137726606025734 5ustar freitagbfreitagb././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootthis_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgzthis_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_0000664000175000017500000000031013137726601035552 0ustar freitagbfreitagb‹�­YíÑij1 †aÿÎ)æÉl¶�cœa605xTºœ>N PÙB(} ú!�,>™æÅåç]ê}_.Ä·ÑÉøí†9ôîc–)÷B×M>ùNú´ìÔÊÌZ}¬•ÕåïúCUMÕX[­ó\ÝêÆ¨B?²d­÷E|* 5¤~?î/ÍÝêÿQ²2ÿ!Æ­|Ê];ŽÓ^É¿=Ëß”ºUEùäÛOþyþ{Ÿ6¯þ€u‚T–(isaacs-node-tar-8a4b548/test/fixtures/tars/path-missing.tar000066400000000000000000000040001523070444600237400ustar00rootroot00000000000000000644 000765 000024 0000000001 13072734654011350 0ustar00isaacsstaff000000 000000 aisaacs-node-tar-8a4b548/test/fixtures/tars/trailing-slash-corner-case.tar000066400000000000000000000240001523070444600264570ustar00rootroot0000000000000099-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/0000755000076500000240000000000013312044077032454 5ustar rmgstaff././@LongLink0000644000000000000000000000023100000000000011720 Lustar rootwheel99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/0000644000076500000240000000106013312044077032453 0ustar rmgstaffBehold! I am a text file and NOT a tar header. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ././@LongLink0000644000000000000000000000017200000000000011724 Lustar rootwheel99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/0000644000076500000240000000106013312042430032442 0ustar rmgstaffBehold! I am a text file and NOT a tar header. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx isaacs-node-tar-8a4b548/test/fixtures/tars/utf8.tar000066400000000000000000000160001523070444600222260ustar00rootroot00000000000000PaxHeader/Ω.txt000644 000765 000024 00000000166 13072734036 015054 xustar00isaacsstaff000000 000000 15 path=Ω.txt 20 ctime=1491843102 20 atime=1491843758 23 SCHILY.dev=16777220 22 SCHILY.ino=9836217 18 SCHILY.nlink=1 Ω.txt000644 000765 000024 00000000002 13072734036 013070 0ustar00isaacsstaff000000 000000 ΩPaxHeader/🌟.txt000644 000765 000024 00000000170 13072735563 015560 xustar00isaacsstaff000000 000000 17 path=🌟.txt 20 ctime=1491843956 20 atime=1491843993 23 SCHILY.dev=16777220 22 SCHILY.ino=9836716 18 SCHILY.nlink=1 🌟.txt000644 000765 000024 00000000152 13072735563 013607 0ustar00isaacsstaff000000 000000 🌟✧✩â­�︎✪✫✬✭✮âš�✯✰✵✶✷✸✹â�‚⭑⭒★☆✡☪✴︎✦✡ï¸�🔯✴ï¸�🌠 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/Ω.txt000644 000765 000024 00000000256 13072734707 025372 xustar00isaacsstaff000000 000000 71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt 20 ctime=1491843527 20 atime=1491843758 23 SCHILY.dev=16777220 22 SCHILY.ino=9836396 18 SCHILY.nlink=1 long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt000644 000765 000024 00000000002 13072734707 023406 0ustar00isaacsstaff000000 000000 Ωisaacs-node-tar-8a4b548/test/fixtures/test.js000066400000000000000000000007771523070444600212120ustar00rootroot00000000000000const platform = process.platform === 'win32' ? 'win32' : 'posix' const { spawn } = require('child_process') const c = spawn(process.execPath, [ process.env.npm_execpath, 'run', `test:${platform}`, '--', ...process.argv.slice(2), ], { stdio: 'inherit', }) c.on('close', (code, signal) => { process.exitCode = code if (signal) { process.kill(process.pid, signal) setTimeout(() => {}, 200) } }) process.on('SIGTERM', () => c.kill('SIGTERM')) process.on('SIGINT', () => c.kill('SIGINT')) isaacs-node-tar-8a4b548/test/get-write-flag.js000066400000000000000000000034721523070444600211730ustar00rootroot00000000000000import fs from 'fs' import t from 'tap' import { fileURLToPath } from 'url' import { getWriteFlag } from '../dist/esm/get-write-flag.js' const __filename = fileURLToPath(import.meta.url) // run three scenarios // unix (no fmap) // win32 (without fmap support) // win32 (with fmap support) const hasFmap = !!fs.constants.UV_FS_O_FILEMAP const { platform } = process const UV_FS_O_FILEMAP = 0x20000000 const unixFlag = typeof fs.constants.O_NOFOLLOW === 'number' ? fs.constants.O_NOFOLLOW | fs.constants.O_TRUNC | fs.constants.O_CREAT | fs.constants.O_WRONLY : 'w' switch (process.argv[2]) { case 'win32-fmap': { const { O_CREAT, O_TRUNC, O_WRONLY } = fs.constants t.equal( getWriteFlag(1), UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY, ) t.equal(getWriteFlag(512 * 1024 + 1), 'w') break } case 'win32-nofmap': { t.equal(getWriteFlag(1), 'w') t.equal(getWriteFlag(512 * 1024 + 1), 'w') break } case 'unix': { t.equal(getWriteFlag(1), unixFlag) t.equal(getWriteFlag(512 * 1024 + 1), unixFlag) break } default: { const node = process.execPath t.spawn(node, [__filename, 'win32-fmap'], { env: { ...process.env, ...(platform === 'win32' ? {} : { __FAKE_FS_O_FILENAME__: String(UV_FS_O_FILEMAP), __FAKE_PLATFORM__: 'win32', }), }, }) t.spawn(node, [__filename, 'win32-nofmap'], { env: { ...process.env, ...(platform === 'win32' ? {} : { __FAKE_FS_O_FILENAME__: '0', __FAKE_PLATFORM__: 'win32', }), }, }) t.spawn(node, [__filename, 'unix'], { env: { ...process.env, ...(platform === 'win32' ? { __FAKE_PLATFORM__: 'linux' } : {}), }, }) } } isaacs-node-tar-8a4b548/test/ghsa-8qq5-rm4j-mr97.ts000066400000000000000000000075161523070444600215560ustar00rootroot00000000000000import { lstatSync, readFileSync, readlinkSync, writeFileSync } from 'fs' import { resolve } from 'path' import t from 'tap' import { Header, x } from 'tar' const targetSym = '/some/absolute/path' const absoluteWithDotDot = '/../a/target' const secretLinkpath = resolve(t.testdirName, 'secret.txt') t.formatSnapshot = (o: unknown): unknown => typeof o === 'string' ? o.replace( /^ENOENT: no such file or directory, link .*? -> .*?$/, 'ENOENT: no such file or directory, link', ) : Array.isArray(o) ? o.map(o => t.formatSnapshot?.(o)) : o const getExploitTar = () => { const chunks: Buffer[] = [] const hardHeader = Buffer.alloc(512) new Header({ path: 'exploit_hard', type: 'Link', size: 0, linkpath: secretLinkpath, }).encode(hardHeader, 0) chunks.push(hardHeader) const hardSubHeader = Buffer.alloc(1024) new Header({ path: 'sub/', type: 'Directory', size: 0, }).encode(hardSubHeader, 0) new Header({ path: 'sub/exploit_sub', type: 'Link', size: 0, linkpath: '../secret.txt', }).encode(hardSubHeader, 512) chunks.push(hardSubHeader) const symHeader = Buffer.alloc(512) new Header({ path: 'exploit_sym', type: 'SymbolicLink', size: 0, linkpath: targetSym, }).encode(symHeader, 0) chunks.push(symHeader) const escapeHeader = Buffer.alloc(512) new Header({ path: 'secret.txt', type: 'SymbolicLink', linkpath: '../secret.txt', }).encode(escapeHeader, 0) chunks.push(escapeHeader) const aDirHeader = Buffer.alloc(512) new Header({ path: 'a/', type: 'Directory', mode: 0o755, }).encode(aDirHeader, 0) chunks.push(aDirHeader) const absWithDotDotHeader = Buffer.alloc(512) new Header({ path: 'a/link', type: 'SymbolicLink', linkpath: absoluteWithDotDot, }).encode(absWithDotDotHeader, 0) chunks.push(absWithDotDotHeader) const winAbsWithDotDotHeader = Buffer.alloc(512) new Header({ path: 'a/winrootdotslink', type: 'SymbolicLink', linkpath: 'c:..\\foo\\bar', }).encode(winAbsWithDotDotHeader, 0) chunks.push(winAbsWithDotDotHeader) const winAbsWithDotDotEscapeHeader = Buffer.alloc(512) new Header({ path: 'a/winrootdotsescapelink', type: 'SymbolicLink', linkpath: 'c:..\\..\\..\\..\\foo\\bar', }).encode(winAbsWithDotDotEscapeHeader, 0) chunks.push(winAbsWithDotDotEscapeHeader) chunks.push(Buffer.alloc(1024)) return Buffer.concat(chunks) } const dir = t.testdir({ 'secret.txt': 'ORIGINAL DATA', 'exploit.tar': getExploitTar(), out: {}, }) const out = resolve(dir, 'out') const tarFile = resolve(dir, 'exploit.tar') const WARNINGS: [code: string, message: string][] = [] t.before(() => x({ cwd: out, file: tarFile, onwarn: (code: string, message: string) => WARNINGS.push([code, message]), }), ) t.test('warnings', async t => t.matchSnapshot(WARNINGS)) t.test('writefile exploits fail', async t => { writeFileSync(resolve(out, 'exploit_hard'), 'OVERWRITTEN') t.equal( readFileSync(resolve(dir, 'secret.txt'), 'utf8'), 'ORIGINAL DATA', ) writeFileSync(resolve(out, 'sub/exploit_sub'), 'OVERWRITTEN SUB') t.equal( readFileSync(resolve(dir, 'secret.txt'), 'utf8'), 'ORIGINAL DATA', ) }) t.test('symlink escapes are sanitized', async t => { t.not(readlinkSync(resolve(out, 'exploit_sym')), targetSym) t.throws(() => lstatSync(resolve(out, 'secret.txt')), { code: 'ENOENT', }) }) t.test('absolute symlink with .. has prefix stripped', async t => { t.equal( readlinkSync(resolve(out, 'a/link')), '../a/target', 'symlink target should be normalized', ) t.equal( readlinkSync(resolve(out, 'a/winrootdotslink')), '..\\foo\\bar', 'symlink target should be normalized', ) t.throws( () => lstatSync(resolve(out, 'a/winrootdotsescapelink')), 'escaping symlink is not created', ) }) isaacs-node-tar-8a4b548/test/ghsa-r6q2-hw4h-h46w.ts000066400000000000000000000037441523070444600215410ustar00rootroot00000000000000import t from 'tap' import { normalizeUnicode } from '../src/normalize-unicode.js' import { Header } from '../src/header.js' import { extract } from '../src/extract.js' import { resolve } from 'node:path' import { lstatSync, readFileSync, statSync } from 'node:fs' // these characters are problems on macOS's APFS const chars = { ['ff'.normalize('NFC')]: 'FF', ['ï¬�'.normalize('NFC')]: 'FI', ['fl'.normalize('NFC')]: 'FL', ['ffi'.normalize('NFC')]: 'FFI', ['ffl'.normalize('NFC')]: 'FFL', ['ſt'.normalize('NFC')]: 'ST', ['st'.normalize('NFC')]: 'ST', ['ẛ'.normalize('NFC')]: 'Ṡ', ['ß'.normalize('NFC')]: 'SS', ['ẞ'.normalize('NFC')]: 'SS', ['Å¿'.normalize('NFC')]: 'S', } for (const [c, n] of Object.entries(chars)) { t.test(`${c} => ${n}`, async t => { t.equal(normalizeUnicode(c), n) t.test('link then file', async t => { const tarball = Buffer.alloc(2048) new Header({ path: c, type: 'SymbolicLink', linkpath: './target', }).encode(tarball, 0) new Header({ path: n, type: 'File', size: 1, }).encode(tarball, 512) tarball[1024] = 'x'.charCodeAt(0) const cwd = t.testdir({ tarball }) await extract({ cwd, file: resolve(cwd, 'tarball') }) t.throws(() => statSync(resolve(cwd, 'target'))) t.equal(readFileSync(resolve(cwd, n), 'utf8'), 'x') }) t.test('file then link', { saveFixture: true }, async t => { const tarball = Buffer.alloc(2048) new Header({ path: n, type: 'File', size: 1, }).encode(tarball, 0) tarball[512] = 'x'.charCodeAt(0) new Header({ path: c, type: 'SymbolicLink', linkpath: './target', }).encode(tarball, 1024) const cwd = t.testdir({ tarball }) await extract({ cwd, file: resolve(cwd, 'tarball') }) t.throws(() => statSync(resolve(cwd, 'target'))) t.equal(lstatSync(resolve(cwd, c)).isSymbolicLink(), true) }) }) } isaacs-node-tar-8a4b548/test/header.js000066400000000000000000000621641523070444600176100ustar00rootroot00000000000000import t from 'tap' import { Header } from '../dist/esm/header.js' import { name } from '../dist/esm/types.js' t.test('ustar format', t => { const buf = Buffer.from( '666f6f2e74787400000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000030303037353520003035373736312000303030303234200037373737' + '3737373737373700313236373735363735343000303133303531200030000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0075737461720030306973616163730000000000000000000000000000000000' + '0000000000000000007374616666000000000000000000000000000000000000' + '0000000000000000003030303030302000303030303030200000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000', 'hex', ) const h = new Header({ path: 'foo.txt', }) const slab = Buffer.alloc(1024) Object.assign(h, { mode: 0o755, uid: 24561, gid: 20, size: 0o77777777777, mtime: new Date('2016-04-01T22:00Z'), type: 'File', uname: 'isaacs', gname: 'staff', }) h.encode(slab) t.equal(slab.subarray(0, 512).toString('hex'), buf.toString('hex')) t.equal( slab.toString('hex'), buf.toString('hex') + new Array(1025).join('0'), ) const h2 = new Header(buf) t.match(h2, { path: 'foo.txt', mode: 0o755, uid: 24561, gid: 20, size: 0o77777777777, ctime: null, atime: null, uname: 'isaacs', gname: 'staff', cksumValid: true, cksum: 5673, }) t.end() }) t.test('xstar format', t => { const buf = Buffer.from( '666f6f2e74787400000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000030303037353520003035373736312000303030303234200030303030' + '3030303134342000313236373735363735343000303135313331200030000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0075737461720030306973616163730000000000000000000000000000000000' + '0000000000000000007374616666000000000000000000000000000000000000' + '0000000000000000003030303030302000303030303030200000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000031323637' + '3735363735343000313236373735363735343000000000000000000000000000' + // just some junk '420420420420420420420420420420420420420420420420420420420420', 'hex', ) const h = new Header({ path: 'foo.txt', }) Object.assign(h, { mode: 0o755, uid: 24561, gid: 20, size: 100, mtime: new Date('2016-04-01T22:00Z'), ctime: new Date('2016-04-01T22:00Z'), atime: new Date('2016-04-01T22:00Z'), type: 'File', uname: 'isaacs', gname: 'staff', }) h.encode() const slab = h.block t.equal(slab.toString('hex'), buf.subarray(0, 512).toString('hex')) const h2 = new Header(buf) t.match(h2, { path: 'foo.txt', mode: 0o755, uid: 24561, gid: 20, size: 100, mtime: new Date('2016-04-01T22:00Z'), ctime: new Date('2016-04-01T22:00Z'), atime: new Date('2016-04-01T22:00Z'), type: 'File', uname: 'isaacs', gname: 'staff', cksumValid: true, cksum: 6745, }) t.end() }) t.test('prefix handling', t => { t.plan(4) t.test('no times', t => { const buf = Buffer.from( '666f6f2e74787400000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000030303037353520003035373736312000303030303234200030303030' + '3030303134342000313236373735363735343000303337323734200030000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0075737461720030306973616163730000000000000000000000000000000000' + '0000000000000000007374616666000000000000000000000000000000000000' + '00000000000000000030303030303020003030303030302000722f652f612f6c' + '2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f722f652f612f6c2f6c2f79' + '2f2d2f722f652f612f6c2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f72' + '2f652f612f6c2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f722f652f61' + '2f6c2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f642f652f652f702f2d' + '2f702f612f742f68000000000000000000000000000000000000000000000000', 'hex', ) const h = new Header({ path: 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/' + 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-' + '/r/e/a/l/l/y/-/r/e/a/l/l/y/-/d/e/e/p/-/p/a/t/h/foo.txt', mode: 0o755, uid: 24561, gid: 20, size: 100, mtime: new Date('2016-04-01T22:00Z'), ctime: null, atime: undefined, type: '0', uname: 'isaacs', gname: 'staff', }) const b2 = Buffer.alloc(512) h.encode(b2, 0) t.equal( b2.toString().replace(/\0+/g, ' '), buf.toString().replace(/\0+/g, ' '), ) t.equal(b2.toString('hex'), buf.toString('hex')) const h2 = new Header(buf) t.match(h2, { path: 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/' + 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-' + '/r/e/a/l/l/y/-/r/e/a/l/l/y/-/d/e/e/p/-/p/a/t/h/foo.txt', mode: 0o755, uid: 24561, gid: 20, size: 100, mtime: new Date('2016-04-01T22:00Z'), ctime: null, atime: null, type: 'File', uname: 'isaacs', gname: 'staff', cksumValid: true, cksum: 16060, needPax: false, }) t.equal(b2.toString().replace(/\0.*$/, ''), 'foo.txt') t.equal( b2.subarray(345).toString().replace(/\0.*$/, ''), 'r/e/a/l/l/y/-' + '/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-' + '/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-' + '/d/e/e/p/-/p/a/t/h', ) t.end() }) t.test('a/c times, use shorter prefix field', t => { const buf = Buffer.from( '652f702f2d2f702f612f742f682f666f6f2e7478740000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000030303037353520003035373736312000303030303234200030303030' + '3030303134342000313236373735363735343000303431353030200030000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0075737461720030306973616163730000000000000000000000000000000000' + '0000000000000000007374616666000000000000000000000000000000000000' + '00000000000000000030303030303020003030303030302000722f652f612f6c' + '2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f722f652f612f6c2f6c2f79' + '2f2d2f722f652f612f6c2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f72' + '2f652f612f6c2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f722f652f61' + '2f6c2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f642f65000031323637' + '3735363735343000313236373735363735343000000000000000000000000000', 'hex', ) const h = new Header() h.path = 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/' + 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-' + '/r/e/a/l/l/y/-/r/e/a/l/l/y/-/d/e/e/p/-/p/a/t/h/foo.txt' h.mode = 0o755 h.uid = 24561 h.gid = 20 h.size = 100 h.mtime = new Date('2016-04-01T22:00Z') h.ctime = new Date('2016-04-01T22:00Z') h.atime = new Date('2016-04-01T22:00Z') h.type = 'File' h.uname = 'isaacs' h.gname = 'staff' const b2 = Buffer.alloc(512) h.encode(b2, 0) t.equal(b2.toString('hex'), buf.toString('hex')) const b3 = Buffer.alloc(1024) h.encode(b3, 100) t.equal(b2.toString('hex'), b3.subarray(100, 612).toString('hex')) const h2 = new Header(b3, 100) t.match( h2, { path: 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/' + 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-' + '/r/e/a/l/l/y/-/r/e/a/l/l/y/-/d/e/e/p/-/p/a/t/h/foo.txt', mode: 0o755, uid: 24561, gid: 20, size: 100, mtime: new Date('2016-04-01T22:00Z'), ctime: new Date('2016-04-01T22:00Z'), atime: new Date('2016-04-01T22:00Z'), type: 'File', uname: 'isaacs', gname: 'staff', cksumValid: true, cksum: 17216, needPax: false, }, 'header from buffer', ) t.equal(b2.toString().replace(/\0.*$/, ''), 'e/p/-/p/a/t/h/foo.txt') t.equal( b2.subarray(345).toString().replace(/\0.*$/, ''), 'r/e/a/l/l/y/-' + '/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-' + '/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/d/e', ) t.end() }) t.test('hella long basename', t => { const buf = Buffer.from( '6c6f6e672d66696c652d6c6f6e672d66696c652d6c6f6e672d66696c652d6c6f' + '6e672d66696c652d6c6f6e672d66696c652d6c6f6e672d66696c652d6c6f6e67' + '2d66696c652d6c6f6e672d66696c652d6c6f6e672d66696c652d6c6f6e672d66' + '696c650030303037353520003035373736312000303030303234200030303030' + '3030303134342000313236373735363735343000303630313431200030000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0075737461720030306973616163730000000000000000000000000000000000' + '0000000000000000007374616666000000000000000000000000000000000000' + '00000000000000000030303030303020003030303030302000722f652f612f6c' + '2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f722f652f612f6c2f6c2f79' + '2f2d2f722f652f612f6c2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f72' + '2f652f612f6c2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f722f652f61' + '2f6c2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f642f652f652f702f2d' + '2f702f612f742f68000000000000000000000000000000000000000000000000', 'hex', ) const h = new Header({ path: 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/' + 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/' + 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/d/e/e/p/-/p/a/t/h/' + new Array(20).join('long-file-') + 'long-file.txt', mode: 0o755, uid: 24561, gid: 20, size: 100, mtime: new Date('2016-04-01T22:00Z'), ctime: null, atime: undefined, type: '0', uname: 'isaacs', gname: 'staff', }) const b2 = Buffer.alloc(513) h.encode(b2, 1) t.equal(b2.toString('hex'), '00' + buf.toString('hex')) t.ok(h.needPax, 'need pax because long filename') const h2 = new Header(b2, 1) t.match(h2, { cksumValid: true, cksum: 24673, path: 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/' + 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/' + 'r/e/a/l/l/y/-/d/e/e/p/-/p/a/t/h/long-file-long-file-long-' + 'file-long-file-long-file-long-file-long-file-long-file-long-' + 'file-long-file', needPax: false, }) t.end() }) t.test('long basename, long dirname', t => { const buf = Buffer.from( '6c6f6e672d6469726e616d652d6c6f6e672d6469726e616d652d6c6f6e672d64' + '69726e616d652d6c6f6e672d6469726e616d652d6c6f6e672d6469726e616d65' + '2d6c6f6e672d6469726e616d652d6c6f6e672d6469726e616d652d6c6f6e672d' + '6469720030303037353520003035373736312000303030303234200030303030' + '3030303134342000313236373735363735343000303334323035200030000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0075737461720030306973616163730000000000000000000000000000000000' + '0000000000000000007374616666000000000000000000000000000000000000' + '0000000000000000003030303030302000303030303030200000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000', 'hex', ) const h = new Header({ path: new Array(30).join('long-dirname-') + 'long-dirname/' + new Array(20).join('long-file-') + 'long-file.txt', mode: 0o755, uid: 24561, gid: 20, size: 100, mtime: new Date('2016-04-01T22:00Z'), ctime: null, atime: undefined, type: '0', uname: 'isaacs', gname: 'staff', }) const b2 = Buffer.alloc(512) h.encode(b2, 0) t.equal(h.type, 'File') t.equal(h.typeKey, '0') t.equal(b2.toString('hex'), buf.toString('hex')) t.equal(h.cksum, 14469) t.ok(h.needPax, 'need pax because long filename') const h2 = new Header(b2) t.match(h2, { path: 'long-dirname-long-dirname-long-dirname-long-dirname-' + 'long-dirname-long-dirname-long-dirname-long-dir', cksum: 14469, cksumValid: true, needPax: false, }) t.end() }) }) t.test('throwers', t => { t.throws( _ => new Header(Buffer.alloc(100)), new Error('need 512 bytes for header'), ) t.throws( _ => new Header({}).encode(Buffer.alloc(100)), new Error('need 512 bytes for header'), ) t.end() }) t.test('null block', t => { const h = new Header(Buffer.alloc(512)) t.match(h, { cksumValid: false, needPax: false, path: '', type: 'File', mode: undefined, uid: undefined, gid: undefined, size: undefined, mtime: undefined, cksum: undefined, linkpath: '', uname: undefined, gname: undefined, devmaj: 0, devmin: 0, atime: undefined, ctime: undefined, nullBlock: true, }) t.end() }) t.test('unknown type', t => { const h = new Header( Buffer.from( '666f6f2e74787400000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000030303037353520003035373736312000303030303234200030303030' + '303030313434200031323637373536373534300030303630373620005a000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000', 'hex', ), ) t.equal(h.type, 'Unsupported') t.equal(h.typeKey, 'Unsupported') t.end() }) t.test('dir as file with trailing /', t => { const b = Buffer.from( '782f792f00000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000030303030' + '3030303030302000000000000000000000000000303034363136200030000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0075737461720030300000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000003030303030302000303030303030200000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000', 'hex', ) const h = new Header(b) t.equal(h.type, 'Directory') b[156] = '0'.charCodeAt(0) const h2 = new Header(b) t.equal(h2.type, 'Directory') t.end() }) t.test('null numeric values do not get written', t => { const b = Buffer.alloc(512) const h = new Header() h.encode(b, 0) t.same( b, Buffer.from( '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000303033303737200030000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0075737461720030300000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000003030303030302000303030303030200000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000', 'hex', ), ) const h2 = new Header(b) t.match(h2, { type: 'File', cksumValid: true, needPax: false, nullBlock: false, path: '', mode: undefined, uid: undefined, gid: undefined, size: undefined, mtime: undefined, cksum: 1599, linkpath: '', uname: '', gname: '', devmaj: 0, devmin: 0, atime: undefined, ctime: undefined, }) t.end() }) t.test('big numbers', t => { const b = Buffer.alloc(512) const h = new Header({ path: 'bignum', size: 0o77777777777 + 1, }) h.encode(b, 0) const h2 = new Header(b) t.equal(h2.size, 0o77777777777 + 1) t.end() }) t.test('dir with long body', t => { const b = Buffer.from( '7061636b6167652f76656e646f72000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000030303037353520003030303030302000303030303030200030303030' + '3030313030303020313330363133303232343120303132303236200035000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0075737461720030300000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000003030303030302000303030303030200000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000', 'hex', ) const h = new Header(b) t.equal(h.type, 'Directory') t.equal(h.size, 0) t.end() }) t.test('null block, global extended header', t => { const h = new Header( Buffer.alloc(512), 0, { undef: undefined, blerg: 'bloo', }, { path: '/global.path', foo: 'global foo', global: true, linkpath: 'asdf', }, ) t.match(h, { cksumValid: false, needPax: false, path: '', type: 'File', mode: null, uid: null, gid: null, size: null, mtime: null, cksum: null, linkpath: '', uname: null, gname: null, devmaj: 0, devmin: 0, atime: null, ctime: null, nullBlock: true, blerg: 'bloo', foo: 'global foo', }) t.end() }) t.test('gnutar-generated 10gb file size', t => { const b = Buffer.from( '313067622e696d67000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000030303030363634003030303137353000303030313735300080000000' + '0000000280000000313334373434303132303500303131313437002030000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0075737461722020006973616163730000000000000000000000000000000000' + '0000000000000000006973616163730000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000', 'hex', ) const h = new Header(b) t.equal(h.size, 1024 * 1024 * 1024 * 10, 'should be 10gb file') // cannot set type to something invalid t.throws(() => (h.type = 'Z')) t.end() }) t.test('tarmageddon, ensure that Header prioritizes Pax size', async t => { const h = new Header({ path: 'file.txt', size: 0, }) h.encode() t.equal(h.size, 0, 'size is zero in raw ustar header') const hPax = new Header(h.block, 0, { size: 123 }) t.equal(hPax.size, 123, 'if size is set in pax, takes priority') }) t.test('do not apply ex/gex to meta entries', t => { const normalEntryTypes = new Set([ 'File', 'OldFile', 'Link', 'SymbolicLink', 'CharacterDevice', 'BlockDevice', 'Directory', 'FIFO', 'ContiguousFile', 'GNUDumpDir', ]) for (const type of name.values()) { const data = new Header({ path: 'x', type, size: 1, }) data.encode() const h = new Header(data.block, 0, { size: 100, dev: 5678, ino: 9876, }) if (normalEntryTypes.has(type)) { if (h.type === 'Directory') { t.equal(h.size, 0, 'Directories always size=0, no matter what') } else { t.equal(h.size, 100, `expect ${type} to respect extended header`) } t.equal(h.dev, 5678, `expect ${type} to respect extended header`) t.equal(h.ino, 9876, `expect ${type} to respect extended header`) } else { t.equal(h.size, 1, `expect ${type} to ignore extended header`) t.equal(h.dev, undefined, `expect ${type} to ignore extended header`) t.equal(h.ino, undefined, `expect ${type} to ignore extended header`) } } return t.end() }) t.test('no negative size', t => { const i = new Header({ size: -1000 }) // stubbornly refuse t.equal(i.size, undefined) t.end() }) isaacs-node-tar-8a4b548/test/index.js000066400000000000000000000034501523070444600174600ustar00rootroot00000000000000import t from 'tap' import * as tar from '../dist/esm/index.js' t.match(tar, { create: Function, c: Function, replace: Function, r: Function, list: Function, t: Function, update: Function, u: Function, extract: Function, x: Function, Pack: Function, Unpack: Function, Parser: Function, ReadEntry: Function, WriteEntry: Function, Header: Function, Pax: Function, types: { name: new Map([ ['0', 'File'], ['', 'OldFile'], ['1', 'Link'], ['2', 'SymbolicLink'], ['3', 'CharacterDevice'], ['4', 'BlockDevice'], ['5', 'Directory'], ['6', 'FIFO'], ['7', 'ContiguousFile'], ['g', 'GlobalExtendedHeader'], ['x', 'ExtendedHeader'], ['A', 'SolarisACL'], ['D', 'GNUDumpDir'], ['I', 'Inode'], ['K', 'NextFileHasLongLinkpath'], ['L', 'NextFileHasLongPath'], ['M', 'ContinuationFile'], ['N', 'OldGnuLongPath'], ['S', 'SparseFile'], ['V', 'TapeVolumeHeader'], ['X', 'OldExtendedHeader'], ]), code: new Map([ ['File', '0'], ['OldFile', ''], ['Link', '1'], ['SymbolicLink', '2'], ['CharacterDevice', '3'], ['BlockDevice', '4'], ['Directory', '5'], ['FIFO', '6'], ['ContiguousFile', '7'], ['GlobalExtendedHeader', 'g'], ['ExtendedHeader', 'x'], ['SolarisACL', 'A'], ['GNUDumpDir', 'D'], ['Inode', 'I'], ['NextFileHasLongLinkpath', 'K'], ['NextFileHasLongPath', 'L'], ['ContinuationFile', 'M'], ['OldGnuLongPath', 'N'], ['SparseFile', 'S'], ['TapeVolumeHeader', 'V'], ['OldExtendedHeader', 'X'], ]), }, }) t.match(tar.PackSync, Function) t.match(tar.WriteEntrySync, Function) t.match(tar.WriteEntryTar, Function) t.match(tar.Pax.parse, Function) isaacs-node-tar-8a4b548/test/large-numbers.js000066400000000000000000000053501523070444600211150ustar00rootroot00000000000000import t from 'tap' import { encode, parse } from '../dist/esm/large-numbers.js' t.test('parse', t => { const cases = new Map([ ['ffffffffffffffffffffffff', -1], ['800000000000100000000020', 17592186044448], ['fffffffffffffffe1ecc8020', -8073215968], ['fffffffffffffff000000020', -68719476704], ['80000000001fffffffffffff', 9007199254740991], // MAX_SAFE_INTEGER ['ffffffffffe0000000000001', -9007199254740991], // MIN_SAFE_INTEGER ['800000000000100000000000', 17592186044416], ['fffffffffffffffe1ecc8000', -8073216000], ['fffffffffffffff000000000', -68719476736], ['800000000000000353b66200', 14289363456], ]) t.plan(cases.size) cases.forEach((value, hex) => t.equal(parse(Buffer.from(hex, 'hex')), value), ) }) t.test('parse out of range', t => { const cases = [ '800000030000000000000000', '800000000020000000000000', // MAX_SAFE_INTEGER + 1 'ffffffffffe0000000000000', // MIN_SAFE_INTEGER - 1 'fffffffffdd0000000000000', ] t.plan(cases.length) cases.forEach(hex => t.throws( _ => parse(Buffer.from(hex, 'hex')), Error('parsed number outside of javascript safe integer range'), ), ) }) t.test('parse invalid base256 encoding', t => { const cases = [ '313233343536373131', // octal encoded '700000030000000000000000', // does not start with 0x80 or 0xff ] t.plan(cases.length) cases.forEach(hex => t.throws( _ => parse(Buffer.from(hex, 'hex')), Error('invalid base256 encoding'), ), ) }) t.test('encode', t => { const cases = new Map([ ['ffffffffffffffffffffffff', -1], ['800000000000100000000020', 17592186044448], ['800000000000100000000000', 17592186044416], ['fffffffffffffffe1ecc8020', -8073215968], ['fffffffffffffff000000020', -68719476704], ['fffffffffffffff000000000', -68719476736], // Allows us to test the case where there's a trailing 00 ['80000000001fffffffffffff', 9007199254740991], // MAX_SAFE_INTEGER ['ffffffffffe0000000000001', -9007199254740991], // MIN_SAFE_INTEGER ]) t.plan(2) t.test('alloc', t => { t.plan(cases.size) cases.forEach((value, hex) => t.equal(encode(value, Buffer.alloc(12)).toString('hex'), hex), ) }) t.test('allocUnsafe', t => { t.plan(cases.size) cases.forEach((value, hex) => t.equal(encode(value, Buffer.allocUnsafe(12)).toString('hex'), hex), ) }) }) t.test('encode unsafe numbers', t => { const cases = [ Number.MAX_VALUE, Number.MAX_SAFE_INTEGER + 1, Number.MIN_SAFE_INTEGER - 1, Number.MIN_VALUE, ] t.plan(cases.length) cases.forEach(value => t.throws( _ => encode(value), Error( 'cannot encode number outside of javascript safe integer range', ), ), ) }) isaacs-node-tar-8a4b548/test/list.ts000066400000000000000000000260251523070444600173410ustar00rootroot00000000000000import type { Stats } from 'fs' import fs, { readFileSync } from 'fs' import fsp from 'fs/promises' import { dirname, resolve } from 'path' import type { Test } from 'tap' import t from 'tap' import { fileURLToPath } from 'url' import { list } from '../dist/esm/list.js' import { Parser } from '../dist/esm/parse.js' import type { ReadEntry } from '../dist/esm/read-entry.js' import { makeTar } from './fixtures/make-tar.js' const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename) const poop = new Error('poop') const cbFail = (...args: any[]) => (args[args.length - 1] as Function)(poop) const syncFail = () => { throw poop } const asyncFail = async () => syncFail() const lp = JSON.parse( readFileSync(__dirname + '/fixtures/parse/long-paths.json', 'utf8'), ) as ( | ['meta', string] | ['entry', Record] | ['nullBlock' | 'eof' | 'end'] )[] t.test('basic', t => { const file = resolve(__dirname, 'fixtures/tars/long-paths.tar') const expect = (lp as any[]) .filter(e => Array.isArray(e) && e[0] === 'entry') .map((e: ['entry', Record]) => e[1].path as string) const check = (actual: string[], t: Test) => { t.same(actual, expect) return Promise.resolve(null) } ;[1000, undefined].forEach(maxReadSize => { t.test('file maxReadSize=' + maxReadSize, t => { t.test('sync', t => { const actual: string[] = [] const onReadEntry = (entry: ReadEntry) => actual.push(entry.path) list({ file: file, sync: true, onReadEntry, maxReadSize, }) return check(actual, t) }) t.test('async promise', async t => { const actual: string[] = [] const onReadEntry = (entry: ReadEntry) => actual.push(entry.path) return await list({ file, onReadEntry, maxReadSize, }).then(() => check(actual, t)) }) t.test('async cb', t => { const actual: string[] = [] const onReadEntry = (entry: ReadEntry) => actual.push(entry.path) list( { file: file, onReadEntry: onReadEntry, maxReadSize: maxReadSize, }, (er?: Error) => { if (er) { throw er } check(actual, t) t.end() }, ) }) t.end() }) }) t.test('stream', t => { t.test('sync', t => { const actual: string[] = [] const onReadEntry = (entry: ReadEntry) => actual.push(entry.path) const l = list({ sync: true, onReadEntry }) l.end(fs.readFileSync(file)) return check(actual, t) }) t.test('async', t => { const actual: string[] = [] const onReadEntry = (entry: ReadEntry) => actual.push(entry.path) const l = list() l.on('entry', onReadEntry) l.on('end', _ => check(actual, t).then(_ => t.end())) fs.createReadStream(file).pipe(l) }) t.end() }) t.test('no onReadEntry function', () => list({ file: file })) t.test('limit to specific files', t => { const fileList = [ 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t', '170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc///', ] const expect = [ '170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', ] t.test('no filter function', async t => { const check = () => t.same(actual, expect) const actual: string[] = [] return list( { file: file, onReadEntry: entry => actual.push(entry.path), }, fileList, ).then(check) }) t.test('no filter function, stream', t => { const check = () => t.same(actual, expect) const actual: string[] = [] const onReadEntry = (entry: ReadEntry) => actual.push(entry.path) fs.createReadStream(file).pipe( list(fileList) .on('entry', onReadEntry) .on('end', _ => { check() t.end() }), ) }) t.test('filter function', async t => { const check = () => t.same(actual, expect.slice(0, 1)) const actual: string[] = [] return list( { file: file, filter: path => path === expect[0], onReadEntry: entry => actual.push(entry.path), }, fileList, ).then(check) }) return t.test('list is unmunged', t => { t.same(fileList, [ 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t', '170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc///', ]) t.end() }) }) t.end() }) t.test('bad args', t => { t.throws( () => list({ file: __filename, sync: true }, () => {}), new TypeError('callback not supported for sync tar functions'), ) t.throws( () => list({}, () => {}), new TypeError('callback only supported with file option'), ) t.end() }) t.test('stat fails', async t => { const { list } = await t.mockImport( '../src/list.js', { fs: t.createMock(fs, { open: cbFail, stat: cbFail, lstat: cbFail, fstat: cbFail, openSync: syncFail, statSync: syncFail, lstatSync: syncFail, fstatSync: syncFail, }), 'fs/promises': t.createMock(fsp, { open: asyncFail, stat: asyncFail, lstat: asyncFail, fstat: asyncFail, }), }, ) t.test('sync', t => { t.plan(1) t.throws(() => list({ file: __filename, sync: true }), poop) }) t.test('cb', t => { t.plan(1) list({ file: __filename }, er => t.equal(er, poop)) }) t.test('promise', t => { t.plan(1) list({ file: __filename }).catch(er => t.equal(er, poop)) }) t.end() }) t.test('read fail', t => { t.test('sync', async t => { const { list } = await t.mockImport( '../src/list.js', { fs: t.createMock(fs, { read: cbFail, readSync: syncFail, }), 'fs/promises': t.createMock(fsp, { read: asyncFail, }), }, ) t.plan(1) t.throws( () => list({ file: __filename, sync: true, maxReadSize: 10, }), poop, ) }) t.test('cb', async t => { const { list } = await t.mockImport( '../src/list.js', { fs: t.createMock(fs, { read: cbFail, readSync: syncFail, }), 'fs/promises': t.createMock(fsp, { read: asyncFail, }), }, ) t.plan(1) await list({ file: __filename }, er => t.equal(er, poop)) }) t.test('promise', async t => { const { list } = await t.mockImport( '../src/list.js', { fs: t.createMock(fs, { read: cbFail, readSync: syncFail, }), 'fs/promises': t.createMock(fsp, { read: asyncFail, }), }, ) t.plan(1) await list({ file: __filename }).catch(er => t.equal(er, poop)) }) t.end() }) t.test('noResume option', t => { const file = resolve(__dirname, 'fixtures/tars/file.tar') t.test('sync', t => { let e!: ReadEntry list({ file: file, onReadEntry: entry => { e = entry process.nextTick(() => { t.notOk(entry.flowing) entry.resume() }) }, sync: true, noResume: true, }) t.ok(e) t.notOk(e.flowing) e.on('end', () => t.end()) }) t.test('async', t => list({ file: file, onReadEntry: entry => { process.nextTick(() => { t.notOk(entry.flowing) entry.resume() }) }, noResume: true, }), ) t.end() }) t.test('typechecks', t => { const p = list() //@ts-expect-error p.then t.type(p, Parser) t.end() }) // GHSA-29xp-372q-xqph t.test('reduce file size while synchronously reading', async t => { const data = makeTar([ { type: 'File', path: 'a', size: 1, }, 'a', { type: 'File', path: 'b', size: 1, }, 'b', '', '', ]) const dataLen = data.byteLength const truncLen = 512 * 2 const truncData = data.subarray(0, truncLen) const setup = async (t: Test) => { const dir = t.testdir({ 'file.tar': data }) const file = resolve(dir, 'file.tar') const { list } = await t.mockImport( '../src/list.js', { 'node:fs': t.createMock(fs, { fstatSync: (fd: number): Stats => { const st = fs.fstatSync(fd) // truncate the file before we have a chance to read fs.writeFileSync(file, truncData) return st }, }), }, ) return { file, list } } t.test('gutcheck, reading normally reads the whole file', async t => { const dir = t.testdir({ 'file.tar': data }) const file = resolve(dir, 'file.tar') const entries: string[] = [] list({ file, sync: true, maxReadSize: dataLen + 1, onReadEntry: e => entries.push(e.path), }) t.strictSame(entries, ['a', 'b']) entries.length = 0 list({ file, sync: true, maxReadSize: dataLen - 1, onReadEntry: e => entries.push(e.path), }) t.strictSame(entries, ['a', 'b']) }) t.test('read in one go', async t => { const { file, list } = await setup(t) const entries: string[] = [] list({ file, sync: true, maxReadSize: dataLen + 1, onReadEntry: e => entries.push(e.path), }) t.strictSame(entries, ['a']) }) t.test('read in parts', async t => { const { file, list } = await setup(t) const entries: string[] = [] list({ file, sync: true, maxReadSize: dataLen / 4, onReadEntry: e => entries.push(e.path), }) t.strictSame(entries, ['a']) }) }) isaacs-node-tar-8a4b548/test/load-all.js000066400000000000000000000007471523070444600200440ustar00rootroot00000000000000// just load all the files so we can't cheat coverage by avoiding something import fs from 'fs' import t from 'tap' import path, { dirname } from 'path' import { fileURLToPath } from 'url' const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename) const lib = path.resolve(__dirname, '../dist/esm') await Promise.all( fs .readdirSync(lib) .filter(f => f.endsWith('.js')) .map(f => import('../dist/esm/' + f)), ) t.pass('all lib files loaded') isaacs-node-tar-8a4b548/test/make-command.ts000066400000000000000000000036641523070444600207230ustar00rootroot00000000000000import t from 'tap' import { makeCommand } from '../src/make-command.js' import { isAsyncFile, isAsyncNoFile, isSyncFile, isSyncNoFile, } from '../src/options.js' class Sync { sync: true = true } class Async {} const cmd = makeCommand( (opt, entries) => { t.equal(isSyncFile(opt), true) t.type(entries, Array) }, async (opt, entries) => { t.equal(isAsyncFile(opt), true) t.type(entries, Array) }, (opt, entries) => { t.equal(isSyncNoFile(opt), true) t.type(entries, Array) return new Sync() }, (opt, entries) => { t.equal(isAsyncNoFile(opt), true) t.type(entries, Array) return new Async() }, (opt, entries) => { if (entries?.length === 2) throw new Error('should not be len 2') if (!opt) throw new Error('should get opt') }, ) t.test('validation function is called', t => { t.throws(() => cmd({}, ['a', 'b'])) t.throws(() => cmd({ sync: true }, ['a', 'b'])) t.throws(() => cmd({ sync: true, file: 'x' }, ['a', 'b'])) t.throws(() => cmd({ file: 'x' }, ['a', 'b'])) // cases where cb is not allowed t.throws(() => cmd({}, [], () => {})) t.throws(() => cmd({}, () => {})) //@ts-expect-error t.throws(() => cmd({ sync: true }, [], () => {})) //@ts-expect-error t.throws(() => cmd({ sync: true }, () => {})) t.throws(() => cmd({ sync: true, file: 'x' }, [], () => {})) t.throws(() => cmd({ sync: true, file: 'x' }, () => {})) t.end() }) t.test('basic calls', async t => { t.match(cmd(), Async) t.match(cmd({}), Async) t.match(cmd({}, []), Async) t.match(cmd({ sync: true }), Sync) t.match(cmd({ sync: true }, []), Sync) t.equal(cmd({ sync: true, file: 'x' }), undefined) t.equal(await cmd({ file: 'x' }), undefined) t.equal(await cmd({ file: 'x' }, []), undefined) let cbCalled = false t.equal( await cmd({ file: 'x' }, [], () => { cbCalled = true }), undefined, ) t.equal(cbCalled, true, 'called callback') }) isaacs-node-tar-8a4b548/test/map.js000066400000000000000000000005421523070444600171250ustar00rootroot00000000000000import t from 'tap' import map from '../map.js' import { fileURLToPath } from 'url' const __filename = fileURLToPath(import.meta.url) t.equal(map('test/index.js'), 'src/index.ts') t.same(map('test/unpack.js'), ['src/unpack.ts', 'src/mkdir.ts']) t.same(map('test/load-all.js'), []) t.equal(map(__filename), 'map.js') t.equal(map('test/asdf'), 'src/asdf') isaacs-node-tar-8a4b548/test/mode-fix.js000066400000000000000000000010341523070444600200550ustar00rootroot00000000000000import t from 'tap' import { modeFix } from '../dist/esm/mode-fix.js' t.equal(modeFix(0o10644, false), 0o644) t.equal(modeFix(0o10644, true), 0o755) t.equal(modeFix(0o10604, true), 0o705) t.equal(modeFix(0o10600, true), 0o700) t.equal(modeFix(0o10066, true), 0o077) t.equal(modeFix(0o10664, false, true), 0o644) t.equal(modeFix(0o10066, false, true), 0o644) t.equal(modeFix(0o10666, true, true), 0o755) t.equal(modeFix(0o10604, true, true), 0o705) t.equal(modeFix(0o10600, true, true), 0o700) t.equal(modeFix(0o10066, true, true), 0o755) isaacs-node-tar-8a4b548/test/normalize-unicode.js000066400000000000000000000042451523070444600220000ustar00rootroot00000000000000import t from 'tap' import { fileURLToPath } from 'url' import { normalizeUnicode } from '../dist/esm/normalize-unicode.js' import { stripTrailingSlashes } from '../dist/esm/strip-trailing-slashes.js' import { normalizeWindowsPath } from '../dist/esm/normalize-windows-path.js' const __filename = fileURLToPath(import.meta.url) const fakePlatform = process.env.TESTING_TAR_FAKE_PLATFORM // cafeÌ� const cafe1 = Buffer.from([0x63, 0x61, 0x66, 0xc3, 0xa9]).toString() // cafe with a ` const cafe2 = Buffer.from([0x63, 0x61, 0x66, 0x65, 0xcc, 0x81]).toString() t.equal( normalizeUnicode(cafe1), normalizeUnicode(cafe2), 'matching unicodes', ) t.equal(normalizeUnicode(cafe1), normalizeUnicode(cafe2), 'cached') t.equal(normalizeUnicode('foo'), 'FOO', 'non-unicode string') if (fakePlatform === 'win32') { t.test('normalize with strip slashes', t => { const paths = [ '\\a\\b\\c\\d\\', '﹨aaaa﹨dddd﹨', 'ï¼¼bbbï¼¼eeeï¼¼', '\\\\\eee\\\\\\', '¼foo.txt', '1/4foo.txt', ] t.plan(paths.length) for (const path of paths) { t.test(JSON.stringify(path), t => { const a = normalizeUnicode( stripTrailingSlashes(normalizeWindowsPath(path)), ) const b = stripTrailingSlashes( normalizeWindowsPath(normalizeUnicode(path)), ) t.matchSnapshot(a, 'normalized') t.equal(a, b, 'order should not matter') t.end() }) } t.end() }) } t.test('blow out the cache', t => { const cafBuf = Buffer.from([0x63, 0x61, 0x66]) const e1 = Buffer.from([0x65, 0xcc, 0x81]) const e2 = Buffer.from([0xc3, 0xa9]) let cafe1 = cafBuf let cafe2 = cafBuf for (let i = 0; i < 11_001; i++) { cafe1 = Buffer.concat([cafe1, e1]) cafe2 = Buffer.concat([cafe2, e2]) const n1 = normalizeUnicode(cafe1.toString()) const n2 = normalizeUnicode(cafe2.toString()) // don't test all of these, too noisy if (!(i % 500)) { t.equal(n1, n2) } } t.end() }) if (fakePlatform !== 'win32') { t.spawn(process.execPath, [__filename, 'win32'], { env: { ...process.env, TESTING_TAR_FAKE_PLATFORM: 'win32', }, }) } isaacs-node-tar-8a4b548/test/normalize-windows-path.js000066400000000000000000000020401523070444600227650ustar00rootroot00000000000000import t from 'tap' const realPlatform = process.platform const fakePlatform = realPlatform === 'win32' ? 'posix' : 'win32' t.test('posix', async t => { if (realPlatform === 'win32') { process.env.TESTING_TAR_FAKE_PLATFORM = fakePlatform } else { delete process.env.TESTING_TAR_FAKE_PLATFORM } const { normalizeWindowsPath } = await t.mockImport( '../dist/esm/normalize-windows-path.js', ) t.equal( normalizeWindowsPath('/some/path/back\\slashes'), '/some/path/back\\slashes', ) t.equal(normalizeWindowsPath('c:\\foo\\bar'), 'c:\\foo\\bar') t.end() }) t.test('win32', async t => { if (realPlatform !== 'win32') { process.env.TESTING_TAR_FAKE_PLATFORM = fakePlatform } else { delete process.env.TESTING_TAR_FAKE_PLATFORM } const { normalizeWindowsPath } = await t.mockImport( '../dist/esm/normalize-windows-path.js', ) t.equal( normalizeWindowsPath('/some/path/back\\slashes'), '/some/path/back/slashes', ) t.equal(normalizeWindowsPath('c:\\foo\\bar'), 'c:/foo/bar') t.end() }) isaacs-node-tar-8a4b548/test/options.js000066400000000000000000000033301523070444600200410ustar00rootroot00000000000000import t from 'tap' import { dealias, isSync, isSyncFile, isFile, isAsyncFile, isAsyncNoFile, isSyncNoFile, isAsync, isNoFile, } from '../dist/esm/options.js' t.same(dealias(), {}) t.same(dealias(false), {}) t.same( dealias({ C: 'dir', f: 'file', z: 'zip', P: 'preserve', U: 'unlink', 'strip-components': 99, foo: 'bar', }), { cwd: 'dir', file: 'file', gzip: 'zip', preservePaths: 'preserve', unlink: 'unlink', strip: 99, foo: 'bar', }, ) t.same( dealias({ C: 'dir', f: 'file', z: 'zip', P: 'preserve', U: 'unlink', stripComponents: 99, foo: 'bar', }), { cwd: 'dir', file: 'file', gzip: 'zip', preservePaths: 'preserve', unlink: 'unlink', strip: 99, foo: 'bar', }, ) t.same(dealias({ noChmod: false }), { chmod: true }) t.same(dealias({ noChmod: true }), {}) t.equal(isSyncFile(dealias({ sync: true, f: 'x' })), true) t.equal(isSyncFile(dealias({ file: 'x' })), false) t.equal(isSyncFile(dealias({ sync: true })), false) t.equal(isSyncFile(dealias({})), false) t.equal(isSync(dealias({ sync: true, f: 'x' })), true) t.equal(isSync(dealias({ file: 'x' })), false) t.equal(isSync(dealias({ sync: true })), true) t.equal(isSync(dealias({})), false) t.equal(isAsync(dealias({})), true) t.equal(isFile(dealias({ sync: true, f: 'x' })), true) t.equal(isNoFile(dealias({ sync: true, f: 'x' })), false) t.equal(isFile(dealias({ file: 'x' })), true) t.equal(isFile(dealias({ sync: true })), false) t.equal(isFile(dealias({})), false) t.equal(isSyncFile(dealias({})), false) t.equal(isSyncNoFile(dealias({ sync: true })), true) t.equal(isAsyncFile(dealias({})), false) t.equal(isAsyncNoFile(dealias({})), true) isaacs-node-tar-8a4b548/test/pack.js000066400000000000000000001542441523070444600172770ustar00rootroot00000000000000import t from 'tap' import { Pack, PackSync } from '../dist/esm/pack.js' import fs from 'fs' import path, { resolve } from 'path' import { fileURLToPath } from 'url' import { Parser } from '../src/parse.js' import { Header } from '../dist/esm/header.js' import zlib from 'zlib' import * as miniz from 'minizlib' import mutateFS from 'mutate-fs' import { Minipass } from 'minipass' import EE from 'events' import { rimraf } from 'rimraf' import { mkdirp } from 'mkdirp' import { ReadEntry } from '../dist/esm/read-entry.js' import { normalizeWindowsPath as normPath } from '../dist/esm/normalize-windows-path.js' import { chmodrSync } from 'chmodr' const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) const fixtures = path.resolve(__dirname, 'fixtures') const files = path.resolve(fixtures, 'files') const tars = path.resolve(fixtures, 'tars') process.env.USER = 'isaacs' const isWindows = process.platform === 'win32' const ctime = new Date('2017-05-10T01:03:12.000Z') const atime = new Date('2017-04-17T00:00:00.000Z') const mtime = new Date('2016-04-01T19:00:00.000Z') t.teardown( mutateFS.statMutate((_er, st) => { if (st) { st.ctime = ctime st.atime = atime st.mtime = mtime } }), ) t.test('set up', t => { const one = fs.statSync(files + '/hardlink-1') const two = fs.statSync(files + '/hardlink-2') if (one.dev !== two.dev || one.ino !== two.ino) { try { fs.unlinkSync(files + '/hardlink-2') } catch (e) {} fs.linkSync(files + '/hardlink-1', files + '/hardlink-2') } chmodrSync(files, 0o644) t.end() }) t.test('pack a file', t => { const out = [] const seen = [] new Pack({ cwd: files, onWriteEntry: e => seen.push(e) }) .end('one-byte.txt') .on('data', c => out.push(c)) .on('end', _ => { const data = Buffer.concat(out) t.equal(data.length, 2048) t.match(data.subarray(512).toString(), /^a\0{511}\0{1024}$/) const h = new Header(data) const expect = { cksumValid: true, needPax: false, path: 'one-byte.txt', mode: isWindows ? 0o666 : 0o644, size: 1, mtime: mtime, cksum: Number, linkpath: '', uname: 'isaacs', gname: '', devmaj: 0, devmin: 0, atime: atime, ctime: ctime, nullBlock: false, type: 'File', } t.match(h, expect) || console.log(h, expect) const ps = new PackSync({ cwd: files }) const sout = [] ps.on('data', chunk => sout.push(chunk)) ps.add('one-byte.txt').end() const sync = Buffer.concat(sout) if (sync.length === 0) { throw new Error('no data!') } t.equal(sync.subarray(512).length, data.subarray(512).length) t.equal(sync.subarray(512).toString(), data.subarray(512).toString()) const hs = new Header(sync) t.match(hs, expect) t.strictSame( seen.map(e => e.path), ['one-byte.txt'], ) t.end() }) }) t.test('pack a file with a prefix', t => { const out = [] new Pack({ mtime, cwd: files, prefix: 'package/' }) .end('.dotfile') .on('data', c => out.push(c)) .on('end', _ => { const data = Buffer.concat(out) t.equal(data.length, 2048) t.match(data.subarray(512).toString(), /^.\n\0{510}\0{1024}$/) const h = new Header(data) const expect = { cksumValid: true, needPax: false, path: 'package/.dotfile', mode: isWindows ? 0o666 : 0o644, size: 2, mtime: mtime, cksum: Number, linkpath: '', uname: 'isaacs', gname: '', devmaj: 0, devmin: 0, atime: atime, ctime: ctime, nullBlock: false, type: 'File', } t.match(h, expect) const sync = new PackSync({ cwd: files, prefix: 'package' }) .add('.dotfile') .end() .read() t.equal(sync.subarray(512).toString(), data.subarray(512).toString()) const hs = new Header(sync) t.match(hs, expect) t.end() }) }) t.test('portable pack a dir', t => { const out = [] new Pack({ cwd: files, portable: true, gzip: true }) .add('dir') .on('data', c => out.push(c)) .end() .on('end', _ => { const zipped = Buffer.concat(out) t.equal(zipped[9], 255, 'gzip OS flag set to "unknown"') const data = new miniz.Gunzip().end(zipped).read() // dir/, dir/x, and the nulls // neither the dir or the file have any body bits const h = new Header(data) const expect = { type: 'Directory', cksumValid: true, needPax: false, path: 'dir/', mode: 0o755, size: 0, mtime: null, cksum: Number, linkpath: '', uname: '', gname: '', devmaj: 0, devmin: 0, atime: null, ctime: null, nullBlock: false, } t.match(h, expect) t.equal(data.length, 2048) t.match(data.subarray(1024).toString(), /^\0{1024}$/) const syncgz = new PackSync({ cwd: files, portable: true, gzip: true, }) .add('dir') .end() .read() t.equal(syncgz[9], 255, 'gzip OS flag set to "unknown"') const sync = new miniz.Gunzip().end(zipped).read() t.equal(sync.subarray(512).toString(), data.subarray(512).toString()) const hs = new Header(sync) t.match(hs, expect) const expect2 = { type: 'File', cksumValid: true, needPax: false, path: 'dir/x', mode: 0o644, size: 0, mtime: mtime, cksum: Number, linkpath: '', uname: '', gname: '', devmaj: 0, devmin: 0, atime: null, ctime: null, nullBlock: false, } t.match(new Header(data.subarray(512)), expect2) t.match(new Header(sync.subarray(512)), expect2) t.end() }) }) t.test('use process cwd if cwd not specified', t => { const cwd = process.cwd() t.teardown(_ => process.chdir(cwd)) process.chdir(files) const out = [] new Pack() .add('dir') .on('data', c => out.push(c)) .end() .on('end', _ => { const data = Buffer.concat(out) // dir/, dir/x, and the nulls // neither the dir or the file have any body bits const h = new Header(data) const expect = { type: 'Directory', cksumValid: true, needPax: false, path: 'dir/', mode: isWindows ? 0o777 : 0o755, size: 0, mtime: mtime, cksum: Number, linkpath: '', uname: 'isaacs', gname: '', devmaj: 0, devmin: 0, atime: atime, ctime: ctime, nullBlock: false, } t.match(h, expect) t.equal(data.length, 2048) t.match(data.subarray(1024).toString(), /^\0{1024}$/) const sync = new PackSync({ cwd: files }).add('dir').end().read() t.equal(sync.subarray(512).toString(), data.subarray(512).toString()) const hs = new Header(sync) t.match(hs, expect) const expect2 = { type: 'File', cksumValid: true, needPax: false, path: 'dir/x', mode: isWindows ? 0o666 : 0o644, size: 0, mtime: mtime, cksum: Number, linkpath: '', uname: 'isaacs', gname: '', devmaj: 0, devmin: 0, atime: atime, ctime: ctime, nullBlock: false, } t.match(new Header(data.subarray(512)), expect2) t.match(new Header(sync.subarray(512)), expect2) t.end() }) }) t.test('filter', t => { const out = [] const filter = (_path, stat) => stat.isDirectory() // only include directories, so dir/x should not appear new Pack({ cwd: files, filter: filter }) .add('dir') .on('data', c => out.push(c)) .end() .on('end', _ => { const data = Buffer.concat(out) // dir/, dir/x, and the nulls // neither the dir or the file have any body bits const h = new Header(data) const expect = { type: 'Directory', cksumValid: true, needPax: false, path: 'dir/', mode: isWindows ? 0o777 : 0o755, size: 0, mtime: mtime, cksum: Number, linkpath: '', uname: 'isaacs', gname: '', devmaj: 0, devmin: 0, atime: atime, ctime: ctime, nullBlock: false, } t.match(h, expect) t.equal(data.length, 1536) t.match(data.subarray(512).toString(), /^\0{1024}$/) const sync = new PackSync({ cwd: files, filter: filter }) .add('dir') .end() .read() t.equal(sync.subarray(512).toString(), data.subarray(512).toString()) const hs = new Header(sync) t.match(hs, expect) t.end() }) }) t.test('add the same dir twice (exercise cache code)', t => { const out = [] const filter = (_path, stat) => stat.isDirectory() // only include directories, so dir/x should not appear const pack = new Pack({ cwd: files, filter: filter }) .add('dir') .add('dir') .on('data', c => out.push(c)) .end() .on('end', _ => { const data = Buffer.concat(out) // dir/, dir/x, and the nulls // neither the dir or the file have any body bits const h = new Header(data) const expect = { type: 'Directory', cksumValid: true, needPax: false, path: 'dir/', mode: isWindows ? 0o777 : 0o755, size: 0, mtime: mtime, cksum: Number, linkpath: '', uname: 'isaacs', gname: '', devmaj: 0, devmin: 0, atime: atime, ctime: ctime, nullBlock: false, } t.match(h, expect) const h2 = new Header(data.subarray(512)) t.match(h2, expect) t.equal(data.length, 2048) t.match(data.subarray(1024).toString(), /^\0{1024}$/) const sync = new PackSync({ cwd: files, filter: filter, linkCache: pack.linkCache, readdirCache: pack.readdirCache, statCache: pack.statCache, }) .add('dir') .add('dir') .end() .read() t.equal( sync.subarray(1024).toString(), data.subarray(1024).toString(), ) const hs = new Header(sync) t.match(hs, expect) const hs2 = new Header(sync.subarray(512)) t.match(hs2, expect) t.end() }) }) t.test('if gzip is truthy, make it an object', t => { const opt = { gzip: true } new Pack(opt) t.type(opt.gzip, 'object') t.end() }) t.test('if brotli is truthy, make it an object', t => { const opt = { brotli: true } new Pack(opt) t.type(opt.brotli, 'object') t.end() }) t.test('if zstd is truthy, make it an object', t => { const opt = { zstd: true } new Pack(opt) t.type(opt.zstd, 'object') t.end() }) t.test('throws if both gzip and brotli are truthy', t => { const opt = { gzip: true, brotli: true } t.throws( _ => new Pack(opt), new TypeError('gzip, brotli, zstd are mutually exclusive'), ) t.end() }) t.test('throws if both gzip and zstd are truthy', t => { const opt = { gzip: true, zstd: true } t.throws( _ => new Pack(opt), new TypeError('gzip, brotli, zstd are mutually exclusive'), ) t.end() }) t.test('throws if both brotli and zstd are truthy', t => { const opt = { brotli: true, zstd: true } t.throws( _ => new Pack(opt), new TypeError('gzip, brotli, zstd are mutually exclusive'), ) t.end() }) t.test('throws if gzip, brotli, and zstd are all truthy', t => { const opt = { gzip: true, brotli: true, zstd: true } t.throws( _ => new Pack(opt), new TypeError('gzip, brotli, zstd are mutually exclusive'), ) t.end() }) t.test('gzip, also a very deep path', t => { const out = [] new Pack({ cwd: files, gzip: { flush: 1 }, }) .add('dir') .add('long-path') .on('data', c => out.push(c)) .end() .on('end', _ => { const zipped = Buffer.concat(out) const data = zlib.unzipSync(zipped) const entries = [] for (var i = 0; i < data.length; i += 512) { const slice = data.subarray(i, i + 512) const h = new Header(slice) if (h.nullBlock) { entries.push('null block') } else if (h.cksumValid) { entries.push([h.type, h.path]) } else if (entries.at(-1)[0] === 'File') { entries.at(-1).push(slice.toString().replace(/\0.*$/, '')) } } const expect = [ ['Directory', 'dir/'], ['Directory', 'long-path/'], ['File', 'dir/x'], ['Directory', 'long-path/r/'], ['Directory', 'long-path/r/e/'], ['Directory', 'long-path/r/e/a/'], ['Directory', 'long-path/r/e/a/l/'], ['Directory', 'long-path/r/e/a/l/l/'], ['Directory', 'long-path/r/e/a/l/l/y/'], ['Directory', 'long-path/r/e/a/l/l/y/-/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/'], [ 'Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/', ], [ 'Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/', ], [ 'Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/', ], [ 'Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt', 'short\n', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', '1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111', ], [ 'ExtendedHeader', 'PaxHeader/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', '2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222', ], [ 'ExtendedHeader', 'PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccc', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc', 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', ], ['ExtendedHeader', 'PaxHeader/Ω.txt'], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', 'Ω', ], 'null block', 'null block', ] let ok = true entries.forEach((entry, i) => { ok = ok && t.equal(entry[0], expect[i][0]) && t.equal(entry[1], expect[i][1]) && (!entry[2] || t.equal(entry[2], expect[i][2])) }) // t.match(entries, expect) t.end() }) }) t.test('brotli, also a very deep path', t => { const out = [] new Pack({ cwd: files, brotli: { flush: 1 }, }) .add('dir') .add('long-path') .on('data', c => out.push(c)) .end() .on('end', _ => { const zipped = Buffer.concat(out) const data = zlib.brotliDecompressSync(zipped) const entries = [] for (var i = 0; i < data.length; i += 512) { const slice = data.subarray(i, i + 512) const h = new Header(slice) if (h.nullBlock) { entries.push('null block') } else if (h.cksumValid) { entries.push([h.type, h.path]) } else if (entries.at(-1)[0] === 'File') { entries.at(-1).push(slice.toString().replace(/\0.*$/, '')) } } const expect = [ ['Directory', 'dir/'], ['Directory', 'long-path/'], ['File', 'dir/x'], ['Directory', 'long-path/r/'], ['Directory', 'long-path/r/e/'], ['Directory', 'long-path/r/e/a/'], ['Directory', 'long-path/r/e/a/l/'], ['Directory', 'long-path/r/e/a/l/l/'], ['Directory', 'long-path/r/e/a/l/l/y/'], ['Directory', 'long-path/r/e/a/l/l/y/-/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/'], [ 'Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/', ], [ 'Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/', ], [ 'Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/', ], [ 'Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt', 'short\n', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', '1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111', ], [ 'ExtendedHeader', 'PaxHeader/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', '2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222', ], [ 'ExtendedHeader', 'PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccc', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc', 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', ], ['ExtendedHeader', 'PaxHeader/Ω.txt'], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', 'Ω', ], 'null block', 'null block', ] let ok = true entries.forEach((entry, i) => { ok = ok && t.equal(entry[0], expect[i][0]) && t.equal(entry[1], expect[i][1]) && (!entry[2] || t.equal(entry[2], expect[i][2])) }) t.end() }) }) t.test('zstd, also a very deep path', t => { const out = [] new Pack({ cwd: files, zstd: { flush: 1 }, }) .add('dir') .add('long-path') .on('data', c => out.push(c)) .end() .on('end', _ => { const zipped = Buffer.concat(out) const data = zlib.zstdDecompressSync(zipped) const entries = [] for (var i = 0; i < data.length; i += 512) { const slice = data.subarray(i, i + 512) const h = new Header(slice) if (h.nullBlock) { entries.push('null block') } else if (h.cksumValid) { entries.push([h.type, h.path]) } else if (entries.at(-1)[0] === 'File') { entries.at(-1).push(slice.toString().replace(/\0.*$/, '')) } } const expect = [ ['Directory', 'dir/'], ['Directory', 'long-path/'], ['File', 'dir/x'], ['Directory', 'long-path/r/'], ['Directory', 'long-path/r/e/'], ['Directory', 'long-path/r/e/a/'], ['Directory', 'long-path/r/e/a/l/'], ['Directory', 'long-path/r/e/a/l/l/'], ['Directory', 'long-path/r/e/a/l/l/y/'], ['Directory', 'long-path/r/e/a/l/l/y/-/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/'], [ 'Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/', ], [ 'Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/', ], [ 'Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/', ], [ 'Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt', 'short\n', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', '1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111', ], [ 'ExtendedHeader', 'PaxHeader/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', '2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222', ], [ 'ExtendedHeader', 'PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccc', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc', 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', ], ['ExtendedHeader', 'PaxHeader/Ω.txt'], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', 'Ω', ], 'null block', 'null block', ] let ok = true entries.forEach((entry, i) => { ok = ok && t.equal(entry[0], expect[i][0]) && t.equal(entry[1], expect[i][1]) && (!entry[2] || t.equal(entry[2], expect[i][2])) }) t.end() }) }) t.test('very deep gzip path, sync', t => { const pack = new PackSync({ cwd: files, gzip: true, }) .add('dir') .add('long-path') .end() // these do nothing! pack.pause() pack.resume() const zipped = pack.read() t.type(zipped, Buffer) const data = zlib.unzipSync(zipped) const entries = [] for (var i = 0; i < data.length; i += 512) { const slice = data.subarray(i, i + 512) const h = new Header(slice) if (h.nullBlock) { entries.push('null block') } else if (h.cksumValid) { entries.push([h.type, h.path]) } else if (entries.at(-1)[0] === 'File') { entries.at(-1).push(slice.toString().replace(/\0.*$/, '')) } } const expect = [ ['Directory', 'dir/'], ['File', 'dir/x'], ['Directory', 'long-path/'], ['Directory', 'long-path/r/'], ['Directory', 'long-path/r/e/'], ['Directory', 'long-path/r/e/a/'], ['Directory', 'long-path/r/e/a/l/'], ['Directory', 'long-path/r/e/a/l/l/'], ['Directory', 'long-path/r/e/a/l/l/y/'], ['Directory', 'long-path/r/e/a/l/l/y/-/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/'], [ 'Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/', ], [ 'Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt', 'short\n', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', '1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111', ], [ 'ExtendedHeader', 'PaxHeader/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', '2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222', ], [ 'ExtendedHeader', 'PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccc', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc', 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', ], ['ExtendedHeader', 'PaxHeader/Ω.txt'], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', 'Ω', ], 'null block', 'null block', ] let ok = true entries.forEach((entry, i) => { ok = ok && t.equal(entry[0], expect[i][0]) && t.equal(entry[1], expect[i][1]) && (!entry[2] || t.equal(entry[2], expect[i][2])) }) // t.match(entries, expect) t.end() }) t.test('very deep brotli path, sync', t => { const pack = new PackSync({ cwd: files, brotli: true, }) .add('dir') .add('long-path') .end() // these do nothing! pack.pause() pack.resume() const zipped = pack.read() t.type(zipped, Buffer) const data = zlib.brotliDecompressSync(zipped) const entries = [] for (var i = 0; i < data.length; i += 512) { const slice = data.subarray(i, i + 512) const h = new Header(slice) if (h.nullBlock) { entries.push('null block') } else if (h.cksumValid) { entries.push([h.type, h.path]) } else if (entries.at(-1)[0] === 'File') { entries.at(-1).push(slice.toString().replace(/\0.*$/, '')) } } const expect = [ ['Directory', 'dir/'], ['File', 'dir/x'], ['Directory', 'long-path/'], ['Directory', 'long-path/r/'], ['Directory', 'long-path/r/e/'], ['Directory', 'long-path/r/e/a/'], ['Directory', 'long-path/r/e/a/l/'], ['Directory', 'long-path/r/e/a/l/l/'], ['Directory', 'long-path/r/e/a/l/l/y/'], ['Directory', 'long-path/r/e/a/l/l/y/-/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/'], [ 'Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/', ], [ 'Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt', 'short\n', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', '1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111', ], [ 'ExtendedHeader', 'PaxHeader/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', '2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222', ], [ 'ExtendedHeader', 'PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccc', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc', 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', ], ['ExtendedHeader', 'PaxHeader/Ω.txt'], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', 'Ω', ], 'null block', 'null block', ] let ok = true entries.forEach((entry, i) => { ok = ok && t.equal(entry[0], expect[i][0]) && t.equal(entry[1], expect[i][1]) && (!entry[2] || t.equal(entry[2], expect[i][2])) }) t.end() }) t.test('very deep zstd path, sync', t => { const pack = new PackSync({ cwd: files, zstd: true, }) .add('dir') .add('long-path') .end() // these do nothing! pack.pause() pack.resume() const zipped = pack.read() t.type(zipped, Buffer) const data = zlib.zstdDecompressSync(zipped) const entries = [] for (var i = 0; i < data.length; i += 512) { const slice = data.subarray(i, i + 512) const h = new Header(slice) if (h.nullBlock) { entries.push('null block') } else if (h.cksumValid) { entries.push([h.type, h.path]) } else if (entries.at(-1)[0] === 'File') { entries.at(-1).push(slice.toString().replace(/\0.*$/, '')) } } const expect = [ ['Directory', 'dir/'], ['File', 'dir/x'], ['Directory', 'long-path/'], ['Directory', 'long-path/r/'], ['Directory', 'long-path/r/e/'], ['Directory', 'long-path/r/e/a/'], ['Directory', 'long-path/r/e/a/l/'], ['Directory', 'long-path/r/e/a/l/l/'], ['Directory', 'long-path/r/e/a/l/l/y/'], ['Directory', 'long-path/r/e/a/l/l/y/-/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/'], ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/'], [ 'Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/', ], [ 'Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt', 'short\n', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', '1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111', ], [ 'ExtendedHeader', 'PaxHeader/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', '2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222', ], [ 'ExtendedHeader', 'PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccc', ], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc', 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', ], ['ExtendedHeader', 'PaxHeader/Ω.txt'], [ 'File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', 'Ω', ], 'null block', 'null block', ] let ok = true entries.forEach((entry, i) => { ok = ok && t.equal(entry[0], expect[i][0]) && t.equal(entry[1], expect[i][1]) && (!entry[2] || t.equal(entry[2], expect[i][2])) }) t.end() }) t.test('write after end', t => { const p = new Pack() p.end() t.throws(_ => p.add('nope'), new Error('write after end')) t.end() }) t.test('emit error when stat fail', t => { t.teardown(mutateFS.statFail(new Error('xyz'))) t.throws( _ => new PackSync({ cwd: files }).add('one-byte.txt'), new Error('xyz'), ) new Pack({ cwd: files }).add('one-byte.txt').on('error', e => { t.match(e, { message: 'xyz' }) t.end() }) }) t.test('readdir fail', t => { t.teardown(mutateFS.fail('readdir', new Error('xyz'))) t.throws(_ => new PackSync({ cwd: files }).add('dir'), new Error('xyz')) new Pack({ cwd: files }).add('dir').on('error', e => { t.match(e, { message: 'xyz' }) t.end() }) }) t.test('pipe into a slow reader', t => { const out = [] const mp = new Minipass() const mp2 = new Minipass() const p = new Pack({ cwd: files }).add('long-path').end() p.pause() p.pipe(mp).pipe(mp2) setTimeout(_ => { mp2.on('data', c => out.push(c)) setTimeout(_ => p.resume(), 100) }, 100) mp.on('end', _ => { const data = Buffer.concat(out) const h = new Header(data) const expect = { type: 'Directory', cksumValid: true, needPax: false, path: 'long-path/', mode: isWindows ? 0o777 : 0o755, size: 0, mtime: mtime, cksum: Number, linkpath: '', uname: 'isaacs', gname: '', devmaj: 0, devmin: 0, atime: atime, ctime: ctime, nullBlock: false, } t.match(h, expect) t.equal(data.length, 21504) t.match(data.subarray(data.length - 1024).toString(), /^\0{1024}$/) t.end() }) }) t.test('pipe into a slow gzip reader', t => { const out = [] const mp2 = new miniz.Unzip() const p = new Pack({ cwd: files, gzip: true }).add('long-path').end() p.pause() class SlowStream extends EE { write(chunk) { mp2.write(chunk) setTimeout(_ => { this.emit('drain') p.resume() }) return false } end(chunk) { return mp2.end(chunk) } } const ss = new SlowStream() setTimeout(_ => { p.pipe(ss) p.resume() }) mp2.on('data', c => out.push(c)) mp2.on('end', _ => { t.pass('mp2 end') const data = Buffer.concat(out) // dir/, dir/x, and the nulls // neither the dir or the file have any body bits const h = new Header(data) const expect = { type: 'Directory', cksumValid: true, needPax: false, path: 'long-path/', mode: isWindows ? 0o777 : 0o755, size: 0, mtime: mtime, cksum: Number, linkpath: '', uname: 'isaacs', gname: '', devmaj: 0, devmin: 0, atime: atime, ctime: ctime, nullBlock: false, } t.match(h, expect) t.equal(data.length, 21504) t.match(data.subarray(data.length - 1024).toString(), /^\0{1024}$/) t.end() }) }) t.test('ignores mid-queue', t => { // we let the first one through, and then ignore all the others // so that we trigger the case where an ignored entry is not the // head of the queue. let didFirst = false const p = new Pack({ cwd: tars, filter: (p, _st) => { if (p === './') { return true } if (!didFirst) { return (didFirst = true) } return false }, }) const out = [] const files = fs.readdirSync(tars) p.on('data', c => out.push(c)) p.on('end', _ => { const data = Buffer.concat(out) t.equal(data.subarray(0, 100).toString().replace(/\0.*$/, ''), './') const file = data.subarray(512, 612).toString().replace(/\0.*$/, '') t.not(files.indexOf(file), -1) t.end() }) p.add('') p.end() }) t.test('warnings', t => { const f = path.resolve(files, '512-bytes.txt') t.test('preservePaths=false strict=false', t => { const warnings = [] const p = new Pack({ cwd: files, onwarn: (c, m, p) => warnings.push([c, m, p]), }) .end(f) .on('data', c => out.push(c)) const out = [] p.on('end', _ => { const data = Buffer.concat(out) t.equal(data.length, 2048) t.match(warnings, [ [ 'TAR_ENTRY_INFO', /stripping .* from absolute path/, { path: normPath(f) }, ], ]) t.match(new Header(data), { path: normPath(f).replace(/^(\/|[a-z]:\/)/i, ''), }) t.end() }) }) t.test('preservePaths=true', t => { t.plan(2) // with preservePaths, strictness doens't matter ;[true, false].forEach(strict => { t.test('strict=' + strict, t => { const warnings = [] const out = [] const p = new Pack({ cwd: files, strict: strict, preservePaths: true, onwarn: (c, m, p) => warnings.push([c, m, p]), }) .end(f) .on('data', c => out.push(c)) p.on('end', _ => { const data = Buffer.concat(out) t.equal(warnings.length, 0) t.match(new Header(data), { path: normPath(f), }) t.end() }) }) }) }) t.test('preservePaths=false strict=true', t => { new Pack({ strict: true, cwd: files, }) .end(f) .on('error', e => { t.match(e, { message: /stripping .* from absolute path/, path: normPath(f), }) t.end() }) }) t.end() }) t.test('no dir recurse', t => { const dir = path.resolve(fixtures, 'pack-no-dir-recurse') t.teardown(_ => rimraf.sync(dir)) t.beforeEach(() => { rimraf.sync(dir) mkdirp.sync(dir + '/x') fs.writeFileSync(dir + '/x/y', 'y') }) const check = (t, data) => { t.equal(data.length, 512 + 1024) t.equal(data.slice(512).toString(), new Array(1025).join('\0')) t.match(new Header(data), { type: 'Directory', path: 'x/', size: 0, }) t.end() } t.test('async', t => { const p = new Pack({ cwd: dir, noDirRecurse: true, }) const out = [] p.end('x') .on('data', c => out.push(c)) .on('end', _ => check(t, Buffer.concat(out))) }) t.test('sync', t => { const p = new PackSync({ cwd: dir, noDirRecurse: true, }) p.end('x') check(t, p.read()) }) t.end() }) t.test( 'follow', { skip: isWindows && 'file symlinks not available' }, t => { const check = (out, t) => { const data = Buffer.concat(out) t.equal(data.length, 2048) t.match(new Header(data, 0), { type: 'File', cksumValid: true, needPax: false, path: 'symlink', mode: isWindows ? 0o666 : 0o644, size: 26, }) t.match( data.subarray(512).toString(), /this link is like diamond\n\0+$/, ) t.end() } t.test('async', t => { const out = [] const p = new Pack({ cwd: files, follow: true }) p.on('data', c => out.push(c)) p.on('end', _ => check(out, t)) p.end('symlink') }) t.test('sync', t => { const out = [] const p = new PackSync({ cwd: files, follow: true }) p.on('data', c => out.push(c)) p.end('symlink') check(out, t) }) t.end() }, ) t.test('pack ReadEntries', t => { t.test('basic', t => { const readEntry = new ReadEntry( new Header({ path: 'x', type: 'File', size: 1, }), ) const p = new Pack() p.end(readEntry) const out = [] p.on('data', c => out.push(c)) p.on('end', _ => { const data = Buffer.concat(out) t.equal(data.length, 2048) t.match(data.subarray(1024).toString(), /^\0+$/) t.equal(data.subarray(0, 100).toString().replace(/\0.*$/, ''), 'x') t.equal(data.subarray(512, 514).toString(), 'x\0') t.end() }) const buf = Buffer.alloc(512) buf.write('x') readEntry.end(buf) }) t.test('prefix', t => { const readEntry = new ReadEntry( new Header({ path: 'x', type: 'File', size: 1, }), ) const p = new Pack({ prefix: 'y' }) p.end(readEntry) const out = [] p.on('data', c => out.push(c)) p.on('end', _ => { const data = Buffer.concat(out) t.equal(data.length, 2048) t.match(data.subarray(1024).toString(), /^\0+$/) t.equal(data.subarray(0, 100).toString().replace(/\0.*$/, ''), 'y/x') t.equal(data.subarray(512, 514).toString(), 'x\0') t.end() }) const buf = Buffer.alloc(512) buf.write('x') readEntry.end(buf) }) t.test('filter out', t => { const re1 = new ReadEntry( new Header({ path: 'a', type: 'File', size: 1, }), ) const re2 = new ReadEntry( new Header({ path: 'x', type: 'File', size: 1, }), ) const re3 = new ReadEntry( new Header({ path: 'y', type: 'File', size: 1, }), ) const p = new Pack({ filter: p => p === 'x' }) p.add(re1) p.add(re2) p.end(re3) const out = [] p.on('data', c => out.push(c)) p.on('end', _ => { const data = Buffer.concat(out) t.equal(data.length, 2048) t.match(data.subarray(1024).toString(), /^\0+$/) t.equal(data.subarray(0, 100).toString().replace(/\0.*$/, ''), 'x') t.equal(data.subarray(512, 514).toString(), 'x\0') t.end() }) { const buf = Buffer.alloc(512) buf.write('x') re1.end(buf) } { const buf = Buffer.alloc(512) buf.write('x') re2.end(buf) } { const buf = Buffer.alloc(512) buf.write('x') re3.end(buf) } }) t.end() }) t.test('filter out everything', t => { const filter = _ => false const check = (out, t) => { const data = Buffer.concat(out) t.equal(data.length, 1024) t.match(data.toString(), /^\0+$/) t.end() } t.test('sync', t => { const out = [] const p = new PackSync({ cwd: files, filter: filter }) p.on('data', c => out.push(c)) p.end('./') check(out, t) }) t.test('async', t => { const out = [] const p = new PackSync({ cwd: files, filter: filter }) p.on('data', c => out.push(c)) p.on('end', _ => check(out, t)) p.end('./') }) t.end() }) t.test('fs.open fails', t => { const poop = new Error('poop') t.teardown(mutateFS.fail('open', poop)) t.test('async', t => { t.plan(1) new Pack({ cwd: files }) .on('error', er => t.equal(er, poop)) .end('one-byte.txt') }) t.test('sync', t => { t.plan(1) t.throws(_ => new PackSync({ cwd: files }).end('one-byte.txt'), poop) }) t.end() }) const write = opts => new Promise((resolve, reject) => { const p = new Pack() let totalSize = 0 p.on('data', d => (totalSize += d.length)) p.once('error', reject) p.once('end', () => resolve(totalSize)) const file1 = new ReadEntry( new Header({ path: 'file1.txt', size: 5, type: 'File', }), ) if (opts.before) { file1.end('file1') p.add(file1) } else { p.add(file1) file1.end('file1') } p.end() }) t.test('padding works regardless of arite/add order', t => Promise.all([write({ before: true }), write({ before: false })]).then( res => t.equal( res[0], res[1], 'length is the same regardless of write/add order', ), ), ) t.test('prefix and subdirs', t => { const dir = path.resolve(fixtures, 'pack-prefix-subdirs') t.teardown(_ => rimraf.sync(dir)) mkdirp.sync(dir + '/in/a/b/c') fs.writeFileSync(dir + '/in/a/b/c/d', 'ddd') fs.writeFileSync(dir + '/in/a/b/d', 'ddd') fs.writeFileSync(dir + '/in/a/d', 'ddd') fs.writeFileSync(dir + '/in/d', 'ddd') const expect = [ 'out/x/\0', 'out/x/a/\0', 'out/x/d\0', 'ddd\0', 'out/x/a/b/\0', 'out/x/a/d\0', 'ddd\0', 'out/x/a/b/c/\0', 'out/x/a/b/d\0', 'ddd\0', 'out/x/a/b/c/d\0', 'ddd\0', '\0', '\0', ] const check = (out, t) => { const data = Buffer.concat(out) expect.forEach((e, i) => t.equal(e, data.subarray(i * 512, i * 512 + e.length).toString()), ) t.end() } const runTest = (t, path, Class) => { const p = new Class({ cwd: dir + '/in', prefix: 'out/x', }) const out = [] p.on('data', d => out.push(d)) p.on('end', _ => check(out, t)) p.end(path) } t.test('async', t => { t.test('.', t => runTest(t, '.', Pack)) return t.test('./', t => runTest(t, './', Pack)) }) return t.test('sync', t => { t.test('.', t => runTest(t, '.', PackSync)) return t.test('./', t => runTest(t, './', PackSync)) }) }) // https://github.com/npm/node-tar/issues/284 t.test('prefix and hard links', t => { const target = resolve(t.testdirName, 'in', 'target') const dir = t.testdir({ in: { target: 'ddd', z: { b: { c: { d: t.fixture('link', target), }, d: t.fixture('link', target), }, d: t.fixture('link', target), }, y: t.fixture('link', target), }, }) const expect = [ 'out/x/\0', { type: 'File', size: 3, path: 'out/x/target', linkpath: '', }, 'ddd\0\0\0\0\0\0\0\0\0\0\0', { path: 'out/x/y', type: 'Link', linkpath: 'out/x/target', }, 'out/x/z/\0', 'out/x/z/b/\0', { path: 'out/x/z/d', type: 'Link', linkpath: 'out/x/target', }, 'out/x/z/b/c/\0', { path: 'out/x/z/b/d', type: 'Link', linkpath: 'out/x/target', }, { path: 'out/x/z/b/c/d', type: 'Link', linkpath: 'out/x/target', }, '\0', '\0', ] const check = (out, t) => { const data = Buffer.concat(out) expect.forEach((e, i) => { if (typeof e === 'string') { t.equal(data.subarray(i * 512, i * 512 + e.length).toString(), e) } else { t.match(new Header(data.subarray(i * 512, (i + 1) * 512)), e) } }) t.end() } const runTest = (t, path, Class) => { const p = new Class({ cwd: dir + '/in', prefix: 'out/x', noDirRecurse: true, jobs: 1, }) const out = [] p.on('data', d => out.push(d)) p.on('end', () => check(out, t)) p.write(path) if (path === '.') { path = './' } p.write(`${path}target`) p.write(`${path}y`) p.write(`${path}z`) p.write(`${path}z/b`) p.write(`${path}z/d`) p.write(`${path}z/b/c`) p.write(`${path}z/b/d`) p.write(`${path}z/b/c/d`) p.end() } t.test('async', async t => { t.test('.', t => runTest(t, '.', Pack)) t.test('./', t => runTest(t, './', Pack)) }) t.test('sync', async t => { t.test('.', t => runTest(t, '.', PackSync)) t.test('./', t => runTest(t, './', PackSync)) }) t.end() }) // https://github.com/isaacs/node-tar/issues/448 t.test('aggressive async link target timing', async t => { const target = resolve(t.testdirName, 'pkgB/aaa.js') t.chdir( t.testdir({ output: {}, pkgB: { 'package.json': JSON.stringify({ name: 'pkgb', version: '1.2.3', main: './dist/index.js', }), 'aaa.js': 'console.log("hello, world")', 'index.js': t.fixture('link', target), 'foo.js': t.fixture('link', target), dist: { 'index.js': t.fixture('link', target), }, }, }), ) const { Pack } = await t.mockImport('../src/pack.js', { fs: t.createMock(fs, { // ensure that readdir is sorted, for test consistency readdir: (...args) => { const cb = args.pop() fs.readdir(...args, (er, results) => { return cb( er, results?.sort((a, b) => a.localeCompare(b, 'en')), ) }) }, // make it take longer to stat the target, so it comes in last, // even though it's typically first in the queue. lstat: (path, cb) => { if (path === target) { setTimeout(() => fs.lstat(target, cb), 200) } else { return fs.lstat(path, cb) } }, }), }) let sawFile = false let sawLinks = 0 const p = new Pack({ jobs: 999 }) .add('pkgB') .end() .pipe( new Parser({ onReadEntry(entry) { if (entry.path === 'pkgB/aaa.js') { sawFile = true t.equal(entry.type, 'File') } else if (entry.type === 'Link') { t.equal(entry.linkpath, 'pkgB/aaa.js') t.equal(sawFile, true) sawLinks++ } entry.resume() }, }), ) await new Promise(res => p.on('end', res)) t.equal(sawFile, true) t.equal(sawLinks, 3) }) // regression in PENDINGLINKS update, if only ONE hardlink is seen // it'll be treated as the "link" if not current entry, and deferred // forever. t.test('avoid permanent link deferral', async t => { const target = resolve(t.testdirName, 'externalTarget') t.chdir( t.testdir({ output: {}, externalTarget: 'hello', pkgB: { 'package.json': JSON.stringify({ name: 'pkgb', version: '1.2.3', main: './dist/index.js', }), 'aaa.js': 'console.log("hello, world")', 'index.js': t.fixture('link', target), 'foo.js': t.fixture('link', target), dist: { 'index.js': t.fixture('link', target), }, }, }), ) const { Pack } = await t.mockImport('../src/pack.js', { fs: t.createMock(fs, { // ensure that readdir is sorted, for test consistency readdir: (...args) => { const cb = args.pop() fs.readdir(...args, (er, results) => { return cb( er, results?.sort((a, b) => a.localeCompare(b, 'en')), ) }) }, // make it take longer to stat the target, so it comes in last, // even though it's typically first in the queue. lstat: (path, cb) => { if (path === target) { setTimeout(() => fs.lstat(target, cb), 200) } else { return fs.lstat(path, cb) } }, }), }) const links = new Set() const p = new Pack({ jobs: 999 }) .add('pkgB') .end() .pipe( new Parser({ onReadEntry(entry) { if (entry.type === 'Link') { links.add(entry.path) links.add(entry.linkpath) } entry.resume() }, }), ) await new Promise(res => p.on('end', res)) t.strictSame( links, new Set(['pkgB/index.js', 'pkgB/foo.js', 'pkgB/dist/index.js']), ) }) isaacs-node-tar-8a4b548/test/parse.js000066400000000000000000000630601523070444600174660ustar00rootroot00000000000000import t from 'tap' import { Parser } from '../dist/esm/parse.js' import { makeTar } from './fixtures/make-tar.js' import fs, { readFileSync } from 'fs' import path, { dirname } from 'path' import zlib from 'zlib' import { Minipass } from 'minipass' import { Header } from '../dist/esm/header.js' import EE from 'events' import { fileURLToPath } from 'url' import { Pax } from '../dist/esm/pax.js' const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename) const tardir = path.resolve(__dirname, 'fixtures/tars') t.test('fixture tests', t => { class ByteStream extends Minipass { write(chunk) { for (let i = 0; i < chunk.length - 1; i++) { super.write(chunk.subarray(i, i + 1)) } const ret = super.write( chunk.subarray(chunk.length - 1, chunk.length), ) if (ret === false) { throw new Error('BS write return false') } return ret } } const trackEvents = (t, expect, p, slow) => { let ok = true let cursor = 0 p.on('entry', entry => { ok = ok && t.match(['entry', entry], expect[cursor++], entry.path) if (slow) { setTimeout(() => entry.resume()) } else { entry.resume() } }) p.on('ignoredEntry', entry => { ok = ok && t.match( ['ignoredEntry', entry], expect[cursor++], `ignored: ${entry.path}`, ) }) p.on('warn', (c, message, _data) => { ok = ok && t.match(['warn', c, message], expect[cursor++], 'warn') }) p.on('nullBlock', () => { ok = ok && t.match(['nullBlock'], expect[cursor++], 'null') }) p.on('error', er => { ok = ok && t.match(['error', er], expect[cursor++], 'error') }) p.on('meta', meta => { ok = ok && t.match(['meta', meta], expect[cursor++], 'meta') }) p.on('eof', () => { ok = ok && t.match(['eof'], expect[cursor++], 'eof') }) p.on('end', () => { ok = ok && t.match(['end'], expect[cursor++], 'end') t.end() }) } t.jobs = 4 const parsedir = path.resolve(__dirname, 'fixtures/parse') const files = fs.readdirSync(tardir) const maxMetaOpt = [250, undefined] const filterOpt = [true, false] const strictOpt = [true, false] const runTest = (file, maxMeta, filter, strict) => { const tardata = fs.readFileSync(file) const base = path.basename(file, '.tar') t.test( `file=${base}.tar maxmeta=${maxMeta} filter=${filter} strict=${strict}`, t => { const o = (maxMeta ? '-meta-' + maxMeta : '') + (filter ? '-filter' : '') + (strict ? '-strict' : '') const tail = (o ? '-' + o : '') + '.json' const eventsFile = parsedir + '/' + base + tail const expect = JSON.parse(readFileSync(eventsFile, 'utf8')) t.test('uncompressed one byte at a time', t => { const bs = new ByteStream() bs.on('data', c => { if (!Buffer.isBuffer(c)) throw new Error('wat1') if (c.length !== 1) throw new Error('wat2') }) const opt = maxMeta || filter || strict ? { maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : undefined, strict: strict, } : undefined const p = new Parser(opt) trackEvents(t, expect, p) bs.pipe(p) bs.write(tardata) bs.end() }) t.test('uncompressed all at once', t => { // this one writes it as a string const p = new Parser({ maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : undefined, strict: strict, }) trackEvents(t, expect, p) p.end(tardata.toString('hex'), 'hex', () => {}) }) t.test('uncompressed one byte at a time, filename .tbr', t => { const bs = new ByteStream() const opt = maxMeta || filter || strict ? { maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : undefined, strict: strict, file: 'example.tbr', } : undefined const bp = new Parser(opt) trackEvents(t, expect, bp) bs.pipe(bp) bs.end(tardata) }) t.test('uncompressed all at once, filename .tar.br', t => { const p = new Parser({ maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : undefined, strict: strict, file: 'example.tar.br', }) trackEvents(t, expect, p) p.end(tardata) }) t.test('gzipped all at once', t => { const p = new Parser({ maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : undefined, strict: strict, }) trackEvents(t, expect, p) p.end(zlib.gzipSync(tardata), () => {}) }) t.test('gzipped all at once, filename .tbr', t => { const p = new Parser({ maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : undefined, strict: strict, file: 'example.tbr', }) trackEvents(t, expect, p) p.write(zlib.gzipSync(tardata), () => {}) p.end(() => {}) }) t.test('gzipped byte at a time', t => { const bs = new ByteStream() const bp = new Parser({ maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : undefined, strict: strict, }) trackEvents(t, expect, bp) bs.pipe(bp) bs.end(zlib.gzipSync(tardata)) }) t.test('compress with brotli based on filename .tar.br', t => { const p = new Parser({ maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : undefined, strict: strict, file: 'example.tar.br', }) trackEvents(t, expect, p) p.end(zlib.brotliCompressSync(tardata)) }) t.test('compress with brotli based on filename .tbr', t => { const p = new Parser({ maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : undefined, strict: strict, file: 'example.tbr', }) trackEvents(t, expect, p) p.end(zlib.brotliCompressSync(tardata)) }) t.test('compress with brotli all at once', t => { const p = new Parser({ maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : undefined, strict: strict, brotli: {}, }) trackEvents(t, expect, p) p.end(zlib.brotliCompressSync(tardata)) }) t.test('compress with brotli byte at a time', t => { const bs = new ByteStream() const bp = new Parser({ maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : undefined, strict: strict, brotli: {}, }) trackEvents(t, expect, bp) bs.pipe(bp) bs.end(zlib.brotliCompressSync(tardata)) }) t.test('compress with brotli .tbr byte at a time', t => { const bs = new ByteStream() const bp = new Parser({ maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : undefined, strict: strict, file: 'example.tbr', }) trackEvents(t, expect, bp) bs.pipe(bp) bs.end(zlib.brotliCompressSync(tardata)) }) t.test('compress with zstd based on filename .tar.zst', t => { const p = new Parser({ maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : undefined, strict: strict, file: 'example.tar.zst', }) trackEvents(t, expect, p) p.end(zlib.zstdCompressSync(tardata)) }) t.test('compress with zstd based on filename .tzst', t => { const p = new Parser({ maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : undefined, strict: strict, file: 'example.tzst', }) trackEvents(t, expect, p) p.end(zlib.zstdCompressSync(tardata)) }) t.test('compress with zstd all at once', t => { const p = new Parser({ maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : undefined, strict: strict, zstd: {}, }) trackEvents(t, expect, p) p.end(zlib.zstdCompressSync(tardata)) }) t.test('compress with zstd byte at a time', t => { const bs = new ByteStream() const bp = new Parser({ maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : undefined, strict: strict, zstd: {}, }) trackEvents(t, expect, bp) bs.pipe(bp) bs.end(zlib.zstdCompressSync(tardata)) }) t.test('compress with zstd .tzst byte at a time', t => { const bs = new ByteStream() const bp = new Parser({ maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : undefined, strict: strict, file: 'example.tzst', }) trackEvents(t, expect, bp) bs.pipe(bp) bs.end(zlib.zstdCompressSync(tardata)) }) t.test('async chunks', t => { const p = new Parser({ maxMetaEntrySize: maxMeta, filter: filter ? (_path, entry) => entry.size % 2 !== 0 : undefined, strict: strict, }) trackEvents(t, expect, p, true) const first = tardata.subarray(0, Math.floor(tardata.length / 2)) p.write(first.toString('hex'), 'hex') process.nextTick(() => p.end(tardata.subarray(Math.floor(tardata.length / 2))), ) }) t.end() }, ) } files .map(f => path.resolve(tardir, f)) .forEach(file => maxMetaOpt.forEach(maxMeta => strictOpt.forEach(strict => filterOpt.forEach(filter => runTest(file, maxMeta, filter, strict), ), ), ), ) t.end() }) t.test('strict warn with an error emits that error', t => { t.plan(1) const p = new Parser({ strict: true, }) p.on('error', emitted => t.equal(emitted, er)) const er = new Error('yolo') p.warn('TAR_TEST', er) }) t.test('onwarn gets added to the warn event', t => { t.plan(1) const p = new Parser({ onwarn(_code, message) { t.equal(message, 'this is fine') }, }) p.warn('TAR_TEST', 'this is fine') }) t.test('onReadEntry gets added to entry event', t => { t.plan(1) const p = new Parser({ onReadEntry: entry => t.equal(entry, 'yes hello this is dog'), }) p.emit('entry', 'yes hello this is dog') }) t.test('drain event timings', t => { let sawOndone = false const ondone = function () { sawOndone = true this.emit('prefinish') this.emit('finish') this.emit('end') this.emit('close') } // write 1 header and body, write 2 header, verify false return // wait for drain event before continuing. // write 2 body, 3 header and body, 4 header, verify false return // wait for drain event // write 4 body and null blocks const data = [ [ { path: 'one', size: 513, type: 'File', }, new Array(513).join('1'), '1', { path: 'two', size: 513, type: 'File', }, new Array(513).join('2'), '2', { path: 'three', size: 1024, type: 'File', }, ], [ new Array(513).join('3'), new Array(513).join('3'), { path: 'four', size: 513, type: 'File', }, ], [ new Array(513).join('4'), '4', { path: 'five', size: 1024, type: 'File', }, new Array(513).join('5'), new Array(513).join('5'), { path: 'six', size: 1024, type: 'File', }, new Array(513).join('6'), new Array(513).join('6'), { path: 'seven', size: 1024, type: 'File', }, new Array(513).join('7'), new Array(513).join('7'), { path: 'eight', size: 1024, type: 'File', }, new Array(513).join('8'), new Array(513).join('8'), { path: 'four', size: 513, type: 'File', }, new Array(513).join('4'), '4', { path: 'five', size: 1024, type: 'File', }, new Array(513).join('5'), new Array(513).join('5'), { path: 'six', size: 1024, type: 'File', }, new Array(513).join('6'), new Array(513).join('6'), { path: 'seven', size: 1024, type: 'File', }, new Array(513).join('7'), new Array(513).join('7'), { path: 'eight', size: 1024, type: 'File', }, new Array(513).join('8'), ], [ new Array(513).join('8'), { path: 'nine', size: 1537, type: 'File', }, new Array(513).join('9'), ], [new Array(513).join('9')], [new Array(513).join('9')], ['9'], ].map(chunks => makeTar(chunks)) const expect = [ 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'four', 'five', 'six', 'seven', 'eight', 'nine', ] class SlowStream extends EE { write() { setTimeout(() => this.emit('drain')) return false } end() { return this.write() } } let currentEntry const autoPipe = true const p = new Parser({ ondone, onReadEntry: entry => { t.equal(entry.path, expect.shift()) currentEntry = entry if (autoPipe) { setTimeout(() => entry.pipe(new SlowStream())) } }, }) data.forEach(d => { if (!t.equal(p.write(d), false, 'write should return false')) { return t.end() } }) const go = () => { const d = data.shift() if (d === undefined) { return p.end() } let paused if (currentEntry) { currentEntry.pause() paused = true } const hunklen = Math.floor(d.length / 2) const hunks = [d.subarray(0, hunklen), d.subarray(hunklen)] p.write(hunks[0]) if (currentEntry && !paused) { currentEntry.pause() paused = true } if ( !t.equal(p.write(hunks[1]), false, 'write should return false: ' + d) ) { return t.end() } p.once('drain', go) if (paused) { currentEntry.resume() } } p.once('drain', go) p.on('end', () => { t.ok(sawOndone) t.end() }) go() }) t.test('consume while consuming', t => { const data = makeTar([ { path: 'one', size: 0, type: 'File', }, { path: 'zero', size: 0, type: 'File', }, { path: 'two', size: 513, type: 'File', }, new Array(513).join('2'), '2', { path: 'three', size: 1024, type: 'File', }, new Array(513).join('3'), new Array(513).join('3'), { path: 'zero', size: 0, type: 'File', }, { path: 'zero', size: 0, type: 'File', }, { path: 'four', size: 1024, type: 'File', }, new Array(513).join('4'), new Array(513).join('4'), { path: 'zero', size: 0, type: 'File', }, { path: 'zero', size: 0, type: 'File', }, ]) const runTest = (t, size) => { const p = new Parser() const first = data.subarray(0, size) const rest = data.subarray(size) p.once('entry', _entry => { for (let pos = 0; pos < rest.length; pos += size) { p.write(rest.subarray(pos, pos + size)) } p.end() }) .on('entry', entry => entry.resume()) .on('end', () => t.end()) .write(first) } // one that aligns, and another that doesn't, so that we // get some cases where there's leftover chunk and a buffer t.test('size=1000', t => runTest(t, 1000)) t.test('size=1024', t => runTest(t, 4096)) t.end() }) t.test('truncated input', t => { const data = makeTar([ { path: 'foo/', type: 'Directory', }, { path: 'foo/bar', type: 'File', size: 18, }, ]) t.test('truncated at block boundary', t => { const warnings = [] const p = new Parser({ onwarn: (_c, message) => warnings.push(message), }) p.end(data) t.same(warnings, [ 'Truncated input (needed 512 more bytes, only 0 available)', ]) t.end() }) t.test('truncated mid-block', t => { const warnings = [] const p = new Parser({ onwarn: (_c, message) => warnings.push(message), }) p.write(data) p.end(Buffer.from('not a full block')) t.same(warnings, [ 'Truncated input (needed 512 more bytes, only 16 available)', ]) t.end() }) t.end() }) t.test('truncated gzip input', t => { const raw = makeTar([ { path: 'foo/', type: 'Directory', }, { path: 'foo/bar', type: 'File', size: 18, }, new Array(19).join('x'), '', '', ]) const tgz = zlib.gzipSync(raw) const split = Math.floor((tgz.length * 2) / 3) const trunc = tgz.subarray(0, split) const skipEarlyEnd = process.version.match(/^v4\./) t.test( 'early end', { skip: skipEarlyEnd ? 'not a zlib error on v4' : false, }, t => { const warnings = [] const p = new Parser() p.on('error', er => warnings.push(er.message)) let aborted = false p.on('abort', () => (aborted = true)) p.end(trunc) t.equal(aborted, true, 'aborted writing') t.same(warnings, ['zlib: unexpected end of file']) t.end() }, ) t.test('just wrong', t => { const warnings = [] const p = new Parser() p.on('error', er => warnings.push(er.message)) let aborted = false p.on('abort', () => (aborted = true)) p.write(trunc) p.write(trunc) p.write(tgz.subarray(split)) p.end() t.equal(aborted, true, 'aborted writing') t.match(warnings, [/^zlib: /]) t.end() }) t.end() }) t.test('end while consuming', t => { // https://github.com/npm/node-tar/issues/157 const data = zlib.gzipSync( makeTar([ { path: 'package/package.json', type: 'File', size: 130, }, new Array(131).join('x'), { path: 'package/node_modules/@c/d/node_modules/e/package.json', type: 'File', size: 30, }, new Array(31).join('e'), { path: 'package/node_modules/@c/d/package.json', type: 'File', size: 33, }, new Array(34).join('d'), { path: 'package/node_modules/a/package.json', type: 'File', size: 59, }, new Array(60).join('a'), { path: 'package/node_modules/b/package.json', type: 'File', size: 30, }, new Array(31).join('b'), '', '', ]), ) const actual = [] const expect = [ 'package/package.json', 'package/node_modules/@c/d/node_modules/e/package.json', 'package/node_modules/@c/d/package.json', 'package/node_modules/a/package.json', 'package/node_modules/b/package.json', ] const mp = new Minipass() const p = new Parser({ onReadEntry: entry => { actual.push(entry.path) entry.resume() }, onwarn: (c, m, data) => t.fail(`${c}: ${m}`, data), }) p.on('end', () => { t.same(actual, expect) t.end() }) mp.end(data) mp.pipe(p) }) t.test('bad archives', t => { const p = new Parser() const warnings = [] p.on('warn', (code, msg, data) => { warnings.push([code, msg, data]) }) p.on('end', () => { // last one should be 'this archive sucks' t.match(warnings.pop(), [ 'TAR_BAD_ARCHIVE', 'Unrecognized archive format', { code: 'TAR_BAD_ARCHIVE', tarCode: 'TAR_BAD_ARCHIVE' }, ]) t.end() }) // javascript test is not a tarball. p.end(fs.readFileSync(__filename)) }) t.test('header that throws', t => { const p = new Parser() p.on('warn', (_c, m, d) => { t.equal(m, 'invalid base256 encoding') t.match(d, { code: 'TAR_ENTRY_INVALID', }) t.end() }) const h = new Header({ path: 'path', mode: 0o07777, // gonna make this one invalid uid: 1234, gid: 4321, type: 'File', size: 1, }) h.encode() const buf = h.block const bad = Buffer.from([0x81, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]) bad.copy(buf, 100) t.throws(() => new Header(buf), 'the header with that buffer throws') p.write(buf) }) t.test('warnings that are not so bad', t => { const p = new Parser() const warnings = [] p.on('warn', (code, m, d) => { warnings.push([code, m, d]) t.fail('should get no warnings') }) // the parser doesn't actually decide what's "ok" or "supported", // it just parses. So we have to set it ourselves like unpack does p.once('entry', entry => (entry.invalid = true)) p.on('entry', entry => entry.resume()) const data = makeTar([ { path: '/a/b/c', type: 'File', size: 1, }, 'a', { path: 'a/b/c', type: 'Directory', }, '', '', ]) p.on('end', () => { t.same(warnings, []) t.end() }) p.end(data) }) // verify that node-tar is not vulnerable to tarmageddon attack // https://edera.dev/stories/tarmageddon t.test('tarmageddon', t => { // this is the nested tarball that will be inside the archive const nested = makeTar([ { path: 'one', size: 1, type: 'File', }, '1', ]) // gutcheck t.equal(nested.byteLength, 1024) // Expect this one to have 2 entries. // First a zero-length nested.tar, then the 'one' file. t.test('no pax, 2 entries', t => { const noPax = makeTar([ { path: 'nested.tar', size: 0, }, nested, '', '', ]) const expect = [ { size: 0, path: 'nested.tar' }, { size: 1, path: 'one' }, ] const actual = [] const p = new Parser() p.on('entry', e => { e.resume() actual.push({ size: e.size, path: e.path, }) }) p.on('end', () => { t.strictSame(actual, expect) t.end() }) p.end(noPax) }) t.test('with pax, 1 entry', async t => { // when there is a Pax header, that size overrides the size in // the ustar header block. const withPax = makeTar([ new Pax({ path: 'nested.tar', // actual size of nested tarball, 1024 bytes size: nested.byteLength, }).encode(), { path: 'nested.tar', // fake size, attempting to unpack tar's contents directly size: 0, }, nested, ]) // expect a single 1024 byte file entry to be emitted const expect = [{ size: 1024, path: 'nested.tar' }] const actual = [] const p = new Parser() p.on('entry', e => { actual.push({ size: e.size, path: e.path, }) e.resume() }) p.on('end', () => { t.strictSame(actual, expect) t.end() }) p.end(withPax) }) t.end() }) t.test('max decompression ratio', async t => { const makeCompressedBomb = () => { const payload = Buffer.alloc(8 * 1024 * 1024) return zlib.gzipSync( makeTar([ { path: 'bomb', size: payload.length, type: 'File', }, payload, '', '', ]), ) } const bomb = makeCompressedBomb() t.test('parsing aborts by default', async t => { const p = new Parser({}) t.throws( () => p.end(bomb), { tarCode: 'TAR_ABORT', recoverable: false, message: /max decompression ratio exceeded/, }, 'parsing aborts', ) // no-op to abort again p.abort(new Error('hello')) }) t.test('aborting only happens one time', t => { const p = new Parser({}) t.throws(() => p.abort(new Error('hello')), { message: 'hello', tarCode: 'TAR_ABORT', recoverable: false, }) // this is ignored p.end(bomb) t.end() }) t.test('parsing can disable the limit explicitly', async () => { let bytesRead = 0 await new Promise(res => new Parser({ maxDecompressionRatio: Infinity, onReadEntry(e) { e.on('data', c => (bytesRead += c.byteLength)) }, }) .on('end', res) .end(bomb) .resume(), ) t.equal(bytesRead, 8 * 1024 * 1024) }) t.end() }) isaacs-node-tar-8a4b548/test/path-reservations.js000066400000000000000000000104641523070444600220320ustar00rootroot00000000000000import t from 'tap' import { posix, win32 } from 'node:path' // load up the posix and windows versions of the reserver if (process.platform === 'win32') { process.env.TESTING_TAR_FAKE_PLATFORM = 'posix' } const { PathReservations } = await t.mockImport( '../dist/esm/path-reservations.js', { path: posix, }, ) delete process.env.TESTING_TAR_FAKE_PLATFORM if (process.platform !== 'win32') { process.env.TESTING_TAR_FAKE_PLATFORM = 'win32' } const { PathReservations: WinPathReservations } = await t.mockImport( '../dist/esm/path-reservations.js', { path: win32, }, ) t.test('basic race', t => { // simulate the race conditions we care about let didFile = false const file = done => { t.equal(didFile, false, 'only call file once') didFile = true t.equal(didLink, false, 'do file before link') setTimeout(done) } let didLink = false const link = done => { t.equal(didLink, false, 'only call once') t.equal(didFile, true, 'do file before link') didLink = true // make sure this one is super duper cleared lol // the subsequent calls are no-ops, but verify as much done() done() done() } let didDir = false const dir = done => { t.equal(didDir, false, 'only do dir once') t.equal(didLink, true, 'do link before dir') didDir = true done() } let didDir2 = false const dir2 = done => { t.equal(didDir, true, 'did dir before dir2') t.equal(didDir2, false, 'only do dir2 once') didDir2 = true done() } let didDir3 = false const dir3 = done => { t.equal(didDir2, true, 'did dir2 before dir3') t.equal(didDir3, false, 'only do dir3 once') didDir3 = true done() t.end() } const r = new PathReservations() t.ok(r.reserve(['a/b/c/d'], file), 'file starts right away') t.notOk(r.reserve(['a/B/c////D', 'a/b/e'], link), 'link waits') t.notOk(r.reserve(['a/b/e/f'], dir), 'dir waits') t.notOk(r.reserve(['a/b'], dir2), 'dir2 waits') t.notOk(r.reserve(['a/b/x'], dir3), 'dir3 waits') }) t.test('unicode shenanigans', t => { const e1 = Buffer.from([0xc3, 0xa9]) const e2 = Buffer.from([0x65, 0xcc, 0x81]) let didCafe1 = false const cafe1 = done => { t.equal(didCafe1, false, 'did cafe1 only once') t.equal(didCafe2, false, 'did cafe1 before cafe2') didCafe1 = true setTimeout(done) } let didCafe2 = false const cafe2 = done => { t.equal(didCafe1, true, 'did cafe1 before cafe2') t.equal(didCafe2, false, 'did cafe2 only once') didCafe2 = true done() t.end() } const cafePath1 = `c/a/f/${e1}` const cafePath2 = `c/a/f/${e2}` const r = new PathReservations() t.ok(r.reserve([cafePath1], cafe1)) t.notOk(r.reserve([cafePath2], cafe2)) }) t.test('absolute paths and trailing slash', t => { let calledA1 = false let calledA2 = false const a1 = done => { t.equal(calledA1, false, 'called a1 only once') t.equal(calledA2, false, 'called a1 before 2') calledA1 = true setTimeout(done) } const a2 = done => { t.equal(calledA1, true, 'called a1 before 2') t.equal(calledA2, false, 'called a2 only once') calledA2 = true done() if (calledR2) { t.end() } } let calledR1 = false let calledR2 = false const r1 = done => { t.equal(calledR1, false, 'called r1 only once') t.equal(calledR2, false, 'called r1 before 2') calledR1 = true setTimeout(done) } const r2 = done => { t.equal(calledR1, true, 'called r1 before 2') t.equal(calledR2, false, 'called r1 only once') calledR2 = true done() if (calledA2) { t.end() } } const r = new PathReservations() t.ok(r.reserve(['/p/a/t/h'], a1)) t.notOk(r.reserve(['/p/a/t/h/'], a2)) t.ok(r.reserve(['p/a/t/h'], r1)) t.notOk(r.reserve(['p/a/t/h/'], r2)) }) t.test('on windows, everything collides with everything', t => { const r = new WinPathReservations() let called1 = false let called2 = false const f1 = done => { t.equal(called1, false, 'only call 1 once') t.equal(called2, false, 'call 1 before 2') called1 = true setTimeout(done) } const f2 = done => { t.equal(called1, true, 'call 1 before 2') t.equal(called2, false, 'only call 2 once') called2 = true done() t.end() } t.equal(r.reserve(['some/path'], f1), true) t.equal(r.reserve(['other/path'], f2), false) }) isaacs-node-tar-8a4b548/test/pax.js000066400000000000000000000252431523070444600171450ustar00rootroot00000000000000import t from 'tap' import { Pax } from '../dist/esm/pax.js' t.test('create a pax', t => { const p = new Pax({ atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('1979-07-01T19:10:00.000Z'), mtime: new Date('1979-07-01T19:10:00.000Z'), gid: 20, gname: 'staff', uid: 24561, uname: 'isaacs', path: 'foo.txt', size: 100, dev: 123456, ino: 7890, nlink: 1, }) const buf = Buffer.from( // pax entry header '5061784865616465722f666f6f2e747874000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000030303036343420003035373736312000303030303234200030303030' + '3030303330342000323136373231373631302000303136373332200078000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0075737461720030306973616163730000000000000000000000000000000000' + '0000000000000000007374616666000000000000000000000000000000000000' + '0000000000000000003030303030302000303030303030200000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000032313637' + '3231373631302000323136373231373631302000000000000000000000000000' + // entry body '313620706174683d666f6f2e7478740a3139206374696d653d32393937303432' + '30300a3139206174696d653d3239393730343230300a323120534348494c592e' + '6465763d3132333435360a313920534348494c592e696e6f3d373839300a3138' + '20534348494c592e6e6c696e6b3d310a39206769643d32300a313520676e616d' + '653d73746166660a3139206d74696d653d3239393730343230300a3132207369' + '7a653d3130300a3133207569643d32343536310a313620756e616d653d697361' + '6163730a00000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000', 'hex', ) const actual = p.encode() t.match(actual, buf) t.end() }) t.test('null pax', t => { const p = new Pax({}) t.same(p.encode(), Buffer.allocUnsafe(0)) t.end() }) t.test('tiny pax', t => { // weird to have a global setting a path. Maybe this should be // an error? const p = new Pax({ path: 'ab' }, true) const actual = p.encode() const buf = Buffer.from( // header '5061784865616465722f61620000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000030303036343420000000000000000000000000000000000030303030' + '3030303031332000000000000000000000000000303037303534200067000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0075737461720030300000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000003030303030302000303030303030200000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + // body // note that a 2-char path is 11, but a 1 char path is 9, because // adding the second char bumps the n to 10, which adds 1, which // means it has to be 11. // a 1-char path COULD be encoded as EITHER "10 path=x\n", or as // "9 path=x\n", and it'd be true either way. '313120706174683d61620a000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000', 'hex', ) t.same(actual, buf) t.end() }) t.test('parse', t => { const p = Pax.parse('11 path=ab\n', { uid: 24561 }, true) t.same( p, Object.assign(Object.create(Pax.prototype), { atime: undefined, mode: undefined, charset: undefined, comment: undefined, ctime: undefined, gid: undefined, gname: undefined, linkpath: undefined, mtime: undefined, path: 'ab', size: undefined, uid: 24561, uname: undefined, dev: undefined, ino: undefined, nlink: undefined, global: true, }), ) t.same( Pax.parse('11 path=ab\n'), Object.assign(Object.create(Pax.prototype), { atime: undefined, mtime: undefined, ctime: undefined, charset: undefined, comment: undefined, gid: undefined, gname: undefined, linkpath: undefined, path: 'ab', size: undefined, mode: undefined, uid: undefined, uname: undefined, dev: undefined, ino: undefined, nlink: undefined, global: false, }), ) t.same(Pax.parse('9 gid=20\n9 path=x\n'), { atime: undefined, ctime: undefined, charset: undefined, comment: undefined, gid: 20, gname: undefined, linkpath: undefined, mtime: undefined, path: 'x', size: undefined, uid: undefined, uname: undefined, dev: undefined, ino: undefined, nlink: undefined, mode: undefined, global: false, }) t.same(Pax.parse('9 gid=20\n9 path=x\n'), { atime: undefined, charset: undefined, comment: undefined, ctime: undefined, gid: 20, gname: undefined, linkpath: undefined, mtime: undefined, path: 'x', size: undefined, uid: undefined, uname: undefined, dev: undefined, ino: undefined, mode: undefined, nlink: undefined, global: false, }) // test that null just safely terminates the value t.same(Pax.parse('12 path=x\0y\n'), { atime: undefined, charset: undefined, comment: undefined, ctime: undefined, gid: undefined, gname: undefined, linkpath: undefined, mtime: undefined, path: 'x', size: undefined, uid: undefined, uname: undefined, dev: undefined, ino: undefined, mode: undefined, nlink: undefined, global: false, }) t.same(Pax.parse('20 mtime=1491436800\n'), { atime: undefined, charset: undefined, comment: undefined, ctime: undefined, gid: undefined, gname: undefined, linkpath: undefined, mtime: new Date('2017-04-06'), path: undefined, size: undefined, uid: undefined, uname: undefined, dev: undefined, ino: undefined, nlink: undefined, mode: undefined, global: false, }) const breaky = '93 NODETAR.package.readme=karma-moment\n' + '=================\n' + '\n' + 'Karma plugin for Moment framework\n' + '\n' const noKey = '10 =pathx\n' t.same(Pax.parse(breaky + '9 gid=20\n10 path=x\n' + noKey), { atime: undefined, charset: undefined, comment: undefined, ctime: undefined, gid: 20, gname: undefined, linkpath: undefined, mtime: undefined, path: 'x', size: undefined, uid: undefined, uname: undefined, dev: undefined, ino: undefined, nlink: undefined, mode: undefined, global: false, }) t.end() }) t.test('string fields stay string', t => { t.same( Pax.parse( '14 path=12345\n18 linkpath=54321\n13 WAT=12345\n15 ctime=12345\n', ), { atime: undefined, charset: undefined, comment: undefined, ctime: new Date('1970-01-01T03:25:45.000Z'), gid: undefined, gname: undefined, linkpath: '54321', mtime: undefined, path: '12345', size: undefined, uid: undefined, uname: undefined, dev: undefined, ino: undefined, mode: undefined, nlink: undefined, global: false, }, ) t.end() }) t.test('no negative size', t => { t.same(Pax.parse('14 size=-1000\n'), { atime: undefined, charset: undefined, comment: undefined, ctime: undefined, gid: undefined, gname: undefined, linkpath: undefined, mtime: undefined, path: undefined, size: undefined, uid: undefined, uname: undefined, dev: undefined, ino: undefined, mode: undefined, nlink: undefined, global: false, }) t.same(Pax.parse('13 size=1000\n'), { atime: undefined, charset: undefined, comment: undefined, ctime: undefined, gid: undefined, gname: undefined, linkpath: undefined, mtime: undefined, path: undefined, size: 1000, uid: undefined, uname: undefined, dev: undefined, ino: undefined, mode: undefined, nlink: undefined, global: false, }) t.end() }) isaacs-node-tar-8a4b548/test/process-umask.ts000066400000000000000000000001461523070444600211560ustar00rootroot00000000000000import t from 'tap' import { umask } from '../src/process-umask.js' t.equal(umask(), process.umask()) isaacs-node-tar-8a4b548/test/read-entry.js000066400000000000000000000156471523070444600204360ustar00rootroot00000000000000import t from 'tap' import { ReadEntry } from '../dist/esm/read-entry.js' import { Header } from '../dist/esm/header.js' t.test('create read entry', t => { const h = new Header({ path: 'oof.txt', mode: 0o755, uid: 24561, gid: 20, size: 100, mtime: new Date('2016-04-01T22:00Z'), ctime: new Date('2016-04-01T22:00Z'), atime: new Date('2016-04-01T22:00Z'), type: 'File', uname: 'isaacs', gname: 'staff', }) h.encode() const entry = new ReadEntry( h, { x: 'y', path: 'foo.txt' }, { z: 0, a: null, b: undefined }, ) t.ok(entry.header.cksumValid, 'header checksum should be valid') t.match(entry, { extended: { x: 'y', path: 'foo.txt' }, globalExtended: { z: 0, a: null, b: undefined }, header: { cksumValid: true, needPax: false, path: 'oof.txt', mode: 0o755, uid: 24561, gid: 20, size: 100, mtime: new Date('2016-04-01T22:00:00.000Z'), typeKey: '0', type: 'File', linkpath: null, uname: 'isaacs', gname: 'staff', devmaj: 0, devmin: 0, atime: new Date('2016-04-01T22:00:00.000Z'), ctime: new Date('2016-04-01T22:00:00.000Z'), }, blockRemain: 512, remain: 100, type: 'File', meta: false, ignore: false, path: 'foo.txt', mode: 0o755, uid: 24561, gid: 20, uname: 'isaacs', gname: 'staff', size: 100, mtime: new Date('2016-04-01T22:00:00.000Z'), atime: new Date('2016-04-01T22:00:00.000Z'), ctime: new Date('2016-04-01T22:00:00.000Z'), linkpath: null, x: 'y', z: 0, }) let data = '' let ended = false entry.on('data', c => (data += c)) entry.on('end', _ => (ended = true)) const body = Buffer.alloc(512) body.write(new Array(101).join('z'), 0) entry.write(body) entry.end() t.equal(data, new Array(101).join('z')) t.ok(ended, 'saw end event') t.end() }) t.test('entry with extended linkpath', t => { const h = new Header({ path: 'oof.txt', mode: 0o755, uid: 24561, gid: 20, size: 0, mtime: new Date('2016-04-01T22:00Z'), ctime: new Date('2016-04-01T22:00Z'), atime: new Date('2016-04-01T22:00Z'), type: 'SymbolicLink', uname: 'isaacs', gname: 'staff', }) h.encode() const entry = new ReadEntry( h, { x: 'y', linkpath: 'bar.txt', path: 'foo.txt' }, { z: 0, a: null, b: undefined }, ) t.ok(entry.header.cksumValid, 'header checksum should be valid') t.match(entry, { extended: { x: 'y', path: 'foo.txt', linkpath: 'bar.txt' }, globalExtended: { z: 0, a: null, b: undefined }, header: { cksumValid: true, needPax: false, path: 'oof.txt', mode: 0o755, uid: 24561, gid: 20, size: 0, mtime: new Date('2016-04-01T22:00:00.000Z'), typeKey: '2', type: 'SymbolicLink', linkpath: null, uname: 'isaacs', gname: 'staff', devmaj: 0, devmin: 0, atime: new Date('2016-04-01T22:00:00.000Z'), ctime: new Date('2016-04-01T22:00:00.000Z'), }, blockRemain: 0, remain: 0, type: 'SymbolicLink', meta: false, ignore: false, path: 'foo.txt', mode: 0o755, uid: 24561, gid: 20, uname: 'isaacs', gname: 'staff', size: 0, mtime: new Date('2016-04-01T22:00:00.000Z'), atime: new Date('2016-04-01T22:00:00.000Z'), ctime: new Date('2016-04-01T22:00:00.000Z'), linkpath: 'bar.txt', x: 'y', z: 0, }) let data = '' entry.on('data', c => (data += c)) const body = Buffer.alloc(512) body.write(new Array(101).join('z'), 0) t.throws(() => entry.write(body)) entry.end() t.equal(data, '') t.end() }) t.test('meta entry', t => { const h = new Header({ path: 'PaxHeader/foo.txt', mode: 0o755, uid: 24561, gid: 20, size: 23, mtime: new Date('2016-04-01T22:00Z'), ctime: new Date('2016-04-01T22:00Z'), atime: new Date('2016-04-01T22:00Z'), type: 'NextFileHasLongLinkpath', uname: 'isaacs', gname: 'staff', }) const body = Buffer.alloc(512) body.write('not that long, actually') const expect = 'not that long, actually' let actual = '' const entry = new ReadEntry(h) entry.on('data', c => (actual += c)) entry.write(body.subarray(0, 1)) entry.write(body.subarray(1, 25)) entry.write(body.subarray(25)) t.throws(_ => entry.write(Buffer.alloc(1024))) t.equal(actual, expect) t.match(entry, { meta: true, type: 'NextFileHasLongLinkpath' }) t.end() }) t.test('unknown entry type', t => { const h = new Header({ path: 'PaxHeader/foo.txt', mode: 0o755, uid: 24561, gid: 20, size: 23, mtime: new Date('2016-04-01T22:00Z'), ctime: new Date('2016-04-01T22:00Z'), atime: new Date('2016-04-01T22:00Z'), uname: 'isaacs', gname: 'staff', }) h.encode() // this triggers its type to be Unsupported, which means that any // data written to it will be thrown away. h.block.write('9', 156, 1, 'ascii') const body = Buffer.alloc(512) body.write('not that long, actually') const expect = '' let actual = '' const entry = new ReadEntry(new Header(h.block)) entry.on('data', c => (actual += c)) entry.write(body.subarray(0, 1)) entry.write(body.subarray(1, 25)) entry.write(body.subarray(25)) t.throws(() => entry.write(Buffer.alloc(1024))) t.equal(actual, expect) t.match(entry, { ignore: true }) t.end() }) t.test('entry without mode', t => { const h = new Header({ path: 'foo.txt', uid: 24561, gid: 20, size: 100, mtime: new Date('2016-04-01T22:00Z'), ctime: new Date('2016-04-01T22:00Z'), atime: new Date('2016-04-01T22:00Z'), type: 'File', uname: 'isaacs', gname: 'staff', }) h.encode() const entry = new ReadEntry(h) t.ok(entry.header.cksumValid, 'header checksum should be valid') t.match(entry, { header: { cksumValid: true, needPax: false, path: 'foo.txt', mode: null, uid: 24561, gid: 20, size: 100, mtime: new Date('2016-04-01T22:00:00.000Z'), typeKey: '0', type: 'File', linkpath: null, uname: 'isaacs', gname: 'staff', devmaj: 0, devmin: 0, atime: new Date('2016-04-01T22:00:00.000Z'), ctime: new Date('2016-04-01T22:00:00.000Z'), }, blockRemain: 512, remain: 100, type: 'File', meta: false, ignore: false, path: 'foo.txt', mode: null, uid: 24561, gid: 20, uname: 'isaacs', gname: 'staff', size: 100, mtime: new Date('2016-04-01T22:00:00.000Z'), atime: new Date('2016-04-01T22:00:00.000Z'), ctime: new Date('2016-04-01T22:00:00.000Z'), linkpath: null, }) let data = '' let ended = false entry.on('data', c => (data += c)) entry.on('end', _ => (ended = true)) const body = Buffer.alloc(512) body.write(new Array(101).join('z'), 0) entry.write(body) entry.end() t.equal(data, new Array(101).join('z')) t.ok(ended, 'saw end event') t.end() }) isaacs-node-tar-8a4b548/test/replace.ts000066400000000000000000000273361523070444600200070ustar00rootroot00000000000000import type { Test } from 'tap' import t from 'tap' import { replace as r } from '../dist/esm/replace.js' import path, { dirname, resolve } from 'path' import fs from 'fs' //@ts-ignore import mutateFS from 'mutate-fs' import { list } from '../dist/esm/list.js' import { fileURLToPath } from 'url' import zlib from 'zlib' import { spawn } from 'child_process' const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename) const fixtures = path.resolve(__dirname, 'fixtures') const tars = path.resolve(fixtures, 'tars') const data = fs.readFileSync(tars + '/body-byte-counts.tar') const dataNoNulls = data.subarray(0, data.length - 1024) const fixtureDef = { 'body-byte-counts.tar': data, 'no-null-eof.tar': dataNoNulls, 'truncated-head.tar': Buffer.concat([ dataNoNulls, data.subarray(0, 500), ]), 'truncated-body.tar': Buffer.concat([ dataNoNulls, data.subarray(0, 700), ]), 'zero.tar': Buffer.from(''), 'empty.tar': Buffer.alloc(512), 'compressed.tgz': zlib.gzipSync(data), 'compressed.tbr': zlib.brotliCompressSync(data), 'compressed.tzst': zlib.zstdCompressSync(data), } t.test('basic file add to archive (good or truncated)', t => { const check = (file: string, t: Test) => { const c = spawn('tar', ['tf', file], { stdio: [0, 'pipe', 2] }) const out: Buffer[] = [] c.stdout?.on('data', (chunk: Buffer) => out.push(chunk)) c.on('close', (code, signal) => { t.equal(code, 0) t.equal(signal, null) const actual = Buffer.concat(out).toString().trim().split(/\r?\n/) t.same(actual, [ '1024-bytes.txt', '512-bytes.txt', 'one-byte.txt', 'zero-byte.txt', path.basename(__filename), ]) t.end() }) } const files: (keyof typeof fixtureDef)[] = [ 'body-byte-counts.tar', 'no-null-eof.tar', 'truncated-head.tar', 'truncated-body.tar', ] const td = Object.fromEntries(files.map(f => [f, fixtureDef[f]])) const fileList = [path.basename(__filename)] t.test('sync', t => { t.plan(files.length) const dir = t.testdir(td) for (const file of files) { t.test(file, t => { r( { sync: true, file: resolve(dir, file), cwd: __dirname, }, fileList, ) check(resolve(dir, file), t) }) } }) t.test('async cb', t => { t.plan(files.length) const dir = t.testdir(td) for (const file of files) { t.test(file, t => { r( { file: resolve(dir, file), cwd: __dirname, }, fileList, er => { if (er) { throw er } check(resolve(dir, file), t) }, ) }) } }) t.test('async', t => { t.plan(files.length) const dir = t.testdir(td) for (const file of files) { t.test(file, t => { r( { file: resolve(dir, file), cwd: __dirname, }, fileList, ).then(() => { check(resolve(dir, file), t) }) }) } }) t.end() }) t.test('add to empty archive', t => { const check = (file: string, t: Test) => { const c = spawn('tar', ['tf', file]) const out: Buffer[] = [] c.stdout.on('data', (chunk: Buffer) => out.push(chunk)) c.on('close', (code, signal) => { t.equal(code, 0) t.equal(signal, null) const actual = Buffer.concat(out).toString().trim().split('\n') t.same(actual, [path.basename(__filename)]) t.end() }) } const files: (keyof typeof fixtureDef)[] = ['empty.tar', 'zero.tar'] const td = Object.fromEntries(files.map(f => [f, fixtureDef[f]])) //@ts-ignore files.push('not-existing.tar') t.test('sync', t => { const dir = t.testdir(td) t.plan(files.length) for (const file of files) { t.test(file, t => { r( { sync: true, file: resolve(dir, file), cwd: __dirname, }, [path.basename(__filename)], ) check(resolve(dir, file), t) }) } }) t.test('async cb', t => { const dir = t.testdir(td) t.plan(files.length) for (const file of files) { t.test(file, t => { r( { file: resolve(dir, file), cwd: __dirname, }, [path.basename(__filename)], er => { if (er) { throw er } check(resolve(dir, file), t) }, ) }) } }) t.test('async', async t => { const dir = t.testdir(td) t.plan(files.length) for (const file of files) { t.test(file, t => { r( { file: resolve(dir, file), cwd: __dirname, }, [path.basename(__filename)], ).then(() => { check(resolve(dir, file), t) }) }) } }) t.end() }) t.test('cannot append to gzipped archives', async t => { const dir = t.testdir({ 'compressed.tgz': fixtureDef['compressed.tgz'], }) const file = resolve(dir, 'compressed.tgz') const expect = new Error('cannot append to compressed archives') const expectT = new TypeError('cannot append to compressed archives') t.throws( () => r( { file, cwd: __dirname, gzip: true, }, [path.basename(__filename)], ), expectT, ) t.throws( () => r( { file, cwd: __dirname, sync: true, }, [path.basename(__filename)], ), expect, ) return r( { file, cwd: __dirname, }, [path.basename(__filename)], er => t.match(er, expect), ) }) t.test('cannot append to brotli compressed archives', async t => { const dir = t.testdir({ 'compressed.tbr': fixtureDef['compressed.tbr'], }) const file = resolve(dir, 'compressed.tbr') const expect = new Error('cannot append to compressed archives') const expectT = new TypeError('cannot append to compressed archives') t.throws( () => r( { file, cwd: __dirname, brotli: true, }, [path.basename(__filename)], ), expectT, ) t.throws( () => r( { file, cwd: __dirname, sync: true, }, [path.basename(__filename)], ), expect, ) t.end() }) t.test('cannot append to zstd compressed archives', async t => { const dir = t.testdir({ 'compressed.tbr': fixtureDef['compressed.tzst'], }) const file = resolve(dir, 'compressed.tzst') const expect = new Error('cannot append to compressed archives') const expectT = new TypeError('cannot append to compressed archives') t.throws( () => r( { file, cwd: __dirname, zstd: true, }, [path.basename(__filename)], ), expectT, ) t.end() }) t.test('other throws', t => { t.throws(() => r({}, ['asdf']), new TypeError('file is required')) t.throws( () => r({ file: 'asdf' }, []), new TypeError('no paths specified to add/replace'), ) t.end() }) t.test('broken open', t => { const dir = t.testdir({ 'body-byte-counts.tar': fixtureDef['body-byte-counts.tar'], }) const file = resolve(dir, 'body-byte-counts.tar') const poop = new Error('poop') t.teardown(mutateFS.fail('open', poop)) t.throws(() => r({ sync: true, file }, ['README.md']), poop) r({ file }, ['README.md'], er => { t.match(er, poop) t.end() }) }) t.test('broken fstat', t => { const td = { 'body-byte-counts.tar': fixtureDef['body-byte-counts.tar'], } const poop = new Error('poop') t.test('sync', t => { const dir = t.testdir(td) const file = resolve(dir, 'body-byte-counts.tar') t.teardown(mutateFS.fail('fstat', poop)) t.throws(() => r({ sync: true, file }, ['README.md']), poop) t.end() }) t.test('async', t => { const dir = t.testdir(td) const file = resolve(dir, 'body-byte-counts.tar') t.teardown(mutateFS.fail('fstat', poop)) r({ file }, ['README.md'], async er => { t.match(er, poop) t.end() }) }) t.end() }) t.test('broken read', t => { const dir = t.testdir({ 'body-byte-counts.tar': fixtureDef['body-byte-counts.tar'], }) const file = resolve(dir, 'body-byte-counts.tar') const poop = new Error('poop') t.teardown(mutateFS.fail('read', poop)) t.throws(() => r({ sync: true, file }, ['README.md']), poop) r({ file }, ['README.md'], er => { t.match(er, poop) t.end() }) }) t.test('mtime cache', async t => { const td = { 'body-byte-counts.tar': fixtureDef['body-byte-counts.tar'], } let mtimeCache: Map const check = (file: string, t: Test) => { const c = spawn('tar', ['tf', file]) const out: Buffer[] = [] c.stdout.on('data', chunk => out.push(chunk)) c.on('close', (code, signal) => { t.equal(code, 0) t.equal(signal, null) const actual = Buffer.concat(out).toString().trim().split(/\r?\n/) t.same(actual, [ '1024-bytes.txt', '512-bytes.txt', 'one-byte.txt', 'zero-byte.txt', path.basename(__filename), ]) const mtc: Record = {} mtimeCache.forEach( (_v, k) => (mtc[k] = mtimeCache.get(k)!.toISOString()), ) t.same(mtc, { '1024-bytes.txt': '2017-04-10T16:57:47.000Z', '512-bytes.txt': '2017-04-10T17:08:55.000Z', 'one-byte.txt': '2017-04-10T16:58:20.000Z', 'zero-byte.txt': '2017-04-10T17:08:01.000Z', }) t.end() }) } t.test('sync', t => { const dir = t.testdir(td) const file = resolve(dir, 'body-byte-counts.tar') r( { sync: true, file, cwd: __dirname, mtimeCache: (mtimeCache = new Map()), }, [path.basename(__filename)], ) check(file, t) }) t.test('async cb', t => { const dir = t.testdir(td) const file = resolve(dir, 'body-byte-counts.tar') r( { file, cwd: __dirname, mtimeCache: (mtimeCache = new Map()), }, [path.basename(__filename)], er => { if (er) { throw er } check(file, t) }, ) }) t.test('async promise', t => { const dir = t.testdir(td) const file = resolve(dir, 'body-byte-counts.tar') r( { file, cwd: __dirname, mtimeCache: (mtimeCache = new Map()), }, [path.basename(__filename)], ).then(_ => check(file, t)) }) t.end() }) t.test('create tarball out of another tarball', t => { const td = { 'out.tar': fs.readFileSync(path.resolve(tars, 'dir.tar')), } const check = (out: string, t: Test) => { const expect = [ 'dir/', 'Ω.txt', '🌟.txt', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', ] list({ f: out, sync: true, onReadEntry: entry => { t.equal(entry.path, expect.shift()) }, }) t.same(expect, []) t.end() } t.test('sync', t => { const dir = t.testdir(td) const out = resolve(dir, 'out.tar') r( { f: out, cwd: tars, sync: true, }, ['@utf8.tar'], ) check(out, t) }) t.test('async cb', t => { const dir = t.testdir(td) const out = resolve(dir, 'out.tar') r( { f: out, cwd: tars, }, ['@utf8.tar'], er => { if (er) { throw er } check(out, t) }, ) }) t.test('async', t => { const dir = t.testdir(td) const out = resolve(dir, 'out.tar') r( { f: out, cwd: tars, }, ['@utf8.tar'], ).then(() => check(out, t)) }) t.end() }) isaacs-node-tar-8a4b548/test/strip-absolute-path.js000066400000000000000000000033001523070444600222520ustar00rootroot00000000000000import t from 'tap' import { stripAbsolutePath } from '../dist/esm/strip-absolute-path.js' import realPath from 'node:path' const cwd = process.cwd() t.test('basic', t => { const cases = { '/': ['/', ''], '////': ['////', ''], 'c:///a/b/c': ['c:///', 'a/b/c'], '\\\\foo\\bar\\baz': ['\\\\foo\\bar\\', 'baz'], '//foo//bar//baz': ['//', 'foo//bar//baz'], 'c:\\c:\\c:\\c:\\\\d:\\e/f/g': ['c:\\c:\\c:\\c:\\\\d:\\', 'e/f/g'], } for (const [input, [root, stripped]] of Object.entries(cases)) { t.strictSame(stripAbsolutePath(input, cwd), [root, stripped], input) } t.end() }) t.test('drive-local paths', async t => { const env = process.env t.teardown(() => (process.env = env)) const cwd = 'D:\\safety\\land' // be windowsy const path = { ...realPath.win32, win32: realPath.win32, posix: realPath.posix, } const { stripAbsolutePath } = await t.mockImport( '../dist/esm/strip-absolute-path.js', { path }, ) const cases = { '/': ['/', ''], '////': ['////', ''], 'c:///a/b/c': ['c:///', 'a/b/c'], '\\\\foo\\bar\\baz': ['\\\\foo\\bar\\', 'baz'], '//foo//bar//baz': ['//', 'foo//bar//baz'], 'c:\\c:\\c:\\c:\\\\d:\\e/f/g': ['c:\\c:\\c:\\c:\\\\d:\\', 'e/f/g'], 'c:..\\system\\explorer.exe': ['c:', '..\\system\\explorer.exe'], 'd:..\\..\\unsafe\\land': ['d:', '..\\..\\unsafe\\land'], 'c:foo': ['c:', 'foo'], 'D:mark': ['D:', 'mark'], '//?/X:/y/z': ['//?/X:/', 'y/z'], '\\\\?\\X:\\y\\z': ['\\\\?\\X:\\', 'y\\z'], } for (const [input, [root, stripped]] of Object.entries(cases)) { if ( !t.strictSame(stripAbsolutePath(input, cwd), [root, stripped], input) ) { break } } t.end() }) isaacs-node-tar-8a4b548/test/strip-trailing-slashes.js000066400000000000000000000005471523070444600227650ustar00rootroot00000000000000import t from 'tap' import { stripTrailingSlashes } from '../dist/esm/strip-trailing-slashes.js' const short = '///a///b///c///' const long = short.repeat(10) + '/'.repeat(1000000) t.equal(stripTrailingSlashes('no slash'), 'no slash') t.equal(stripTrailingSlashes(short), '///a///b///c') t.equal(stripTrailingSlashes(long), short.repeat(9) + '///a///b///c') isaacs-node-tar-8a4b548/test/symlink-error.js000066400000000000000000000004721523070444600211670ustar00rootroot00000000000000import t from 'tap' import { SymlinkError } from '../dist/esm/symlink-error.js' t.match(new SymlinkError('symlink', 'path'), { name: 'SymlinkError', path: 'path', symlink: 'symlink', syscall: 'symlink', code: 'TAR_SYMLINK_ERROR', message: 'TAR_SYMLINK_ERROR: Cannot extract through symbolic link', }) isaacs-node-tar-8a4b548/test/symlink-race-extract.ts000066400000000000000000000040511523070444600224270ustar00rootroot00000000000000import fs, { lstatSync, readFileSync, symlinkSync, writeFileSync, } from 'node:fs' import { resolve } from 'node:path' import t from 'tap' import { extract } from '../src/extract.js' import { Header } from '../src/header.js' if (typeof fs.constants.O_NOFOLLOW !== 'number') { t.plan(0, 'no O_NOFOLLOW flag') process.exit(0) } const makeTarball = () => { const header = Buffer.alloc(512) new Header({ path: 'victim.txt', type: 'File', size: 6, }).encode(header) return Buffer.concat([ header, Buffer.from('PWNED\n'.padEnd(512, '\0')), Buffer.alloc(1024), ]) } t.test('extract does not follow a raced-in symlink', async t => { const dir = t.testdir({ cwd: {}, 'target.txt': 'ORIGINAL\n', }) const cwd = resolve(dir, 'cwd') const target = resolve(dir, 'target.txt') const tarball = resolve(dir, 'poc.tar') const victim = resolve(cwd, 'victim.txt') writeFileSync(tarball, makeTarball()) const warnings: [code: string, message: string][] = [] const lstat = fs.lstat let raced = false fs.lstat = ((path, options, cb) => { const callback = typeof options === 'function' ? options : ( (cb as Parameters[1] & ((err: NodeJS.ErrnoException | null, stats: fs.Stats) => void)) ) if (!raced && String(path) === victim) { raced = true symlinkSync(target, victim) const er = Object.assign(new Error('raced symlink'), { code: 'ENOENT', }) process.nextTick(() => callback(er, undefined as never)) return } return typeof options === 'function' ? lstat(path, options) : lstat(path, options, cb as never) }) as typeof fs.lstat t.teardown(() => { fs.lstat = lstat }) await extract({ cwd, file: tarball, onwarn: (code, message) => warnings.push([code, String(message)]), }) t.equal(readFileSync(target, 'utf8'), 'ORIGINAL\n') t.equal(lstatSync(victim).isSymbolicLink(), true) t.match(warnings, [ ['TAR_ENTRY_ERROR', /ELOOP|symbolic link|Too many symbolic links/], ]) }) isaacs-node-tar-8a4b548/test/types.js000066400000000000000000000004531523070444600175150ustar00rootroot00000000000000import t from 'tap' import * as types from '../dist/esm/types.js' t.equal(types.name.get('0'), 'File') t.equal(types.code.get('File'), '0') t.equal(types.isCode('0'), true) t.equal(types.isCode('Z'), false) t.equal(types.isName('TapeVolumeHeader'), true) t.equal(types.isName('Unsupported'), false) isaacs-node-tar-8a4b548/test/unpack.js000066400000000000000000002504571523070444600176450ustar00rootroot00000000000000import { Unpack, UnpackSync } from '../dist/esm/unpack.js' import fs, { readFileSync } from 'fs' import { Minipass } from 'minipass' import * as z from 'minizlib' import path from 'path' import { rimraf } from 'rimraf' import t from 'tap' import { fileURLToPath } from 'url' import zlib from 'zlib' import { Header } from '../dist/esm/header.js' import { extract } from '../dist/esm/extract.js' import { makeTar } from './fixtures/make-tar.js' const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) const fixtures = path.resolve(__dirname, 'fixtures') const tars = path.resolve(fixtures, 'tars') const parses = path.resolve(fixtures, 'parse') import eos from 'end-of-stream' import { mkdirp } from 'mkdirp' import mutateFS from 'mutate-fs' import { normalizeWindowsPath as normPath } from '../dist/esm/normalize-windows-path.js' import { ReadEntry } from '../dist/esm/read-entry.js' import { Pax } from '../dist/esm/pax.js' const makeCompressedBomb = () => { const payload = Buffer.alloc(8 * 1024 * 1024) return zlib.gzipSync( makeTar([ { path: 'bomb', size: payload.length, type: 'File', }, payload, '', '', ]), ) } // On Windows in particular, the "really deep folder path" file // often tends to cause problems, which don't indicate a failure // of this library, it's just what happens on Windows with super // long file paths. const isWindows = process.platform === 'win32' const isLongFile = f => f.match(/r.e.a.l.l.y.-.d.e.e.p.-.f.o.l.d.e.r.-.p.a.t.h/) t.capture(process, 'umask', () => 0o22) t.test('basic file unpack tests', t => { const cases = { 'emptypax.tar': { '🌟.txt': '🌟✧✩â­�︎✪✫✬✭✮âš�✯✰✵✶✷✸✹â�‚⭑⭒★☆✡☪✴︎✦✡ï¸�🔯✴ï¸�🌠\n', 'one-byte.txt': 'a', }, 'body-byte-counts.tar': { '1024-bytes.txt': new Array(1024).join('x') + '\n', '512-bytes.txt': new Array(512).join('x') + '\n', 'one-byte.txt': 'a', 'zero-byte.txt': '', }, 'utf8.tar': { '🌟.txt': '🌟✧✩â­�︎✪✫✬✭✮âš�✯✰✵✶✷✸✹â�‚⭑⭒★☆✡☪✴︎✦✡ï¸�🔯✴ï¸�🌠\n', 'Ω.txt': 'Ω', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt': 'Ω', }, 'file.tar': { 'one-byte.txt': 'a', }, 'global-header.tar': { 'one-byte.txt': 'a', }, 'long-pax.tar': { '120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', }, 'long-paths.tar': { '100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', '120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', '170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt': 'short\n', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt': 'Ω', }, } const tarfiles = Object.keys(cases) t.plan(tarfiles.length) t.jobs = tarfiles.length tarfiles.forEach(tarfile => { t.test(tarfile, t => { const tf = path.resolve(tars, tarfile) const dir = t.testdir({}) const linkdir = dir + '.link' t.beforeEach(async () => { await rimraf(linkdir) fs.symlinkSync(dir, linkdir) }) const check = t => { const expect = cases[tarfile] Object.keys(expect).forEach(file => { const f = path.resolve(dir, file) if (isWindows && isLongFile(file)) { return } t.equal(fs.readFileSync(f, 'utf8'), expect[file], file) }) t.end() } t.plan(2) t.test('async unpack', t => { t.plan(2) t.test('strict', t => { const unpack = new Unpack({ cwd: linkdir, strict: true }) fs.createReadStream(tf).pipe(unpack) eos(unpack, () => check(t)) }) t.test('loose', t => { const unpack = new Unpack({ cwd: linkdir }) fs.createReadStream(tf).pipe(unpack) eos(unpack, () => check(t)) }) }) t.test('sync unpack', t => { t.plan(2) t.test('strict', t => { const unpack = new UnpackSync({ cwd: linkdir }) unpack.end(fs.readFileSync(tf)) check(t) }) t.test('loose', t => { const unpack = new UnpackSync({ cwd: linkdir }) unpack.end(fs.readFileSync(tf)) check(t) }) }) }) }) }) t.test('cwd default to process cwd', t => { const u = new Unpack() const us = new UnpackSync() const cwd = normPath(process.cwd()) t.equal(u.cwd, cwd) t.equal(us.cwd, cwd) t.end() }) t.test('links!', t => { const dir = t.testdir({}) const data = fs.readFileSync(tars + '/links.tar') const stripData = fs.readFileSync(tars + '/links-strip.tar') t.plan(6) t.beforeEach(() => mkdirp(dir)) t.afterEach(() => rimraf(dir)) const check = t => { const hl1 = fs.lstatSync(dir + '/hardlink-1') const hl2 = fs.lstatSync(dir + '/hardlink-2') t.equal(hl1.dev, hl2.dev) t.equal(hl1.ino, hl2.ino) t.equal(hl1.nlink, 2) t.equal(hl2.nlink, 2) if (!isWindows) { // doesn't work on win32 without special privs const sym = fs.lstatSync(dir + '/symlink') t.ok(sym.isSymbolicLink()) t.equal(fs.readlinkSync(dir + '/symlink'), 'hardlink-2') } t.end() } const checkForStrip = t => { const hl1 = fs.lstatSync(dir + '/hardlink-1') const hl2 = fs.lstatSync(dir + '/hardlink-2') const hl3 = fs.lstatSync(dir + '/1/2/3/hardlink-3') t.equal(hl1.dev, hl2.dev) t.equal(hl1.ino, hl2.ino) t.equal(hl1.dev, hl3.dev) t.equal(hl1.ino, hl3.ino) t.equal(hl1.nlink, 3) t.equal(hl2.nlink, 3) if (!isWindows) { const sym = fs.lstatSync(dir + '/symlink') t.ok(sym.isSymbolicLink()) t.equal(fs.readlinkSync(dir + '/symlink'), 'hardlink-2') } t.end() } const checkForStrip3 = t => { // strips the linkpath entirely, so the link doesn't get extracted. t.throws(() => fs.lstatSync(dir + '/3'), { code: 'ENOENT' }) t.end() } t.test('async', t => { const unpack = new Unpack({ cwd: dir }) let finished = false unpack.on('finish', () => (finished = true)) unpack.on('close', () => t.ok(finished, 'emitted finish before close')) unpack.on('close', () => check(t)) unpack.end(data) }) t.test('sync', t => { const unpack = new UnpackSync({ cwd: dir }) unpack.end(data) check(t) }) t.test('sync strip', t => { const unpack = new UnpackSync({ cwd: dir, strip: 1 }) unpack.end(stripData) checkForStrip(t) }) t.test('async strip', t => { const unpack = new Unpack({ cwd: dir, strip: 1 }) let finished = false unpack.on('finish', () => (finished = true)) unpack.on('close', () => t.ok(finished, 'emitted finish before close')) unpack.on('close', () => checkForStrip(t)) unpack.end(stripData) }) t.test('sync strip 3', t => { const unpack = new UnpackSync({ cwd: dir, strip: 3 }) unpack.end(fs.readFileSync(tars + '/links-strip.tar')) checkForStrip3(t) }) t.test('async strip 3', t => { const unpack = new Unpack({ cwd: dir, strip: 3 }) let finished = false unpack.on('finish', () => (finished = true)) unpack.on('close', () => t.ok(finished, 'emitted finish before close')) unpack.on('close', () => checkForStrip3(t)) unpack.end(stripData) }) }) t.test('links without cleanup (exercise clobbering code)', t => { const dir = t.testdir({}) const data = fs.readFileSync(tars + '/links.tar') t.plan(6) t.beforeEach(() => { // clobber this junk try { mkdirp.sync(dir + '/hardlink-1') mkdirp.sync(dir + '/hardlink-2') fs.writeFileSync(dir + '/symlink', 'not a symlink') } catch (er) {} }) const check = t => { const hl1 = fs.lstatSync(dir + '/hardlink-1') const hl2 = fs.lstatSync(dir + '/hardlink-2') t.equal(hl1.dev, hl2.dev) t.equal(hl1.ino, hl2.ino) t.equal(hl1.nlink, 2) t.equal(hl2.nlink, 2) if (!isWindows) { const sym = fs.lstatSync(dir + '/symlink') t.ok(sym.isSymbolicLink()) t.equal(fs.readlinkSync(dir + '/symlink'), 'hardlink-2') } t.end() } t.test('async', t => { const unpack = new Unpack({ cwd: dir }) let prefinished = false unpack.on('prefinish', () => (prefinished = true)) unpack.on('finish', () => t.ok(prefinished, 'emitted prefinish before finish'), ) unpack.on('close', () => check(t)) unpack.end(data) }) t.test('sync', t => { const unpack = new UnpackSync({ cwd: dir }) unpack.end(data) check(t) }) t.test('async again', t => { const unpack = new Unpack({ cwd: dir }) eos(unpack, () => check(t)) unpack.end(data) }) t.test('sync again', t => { const unpack = new UnpackSync({ cwd: dir }) unpack.end(data) check(t) }) t.test('async unlink', t => { const unpack = new Unpack({ cwd: dir, unlink: true }) unpack.on('close', () => check(t)) unpack.end(data) }) t.test('sync unlink', t => { const unpack = new UnpackSync({ cwd: dir, unlink: true }) unpack.end(data) check(t) }) }) t.test('nested dir dupe', t => { const dir = t.testdir({}) mkdirp.sync(dir + '/d/e/e/p') const expect = { 'd/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt': 'short\n', 'd/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', 'd/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', 'd/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', 'd/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt': 'Ω', } const check = t => { const entries = fs.readdirSync(dir) t.equal(entries.length, 1) t.equal(entries[0], 'd') Object.keys(expect).forEach(f => { const file = dir + '/' + f t.equal(fs.readFileSync(file, 'utf8'), expect[f]) }) t.end() } const unpack = new Unpack({ cwd: dir, strip: 8 }) const data = fs.readFileSync(tars + '/long-paths.tar') // while we're at it, why not use gzip too? const zip = new z.Gzip() zip.pipe(unpack) unpack.on('close', () => check(t)) zip.end(data) }) t.test( 'symlink in dir path', { skip: isWindows && 'symlinks not fully supported', }, t => { const data = makeTar([ { path: 'd/i', type: 'Directory', }, { path: 'd/i/r/dir', type: 'Directory', mode: 0o751, mtime: new Date('2011-03-27T22:16:31.000Z'), }, { path: 'd/i/r/file', type: 'File', size: 1, atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), }, 'a', { path: 'd/i/r/link', type: 'Link', linkpath: 'd/i/r/file', atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, { path: 'd/i/r/symlink', type: 'SymbolicLink', linkpath: './dir', atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, { path: 'd/i/r/symlink/x', type: 'File', size: 0, atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, '', '', ]) t.test('no clobbering', t => { const warnings = [] const cwd = t.testdir({}) const u = new Unpack({ cwd, onwarn: (c, w, d) => warnings.push([c, w, d]), }) u.on('close', () => { t.equal( fs.lstatSync(cwd + '/d/i').mode & 0o7777, isWindows ? 0o666 : 0o755, ) t.equal( fs.lstatSync(cwd + '/d/i/r/dir').mode & 0o7777, isWindows ? 0o666 : 0o751, ) t.ok(fs.lstatSync(cwd + '/d/i/r/file').isFile(), 'got file') if (!isWindows) { t.ok( fs.lstatSync(cwd + '/d/i/r/symlink').isSymbolicLink(), 'got symlink', ) t.throws(() => fs.statSync(cwd + '/d/i/r/symlink/x')) } t.equal(warnings[0][0], 'TAR_ENTRY_ERROR') if (!isWindows) { t.equal( warnings[0][1], 'TAR_SYMLINK_ERROR: Cannot extract through symbolic link', ) t.match(warnings[0][2], { name: 'SymlinkError', code: 'TAR_SYMLINK_ERROR', tarCode: 'TAR_ENTRY_ERROR', path: cwd + '/d/i/r/symlink/', symlink: cwd + '/d/i/r/symlink', }) } t.equal(warnings.length, 1) t.end() }) u.end(data) }) t.test('no clobbering, sync', t => { const warnings = [] const cwd = t.testdir({}) const u = new UnpackSync({ cwd, onwarn: (c, w, d) => warnings.push([c, w, d]), }) u.end(data) t.equal( fs.lstatSync(cwd + '/d/i/r/dir').mode & 0o7777, isWindows ? 0o666 : 0o751, ) t.ok(fs.lstatSync(cwd + '/d/i/r/file').isFile(), 'got file') if (!isWindows) { t.ok( fs.lstatSync(cwd + '/d/i/r/symlink').isSymbolicLink(), 'got symlink', ) t.throws(() => fs.statSync(cwd + '/d/i/r/symlink/x')) } t.equal(warnings.length, 1) t.equal(warnings[0][0], 'TAR_ENTRY_ERROR') t.equal( warnings[0][1], 'TAR_SYMLINK_ERROR: Cannot extract through symbolic link', ) t.match(warnings[0][2], { name: 'SymlinkError', path: cwd + '/d/i/r/symlink/', symlink: cwd + '/d/i/r/symlink', }) t.end() }) t.test('extract through symlink', t => { const warnings = [] const cwd = t.testdir({}) const u = new Unpack({ cwd, onwarn: (c, w, d) => warnings.push([c, w, d]), preservePaths: true, }) u.on('close', () => { t.same(warnings, []) t.equal(fs.lstatSync(cwd + '/d/i/r/dir').mode & 0o7777, 0o751) t.ok(fs.lstatSync(cwd + '/d/i/r/file').isFile(), 'got file') t.ok( fs.lstatSync(cwd + '/d/i/r/symlink').isSymbolicLink(), 'got symlink', ) t.ok(fs.lstatSync(cwd + '/d/i/r/dir/x').isFile(), 'x thru link') t.ok( fs.lstatSync(cwd + '/d/i/r/symlink/x').isFile(), 'x thru link', ) t.end() }) u.end(data) }) t.test('extract through symlink sync', t => { const warnings = [] const cwd = t.testdir({}) const u = new UnpackSync({ cwd, onwarn: (c, w, d) => warnings.push([c, w, d]), preservePaths: true, }) u.end(data) t.same(warnings, []) t.equal(fs.lstatSync(cwd + '/d/i/r/dir').mode & 0o7777, 0o751) t.ok(fs.lstatSync(cwd + '/d/i/r/file').isFile(), 'got file') t.ok( fs.lstatSync(cwd + '/d/i/r/symlink').isSymbolicLink(), 'got symlink', ) t.ok(fs.lstatSync(cwd + '/d/i/r/dir/x').isFile(), 'x thru link') t.ok(fs.lstatSync(cwd + '/d/i/r/symlink/x').isFile(), 'x thru link') t.end() }) t.test('clobber through symlink', t => { const warnings = [] const cwd = t.testdir({}) const u = new Unpack({ cwd, onwarn: (c, w, d) => warnings.push([c, w, d]), unlink: true, }) u.on('close', () => { t.same(warnings, []) t.equal(fs.lstatSync(cwd + '/d/i/r/dir').mode & 0o7777, 0o751) t.ok(fs.lstatSync(cwd + '/d/i/r/file').isFile(), 'got file') t.notOk( fs.lstatSync(cwd + '/d/i/r/symlink').isSymbolicLink(), 'no link', ) t.ok( fs.lstatSync(cwd + '/d/i/r/symlink').isDirectory(), 'sym is dir', ) t.ok( fs.lstatSync(cwd + '/d/i/r/symlink/x').isFile(), 'x thru link', ) t.end() }) u.end(data) }) t.test('clobber through symlink with busted unlink', t => { const poop = new Error('poop') // for some reason, resetting fs.unlink in the teardown was breaking const reset = mutateFS.fail('unlink', poop) const cwd = t.testdir({}) const warnings = [] const u = new Unpack({ cwd, onwarn: (c, w, d) => warnings.push([c, w, d]), unlink: true, }) u.on('close', () => { t.same(warnings, [['TAR_ENTRY_ERROR', 'poop', poop]]) reset() t.end() }) u.end(data) }) t.test('clobber through symlink sync', t => { const warnings = [] const cwd = t.testdir({}) const u = new UnpackSync({ cwd, onwarn: (c, w, d) => warnings.push([c, w, d]), unlink: true, }) u.end(data) t.equal(fs.lstatSync(cwd + '/d/i/r/dir').mode & 0o7777, 0o751) t.ok(fs.lstatSync(cwd + '/d/i/r/file').isFile(), 'got file') t.notOk( fs.lstatSync(cwd + '/d/i/r/symlink').isSymbolicLink(), 'no link', ) t.ok( fs.lstatSync(cwd + '/d/i/r/symlink').isDirectory(), 'sym is dir', ) t.ok(fs.lstatSync(cwd + '/d/i/r/symlink/x').isFile(), 'x thru link') t.end() }) t.test('clobber dirs', t => { const cwd = t.testdir({ d: { i: { r: { dir: {}, file: {}, link: {}, symlink: {}, }, }, }, }) const warnings = [] const u = new Unpack({ cwd, onwarn: (c, w, d) => { warnings.push([c, w, d]) }, chmod: true, }) u.on('close', () => { t.equal(fs.lstatSync(cwd + '/d/i/r/dir').mode & 0o7777, 0o751) t.ok(fs.lstatSync(cwd + '/d/i/r/file').isFile(), 'got file') t.ok( fs.lstatSync(cwd + '/d/i/r/symlink').isSymbolicLink(), 'got symlink', ) t.throws(() => fs.statSync(cwd + '/d/i/r/symlink/x')) t.equal(warnings.length, 1) t.equal(warnings[0][0], 'TAR_ENTRY_ERROR') t.equal( warnings[0][1], 'TAR_SYMLINK_ERROR: Cannot extract through symbolic link', ) t.match(warnings[0][2], { name: 'SymlinkError', path: cwd + '/d/i/r/symlink/', symlink: cwd + '/d/i/r/symlink', }) t.end() }) u.end(data) }) t.test('clobber dirs sync', t => { const cwd = t.testdir({ d: { i: { r: { dir: {}, file: {}, link: {}, symlink: {}, }, }, }, }) const warnings = [] const u = new UnpackSync({ cwd, onwarn: (c, w, d) => { warnings.push([c, w, d]) }, chmod: true, processUmask: 0o22, }) u.end(data) t.equal(fs.lstatSync(cwd + '/d/i/r/dir').mode & 0o7777, 0o751) t.ok(fs.lstatSync(cwd + '/d/i/r/file').isFile(), 'got file') t.ok( fs.lstatSync(cwd + '/d/i/r/symlink').isSymbolicLink(), 'got symlink', ) t.throws(() => fs.statSync(cwd + '/d/i/r/symlink/x')) t.equal(warnings.length, 1) t.equal(warnings[0][0], 'TAR_ENTRY_ERROR') t.equal( warnings[0][1], 'TAR_SYMLINK_ERROR: Cannot extract through symbolic link', ) t.match(warnings[0][2], { name: 'SymlinkError', path: cwd + '/d/i/r/symlink/', symlink: cwd + '/d/i/r/symlink', }) t.end() }) t.end() }, ) t.test('unsupported entries', t => { const unknown = new Header({ path: 'qux', size: 4 }) unknown.encode() unknown.block?.write('Z', 156) const data = makeTar([ { path: 'dev/random', type: 'CharacterDevice', }, { path: 'dev/hd0', type: 'BlockDevice', }, { path: 'dev/fifo0', type: 'FIFO', }, // note: unrecognized types are ignored, so this won't emit a warning. // gnutar and bsdtar treat unrecognized types as 'file', so it may be // worth doing the same thing, but with a warning. unknown.block, 'asdf', '', '', ]) t.test('basic, warns', t => { const cwd = t.testdir({}) const warnings = [] const u = new Unpack({ cwd, onwarn: (c, w, d) => warnings.push([c, w, d]), }) const c = 'TAR_ENTRY_UNSUPPORTED' const expect = [ [ c, 'unsupported entry type: CharacterDevice', { entry: { path: 'dev/random' }, }, ], [ c, 'unsupported entry type: BlockDevice', { entry: { path: 'dev/hd0' }, }, ], [ c, 'unsupported entry type: FIFO', { entry: { path: 'dev/fifo0' }, }, ], ] u.on('close', () => { t.equal(fs.readdirSync(cwd).length, 0) t.match(warnings, expect) t.end() }) u.end(data) }) t.test('strict, throws', t => { const cwd = t.testdir({}) const warnings = [] const errors = [] const u = new Unpack({ cwd, strict: true, onwarn: (c, w, d) => warnings.push([c, w, d]), }) u.on('error', e => errors.push(e)) u.on('close', () => { t.equal(fs.readdirSync(cwd).length, 0) t.same(warnings, []) t.match(errors, [ { message: 'unsupported entry type: CharacterDevice', entry: { path: 'dev/random' }, }, { message: 'unsupported entry type: BlockDevice', entry: { path: 'dev/hd0' }, }, { message: 'unsupported entry type: FIFO', entry: { path: 'dev/fifo0' }, }, ]) t.end() }) u.end(data) }) t.end() }) t.test('file in dir path', t => { const data = makeTar([ { path: 'd/i/r/file', type: 'File', size: 1, atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, 'a', { path: 'd/i/r/file/a/b/c', type: 'File', size: 1, atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, 'b', '', '', ]) t.test('fail because of file', t => { const check = t => { const cwd = t.testdirName t.equal(fs.readFileSync(cwd + '/d/i/r/file', 'utf8'), 'a') t.throws(() => fs.statSync(cwd + '/d/i/r/file/a/b/c')) t.end() } t.plan(2) t.test('async', t => { const cwd = t.testdir({}) new Unpack({ cwd }).on('close', () => check(t)).end(data) }) t.test('sync', t => { const cwd = t.testdir({}) new UnpackSync({ cwd }).end(data) check(t) }) }) t.test('clobber on through', t => { const check = t => { const cwd = t.testdirName t.ok(fs.statSync(cwd + '/d/i/r/file').isDirectory()) t.equal(fs.readFileSync(cwd + '/d/i/r/file/a/b/c', 'utf8'), 'b') t.end() } t.plan(2) t.test('async', t => { const cwd = t.testdir({}) new Unpack({ cwd, unlink: true }) .on('close', () => check(t)) .end(data) }) t.test('sync', t => { const cwd = t.testdir({}) new UnpackSync({ cwd, unlink: true }).end(data) check(t) }) }) t.end() }) t.test('set umask option', t => { const cwd = t.testdir({}) const data = makeTar([ { path: 'd/i/r/dir', type: 'Directory', mode: 0o751, }, '', '', ]) new Unpack({ umask: 0o027, cwd, }) .on('close', () => { t.equal( fs.statSync(cwd + '/d/i/r').mode & 0o7777, isWindows ? 0o666 : 0o750, ) t.equal( fs.statSync(cwd + '/d/i/r/dir').mode & 0o7777, isWindows ? 0o666 : 0o751, ) t.end() }) .end(data) }) t.test('absolute paths', t => { const dir = t.testdir({}) t.teardown(() => rimraf(dir)) t.beforeEach(async () => { await rimraf(dir) await mkdirp(dir) }) const absolute = path.resolve(dir, 'd/i/r/absolute') const root = path.parse(absolute).root const extraAbsolute = root + root + root + absolute t.ok(path.isAbsolute(extraAbsolute)) t.ok(path.isAbsolute(absolute)) const parsed = path.parse(absolute) const relative = absolute.slice(parsed.root.length) t.notOk(path.isAbsolute(relative)) const data = makeTar([ { path: extraAbsolute, type: 'File', size: 1, atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, 'a', '', '', ]) t.test('warn and correct', t => { const check = t => { const r = normPath(root) t.match(warnings, [ [ `stripping ${r}${r}${r}${r} from absolute path`, { path: normPath(absolute), code: 'TAR_ENTRY_INFO' }, ], ]) t.ok(fs.lstatSync(path.resolve(dir, relative)).isFile(), 'is file') t.end() } const warnings = [] t.test('async', t => { warnings.length = 0 new Unpack({ cwd: dir, onwarn: (_c, w, d) => warnings.push([w, d]), }) .on('close', () => check(t)) .end(data) }) t.test('sync', t => { warnings.length = 0 new UnpackSync({ cwd: dir, onwarn: (_c, w, d) => warnings.push([w, d]), }).end(data) check(t) }) t.end() }) t.test('preserve absolute path', t => { // if we use the extraAbsolute path here, we end up creating a dir // like C:\C:\C:\C:\path\to\absolute, which is both 100% valid on // windows, as well as SUUUUUPER annoying. const data = makeTar([ { path: isWindows ? absolute : extraAbsolute, type: 'File', size: 1, atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, 'a', '', '', ]) const check = t => { t.same(warnings, []) t.ok(fs.lstatSync(absolute).isFile(), 'is file') t.end() } const warnings = [] t.test('async', t => { warnings.length = 0 new Unpack({ preservePaths: true, cwd: dir, onwarn: (_c, w, d) => warnings.push([w, d]), }) .on('close', () => check(t)) .end(data) }) t.test('sync', t => { warnings.length = 0 new UnpackSync({ preservePaths: true, cwd: dir, onwarn: (_c, w, d) => warnings.push([w, d]), }).end(data) check(t) }) t.end() }) t.end() }) t.test('.. paths', t => { const dir = t.testdir({}) t.beforeEach(async () => { await rimraf(dir) await mkdirp(dir) }) const fmode = 0o755 const dotted = 'a/b/c/../d' const resolved = path.resolve(dir, dotted) const data = makeTar([ { path: dotted, type: 'File', size: 1, atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, 'd', '', '', ]) t.test('warn and skip', t => { const check = t => { t.match(warnings, [ ["path contains '..'", { path: dotted, code: 'TAR_ENTRY_ERROR' }], ]) t.throws(() => fs.lstatSync(resolved)) t.end() } const warnings = [] t.test('async', t => { warnings.length = 0 new Unpack({ fmode: fmode, cwd: dir, onwarn: (_c, w, d) => warnings.push([w, d]), }) .on('close', () => check(t)) .end(data) }) t.test('sync', t => { warnings.length = 0 new UnpackSync({ fmode: fmode, cwd: dir, onwarn: (_c, w, d) => warnings.push([w, d]), }).end(data) check(t) }) t.end() }) t.test('preserve dotted path', t => { const check = t => { t.same(warnings, []) t.ok(fs.lstatSync(resolved).isFile(), 'is file') t.equal( fs.lstatSync(resolved).mode & 0o777, isWindows ? 0o666 : fmode, ) t.end() } const warnings = [] t.test('async', t => { warnings.length = 0 new Unpack({ fmode: fmode, preservePaths: true, cwd: dir, onwarn: (_c, w, d) => warnings.push([w, d]), }) .on('close', () => check(t)) .end(data) }) t.test('sync', t => { warnings.length = 0 new UnpackSync({ fmode: fmode, preservePaths: true, cwd: dir, onwarn: (_c, w, d) => warnings.push([w, d]), }).end(data) check(t) }) t.end() }) t.end() }) t.test('fail all stats', t => { const poop = new Error('poop') poop.code = 'EPOOP' const dir = normPath(t.testdir({})) const { stat, fstat, lstat, statSync, fstatSync, lstatSync } = fs const unmutate = () => Object.assign(fs, { stat, fstat, lstat, statSync, fstatSync, lstatSync, }) const mutate = () => { fs.stat = fs.lstat = fs.fstat = (...args) => { // don't fail statting the cwd, or we get different errors if (normPath(args[0]) === dir) { return lstat(dir, args.pop()) } process.nextTick(() => args.pop()(poop)) } fs.statSync = fs.lstatSync = fs.fstatSync = (...args) => { if (normPath(args[0]) === dir) { return lstatSync(dir) } throw poop } } const warnings = [] t.beforeEach(() => { warnings.length = 0 mkdirp.sync(dir) mutate() }) t.afterEach(async () => { unmutate() await rimraf(dir) }) const data = makeTar([ { path: 'd/i/r/file/', type: 'Directory', atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, { path: 'd/i/r/dir/', type: 'Directory', mode: 0o751, atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, { path: 'd/i/r/file', type: 'File', size: 1, atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, 'a', { path: 'd/i/r/link', type: 'Link', linkpath: 'd/i/r/file', atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, { path: 'd/i/r/symlink', type: 'SymbolicLink', linkpath: './dir', atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, '', '', ]) const check = (t, expect) => { t.match(warnings, expect) warnings.forEach(w => t.equal(w[0], w[1].message)) t.end() } t.test('async', t => { const expect = [ ['poop', poop], ['poop', poop], ] new Unpack({ cwd: dir, onwarn: (_c, w, d) => warnings.push([w, d]), }) .on('close', () => check(t, expect)) .end(data) }) t.test('sync', t => { const expect = [ ['poop', poop], ['poop', poop], ] new UnpackSync({ cwd: dir, onwarn: (_c, w, d) => warnings.push([w, d]), }).end(data) check(t, expect) }) t.end() }) t.test('fail symlink', t => { const poop = new Error('poop') poop.code = 'EPOOP' const dir = t.testdir({}) t.teardown(mutateFS.fail('symlink', poop)) const warnings = [] t.beforeEach(async () => { warnings.length = 0 await rimraf(dir) await mkdirp(dir) }) const data = makeTar([ { path: 'd/i/r/dir/', type: 'Directory', mode: 0o751, atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, { path: 'd/i/r/symlink', type: 'SymbolicLink', linkpath: './dir', atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, '', '', ]) const check = (t, expect) => { t.match(warnings, expect) warnings.forEach(w => t.equal(w[0], w[1].message)) t.end() } t.test('async', t => { const expect = [['poop', poop]] new Unpack({ cwd: dir, onwarn: (_c, w, d) => warnings.push([w, d]), }) .on('close', () => check(t, expect)) .end(data) }) t.test('sync', t => { const expect = [['poop', poop]] new UnpackSync({ cwd: dir, onwarn: (_c, w, d) => warnings.push([w, d]), }).end(data) check(t, expect) }) t.end() }) t.test('fail chmod', t => { const poop = new Error('poop') poop.code = 'EPOOP' const dir = t.testdir() t.teardown(mutateFS.fail('chmod', poop)) const warnings = [] t.beforeEach(async () => { warnings.length = 0 await rimraf(dir) await mkdirp(dir) }) const data = makeTar([ { path: 'd/i/r/dir/', type: 'Directory', atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, { path: 'd/i/r/dir/', type: 'Directory', mode: 0o751, atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, '', '', ]) const check = (t, expect) => { t.match(warnings, expect) warnings.forEach(w => t.equal(w[0], w[1].message)) t.end() } t.test('async', t => { const expect = [['poop', poop]] new Unpack({ cwd: dir, onwarn: (_c, w, d) => warnings.push([w, d]), chmod: true, processUmask: 0o22, }) .on('close', () => check(t, expect)) .end(data) }) t.test('sync', t => { const expect = [['poop', poop]] new UnpackSync({ cwd: dir, onwarn: (_c, w, d) => warnings.push([w, d]), chmod: true, processUmask: 0o22, }).end(data) check(t, expect) }) t.end() }) t.test('fail mkdir', t => { const poop = new Error('poop') poop.code = 'EPOOP' let unmutate const dir = t.testdir({}) const warnings = [] t.beforeEach(async () => { warnings.length = 0 await rimraf(dir) await mkdirp(dir) unmutate = mutateFS.fail('mkdir', poop) }) t.afterEach(() => unmutate()) const data = makeTar([ { path: 'dir/', type: 'Directory', mode: 0o751, atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, '', '', ]) const expect = [ [ 'ENOENT: no such file or directory', { code: 'ENOENT', syscall: 'lstat', path: normPath(path.resolve(dir, 'dir')), }, ], ] const check = t => { t.match(warnings, expect) warnings.forEach(w => t.equal(w[0], w[1].message)) t.end() } t.test('sync', t => { new UnpackSync({ cwd: dir, onwarn: (_c, w, d) => warnings.push([w, d]), }).end(data) check(t) }) t.test('async', t => { new Unpack({ cwd: dir, onwarn: (_c, w, d) => warnings.push([w, d]), }) .on('close', () => check(t)) .end(data) }) t.end() }) t.test('fail write', t => { const poop = new Error('poop') poop.code = 'EPOOP' const dir = t.testdir({}) t.teardown(mutateFS.fail('write', poop)) const warnings = [] t.beforeEach(async () => { warnings.length = 0 await rimraf(dir) await mkdirp(dir) }) const data = makeTar([ { path: 'x', type: 'File', size: 1, mode: 0o751, mtime: new Date('2011-03-27T22:16:31.000Z'), }, 'x', '', '', ]) const expect = [['poop', poop]] const check = t => { t.match(warnings, expect) warnings.forEach(w => t.equal(w[0], w[1].message)) t.end() } t.test('async', t => { new Unpack({ cwd: dir, onwarn: (_c, w, d) => warnings.push([w, d]), }) .on('close', () => check(t)) .end(data) }) t.test('sync', t => { new UnpackSync({ cwd: dir, onwarn: (_c, w, d) => warnings.push([w, d]), }).end(data) check(t) }) t.end() }) t.test('skip existing', t => { const date = new Date('2011-03-27T22:16:31.000Z') t.beforeEach(async t => { const dir = t.testdir({ x: 'y', }) fs.utimesSync(dir + '/x', date, date) }) const data = makeTar([ { path: 'x', type: 'File', size: 1, mode: 0o751, mtime: new Date('2013-12-19T17:00:00.000Z'), }, 'x', '', '', ]) const check = t => { const dir = t.testdirName const st = fs.lstatSync(dir + '/x') t.equal(st.atime.toISOString(), date.toISOString()) t.equal(st.mtime.toISOString(), date.toISOString()) const data = fs.readFileSync(dir + '/x', 'utf8') t.equal(data, 'y') t.end() } t.test('async', t => { const dir = t.testdirName new Unpack({ cwd: dir, keep: true, }) .on('close', () => check(t)) .end(data) }) t.test('sync', t => { const dir = t.testdirName new UnpackSync({ cwd: dir, keep: true, }).end(data) check(t) }) t.end() }) t.test('skip newer', t => { const date = new Date('2013-12-19T17:00:00.000Z') t.beforeEach(async t => { const dir = t.testdir({ x: 'y' }) fs.utimesSync(dir + '/x', date, date) }) const data = makeTar([ { path: 'x', type: 'File', size: 1, mode: 0o751, mtime: new Date('2011-03-27T22:16:31.000Z'), }, 'x', '', '', ]) const check = t => { const dir = t.testdirName const st = fs.lstatSync(dir + '/x') t.equal(st.atime.toISOString(), date.toISOString()) t.equal(st.mtime.toISOString(), date.toISOString()) const data = fs.readFileSync(dir + '/x', 'utf8') t.equal(data, 'y') t.end() } t.test('async', t => { new Unpack({ cwd: t.testdirName, newer: true, }) .on('close', () => check(t)) .end(data) }) t.test('sync', t => { new UnpackSync({ cwd: t.testdirName, newer: true, }).end(data) check(t) }) t.end() }) t.test('no mtime', t => { const date = new Date('2011-03-27T22:16:31.000Z') const data = makeTar([ { path: 'x/', type: 'Directory', size: 0, atime: date, ctime: date, mtime: date, }, { path: 'x/y', type: 'File', size: 1, mode: 0o751, atime: date, ctime: date, mtime: date, }, 'x', '', '', ]) const check = t => { const dir = t.testdirName // this may fail if it's run on March 27, 2011 const stx = fs.lstatSync(dir + '/x') t.not(stx.atime.toISOString(), date.toISOString()) t.not(stx.mtime.toISOString(), date.toISOString()) const sty = fs.lstatSync(dir + '/x/y') t.not(sty.atime.toISOString(), date.toISOString()) t.not(sty.mtime.toISOString(), date.toISOString()) const data = fs.readFileSync(dir + '/x/y', 'utf8') t.equal(data, 'x') t.end() } t.test('async', t => { const dir = t.testdir({}) new Unpack({ cwd: dir, noMtime: true, }) .on('close', () => check(t)) .end(data) }) t.test('sync', t => { const dir = t.testdir({}) new UnpackSync({ cwd: dir, noMtime: true, }).end(data) check(t) }) t.end() }) t.test('unpack big enough to pause/drain', t => { const dir = t.testdir({}) const stream = fs.createReadStream(fixtures + '/parses.tar') const u = new Unpack({ cwd: dir, strip: 3, strict: true, }) u.on('ignoredEntry', entry => t.fail('should not get ignored entry: ' + entry.path), ) u.on('close', () => { t.pass('extraction finished') const actual = fs.readdirSync(dir) const expected = fs.readdirSync(parses) t.same(actual, expected) t.end() }) stream.pipe(u) }) t.test('set owner', t => { // fake it on platforms that don't have getuid const myUid = 501 const myGid = 1024 t.capture(process, 'getuid', () => myUid) t.capture(process, 'getgid', () => myGid) // can't actually do this because it requires root, but we can // verify that chown gets called. t.test('as root, defaults to true', t => { t.capture(process, 'getuid', () => 0) const u = new Unpack() t.equal(u.preserveOwner, true, 'preserveOwner enabled') t.end() }) t.test('as non-root, defaults to false', t => { t.capture(process, 'getuid', () => 501) const u = new Unpack() t.equal(u.preserveOwner, false, 'preserveOwner disabled') t.end() }) const data = makeTar([ { uid: 2456124561, gid: 813708013, path: 'foo/', type: 'Directory', }, { uid: myUid, gid: 813708013, path: 'foo/my-uid-different-gid', type: 'File', size: 3, }, 'qux', { uid: 2456124561, path: 'foo/different-uid-nogid', type: 'Directory', }, { uid: 2456124561, path: 'foo/different-uid-nogid/bar', type: 'File', size: 3, }, 'qux', { gid: 813708013, path: 'foo/different-gid-nouid/bar', type: 'File', size: 3, }, 'qux', { uid: myUid, gid: myGid, path: 'foo-mine/', type: 'Directory', }, { uid: myUid, gid: myGid, path: 'foo-mine/bar', type: 'File', size: 3, }, 'qux', { uid: myUid, path: 'foo-mine/nogid', type: 'Directory', }, { uid: myUid, path: 'foo-mine/nogid/bar', type: 'File', size: 3, }, 'qux', '', '', ]) t.test('chown failure results in unpack failure', t => { const poop = new Error('expected chown failure') const un = mutateFS.fail('chown', poop) const unl = mutateFS.fail('lchown', poop) const unf = mutateFS.fail('fchown', poop) t.teardown(async () => { un() unf() unl() }) t.test('sync', t => { const cwd = t.testdir({}) let warned = false const u = new UnpackSync({ cwd, preserveOwner: true, onwarn: (_c, _m, er) => { if (!warned) { warned = true t.equal(er, poop) } }, }) u.end(data) t.equal(warned, true) t.end() }) t.test('async', t => { const cwd = t.testdir({}) let warned = false const u = new Unpack({ cwd, preserveOwner: true, onwarn: (_c, _m, er) => { if (!warned) { warned = true t.equal(er, poop) } }, }) u.on('finish', () => { t.equal(warned, true) t.end() }) u.end(data) }) t.end() }) t.test('chown when true', t => { const chown = fs.chown const lchown = fs.lchown const fchown = fs.fchown const chownSync = fs.chownSync const fchownSync = fs.fchownSync const lchownSync = fs.lchownSync let called = 0 fs.fchown = fs.chown = fs.lchown = (_path, _owner, _group, cb) => { called++ cb() } fs.chownSync = fs.lchownSync = fs.fchownSync = () => called++ t.teardown(() => { fs.chown = chown fs.fchown = fchown fs.lchown = lchown fs.chownSync = chownSync fs.fchownSync = fchownSync fs.lchownSync = lchownSync }) t.test('sync', t => { const cwd = t.testdir({}) called = 0 const u = new UnpackSync({ cwd, preserveOwner: true }) u.end(data) t.ok(called >= 5, 'called chowns') t.end() }) t.test('async', t => { const cwd = t.testdir({}) called = 0 const u = new Unpack({ cwd, preserveOwner: true }) u.end(data) u.on('close', () => { t.ok(called >= 5, 'called chowns') t.end() }) }) t.end() }) t.test('no chown when false', t => { const poop = new Error('poop') const un = mutateFS.fail('chown', poop) const unf = mutateFS.fail('fchown', poop) const unl = mutateFS.fail('lchown', poop) t.teardown(async () => { un() unf() unl() }) const check = t => { const dir = t.testdirName const dirStat = fs.statSync(dir + '/foo') t.not(dirStat.uid, 2456124561) t.not(dirStat.gid, 813708013) const fileStat = fs.statSync(dir + '/foo/my-uid-different-gid') t.not(fileStat.uid, 2456124561) t.not(fileStat.gid, 813708013) const dirStat2 = fs.statSync(dir + '/foo/different-uid-nogid') t.not(dirStat2.uid, 2456124561) const fileStat2 = fs.statSync(dir + '/foo/different-uid-nogid/bar') t.not(fileStat2.uid, 2456124561) t.end() } t.test('sync', t => { const dir = t.testdir({}) const u = new UnpackSync({ cwd: dir, preserveOwner: false }) u.end(data) check(t) }) t.test('async', t => { const dir = t.testdir({}) const u = new Unpack({ cwd: dir, preserveOwner: false }) u.end(data) u.on('close', () => check(t)) }) t.end() }) t.end() }) t.test('unpack when dir is not writable', t => { const data = makeTar([ { path: 'a/', type: 'Directory', mode: 0o444, }, { path: 'a/b', type: 'File', size: 1, }, 'a', '', '', ]) const check = t => { const dir = t.testdirName t.equal( fs.statSync(dir + '/a').mode & 0o7777, isWindows ? 0o666 : 0o744, ) t.equal(fs.readFileSync(dir + '/a/b', 'utf8'), 'a') t.end() } t.test('sync', t => { const dir = t.testdir({}) const u = new UnpackSync({ cwd: dir, strict: true }) u.end(data) check(t) }) t.test('async', t => { const dir = t.testdir({}) const u = new Unpack({ cwd: dir, strict: true }) u.end(data) u.on('close', () => check(t)) }) t.end() }) t.test('transmute chars on windows', t => { const data = makeTar([ { path: '<|>?:.txt', size: 5, type: 'File', }, '<|>?:', '', '', ]) const hex = 'ef80bcef81bcef80beef80bfef80ba2e747874' const uglyName = Buffer.from(hex, 'hex').toString() const check = t => { const dir = t.testdirName const ugly = path.resolve(dir, uglyName) t.same(fs.readdirSync(dir), [uglyName]) t.equal(fs.readFileSync(ugly, 'utf8'), '<|>?:') t.end() } t.test('async', t => { const dir = t.testdir({}) const u = new Unpack({ cwd: dir, win32: true, }) u.end(data) u.on('close', () => check(t)) }) t.test('sync', t => { const dir = t.testdir({}) const u = new UnpackSync({ cwd: dir, win32: true, }) u.end(data) check(t) }) t.end() }) t.test('safely transmute chars on windows with absolutes', t => { // don't actually make the directory const poop = new Error('poop') t.teardown(mutateFS.fail('mkdir', poop)) const data = makeTar([ { path: 'c:/x/y/z/<|>?:.txt', size: 5, type: 'File', }, '<|>?:', '', '', ]) const hex = 'ef80bcef81bcef80beef80bfef80ba2e747874' const uglyName = Buffer.from(hex, 'hex').toString() const uglyPath = 'c:/x/y/z/' + uglyName const u = new Unpack({ win32: true, preservePaths: true, }) u.on('entry', entry => { t.equal(entry.path, uglyPath) t.end() }) u.end(data) }) t.test('use explicit chmod when required by umask', t => { const data = makeTar([ { path: 'x/y/z', mode: 0o775, type: 'Directory', }, '', '', ]) const check = async t => { const cwd = t.testdirName const st = fs.statSync(cwd + '/x/y/z') t.equal(st.mode & 0o777, isWindows ? 0o666 : 0o775) t.end() } t.test('async', t => { const cwd = t.testdir({}) const unpack = new Unpack({ cwd, chmod: true, processUmask: 0o22, }) unpack.on('close', () => check(t)) unpack.end(data) }) return t.test('sync', t => { const cwd = t.testdir({}) const unpack = new UnpackSync({ cwd, chmod: true, processUmask: 0o22, }) unpack.end(data) check(t) }) }) t.test('dont use explicit chmod if chmod flag not set', t => { t.capture(process, 'umask', () => { throw new Error('should not call process.umask()') }) const data = makeTar([ { path: 'x/y/z', mode: 0o775, type: 'Directory', }, '', '', ]) const check = async t => { const cwd = t.testdirName const st = fs.statSync(cwd + '/x/y/z') t.equal(st.mode & 0o777, isWindows ? 0o666 : 0o755) t.end() } t.test('async', t => { const cwd = t.testdir({}) const unpack = new Unpack({ cwd }) unpack.on('close', () => check(t)) unpack.end(data) }) return t.test('sync', t => { const cwd = t.testdir({}) const unpack = new UnpackSync({ cwd }) unpack.end(data) check(t) }) }) t.test('chown implicit dirs and also the entries', t => { const basedir = t.testdir({}) // club these so that the test can run as non-root const chown = fs.chown const chownSync = fs.chownSync const lchown = fs.lchown const lchownSync = fs.lchownSync const fchown = fs.fchown const fchownSync = fs.fchownSync const getuid = process.getuid const getgid = process.getgid t.teardown(() => { fs.chown = chown fs.chownSync = chownSync fs.lchown = lchown fs.lchownSync = lchownSync fs.fchown = fchown fs.fchownSync = fchownSync process.getgid = getgid }) let chowns = 0 let currentTest = null fs.lchown = fs.fchown = fs.chown = (path, uid, gid, cb) => { currentTest.equal(uid, 420, 'chown(' + path + ') uid') currentTest.equal(gid, 666, 'chown(' + path + ') gid') chowns++ cb() } fs.lchownSync = fs.chownSync = fs.fchownSync = (path, uid, gid) => { currentTest.equal(uid, 420, 'chownSync(' + path + ') uid') currentTest.equal(gid, 666, 'chownSync(' + path + ') gid') chowns++ } const data = makeTar([ { path: 'a/b/c', mode: 0o775, type: 'File', size: 1, uid: null, gid: null, }, '.', { path: 'x/y/z', mode: 0o775, uid: 12345, gid: 54321, type: 'File', size: 1, }, '.', '', '', ]) const check = async t => { currentTest = null t.equal(chowns, 8) chowns = 0 await rimraf(basedir) t.end() } t.test('throws when setting uid/gid improperly', t => { t.throws( () => new Unpack({ uid: 420 }), TypeError('cannot set owner without number uid and gid'), ) t.throws( () => new Unpack({ gid: 666 }), TypeError('cannot set owner without number uid and gid'), ) t.throws( () => new Unpack({ uid: 1, gid: 2, preserveOwner: true }), TypeError( 'cannot preserve owner in archive and also set owner explicitly', ), ) t.end() }) const tests = () => t .test('async', t => { currentTest = t mkdirp.sync(basedir) const unpack = new Unpack({ cwd: basedir, uid: 420, gid: 666, }) unpack.on('close', () => check(t)) unpack.end(data) }) .then( t.test('sync', t => { currentTest = t mkdirp.sync(basedir) const unpack = new UnpackSync({ cwd: basedir, uid: 420, gid: 666, }) unpack.end(data) check(t) }), ) tests() t.test('make it look like processUid is 420', t => { process.getuid = () => 420 t.end() }) tests() t.test('make it look like processGid is 666', t => { process.getuid = getuid process.getgid = () => 666 t.end() }) return tests() }) t.test('bad cwd setting', t => { const basedir = t.testdir({}) const cases = [ // the cwd itself { path: './', type: 'Directory', }, // a file directly in the cwd { path: 'a', type: 'File', }, // a file nested within a subdir of the cwd { path: 'a/b/c', type: 'File', }, ] fs.writeFileSync(basedir + '/file', 'xyz') cases.forEach(c => t.test(c.type + ' ' + c.path, t => { const data = makeTar([ { path: c.path, mode: 0o775, type: c.type, size: 0, uid: null, gid: null, }, '', '', ]) t.test('cwd is a file', t => { const cwd = basedir + '/file' const opt = { cwd: cwd } t.throws(() => new UnpackSync(opt).end(data), { name: 'CwdError', message: "ENOTDIR: Cannot cd into '" + normPath(cwd) + "'", path: normPath(cwd), code: 'ENOTDIR', }) new Unpack(opt) .on('error', er => { t.match(er, { name: 'CwdError', message: "ENOTDIR: Cannot cd into '" + normPath(cwd) + "'", path: normPath(cwd), code: 'ENOTDIR', }) t.end() }) .end(data) }) return t.test('cwd is missing', t => { const cwd = basedir + '/asdf/asdf/asdf' const opt = { cwd: cwd } t.throws(() => new UnpackSync(opt).end(data), { name: 'CwdError', message: "ENOENT: Cannot cd into '" + normPath(cwd) + "'", path: normPath(cwd), code: 'ENOENT', }) new Unpack(opt) .on('error', er => { t.match(er, { name: 'CwdError', message: "ENOENT: Cannot cd into '" + normPath(cwd) + "'", path: normPath(cwd), code: 'ENOENT', }) t.end() }) .end(data) }) }), ) t.end() }) t.test('transform', t => { const cases = { 'emptypax.tar': { '🌟.txt': '🌟✧✩â­�︎✪✫✬✭✮âš�✯✰✵✶✷✸✹â�‚⭑⭒★☆✡☪✴︎✦✡ï¸�🔯✴ï¸�🌠\n', 'one-byte.txt': '[a]', }, 'body-byte-counts.tar': { '1024-bytes.txt': new Array(1024).join('[x]') + '[\n]', '512-bytes.txt': new Array(512).join('[x]') + '[\n]', 'one-byte.txt': '[a]', 'zero-byte.txt': '', }, 'utf8.tar': { '🌟.txt': '🌟✧✩â­�︎✪✫✬✭✮âš�✯✰✵✶✷✸✹â�‚⭑⭒★☆✡☪✴︎✦✡ï¸�🔯✴ï¸�🌠\n', 'Ω.txt': '[Ω]', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt': '[Ω]', }, } const txFn = entry => { switch (path.basename(entry.path)) { case 'zero-bytes.txt': return entry case 'one-byte.txt': case '1024-bytes.txt': case '512-bytes.txt': case 'Ω.txt': return new Bracer() } } class Bracer extends Minipass { write(data) { const d = data .toString() .split('') .map(c => '[' + c + ']') .join('') return super.write(d) } } const tarfiles = Object.keys(cases) t.plan(tarfiles.length) t.jobs = tarfiles.length tarfiles.forEach(tarfile => { t.test(tarfile, t => { const tf = path.resolve(tars, tarfile) const check = t => { const dir = t.testdirName const expect = cases[tarfile] Object.keys(expect).forEach(file => { const f = path.resolve(dir, file) t.equal(fs.readFileSync(f, 'utf8'), expect[file], file) }) t.end() } t.plan(2) t.test('async unpack', t => { t.plan(2) t.test('strict', t => { const dir = t.testdir({}) const unpack = new Unpack({ cwd: dir, strict: true, transform: txFn, }) fs.createReadStream(tf).pipe(unpack) eos(unpack, () => check(t)) }) t.test('loose', t => { const dir = t.testdir({}) const unpack = new Unpack({ cwd: dir, transform: txFn }) fs.createReadStream(tf).pipe(unpack) eos(unpack, () => check(t)) }) }) t.test('sync unpack', t => { t.plan(2) t.test('strict', t => { const dir = t.testdir({}) const unpack = new UnpackSync({ cwd: dir, strict: true, transform: txFn, }) unpack.end(fs.readFileSync(tf)) check(t) }) t.test('loose', t => { const dir = t.testdir({}) const unpack = new UnpackSync({ cwd: dir, transform: txFn }) unpack.end(fs.readFileSync(tf)) check(t) }) }) }) }) }) t.test('transform error', t => { const tarfile = path.resolve(tars, 'body-byte-counts.tar') const tardata = fs.readFileSync(tarfile) const poop = new Error('poop') const txFn = () => { const tx = new Minipass() tx.write = () => tx.emit('error', poop) tx.resume() return tx } t.test('sync unpack', t => { t.test('strict', t => { const dir = t.testdir({}) const unpack = new UnpackSync({ cwd: dir, strict: true, transform: txFn, }) const expect = 3 let actual = 0 unpack.on('error', er => { t.equal(er, poop) actual++ }) unpack.end(tardata) t.equal(actual, expect, 'error count') t.end() }) t.test('loose', t => { const dir = t.testdir({}) const unpack = new UnpackSync({ cwd: dir, transform: txFn }) const expect = 3 let actual = 0 unpack.on('warn', (_code, _msg, er) => { t.equal(er, poop) actual++ }) unpack.end(tardata) t.equal(actual, expect, 'error count') t.end() }) t.end() }) t.test('async unpack', t => { const dir = t.testdir({}) // the last error is about the folder being deleted, just ignore that one t.test('strict', t => { const unpack = new Unpack({ cwd: dir, strict: true, transform: txFn, }) t.plan(3) t.teardown(() => { unpack.removeAllListeners('error') unpack.on('error', () => {}) }) unpack.on('error', er => t.equal(er, poop)) unpack.end(tardata) }) t.test('loose', t => { const dir = t.testdir({}) const unpack = new Unpack({ cwd: dir, transform: txFn }) t.plan(3) t.teardown(() => unpack.removeAllListeners('warn')) unpack.on('warn', (_code, _msg, er) => t.equal(er, poop)) unpack.end(tardata) }) t.end() }) t.end() }) t.test('futimes/fchown failures', t => { const archive = path.resolve(tars, 'utf8.tar') const tardata = fs.readFileSync(archive) const poop = new Error('poop') const second = new Error('second error') const methods = ['utimes', 'chown'] methods.forEach(method => { const fc = method === 'chown' t.test(method + ' fallback', t => { const dir = t.testdir({}) t.teardown(mutateFS.fail('f' + method, poop)) // forceChown will fail on systems where the user is not root // and/or the uid/gid in the archive aren't valid. We're just // verifying coverage here, so make the method auto-pass. t.teardown(mutateFS.pass(method)) t.plan(2) t.test('async unpack', t => { t.plan(2) t.test('strict', t => { const unpack = new Unpack({ cwd: dir, strict: true, forceChown: fc, }) unpack.on('finish', () => t.end()) unpack.end(tardata) }) t.test('loose', t => { const unpack = new Unpack({ cwd: dir, forceChown: fc }) unpack.on('finish', () => t.end()) unpack.on('warn', t.fail) unpack.end(tardata) }) }) t.test('sync unpack', t => { t.plan(2) t.test('strict', t => { const unpack = new UnpackSync({ cwd: dir, strict: true, forceChown: fc, }) unpack.end(tardata) t.end() }) t.test('loose', t => { const unpack = new UnpackSync({ cwd: dir, forceChown: fc }) unpack.on('warn', t.fail) unpack.end(tardata) t.end() }) }) }) t.test('also fail ' + method, t => { const unmutate = mutateFS.fail('f' + method, poop) const unmutate2 = mutateFS.fail(method, second) t.teardown(() => { unmutate() unmutate2() }) t.plan(2) t.test('async unpack', t => { t.plan(2) t.test('strict', t => { const dir = t.testdir({}) const unpack = new Unpack({ cwd: dir, strict: true, forceChown: fc, }) t.plan(3) unpack.on('error', er => t.equal(er, poop)) unpack.end(tardata) }) t.test('loose', t => { const dir = t.testdir({}) const unpack = new Unpack({ cwd: dir, forceChown: fc }) t.plan(3) unpack.on('warn', (_code, _m, er) => t.equal(er, poop)) unpack.end(tardata) }) }) t.test('sync unpack', t => { t.plan(2) t.test('strict', t => { const dir = t.testdir({}) const unpack = new UnpackSync({ cwd: dir, strict: true, forceChown: fc, }) t.plan(3) unpack.on('error', er => t.equal(er, poop)) unpack.end(tardata) }) t.test('loose', t => { const dir = t.testdir({}) const unpack = new UnpackSync({ cwd: dir, forceChown: fc }) t.plan(3) unpack.on('warn', (_c, _m, er) => t.equal(er, poop)) unpack.end(tardata) }) }) }) }) t.end() }) t.test('onReadEntry option is preserved', t => { let oecalls = 0 const onReadEntry = _entry => oecalls++ const data = makeTar([ { path: 'd/i', type: 'Directory', }, { path: 'd/i/r/dir', type: 'Directory', mode: 0o751, mtime: new Date('2011-03-27T22:16:31.000Z'), }, { path: 'd/i/r/file', type: 'File', size: 1, atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), }, 'a', '', '', ]) const check = t => { t.equal(oecalls, 3) oecalls = 0 t.end() } t.test('sync', t => { const dir = t.testdir({}) const unpack = new UnpackSync({ cwd: dir, onReadEntry }) unpack.end(data) check(t) }) t.test('async', t => { const dir = t.testdir({}) mkdirp.sync(dir) const unpack = new Unpack({ cwd: dir, onReadEntry }) unpack.on('finish', () => check(t)) unpack.end(data) }) t.end() }) t.test('do not reuse hardlinks, only nlink=1 files', t => { const now = new Date('2018-04-30T18:30:39.025Z') const data = makeTar([ { path: 'overwriteme', type: 'File', size: 4, mode: 0o644, mtime: now, }, 'foo\n', { path: 'link', linkpath: 'overwriteme', type: 'Link', mode: 0o644, mtime: now, }, { path: 'link', type: 'File', size: 4, mode: 0o644, mtime: now, }, 'bar\n', '', '', ]) const checks = { link: 'bar\n', overwriteme: 'foo\n', } const check = t => { const dir = t.testdirName for (const f in checks) { t.equal(fs.readFileSync(dir + '/' + f, 'utf8'), checks[f], f) t.equal(fs.statSync(dir + '/' + f).nlink, 1, f) } t.end() } t.test('async', t => { const dir = t.testdir({}) const u = new Unpack({ cwd: dir }) u.on('close', () => check(t)) u.end(data) }) t.test('sync', t => { const dir = t.testdir({}) const u = new UnpackSync({ cwd: dir }) u.end(data) check(t) }) t.end() }) t.test('trying to unpack a non-zlib gzip file should fail', t => { const data = Buffer.from('hello this is not gzip data') const dataGzip = Buffer.concat([Buffer.from([0x1f, 0x8b]), data]) t.test('abort if gzip has an error', t => { const expect = { message: /^zlib/, errno: Number, code: /^Z/, recoverable: false, cwd: normPath(t.testdirName), tarCode: 'TAR_ABORT', } const opts = { cwd: t.testdir({}), gzip: true, } new Unpack(opts) .once('error', er => t.match(er, expect, 'async emits')) .end(dataGzip) const skip = !/^v([0-9]|1[0-3])\./.test(process.version) ? false : 'node prior to v14 did not raise sync zlib errors properly' t.throws( () => new UnpackSync(opts).end(dataGzip), expect, 'sync throws', { skip }, ) t.end() }) t.test('bad archive if no gzip', t => { t.plan(2) const expect = { tarCode: 'TAR_BAD_ARCHIVE', recoverable: false, } const opts = { cwd: t.testdir({}) } new Unpack(opts) .once('error', er => t.match(er, expect, 'async emits')) .end(data) t.throws(() => new UnpackSync(opts).end(data), expect, 'sync throws') }) t.end() }) t.test('max decompression ratio', t => { const data = makeCompressedBomb() t.test('aborts compressed bombs by default', t => { t.plan(2) const cwd = t.testdir({}) new Unpack({ cwd }) .once('error', er => t.match(er, { tarCode: 'TAR_ABORT', recoverable: false, cwd: normPath(cwd), message: /max decompression ratio exceeded/, }), ) .end(data) t.throws( () => new UnpackSync({ cwd }).end(data), { tarCode: 'TAR_ABORT', recoverable: false, cwd: normPath(cwd), message: /max decompression ratio exceeded/, }, 'sync throws', ) }) t.test('can be disabled explicitly', t => { const cwd = t.testdir({}) const u = new Unpack({ cwd, maxDecompressionRatio: Infinity, }) u.on('error', er => t.fail(er.message)) u.on('close', () => { t.equal(fs.statSync(path.resolve(cwd, 'bomb')).size, 8 * 1024 * 1024) t.end() }) u.end(data) }) t.end() }) t.test('handle errors on fs.close', t => { const poop = new Error('poop') // have to actually close them, or else windows gets mad t.teardown(mutateFS.fail('close', poop)) const data = makeTar([ { path: 'file', type: 'File', size: 1, atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, 'a', '', '', ]) t.plan(2) t.test('async', t => { new Unpack({ cwd: t.testdir({}), strict: true }) .on('error', er => t.equal(er, poop, 'async')) .on('end', () => t.end()) .end(data) }) t.test('sync', t => { t.throws( () => new UnpackSync({ cwd: normPath(t.testdir({})), strict: true, }).end(data), poop, 'sync', ) t.end() }) }) t.test('using strip option when top level file exists', t => { const data = makeTar([ { path: 'top', type: 'File', size: 0, }, { path: 'x', type: 'Directory', }, { path: 'x/a', type: 'File', size: 'a'.length, }, 'a', { path: 'y', type: 'GNUDumpDir', }, { path: 'y/b', type: 'File', size: 'b'.length, }, 'b', '', '', ]) t.plan(2) const check = (t, path) => { t.equal(fs.statSync(path).isDirectory(), true) t.equal(fs.readFileSync(path + '/a', 'utf8'), 'a') t.equal(fs.readFileSync(path + '/b', 'utf8'), 'b') t.throws(() => fs.statSync(path + '/top'), { code: 'ENOENT' }) t.end() } t.test('async', t => { const path = t.testdir({ y: {} }) new Unpack({ cwd: path, strip: 1 }) .on('end', () => check(t, path)) .end(data) }) t.test('sync', t => { const path = t.testdir({ y: {} }) new UnpackSync({ cwd: path, strip: 1 }).end(data) check(t, path) }) }) t.test('handle EPERMs when creating symlinks', t => { // https://github.com/npm/node-tar/issues/265 const msg = 'You do not have sufficient privilege to perform this operation.' const er = Object.assign(new Error(msg), { code: 'EPERM', }) t.teardown(mutateFS.fail('symlink', er)) const data = makeTar([ { path: 'x', type: 'Directory', }, { path: 'x/y', type: 'File', size: 'hello, world'.length, }, 'hello, world', { path: 'x/link1', type: 'SymbolicLink', linkpath: './y', }, { path: 'x/link2', type: 'SymbolicLink', linkpath: './y', }, { path: 'x/link3', type: 'SymbolicLink', linkpath: './y', }, { path: 'x/z', type: 'File', size: 'hello, world'.length, }, 'hello, world', '', '', ]) const check = (t, path) => { t.match( WARNINGS, [ ['TAR_ENTRY_ERROR', msg], ['TAR_ENTRY_ERROR', msg], ['TAR_ENTRY_ERROR', msg], ], 'got expected warnings', ) t.equal(WARNINGS.length, 3) WARNINGS.length = 0 t.equal(fs.readFileSync(`${path}/x/y`, 'utf8'), 'hello, world') t.equal(fs.readFileSync(`${path}/x/z`, 'utf8'), 'hello, world') t.throws(() => fs.statSync(`${path}/x/link1`), { code: 'ENOENT' }) t.throws(() => fs.statSync(`${path}/x/link2`), { code: 'ENOENT' }) t.throws(() => fs.statSync(`${path}/x/link3`), { code: 'ENOENT' }) } const WARNINGS = [] t.test('async', t => { const dir = t.testdir({}) const u = new Unpack({ cwd: dir, onwarn: (code, msg, _er) => WARNINGS.push([code, msg]), }) u.on('end', () => { check(t, dir) t.end() }) u.end(data) }) t.test('sync', t => { const dir = t.testdir({}) const u = new UnpackSync({ cwd: dir, onwarn: (code, msg, _er) => WARNINGS.push([code, msg]), }) u.end(data) check(t, dir) t.end() }) t.end() }) t.test('close fd when error writing', t => { const data = makeTar([ { type: 'Directory', path: 'x', }, { type: 'File', size: 1, path: 'x/y', }, '.', '', '', ]) t.teardown(mutateFS.fail('write', new Error('nope'))) const CLOSES = [] const OPENS = {} const { open } = fs t.teardown(() => (fs.open = open)) fs.open = (...args) => { const cb = args.pop() args.push((er, fd) => { OPENS[args[0]] = fd cb(er, fd) }) return open.call(fs, ...args) } t.teardown( mutateFS.mutateArgs('close', ([fd]) => { CLOSES.push(fd) return [fd] }), ) const WARNINGS = [] const dir = t.testdir({}) const unpack = new Unpack({ cwd: dir, onwarn: (code, msg) => WARNINGS.push([code, msg]), }) unpack.on('end', () => { for (const [path, fd] of Object.entries(OPENS)) { t.equal(CLOSES.includes(fd), true, 'closed fd for ' + path) } t.end() }) unpack.end(data) }) t.test('close fd when error setting mtime', t => { const data = makeTar([ { type: 'Directory', path: 'x', }, { type: 'File', size: 1, path: 'x/y', atime: new Date('1979-07-01T19:10:00.000Z'), ctime: new Date('2011-03-27T22:16:31.000Z'), mtime: new Date('2011-03-27T22:16:31.000Z'), }, '.', '', '', ]) // have to clobber these both, because we fall back t.teardown(mutateFS.fail('futimes', new Error('nope'))) t.teardown(mutateFS.fail('utimes', new Error('nooooope'))) const CLOSES = [] const OPENS = {} const { open } = fs t.capture(fs, 'open', (...args) => { const cb = args.pop() args.push((er, fd) => { OPENS[args[0]] = fd cb(er, fd) }) return open.call(fs, ...args) }) t.teardown( mutateFS.mutateArgs('close', ([fd]) => { CLOSES.push(fd) return [fd] }), ) const WARNINGS = [] const dir = t.testdir({}) const unpack = new Unpack({ cwd: dir, onwarn: (code, msg) => WARNINGS.push([code, msg]), }) unpack.on('end', () => { for (const [path, fd] of Object.entries(OPENS)) { t.equal(CLOSES.includes(fd), true, 'closed fd for ' + path) } t.end() }) unpack.end(data) }) t.test('do not hang on large files that fail to open()', t => { const data = makeTar([ { type: 'Directory', path: 'x', }, { type: 'File', size: 31745, path: 'x/y', }, 'x'.repeat(31745), '', '', ]) t.teardown(mutateFS.fail('open', new Error('nope'))) const dir = t.testdir({}) const WARNINGS = [] const unpack = new Unpack({ cwd: dir, onwarn: (code, msg) => WARNINGS.push([code, msg]), }) unpack.on('end', () => { t.strictSame(WARNINGS, [['TAR_ENTRY_ERROR', 'nope']]) t.end() }) unpack.write(data.subarray(0, 2048)) setTimeout(() => { unpack.write(data.subarray(2048, 4096)) setTimeout(() => { unpack.write(data.subarray(4096)) setTimeout(() => { unpack.end() }) }) }) }) t.test('recognize C:.. as a dot path part', async t => { if (process.platform !== 'win32') { process.env.TESTING_TAR_FAKE_PLATFORM = 'win32' t.teardown(() => { delete process.env.TESTING_TAR_FAKE_PLATFORM }) } const { Unpack, UnpackSync } = await t.mockImport( '../dist/esm/unpack.js', { path: { ...path.win32, win32: path.win32, posix: path.posix, }, }, ) const data = makeTar([ { type: 'File', path: 'C:../x/y/z', size: 1, }, 'z', { type: 'File', path: 'x:..\\y\\z', size: 1, }, 'x', { type: 'File', path: 'Y:foo', size: 1, }, 'y', '', '', ]) const check = (path, warnings, t) => { t.equal(fs.readFileSync(`${path}/foo`, 'utf8'), 'y') t.strictSame(warnings, [ [ 'TAR_ENTRY_ERROR', "path contains '..'", 'C:../x/y/z', 'C:../x/y/z', ], ['TAR_ENTRY_ERROR', "path contains '..'", 'x:../y/z', 'x:../y/z'], [ 'TAR_ENTRY_INFO', 'stripping Y: from absolute path', 'Y:foo', 'foo', ], ]) t.end() } t.test('async', t => { const warnings = [] const path = t.testdir() new Unpack({ cwd: path, onwarn: (c, w, { entry, path }) => warnings.push([c, w, path, entry.path]), }) .on('close', () => check(path, warnings, t)) .end(data) }) t.test('sync', t => { const warnings = [] const path = t.testdir() new UnpackSync({ cwd: path, onwarn: (c, w, { entry, path }) => warnings.push([c, w, path, entry.path]), }).end(data) check(path, warnings, t) }) t.end() }) t.test('excessively deep subfolder nesting', async t => { const tf = path.resolve(fixtures, 'excessively-deep.tar') const data = fs.readFileSync(tf) const warnings = [] const onwarn = (c, w, { entry, path, depth, maxDepth }) => warnings.push([c, w, { entry, path, depth, maxDepth }]) const check = (t, maxDepth = 1024) => { t.match(warnings, [ [ 'TAR_ENTRY_ERROR', 'path excessively deep', { entry: ReadEntry, path: /^\.(\/a){1024,}\/foo.txt$/, depth: 222372, maxDepth, }, ], ]) warnings.length = 0 t.end() } t.test('async', t => { const cwd = t.testdir() new Unpack({ cwd, onwarn, }) .on('end', () => check(t)) .end(data) }) t.test('sync', t => { const cwd = t.testdir() new UnpackSync({ cwd, onwarn, }).end(data) check(t) }) t.test('async set md', t => { const cwd = t.testdir() new Unpack({ cwd, onwarn, maxDepth: 64, }) .on('end', () => check(t, 64)) .end(data) }) t.test('sync set md', t => { const cwd = t.testdir() new UnpackSync({ cwd, onwarn, maxDepth: 64, }).end(data) check(t, 64) }) }) t.test('ignore self-referential hardlinks', async t => { const data = makeTar([ { path: 'autolink', linkpath: './autolink', type: 'Link', }, ]) const check = (t, warnings) => { t.matchSnapshot(warnings) t.strictSame(fs.readdirSync(t.testdirName), [], 'nothing extracted') t.end() } t.test('async', t => { const cwd = t.testdir({}) const warnings = [] const u = new Unpack({ cwd, onwarn: (_, m) => warnings.push(m) }) u.on('end', () => check(t, warnings)) u.end(data) }) t.test('sync', t => { const cwd = t.testdir({}) const warnings = [] const u = new UnpackSync({ cwd, onwarn: (_, m) => warnings.push(m), }) u.end(data) check(t, warnings) }) }) t.test('valid relative symlink with .. should be extracted', async t => { const makeTar = () => { // foo/file.txt (regular file) // bar/link.txt -> ../foo/file.txt (valid relative symlink) const chunks = [] const fooDirHeader = Buffer.alloc(512) new Header({ path: 'foo/', type: 'Directory', mode: 0o755, }).encode(fooDirHeader, 0) chunks.push(fooDirHeader) const fileContent = 'hello world' const fileHeader = Buffer.alloc(512) new Header({ path: 'foo/file.txt', type: 'File', mode: 0o644, size: fileContent.length, }).encode(fileHeader, 0) chunks.push(fileHeader) const contentBuf = Buffer.alloc(512) contentBuf.write(fileContent) chunks.push(contentBuf) const barDirHeader = Buffer.alloc(512) new Header({ path: 'bar/', type: 'Directory', mode: 0o755, }).encode(barDirHeader, 0) chunks.push(barDirHeader) const symlinkHeader = Buffer.alloc(512) new Header({ path: 'bar/link.txt', type: 'SymbolicLink', linkpath: '../foo/file.txt', }).encode(symlinkHeader, 0) chunks.push(symlinkHeader) const escapedSymlinkHeader = Buffer.alloc(512) new Header({ path: 'bar/badlink.txt', type: 'SymbolicLink', linkpath: '../../oh/no', }).encode(escapedSymlinkHeader) chunks.push(escapedSymlinkHeader) chunks.push(Buffer.alloc(1024)) return Buffer.concat(chunks) } const dir = t.testdir({ 'test.tar': makeTar(), }) const warnings = [] await extract({ cwd: dir, file: dir + '/test.tar', onwarn: (c, m) => warnings.push([c, m]), }) t.ok(fs.lstatSync(dir + '/foo/file.txt').isFile()) t.ok(fs.lstatSync(dir + '/bar/link.txt').isSymbolicLink()) t.equal(fs.readlinkSync(dir + '/bar/link.txt'), '../foo/file.txt') t.equal(fs.readFileSync(dir + '/bar/link.txt', 'utf8'), 'hello world') t.throws(() => fs.statSync(dir + '/bar/badlink.txt')) t.match(warnings, [ ['TAR_ENTRY_ERROR', 'linkpath escapes extraction directory'], ]) }) t.test('no linking through a symlink', t => { const types = ['Link', 'SymbolicLink'] for (const type of types) { t.test(type, t => { const exploit = makeTar([ { type: 'SymbolicLink', path: 'a/b/up', linkpath: '../..', mode: 0o755, }, { type: 'SymbolicLink', path: 'a/b/escape', linkpath: 'up/..', mode: 0o755, }, { type, path: 'exploit', linkpath: 'a/b/escape/exploited-file', mode: 0o755, }, '', '', ]) const setup = t => t.testdir({ x: {}, 'exploited-file': 'original content', }) const check = t => { fs.writeFileSync(t.testdirName + '/x/exploit', 'pwned') t.equal( fs.readFileSync(t.testdirName + '/exploited-file', 'utf8'), 'original content', ) } t.test('sync', t => { const cwd = setup(t) t.throws( () => { new UnpackSync({ cwd, strict: true }).end(exploit) }, { name: 'SymlinkError', message: /^TAR_SYMLINK_ERROR/, path: /a.b.escape.exploited-file$/, symlink: /a.b.escape$/, }, ) check(t) t.end() }) t.test('async', async t => { const cwd = setup(t) await t.rejects( new Promise( (res, rej) => { new Unpack({ cwd, strict: true }) .on('finish', res) .on('error', rej) .end(exploit) }, { name: 'SymlinkError', message: /^TAR_SYMLINK_ERROR/, path: /a.b.escape.exploited-file$/, symlink: /a.b.escape$/, }, ), ) check(t) }) t.end() }) } t.end() }) t.test('numeric pax/entry name discernment', t => { const numericName = '12345' const alphaName = 'abcde' for (const strict of [true, false]) { t.test('strict=' + strict, t => { for (const paxName of [numericName, alphaName]) { t.test('paxName=' + paxName, t => { for (const entryName of [numericName, alphaName]) { t.test('entryName=' + entryName, t => { const paxHeader = new Pax( { path: paxName, size: '12345\n'.length, }, false, ) const paxData = paxHeader.encode() const data = makeTar([ paxData, { type: 'File', path: entryName, mode: 0o755, ctime: new Date('2000-01-01T00:00:00.000Z'), mtime: new Date('2000-01-01T00:00:00.000Z'), size: '12345\n'.length, }, '12345\n', '', '', ]) t.test('sync', t => { const dir = t.testdir({}) new UnpackSync({ strict, cwd: dir }).end(data) t.equal( readFileSync(dir + '/' + paxName, 'utf8'), '12345\n', ) t.end() }) t.test('async', async t => { const dir = t.testdir({}) await new Promise(r => { new Unpack({ strict, cwd: dir }).on('end', r).end(data) }) t.equal( readFileSync(dir + '/' + paxName, 'utf8'), '12345\n', ) t.end() }) t.end() }) } t.end() }) } t.end() }) t.end() } }) isaacs-node-tar-8a4b548/test/update.js000066400000000000000000000253651523070444600176440ustar00rootroot00000000000000import t from 'tap' import { update as u } from '../dist/esm/update.js' import path, { dirname } from 'path' import fs from 'fs' import mutateFS from 'mutate-fs' import { resolve } from 'path' import { fileURLToPath } from 'url' const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename) const fixtures = path.resolve(__dirname, 'fixtures') const tars = path.resolve(fixtures, 'tars') import zlib from 'zlib' import { spawn } from 'child_process' const data = fs.readFileSync(tars + '/body-byte-counts.tar') const dataNoNulls = data.subarray(0, data.length - 1024) const fixtureDef = { 'body-byte-counts.tar': data, 'no-null-eof.tar': dataNoNulls, 'truncated-head.tar': Buffer.concat([ dataNoNulls, data.subarray(0, 500), ]), 'truncated-body.tar': Buffer.concat([ dataNoNulls, data.subarray(0, 700), ]), 'zero.tar': Buffer.from(''), 'empty.tar': Buffer.alloc(512), 'compressed.tgz': zlib.gzipSync(data), 'compressed.tbr': zlib.brotliCompressSync(data), 'compressed.tzst': zlib.zstdCompressSync(data), } t.test('basic file add to archive (good or truncated)', t => { const check = (file, t) => { const c = spawn('tar', ['tf', file]) const out = [] c.stdout.on('data', chunk => out.push(chunk)) c.on('close', (code, signal) => { t.equal(code, 0) t.equal(signal, null) const actual = Buffer.concat(out).toString().trim().split(/\r?\n/) t.same(actual, [ '1024-bytes.txt', '512-bytes.txt', 'one-byte.txt', 'zero-byte.txt', path.basename(__filename), ]) t.end() }) } const files = [ 'body-byte-counts.tar', 'no-null-eof.tar', 'truncated-head.tar', 'truncated-body.tar', ] const td = files .map(f => [f, fixtureDef[f]]) .reduce((s, [k, v]) => { s[k] = v return s }, {}) const fileList = [path.basename(__filename)] t.test('sync', t => { t.plan(files.length) const dir = t.testdir(td) for (const file of files) { t.test(file, t => { u( { sync: true, file: resolve(dir, file), cwd: __dirname, }, fileList, ) check(resolve(dir, file), t) }) } }) t.test('async cb', t => { t.plan(files.length) const dir = t.testdir(td) for (const file of files) { t.test(file, t => { u( { file: resolve(dir, file), cwd: __dirname, }, fileList, er => { if (er) { throw er } check(resolve(dir, file), t) }, ) }) } }) t.test('async', t => { t.plan(files.length) const dir = t.testdir(td) for (const file of files) { t.test(file, t => { u( { file: resolve(dir, file), cwd: __dirname, }, fileList, ).then(() => { check(resolve(dir, file), t) }) }) } }) t.end() }) t.test('add to empty archive', t => { const check = (file, t) => { const c = spawn('tar', ['tf', file]) const out = [] c.stdout.on('data', chunk => out.push(chunk)) c.on('close', (code, signal) => { t.equal(code, 0) t.equal(signal, null) const actual = Buffer.concat(out).toString().trim().split(/\r?\n/) t.same(actual, [path.basename(__filename)]) t.end() }) } const files = ['empty.tar', 'zero.tar'] const td = files .map(f => [f, fixtureDef[f]]) .reduce((s, [k, v]) => { s[k] = v return s }, {}) files.push('not-existing.tar') t.test('sync', t => { const dir = t.testdir(td) t.plan(files.length) for (const file of files) { t.test(file, t => { u( { sync: true, file: resolve(dir, file), cwd: __dirname, }, [path.basename(__filename)], ) check(resolve(dir, file), t) }) } }) t.test('async cb', t => { const dir = t.testdir(td) t.plan(files.length) for (const file of files) { t.test(file, t => { u( { file: resolve(dir, file), cwd: __dirname, }, [path.basename(__filename)], er => { if (er) { throw er } check(resolve(dir, file), t) }, ) }) } }) t.test('async', async t => { const dir = t.testdir(td) t.plan(files.length) for (const file of files) { t.test(file, t => { u( { file: resolve(dir, file), cwd: __dirname, }, [path.basename(__filename)], ).then(() => { check(resolve(dir, file), t) }) }) } }) t.end() }) t.test('cannot append to gzipped archives', t => { const dir = t.testdir({ 'compressed.tgz': fixtureDef['compressed.tgz'], }) const file = resolve(dir, 'compressed.tgz') const expect = new Error('cannot append to compressed archives') const expectT = new TypeError('cannot append to compressed archives') t.throws( _ => u( { file, cwd: __dirname, gzip: true, }, [path.basename(__filename)], ), expectT, ) t.throws( _ => u( { file, cwd: __dirname, sync: true, }, [path.basename(__filename)], ), expect, ) u( { file, cwd: __dirname, }, [path.basename(__filename)], er => { t.match(er, expect) t.end() }, ) }) t.test('cannot append to brotli archives', t => { const dir = t.testdir({ 'compressed.tbr': fixtureDef['compressed.tbr'], }) const file = resolve(dir, 'compressed.tbr') const expect = new Error('cannot append to compressed archives') const expectT = new TypeError('cannot append to compressed archives') t.throws( _ => u( { file, cwd: __dirname, brotli: true, }, [path.basename(__filename)], ), expectT, ) t.throws( _ => u( { file, cwd: __dirname, sync: true, }, [path.basename(__filename)], ), expect, ) t.end() }) t.test('cannot append to zstd archives', t => { const dir = t.testdir({ 'compressed.tbr': fixtureDef['compressed.tzst'], }) const file = resolve(dir, 'compressed.tzst') const expect = new Error('cannot append to compressed archives') const expectT = new TypeError('cannot append to compressed archives') t.throws( _ => u( { file, cwd: __dirname, zstd: true, }, [path.basename(__filename)], ), expectT, ) t.end() }) t.test('other throws', t => { t.throws(_ => u({}, ['asdf']), new TypeError('file is required')) t.throws( _ => u({ file: 'asdf' }, []), new TypeError('no paths specified to add/replace'), ) t.end() }) t.test('broken open', t => { const dir = t.testdir({ 'body-byte-counts.tar': fixtureDef['body-byte-counts.tar'], }) const file = resolve(dir, 'body-byte-counts.tar') const poop = new Error('poop') t.teardown(mutateFS.fail('open', poop)) t.throws(_ => u({ sync: true, file: file }, ['README.md']), poop) u({ file }, ['README.md'], er => { t.match(er, poop) t.end() }) }) t.test('broken fstat', t => { const td = { 'body-byte-counts.tar': fixtureDef['body-byte-counts.tar'], } const poop = new Error('poop') t.test('sync', t => { const dir = t.testdir(td) const file = resolve(dir, 'body-byte-counts.tar') t.teardown(mutateFS.fail('fstat', poop)) t.throws(_ => u({ sync: true, file }, ['README.md']), poop) t.end() }) t.test('async', t => { const dir = t.testdir(td) const file = resolve(dir, 'body-byte-counts.tar') t.teardown(mutateFS.fail('fstat', poop)) u({ file }, ['README.md'], async er => { t.match(er, poop) t.end() }) }) t.end() }) t.test('broken read', t => { const dir = t.testdir({ 'body-byte-counts.tar': fixtureDef['body-byte-counts.tar'], }) const file = resolve(dir, 'body-byte-counts.tar') const poop = new Error('poop') t.teardown(mutateFS.fail('read', poop)) t.throws(_ => u({ sync: true, file }, ['README.md']), poop) u({ file }, ['README.md'], er => { t.match(er, poop) t.end() }) }) t.test('do not add older file', t => { const dir = t.testdir({ 'body-byte-counts.tar': fixtureDef['body-byte-counts.tar'], '1024-bytes.txt': '.'.repeat(1024), foo: 'foo', }) const file = resolve(dir, 'body-byte-counts.tar') const f = resolve(dir, '1024-bytes.txt') const oldDate = new Date('1997-04-10T16:57:47.000Z') fs.utimesSync(f, oldDate, oldDate) // file size should not change const expect = fixtureDef['body-byte-counts.tar'].length const check = t => { t.equal(fs.statSync(file).size, expect) t.end() } t.test('sync', t => { u( { mtimeCache: new Map(), file, cwd: dir, sync: true, filter: path => path === '1024-bytes.txt', }, ['1024-bytes.txt', 'foo'], ) check(t) }) t.test('async', t => { u({ file, cwd: dir }, ['1024-bytes.txt']).then(_ => check(t)) }) t.test('async cb', t => { u({ file, cwd: dir }, ['1024-bytes.txt'], er => { if (er) { throw er } check(t) }) }) t.end() }) t.test('do add newer file', t => { const setup = t => { const dir = t.testdir({ 'body-byte-counts.tar': fixtureDef['body-byte-counts.tar'], '1024-bytes.txt': '.'.repeat(1024), foo: 'foo', }) const f = resolve(dir, '1024-bytes.txt') const newDate = new Date(Date.now() + 24 * 60 * 60 * 1000) fs.utimesSync(f, newDate, newDate) return dir } // a chunk for the header, then 2 for the body const expect = fixtureDef['body-byte-counts.tar'].length + 512 + 1024 const check = (file, t) => { t.equal(fs.statSync(file).size, expect) t.end() } t.test('sync', t => { const dir = setup(t) const file = resolve(dir, 'body-byte-counts.tar') u( { mtimeCache: new Map(), file, cwd: dir, sync: true, filter: path => path === '1024-bytes.txt', }, ['1024-bytes.txt', 'foo'], ) check(file, t) }) t.test('async', t => { const dir = setup(t) const file = resolve(dir, 'body-byte-counts.tar') u({ file, cwd: dir }, ['1024-bytes.txt']).then(_ => check(file, t)) }) t.test('async cb', t => { const dir = setup(t) const file = resolve(dir, 'body-byte-counts.tar') u({ file, cwd: dir }, ['1024-bytes.txt'], er => { if (er) { throw er } check(file, t) }) }) t.end() }) isaacs-node-tar-8a4b548/test/warn-method.js000066400000000000000000000022341523070444600205750ustar00rootroot00000000000000import t from 'tap' import EE from 'events' import { warnMethod } from '../dist/esm/warn-method.js' class Warner extends EE { warn(code, message, data = {}) { return warnMethod(this, code, message, data) } } const w = new Warner() t.type(w.warn, 'function') const warning = [] w.once('warn', (code, msg, data) => warning.push(code, msg, data)) w.warn('code', 'hello') t.same(warning, ['code', 'hello', { tarCode: 'code', code: 'code' }]) warning.length = 0 w.once('warn', (code, msg, data) => warning.push(code, msg, data)) w.warn('ok', new Error('this is fine'), { foo: 'bar' }) t.match(warning, [ 'ok', 'this is fine', { message: 'this is fine', foo: 'bar', }, ]) w.strict = true t.throws(_ => w.warn('code', 'hello', { data: 123 }), { message: 'hello', data: 123, }) const poop = new Error('poop') t.throws(_ => w.warn('ok', poop), poop) w.file = 'some/file' t.throws(_ => w.warn('ok', 'this is fine'), { file: 'some/file' }) w.cwd = 'some/dir' t.throws(_ => w.warn('ok', 'this is fine'), { cwd: 'some/dir' }) w.strict = false t.throws(_ => w.warn('ok', 'this is fine', { recoverable: false }), { cwd: 'some/dir', recoverable: false, }) isaacs-node-tar-8a4b548/test/winchars.js000066400000000000000000000003531523070444600201660ustar00rootroot00000000000000import t from 'tap' import * as wc from '../dist/esm/winchars.js' t.equal(wc.encode('<>'), '\uf03c\uf03e', 'encode') t.equal(wc.decode(wc.encode('<>')), '<>', 'decode') t.equal(wc.decode(wc.encode('\\|<>?:')), '\\|<>?:', 'all chars') isaacs-node-tar-8a4b548/test/writable-assignment-check.ts000066400000000000000000000006021523070444600234110ustar00rootroot00000000000000import { Unpack } from '../src/unpack.js' import { WriteEntry } from '../src/write-entry.js' import { Parser } from '../src/parse.js' import { fileURLToPath } from 'url' let tester: NodeJS.WritableStream tester = new Parser() tester = new Unpack() tester = new WriteEntry(fileURLToPath(import.meta.url)) tester import { pass } from 'tap' pass(`just making sure TS doesn't complain`) isaacs-node-tar-8a4b548/test/write-entry.js000066400000000000000000001257251523070444600206540ustar00rootroot00000000000000import t from 'tap' import { mkdirp } from 'mkdirp' import fs from 'fs' import { ReadEntry } from '../dist/esm/read-entry.js' import { makeTar } from './fixtures/make-tar.js' import { WriteEntry, WriteEntrySync, WriteEntryTar, } from '../dist/esm/write-entry.js' import path, { dirname } from 'path' import { Header } from '../dist/esm/header.js' import mutateFS from 'mutate-fs' import { Parser } from '../dist/esm/parse.js' import { rimraf } from 'rimraf' import { normalizeWindowsPath as normPath } from '../dist/esm/normalize-windows-path.js' import { fileURLToPath } from 'url' import { chmodrSync } from 'chmodr' const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename) // make our tests verify that windows link targets get turned into / paths const { readlink, readlinkSync } = fs fs.readlink = (path, cb) => { readlink(path, (er, path) => { if (er) { return cb(er) } else { cb(null, path.replace(/\//g, '\\')) } }) } fs.readlinkSync = path => readlinkSync(path).replace(/\//g, '\\') const fixtures = path.resolve(__dirname, 'fixtures') const files = path.resolve(fixtures, 'files') process.env.USER = 'isaacs' const isWindows = process.platform === 'win32' t.test('set up', t => { const one = fs.statSync(files + '/hardlink-1') const two = fs.statSync(files + '/hardlink-2') if (one.dev !== two.dev || one.ino !== two.ino) { fs.unlinkSync(files + '/hardlink-2') fs.linkSync(files + '/hardlink-1', files + '/hardlink-2') } chmodrSync(files, isWindows ? 0o666 : 0o644) t.end() }) t.test('100 byte filename', t => { // do this one twice, so we have it with and without cache let statCache = null let linkCache = null t.plan(2) const runTest = t => { const f = '100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' let entryInOWE = undefined const ws = new WriteEntry(f, { cwd: files, linkCache: linkCache, statCache: statCache, onWriteEntry: self => { entryInOWE = self t.equal(self.path, f) t.equal(self.header, undefined) }, }) let out = [] ws.on('data', c => out.push(c)) ws.on('end', _ => { out = Buffer.concat(out) t.equal(entryInOWE, ws) t.match(ws, { header: { cksumValid: true, needPax: false, path: '100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', mode: isWindows ? 0o666 : 0o644, size: 100, linkpath: null, uname: 'isaacs', gname: null, devmaj: 0, devmin: 0, }, }) const wss = new WriteEntrySync(f, { cwd: files, linkCache: linkCache, statCache: statCache, }) linkCache = ws.linkCache statCache = ws.statCache t.equal( out.slice(512).toString('hex'), wss.read().subarray(512).toString('hex'), ) t.equal(out.length, 1024) t.equal(out.slice(0, 100).toString(), f) const h = new Header(out.slice(0, 512)) t.match(h, { cksumValid: true, needPax: false, path: '100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', mode: isWindows ? 0o666 : 0o644, size: 100, linkpath: '', uname: 'isaacs', gname: '', devmaj: 0, devmin: 0, }) t.equal( out.slice(512).toString('hex'), '6363636363636363636363636363636363636363636363636363636363636363' + '6363636363636363636363636363636363636363636363636363636363636363' + '6363636363636363636363636363636363636363636363636363636363636363' + '6363636300000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000', ) t.end() }) } t.test('uncached', runTest) t.test('cached', runTest) }) t.test('directory', t => { const ws = new WriteEntry('dir', { cwd: files, }) let out = [] ws.on('data', c => out.push(c)) ws.on('end', _ => { out = Buffer.concat(out) t.match(ws.header, { cksumValid: true, needPax: false, path: 'dir/', mode: isWindows ? 0o777 : 0o755, size: 0, linkpath: null, uname: 'isaacs', gname: null, devmaj: 0, devmin: 0, }) t.equal(out.length, 512) const wss = new WriteEntrySync('dir', { cwd: files }) t.equal(wss.read().length, 512) t.match(wss.header, { cksumValid: true, needPax: false, path: 'dir/', mode: isWindows ? 0o777 : 0o755, size: 0, linkpath: null, uname: 'isaacs', gname: null, devmaj: 0, devmin: 0, }) t.end() }) }) t.test('empty path for cwd', t => { const ws = new WriteEntry('') let out = [] ws.on('data', c => out.push(c)) ws.on('end', _ => { out = Buffer.concat(out) t.match(ws.header, { cksumValid: true, needPax: false, path: './', mode: isWindows ? 0o777 : fs.statSync('./').mode & 0o7777, size: 0, linkpath: null, uname: 'isaacs', gname: null, devmaj: 0, devmin: 0, }) t.end() }) }) t.test( 'symlink', { skip: isWindows && 'symlinks not fully supported', }, t => { const ws = new WriteEntry('symlink', { cwd: files }) let out = [] ws.on('data', c => out.push(c)) const header = { cksumValid: true, needPax: false, path: 'symlink', size: 0, linkpath: 'hardlink-2', uname: 'isaacs', gname: null, devmaj: 0, devmin: 0, } const wss = new WriteEntrySync('symlink', { cwd: files }) t.match(wss.header, header) ws.on('end', _ => { out = Buffer.concat(out) t.equal(out.length, 512) t.match(ws.header, header) t.end() }) }, ) t.test('zero-byte file', t => { const ws = new WriteEntry('files/zero-byte.txt', { cwd: fixtures }) let out = [] ws.on('data', c => out.push(c)) ws.on('end', _ => { out = Buffer.concat(out) t.equal(out.length, 512) t.match(ws.header, { path: 'files/zero-byte.txt', cksumValid: true, needPax: false, mode: isWindows ? 0o666 : 0o644, size: 0, linkpath: null, uname: 'isaacs', gname: null, devmaj: 0, devmin: 0, }) t.end() }) }) t.test('zero-byte file, but close fails', t => { const poop = new Error('poop') t.teardown(mutateFS.fail('close', poop)) const ws = new WriteEntry('files/1024-bytes.txt', { cwd: fixtures }) ws.on('end', _ => t.fail('should not get an end, because the close fails'), ) ws.on('error', er => { t.match(er, { message: 'poop' }) t.end() }) ws.resume() }) t.test('hardlinks', t => { const wss = new WriteEntrySync('hardlink-1', { cwd: files, }) const ws = new WriteEntry('files/hardlink-2', { cwd: fixtures, linkCache: wss.linkCache, }) let out = [] ws.on('data', c => out.push(c)) ws.on('end', _ => { out = Buffer.concat(out) t.equal(out.length, 512) t.match(ws.header, { type: 'Link', path: 'files/hardlink-2', cksumValid: true, needPax: false, mode: isWindows ? 0o666 : 0o644, size: 0, linkpath: 'files/hardlink-1', uname: 'isaacs', gname: null, devmaj: 0, devmin: 0, }) t.end() }) }) t.test('hardlinks far away', t => { const h1 = 'hardlink-1' const f = path.resolve(files, h1) const stat = fs.statSync(f) const linkCache = new Map([[stat.dev + ':' + stat.ino, '/a/b/c/d/e']]) const ws = new WriteEntry('files/hardlink-2', { cwd: fixtures, linkCache: linkCache, }) let out = [] ws.on('data', c => out.push(c)) ws.on('end', _ => { out = Buffer.concat(out) t.equal(out.length, 1024) t.match(ws.header, { path: 'files/hardlink-2', cksumValid: true, needPax: false, mode: isWindows ? 0o666 : 0o644, size: 26, linkpath: null, uname: 'isaacs', gname: null, devmaj: 0, devmin: 0, }) t.end() }) }) t.test('really deep path', t => { const f = 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' const ws = new WriteEntry(f, { cwd: files }) let out = [] ws.on('data', c => out.push(c)) ws.on('end', _ => { out = Buffer.concat(out) t.match(ws.header, { cksumValid: true, needPax: true, path: 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', mode: isWindows ? 0o666 : 0o644, size: 100, linkpath: null, uname: 'isaacs', gname: null, devmaj: 0, devmin: 0, }) t.equal(out.length, 2048) t.end() }) }) t.test('no pax', t => { const f = 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' const ws = new WriteEntry(f, { cwd: files, noPax: true }) let out = [] ws.on('data', c => out.push(c)) ws.on('end', _ => { out = Buffer.concat(out) t.match(ws.header, { cksumValid: true, needPax: true, path: 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', mode: isWindows ? 0o666 : 0o644, size: 100, linkpath: null, uname: 'isaacs', gname: null, devmaj: 0, devmin: 0, }) t.equal(out.length, 1024) t.end() }) }) t.test('nonexistent file', t => { const f = path.resolve(files, 'does not exist') const ws = new WriteEntry('does not exist', { cwd: files }) ws.on('error', er => { t.match(er, { message: "ENOENT: no such file or directory, lstat '" + f + "'", code: 'ENOENT', path: f, syscall: 'lstat', }) t.end() }) }) t.test('absolute path', t => { const absolute = path.resolve(files, '512-bytes.txt') const { root } = path.parse(absolute) const f = root + root + root + absolute const warn = normPath(isWindows ? root : root + root + root + root) t.test('preservePaths=false strict=false warn=' + warn, t => { const warnings = [] // on windows, c:\c:\c:\... is a valid path, so just use the // single-root absolute version of it. const ws = new WriteEntry(isWindows ? absolute : f, { cwd: files, onwarn: (c, m, p) => warnings.push([c, m, p]), }) let out = [] ws.on('data', c => out.push(c)) ws.on('end', _ => { out = Buffer.concat(out) t.equal(out.length, 1024) t.match(warnings, [ [ 'TAR_ENTRY_INFO', `stripping ${warn} from absolute path`, { path: normPath(isWindows ? absolute : f) }, ], ]) t.match(ws.header, { cksumValid: true, needPax: false, path: normPath(absolute.replace(/^(\/|[a-z]:[/\\])*/i, '')), mode: isWindows ? 0o666 : 0o644, size: 512, linkpath: null, uname: 'isaacs', gname: null, devmaj: 0, devmin: 0, }) t.end() }) }) t.test('preservePaths=true', t => { t.plan(2) // with preservePaths, strictness doesn't matter ;[true, false].forEach(strict => { t.test('strict=' + strict, t => { const warnings = [] const ws = new WriteEntry(isWindows ? absolute : f, { cwd: files, strict: strict, preservePaths: true, onwarn: (c, m, p) => warnings.push([c, m, p]), }) let out = [] ws.on('data', c => out.push(c)) ws.on('end', _ => { out = Buffer.concat(out) t.equal(warnings.length, 0) t.match(ws.header, { cksumValid: true, needPax: false, path: normPath(isWindows ? absolute : f), mode: isWindows ? 0o666 : 0o644, size: 512, linkpath: null, uname: 'isaacs', gname: null, devmaj: 0, devmin: 0, }) t.end() }) }) }) }) t.test('preservePaths=false strict=true', t => { t.throws( _ => { new WriteEntry(isWindows ? absolute : f, { strict: true, cwd: files, }) }, { message: /stripping .* from absolute path/, path: normPath(isWindows ? absolute : f), }, ) t.end() }) t.end() }) t.throws(() => new WriteEntry(null), TypeError) t.test('no user environ, sets uname to empty string', t => { delete process.env.USER const ws = new WriteEntry('512-bytes.txt', { cwd: files }) let out = [] ws.on('data', c => out.push(c)) ws.on('end', _ => { out = Buffer.concat(out) t.equal(out.length, 1024) t.match(ws.header, { cksumValid: true, needPax: false, path: '512-bytes.txt', mode: isWindows ? 0o666 : 0o644, size: 512, uname: '', linkpath: null, gname: null, devmaj: 0, devmin: 0, }) t.end() }) }) t.test( 'an unsuppored type', { skip: isWindows && '/dev/random on windows', }, t => { const ws = new WriteEntry('/dev/random', { preservePaths: true }) ws.on('data', _chunk => { throw new Error('should not get data from random') }) ws.on('stat', stat => { t.match(stat, { dev: Number, mode: 0o020666, nlink: 1, rdev: Number, blksize: Number, ino: Number, size: 0, blocks: 0, }) t.ok(stat.isCharacterDevice(), 'random is a character device') }) ws.on('end', _ => { t.match(ws, { type: 'Unsupported', path: '/dev/random' }) t.end() }) }, ) t.test('readlink fail', t => { const expect = { syscall: 'readlink', path: String, } // pretend everything is a symbolic link, then read something that isn't t.teardown(mutateFS.statType('SymbolicLink')) t.throws(_ => { return new WriteEntrySync('write-entry.js', { cwd: __dirname }) }, expect) new WriteEntry('write-entry.js', { cwd: __dirname }).on('error', er => { t.match(er, expect) t.equal(normPath(er.path), normPath(__filename)) t.end() }) }) t.test('open fail', t => { t.teardown(mutateFS.fail('open', new Error('pwn'))) t.throws(_ => new WriteEntrySync('write-entry.js', { cwd: __dirname }), { message: 'pwn', }) new WriteEntry('write-entry.js', { cwd: __dirname }).on('error', er => { t.match(er, { message: 'pwn' }) t.end() }) }) t.test('read fail', t => { const expect = { message: 'EISDIR: illegal operation on a directory, read', code: 'EISDIR', syscall: 'read', } // pretend everything is a file, then read something that isn't t.teardown( mutateFS.statMutate((er, st) => { if (er) { return [er, st] } st.isFile = () => true st.size = 123 }), ) t.throws( _ => new WriteEntrySync('fixtures', { cwd: __dirname, }), expect, ) new WriteEntry('fixtures', { cwd: __dirname }).on('error', er => { t.match(er, expect) t.end() }) }) t.test('read invalid EOF', t => { t.teardown(mutateFS.mutate('read', (er, _bytesRead) => [er, 0])) const expect = { message: 'encountered unexpected EOF', path: normPath(__filename), syscall: 'read', code: 'EOF', } t.throws( _ => new WriteEntrySync('write-entry.js', { cwd: __dirname }), expect, ) new WriteEntry('write-entry.js', { cwd: __dirname }).on('error', er => { t.match(er, expect) t.end() }) }) t.test('read overflow expectation', t => { t.teardown( mutateFS.statMutate((_er, st) => { if (st) { st.size = 3 } }), ) const f = '512-bytes.txt' const expect = { message: 'did not encounter expected EOF', path: normPath(path.resolve(files, f)), syscall: 'read', code: 'EOF', } t.plan(2) t.throws( _ => new WriteEntrySync(f, { cwd: files, maxReadSize: 2 }), expect, ) new WriteEntry(f, { cwd: files, maxReadSize: 2 }) .on('error', er => { t.match(er, expect) }) .resume() }) t.test('short reads', t => { t.teardown(mutateFS.zenoRead()) const cases = { '1024-bytes.txt': new Array(1024).join('x') + '\n', '100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': new Array(101).join('c'), } const maxReadSize = [null, 1024, 100, 111] Object.keys(cases).forEach(filename => { t.test(filename.split('byte').shift() + 'byte', t => { const contents = cases[filename] maxReadSize.forEach(mRS => { t.test('maxReadSize=' + mRS, t => { let out = [] const ws = new WriteEntry(filename, { maxReadSize: mRS, cwd: files, }) ws.on('data', c => out.push(c)) ws.on('end', _ => { out = Buffer.concat(out) t.equal(out.length, 512 * Math.ceil(1 + contents.length / 512)) t.equal( out.slice(512).toString().replace(/\0.*$/, ''), contents, ) const wss = new WriteEntrySync(filename, { cwd: files }) const syncOut = wss.read() t.equal(syncOut.length, out.length) t.equal( syncOut.subarray(512).toString(), out.slice(512).toString(), ) t.end() }) }) }) t.end() }) }) t.end() }) t.test( 'win32 path conversion', { skip: isWindows && 'no need to test on windows', }, t => { const ws = new WriteEntry('long-path\\r', { cwd: files, win32: true, }) t.equal(ws.path, 'long-path/r') t.end() }, ) t.test( 'win32 <|>? in paths', { skip: isWindows && 'do not create annoying junk on windows systems', }, t => { const file = path.resolve(fixtures, '<|>?.txt') const uglyName = Buffer.from( 'ef80bcef81bcef80beef80bf2e747874', 'hex', ).toString() const ugly = path.resolve(fixtures, uglyName) t.teardown(_ => { rimraf.sync(file) rimraf.sync(ugly) }) fs.writeFileSync(ugly, '<|>?') const wc = new WriteEntry(uglyName, { cwd: fixtures, win32: true, }) const out = [] wc.on('data', c => out.push(c)) wc.on('end', _ => { const data = Buffer.concat(out).toString() t.equal(data.slice(0, 4), '<|>?') t.end() }) t.equal(wc.path, '<|>?.txt') t.equal(wc.absolute, ugly) }, ) t.test('uid doesnt match, dont set uname', t => { t.teardown( mutateFS.statMutate((_er, st) => { if (st) { st.uid -= 1 } }), ) const ws = new WriteEntry('long-path/r', { cwd: files, }) t.notOk(ws.uname) t.end() }) t.test('override absolute to some other file', t => { const ws = new WriteEntry('blerg', { absolute: files + '/one-byte.txt', }) const out = [] ws.on('data', c => out.push(c)) ws.on('end', _ => { const data = Buffer.concat(out) t.equal(data.length, 1024) t.match(data.subarray(512).toString(), /^a\0{511}$/) t.match(ws, { path: 'blerg', header: { size: 1 }, }) const wss = new WriteEntrySync('blerg', { absolute: files + '/one-byte.txt', }) const sdata = wss.read() t.equal(sdata.length, 1024) t.match(sdata.subarray(512).toString(), /^a\0{511}$/) t.match(wss, { path: 'blerg', header: { size: 1 }, }) t.end() }) }) t.test('portable entries, nothing platform-specific', t => { const om = 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt' const ws = new WriteEntry(om, { cwd: files, portable: true, }) const pexpect = { atime: null, charset: null, comment: null, ctime: null, gid: null, gname: null, linkpath: null, path: 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', size: 2, uid: null, uname: null, dev: null, ino: null, nlink: null, } const hexpect = { size: 2, ctime: null, atime: null, uid: null, uname: '', gid: null, gname: '', } const ps = new Parser() const wss = new WriteEntrySync(om, { cwd: files, portable: true, }) ps.on('entry', entry => { t.match(entry.extended, pexpect) t.match(entry.header, hexpect) }) ps.end(wss.read()) const p = new Parser() ws.pipe(p) p.on('entry', entry => { t.match(entry.extended, pexpect) t.match(entry.header, hexpect) t.end() }) }) t.test('no mtime', t => { const om = 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt' const ws = new WriteEntry(om, { cwd: files, noMtime: true, portable: true, }) const pexpect = { atime: null, mtime: null, charset: null, comment: null, ctime: null, gid: null, gname: null, linkpath: null, path: 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', size: 2, uid: null, uname: null, dev: null, ino: null, nlink: null, } const hexpect = { size: 2, ctime: null, atime: null, mtime: null, uid: null, uname: '', gid: null, gname: '', } const ps = new Parser() const wss = new WriteEntrySync(om, { cwd: files, portable: true, noMtime: true, }) ps.on('entry', entry => { t.match(entry.extended, pexpect) t.match(entry.header, hexpect) }) ps.end(wss.read()) const p = new Parser() ws.pipe(p) p.on('entry', entry => { t.match(entry.extended, pexpect) t.match(entry.header, hexpect) t.end() }) }) t.test('force mtime', t => { const om = 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt' const date = new Date('1979-07-01T19:10:00.000Z') const ws = new WriteEntry(om, { cwd: files, mtime: date, portable: true, }) const pexpect = { atime: null, mtime: new Date('1979-07-01T19:10:00.000Z'), charset: null, comment: null, ctime: null, gid: null, gname: null, linkpath: null, path: 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', size: 2, uid: null, uname: null, dev: null, ino: null, nlink: null, } const hexpect = { size: 2, ctime: null, atime: null, mtime: new Date('1979-07-01T19:10:00.000Z'), uid: null, uname: '', gid: null, gname: '', } const ps = new Parser() const wss = new WriteEntrySync(om, { cwd: files, portable: true, mtime: new Date('1979-07-01T19:10:00.000Z'), }) ps.on('entry', entry => { t.match(entry.extended, pexpect) t.match(entry.header, hexpect) }) ps.end(wss.read()) const p = new Parser() ws.pipe(p) p.on('entry', entry => { t.match(entry.extended, pexpect) t.match(entry.header, hexpect) t.end() }) }) t.test('portable dir entries, no mtime', t => { const dir = 'long-path/' const ws = new WriteEntry(dir, { cwd: files, portable: true, }) const hexpect = { path: 'long-path/', ctime: null, atime: null, uid: null, uname: '', gid: null, gname: '', mtime: null, } const ps = new Parser() const wss = new WriteEntrySync(dir, { cwd: files, portable: true, }) ps.on('entry', entry => { t.match(entry.header, hexpect) }) ps.end(wss.read()) const p = new Parser() ws.pipe(p) p.on('entry', entry => { t.match(entry.header, hexpect) t.end() }) }) t.test('writing more data than is appropriate', t => { const path = t.testdir({ file: 'hello', }) const wss = new WriteEntry(`${path}/file`) wss.on('error', er => { t.match(er, { message: 'writing more data than expected', }) t.end() }) wss.on('stat', () => wss.write(Buffer.from('some more stuff'))) }) t.test('write entry from read entry', t => { const data = makeTar([ { path: '$', type: 'File', size: 10, mode: isWindows ? 0o777 : 0o755, uid: 123, gid: 321, ctime: new Date('1979-07-01'), atime: new Date('1980-08-17'), }, '$$$$$$$$$$', { path: 'blep', type: 'SymbolicLink', linkpath: 'xyz', }, '', '', ]) t.test('basic file', t => { const fileEntry = new ReadEntry(new Header(data)) const wetFile = new WriteEntryTar(fileEntry) const out = [] let wetFileEnded = false wetFile.on('data', c => out.push(c)) wetFile.on('end', _ => (wetFileEnded = true)) fileEntry.write(data.subarray(512, 550)) fileEntry.write(data.subarray(550, 1000)) fileEntry.end(data.subarray(1000, 1024)) t.equal(wetFileEnded, true) const result = Buffer.concat(out) t.equal(result.length, 1024) t.equal(result.toString().replace(/\0.*$/, ''), '$') const body = result.subarray(512).toString().replace(/\0*$/, '') t.equal(body, '$$$$$$$$$$') t.end() }) t.test('basic file', t => { const data = makeTar([ { path: '$', type: 'Directory', size: 0, mode: isWindows ? 0o777 : 0o755, uid: 123, gid: 321, ctime: new Date('1979-07-01'), atime: new Date('1980-08-17'), mtime: new Date('1997-06-21'), }, '', '', ]) const fileEntry = new ReadEntry(new Header(data)) let entryInOWE = undefined const wetFile = new WriteEntryTar(fileEntry, { portable: true, onWriteEntry: self => { entryInOWE = self t.equal(self.path, '$') t.equal(self.header, undefined) }, }) const out = [] let wetFileEnded = false wetFile.on('data', c => out.push(c)) wetFile.on('end', () => { wetFileEnded = true t.equal(entryInOWE, wetFile) }) fileEntry.end() t.equal(wetFileEnded, true) const result = Buffer.concat(out) t.match(new Header(result), { mtime: null }) t.end() }) t.test('with pax header', t => { const fileEntryPax = new ReadEntry(new Header(data)) fileEntryPax.path = new Array(200).join('$') const wetPax = new WriteEntryTar(fileEntryPax) let wetPaxEnded = false const out = [] wetPax.on('data', c => out.push(c)) wetPax.on('end', _ => (wetPaxEnded = true)) fileEntryPax.write(data.subarray(512, 550)) fileEntryPax.write(data.subarray(550, 1000)) fileEntryPax.end(data.subarray(1000, 1024)) t.equal(wetPaxEnded, true) const result = Buffer.concat(out) t.equal(result.length, 2048) t.match(result.subarray(1024, 1124).toString(), /^\$+\0?$/) const body = result.subarray(1536).toString().replace(/\0*$/, '') t.match(new Header(result), { type: 'ExtendedHeader' }) t.equal(body, '$$$$$$$$$$') t.end() }) t.test('pax and portable', t => { const fileEntryPax = new ReadEntry(new Header(data)) fileEntryPax.path = new Array(200).join('$') const wetPax = new WriteEntryTar(fileEntryPax, { portable: true, }) let wetPaxEnded = false const out = [] wetPax.on('data', c => out.push(c)) wetPax.on('end', _ => (wetPaxEnded = true)) fileEntryPax.write(data.subarray(512, 550)) fileEntryPax.write(data.subarray(550, 1000)) fileEntryPax.end(data.subarray(1000, 1024)) t.equal(wetPaxEnded, true) const result = Buffer.concat(out) t.equal(result.length, 2048) t.match(result.subarray(1024, 1124).toString(), /^\$+\0?$/) t.match(new Header(result), { type: 'ExtendedHeader' }) t.match(new Header(result.subarray(1024)), { ctime: null, atime: null, uname: '', gname: '', }) const body = result.subarray(1536).toString().replace(/\0*$/, '') t.equal(body, '$$$$$$$$$$') t.end() }) t.test('pax, portable, and noMtime', t => { const fileEntryPax = new ReadEntry(new Header(data)) fileEntryPax.path = new Array(200).join('$') const wetPax = new WriteEntryTar(fileEntryPax, { noMtime: true, portable: true, }) let wetPaxEnded = false const out = [] wetPax.on('data', c => out.push(c)) wetPax.on('end', _ => (wetPaxEnded = true)) fileEntryPax.write(data.subarray(512, 550)) fileEntryPax.write(data.subarray(550, 1000)) fileEntryPax.end(data.subarray(1000, 1024)) t.equal(wetPaxEnded, true) const result = Buffer.concat(out) t.equal(result.length, 2048) t.match(result.subarray(1024, 1124).toString(), /^\$+\0?$/) t.match(new Header(result), { type: 'ExtendedHeader' }) t.match(new Header(result.subarray(1024)), { mtime: null, ctime: null, atime: null, uname: '', gname: '', }) const body = result.subarray(1536).toString().replace(/\0*$/, '') t.equal(body, '$$$$$$$$$$') t.end() }) t.test('abs path', t => { const fileEntry = new ReadEntry(new Header(data)) fileEntry.path = '/a/b/c' t.test('warn', t => { const warnings = [] new WriteEntryTar(fileEntry, { onwarn: (code, msg, data) => warnings.push(code, msg, data), }) t.match(warnings, [ 'TAR_ENTRY_INFO', 'stripping / from absolute path', { path: '/a/b/c', }, ]) t.end() }) t.test('preserve', t => { const warnings = [] new WriteEntryTar(fileEntry, { onwarn: (code, msg, data) => warnings.push(code, msg, data), preservePaths: true, }) t.same(warnings, []) t.end() }) t.test('throw', t => { t.throws( _ => new WriteEntryTar(fileEntry, { strict: true, }), ) t.end() }) t.end() }) t.test('no block remain', t => { const readEntry = new ReadEntry( new Header({ size: 512, type: 'File', path: 'x', }), ) const wet = new WriteEntryTar(readEntry) const out = [] wet.on('data', c => out.push(c)) let wetEnded = false wet.on('end', _ => (wetEnded = true)) t.equal(wetEnded, false) readEntry.end(Buffer.from(new Array(513).join('@'))) t.equal(wetEnded, true) const res = Buffer.concat(out) t.equal(res.length, 1024) t.match(res.subarray(512).toString(), /^@+$/) t.end() }) t.test('write more than appropriate', t => { const readEntry = new ReadEntry( new Header({ path: 'x', type: 'File', size: '1', }), ) const wet = new WriteEntryTar(readEntry) t.throws(_ => wet.write(Buffer.from(new Array(1024).join('x')))) t.end() }) t.end() }) // https://github.com/npm/node-tar/issues/284 t.test('prefix and hard links', t => { const dir = path.resolve(fixtures, 'writeentry-prefix-hardlinks') rimraf.sync(dir) t.teardown(_ => rimraf.sync(dir)) mkdirp.sync(dir + '/in/z/b/c') fs.writeFileSync(dir + '/in/target', 'ddd') fs.linkSync(dir + '/in/target', dir + '/in/z/b/c/d') fs.linkSync(dir + '/in/target', dir + '/in/z/b/d') fs.linkSync(dir + '/in/target', dir + '/in/z/d') fs.linkSync(dir + '/in/target', dir + '/in/y') const long = 'y'.repeat(250) fs.linkSync(dir + '/in/target', dir + '/in/' + long) const expect = [ { type: 'Directory', path: 'out/x/', }, { type: 'File', size: 3, path: 'out/x/target', }, 'ddd\0', { path: 'out/x/y', type: 'Link', linkpath: 'out/x/target', }, { path: 'PaxHeader/yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', type: 'ExtendedHeader', }, new RegExp( '^266 path=out.x.' + long + '[\\w\\W]*linkpath=out.x.target', ), { path: 'out/x/yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', type: 'Link', linkpath: 'out/x/target', }, { type: 'Directory', path: 'out/x/z/', }, { type: 'Directory', path: 'out/x/z/b/', }, { path: 'out/x/z/d', type: 'Link', linkpath: 'out/x/target', }, { type: 'Directory', path: 'out/x/z/b/c/', }, { path: 'out/x/z/b/d', type: 'Link', linkpath: 'out/x/target', }, { path: 'out/x/z/b/c/d', type: 'Link', linkpath: 'out/x/target', }, ] const check = (out, t) => { const data = Buffer.concat(out) expect.forEach((e, i) => { if (typeof e === 'string') { t.equal(data.subarray(i * 512, i * 512 + e.length).toString(), e) } else if (e instanceof RegExp) { t.match(data.subarray(i * 512, (i + 1) * 512).toString(), e) } else { t.match(new Header(data.subarray(i * 512, (i + 1) * 512)), e) } }) } const runTest = async (t, path, Class) => { const linkCache = new Map() const statCache = new Map() const opt = { cwd: dir + '/in', prefix: 'out/x', noDirRecurse: true, linkCache, statCache, } const out = [] const entry = path => new Promise(resolve => { const p = new Class(path, opt) p.on('end', resolve) p.on('data', d => out.push(d)) }) await entry(path) if (path === '.') { path = './' } await entry(`${path}target`) await entry(`${path}y`) await entry(`${path}${long}`) await entry(`${path}z`) await entry(`${path}z/b`) await entry(`${path}z/d`) await entry(`${path}z/b/c`) await entry(`${path}z/b/d`) await entry(`${path}z/b/c/d`) check(out, t) } t.test('async', t => { t.test('.', t => runTest(t, '.', WriteEntry)) return t.test('./', t => runTest(t, './', WriteEntry)) }) t.test('sync', t => { t.test('.', t => runTest(t, '.', WriteEntrySync)) return t.test('./', t => runTest(t, './', WriteEntrySync)) }) t.end() }) t.test('prefix and hard links from tar entries', t => { const long = 'y'.repeat(250) const expect = [ { type: 'Directory', path: 'out/x/', }, { type: 'File', size: 3, path: 'out/x/target', }, 'ddd\0', { path: 'out/x/y', type: 'Link', linkpath: 'out/x/target', }, { path: 'PaxHeader/yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', type: 'ExtendedHeader', }, new RegExp( '^266 path=out.x.' + long + '[\\w\\W]*linkpath=out.x.target', ), { path: 'out/x/yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', type: 'Link', linkpath: 'out/x/target', }, { type: 'Directory', path: 'out/x/z/', }, { type: 'Directory', path: 'out/x/z/b/', }, { path: 'out/x/z/d', type: 'Link', linkpath: 'out/x/target', }, { type: 'Directory', path: 'out/x/z/b/c/', }, { path: 'out/x/z/b/d', type: 'Link', linkpath: 'out/x/target', }, { path: 'out/x/z/b/c/d', type: 'Link', linkpath: 'out/x/target', }, ] const data = makeTar([ { type: 'Directory', path: './', }, { type: 'File', size: 3, path: 'target', }, 'ddd\0', { path: 'y', type: 'Link', linkpath: 'target', }, { path: 'PaxHeader/yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', type: 'ExtendedHeader', size: ('260 path=' + long + '\n19 linkpath=target\n').length, }, '260 path=' + long + '\n19 linkpath=target\n', { path: 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', type: 'Link', linkpath: 'target', }, { type: 'Directory', path: 'z/', }, { type: 'Directory', path: 'z/b/', }, { path: 'z/d', type: 'Link', linkpath: 'target', }, { type: 'Directory', path: 'z/b/c/', }, { path: 'z/b/d', type: 'Link', linkpath: 'target', }, { path: 'z/b/c/d', type: 'Link', linkpath: 'target', }, '', '', ]) const check = (out, t) => { const data = Buffer.concat(out) expect.forEach((e, i) => { if (typeof e === 'string') { t.equal(data.subarray(i * 512, i * 512 + e.length).toString(), e) } else if (e instanceof RegExp) { t.match(data.subarray(i * 512, (i + 1) * 512).toString(), e) } else { t.match(new Header(data.subarray(i * 512, (i + 1) * 512)), e) } }) } const runTest = async (t, _path) => { const linkCache = new Map() const statCache = new Map() const opt = { prefix: 'out/x', noDirRecurse: true, linkCache, statCache, } const out = [] const parser = new Parser({ strict: true, onReadEntry: readEntry => { const p = new WriteEntryTar(readEntry, opt) p.on('data', d => out.push(d)) }, }) parser.on('end', () => check(out, t)) parser.end(data) } t.test('.', t => runTest(t, '.')) t.test('./', t => runTest(t, './')) t.end() }) t.test('hard links and no prefix', t => { const dir = path.resolve(fixtures, 'writeentry-prefix-hardlinks') t.teardown(_ => rimraf.sync(dir)) mkdirp.sync(dir + '/in/z/b/c') fs.writeFileSync(dir + '/in/target', 'ddd') fs.linkSync(dir + '/in/target', dir + '/in/z/b/c/d') fs.linkSync(dir + '/in/target', dir + '/in/z/b/d') fs.linkSync(dir + '/in/target', dir + '/in/z/d') fs.linkSync(dir + '/in/target', dir + '/in/y') const expect = [ { type: 'Directory', path: './', }, { type: 'File', size: 3, path: 'target', }, 'ddd\0', { path: 'y', type: 'Link', linkpath: 'target', }, { type: 'Directory', path: 'z/', }, { type: 'Directory', path: 'z/b/', }, { path: 'z/d', type: 'Link', linkpath: 'target', }, { type: 'Directory', path: 'z/b/c/', }, { path: 'z/b/d', type: 'Link', linkpath: 'target', }, { path: 'z/b/c/d', type: 'Link', linkpath: 'target', }, ] const check = (out, t) => { const data = Buffer.concat(out) expect.forEach((e, i) => { if (typeof e === 'string') { t.equal(data.subarray(i * 512, i * 512 + e.length).toString(), e) } else { t.match(new Header(data.subarray(i * 512, (i + 1) * 512)), e) } }) } const runTest = async (t, path, Class) => { const linkCache = new Map() const statCache = new Map() const opt = { cwd: dir + '/in', linkCache, statCache, } const out = [] const entry = path => new Promise(resolve => { const p = new Class(path, opt) p.on('end', resolve) p.on('data', d => out.push(d)) }) await entry(path) if (path === '.') { path = './' } await entry(`${path}target`) await entry(`${path}y`) await entry(`${path}z`) await entry(`${path}z/b`) await entry(`${path}z/d`) await entry(`${path}z/b/c`) await entry(`${path}z/b/d`) await entry(`${path}z/b/c/d`) check(out, t) } t.test('async', t => { t.test('.', t => runTest(t, '.', WriteEntry)) return t.test('./', t => runTest(t, './', WriteEntry)) }) t.test('sync', t => { t.test('.', t => runTest(t, '.', WriteEntrySync)) return t.test('./', t => runTest(t, './', WriteEntrySync)) }) t.end() }) t.test('hard links from tar entries and no prefix', t => { const expect = [ { type: 'Directory', path: './', }, { type: 'File', size: 3, path: 'target', }, 'ddd\0', { path: 'y', type: 'Link', linkpath: 'target', }, { type: 'Directory', path: 'z/', }, { type: 'Directory', path: 'z/b/', }, { path: 'z/d', type: 'Link', linkpath: 'target', }, { type: 'Directory', path: 'z/b/c/', }, { path: 'z/b/d', type: 'Link', linkpath: 'target', }, { path: 'z/b/c/d', type: 'Link', linkpath: 'target', }, ] const data = makeTar([ { type: 'Directory', path: './', }, { type: 'File', size: 3, path: 'target', }, 'ddd\0', { path: 'y', type: 'Link', linkpath: 'target', }, { type: 'Directory', path: 'z/', }, { type: 'Directory', path: 'z/b/', }, { path: 'z/d', type: 'Link', linkpath: 'target', }, { type: 'Directory', path: 'z/b/c/', }, { path: 'z/b/d', type: 'Link', linkpath: 'target', }, { path: 'z/b/c/d', type: 'Link', linkpath: 'target', }, ]) const check = (out, t) => { const data = Buffer.concat(out) expect.forEach((e, i) => { if (typeof e === 'string') { t.equal(data.subarray(i * 512, i * 512 + e.length).toString(), e) } else if (e instanceof RegExp) { t.match(data.subarray(i * 512, (i + 1) * 512).toString(), e) } else { t.match(new Header(data.subarray(i * 512, (i + 1) * 512)), e) } }) } const runTest = async (t, _path) => { const linkCache = new Map() const statCache = new Map() const opt = { noDirRecurse: true, linkCache, statCache, } const out = [] const parser = new Parser({ onReadEntry: readEntry => { const p = new WriteEntryTar(readEntry, opt) p.on('data', d => out.push(d)) }, }) parser.on('end', () => check(out, t)) parser.end(data) } t.test('.', t => runTest(t, '.')) t.test('./', t => runTest(t, './')) t.end() }) t.test('myuid set by getuid() if available, otherwise 0', t => { const { getuid } = process process.getuid = null const noUid = new WriteEntry(__filename) t.equal(noUid.myuid, 0, 'set to zero if no getuid function') process.getuid = () => 123456789 const hasUid = new WriteEntry(__filename) t.equal(hasUid.myuid, 123456789, 'set to process.getuid()') process.getuid = getuid t.end() }) isaacs-node-tar-8a4b548/tsconfig.json000066400000000000000000000007451523070444600175470ustar00rootroot00000000000000{ "compilerOptions": { "types": [ "node" ], "rootDir": "./", "declaration": true, "declarationMap": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "inlineSources": true, "jsx": "react", "module": "nodenext", "moduleResolution": "nodenext", "noUncheckedIndexedAccess": true, "resolveJsonModule": true, "skipLibCheck": true, "sourceMap": true, "strict": true, "target": "es2022" } }